[PATCH 1 of 2] merge: introduce mergestate

Matt Mackall mpm at selenic.com
Sun Apr 6 16:46:34 CDT 2008


# HG changeset patch
# User Matt Mackall <mpm at selenic.com>
# Date 1207518365 18000
# Node ID 32649adf4620c895af549abaa4122a0f16488d0a
# Parent  9c426da6b03b2f201e23107af5138d6b4a387428
merge: introduce mergestate

diff -r 9c426da6b03b -r 32649adf4620 mercurial/filemerge.py
--- a/mercurial/filemerge.py	Fri Apr 04 16:39:44 2008 +0200
+++ b/mercurial/filemerge.py	Sun Apr 06 16:46:05 2008 -0500
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
-from node import nullrev
+from node import nullrev, short
 from i18n import _
 import util, os, tempfile, simplemerge, re, filecmp
 
@@ -99,11 +99,11 @@
             if newdata != data:
                 open(file, "wb").write(newdata)
 
-def filemerge(repo, fw, fd, fo, wctx, mctx):
+def filemerge(repo, fcl, fco, fca):
     """perform a 3-way merge in the working directory
 
     fw = original filename in the working directory
-    fd = destination filename in the working directory
+    fd = current/destination filename in the working directory
     fo = filename in other parent
     wctx, mctx = working and merge changecontexts
     """
@@ -123,23 +123,21 @@
         except IOError:
             return False
 
-    fco = mctx.filectx(fo)
-    if not fco.cmp(wctx.filectx(fd).data()): # files identical?
+    if not fco.cmp(fcl.data()): # files identical?
         return None
 
     ui = repo.ui
-    fcm = wctx.filectx(fw)
-    fca = fcm.ancestor(fco) or repo.filectx(fw, fileid=nullrev)
-    binary = isbin(fcm) or isbin(fco) or isbin(fca)
-    symlink = fcm.islink() or fco.islink()
-    tool, toolpath = _picktool(repo, ui, fw, binary, symlink)
+    fd = fcl.path()
+    binary = isbin(fcl) or isbin(fco) or isbin(fca)
+    symlink = fcl.islink() or fco.islink()
+    tool, toolpath = _picktool(repo, ui, fd, binary, symlink)
     ui.debug(_("picked tool '%s' for %s (binary %s symlink %s)\n") %
-               (tool, fw, binary, symlink))
+               (tool, fd, binary, symlink))
 
     if not tool:
         tool = "internal:local"
         if ui.prompt(_(" no tool found to merge %s\n"
-                       "keep (l)ocal or take (o)ther?") % fw,
+                       "keep (l)ocal or take (o)ther?") % fd,
                      _("[lo]"), _("l")) != _("l"):
             tool = "internal:other"
     if tool == "internal:local":
@@ -158,11 +156,8 @@
     back = a + ".orig"
     util.copyfile(a, back)
 
-    if fw != fo:
-        repo.ui.status(_("merging %s and %s\n") % (fw, fo))
-    else:
-        repo.ui.status(_("merging %s\n") % fw)
-    repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
+    repo.ui.status(_("merging %s\n") % fd)
+    repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcl, fco, fca))
 
     # do we attempt to simplemerge first?
     if _toolbool(ui, tool, "premerge", not (binary or symlink)):
@@ -176,9 +171,9 @@
         util.copyfile(back, a) # restore from backup and try again
 
     env = dict(HG_FILE=fd,
-               HG_MY_NODE=str(wctx.parents()[0]),
-               HG_OTHER_NODE=str(mctx),
-               HG_MY_ISLINK=fcm.islink(),
+               HG_MY_NODE=short(repo.dirstate.parents()[0]),
+               HG_OTHER_NODE=short(repo.dirstate.parents()[1]),
+               HG_MY_ISLINK=fcl.islink(),
                HG_OTHER_ISLINK=fco.islink(),
                HG_BASE_ISLINK=fca.islink())
 
@@ -194,7 +189,7 @@
         r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env)
 
     if not r and _toolbool(ui, tool, "checkconflicts"):
-        if re.match("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcm.data()):
+        if re.match("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcl.data()):
             r = 1
 
     if not r and _toolbool(ui, tool, "checkchanged"):
diff -r 9c426da6b03b -r 32649adf4620 mercurial/merge.py
--- a/mercurial/merge.py	Fri Apr 04 16:39:44 2008 +0200
+++ b/mercurial/merge.py	Sun Apr 06 16:46:05 2008 -0500
@@ -5,9 +5,72 @@
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
-from node import nullid, nullrev
+from node import nullid, nullrev, hex
 from i18n import _
-import errno, util, os, filemerge, copies
+import errno, util, os, filemerge, copies, sha
+
+class mergestate:
+    '''track 3-way merge state of individual files'''
+    def __init__(self, repo):
+        self._repo = repo
+        self._state = {}
+        self._data = {}
+    def clear(self):
+        p = self._repo.join("merge")
+        try:
+            for f in os.listdir(p):
+                os.unlink(os.path.join(p, f))
+        except OSError, err:
+            if err.errno != errno.ENOENT:
+                raise
+    def read(self):
+        try:
+            f = self._repo.opener("merge/state")
+            for l in f:
+                bits = l[:-1].split(" ")
+                dfile, state, hash, afile, anode, ofile, dflags = bits
+                self._state[dfile] = state
+                self._data[dfile] = hash, afile, anode, ofile, dflags
+        except IOError, err:
+            if err.errno != errno.ENOENT:
+                raise
+    def write(self):
+        f = self._repo.opener("merge/state", "w")
+        for d, v in self._state.items():
+            e = self._data[d]
+            f.write("%s %s %s %s %s %s %s\n" %
+                    (d, v, e[0], e[1], e[2], e[3], e[4]))
+    def add(self, fcl, fco, fca, fd, flags):
+        hash = sha.sha(fcl.path()).hexdigest()
+        self._repo.opener("merge/" + hash, "w").write(fcl.data())
+        self._state[fd] = 'u'
+        self._data[fd] = (hash, fca.path(), hex(fca.filenode()),
+                          fco.path(), flags)
+    def __contains__(self, dfile):
+        return dfile in self._state
+    def __getitem__(self, dfile):
+        return self._state[dfile]
+    def __iter__(self):
+        l = self._state.keys()
+        l.sort()
+        for f in l:
+            yield f
+    def mark(self, dfile, state):
+        self._state[dfile] = state
+    def resolve(self, dfile, wctx, mctx):
+        if self[dfile] == 'r':
+            return 0
+        hash, afile, anode, ofile, flags = self._data[dfile]
+        f = self._repo.opener("merge/" + hash)
+        self._repo.wwrite(dfile, f.read(), flags)
+        fcl = wctx[dfile]
+        fco = mctx[ofile]
+        fca = self._repo.filectx(afile, fileid=anode)
+        r = filemerge.filemerge(self._repo, fcl, fco, fca)
+        if not r:
+            util.set_flags(self._repo.wjoin(dfile), flags)
+            self.mark(dfile, 'r')
+        return r
 
 def _checkunknown(wctx, mctx):
     "check for collisions between unknown files and files in mctx"
@@ -202,14 +265,29 @@
 
     updated, merged, removed, unresolved = 0, 0, 0, 0
     action.sort()
-    # prescan for copy/renames
+
+    ms = mergestate(repo)
+    ms.clear()
+    moves = []
+
+    # prescan for merges
     for a in action:
         f, m = a[:2]
         if m == 'm': # merge
             f2, fd, flags, move = a[2:]
-            if f != fd:
-                repo.ui.debug(_("copying %s to %s\n") % (f, fd))
-                repo.wwrite(fd, repo.wread(f), flags)
+            repo.ui.debug(_("preserving %s for resolve of %s\n") % (f, fd))
+            fcl = wctx[f]
+            fco = mctx[f2]
+            fca = fcl.ancestor(fco) or repo.filectx(f, fileid=nullrev)
+            ms.add(fcl, fco, fca, fd, flags)
+            if f != fd and move:
+                moves.append(f)
+
+    # remove renamed files after safely stored
+    for f in moves:
+        if util.lexists(repo.wjoin(f)):
+            repo.ui.debug(_("removing %s\n") % f)
+            os.unlink(repo.wjoin(f))
 
     audit_path = util.path_auditor(repo.root)
 
@@ -229,7 +307,7 @@
             removed += 1
         elif m == "m": # merge
             f2, fd, flags, move = a[2:]
-            r = filemerge.filemerge(repo, f, fd, f2, wctx, mctx)
+            r = ms.resolve(fd, wctx, mctx)
             if r > 0:
                 unresolved += 1
             else:
@@ -237,10 +315,6 @@
                     updated += 1
                 else:
                     merged += 1
-            util.set_flags(repo.wjoin(fd), flags)
-            if f != fd and move and util.lexists(repo.wjoin(f)):
-                repo.ui.debug(_("removing %s\n") % f)
-                os.unlink(repo.wjoin(f))
         elif m == "g": # get
             flags = a[2]
             repo.ui.note(_("getting %s\n") % f)
@@ -267,6 +341,8 @@
         elif m == "e": # exec
             flags = a[2]
             util.set_flags(repo.wjoin(f), flags)
+
+    ms.write()
 
     return updated, merged, removed, unresolved
 
diff -r 9c426da6b03b -r 32649adf4620 tests/test-convert-hg-source.out
--- a/tests/test-convert-hg-source.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-convert-hg-source.out	Sun Apr 06 16:46:05 2008 -0500
@@ -1,9 +1,9 @@
 created new head
-merging baz and foo
+merging baz
 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-merging foo and baz
+merging baz
 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 created new head
diff -r 9c426da6b03b -r 32649adf4620 tests/test-copy-move-merge.out
--- a/tests/test-copy-move-merge.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-copy-move-merge.out	Sun Apr 06 16:46:05 2008 -0500
@@ -12,16 +12,16 @@
   checking for directory renames
  a: remote moved to c -> m
  a: remote moved to b -> m
-copying a to b
-copying a to c
-picked tool 'internal:merge' for a (binary False symlink False)
-merging a and b
-my a at fb3948d97f07+ other b at 40da226db0f0 ancestor a at 583c7b748052
+preserving a for resolve of b
+preserving a for resolve of c
+removing a
+picked tool 'internal:merge' for b (binary False symlink False)
+merging b
+my b at fb3948d97f07+ other b at 40da226db0f0 ancestor a at 583c7b748052
  premerge successful
-removing a
-picked tool 'internal:merge' for a (binary False symlink False)
-merging a and c
-my a at fb3948d97f07+ other c at 40da226db0f0 ancestor a at 583c7b748052
+picked tool 'internal:merge' for c (binary False symlink False)
+merging c
+my c at fb3948d97f07+ other c at 40da226db0f0 ancestor a at 583c7b748052
  premerge successful
 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
diff -r 9c426da6b03b -r 32649adf4620 tests/test-double-merge.out
--- a/tests/test-double-merge.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-double-merge.out	Sun Apr 06 16:46:05 2008 -0500
@@ -10,10 +10,11 @@
   checking for directory renames
  foo: versions differ -> m
  foo: remote copied to bar -> m
-copying foo to bar
-picked tool 'internal:merge' for foo (binary False symlink False)
-merging foo and bar
-my foo at 2092631ce82b+ other bar at 7731dad1c2b9 ancestor foo at 310fd17130da
+preserving foo for resolve of bar
+preserving foo for resolve of foo
+picked tool 'internal:merge' for bar (binary False symlink False)
+merging bar
+my bar at 2092631ce82b+ other bar at 7731dad1c2b9 ancestor foo at 310fd17130da
  premerge successful
 picked tool 'internal:merge' for foo (binary False symlink False)
 merging foo
diff -r 9c426da6b03b -r 32649adf4620 tests/test-issue612.out
--- a/tests/test-issue612.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-issue612.out	Sun Apr 06 16:46:05 2008 -0500
@@ -3,7 +3,7 @@
 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
 created new head
 ? src/a.o
-merging src/a.c and source/a.c
+merging source/a.c
 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 M source/a.c
diff -r 9c426da6b03b -r 32649adf4620 tests/test-issue672.out
--- a/tests/test-issue672.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-issue672.out	Sun Apr 06 16:46:05 2008 -0500
@@ -30,8 +30,9 @@
    1a -> 1 *
   checking for directory renames
  1a: local moved to 1 -> m
+preserving 1a for resolve of 1a
 picked tool 'internal:merge' for 1a (binary False symlink False)
-merging 1a and 1
+merging 1a
 my 1a at ac7575e3c052+ other 1 at 746e9549ea96 ancestor 1 at 81f4b099af3d
  premerge successful
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -47,11 +48,11 @@
    1a -> 1 *
   checking for directory renames
  1: remote moved to 1a -> m
-copying 1 to 1a
-picked tool 'internal:merge' for 1 (binary False symlink False)
-merging 1 and 1a
-my 1 at 746e9549ea96+ other 1a at ac7575e3c052 ancestor 1 at 81f4b099af3d
+preserving 1 for resolve of 1a
+removing 1
+picked tool 'internal:merge' for 1a (binary False symlink False)
+merging 1a
+my 1a at 746e9549ea96+ other 1a at ac7575e3c052 ancestor 1 at 81f4b099af3d
  premerge successful
-removing 1
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
diff -r 9c426da6b03b -r 32649adf4620 tests/test-merge-commit.out
--- a/tests/test-merge-commit.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-merge-commit.out	Sun Apr 06 16:46:05 2008 -0500
@@ -1,6 +1,6 @@
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 created new head
-merging bar and foo
+merging bar
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 % contents of bar should be line0 line1 line2
@@ -27,6 +27,7 @@
  ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 7d3b554bfdf1
   searching for copies back to rev 1
  bar: versions differ -> m
+preserving bar for resolve of bar
 picked tool 'internal:merge' for bar (binary False symlink False)
 merging bar
 my bar at 2d2f9a22c82b+ other bar at 7d3b554bfdf1 ancestor bar at 0a3ab4856510
@@ -49,7 +50,7 @@
 adding file changes
 added 3 changesets with 3 changes to 2 files (+1 heads)
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-merging foo and bar
+merging bar
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 % contents of bar should be line0 line1 line2
@@ -76,6 +77,7 @@
  ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 96ab80c60897
   searching for copies back to rev 1
  bar: versions differ -> m
+preserving bar for resolve of bar
 picked tool 'internal:merge' for bar (binary False symlink False)
 merging bar
 my bar at 2d2f9a22c82b+ other bar at 96ab80c60897 ancestor bar at 0a3ab4856510
diff -r 9c426da6b03b -r 32649adf4620 tests/test-merge-remove.out
--- a/tests/test-merge-remove.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-merge-remove.out	Sun Apr 06 16:46:05 2008 -0500
@@ -1,5 +1,5 @@
 created new head
-merging foo1 and foo
+merging foo1
 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 n   0         -2 bar
diff -r 9c426da6b03b -r 32649adf4620 tests/test-merge10.out
--- a/tests/test-merge10.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-merge10.out	Sun Apr 06 16:46:05 2008 -0500
@@ -8,7 +8,7 @@
 added 1 changesets with 1 changes to 1 files (+1 heads)
 (run 'hg heads' to see heads, 'hg merge' to merge)
 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-merging testdir/subdir/a and testdir/a
+merging testdir/subdir/a
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 M testdir/subdir/a
diff -r 9c426da6b03b -r 32649adf4620 tests/test-merge7.out
--- a/tests/test-merge7.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-merge7.out	Sun Apr 06 16:46:05 2008 -0500
@@ -26,6 +26,7 @@
  ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360
   searching for copies back to rev 1
  test.txt: versions differ -> m
+preserving test.txt for resolve of test.txt
 picked tool 'internal:merge' for test.txt (binary False symlink False)
 merging test.txt
 my test.txt at 451c744aabcc+ other test.txt at a070d41e8360 ancestor test.txt at faaea63e63a9
diff -r 9c426da6b03b -r 32649adf4620 tests/test-merge9.out
--- a/tests/test-merge9.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-merge9.out	Sun Apr 06 16:46:05 2008 -0500
@@ -5,7 +5,7 @@
 created new head
 merging bar
 merging bar failed!
-merging foo and baz
+merging baz
 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
 There are unresolved merges, you can redo the full merge using:
   hg update -C 2
@@ -13,7 +13,7 @@
 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
 merging bar
 merging bar failed!
-merging baz and foo
+merging baz
 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
 There are unresolved merges, you can redo the full merge using:
   hg update -C 1
diff -r 9c426da6b03b -r 32649adf4620 tests/test-rename-merge1.out
--- a/tests/test-rename-merge1.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-rename-merge1.out	Sun Apr 06 16:46:05 2008 -0500
@@ -19,12 +19,12 @@
  a2: divergent renames -> dr
  a: remote moved to b -> m
  b2: remote created -> g
-copying a to b
-picked tool 'internal:merge' for a (binary False symlink False)
-merging a and b
-my a at f26ec4fc3fa3+ other b at 8e765a822af2 ancestor a at af1939970a1c
+preserving a for resolve of b
+removing a
+picked tool 'internal:merge' for b (binary False symlink False)
+merging b
+my b at f26ec4fc3fa3+ other b at 8e765a822af2 ancestor a at af1939970a1c
  premerge successful
-removing a
 warning: detected divergent renames of a2 to:
  c2
  b2
diff -r 9c426da6b03b -r 32649adf4620 tests/test-rename-merge2.out
--- a/tests/test-rename-merge2.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-rename-merge2.out	Sun Apr 06 16:46:05 2008 -0500
@@ -13,10 +13,11 @@
   checking for directory renames
  rev: versions differ -> m
  a: remote copied to b -> m
-copying a to b
-picked tool 'python ../merge' for a (binary False symlink False)
-merging a and b
-my a at e300d1c794ec+ other b at 735846fee2d7 ancestor a at 924404dff337
+preserving a for resolve of b
+preserving rev for resolve of rev
+picked tool 'python ../merge' for b (binary False symlink False)
+merging b
+my b at e300d1c794ec+ other b at 735846fee2d7 ancestor a at 924404dff337
  premerge successful
 picked tool 'python ../merge' for rev (binary False symlink False)
 merging rev
@@ -45,9 +46,11 @@
  a: remote is newer -> g
  b: local copied to a -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 getting a
 picked tool 'python ../merge' for b (binary False symlink False)
-merging b and a
+merging b
 my b at ac809aeed39a+ other a at f4db7e329e71 ancestor a at 924404dff337
  premerge successful
 picked tool 'python ../merge' for rev (binary False symlink False)
@@ -76,12 +79,13 @@
   checking for directory renames
  rev: versions differ -> m
  a: remote moved to b -> m
-copying a to b
-picked tool 'python ../merge' for a (binary False symlink False)
-merging a and b
-my a at e300d1c794ec+ other b at e03727d2d66b ancestor a at 924404dff337
+preserving a for resolve of b
+preserving rev for resolve of rev
+removing a
+picked tool 'python ../merge' for b (binary False symlink False)
+merging b
+my b at e300d1c794ec+ other b at e03727d2d66b ancestor a at 924404dff337
  premerge successful
-removing a
 picked tool 'python ../merge' for rev (binary False symlink False)
 merging rev
 my rev at e300d1c794ec+ other rev at e03727d2d66b ancestor rev at 924404dff337
@@ -107,8 +111,10 @@
   checking for directory renames
  b: local moved to a -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 picked tool 'python ../merge' for b (binary False symlink False)
-merging b and a
+merging b
 my b at ecf3cb2a4219+ other a at f4db7e329e71 ancestor a at 924404dff337
  premerge successful
 picked tool 'python ../merge' for rev (binary False symlink False)
@@ -136,6 +142,7 @@
   checking for directory renames
  rev: versions differ -> m
  b: remote created -> g
+preserving rev for resolve of rev
 getting b
 picked tool 'python ../merge' for rev (binary False symlink False)
 merging rev
@@ -161,6 +168,7 @@
    b -> a 
   checking for directory renames
  rev: versions differ -> m
+preserving rev for resolve of rev
 picked tool 'python ../merge' for rev (binary False symlink False)
 merging rev
 my rev at ac809aeed39a+ other rev at 97c705ade336 ancestor rev at 924404dff337
@@ -187,6 +195,7 @@
  a: other deleted -> r
  rev: versions differ -> m
  b: remote created -> g
+preserving rev for resolve of rev
 removing a
 getting b
 picked tool 'python ../merge' for rev (binary False symlink False)
@@ -212,6 +221,7 @@
    b -> a 
   checking for directory renames
  rev: versions differ -> m
+preserving rev for resolve of rev
 picked tool 'python ../merge' for rev (binary False symlink False)
 merging rev
 my rev at ecf3cb2a4219+ other rev at 97c705ade336 ancestor rev at 924404dff337
@@ -231,6 +241,8 @@
   searching for copies back to rev 1
  b: versions differ -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
 my b at ec03c2ca8642+ other b at 79cc6877a3b7 ancestor a at 924404dff337
@@ -262,6 +274,7 @@
  a: divergent renames -> dr
  rev: versions differ -> m
  c: remote created -> g
+preserving rev for resolve of rev
 warning: detected divergent renames of a to:
  b
  c
@@ -286,6 +299,8 @@
   searching for copies back to rev 1
  b: versions differ -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
 my b at ac809aeed39a+ other b at af30c7647fc7 ancestor b at 000000000000
@@ -310,6 +325,8 @@
  a: other deleted -> r
  b: versions differ -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 removing a
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
@@ -334,6 +351,8 @@
  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
 getting a
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
@@ -359,6 +378,8 @@
  a: other deleted -> r
  b: versions differ -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 removing a
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
@@ -383,6 +404,8 @@
  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
 getting a
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
@@ -407,6 +430,8 @@
   searching for copies back to rev 1
  b: versions differ -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
 my b at 0b76e65c8289+ other b at 735846fee2d7 ancestor b at 000000000000
@@ -431,6 +456,8 @@
  b: versions differ -> m
  rev: versions differ -> m
  a: prompt recreating -> g
+preserving b for resolve of b
+preserving rev for resolve of rev
 getting a
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
@@ -455,6 +482,8 @@
   searching for copies back to rev 1
  b: versions differ -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 picked tool 'python ../merge' for b (binary False symlink False)
 merging b
 my b at 0b76e65c8289+ other b at e03727d2d66b ancestor b at 000000000000
@@ -483,11 +512,12 @@
   checking for directory renames
  rev: versions differ -> m
  a: remote moved to b -> m
-copying a to b
-picked tool 'python ../merge' for a (binary False symlink False)
-merging a and b
-my a at e300d1c794ec+ other b at 79cc6877a3b7 ancestor a at 924404dff337
+preserving a for resolve of b
+preserving rev for resolve of rev
 removing a
+picked tool 'python ../merge' for b (binary False symlink False)
+merging b
+my b at e300d1c794ec+ other b at 79cc6877a3b7 ancestor a at 924404dff337
 picked tool 'python ../merge' for rev (binary False symlink False)
 merging rev
 my rev at e300d1c794ec+ other rev at 79cc6877a3b7 ancestor rev at 924404dff337
@@ -513,8 +543,10 @@
   checking for directory renames
  b: local moved to a -> m
  rev: versions differ -> m
+preserving b for resolve of b
+preserving rev for resolve of rev
 picked tool 'python ../merge' for b (binary False symlink False)
-merging b and a
+merging b
 my b at ec03c2ca8642+ other a at f4db7e329e71 ancestor a at 924404dff337
 picked tool 'python ../merge' for rev (binary False symlink False)
 merging rev
@@ -544,8 +576,10 @@
  b: local moved to a -> m
  rev: versions differ -> m
  c: remote created -> g
+preserving b for resolve of b
+preserving rev for resolve of rev
 picked tool 'python ../merge' for b (binary False symlink False)
-merging b and a
+merging b
 my b at ecf3cb2a4219+ other a at 2b958612230f ancestor a at 924404dff337
  premerge successful
 getting c
diff -r 9c426da6b03b -r 32649adf4620 tests/test-up-local-change.out
--- a/tests/test-up-local-change.out	Fri Apr 04 16:39:44 2008 +0200
+++ b/tests/test-up-local-change.out	Sun Apr 06 16:46:05 2008 -0500
@@ -23,6 +23,7 @@
    b
  a: versions differ -> m
  b: remote created -> g
+preserving a for resolve of a
 picked tool 'true' for a (binary False symlink False)
 merging a
 my a at 33aaa84a386b+ other a at 802f095af299 ancestor a at 33aaa84a386b
@@ -60,6 +61,7 @@
    b
  a: versions differ -> m
  b: remote created -> g
+preserving a for resolve of a
 picked tool 'true' for a (binary False symlink False)
 merging a
 my a at 33aaa84a386b+ other a at 802f095af299 ancestor a at 33aaa84a386b
@@ -113,6 +115,8 @@
   searching for copies back to rev 1
  a: versions differ -> m
  b: versions differ -> m
+preserving a for resolve of a
+preserving b for resolve of b
 picked tool 'true' for a (binary False symlink False)
 merging a
 my a at 802f095af299+ other a at 030602aee63d ancestor a at 33aaa84a386b


More information about the Mercurial-devel mailing list