Quoting Junio C Hamano <gitster@xxxxxxxxx> writes: > These need a bit more work to go forward. Help and follow-up are > appreciated. > > * jc/checkout-merge-base (2009-11-20) 2 commits > Users of "rebase -i" might want to teach this to the command. > Volunteers? Let me try. I'll let others to contribute documentation updates. -- >8 -- Subject: [PATCH] Fix rebase --onto A...B and teach the same to interactive rebase Signed-off-by: しらいし ななこ <nanako3@xxxxxxxxxxx> --- git-rebase--interactive.sh | 21 +++++++++++- git-rebase.sh | 4 +- t/t3415-rebase-onto-threedots.sh | 68 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) create mode 100755 t/t3415-rebase-onto-threedots.sh diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 23ded48..d42cc4f 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -482,6 +482,25 @@ get_saved_options () { test -f "$DOTEST"/rebase-root && REBASE_ROOT=t } +LF=' +' +parse_onto () { + if expr "$1" : '.*\.\.\.' >/dev/null && + left=${1%...*} right=${1#*...} && + : ${left:=HEAD} ${right:=HEAD} && + onto=$(git merge-base "$left" "$right") + then + case "$onto" in + ?*"$LF"?* | '') + exit 1 ;; + esac + echo "$onto" + exit 0 + else + git rev-parse --verify "$1^0" + fi +} + while test $# != 0 do case "$1" in @@ -589,7 +608,7 @@ first and then run 'git rebase --continue' again." ;; --onto) shift - ONTO=$(git rev-parse --verify "$1") || + ONTO=$(parse_onto "$1") || die "Does not point to a valid commit: $1" ;; --) diff --git a/git-rebase.sh b/git-rebase.sh index 6503113..43c62c0 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -419,8 +419,8 @@ fi # Make sure the branch to rebase onto is valid. onto_name=${newbase-"$upstream_name"} -if left=$(expr "$onto_name" : '\(.*\)\.\.\.') && - right=$(expr "$onto_name" : '\.\.\.\(.*\)$') && +if expr "$onto_name" : '.*\.\.\.' >/dev/null && + left=${onto_name%...*} right=${onto_name#*...} && : ${left:=HEAD} ${right:=HEAD} && onto=$(git merge-base "$left" "$right") then diff --git a/t/t3415-rebase-onto-threedots.sh b/t/t3415-rebase-onto-threedots.sh new file mode 100755 index 0000000..c243243 --- /dev/null +++ b/t/t3415-rebase-onto-threedots.sh @@ -0,0 +1,68 @@ +#!/bin/sh + +test_description='git rebase --onto A...B' + +. ./test-lib.sh +. "$TEST_DIRECTORY/lib-rebase.sh" + +# F---G G' +# / --> / +# A---B---C---D---E A---B---C---D---E + +test_expect_success setup ' + test_commit A && + test_commit B && + test_commit C && + git branch topic && + test_commit D && + test_commit E && + git checkout topic && + test_commit F && + test_commit G +' + +test_expect_success 'rebase --onto A...B' ' + git reset --hard && + git checkout topic && + git reset --hard G && + + git rebase --onto master...topic HEAD^ && + git rev-parse HEAD^ >actual && + git rev-parse C^0 >expect && + test_cmp expect actual +' + +test_expect_success 'rebase --onto A...' ' + git reset --hard && + git checkout topic && + git reset --hard G && + + git rebase --onto master... HEAD^ && + git rev-parse HEAD^ >actual && + git rev-parse C^0 >expect && + test_cmp expect actual +' + +test_expect_success 'rebase -i --onto A...B' ' + git reset --hard && + git checkout topic && + git reset --hard G && + set_fake_editor && + EXPECT_COUNT=1 git rebase -i --onto master...topic HEAD^ && + git rev-parse HEAD^ >actual && + git rev-parse C^0 >expect && + test_cmp expect actual +' + +test_expect_success 'rebase -i --onto A...' ' + git reset --hard && + git checkout topic && + git reset --hard G && + set_fake_editor && + EXPECT_COUNT=1 git rebase -i --onto master... HEAD^ && + git rev-parse HEAD^ >actual && + git rev-parse C^0 >expect && + test_cmp expect actual +' + +test_done -- 1.6.6 -- Nanako Shiraishi http://ivory.ap.teacup.com/nanako3/ -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html