Re: What's cooking in git.git (Jan 2010, #01; Mon, 04)
Quoting Junio C Hamano <gitster@pobox.com> writes:
Show 6 quoted lines
> 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@lavabit.com>
---
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/