]> asedeno.scripts.mit.edu Git - git.git/blobdiff - git-submodule.sh
Merge git://git.kernel.org/pub/scm/gitk/gitk
[git.git] / git-submodule.sh
index 01f26d341cfdc5544e4bf9a92cf8eb3c183ece43..56ec3536e0c40190329b9867b46e36753f30efb2 100755 (executable)
@@ -4,7 +4,9 @@
 #
 # Copyright (c) 2007 Lars Hjemli
 
-USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update|summary [<commit>]] [--] [<path>...]'
+USAGE="[--quiet] [--cached] \
+[add <repo> [-b branch]|status|init|update|summary [-n|--summary-limit <n>] [<commit>]] \
+[--] [<path>...]"
 OPTIONS_SPEC=
 . git-sh-setup
 require_work_tree
@@ -153,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')
@@ -174,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'"
 
@@ -220,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
@@ -274,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
@@ -329,6 +341,8 @@ set_name_rev () {
 # $@ = [commit (default 'HEAD'),] requested paths (default all)
 #
 cmd_summary() {
+       summary_limit=-1
+
        # parse $args after "submodule ... summary".
        while test $# -ne 0
        do
@@ -336,6 +350,15 @@ cmd_summary() {
                --cached)
                        cached="$1"
                        ;;
+               -n|--summary-limit)
+                       if summary_limit=$(($2 + 0)) 2>/dev/null && test "$summary_limit" = "$2"
+                       then
+                               :
+                       else
+                               usage
+                       fi
+                       shift
+                       ;;
                --)
                        shift
                        break
@@ -350,6 +373,8 @@ cmd_summary() {
                shift
        done
 
+       test $summary_limit = 0 && return
+
        if rev=$(git rev-parse --verify "$1^0" 2>/dev/null)
        then
                head=$rev
@@ -433,7 +458,7 @@ cmd_summary() {
                        GIT_DIR="$name/.git" \
                        git log --pretty=oneline --first-parent $range | wc -l
                        )
-                       total_commits=" ($total_commits)"
+                       total_commits=" ($(($total_commits + 0)))"
                        ;;
                esac
 
@@ -458,8 +483,10 @@ cmd_summary() {
                else
                        if test $mod_src = 160000 -a $mod_dst = 160000
                        then
+                               limit=
+                               test $summary_limit -gt 0 && limit="-$summary_limit"
                                GIT_DIR="$name/.git" \
-                               git log --pretty='format:  %m %s' \
+                               git log $limit --pretty='format:  %m %s' \
                                --first-parent $sha1_src...$sha1_dst
                        elif test $mod_dst = 160000
                        then
@@ -510,7 +537,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