completion: add --set-upstream-to and --unset-upstream
[gitweb.git] / git-submodule.sh
index 0a3e1465e39cb9c5973718496ff6867728884ec0..aac575e74f833c9bce28b779733b28a7611246b2 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# git-submodules.sh: add, init, update or list git submodules
+# git-submodule.sh: add, init, update or list git submodules
 #
 # Copyright (c) 2007 Lars Hjemli
 
@@ -60,8 +60,12 @@ resolve_relative_url ()
        *:*|/*)
                is_relative=
                ;;
+       ./*|../*)
+               is_relative=t
+               ;;
        *)
                is_relative=t
+               remoteurl="./$remoteurl"
                ;;
        esac
 
@@ -79,7 +83,12 @@ resolve_relative_url ()
                                sep=:
                                ;;
                        *)
-                               die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
+                               if test -z "$is_relative" || test "." = "$remoteurl"
+                               then
+                                       die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
+                               else
+                                       remoteurl=.
+                               fi
                                ;;
                        esac
                        ;;
@@ -90,7 +99,8 @@ resolve_relative_url ()
                        break;;
                esac
        done
-       echo "${is_relative:+${up_path}}$remoteurl$sep${url%/}"
+       remoteurl="$remoteurl$sep${url%/}"
+       echo "${is_relative:+${up_path}}${remoteurl#./}"
 }
 
 #
@@ -171,13 +181,18 @@ module_clone()
                rm -f "$gitdir/index"
        else
                mkdir -p "$gitdir_base"
-               git clone $quiet -n ${reference:+"$reference"} \
-                       --separate-git-dir "$gitdir" "$url" "$sm_path" ||
+               (
+                       clear_local_git_env
+                       git clone $quiet -n ${reference:+"$reference"} \
+                               --separate-git-dir "$gitdir" "$url" "$sm_path"
+               ) ||
                die "$(eval_gettext "Clone of '\$url' into submodule path '\$sm_path' failed")"
        fi
 
-       a=$(cd "$gitdir" && pwd)/
-       b=$(cd "$sm_path" && pwd)/
+       # We already are at the root of the work tree but cd_to_toplevel will
+       # resolve any symlinks that might be present in $PWD
+       a=$(cd_to_toplevel && cd "$gitdir" && pwd)/
+       b=$(cd_to_toplevel && cd "$sm_path" && pwd)/
        # normalize Windows-style absolute paths to POSIX-style absolute paths
        case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
        case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac
@@ -422,8 +437,9 @@ cmd_init()
        module_list "$@" |
        while read mode sha1 stage sm_path
        do
-               # Skip already registered paths
                name=$(module_name "$sm_path") || exit
+
+               # Copy url setting when it is not set yet
                if test -z "$(git config "submodule.$name.url")"
                then
                        url=$(git config -f .gitmodules submodule."$name".url)
@@ -438,6 +454,8 @@ cmd_init()
                        esac
                        git config submodule."$name".url "$url" ||
                        die "$(eval_gettext "Failed to register url for submodule path '\$sm_path'")"
+
+                       say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$sm_path'")"
                fi
 
                # Copy "update" setting when it is not set yet
@@ -446,8 +464,6 @@ cmd_init()
                test -n "$(git config submodule."$name".update)" ||
                git config submodule."$name".update "$upd" ||
                die "$(eval_gettext "Failed to register update mode for submodule path '\$sm_path'")"
-
-               say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$sm_path'")"
        done
 }
 
@@ -735,7 +751,7 @@ cmd_summary() {
        if [ -n "$files" ]
        then
                test -n "$cached" &&
-               die "$(gettext -- "--cached cannot be used with --files")"
+               die "$(gettext "The --cached option cannot be used with the --files option")"
                diff_cmd=diff-files
                head=
        fi