diff tests/test-rename-merge2.t @ 12484:59012130b43e

tests: unify test-rename-merge2
author Matt Mackall <mpm@selenic.com>
date Sun, 26 Sep 2010 13:44:49 -0500
parents tests/test-rename-merge2@6c82beaaa11a
children 4c4aeaab2339
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rename-merge2.t	Sun Sep 26 13:44:49 2010 -0500
@@ -0,0 +1,754 @@
+
+  $ mkdir -p t
+  $ cd t
+  $ cat <<EOF > merge
+  > import sys, os
+  > f = open(sys.argv[1], "wb")
+  > f.write("merge %s %s %s" % (sys.argv[1], sys.argv[2], sys.argv[3]))
+  > f.close()
+  > EOF
+  $ HGMERGE="python ../merge"; export HGMERGE
+
+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"
+  > 
+  >     # remote
+  >     echo remote > rev
+  >     if [ "$2" != "" ] ; then $2 ; fi
+  >     hg ci -m "remote"
+  > 
+  >     # local
+  >     hg co -q 0
+  >     echo local > rev
+  >     if [ "$1" != "" ] ; then $1 ; fi
+  >     hg ci -m "local"
+  > 
+  >     # working dir
+  >     echo local > rev
+  >     if [ "$3" != "" ] ; then $3 ; fi
+  > 
+  >     # merge
+  >     echo "--------------"
+  >     echo "test L:$1 R:$2 W:$3 - $4"
+  >     echo "--------------"
+  >     hg merge -y --debug --traceback
+  > 
+  >     echo "--------------"
+  >     hg status -camC -X rev
+  > 
+  >     hg ci -m "merge"
+  > 
+  >     echo "--------------"
+  >     echo
+  > 
+  >     cd ..
+  >     rm -r 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"
+  created new head
+  --------------
+  test L:up a   R:nc a b W:       - 1  get local a to b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in other:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local e300d1c794ec+ remote 4ce40f5aca24
+   rev: versions differ -> m
+   a: remote copied to b -> m
+  preserving a for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging a and b to b
+  my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
+   premerge successful
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@e300d1c794ec+ other rev@4ce40f5aca24 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
+  --------------
+  
+  $ tm "nc a b" "up a  " "      " "2  get rem change to a and b"
+  created new head
+  --------------
+  test L:nc a b R:up a   W:       - 2  get rem change to a and b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 86a2aa42fc76+ remote f4db7e329e71
+   a: remote is newer -> g
+   b: local copied/moved to a -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  getting a
+  updating: b 2/3 files (66.67%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b and a to b
+  my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
+   premerge successful
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@86a2aa42fc76+ 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
+    a
+  --------------
+  
+  $ tm "up a  " "nm a b" "      " "3  get local a change to b, remove a"
+  created new head
+  --------------
+  test L:up a   R:nm a b W:       - 3  get local a change to b, remove a
+  --------------
+    searching for copies back to rev 1
+    unmatched files in other:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local e300d1c794ec+ remote bdb19105162a
+   rev: versions differ -> m
+   a: remote moved to b -> m
+  preserving a for resolve of b
+  preserving rev for resolve of rev
+  removing a
+  updating: a 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging a and b to b
+  my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
+   premerge successful
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@e300d1c794ec+ other rev@bdb19105162a 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
+  --------------
+  
+  $ tm "nm a b" "up a  " "      " "4  get remote change to b"
+  created new head
+  --------------
+  test L:nm a b R:up a   W:       - 4  get remote change to b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 02963e448370+ remote f4db7e329e71
+   b: local copied/moved to a -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: b 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b and a to b
+  my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
+   premerge successful
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@02963e448370+ 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
+    a
+  --------------
+  
+  $ tm "      " "nc a b" "      " "5  get b"
+  created new head
+  --------------
+  test L:       R:nc a b W:       - 5  get b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in other:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a 
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 94b33a1b7f2d+ remote 4ce40f5aca24
+   rev: versions differ -> m
+   b: remote created -> g
+  preserving rev for resolve of rev
+  updating: b 1/2 files (50.00%)
+  getting b
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
+  1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  --------------
+  M b
+  C a
+  --------------
+  
+  $ tm "nc a b" "      " "      " "6  nothing"
+  created new head
+  --------------
+  test L:nc a b R:       W:       - 6  nothing
+  --------------
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a 
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 86a2aa42fc76+ remote 97c705ade336
+   rev: versions differ -> m
+  preserving rev for resolve of rev
+  updating: rev 1/1 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  --------------
+  C a
+  C b
+  --------------
+  
+  $ tm "      " "nm a b" "      " "7  get b"
+  created new head
+  --------------
+  test L:       R:nm a b W:       - 7  get b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in other:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a 
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 94b33a1b7f2d+ remote bdb19105162a
+   a: other deleted -> r
+   rev: versions differ -> m
+   b: remote created -> g
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  removing a
+  updating: b 2/3 files (66.67%)
+  getting b
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
+  1 files updated, 1 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  --------------
+  M b
+  --------------
+  
+  $ tm "nm a b" "      " "      " "8  nothing"
+  created new head
+  --------------
+  test L:nm a b R:       W:       - 8  nothing
+  --------------
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a 
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 02963e448370+ remote 97c705ade336
+   rev: versions differ -> m
+  preserving rev for resolve of rev
+  updating: rev 1/1 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  --------------
+  C b
+  --------------
+  
+  $ tm "um a b" "um a b" "      " "9  do merge with ancestor in a"
+  created new head
+  --------------
+  test L:um a b R:um a b W:       - 9  do merge with ancestor in a
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 62e7bf090eba+ remote 49b6d8032493
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: b 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
+  0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  --------------
+  M b
+  --------------
+  
+
+m "um a c" "um x c" "      " "10 do merge with no ancestor"
+
+  $ tm "nm a b" "nm a c" "      " "11 get c, keep b"
+  created new head
+  --------------
+  test L:nm a b R:nm a c W:       - 11 get c, keep b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+    unmatched files in other:
+     c
+    all copies found (* = to merge, ! = divergent):
+     c -> a !
+     b -> a !
+    checking for directory renames
+   a: divergent renames -> dr
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 02963e448370+ remote fe905ef2c33e
+   rev: versions differ -> m
+   c: remote created -> g
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  warning: detected divergent renames of a to:
+   b
+   c
+  updating: c 2/3 files (66.67%)
+  getting c
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@02963e448370+ other rev@fe905ef2c33e 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
+  --------------
+  
+  $ tm "nc a b" "up b  " "      " "12 merge b no ancestor"
+  created new head
+  --------------
+  test L:nc a b R:up b   W:       - 12 merge b no ancestor
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 86a2aa42fc76+ remote af30c7647fc7
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: b 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@86a2aa42fc76+ 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
+  --------------
+  
+  $ tm "up b  " "nm a b" "      " "13 merge b no ancestor"
+  created new head
+  --------------
+  test L:up b   R:nm a b W:       - 13 merge b no ancestor
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 59318016310c+ remote bdb19105162a
+   a: other deleted -> r
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  removing a
+  updating: b 2/3 files (66.67%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
+  0 files updated, 2 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  --------------
+  M b
+  --------------
+  
+  $ tm "nc a b" "up a b" "      " "14 merge b no ancestor"
+  created new head
+  --------------
+  test L:nc a b R:up a b W:       - 14 merge b no ancestor
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 86a2aa42fc76+ remote 8dbce441892a
+   a: remote is newer -> g
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  getting a
+  updating: b 2/3 files (66.67%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@86a2aa42fc76+ 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
+  --------------
+  
+  $ tm "up b  " "nm a b" "      " "15 merge b no ancestor, remove a"
+  created new head
+  --------------
+  test L:up b   R:nm a b W:       - 15 merge b no ancestor, remove a
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 59318016310c+ remote bdb19105162a
+   a: other deleted -> r
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  removing a
+  updating: b 2/3 files (66.67%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
+  0 files updated, 2 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  --------------
+  M b
+  --------------
+  
+  $ tm "nc a b" "up a b" "      " "16 get a, merge b no ancestor"
+  created new head
+  --------------
+  test L:nc a b R:up a b W:       - 16 get a, merge b no ancestor
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 86a2aa42fc76+ remote 8dbce441892a
+   a: remote is newer -> g
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  getting a
+  updating: b 2/3 files (66.67%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@86a2aa42fc76+ 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
+  --------------
+  
+  $ tm "up a b" "nc a b" "      " "17 keep a, merge b no ancestor"
+  created new head
+  --------------
+  test L:up a b R:nc a b W:       - 17 keep a, merge b no ancestor
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 0b76e65c8289+ remote 4ce40f5aca24
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: b 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@0b76e65c8289+ other rev@4ce40f5aca24 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
+  --------------
+  
+  $ tm "nm a b" "up a b" "      " "18 merge b no ancestor"
+  created new head
+  --------------
+  test L:nm a b R:up a b W:       - 18 merge b no ancestor
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 02963e448370+ remote 8dbce441892a
+   b: versions differ -> m
+   rev: versions differ -> m
+  remote changed a which local deleted
+  use (c)hanged version or leave (d)eleted? c
+   a: prompt recreating -> g
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  getting a
+  updating: b 2/3 files (66.67%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@02963e448370+ 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
+  --------------
+  
+  $ tm "up a b" "nm a b" "      " "19 merge b no ancestor, prompt remove a"
+  created new head
+  --------------
+  test L:up a b R:nm a b W:       - 19 merge b no ancestor, prompt remove a
+  --------------
+    searching for copies back to rev 1
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 0b76e65c8289+ remote bdb19105162a
+   local changed a which remote deleted
+  use (c)hanged version or (d)elete? c
+   a: prompt keep -> a
+   b: versions differ -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: a 1/3 files (33.33%)
+  updating: b 2/3 files (66.67%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b
+  my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@0b76e65c8289+ other rev@bdb19105162a 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
+  --------------
+  
+  $ tm "up a  " "um a b" "      " "20 merge a and b to b, remove a"
+  created new head
+  --------------
+  test L:up a   R:um a b W:       - 20 merge a and b to b, remove a
+  --------------
+    searching for copies back to rev 1
+    unmatched files in other:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local e300d1c794ec+ remote 49b6d8032493
+   rev: versions differ -> m
+   a: remote moved to b -> m
+  preserving a for resolve of b
+  preserving rev for resolve of rev
+  removing a
+  updating: a 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging a and b to b
+  my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@e300d1c794ec+ other rev@49b6d8032493 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
+  --------------
+  
+  $ tm "um a b" "up a  " "      " "21 merge a and b to b"
+  created new head
+  --------------
+  test L:um a b R:up a   W:       - 21 merge a and b to b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 62e7bf090eba+ remote f4db7e329e71
+   b: local copied/moved to a -> m
+   rev: versions differ -> m
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: b 1/2 files (50.00%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b and a to b
+  my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
+  updating: rev 2/2 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@62e7bf090eba+ 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
+    a
+  --------------
+  
+
+m "nm a b" "um x a" "      " "22 get a, keep b"
+
+  $ tm "nm a b" "up a c" "      " "23 get c, keep b"
+  created new head
+  --------------
+  test L:nm a b R:up a c W:       - 23 get c, keep b
+  --------------
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+    unmatched files in other:
+     c
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite None partial False
+   ancestor 924404dff337 local 02963e448370+ remote 2b958612230f
+   b: local copied/moved to a -> m
+   rev: versions differ -> m
+   c: remote created -> g
+  preserving b for resolve of b
+  preserving rev for resolve of rev
+  updating: b 1/3 files (33.33%)
+  picked tool 'python ../merge' for b (binary False symlink False)
+  merging b and a to b
+  my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
+   premerge successful
+  updating: c 2/3 files (66.67%)
+  getting c
+  updating: rev 3/3 files (100.00%)
+  picked tool 'python ../merge' for rev (binary False symlink False)
+  merging rev
+  my rev@02963e448370+ 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
+    a
+  M c
+  --------------
+