sha1_name.c: clarify what "fake" is for in find_short_object_filename()
[gitweb.git] / git-submodule.sh
index 814d0d914eaf994462e61559b0692c958f97513b..3adab9363563e80e4ceb2c7fb5c3ab91ac1ef505 100755 (executable)
@@ -104,9 +104,9 @@ module_name()
        re=$(printf '%s\n' "$1" | sed -e 's/[].[^$\\*]/\\&/g')
        name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
                sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )
-       test -z "$name" &&
-       die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$path'")"
-       echo "$name"
+       test -z "$name" &&
+       die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$path'")"
+       echo "$name"
 }
 
 #
@@ -128,13 +128,49 @@ module_clone()
                quiet=-q
        fi
 
-       if test -n "$reference"
+       gitdir=
+       gitdir_base=
+       name=$(module_name "$path" 2>/dev/null)
+       base_path=$(dirname "$path")
+
+       gitdir=$(git rev-parse --git-dir)
+       gitdir_base="$gitdir/modules/$base_path"
+       gitdir="$gitdir/modules/$path"
+
+       case $gitdir in
+       /*)
+               a="$(cd_to_toplevel && pwd)/"
+               b=$gitdir
+               while [ "$b" ] && [ "${a%%/*}" = "${b%%/*}" ]
+               do
+                       a=${a#*/} b=${b#*/};
+               done
+
+               rel="$a$name"
+               rel=`echo $rel | sed -e 's|[^/]*|..|g'`
+               rel_gitdir="$rel/$b"
+               ;;
+       *)
+               rel=`echo $name | sed -e 's|[^/]*|..|g'`
+               rel_gitdir="$rel/$gitdir"
+               ;;
+       esac
+
+       if test -d "$gitdir"
        then
-               git-clone $quiet "$reference" -n "$url" "$path"
+               mkdir -p "$path"
+               echo "gitdir: $rel_gitdir" >"$path/.git"
+               rm -f "$gitdir/index"
        else
-               git-clone $quiet -n "$url" "$path"
-       fi ||
-       die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
+               mkdir -p "$gitdir_base"
+               if test -n "$reference"
+               then
+                       git-clone $quiet "$reference" -n "$url" "$path" --separate-git-dir "$gitdir"
+               else
+                       git-clone $quiet -n "$url" "$path" --separate-git-dir "$gitdir"
+               fi ||
+               die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
+       fi
 }
 
 #
@@ -426,6 +462,9 @@ cmd_update()
                --recursive)
                        recursive=1
                        ;;
+               --checkout)
+                       update="checkout"
+                       ;;
                --)
                        shift
                        break
@@ -458,7 +497,19 @@ cmd_update()
                fi
                name=$(module_name "$path") || exit
                url=$(git config submodule."$name".url)
-               update_module=$(git config submodule."$name".update)
+               if ! test -z "$update"
+               then
+                       update_module=$update
+               else
+                       update_module=$(git config submodule."$name".update)
+               fi
+
+               if test "$update_module" = "none"
+               then
+                       echo "Skipping submodule '$path'"
+                       continue
+               fi
+
                if test -z "$url"
                then
                        # Only mention uninitialized submodules when its
@@ -480,11 +531,6 @@ Maybe you want to use 'update --init'?")"
                        die "$(eval_gettext "Unable to find current revision in submodule path '\$path'")"
                fi
 
-               if ! test -z "$update"
-               then
-                       update_module=$update
-               fi
-
                if test "$subsha1" != "$sha1"
                then
                        subforce=$force