t3200-branch: test -M
[gitweb.git] / contrib / subtree / git-subtree.sh
index 7d7af03274ee0759c9e915a6ea7b52ecce65cf55..fa1a5839af2d0c423adb51238fb330f555dc4dff 100755 (executable)
@@ -9,10 +9,10 @@ if [ $# -eq 0 ]; then
 fi
 OPTS_SPEC="\
 git subtree add   --prefix=<prefix> <commit>
-git subtree add   --prefix=<prefix> <repository> <commit>
+git subtree add   --prefix=<prefix> <repository> <ref>
 git subtree merge --prefix=<prefix> <commit>
-git subtree pull  --prefix=<prefix> <repository> <refspec...>
-git subtree push  --prefix=<prefix> <repository> <refspec...>
+git subtree pull  --prefix=<prefix> <repository> <ref>
+git subtree push  --prefix=<prefix> <repository> <ref>
 git subtree split --prefix=<prefix> <commit...>
 --
 h,help        show the help
@@ -46,6 +46,7 @@ ignore_joins=
 annotate=
 squash=
 message=
+prefix=
 
 debug()
 {
@@ -489,6 +490,12 @@ ensure_clean()
        fi
 }
 
+ensure_valid_ref_format()
+{
+       git check-ref-format "refs/heads/$1" ||
+           die "'$1' does not look like a ref"
+}
+
 cmd_add()
 {
        if [ -e "$dir" ]; then
@@ -508,8 +515,7 @@ cmd_add()
            # specified directory.  Allowing a refspec might be
            # misleading because we won't do anything with any other
            # branches fetched via the refspec.
-           git rev-parse -q --verify "$2^{commit}" >/dev/null ||
-           die "'$2' does not refer to a commit"
+           ensure_valid_ref_format "$2"
 
            "cmd_add_repository" "$@"
        else
@@ -552,8 +558,9 @@ cmd_add_commit()
                commit=$(add_squashed_msg "$rev" "$dir" |
                         git commit-tree $tree $headp -p "$rev") || exit $?
        else
+               revp=$(peel_committish "$rev") &&
                commit=$(add_msg "$dir" "$headrev" "$rev" |
-                        git commit-tree $tree $headp -p "$rev") || exit $?
+                        git commit-tree $tree $headp -p "$revp") || exit $?
        fi
        git reset "$commit" || exit $?
        
@@ -699,7 +706,11 @@ cmd_merge()
 
 cmd_pull()
 {
+       if [ $# -ne 2 ]; then
+           die "You must provide <repository> <ref>"
+       fi
        ensure_clean
+       ensure_valid_ref_format "$2"
        git fetch "$@" || exit $?
        revs=FETCH_HEAD
        set -- $revs
@@ -709,8 +720,9 @@ cmd_pull()
 cmd_push()
 {
        if [ $# -ne 2 ]; then
-           die "You must provide <repository> <refspec>"
+           die "You must provide <repository> <ref>"
        fi
+       ensure_valid_ref_format "$2"
        if [ -e "$dir" ]; then
            repository=$1
            refspec=$2