subtree: fix argument validation in add/pull/push
authorAnthony Baire <Anthony.Baire@irisa.fr>
Wed, 27 Nov 2013 18:34:09 +0000 (19:34 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 13 Jan 2014 22:37:52 +0000 (14:37 -0800)
When working with a remote repository add/pull/push do not accept a
<refspec> as parameter but just a <ref>. They should accept any
well-formatted ref name.

This patch:
- relaxes the check the <ref> argument in "git subtree add <repo>"
(previous code would not accept a ref name that does not exist
locally too, new code only ensures that the ref is well formatted)

- add the same check in "git subtree pull/push" + check the number of
parameters

- update the doc to use <ref> instead of <refspec>

Signed-off-by: Anthony Baire <Anthony.Baire@irisa.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/subtree/git-subtree.sh
contrib/subtree/git-subtree.txt
index 7d7af03274ee0759c9e915a6ea7b52ecce65cf55..dc59a91031ea6815456e5c86f5494bf56858c0d1 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
@@ -489,6 +489,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 +514,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
@@ -699,7 +704,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 +718,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
index e0957eee55d7fb4a530717d1ced39bcabb2057b2..02669b15344c5641c613961104293e22c311aeb1 100644 (file)
@@ -9,10 +9,10 @@ git-subtree - Merge subtrees together and split repository into subtrees
 SYNOPSIS
 --------
 [verse]
-'git subtree' add   -P <prefix> <refspec>
-'git subtree' add   -P <prefix> <repository> <refspec>
-'git subtree' pull  -P <prefix> <repository> <refspec...>
-'git subtree' push  -P <prefix> <repository> <refspec...>
+'git subtree' add   -P <prefix> <commit>
+'git subtree' add   -P <prefix> <repository> <ref>
+'git subtree' pull  -P <prefix> <repository> <ref>
+'git subtree' push  -P <prefix> <repository> <ref>
 'git subtree' merge -P <prefix> <commit>
 'git subtree' split -P <prefix> [OPTIONS] [<commit>]
 
@@ -68,7 +68,7 @@ COMMANDS
 --------
 add::
        Create the <prefix> subtree by importing its contents
-       from the given <refspec> or <repository> and remote <refspec>.
+       from the given <commit> or <repository> and remote <ref>.
        A new commit is created automatically, joining the imported
        project's history with your own.  With '--squash', imports
        only a single commit from the subproject, rather than its
@@ -90,13 +90,13 @@ merge::
        
 pull::
        Exactly like 'merge', but parallels 'git pull' in that
-       it fetches the given commit from the specified remote
+       it fetches the given ref from the specified remote
        repository.
        
 push::
        Does a 'split' (see below) using the <prefix> supplied
        and then does a 'git push' to push the result to the 
-       repository and refspec. This can be used to push your
+       repository and ref. This can be used to push your
        subtree to different branches of the remote repository.
 
 split::