]> git.ipfire.org Git - thirdparty/git.git/commitdiff
subtree: parse revs in individual cmd_ functions
authorLuke Shumaker <lukeshu@datawire.io>
Tue, 27 Apr 2021 21:17:39 +0000 (15:17 -0600)
committerJunio C Hamano <gitster@pobox.com>
Wed, 28 Apr 2021 07:47:18 +0000 (16:47 +0900)
The main argument parser goes ahead and tries to parse revs to make
things simpler for the sub-command implementations.  But, it includes
enough special cases for different sub-commands.  And it's difficult
having having to think about "is this info coming from an argument, or a
global variable?".  So the main argument parser's effort to make things
"simpler" ends up just making it more confusing and complicated.

Begone with the 'revs' global variable; parse 'rev=$(...)' as needed in
individual 'cmd_*' functions.

Begone with the 'default' global variable.  Its would-be value is
knowable just from which function we're in.

Begone with the 'ensure_single_rev' function.  Its functionality can be
achieved by passing '--verify' to 'git rev-parse'.

Signed-off-by: Luke Shumaker <lukeshu@datawire.io>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
contrib/subtree/git-subtree.sh

index ee7fda3672192bad69a973270c7c0171ec29eb9c..0df8d1b7d439a4dfab6ac9b496de51ae7c4b64b8 100755 (executable)
@@ -76,13 +76,6 @@ assert () {
        fi
 }
 
-ensure_single_rev () {
-       if test $# -ne 1
-       then
-               die "You must provide exactly one revision.  Got: '$*'"
-       fi
-}
-
 main () {
        if test $# -eq 0
        then
@@ -164,11 +157,8 @@ main () {
        shift
 
        case "$arg_command" in
-       add|merge|pull)
-               default=
-               ;;
-       split|push)
-               default="--default HEAD"
+       add|merge|pull|split|push)
+               :
                ;;
        *)
                die "Unknown command '$arg_command'"
@@ -193,22 +183,8 @@ main () {
 
        dir="$(dirname "$arg_prefix/.")"
 
-       if test "$arg_command" != "pull" &&
-                       test "$arg_command" != "add" &&
-                       test "$arg_command" != "push"
-       then
-               revs=$(git rev-parse $default --revs-only "$@") || exit $?
-               dirs=$(git rev-parse --no-revs --no-flags "$@") || exit $?
-               ensure_single_rev $revs
-               if test -n "$dirs"
-               then
-                       die "Error: Use --prefix instead of bare filenames."
-               fi
-       fi
-
        debug "command: {$arg_command}"
        debug "quiet: {$GIT_QUIET}"
-       debug "revs: {$revs}"
        debug "dir: {$dir}"
        debug "opts: {$*}"
        debug
@@ -714,14 +690,13 @@ cmd_add_repository () {
        repository=$1
        refspec=$2
        git fetch "$@" || exit $?
-       revs=FETCH_HEAD
-       set -- $revs
-       cmd_add_commit "$@"
+       cmd_add_commit FETCH_HEAD
 }
 
 cmd_add_commit () {
-       rev=$(git rev-parse $default --revs-only "$@") || exit $?
-       ensure_single_rev $rev
+       # The rev has already been validated by cmd_add(), we just
+       # need to normalize it.
+       rev=$(git rev-parse --verify "$1^{commit}") || exit $?
 
        debug "Adding $dir as '$rev'..."
        git read-tree --prefix="$dir" $rev || exit $?
@@ -752,6 +727,17 @@ cmd_add_commit () {
 }
 
 cmd_split () {
+       if test $# -eq 0
+       then
+               rev=$(git rev-parse HEAD)
+       elif test $# -eq 1
+       then
+               rev=$(git rev-parse -q --verify "$1^{commit}") ||
+                       die "'$1' does not refer to a commit"
+       else
+               die "You must provide exactly one revision.  Got: '$*'"
+       fi
+
        debug "Splitting $dir..."
        cache_setup || exit $?
 
@@ -768,12 +754,12 @@ cmd_split () {
                done || exit $?
        fi
 
-       unrevs="$(find_existing_splits "$dir" "$revs")" || exit $?
+       unrevs="$(find_existing_splits "$dir" "$rev")" || exit $?
 
        # We can't restrict rev-list to only $dir here, because some of our
        # parents have the $dir contents the root, and those won't match.
        # (and rev-list --follow doesn't seem to solve this)
-       grl='git rev-list --topo-order --reverse --parents $revs $unrevs'
+       grl='git rev-list --topo-order --reverse --parents $rev $unrevs'
        revmax=$(eval "$grl" | wc -l)
        revcount=0
        createcount=0
@@ -820,8 +806,10 @@ cmd_split () {
 }
 
 cmd_merge () {
-       rev=$(git rev-parse $default --revs-only "$@") || exit $?
-       ensure_single_rev $rev
+       test $# -eq 1 ||
+               die "You must provide exactly one revision.  Got: '$*'"
+       rev=$(git rev-parse -q --verify "$1^{commit}") ||
+               die "'$1' does not refer to a commit"
        ensure_clean
 
        if test -n "$arg_addmerge_squash"
@@ -861,9 +849,7 @@ cmd_pull () {
        ensure_clean
        ensure_valid_ref_format "$2"
        git fetch "$@" || exit $?
-       revs=FETCH_HEAD
-       set -- $revs
-       cmd_merge "$@"
+       cmd_merge FETCH_HEAD
 }
 
 cmd_push () {