[PATCH] Use merge-recursive in git-revert/git-cherry-pick

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This makes revert and cherry-pick to use merge-recursive, to
allow them to notice renames.  A pair of test scripts
demonstrate that an old change before a rename happened can be
applied (reverted) after a rename with cherry-pick (with revert).

Signed-off-by: Junio C Hamano <junkio@xxxxxxx>
---
 git-revert.sh                 |   29 ++++++++-----------
 t/t3501-revert-cherry-pick.sh |   62 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+), 17 deletions(-)

diff --git a/git-revert.sh b/git-revert.sh
index 71cbcbc..c74af99 100755
--- a/git-revert.sh
+++ b/git-revert.sh
@@ -151,32 +151,27 @@ esac >.msg
 # and $prev on top of us (when reverting), or the change between
 # $prev and $commit on top of us (when cherry-picking or replaying).
 
-echo >&2 "First trying simple merge strategy to $me."
-git-read-tree -m -u --aggressive $base $head $next &&
+git-merge-recursive $base -- $head $next &&
 result=$(git-write-tree 2>/dev/null) || {
-    echo >&2 "Simple $me fails; trying Automatic $me."
-    git-merge-index -o git-merge-one-file -a || {
-	    mv -f .msg "$GIT_DIR/MERGE_MSG"
-	    {
-		echo '
+	mv -f .msg "$GIT_DIR/MERGE_MSG"
+	{
+	    echo '
 Conflicts:
 '
 		git ls-files --unmerged |
 		sed -e 's/^[^	]*	/	/' |
 		uniq
-	    } >>"$GIT_DIR/MERGE_MSG"
-	    echo >&2 "Automatic $me failed.  After resolving the conflicts,"
-	    echo >&2 "mark the corrected paths with 'git-add <paths>'"
-	    echo >&2 "and commit the result."
-	    case "$me" in
-	    cherry-pick)
+	} >>"$GIT_DIR/MERGE_MSG"
+	echo >&2 "Automatic $me failed.  After resolving the conflicts,"
+	echo >&2 "mark the corrected paths with 'git-add <paths>'"
+	echo >&2 "and commit the result."
+	case "$me" in
+	cherry-pick)
 		echo >&2 "You may choose to use the following when making"
 		echo >&2 "the commit:"
 		echo >&2 "$set_author_env"
-	    esac
-	    exit 1
-    }
-    result=$(git-write-tree) || exit
+	esac
+	exit 1
 }
 echo >&2 "Finished one $me."
 
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
new file mode 100755
index 0000000..552af1c
--- /dev/null
+++ b/t/t3501-revert-cherry-pick.sh
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+test_description='test cherry-pick and revert with renames
+
+  --
+   + rename2: renames oops to opos
+  +  rename1: renames oops to spoo
+  +  added:   adds extra line to oops
+  ++ initial: has lines in oops
+
+'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+	for l in a b c d e f g h i j k l m n o
+	do
+		echo $l$l$l$l$l$l$l$l$l
+	done >oops &&
+
+	test_tick &&
+	git add oops &&
+	git commit -m initial &&
+	git tag initial &&
+
+	test_tick &&
+	echo "Add extra line at the end" >>oops &&
+	git commit -a -m added &&
+	git tag added &&
+
+	test_tick &&
+	git mv oops spoo &&
+	git commit -m rename1 &&
+	git tag rename1 &&
+
+	test_tick &&
+	git checkout -b side initial &&
+	git mv oops opos &&
+	git commit -m rename2 &&
+	git tag rename2
+'
+
+test_expect_success 'cherry-pick after renaming branch' '
+
+	git checkout rename2 &&
+	EDITOR=: VISUAL=: git cherry-pick added &&
+	test -f opos &&
+	grep "Add extra line at the end" opos
+
+'
+
+test_expect_success 'revert after renaming branch' '
+
+	git checkout rename1 &&
+	EDITOR=: VISUAL=: git revert added &&
+	test -f spoo &&
+	! grep "Add extra line at the end" spoo
+
+'
+
+test_done
-- 
1.5.0.rc1.gf4b6c


-
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

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]