diff.c: fix emit_line() again not to add extra line
[gitweb.git] / git-submodule.sh
index 558a5ca1073953a752a5727809686612e10ed5d3..a745e42bf7b19d6b813ff8e1e60e8b0ba41aaa14 100755 (executable)
@@ -155,20 +155,6 @@ cmd_add()
                usage
        fi
 
-       case "$repo" in
-       ./*|../*)
-               # dereference source url relative to parent's url
-               realrepo="$(resolve_relative_url $repo)" ;;
-       *)
-               # Turn the source into an absolute path if
-               # it is local
-               if base=$(get_repo_base "$repo"); then
-                       repo="$base"
-               fi
-               realrepo=$repo
-               ;;
-       esac
-
        # Guess path from repo if not specified or strip trailing slashes
        if test -z "$path"; then
                path=$(echo "$repo" | sed -e 's|/*$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
@@ -176,15 +162,39 @@ cmd_add()
                path=$(echo "$path" | sed -e 's|/*$||')
        fi
 
-       test -e "$path" &&
-       die "'$path' already exists"
-
        git ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
        die "'$path' already exists in the index"
 
-       module_clone "$path" "$realrepo" || exit
-       (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) ||
-       die "Unable to checkout submodule '$path'"
+       # perhaps the path exists and is already a git repo, else clone it
+       if test -e "$path"
+       then
+               if test -d "$path/.git" &&
+               test "$(unset GIT_DIR; cd $path; git rev-parse --git-dir)" = ".git"
+               then
+                       echo "Adding existing repo at '$path' to the index"
+               else
+                       die "'$path' already exists and is not a valid git repo"
+               fi
+       else
+               case "$repo" in
+               ./*|../*)
+                       # dereference source url relative to parent's url
+                       realrepo="$(resolve_relative_url $repo)" ;;
+               *)
+                       # Turn the source into an absolute path if
+                       # it is local
+                       if base=$(get_repo_base "$repo"); then
+                               repo="$base"
+                       fi
+                       realrepo=$repo
+                       ;;
+               esac
+
+               module_clone "$path" "$realrepo" || exit
+               (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) ||
+               die "Unable to checkout submodule '$path'"
+       fi
+
        git add "$path" ||
        die "Failed to add submodule '$path'"
 
@@ -222,7 +232,7 @@ cmd_init()
                shift
        done
 
-       git ls-files --stage -- "$@" | grep -e '^160000 ' |
+       git ls-files --stage -- "$@" | grep '^160000 ' |
        while read mode sha1 stage path
        do
                # Skip already registered paths
@@ -276,7 +286,7 @@ cmd_update()
                shift
        done
 
-       git ls-files --stage -- "$@" | grep -e '^160000 ' |
+       git ls-files --stage -- "$@" | grep '^160000 ' |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit
@@ -317,7 +327,8 @@ set_name_rev () {
                cd "$1" && {
                        git describe "$2" 2>/dev/null ||
                        git describe --tags "$2" 2>/dev/null ||
-                       git describe --contains --tags "$2"
+                       git describe --contains "$2" 2>/dev/null ||
+                       git describe --all --always "$2"
                }
        ) )
        test -z "$revname" || revname=" ($revname)"
@@ -527,7 +538,7 @@ cmd_status()
                shift
        done
 
-       git ls-files --stage -- "$@" | grep -e '^160000 ' |
+       git ls-files --stage -- "$@" | grep '^160000 ' |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit