# HG changeset patch # User Matt Mackall # Date 1160171711 18000 # Node ID ae85272b59a4e76b06d97de966388d6f85d6578a # Parent c93ce7f10f8510ff78283f2c76dc76694c20b92d merge: copy fixes and tests Fix up "already seen" logic Fix merge action in remote copy case Add status message Add lots of merge+copy/move test cases diff -r c93ce7f10f85 -r ae85272b59a4 mercurial/merge.py --- a/mercurial/merge.py Wed Oct 04 19:08:04 2006 -0500 +++ b/mercurial/merge.py Fri Oct 06 16:55:11 2006 -0500 @@ -248,11 +248,11 @@ continue if f in copy: f2 = copy[f] - if f2 in ma or f2 in m1: # already seen + if f2 not in m2: # already seen continue # rename case 1, A/A,B/A act("remote copied", - f, "c", f2, f, m1[f2], m2[f], fmerge(f2, f, f2), False) + f2, "c", f, f, m1[f2], m2[f], fmerge(f2, f, f2), False) elif f in ma: if overwrite or backwards: act("recreating", f, "g", m2.execf(f), n) @@ -285,6 +285,7 @@ removed +=1 elif m == "c": # copy f2, fd, my, other, flag, move = a[2:] + repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd)) if filemerge(repo, f, f2, fd, my, other, xp1, xp2, move): unresolved += 1 util.set_exec(repo.wjoin(fd), flag) diff -r c93ce7f10f85 -r ae85272b59a4 tests/test-rename-merge1.out --- a/tests/test-rename-merge1.out Wed Oct 04 19:08:04 2006 -0500 +++ b/tests/test-rename-merge1.out Fri Oct 06 16:55:11 2006 -0500 @@ -6,6 +6,7 @@ ancestor f26ec4fc3fa3 local 8e765a822af2 remote af1939970a1c a: remote moved -> c b2: remote created -> g +merging a and b to b resolving a my a@f26ec4fc3fa3 other b@8e765a822af2 ancestor a@af1939970a1c copying a to b diff -r c93ce7f10f85 -r ae85272b59a4 tests/test-rename-merge2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-rename-merge2 Fri Oct 06 16:55:11 2006 -0500 @@ -0,0 +1,102 @@ +#!/bin/sh + +mkdir -p t +cd t + +cat <<'EOF' > merge +#!/bin/sh +echo merge > $1 +EOF +chmod +x merge + +# perform a test merge with possible renaming +# +# args: +# $1 = action in local branch +# $2 = action in remote branch +# $3 = action in working dir +# $4 = expected result +tm() +{ + mkdir t + cd t + hg init + echo "[merge]" >> .hg/hgrc + echo "followcopies = 1" >> .hg/hgrc + + # base + echo base > a + echo base > rev # used to force commits + hg add a rev + hg ci -m "base" -d "0 0" + + # remote + echo remote > rev + if [ "$2" != "" ] ; then $2 ; fi + hg ci -m "remote" -d "0 0" + + # local + hg co -q 0 + echo local > rev + if [ "$1" != "" ] ; then $1 ; fi + hg ci -m "local" -d "0 0" + + # working dir + echo local > rev + if [ "$3" != "" ] ; then $3 ; fi + + # merge + echo "--------------" + echo "test L:$1 R:$2 W:$3 - $4" + echo "--------------" + env HGMERGE=../merge hg merge -y --debug --traceback + + echo "--------------" + hg status -camC -X rev + + hg ci -m "merge" -d "0 0" + + echo "--------------" + echo + + cd .. + rm -rf t +} + +up() { + cp rev $1 + hg add $1 2> /dev/null + if [ "$2" != "" ] ; then + cp rev $2 + hg add $2 2> /dev/null + fi +} + +uc() { up $1; hg cp $1 $2; } # update + copy +um() { up $1; hg mv $1 $2; } +nc() { hg cp $1 $2; } # just copy +nm() { hg mv $1 $2; } # just move + +tm "up a " "nc a b" " " "1 get local a to b" +tm "nc a b" "up a " " " "2 get rem change to a and b" +tm "up a " "nm a b" " " "3 get local a change to b, remove a" +tm "nm a b" "up a " " " "4 get remote change to b" +tm " " "nc a b" " " "5 get b" +tm "nc a b" " " " " "6 nothing" +tm " " "nm a b" " " "7 get b" +tm "nm a b" " " " " "8 nothing" +tm "um a b" "um a b" " " "9 do merge with ancestor in a" +#tm "um a c" "um x c" " " "10 do merge with no ancestor" +tm "nm a b" "nm a c" " " "11 get c, keep b" +tm "nc a b" "up b " " " "12 merge b no ancestor" +tm "up b " "nm a b" " " "13 merge b no ancestor" +tm "nc a b" "up a b" " " "14 merge b no ancestor" +tm "up b " "nm a b" " " "15 merge b no ancestor, remove a" +tm "nc a b" "up a b" " " "16 get a, merge b no ancestor" +tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor" +tm "nm a b" "up a b" " " "18 merge b no ancestor" +tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a" +tm "up a " "um a b" " " "20 merge a and b to b, remove a" +tm "um a b" "up a " " " "21 merge a and b to b" +#tm "nm a b" "um x a" " " "22 get a, keep b" +tm "nm a b" "up a c" " " "23 get c, keep b" diff -r c93ce7f10f85 -r ae85272b59a4 tests/test-rename-merge2.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-rename-merge2.out Fri Oct 06 16:55:11 2006 -0500 @@ -0,0 +1,457 @@ +-------------- +test L:up a R:nc a b W: - 1 get local a to b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor e300d1c794ec local 735846fee2d7 remote 924404dff337 + rev: versions differ -> m + a: remote copied -> c +merging a and b to b +resolving a +my a@e300d1c794ec other b@735846fee2d7 ancestor a@924404dff337 +copying a to b +merging rev +resolving rev +my rev@e300d1c794ec other rev@735846fee2d7 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b + a +C a +-------------- + +-------------- +test L:nc a b R:up a W: - 2 get rem change to a and b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ac809aeed39a local f4db7e329e71 remote 924404dff337 + a: remote is newer -> g + b: local copied -> c + rev: versions differ -> m +getting a +merging b and a to b +resolving b +my b@ac809aeed39a other a@f4db7e329e71 ancestor a@924404dff337 +merging rev +resolving rev +my rev@ac809aeed39a other rev@f4db7e329e71 ancestor rev@924404dff337 +1 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M a +M b +-------------- + +-------------- +test L:up a R:nm a b W: - 3 get local a change to b, remove a +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor e300d1c794ec local e03727d2d66b remote 924404dff337 + a: remote moved -> c + rev: versions differ -> m +merging a and b to b +resolving a +my a@e300d1c794ec other b@e03727d2d66b ancestor a@924404dff337 +copying a to b +removing a +merging rev +resolving rev +my rev@e300d1c794ec other rev@e03727d2d66b ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b + a +-------------- + +-------------- +test L:nm a b R:up a W: - 4 get remote change to b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ecf3cb2a4219 local f4db7e329e71 remote 924404dff337 + b: local moved -> c + rev: versions differ -> m +merging b and a to b +resolving b +my b@ecf3cb2a4219 other a@f4db7e329e71 ancestor a@924404dff337 +merging rev +resolving rev +my rev@ecf3cb2a4219 other rev@f4db7e329e71 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +-------------- + +-------------- +test L: R:nc a b W: - 5 get b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor 94b33a1b7f2d local 735846fee2d7 remote 924404dff337 + rev: versions differ -> m + a: remote copied -> c +merging a and b to b +resolving a +my a@924404dff337 other b@735846fee2d7 ancestor a@924404dff337 +copying a to b +merging rev +resolving rev +my rev@94b33a1b7f2d other rev@735846fee2d7 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M a +M b + a +-------------- + +-------------- +test L:nc a b R: W: - 6 nothing +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ac809aeed39a local 97c705ade336 remote 924404dff337 + b: local copied -> c + rev: versions differ -> m +merging b and a to b +resolving b +my b@ac809aeed39a other a@924404dff337 ancestor a@924404dff337 +merging rev +resolving rev +my rev@ac809aeed39a other rev@97c705ade336 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +C a +-------------- + +-------------- +test L: R:nm a b W: - 7 get b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor 94b33a1b7f2d local e03727d2d66b remote 924404dff337 + a: remote moved -> c + rev: versions differ -> m +merging a and b to b +resolving a +my a@924404dff337 other b@e03727d2d66b ancestor a@924404dff337 +copying a to b +removing a +merging rev +resolving rev +my rev@94b33a1b7f2d other rev@e03727d2d66b ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b + a +-------------- + +-------------- +test L:nm a b R: W: - 8 nothing +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ecf3cb2a4219 local 97c705ade336 remote 924404dff337 + b: local moved -> c + rev: versions differ -> m +merging b and a to b +resolving b +my b@ecf3cb2a4219 other a@924404dff337 ancestor a@924404dff337 +merging rev +resolving rev +my rev@ecf3cb2a4219 other rev@97c705ade336 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +-------------- + +-------------- +test L:um a b R:um a b W: - 9 do merge with ancestor in a +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ec03c2ca8642 local 79cc6877a3b7 remote 924404dff337 + b: versions differ -> m + rev: versions differ -> m +merging b +resolving b +my b@ec03c2ca8642 other b@79cc6877a3b7 ancestor a@924404dff337 +merging rev +resolving rev +my rev@ec03c2ca8642 other rev@79cc6877a3b7 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +-------------- + +-------------- +test L:nm a b R:nm a c W: - 11 get c, keep b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ecf3cb2a4219 local e6abcc1a30c2 remote 924404dff337 + rev: versions differ -> m + c: remote created -> g +getting c +merging rev +resolving rev +my rev@ecf3cb2a4219 other rev@e6abcc1a30c2 ancestor rev@924404dff337 +1 files updated, 1 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M c +C b +-------------- + +-------------- +test L:nc a b R:up b W: - 12 merge b no ancestor +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ac809aeed39a local af30c7647fc7 remote 924404dff337 + b: versions differ -> m + rev: versions differ -> m +merging b +resolving b +my b@ac809aeed39a other b@af30c7647fc7 ancestor b@000000000000 +merging rev +resolving rev +my rev@ac809aeed39a other rev@af30c7647fc7 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +C a +-------------- + +-------------- +test L:up b R:nm a b W: - 13 merge b no ancestor +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor 59318016310c local e03727d2d66b remote 924404dff337 + a: other deleted -> r + b: versions differ -> m + rev: versions differ -> m +removing a +merging b +resolving b +my b@59318016310c other b@e03727d2d66b ancestor b@000000000000 +merging rev +resolving rev +my rev@59318016310c other rev@e03727d2d66b ancestor rev@924404dff337 +0 files updated, 2 files merged, 1 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +-------------- + +-------------- +test L:nc a b R:up a b W: - 14 merge b no ancestor +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ac809aeed39a local 8dbce441892a remote 924404dff337 + a: remote is newer -> g + b: versions differ -> m + rev: versions differ -> m +getting a +merging b +resolving b +my b@ac809aeed39a other b@8dbce441892a ancestor b@000000000000 +merging rev +resolving rev +my rev@ac809aeed39a other rev@8dbce441892a ancestor rev@924404dff337 +1 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M a +M b +-------------- + +-------------- +test L:up b R:nm a b W: - 15 merge b no ancestor, remove a +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor 59318016310c local e03727d2d66b remote 924404dff337 + a: other deleted -> r + b: versions differ -> m + rev: versions differ -> m +removing a +merging b +resolving b +my b@59318016310c other b@e03727d2d66b ancestor b@000000000000 +merging rev +resolving rev +my rev@59318016310c other rev@e03727d2d66b ancestor rev@924404dff337 +0 files updated, 2 files merged, 1 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +-------------- + +-------------- +test L:nc a b R:up a b W: - 16 merge a, merge b no ancestor +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ac809aeed39a local 8dbce441892a remote 924404dff337 + a: remote is newer -> g + b: versions differ -> m + rev: versions differ -> m +getting a +merging b +resolving b +my b@ac809aeed39a other b@8dbce441892a ancestor b@000000000000 +merging rev +resolving rev +my rev@ac809aeed39a other rev@8dbce441892a ancestor rev@924404dff337 +1 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M a +M b +-------------- + +-------------- +test L:up a b R:nc a b W: - 17 merge a, merge b no ancestor +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor 0b76e65c8289 local 735846fee2d7 remote 924404dff337 + b: versions differ -> m + rev: versions differ -> m +merging b +resolving b +my b@0b76e65c8289 other b@735846fee2d7 ancestor b@000000000000 +merging rev +resolving rev +my rev@0b76e65c8289 other rev@735846fee2d7 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +C a +-------------- + +-------------- +test L:nm a b R:up a b W: - 18 merge b no ancestor +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ecf3cb2a4219 local 8dbce441892a remote 924404dff337 + b: versions differ -> m + rev: versions differ -> m + a: prompt recreating -> g +getting a +merging b +resolving b +my b@ecf3cb2a4219 other b@8dbce441892a ancestor b@000000000000 +merging rev +resolving rev +my rev@ecf3cb2a4219 other rev@8dbce441892a ancestor rev@924404dff337 +1 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M a +M b +-------------- + +-------------- +test L:up a b R:nm a b W: - 19 merge b no ancestor, remove a +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor 0b76e65c8289 local e03727d2d66b remote 924404dff337 + b: versions differ -> m + rev: versions differ -> m +merging b +resolving b +my b@0b76e65c8289 other b@e03727d2d66b ancestor b@000000000000 +merging rev +resolving rev +my rev@0b76e65c8289 other rev@e03727d2d66b ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +C a +-------------- + +-------------- +test L:up a R:um a b W: - 20 merge a and b to b, remove a +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor e300d1c794ec local 79cc6877a3b7 remote 924404dff337 + a: remote moved -> c + rev: versions differ -> m +merging a and b to b +resolving a +my a@e300d1c794ec other b@79cc6877a3b7 ancestor a@924404dff337 +copying a to b +removing a +merging rev +resolving rev +my rev@e300d1c794ec other rev@79cc6877a3b7 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b + a +-------------- + +-------------- +test L:um a b R:up a W: - 21 merge a and b to b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ec03c2ca8642 local f4db7e329e71 remote 924404dff337 + b: local moved -> c + rev: versions differ -> m +merging b and a to b +resolving b +my b@ec03c2ca8642 other a@f4db7e329e71 ancestor a@924404dff337 +merging rev +resolving rev +my rev@ec03c2ca8642 other rev@f4db7e329e71 ancestor rev@924404dff337 +0 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +-------------- + +-------------- +test L:nm a b R:up a c W: - 23 get c, keep b +-------------- +resolving manifests + overwrite None branchmerge True partial False + ancestor ecf3cb2a4219 local 2b958612230f remote 924404dff337 + b: local moved -> c + rev: versions differ -> m + c: remote created -> g +merging b and a to b +resolving b +my b@ecf3cb2a4219 other a@2b958612230f ancestor a@924404dff337 +getting c +merging rev +resolving rev +my rev@ecf3cb2a4219 other rev@2b958612230f ancestor rev@924404dff337 +1 files updated, 2 files merged, 0 files removed, 0 files unresolved +(branch merge, don't forget to commit) +-------------- +M b +M c +-------------- +