Code

gitview: Fix the blame interface.
[git.git] / git-submodule.sh
index 6ed5a6ced23d99794de56e326bd46438d8c64707..8bdd99a2f37a8c76fd4b08e6736d7a67da47be1e 100755 (executable)
@@ -25,8 +25,35 @@ say()
        fi
 }
 
+
 #
-# Run clone + checkout on missing submodules
+# Clone a submodule
+#
+module_clone()
+{
+       path=$1
+       url=$2
+
+       # If there already is a directory at the submodule path,
+       # expect it to be empty (since that is the default checkout
+       # action) and try to remove it.
+       # Note: if $path is a symlink to a directory the test will
+       # succeed but the rmdir will fail. We might want to fix this.
+       if test -d "$path"
+       then
+               rmdir "$path" 2>/dev/null ||
+               die "Directory '$path' exist, but is neither empty nor a git repository"
+       fi
+
+       test -e "$path" &&
+       die "A file already exist at path '$path'"
+
+       git-clone -n "$url" "$path" ||
+       die "Clone of submodule '$path' failed"
+}
+
+#
+# Register submodules in .git/config
 #
 # $@ = requested paths (default to all)
 #
@@ -35,52 +62,23 @@ modules_init()
        git ls-files --stage -- "$@" | grep -e '^160000 ' |
        while read mode sha1 stage path
        do
-               # Skip submodule paths that already contain a .git directory.
-               # This will also trigger if $path is a symlink to a git
-               # repository
-               test -d "$path"/.git && continue
-
-               # If there already is a directory at the submodule path,
-               # expect it to be empty (since that is the default checkout
-               # action) and try to remove it.
-               # Note: if $path is a symlink to a directory the test will
-               # succeed but the rmdir will fail. We might want to fix this.
-               if test -d "$path"
-               then
-                       rmdir "$path" 2>/dev/null ||
-                       die "Directory '$path' exist, but is neither empty nor a git repository"
-               fi
-
-               test -e "$path" &&
-               die "A file already exist at path '$path'"
+               # Skip already registered paths
+               url=$(git-config submodule."$path".url)
+               test -z "$url" || continue
 
                url=$(GIT_CONFIG=.gitmodules git-config module."$path".url)
                test -z "$url" &&
                die "No url found for submodule '$path' in .gitmodules"
 
-               # MAYBE FIXME: this would be the place to check GIT_CONFIG
-               # for a preferred url for this submodule, possibly like this:
-               #
-               # modname=$(GIT_CONFIG=.gitmodules git-config module."$path".name)
-               # alturl=$(git-config module."$modname".url)
-               #
-               # This would let the versioned .gitmodules file use the submodule
-               # path as key, while the unversioned GIT_CONFIG would use the
-               # logical modulename (if present) as key. But this would need
-               # another fallback mechanism if the module wasn't named.
-
-               git-clone -n "$url" "$path" ||
-               die "Clone of submodule '$path' failed"
+               git-config submodule."$path".url "$url" ||
+               die "Failed to register url for submodule '$path'"
 
-               (unset GIT_DIR && cd "$path" && git-checkout -q "$sha1") ||
-               die "Checkout of submodule '$path' failed"
-
-               say "Submodule '$path' initialized"
+               say "Submodule '$path' registered with url '$url'"
        done
 }
 
 #
-# Checkout correct revision of each initialized submodule
+# Update each submodule path to correct revision, using clone and checkout as needed
 #
 # $@ = requested paths (default to all)
 #
@@ -89,14 +87,21 @@ modules_update()
        git ls-files --stage -- "$@" | grep -e '^160000 ' |
        while read mode sha1 stage path
        do
-               if ! test -d "$path"/.git
+               url=$(git-config submodule."$path".url)
+               if test -z "$url"
                then
                        # Only mention uninitialized submodules when its
                        # path have been specified
                        test "$#" != "0" &&
                        say "Submodule '$path' not initialized"
-                       continue;
+                       continue
                fi
+
+               if ! test -d "$path"/.git
+               then
+                       module_clone "$path" "$url" || exit
+               fi
+
                subsha1=$(unset GIT_DIR && cd "$path" &&
                        git-rev-parse --verify HEAD) ||
                die "Unable to find current revision of submodule '$path'"