Code

Use merge-recursive in git-revert/git-cherry-pick
authorJunio C Hamano <junkio@cox.net>
Mon, 15 Jan 2007 06:00:02 +0000 (22:00 -0800)
committerJunio C Hamano <junkio@cox.net>
Mon, 15 Jan 2007 06:00:34 +0000 (22:00 -0800)
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@cox.net>
git-revert.sh
t/t3501-revert-cherry-pick.sh [new file with mode: 0755]

index 71cbcbc2b886b2770c61c4b3a496db913ef56d9d..c74af99a5165a4e2671761fd0977211fc7b4f663 100755 (executable)
@@ -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 (executable)
index 0000000..552af1c
--- /dev/null
@@ -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