changeset 3323:b7a46cbf3f59

merge with upstream
author Thomas Arendsen Hein <thomas@intevation.de>
date Tue, 10 Oct 2006 09:30:05 +0200
parents a1aad25ccc3e (current diff) b16456909a0a (diff)
children 34f08b8883cf
files mercurial/localrepo.py tests/test-flags.out
diffstat 19 files changed, 272 insertions(+), 381 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/context.py	Tue Oct 10 00:02:30 2006 +0200
+++ b/mercurial/context.py	Tue Oct 10 09:30:05 2006 +0200
@@ -8,7 +8,7 @@
 from node import *
 from i18n import gettext as _
 from demandload import demandload
-demandload(globals(), "ancestor bdiff repo revlog util")
+demandload(globals(), "ancestor bdiff repo revlog util os")
 
 class changectx(object):
     """A changecontext object makes access to data related to a particular
@@ -191,6 +191,9 @@
     def data(self): return self._filelog.read(self._filenode)
     def renamed(self): return self._filelog.renamed(self._filenode)
     def path(self): return self._path
+    def size(self): return self._filelog.size(self._filerev)
+
+    def cmp(self, text): return self._filelog.cmp(self._filenode, text)
 
     def parents(self):
         p = self._path
@@ -327,7 +330,7 @@
         self._node = None
 
     def __str__(self):
-        return "."
+        return str(self._parents[0]) + "+"
 
     def __nonzero__(self):
         return True
@@ -414,7 +417,9 @@
             self._changectx = workingctx(repo)
             return self._changectx
         elif name == '_repopath':
-            self._repopath = self._repo.dirstate.copied(p) or self._path
+            self._repopath = (self._repo.dirstate.copied(self._path)
+                              or self._path)
+            return self._repopath
         elif name == '_filelog':
             self._filelog = self._repo.file(self._repopath)
             return self._filelog
@@ -425,7 +430,7 @@
         return True
 
     def __str__(self):
-        return "%s@." % self.path()
+        return "%s@%s" % (self.path(), self._changectx)
 
     def filectx(self, fileid):
         '''opens an arbitrary revision of the file without
@@ -449,7 +454,7 @@
         '''return parent filectxs, following copies if necessary'''
         p = self._path
         rp = self._repopath
-        pcl = self._workingctx._parents
+        pcl = self._changectx._parents
         fl = self._filelog
         pl = [ (rp, pcl[0]._manifest.get(rp, nullid), fl) ]
         if len(pcl) > 1:
@@ -463,3 +468,6 @@
     def children(self):
         return []
 
+    def size(self): return os.stat(self._repo.wjoin(self._path)).st_size
+
+    def cmp(self, text): return self._repo.wread(self._path) == text
--- a/mercurial/hgweb/hgweb_mod.py	Tue Oct 10 00:02:30 2006 +0200
+++ b/mercurial/hgweb/hgweb_mod.py	Tue Oct 10 09:30:05 2006 +0200
@@ -59,12 +59,6 @@
             if i in allowed or self.repo.ui.configbool("web", "allow" + i):
                 yield {"type" : i, "extension" : spec[2], "node" : nodeid}
 
-    def listfiles(self, files, mf):
-        for f in files[:self.maxfiles]:
-            yield self.t("filenodelink", node=hex(mf[f]), file=f)
-        if len(files) > self.maxfiles:
-            yield self.t("fileellipses")
-
     def listfilediffs(self, files, changeset):
         for f in files[:self.maxfiles]:
             yield self.t("filedifflink", node=hex(changeset), file=f)
@@ -436,9 +430,9 @@
                     continue
 
                 yield {"file": full,
-                       "filenode": hex(fnode),
                        "parity": self.stripes(parity),
                        "basename": f,
+                       "size": ctx.filectx(full).size(),
                        "permissions": mf.execf(full)}
                 parity += 1
 
--- a/mercurial/localrepo.py	Tue Oct 10 00:02:30 2006 +0200
+++ b/mercurial/localrepo.py	Tue Oct 10 09:30:05 2006 +0200
@@ -461,20 +461,18 @@
                             self.wreload,
                             desc=_('working directory of %s') % self.origroot)
 
-    def checkfilemerge(self, filename, text, filelog, manifest1, manifest2):
+    def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist):
         """
-        Determine whether a new filenode is needed and what parent
-        and rename information is needed for a file commit.
+        commit an individual file as part of a larger transaction
+        """
 
-        Returns (old entry, file parent 1, file parent 2, metadata)
-
-        If old entry is not None, a commit is not needed.
-        """
-        fp1 = manifest1.get(filename, nullid)
-        fp2 = manifest2.get(filename, nullid)
+        t = self.wread(fn)
+        fl = self.file(fn)
+        fp1 = manifest1.get(fn, nullid)
+        fp2 = manifest2.get(fn, nullid)
 
         meta = {}
-        cp = self.dirstate.copied(filename)
+        cp = self.dirstate.copied(fn)
         if cp:
             meta["copy"] = cp
             if not manifest2: # not a branch merge
@@ -486,21 +484,22 @@
                 meta["copyrev"] = hex(manifest2.get(cp))
                 fp2 = nullid
             self.ui.debug(_(" %s: copy %s:%s\n") %
-                          (filename, cp, meta["copyrev"]))
+                          (fn, cp, meta["copyrev"]))
             fp1 = nullid
         elif fp2 != nullid:
             # is one parent an ancestor of the other?
-            fpa = filelog.ancestor(fp1, fp2)
+            fpa = fl.ancestor(fp1, fp2)
             if fpa == fp1:
                 fp1, fp2 = fp2, nullid
             elif fpa == fp2:
                 fp2 = nullid
 
             # is the file unmodified from the parent? report existing entry
-            if fp2 == nullid and not filelog.cmp(fp1, text):
-                return (fp1, None, None, {})
+            if fp2 == nullid and not fl.cmp(fp1, t):
+                return fp1
 
-        return (None, fp1, fp2, meta)
+        changelist.append(fn)
+        return fl.add(t, meta, transaction, linkrev, fp1, fp2)
 
     def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None):
         orig_parent = self.dirstate.parents()[0] or nullid
@@ -524,19 +523,8 @@
         linkrev = self.changelog.count()
         for f in files:
             try:
-                t = self.wread(f)
+                m1[f] = self.filecommit(f, m1, m2, linkrev, tr, changed)
                 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
-                r = self.file(f)
-
-                entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2)
-                if entry:
-                    m1[f] = entry
-                    continue
-
-                m1[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
-                changed.append(f)
-                if update_dirstate:
-                    self.dirstate.update([f], "n")
             except IOError:
                 try:
                     del m1[f]
@@ -603,31 +591,18 @@
         for f in commit:
             self.ui.note(f + "\n")
             try:
+                new[f] = self.filecommit(f, m1, m2, linkrev, tr, changed)
                 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
-                t = self.wread(f)
             except IOError:
                 self.ui.warn(_("trouble committing %s!\n") % f)
                 raise
 
-            r = self.file(f)
-
-            entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2)
-            if entry:
-                new[f] = entry
-                continue
-
-            new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
-            # remember what we've added so that we can later calculate
-            # the files to pull from a set of changesets
-            changed.append(f)
-
         # update manifest
         m1.update(new)
         for f in remove:
             if f in m1:
                 del m1[f]
-        mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0],
-                               (new, remove))
+        mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0], (new, remove))
 
         # add changeset
         new = new.keys()
--- a/mercurial/merge.py	Tue Oct 10 00:02:30 2006 +0200
+++ b/mercurial/merge.py	Tue Oct 10 09:30:05 2006 +0200
@@ -10,16 +10,12 @@
 from demandload import *
 demandload(globals(), "errno util os tempfile")
 
-def filemerge(repo, fw, fo, fd, my, other, p1, p2, move):
+def filemerge(repo, fw, fo, wctx, mctx):
     """perform a 3-way merge in the working directory
 
     fw = filename in the working directory and first parent
     fo = filename in other parent
-    fd = destination filename
-    my = fileid in first parent
-    other = fileid in second parent
-    p1, p2 = hex changeset ids for merge command
-    move = whether to move or copy the file to the destination
+    wctx, mctx = working and merge changecontexts
 
     TODO:
       if fw is copied in the working directory, we get confused
@@ -34,8 +30,12 @@
         f.close()
         return name
 
-    fcm = repo.filectx(fw, fileid=my)
-    fco = repo.filectx(fo, fileid=other)
+    fcm = wctx.filectx(fw)
+    fco = mctx.filectx(fo)
+
+    if not fco.cmp(fcm.data()): # files identical?
+        return 0
+
     fca = fcm.ancestor(fco)
     if not fca:
         fca = repo.filectx(fw, fileid=-1)
@@ -43,40 +43,38 @@
     b = temp("base", fca)
     c = temp("other", fco)
 
-    repo.ui.note(_("resolving %s\n") % fw)
+    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))
 
     cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
            or "hgmerge")
     r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
                     environ={'HG_FILE': fw,
-                             'HG_MY_NODE': p1,
-                             'HG_OTHER_NODE': p2})
+                             'HG_MY_NODE': str(wctx.parents()[0]),
+                             'HG_OTHER_NODE': str(mctx)})
     if r:
         repo.ui.warn(_("merging %s failed!\n") % fw)
-    else:
-        if fd != fw:
-            repo.ui.debug(_("copying %s to %s\n") % (fw, fd))
-            repo.wwrite(fd, repo.wread(fw))
-            if move:
-                repo.ui.debug(_("removing %s\n") % fw)
-                os.unlink(a)
 
     os.unlink(b)
     os.unlink(c)
     return r
 
-def checkunknown(repo, m2, wctx):
+def checkunknown(wctx, mctx):
     """
     check for collisions between unknown files and files in m2
     """
+    man = mctx.manifest()
     for f in wctx.unknown():
-        if f in m2:
-            if repo.file(f).cmp(m2[f], repo.wread(f)):
+        if f in man:
+            if mctx.filectx(f).cmp(wctx.filectx(f).data()):
                 raise util.Abort(_("'%s' already exists in the working"
                                    " dir and differs from remote") % f)
 
-def forgetremoved(m2, wctx):
+def forgetremoved(wctx, mctx):
     """
     Forget removed files
 
@@ -88,9 +86,9 @@
     """
 
     action = []
-
+    man = mctx.manifest()
     for f in wctx.deleted() + wctx.removed():
-        if f not in m2:
+        if f not in man:
             action.append((f, "f"))
 
     return action
@@ -174,11 +172,22 @@
 
     return copy
 
-def manifestmerge(ui, m1, m2, ma, copy, overwrite, backwards, partial):
+def manifestmerge(repo, p1, p2, pa, overwrite, partial):
     """
     Merge manifest m1 with m2 using ancestor ma and generate merge action list
     """
 
+    repo.ui.note(_("resolving manifests\n"))
+    repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
+    repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
+
+    m1 = p1.manifest()
+    m2 = p2.manifest()
+    ma = pa.manifest()
+    backwards = (pa == p2)
+    action = []
+    copy = {}
+
     def fmerge(f, f2=None, fa=None):
         """merge executable flags"""
         if not f2:
@@ -187,11 +196,12 @@
         a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
         return ((a^b) | (a^c)) ^ a
 
-    action = []
+    def act(msg, m, f, *args):
+        repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
+        action.append((f, m) + args)
 
-    def act(msg, f, m, *args):
-        ui.debug(" %s: %s -> %s\n" % (f, msg, m))
-        action.append((f, m) + args)
+    if not (backwards or overwrite):
+        copy = findcopies(repo, m1, m2, pa.rev())
 
     # Compare manifests
     for f, n in m1.iteritems():
@@ -203,43 +213,42 @@
                 a = ma.get(f, nullid)
                 # are both different from the ancestor?
                 if not overwrite and n != a and m2[f] != a:
-                    act("versions differ", f, "m", fmerge(f), n[:20], m2[f])
+                    act("versions differ", "m", f, f, f, fmerge(f), False)
                 # are we clobbering?
                 # is remote's version newer?
                 # or are we going back in time and clean?
                 elif overwrite or m2[f] != a or (backwards and not n[20:]):
-                    act("remote is newer", f, "g", m2.execf(f), m2[f])
+                    act("remote is newer", "g", f, m2.execf(f))
                 # local is newer, not overwrite, check mode bits
                 elif fmerge(f) != m1.execf(f):
-                    act("update permissions", f, "e", m2.execf(f))
+                    act("update permissions", "e", f, m2.execf(f))
             # contents same, check mode bits
             elif m1.execf(f) != m2.execf(f):
                 if overwrite or fmerge(f) != m1.execf(f):
-                    act("update permissions", f, "e", m2.execf(f))
+                    act("update permissions", "e", f, m2.execf(f))
         elif f in copy:
             f2 = copy[f]
             if f in ma: # case 3,20 A/B/A
-                act("remote moved",
-                    f, "c", f2, f2, m1[f], m2[f2], fmerge(f, f2, f), True)
+                act("remote moved", "m", f, f2, f2, fmerge(f, f2, f), True)
             else:
                 if f2 in m1: # case 2 A,B/B/B
-                    act("local copied",
-                        f, "c", f2, f, m1[f], m2[f2], fmerge(f, f2, f2), False)
+                    act("local copied", "m",
+                        f, f2, f, fmerge(f, f2, f2), False)
                 else: # case 4,21 A/B/B
-                    act("local moved",
-                        f, "c", f2, f, m1[f], m2[f2], fmerge(f, f2, f2), False)
+                    act("local moved", "m",
+                        f, f2, f, fmerge(f, f2, f2), False)
         elif f in ma:
             if n != ma[f] and not overwrite:
-                if ui.prompt(
+                if repo.ui.prompt(
                     (_(" local changed %s which remote deleted\n") % f) +
                     _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
-                    act("prompt delete", f, "r")
+                    act("prompt delete", "r", f)
             else:
-                act("other deleted", f, "r")
+                act("other deleted", "r", f)
         else:
             # file is created on branch or in working directory
             if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
-                act("remote deleted", f, "r")
+                act("remote deleted", "r", f)
 
     for f, n in m2.iteritems():
         if partial and not partial(f):
@@ -251,22 +260,21 @@
             if f2 not in m2: # already seen
                 continue
             # rename case 1, A/A,B/A
-            act("remote copied",
-                f2, "c", f, f, m1[f2], m2[f], fmerge(f2, f, f2), False)
+            act("remote copied", "m", f2, f, f, fmerge(f2, f, f2), False)
         elif f in ma:
             if overwrite or backwards:
-                act("recreating", f, "g", m2.execf(f), n)
+                act("recreating", "g", f, m2.execf(f))
             elif n != ma[f]:
-                if ui.prompt(
+                if repo.ui.prompt(
                     (_("remote changed %s which local deleted\n") % f) +
                     _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
-                    act("prompt recreating", f, "g", m2.execf(f), n)
+                    act("prompt recreating", "g", f, m2.execf(f))
         else:
-            act("remote created", f, "g", m2.execf(f), n)
+            act("remote created", "g", f, m2.execf(f))
 
     return action
 
-def applyupdates(repo, action, xp1, xp2):
+def applyupdates(repo, action, wctx, mctx):
     updated, merged, removed, unresolved = 0, 0, 0, 0
     action.sort()
     for a in action:
@@ -283,34 +291,34 @@
                     repo.ui.warn(_("update failed to remove %s: %s!\n") %
                                  (f, inst.strerror))
             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):
+        elif m == "m": # merge
+            f2, fd, flag, move = a[2:]
+            if filemerge(repo, f, f2, wctx, mctx):
                 unresolved += 1
+            else:
+                if f != fd:
+                    repo.ui.debug(_("copying %s to %s\n") % (f, fd))
+                    repo.wwrite(fd, repo.wread(f))
+                    if move:
+                        repo.ui.debug(_("removing %s\n") % f)
+                        os.unlink(repo.wjoin(f))
+
             util.set_exec(repo.wjoin(fd), flag)
             merged += 1
-        elif m == "m": # merge
-            flag, my, other = a[2:]
-            repo.ui.status(_("merging %s\n") % f)
-            if filemerge(repo, f, f, f, my, other, xp1, xp2, False):
-                unresolved += 1
-            util.set_exec(repo.wjoin(f), flag)
-            merged += 1
         elif m == "g": # get
-            flag, node = a[2:]
+            flag = a[2]
             repo.ui.note(_("getting %s\n") % f)
-            t = repo.file(f).read(node)
+            t = mctx.filectx(f).data()
             repo.wwrite(f, t)
             util.set_exec(repo.wjoin(f), flag)
             updated += 1
         elif m == "e": # exec
-            flag = a[2:]
+            flag = a[2]
             util.set_exec(repo.wjoin(f), flag)
 
     return updated, merged, removed, unresolved
 
-def recordupdates(repo, action, branchmerge):
+def recordupdates(repo, action, branchmerge, mctx):
     for a in action:
         f, m = a[:2]
         if m == "r": # remove
@@ -326,22 +334,7 @@
             else:
                 repo.dirstate.update([f], 'n')
         elif m == "m": # merge
-            flag, my, other = a[2:]
-            if branchmerge:
-                # We've done a branch merge, mark this file as merged
-                # so that we properly record the merger later
-                repo.dirstate.update([f], 'm')
-            else:
-                # We've update-merged a locally modified file, so
-                # we set the dirstate to emulate a normal checkout
-                # of that file some time in the past. Thus our
-                # merge will appear as a normal local file
-                # modification.
-                fl = repo.file(f)
-                f_len = fl.size(fl.rev(other))
-                repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1)
-        elif m == "c": # copy
-            f2, fd, my, other, flag, move = a[2:]
+            f2, fd, flag, move = a[2:]
             if branchmerge:
                 # We've done a branch merge, mark this file as merged
                 # so that we properly record the merger later
@@ -352,92 +345,59 @@
                 # of that file some time in the past. Thus our
                 # merge will appear as a normal local file
                 # modification.
-                fl = repo.file(f)
-                f_len = fl.size(fl.rev(other))
+                f_len = mctx.filectx(f).size()
                 repo.dirstate.update([fd], 'n', st_size=f_len, st_mtime=-1)
-            if move:
-                repo.dirstate.update([f], 'r')
-            if f != fd:
-                repo.dirstate.copy(f, fd)
-            else:
-                repo.dirstate.copy(f2, fd)
+            if f != f2: # copy/rename
+                if move:
+                    repo.dirstate.update([f], 'r')
+                if f != fd:
+                    repo.dirstate.copy(f, fd)
+                else:
+                    repo.dirstate.copy(f2, fd)
 
 def update(repo, node, branchmerge=False, force=False, partial=None,
            wlock=None, show_stats=True, remind=True):
 
-    overwrite = force and not branchmerge
-    forcemerge = force and branchmerge
-
     if not wlock:
         wlock = repo.wlock()
 
-    ### check phase
-
+    overwrite = force and not branchmerge
+    forcemerge = force and branchmerge
     wc = repo.workingctx()
     pl = wc.parents()
+    p1, p2 = pl[0], repo.changectx(node)
+    pa = p1.ancestor(p2)
+    fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
+
+    ### check phase
     if not overwrite and len(pl) > 1:
         raise util.Abort(_("outstanding uncommitted merges"))
-
-    p1, p2 = pl[0], repo.changectx(node)
-    pa = p1.ancestor(p2)
-
-    # are we going backwards?
-    backwards = (pa == p2)
-
-    # is there a linear path from p1 to p2?
-    if pa == p1 or pa == p2:
+    if pa == p1 or pa == p2: # is there a linear path from p1 to p2?
         if branchmerge:
             raise util.Abort(_("there is nothing to merge, just use "
                                "'hg update' or look at 'hg heads'"))
     elif not (overwrite or branchmerge):
         raise util.Abort(_("update spans branches, use 'hg merge' "
                            "or 'hg update -C' to lose changes"))
-
     if branchmerge and not forcemerge:
         if wc.modified() or wc.added() or wc.removed():
             raise util.Abort(_("outstanding uncommitted changes"))
 
-    m1 = wc.manifest()
-    m2 = p2.manifest()
-    ma = pa.manifest()
-
-    # resolve the manifest to determine which files
-    # we care about merging
-    repo.ui.note(_("resolving manifests\n"))
-    repo.ui.debug(_(" overwrite %s branchmerge %s partial %s\n") %
-                  (overwrite, branchmerge, bool(partial)))
-    repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa))
-
+    ### calculate phase
     action = []
-    copy = {}
-
     if not force:
-        checkunknown(repo, m2, wc)
+        checkunknown(wc, p2)
     if not branchmerge:
-        action += forgetremoved(m2, wc)
-    if not (backwards or overwrite):
-        copy = findcopies(repo, m1, m2, pa.rev())
-
-    action += manifestmerge(repo.ui, m1, m2, ma, copy,
-                            overwrite, backwards, partial)
+        action += forgetremoved(wc, p2)
+    action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
 
     ### apply phase
-
-    if not branchmerge:
-        # we don't need to do any magic, just jump to the new rev
-        p1, p2 = p2, repo.changectx(nullid)
-
-    xp1, xp2 = str(p1), str(p2)
-    if not p2: xp2 = ''
+    if not branchmerge: # just jump to the new rev
+        fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
+    if not partial:
+        repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
 
-    repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
-
-    updated, merged, removed, unresolved = applyupdates(repo, action, xp1, xp2)
-
-    # update dirstate
-    if not partial:
-        recordupdates(repo, action, branchmerge)
-        repo.dirstate.setparents(p1.node(), p2.node())
+    updated, merged, removed, unresolved = applyupdates(repo, action, wc, p2)
 
     if show_stats:
         stats = ((updated, _("updated")),
@@ -447,6 +407,10 @@
         note = ", ".join([_("%d files %s") % s for s in stats])
         repo.ui.status("%s\n" % note)
     if not partial:
+        recordupdates(repo, action, branchmerge, p2)
+        repo.dirstate.setparents(fp1, fp2)
+        repo.hook('update', parent1=xp1, parent2=xp2, error=unresolved)
+
         if branchmerge:
             if unresolved:
                 repo.ui.status(_("There are unresolved merges,"
@@ -460,6 +424,5 @@
             repo.ui.status(_("There are unresolved merges with"
                              " locally modified files.\n"))
 
-    repo.hook('update', parent1=xp1, parent2=xp2, error=unresolved)
     return unresolved
 
--- a/templates/gitweb/manifest.tmpl	Tue Oct 10 00:02:30 2006 +0200
+++ b/templates/gitweb/manifest.tmpl	Tue Oct 10 09:30:05 2006 +0200
@@ -23,6 +23,7 @@
 <table cellspacing="0">
 <tr class="light">
 <td style="font-family:monospace">drwxr-xr-x</td>
+<td style="font-family:monospace"></td>
 <td><a href="{url}file/#node|short##up|urlescape#{getentries}">[up]</a></td>
 <td class="link">&nbsp;</td>
 </tr>
--- a/templates/gitweb/map	Tue Oct 10 00:02:30 2006 +0200
+++ b/templates/gitweb/map	Tue Oct 10 09:30:05 2006 +0200
@@ -14,8 +14,8 @@
 searchentry = changelogentry.tmpl
 changeset = changeset.tmpl
 manifest = manifest.tmpl
-manifestdirentry = '<tr class="parity#parity#"><td style="font-family:monospace">drwxr-xr-x</td><td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a></td><td class="link"><a href="#url#file/#node|short##path|urlescape#{getentries}">manifest</a></td></tr>'
-manifestfileentry = '<tr class="parity#parity#"><td style="font-family:monospace">#permissions|permissions#</td><td class="list"><a class="list" href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a></td><td class="link"><a href="#url#file/#node|short#/#file|urlescape#{getentries}">file</a> | <a href="#url#log/#node|short#/#file|urlescape#{getentries}">revisions</a> | <a href="#url#annotate/#node|short#/#file|urlescape#{getentries}">annotate</a></td></tr>'
+manifestdirentry = '<tr class="parity#parity#"><td style="font-family:monospace">drwxr-xr-x</td><td style="font-family:monospace"></td><td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a></td><td class="link"><a href="#url#file/#node|short##path|urlescape#{getentries}">manifest</a></td></tr>'
+manifestfileentry = '<tr class="parity#parity#"><td style="font-family:monospace">#permissions|permissions#</td><td style="font-family:monospace" align=right>#size#</td><td class="list"><a class="list" href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a></td><td class="link"><a href="#url#file/#node|short#/#file|urlescape#{getentries}">file</a> | <a href="#url#log/#node|short#/#file|urlescape#{getentries}">revisions</a> | <a href="#url#annotate/#node|short#/#file|urlescape#{getentries}">annotate</a></td></tr>'
 filerevision = filerevision.tmpl
 fileannotate = fileannotate.tmpl
 filelog = filelog.tmpl
--- a/templates/manifest.tmpl	Tue Oct 10 00:02:30 2006 +0200
+++ b/templates/manifest.tmpl	Tue Oct 10 09:30:05 2006 +0200
@@ -16,7 +16,9 @@
 <table cellpadding="0" cellspacing="0">
 <tr class="parity1">
   <td><tt>drwxr-xr-x</tt>&nbsp;
+  <td>&nbsp;
   <td><a href="#url#file/#node|short##up|urlescape#{getentries}">[up]</a>
+</tr>
 #dentries%manifestdirentry#
 #fentries%manifestfileentry#
 </table>
--- a/templates/map	Tue Oct 10 00:02:30 2006 +0200
+++ b/templates/map	Tue Oct 10 09:30:05 2006 +0200
@@ -14,8 +14,8 @@
 searchentry = changelogentry.tmpl
 changeset = changeset.tmpl
 manifest = manifest.tmpl
-manifestdirentry = '<tr class="parity#parity#"><td><tt>drwxr-xr-x</tt>&nbsp;<td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a>'
-manifestfileentry = '<tr class="parity#parity#"><td><tt>#permissions|permissions#</tt>&nbsp;<td><a href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a>'
+manifestdirentry = '<tr class="parity#parity#"><td><tt>drwxr-xr-x</tt>&nbsp;<td>&nbsp;<td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a>'
+manifestfileentry = '<tr class="parity#parity#"><td><tt>#permissions|permissions#</tt>&nbsp;<td align=right><tt>#size#</tt>&nbsp;<td><a href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a>'
 filerevision = filerevision.tmpl
 fileannotate = fileannotate.tmpl
 filediff = filediff.tmpl
--- a/tests/run-tests.py	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/run-tests.py	Tue Oct 10 09:30:05 2006 +0200
@@ -32,6 +32,11 @@
     help="print a test coverage report inc. standard libraries")
 parser.add_option("-C", "--annotate", action="store_true",
     help="output files annotated with coverage")
+parser.add_option("-r", "--retest", action="store_true",
+    help="retest failed tests")
+parser.add_option("-f", "--first", action="store_true",
+    help="exit on the first test failure")
+
 parser.set_defaults(timeout=180)
 (options, args) = parser.parse_args()
 verbose = options.verbose
@@ -360,11 +365,16 @@
             if (test.startswith("test-") and '~' not in test and
                 ('.' not in test or test.endswith('.py') or
                  test.endswith('.bat'))):
+                if options.retest and not os.path.exists(test + ".err"):
+                    skipped += 1
+                    continue
                 ret = run_one(test)
                 if ret is None:
                     skipped += 1
                 elif not ret:
                     failed += 1
+                    if options.first:
+                        break
                 tests += 1
 
         print "\n# Ran %d tests, %d skipped, %d failed." % (tests, skipped,
--- a/tests/test-commit.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-commit.out	Tue Oct 10 09:30:05 2006 +0200
@@ -13,4 +13,5 @@
 abort: date exceeds 32 bits: 111111111111
 transaction abort!
 rollback completed
+trouble committing bar!
 abort: No such file or directory: .../test/bar
--- a/tests/test-filebranch.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-filebranch.out	Tue Oct 10 09:30:05 2006 +0200
@@ -19,7 +19,6 @@
 resolving manifests
 getting bar
 merging foo
-resolving foo
 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 we shouldn't have anything but foo in merge state here
--- a/tests/test-flags.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-flags.out	Tue Oct 10 09:30:05 2006 +0200
@@ -45,7 +45,6 @@
 
 resolving manifests
 merging a
-resolving a
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 pulling from ../test2
--- a/tests/test-merge-revert.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-merge-revert.out	Tue Oct 10 09:30:05 2006 +0200
@@ -11,7 +11,6 @@
 ? file1.orig
 016807e6fdaf tip
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-merging file1
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 ? file1.orig
 016807e6fdaf tip
--- a/tests/test-merge1.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-merge1.out	Tue Oct 10 09:30:05 2006 +0200
@@ -1,7 +1,5 @@
 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
 %% no merges expected
-merging for b
-merging b
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -19,8 +17,6 @@
 %% merge fails
 abort: outstanding uncommitted changes
 %% merge expected!
-merging for b
-merging b
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
--- a/tests/test-merge7.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-merge7.out	Tue Oct 10 09:30:05 2006 +0200
@@ -22,12 +22,11 @@
 (run 'hg heads' to see heads, 'hg merge' to merge)
 merge: warning: conflicts during merge
 resolving manifests
- overwrite None branchmerge True partial False
- ancestor 451c744aabcc local a070d41e8360 remote faaea63e63a9
+ overwrite None partial False
+ ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360
  test.txt: versions differ -> m
 merging test.txt
-resolving test.txt
-my test.txt@451c744aabcc other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
+my test.txt@451c744aabcc+ other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
 merging test.txt failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
 There are unresolved merges, you can redo the full merge using:
--- a/tests/test-rename-merge1.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-rename-merge1.out	Tue Oct 10 09:30:05 2006 +0200
@@ -2,13 +2,12 @@
 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
 merge
 resolving manifests
- overwrite None branchmerge True partial False
- ancestor f26ec4fc3fa3 local 8e765a822af2 remote af1939970a1c
- a: remote moved -> c
+ overwrite None partial False
+ ancestor af1939970a1c local f26ec4fc3fa3+ remote 8e765a822af2
+ a: remote moved -> m
  b2: remote created -> g
-merging a and b to b
-resolving a
-my a@f26ec4fc3fa3 other b@8e765a822af2 ancestor a@af1939970a1c
+merging a and b
+my a@f26ec4fc3fa3+ other b@8e765a822af2 ancestor a@af1939970a1c
 copying a to b
 removing a
 getting b2
--- a/tests/test-rename-merge2.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-rename-merge2.out	Tue Oct 10 09:30:05 2006 +0200
@@ -2,17 +2,15 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local e300d1c794ec+ remote 735846fee2d7
  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
+ a: remote copied -> m
+merging a and b
+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
+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)
 --------------
@@ -25,18 +23,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ac809aeed39a+ remote f4db7e329e71
  a: remote is newer -> g
- b: local copied -> c
+ b: local copied -> m
  rev: versions differ -> m
 getting a
-merging b and a to b
-resolving b
-my b@ac809aeed39a other a@f4db7e329e71 ancestor a@924404dff337
+merging b and a
+my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
 merging rev
-resolving rev
-my rev@ac809aeed39a other rev@f4db7e329e71 ancestor rev@924404dff337
+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)
 --------------
@@ -49,18 +45,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local e300d1c794ec+ remote e03727d2d66b
+ a: remote moved -> m
  rev: versions differ -> m
-merging a and b to b
-resolving a
-my a@e300d1c794ec other b@e03727d2d66b ancestor a@924404dff337
+merging a and b
+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
+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)
 --------------
@@ -72,16 +66,14 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ecf3cb2a4219+ remote f4db7e329e71
+ b: local moved -> m
  rev: versions differ -> m
-merging b and a to b
-resolving b
-my b@ecf3cb2a4219 other a@f4db7e329e71 ancestor a@924404dff337
+merging b and a
+my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
 merging rev
-resolving rev
-my rev@ecf3cb2a4219 other rev@f4db7e329e71 ancestor rev@924404dff337
+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)
 --------------
@@ -93,39 +85,31 @@
 test L:       R:nc a b W:       - 5  get b
 --------------
 resolving manifests
- overwrite None branchmerge True partial False
- ancestor 94b33a1b7f2d local 735846fee2d7 remote 924404dff337
+ overwrite None partial False
+ ancestor 924404dff337 local 94b33a1b7f2d+ remote 735846fee2d7
  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
+ a: remote copied -> m
 copying a to b
 merging rev
-resolving rev
-my rev@94b33a1b7f2d other rev@735846fee2d7 ancestor rev@924404dff337
+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
+C 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
+ overwrite None partial False
+ ancestor 924404dff337 local ac809aeed39a+ remote 97c705ade336
+ b: local copied -> m
  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
+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)
 --------------
@@ -138,18 +122,14 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local 94b33a1b7f2d+ remote e03727d2d66b
+ a: remote moved -> m
  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
+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)
 --------------
@@ -161,16 +141,12 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ecf3cb2a4219+ remote 97c705ade336
+ b: local moved -> m
  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
+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)
 --------------
@@ -182,16 +158,14 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ec03c2ca8642+ remote 79cc6877a3b7
  b: versions differ -> m
  rev: versions differ -> m
 merging b
-resolving b
-my b@ec03c2ca8642 other b@79cc6877a3b7 ancestor a@924404dff337
+my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
 merging rev
-resolving rev
-my rev@ec03c2ca8642 other rev@79cc6877a3b7 ancestor rev@924404dff337
+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)
 --------------
@@ -202,14 +176,13 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ecf3cb2a4219+ remote e6abcc1a30c2
  rev: versions differ -> m
  c: remote created -> g
 getting c
 merging rev
-resolving rev
-my rev@ecf3cb2a4219 other rev@e6abcc1a30c2 ancestor rev@924404dff337
+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)
 --------------
@@ -221,16 +194,14 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ac809aeed39a+ remote af30c7647fc7
  b: versions differ -> m
  rev: versions differ -> m
 merging b
-resolving b
-my b@ac809aeed39a other b@af30c7647fc7 ancestor b@000000000000
+my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
 merging rev
-resolving rev
-my rev@ac809aeed39a other rev@af30c7647fc7 ancestor rev@924404dff337
+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)
 --------------
@@ -242,18 +213,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
  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
+my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
 merging rev
-resolving rev
-my rev@59318016310c other rev@e03727d2d66b ancestor rev@924404dff337
+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)
 --------------
@@ -264,18 +233,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
  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
+my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
 merging rev
-resolving rev
-my rev@ac809aeed39a other rev@8dbce441892a ancestor rev@924404dff337
+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)
 --------------
@@ -287,18 +254,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
  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
+my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
 merging rev
-resolving rev
-my rev@59318016310c other rev@e03727d2d66b ancestor rev@924404dff337
+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)
 --------------
@@ -309,18 +274,16 @@
 test L:nc a b R:up a b W:       - 16 get a, merge b no ancestor
 --------------
 resolving manifests
- overwrite None branchmerge True partial False
- ancestor ac809aeed39a local 8dbce441892a remote 924404dff337
+ overwrite None partial False
+ ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
  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
+my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
 merging rev
-resolving rev
-my rev@ac809aeed39a other rev@8dbce441892a ancestor rev@924404dff337
+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)
 --------------
@@ -332,16 +295,14 @@
 test L:up a b R:nc a b W:       - 17 keep a, merge b no ancestor
 --------------
 resolving manifests
- overwrite None branchmerge True partial False
- ancestor 0b76e65c8289 local 735846fee2d7 remote 924404dff337
+ overwrite None partial False
+ ancestor 924404dff337 local 0b76e65c8289+ remote 735846fee2d7
  b: versions differ -> m
  rev: versions differ -> m
 merging b
-resolving b
-my b@0b76e65c8289 other b@735846fee2d7 ancestor b@000000000000
+my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
 merging rev
-resolving rev
-my rev@0b76e65c8289 other rev@735846fee2d7 ancestor rev@924404dff337
+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)
 --------------
@@ -353,18 +314,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ecf3cb2a4219+ remote 8dbce441892a
  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
+my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
 merging rev
-resolving rev
-my rev@ecf3cb2a4219 other rev@8dbce441892a ancestor rev@924404dff337
+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)
 --------------
@@ -376,16 +335,14 @@
 test L:up a b R:nm a b W:       - 19 merge b no ancestor, prompt remove a
 --------------
 resolving manifests
- overwrite None branchmerge True partial False
- ancestor 0b76e65c8289 local e03727d2d66b remote 924404dff337
+ overwrite None partial False
+ ancestor 924404dff337 local 0b76e65c8289+ remote e03727d2d66b
  b: versions differ -> m
  rev: versions differ -> m
 merging b
-resolving b
-my b@0b76e65c8289 other b@e03727d2d66b ancestor b@000000000000
+my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
 merging rev
-resolving rev
-my rev@0b76e65c8289 other rev@e03727d2d66b ancestor rev@924404dff337
+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)
 --------------
@@ -397,18 +354,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local e300d1c794ec+ remote 79cc6877a3b7
+ a: remote moved -> m
  rev: versions differ -> m
-merging a and b to b
-resolving a
-my a@e300d1c794ec other b@79cc6877a3b7 ancestor a@924404dff337
+merging a and b
+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
+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)
 --------------
@@ -420,16 +375,14 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ec03c2ca8642+ remote f4db7e329e71
+ b: local moved -> m
  rev: versions differ -> m
-merging b and a to b
-resolving b
-my b@ec03c2ca8642 other a@f4db7e329e71 ancestor a@924404dff337
+merging b and a
+my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
 merging rev
-resolving rev
-my rev@ec03c2ca8642 other rev@f4db7e329e71 ancestor rev@924404dff337
+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)
 --------------
@@ -441,18 +394,16 @@
 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
+ overwrite None partial False
+ ancestor 924404dff337 local ecf3cb2a4219+ remote 2b958612230f
+ b: local moved -> m
  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
+merging b and a
+my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
 getting c
 merging rev
-resolving rev
-my rev@ecf3cb2a4219 other rev@2b958612230f ancestor rev@924404dff337
+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)
 --------------
--- a/tests/test-up-local-change.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-up-local-change.out	Tue Oct 10 09:30:05 2006 +0200
@@ -15,13 +15,12 @@
 summary:     1
 
 resolving manifests
- overwrite False branchmerge False partial False
- ancestor 33aaa84a386b local 802f095af299 remote 33aaa84a386b
+ overwrite False partial False
+ ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
  a: versions differ -> m
  b: remote created -> g
 merging a
-resolving a
-my a@33aaa84a386b other a@802f095af299 ancestor a@33aaa84a386b
+my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
 getting b
 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
 changeset:   1:802f095af299
@@ -31,8 +30,8 @@
 summary:     2
 
 resolving manifests
- overwrite False branchmerge False partial False
- ancestor 802f095af299 local 33aaa84a386b remote 33aaa84a386b
+ overwrite False partial False
+ ancestor 33aaa84a386b local 802f095af299+ remote 33aaa84a386b
  b: remote deleted -> r
 removing b
 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -49,13 +48,12 @@
 summary:     1
 
 resolving manifests
- overwrite False branchmerge False partial False
- ancestor 33aaa84a386b local 802f095af299 remote 33aaa84a386b
+ overwrite False partial False
+ ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
  a: versions differ -> m
  b: remote created -> g
 merging a
-resolving a
-my a@33aaa84a386b other a@802f095af299 ancestor a@33aaa84a386b
+my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
 getting b
 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
 changeset:   1:802f095af299
@@ -100,16 +98,14 @@
 abort: outstanding uncommitted changes
 failed
 resolving manifests
- overwrite False branchmerge True partial False
- ancestor 802f095af299 local 030602aee63d remote 33aaa84a386b
+ overwrite False partial False
+ ancestor 33aaa84a386b local 802f095af299+ remote 030602aee63d
  a: versions differ -> m
  b: versions differ -> m
 merging a
-resolving a
-my a@802f095af299 other a@030602aee63d ancestor a@33aaa84a386b
+my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
 merging b
-resolving b
-my b@802f095af299 other b@030602aee63d ancestor b@000000000000
+my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 changeset:   1:802f095af299
@@ -137,5 +133,4 @@
 adding manifests
 adding file changes
 added 1 changesets with 1 changes to 1 files
-merging a
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
--- a/tests/test-update-reverse.out	Tue Oct 10 00:02:30 2006 +0200
+++ b/tests/test-update-reverse.out	Tue Oct 10 09:30:05 2006 +0200
@@ -40,8 +40,8 @@
 side1
 side2
 resolving manifests
- overwrite True branchmerge False partial False
- ancestor ded32b0db104 local 221226fb2bd8 remote 537353581d3d
+ overwrite True partial False
+ ancestor 537353581d3d local ded32b0db104+ remote 221226fb2bd8
  side2: remote deleted -> r
  side1: remote deleted -> r
  main: remote created -> g