rebase --root: print usage on too many args
authorMartin von Zweigbergk <martin.von.zweigbergk@gmail.com>
Tue, 26 Jun 2012 14:51:55 +0000 (07:51 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 26 Jun 2012 20:17:53 +0000 (13:17 -0700)
Just like

  git rebase --onto newbase upstream branch error

displays the usage message, so should clearly

  git rebase --onto newbase --root branch error

, but it doesn't. Instead, it ignores both "branch" and "error" and
rebases the current HEAD. This is because we try to match the number
of remainging arguments "$#", which fails to match "1" argument and
matches the "*" that really should have been a "0".

Make sure we display usage information when too many arguments are
given. Also fail-fast in case of similar bugs in the future by
matching on exactly 0 arguments and failing on unknown numbers.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-rebase.sh
t/t3412-rebase-root.sh

index e6167374445dfbb5e0b6bedc9a5f33a01cb5a7df..6df06c400804776e32b4625ff5820115c0cf1497 100755 (executable)
@@ -400,6 +400,7 @@ else
        test -z "$onto" && die "You must specify --onto when using --root"
        unset upstream_name
        unset upstream
+       test $# -gt 1 && usage
        upstream_arg=--root
 fi
 
@@ -450,7 +451,7 @@ case "$#" in
                die "fatal: no such branch: $1"
        fi
        ;;
-*)
+0)
        # Do not need to switch branches, we are already on it.
        if branch_name=`git symbolic-ref -q HEAD`
        then
@@ -462,6 +463,9 @@ case "$#" in
        fi
        orig_head=$(git rev-parse --verify "${branch_name}^0") || exit
        ;;
+*)
+       die "BUG: unexpected number of arguments left to parse"
+       ;;
 esac
 
 require_clean_work_tree "rebase" "Please commit or stash them."
index 086c91c7b47aa2fa7b593f4f9b2f84f6b7ba3724..1e9d1a737c5369d1b41bfa75f5939ad41004b944 100755 (executable)
@@ -23,9 +23,15 @@ test_expect_success 'prepare repository' '
 '
 
 test_expect_success 'rebase --root expects --onto' '
+       git checkout -B fail other &&
        test_must_fail git rebase --root
 '
 
+test_expect_success 'rebase --root fails with too many args' '
+       git checkout -B fail other &&
+       test_must_fail git rebase --onto master --root fail fail
+'
+
 test_expect_success 'setup pre-rebase hook' '
        mkdir -p .git/hooks &&
        cat >.git/hooks/pre-rebase <<EOF &&
@@ -42,7 +48,7 @@ cat > expect <<EOF
 EOF
 
 test_expect_success 'rebase --root --onto <newbase>' '
-       git checkout -b work &&
+       git checkout -b work other &&
        git rebase --root --onto master &&
        git log --pretty=tformat:"%s" > rebased &&
        test_cmp expect rebased