changeset 6006:90af9db93d2b mercurial-4.7

test-compat: merge mercurial-4.8 into mercurial-4.7
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 12 Aug 2021 22:01:14 +0200
parents 2da0e17ca1c0 (diff) 5472f45017ce (current diff)
children ee54e02d3ea0 55e9987b8384
files tests/test-discovery-obshashrange.t tests/test-evolve-phase-divergence.t tests/test-fold.t tests/test-topic-dest.t tests/test-topic.t
diffstat 23 files changed, 458 insertions(+), 199 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Fri May 28 00:23:12 2021 +0800
+++ b/.hgtags	Thu Aug 12 22:01:14 2021 +0200
@@ -94,3 +94,4 @@
 eadc1d09f2f567fdae7280aefc8cf4cdc4d78cbc 10.2.0.post1
 c0ed8e57463875414d1c06f0428d550c4480d289 10.3.0
 93dc3cb6884259f91d739a1cfe993a01820c729c 10.3.1
+30c8d8e6a7f4056c46a868b47ee949d3bdb48c4c 10.3.2
--- a/CHANGELOG	Fri May 28 00:23:12 2021 +0800
+++ b/CHANGELOG	Thu Aug 12 22:01:14 2021 +0200
@@ -1,11 +1,27 @@
 Changelog
 =========
 
-10.3.2 - in progress
+10.3.3 - in progress
+--------------------
+
+  * fold: make sure to save commit messages in last-message.txt, also affects
+    metaedit (issue6549)
+
+topic (0.22.3)
+
+  * topic: correctly update from public commits with a (now hidden) topic
+    when hg update is called without any revision (issue6553)
+
+10.3.2 - 2021-05-28
 --------------------
 
   * next: remove duplicated targets when updating from an unstable changeset
   * evolve: use "served" repo filter to guess what the server will publish
+  * touch/fold/metaedit/rewind: no longer lose changes from merge commits
+    (issue6416). As a consequence (for technical reasons), when run with
+    Mercurial 5.5 and earlier, these commands now require there to be no
+    unresolved conflicts.
+
 
 topic (0.22.2)
 
--- a/README.rst	Fri May 28 00:23:12 2021 +0800
+++ b/README.rst	Thu Aug 12 22:01:14 2021 +0200
@@ -117,9 +117,9 @@
 How to Contribute
 =================
 
-Discussion happens on the #hg-evolve IRC on freenode_.
+Discussion happens on the #hg-evolve IRC on libera_.
 
-.. _freenode: https://freenode.net/
+.. _libera: https://libera.chat/
 
 Bugs are to be reported on the Mercurial's bug tracker (component:
 `evolution`_).
--- a/debian/changelog	Fri May 28 00:23:12 2021 +0800
+++ b/debian/changelog	Thu Aug 12 22:01:14 2021 +0200
@@ -1,3 +1,9 @@
+mercurial-evolve (10.3.2-1) unstable; urgency=medium
+
+  * new upstream release
+
+ -- Anton Shestakov <av6@dwimlabs.net>  Fri, 28 May 2021 16:16:07 +0800
+
 mercurial-evolve (10.3.1-1) unstable; urgency=medium
 
   * new upstream release
--- a/hgext3rd/evolve/__init__.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/evolve/__init__.py	Thu Aug 12 22:01:14 2021 +0200
@@ -1043,16 +1043,23 @@
                      _(b"make commit obsolete this revision (DEPRECATED)")))
 
 @eh.wrapfunction(obsolete, '_checkinvalidmarkers')
-def _checkinvalidmarkers(orig, markers):
+def _checkinvalidmarkers(orig, *args):
     """search for marker with invalid data and raise error if needed
 
     Exist as a separated function to allow the evolve extension for a more
     subtle handling.
     """
+    if len(args) == 2:
+        repo_nullid = args[0].nullid
+        markers = args[1]
+    else:
+        # hg <= 5.8 (d55b71393907)
+        repo_nullid = nullid
+        markers = args[0]
     if r'debugobsconvert' in sys.argv:
         return
     for mark in markers:
-        if nullid in mark[1]:
+        if repo_nullid in mark[1]:
             msg = _(b'bad obsolescence marker detected: invalid successors nullid')
             hint = _(b'You should run `hg debugobsconvert`')
             raise error.Abort(msg, hint=hint)
--- a/hgext3rd/evolve/cmdrewrite.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/evolve/cmdrewrite.py	Thu Aug 12 22:01:14 2021 +0200
@@ -340,52 +340,6 @@
     newid = repo.commitctx(new)
     return newid
 
-# TODO: call core's version once we've dropped support for hg <= 4.9
-def movedirstate(repo, newctx, match=None):
-    """Move the dirstate to newctx and adjust it as necessary.
-
-    A matcher can be provided as an optimization. It is probably a bug to pass
-    a matcher that doesn't match all the differences between the parent of the
-    working copy and newctx.
-    """
-    oldctx = repo[b'.']
-    ds = repo.dirstate
-    dscopies = dict(ds.copies())
-    ds.setparents(newctx.node(), node.nullid)
-    s = newctx.status(oldctx, match=match)
-    for f in s.modified:
-        if ds[f] == b'r':
-            # modified + removed -> removed
-            continue
-        ds.normallookup(f)
-
-    for f in s.added:
-        if ds[f] == b'r':
-            # added + removed -> unknown
-            ds.drop(f)
-        elif ds[f] != b'a':
-            ds.add(f)
-
-    for f in s.removed:
-        if ds[f] == b'a':
-            # removed + added -> normal
-            ds.normallookup(f)
-        elif ds[f] != b'r':
-            ds.remove(f)
-
-    # Merge old parent and old working dir copies
-    oldcopies = copies.pathcopies(newctx, oldctx, match)
-    oldcopies.update(dscopies)
-    newcopies = {
-        dst: oldcopies.get(src, src)
-        for dst, src in oldcopies.items()
-    }
-    # Adjust the dirstate copies
-    for dst, src in newcopies.items():
-        if src not in newctx or dst in newctx or ds[dst] != b'a':
-            src = None
-        ds.copy(src, dst)
-
 @eh.command(
     b'uncommit',
     [(b'a', b'all', None, _(b'uncommit all changes when no arguments given')),
@@ -515,7 +469,7 @@
             compat.clean_update(repo[newid])
         else:
             with repo.dirstate.parentchange(), compat.parentchange(repo):
-                movedirstate(repo, repo[newid], match)
+                compat.movedirstate(repo, repo[newid], match)
         if not repo[newid].files():
             ui.warn(_(b"new changeset is empty\n"))
             ui.status(_(b"(use 'hg prune .' to remove it)\n"))
@@ -734,11 +688,8 @@
             if opts.get('note'):
                 metadata[b'note'] = opts['note']
 
-            updates = allctx[:]
-            if p2 is not None and root.p2() != p2:
-                updates.append(p2)
             commitopts = pycompat.byteskwargs(commitopts)
-            newid, unusedvariable = rewriteutil.rewrite(repo, root, updates,
+            newid, unusedvariable = rewriteutil.rewrite(repo, root,
                                                         head,
                                                         [root.p1().node(),
                                                          p2.node()],
@@ -854,13 +805,10 @@
                 commitopts['message'] = b"\n".join(msgs)
                 commitopts['edit'] = True
 
-            updates = allctx[:]
-            if p2 is not None and (root.p2() != p2 or not opts['fold']):
-                updates.append(p2)
             if not commitopts['fold'] and not commitopts['date']:
                 commitopts['date'] = root.date()
             commitopts = pycompat.byteskwargs(commitopts)
-            newid, created = rewriteutil.rewrite(repo, root, updates, head,
+            newid, created = rewriteutil.rewrite(repo, root, head,
                                                  [root.p1().node(),
                                                   p2.node()],
                                                  commitopts=commitopts)
@@ -1364,11 +1312,8 @@
                 if choice == b'duplicate':
                     duplicate = True
 
-        updates = []
-        if len(ctx.parents()) > 1:
-            updates = ctx.parents()
         extradict = {b'extra': extra}
-        new, unusedvariable = rewriteutil.rewrite(repo, ctx, updates, ctx,
+        new, unusedvariable = rewriteutil.rewrite(repo, ctx, ctx,
                                                   [p1, p2],
                                                   commitopts=extradict)
         # store touched version to help potential children
--- a/hgext3rd/evolve/compat.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/evolve/compat.py	Thu Aug 12 22:01:14 2021 +0200
@@ -11,10 +11,12 @@
 from mercurial import (
     cmdutil,
     context,
-    copies,
+    copies as copiesmod,
+    dirstate,
     hg,
     logcmdutil,
     merge as mergemod,
+    node,
     obsolete,
     registrar,
     repair,
@@ -94,7 +96,7 @@
 except AttributeError:
     bmrevset = scmutil.bookmarkrevs
 
-hg48 = util.safehasattr(copies, 'stringutil')
+hg48 = util.safehasattr(copiesmod, 'stringutil')
 # code imported from Mercurial core at ae17555ef93f + patch
 def fixedcopytracing(repo, c1, c2, base):
     """A complete copy-patse of copies._fullcopytrace with a one line fix to
@@ -103,6 +105,7 @@
     gets in and once we drop support for 4.6, this should be removed."""
 
     from mercurial import pathutil
+    copies = copiesmod
 
     # In certain scenarios (e.g. graft, update or rebase), base can be
     # overridden We still need to know a real common ancestor in this case We
@@ -353,7 +356,7 @@
 # hg <= 4.9 (7694b685bb10)
 fixupstreamed = util.safehasattr(scmutil, 'movedirstate')
 if not fixupstreamed:
-    copies._fullcopytracing = fixedcopytracing
+    copiesmod._fullcopytracing = fixedcopytracing
 
 # help category compatibility
 # hg <= 4.7 (c303d65d2e34)
@@ -432,3 +435,97 @@
     def format_changeset_summary_fn(ui, repo, command, default_spec):
         return logcmdutil.changesetdisplayer(ui, repo,
                                              {b'template': default_spec}).show
+
+if util.safehasattr(dirstate.dirstate, 'set_clean'):
+    movedirstate = scmutil.movedirstate
+else:  # hg <= 5.8 (8a50fb0784a9)
+    # TODO: call core's version once we've dropped support for hg <= 4.9
+    def movedirstate(repo, newctx, match=None):
+        """Move the dirstate to newctx and adjust it as necessary.
+
+        A matcher can be provided as an optimization. It is probably a bug to pass
+        a matcher that doesn't match all the differences between the parent of the
+        working copy and newctx.
+        """
+        oldctx = repo[b'.']
+        ds = repo.dirstate
+        dscopies = dict(ds.copies())
+        ds.setparents(newctx.node(), node.nullid)
+        s = newctx.status(oldctx, match=match)
+        for f in s.modified:
+            if ds[f] == b'r':
+                # modified + removed -> removed
+                continue
+            ds.normallookup(f)
+
+        for f in s.added:
+            if ds[f] == b'r':
+                # added + removed -> unknown
+                ds.drop(f)
+            elif ds[f] != b'a':
+                ds.add(f)
+
+        for f in s.removed:
+            if ds[f] == b'a':
+                # removed + added -> normal
+                ds.normallookup(f)
+            elif ds[f] != b'r':
+                ds.remove(f)
+
+        # Merge old parent and old working dir copies
+        oldcopies = copiesmod.pathcopies(newctx, oldctx, match)
+        oldcopies.update(dscopies)
+        newcopies = {
+            dst: oldcopies.get(src, src)
+            for dst, src in oldcopies.items()
+        }
+        # Adjust the dirstate copies
+        for dst, src in newcopies.items():
+            if src not in newctx or dst in newctx or ds[dst] != b'a':
+                src = None
+            ds.copy(src, dst)
+
+# hg <= 4.9 (e1ceefab9bca)
+code = context.overlayworkingctx._markdirty.__code__
+if 'copied' not in code.co_varnames[:code.co_argcount]:
+    def fixedmarkcopied(self, path, origin):
+        self._markdirty(path, exists=True, date=self.filedate(path),
+                        flags=self.flags(path), copied=origin)
+
+    context.overlayworkingctx.markcopied = fixedmarkcopied
+
+# what we're actually targeting here is e079e001d536
+# hg <= 5.0 (dc3fdd1b5af4)
+try:
+    from mercurial import state as statemod
+    markdirtyfixed = util.safehasattr(statemod, '_statecheck')
+except (AttributeError, ImportError):
+    markdirtyfixed = False
+if not markdirtyfixed:
+    def fixedmarkdirty(
+        self,
+        path,
+        exists,
+        data=None,
+        date=None,
+        flags='',
+        copied=None,
+    ):
+        # data not provided, let's see if we already have some; if not, let's
+        # grab it from our underlying context, so that we always have data if
+        # the file is marked as existing.
+        if exists and data is None:
+            oldentry = self._cache.get(path) or {}
+            data = oldentry.get('data')
+            if data is None:
+                data = self._wrappedctx[path].data()
+
+        self._cache[path] = {
+            'exists': exists,
+            'data': data,
+            'date': date,
+            'flags': flags,
+            'copied': copied,
+        }
+
+    context.overlayworkingctx._markdirty = fixedmarkdirty
--- a/hgext3rd/evolve/evolvecmd.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/evolve/evolvecmd.py	Thu Aug 12 22:01:14 2021 +0200
@@ -37,7 +37,6 @@
 from mercurial.i18n import _
 
 from . import (
-    cmdrewrite,
     compat,
     exthelper,
     rewriteutil,
@@ -206,7 +205,7 @@
         repo.ui.write(todo)
         repo.ui.write((b'hg update %s;\n' % prec))
         repo.ui.write((b'hg revert --all --rev %s;\n' % bumped))
-        repo.ui.write((b'hg commit --msg "%s update to %s"\n' %
+        repo.ui.write((b'hg commit --message "%s update to %s"\n' %
                        (TROUBLES['PHASEDIVERGENT'], bumped)))
         return (False, b".")
     if progresscb:
@@ -618,7 +617,7 @@
         otherdiv = other if other.mutable() else divergent
 
         with repo.dirstate.parentchange(), compat.parentchange(repo):
-            cmdrewrite.movedirstate(repo, repo[publicnode])
+            compat.movedirstate(repo, repo[publicnode])
         # check if node to be committed has changes same as public one
         s = publicdiv.status()
         if not (s.added or s.removed or s.deleted or s.modified):
@@ -631,7 +630,7 @@
             return (True, publicnode)
 
     with repo.dirstate.parentchange(), compat.parentchange(repo):
-        cmdrewrite.movedirstate(repo, repo[resparent])
+        compat.movedirstate(repo, repo[resparent])
 
     # merge the branches
     mergebranches(repo, divergent, other, base)
--- a/hgext3rd/evolve/metadata.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/evolve/metadata.py	Thu Aug 12 22:01:14 2021 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-__version__ = b'10.3.2.dev'
+__version__ = b'10.3.3.dev'
 testedwith = b'4.6.2 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8'
 minimumhgversion = b'4.6'
 buglink = b'https://bz.mercurial-scm.org/'
--- a/hgext3rd/evolve/rewind.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/evolve/rewind.py	Thu Aug 12 22:01:14 2021 +0200
@@ -368,12 +368,9 @@
     p2 = ctx.p2().node()
     p2 = rewindmap.get(p2, p2)
 
-    updates = []
-    if len(ctx.parents()) > 1:
-        updates = ctx.parents()
     commitopts = {b'extra': extra, b'date': ctx.date()}
 
-    new, unusedvariable = rewriteutil.rewrite(unfi, ctx, updates, ctx,
+    new, unusedvariable = rewriteutil.rewrite(unfi, ctx, ctx,
                                               [p1, p2],
                                               commitopts=commitopts)
 
--- a/hgext3rd/evolve/rewriteutil.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/evolve/rewriteutil.py	Thu Aug 12 22:01:14 2021 +0200
@@ -19,6 +19,7 @@
     error,
     hg,
     lock as lockmod,
+    mergeutil,
     node,
     obsolete,
     obsutil,
@@ -205,12 +206,28 @@
             revs = sorted(revs)
     return repomarks, revs
 
-def rewrite(repo, old, updates, head, newbases, commitopts):
+try:
+    from mercural import mergestate
+    mergestate.memmergestate
+    hasmemmergestate = True
+except (ImportError, AttributeError):
+    # hg <= 5.5 (19590b126764)
+    hasmemmergestate = False
+
+def rewrite(repo, old, head, newbases, commitopts):
     """Return (nodeid, created) where nodeid is the identifier of the
     changeset generated by the rewrite process, and created is True if
     nodeid was actually created. If created is False, nodeid
     references a changeset existing before the rewrite call.
     """
+    # Until there was memmergestate, in-memory would clear the on-disk
+    # mergestate and use that. We don't want that to happen, so we'll require
+    # users of old Mercurial versions to run `hg touch` etc without
+    # mergestate.
+    if not hasmemmergestate:
+        ms = compat.mergestate.read(repo)
+        mergeutil.checkunresolved(ms)
+
     wlock = lock = tr = None
     try:
         wlock = repo.wlock()
@@ -219,39 +236,6 @@
         base = old.p1()
         updatebookmarks = bookmarksupdater(repo, old.node(), tr)
 
-        # commit a new version of the old changeset, including the update
-        # collect all files which might be affected
-        files = set(old.files())
-        for u in updates:
-            files.update(u.files())
-
-        # Recompute copies (avoid recording a -> b -> a)
-        copied = copies.pathcopies(base, head)
-
-        # prune files which were reverted by the updates
-        def samefile(f):
-            if f in head.manifest():
-                a = head.filectx(f)
-                if f in base.manifest():
-                    b = base.filectx(f)
-                    return (a.data() == b.data()
-                            and a.flags() == b.flags())
-                else:
-                    return False
-            else:
-                return f not in base.manifest()
-        files = [f for f in files if not samefile(f)]
-        # commit version of these files as defined by head
-        headmf = head.manifest()
-
-        def filectxfn(repo, ctx, path):
-            if path in headmf:
-                fctx = head[path]
-                flags = fctx.flags()
-                mctx = compat.memfilectx(repo, ctx, fctx, flags, copied, path)
-                return mctx
-            return None
-
         message = cmdutil.logmessage(repo.ui, commitopts)
         if not message:
             message = old.description()
@@ -264,20 +248,27 @@
         extra = dict(commitopts.get(b'extra', old.extra()))
         extra[b'branch'] = head.branch()
 
-        new = context.memctx(repo,
-                             parents=newbases,
-                             text=message,
-                             files=files,
-                             filectxfn=filectxfn,
-                             user=user,
-                             date=date,
-                             extra=extra)
-
+        wctx = context.overlayworkingctx(repo)
+        wctx.setbase(base)
+        compat._update(repo,
+                       head.node(),
+                       branchmerge=False,
+                       force=True,
+                       wc=wctx)
+        for pctx in head.parents():
+            for dst, src in copies.pathcopies(pctx, head).items():
+                wctx[dst].markcopied(src)
+        editor = None
         if commitopts.get(b'edit'):
-            new._text = cmdutil.commitforceeditor(repo, new, [])
+            editor = cmdutil.commitforceeditor
+        new = wctx.tomemctx(text=message,
+                            parents=newbases,
+                            date=date,
+                            extra=extra,
+                            user=user,
+                            editor=editor)
         revcount = len(repo)
         newid = repo.commitctx(new)
-        new = repo[newid]
         created = len(repo) != revcount
         updatebookmarks(newid)
 
--- a/hgext3rd/topic/__init__.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/topic/__init__.py	Thu Aug 12 22:01:14 2021 +0200
@@ -86,17 +86,17 @@
 
 * everything pushed become public (the default)::
 
-    [phase]
+    [phases]
     publish = yes
 
 * nothing push turned public::
 
-    [phase]
+    [phases]
     publish = no
 
 * topic branches are not published, changeset without topic are::
 
-    [phase]
+    [phases]
     publish = no
     [experimental]
     topic.publish-bare-branch = yes
@@ -232,7 +232,7 @@
               b'topic.active': b'green',
               }
 
-__version__ = b'0.22.2.dev'
+__version__ = b'0.22.3.dev'
 
 testedwith = b'4.6.2 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8'
 minimumhgversion = b'4.6'
--- a/hgext3rd/topic/destination.py	Fri May 28 00:23:12 2021 +0800
+++ b/hgext3rd/topic/destination.py	Thu Aug 12 22:01:14 2021 +0200
@@ -10,7 +10,6 @@
 from . import (
     common,
     topicmap,
-    constants,
 )
 from .evolvebits import builddependencies
 
@@ -69,7 +68,7 @@
     topic = repo.currenttopic
     if topic:
         revs = repo.revs(b'.::topic(%s)', topic)
-    elif constants.extrakey in repo[b'.'].extra():
+    elif repo[b'.'].topic():
         revs = []
     else:
         return None, None, None
--- a/tests/test-check-sdist.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-check-sdist.t	Thu Aug 12 22:01:14 2021 +0200
@@ -30,8 +30,8 @@
   no previously-included directories found matching '.gitlab'
   $ cd "$TESTTMP"/dist
 
-  $ wc -c hg-evolve-*.tar.gz
-  8????? hg-evolve-*.tar.gz (glob)
+  $ find hg-evolve-*.tar.gz -size +800000c
+  hg-evolve-*.tar.gz (glob)
 
   $ tar -tzf hg-evolve-*.tar.gz | sed 's|^hg-evolve-[^/]*/||' | sort > files
   $ wc -l files
--- a/tests/test-discovery-obshashrange-cache.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-discovery-obshashrange-cache.t	Thu Aug 12 22:01:14 2021 +0200
@@ -114,7 +114,7 @@
 
 clear cache
 
-  $ rm -rf main/.hg/cache/evoext
+  $ rm main/.hg/cache/evoext*
 
 pull nothing
 
@@ -129,7 +129,6 @@
   $ f -s main/.hg/cache/evoext*
   main/.hg/cache/evoext-depthcache-00: size=88
   main/.hg/cache/evoext-firstmerge-00: size=88
-  main/.hg/cache/evoext-obscache-00: size=72
   main/.hg/cache/evoext-stablesortcache-00: size=92
   main/.hg/cache/evoext_obshashrange_v2.sqlite: size=?* (glob)
   main/.hg/cache/evoext_stablerange_v2.sqlite: size=?* (glob)
@@ -139,7 +138,7 @@
 
 clear cache
 
-  $ rm -rf main/.hg/cache/evoext
+  $ rm main/.hg/cache/evoext*
 
 push nothing
 
--- a/tests/test-discovery-obshashrange.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-discovery-obshashrange.t	Thu Aug 12 22:01:14 2021 +0200
@@ -131,9 +131,9 @@
   * @0000000000000000000000000000000000000000 (*)> debugobshashrange --subranges --rev tip (glob)
   * @0000000000000000000000000000000000000000 (*)> updated evo-ext-depthcache in *.???? seconds (8r) (glob)
   * @0000000000000000000000000000000000000000 (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (8r) (glob)
-  1970/01/01 00:00:00 * @0000000000000000000000000000000000000000 (*)> updated evo-ext-obshashrange in *.???? seconds (8r, 5o) (glob)
-  1970/01/01 00:00:00 * @0000000000000000000000000000000000000000 (*)> updated evo-ext-stablesort in *.???? seconds (8r) (glob)
-  1970/01/01 00:00:00 * @0000000000000000000000000000000000000000 (*)> updated evo-ext-firstmerge in *.???? seconds (8r) (glob)
+  * @0000000000000000000000000000000000000000 (*)> updated evo-ext-obshashrange in *.???? seconds (8r, 5o) (glob)
+  * @0000000000000000000000000000000000000000 (*)> updated evo-ext-stablesort in *.???? seconds (8r) (glob)
+  * @0000000000000000000000000000000000000000 (*)> updated evo-ext-firstmerge in *.???? seconds (8r) (glob)
   * @0000000000000000000000000000000000000000 (*)> debugobshashrange --subranges --rev tip exited 0 after *.?? seconds (glob)
   * @0000000000000000000000000000000000000000 (*)> -R server serve --stdio (glob)
   * @0000000000000000000000000000000000000000 (*)> -R server serve --stdio exited 0 after *.?? seconds (glob)
@@ -224,11 +224,11 @@
   remote: 1 new obsolescence markers
   $ hg -R ../server blackbox
   * @0000000000000000000000000000000000000000 (*)> -R server serve --stdio (glob)
-  1970/01/01 00:00:00 * @0000000000000000000000000000000000000000 (*)> updated evo-ext-firstmerge in *.???? seconds (1r) (glob)
+  * @0000000000000000000000000000000000000000 (*)> updated evo-ext-firstmerge in *.???? seconds (1r) (glob)
   * @0000000000000000000000000000000000000000 (*)> updated evo-ext-depthcache in *.???? seconds (1r) (glob)
-  1970/01/01 00:00:00 * @0000000000000000000000000000000000000000 (*)> updated evo-ext-stablesort in *.???? seconds (1r) (glob)
+  * @0000000000000000000000000000000000000000 (*)> updated evo-ext-stablesort in *.???? seconds (1r) (glob)
   * @0000000000000000000000000000000000000000 (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (1r) (glob)
-  1970/01/01 00:00:00 * @0000000000000000000000000000000000000000 (*)> updated evo-ext-obshashrange in *.???? seconds (1r, 1o) (glob)
+  * @0000000000000000000000000000000000000000 (*)> updated evo-ext-obshashrange in *.???? seconds (1r, 1o) (glob)
   * @0000000000000000000000000000000000000000 (*)> obscache is out of date, falling back to slower obsstore version (glob)
   * @0000000000000000000000000000000000000000 (*)> updated evo-ext-obscache in *.???? seconds (1r, 1o) (glob)
   * @0000000000000000000000000000000000000000 (*)> 1 incoming changes - new heads: 45f8b879de92 (glob)
@@ -315,12 +315,12 @@
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> received listkey for "namespaces": 40 bytes (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-depthcache in *.???? seconds (6r) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (6r) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (6r, 4o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (6r, 4o) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> query 0; add more sample (target 100, current 1) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> query 0; sample size is 9, largest range 5 (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> sending evoext_obshashrange_v1 command (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablesort in *.???? seconds (6r) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-firstmerge in *.???? seconds (6r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablesort in *.???? seconds (6r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-firstmerge in *.???? seconds (6r) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 0/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 0/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> checking for updated bookmarks (glob)
@@ -411,7 +411,7 @@
   * @0000000000000000000000000000000000000000 (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob)
   * @0000000000000000000000000000000000000000 (*)> -R ../server debugobsolete bbbbbbb2222222222bbbbbbbbbbbbb2222222222 bebd167eb94d257ace0e814aeb98e6972ed2970d exited 0 after *.?? seconds (glob)
   * @0000000000000000000000000000000000000000 (*)> -R server serve --stdio (glob)
-  1970/01/01 00:00:00 * @0000000000000000000000000000000000000000 (*)> obshashcache clean - new markers affect 3 changeset and cached ranges (glob)
+  * @0000000000000000000000000000000000000000 (*)> obshashcache clean - new markers affect 3 changeset and cached ranges (glob)
   * @0000000000000000000000000000000000000000 (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 4o) (glob)
   * @0000000000000000000000000000000000000000 (*)> -R server serve --stdio exited 0 after *.?? seconds (glob)
   * @0000000000000000000000000000000000000000 (*)> -R ../server blackbox (glob)
@@ -505,12 +505,12 @@
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobsolete --rev ::6 exited 0 after *.?? seconds (glob) (windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-depthcache in *.???? seconds (2r) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (2r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-depthcache in *.???? seconds (2r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (2r) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (2r, 3o) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablesort in *.???? seconds (2r) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-firstmerge in *.???? seconds (2r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablesort in *.???? seconds (2r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-firstmerge in *.???? seconds (2r) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r f69452c5b1af6cbaaa56ef50cf94fff5bcc6ca23 (glob)
@@ -686,15 +686,15 @@
   OBSEXC: request obsmarkers for 1 common nodes
   1 new obsolescence markers
   $ hg blackbox
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r bebd167eb94d257ace0e814aeb98e6972ed2970d (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 1/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 1/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r bebd167eb94d257ace0e814aeb98e6972ed2970d exited 0 after *.?? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> blackbox (glob)
   $ rm .hg/blackbox.log
@@ -748,15 +748,15 @@
   OBSEXC: request obsmarkers for 1 common nodes
   1 new obsolescence markers
   $ hg blackbox
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r bebd167eb94d257ace0e814aeb98e6972ed2970d (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 1/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 1/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r bebd167eb94d257ace0e814aeb98e6972ed2970d exited 0 after *.?? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> blackbox (glob)
   $ rm .hg/blackbox.log
@@ -810,15 +810,15 @@
   OBSEXC: request obsmarkers for 1 common nodes
   1 new obsolescence markers
   $ hg blackbox
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r bebd167eb94d257ace0e814aeb98e6972ed2970d (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 1/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r bebd167eb94d257ace0e814aeb98e6972ed2970d (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 1/5 mismatch - 1 obshashrange queries in *.???? seconds (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (0r, 1o) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull -r bebd167eb94d257ace0e814aeb98e6972ed2970d exited 0 after *.?? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> blackbox (glob)
   $ rm .hg/blackbox.log
@@ -860,18 +860,18 @@
   $ hg blackbox
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obshashcache clean - new markers affect 2 changeset and cached ranges (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (0r, 1o) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 0/8 mismatch - 1 obshashrange queries in *.???? seconds (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (1r, 1o) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> 1 incoming changes - new heads: 4de32a90b66c (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 0/8 mismatch - 1 obshashrange queries in *.???? seconds (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (1r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> 1 incoming changes - new heads: 4de32a90b66c (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull exited 0 after *.?? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> rollback (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> strip detected, evo-ext-obscache cache reset (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (8r, 15o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (8r, 15o) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> rollback exited 0 after *.?? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> blackbox (glob)
   $ rm .hg/blackbox.log
@@ -910,9 +910,9 @@
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 0/8 mismatch - 1 obshashrange queries in *.???? seconds (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (1r, 1o) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> 1 incoming changes - new heads: 4de32a90b66c (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> obsdiscovery, 0/8 mismatch - 1 obshashrange queries in *.???? seconds (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obscache in *.???? seconds (1r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> 1 incoming changes - new heads: 4de32a90b66c (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> pull exited 0 after *.?? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> blackbox (glob)
   $ rm .hg/blackbox.log
@@ -1016,18 +1016,18 @@
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" (glob) (windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> writing .hg/cache/tags2-visible with 0 tags (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-depthcache in *.???? seconds (1r) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (1r) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (1r, 1o) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablesort in *.???? seconds (1r) (glob)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-firstmerge in *.???? seconds (1r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-depthcache in *.???? seconds (1r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (1r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-obshashrange in *.???? seconds (1r, 1o) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-stablesort in *.???? seconds (1r) (glob)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> updated evo-ext-firstmerge in *.???? seconds (1r) (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev "heads(all())" exited 0 after *.?? seconds (glob) (windows !)
-  1970/01/01 00:00:00 * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
+  * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> debugobshashrange --subranges --rev 'heads(all())' exited 0 after *.?? seconds (glob) (no-windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> log -G (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> log -G exited 0 after *.?? seconds (glob)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> --config "extensions.strip=" strip -r "desc(\"foo\")" (glob) (windows !)
   * @45f8b879de922f6a6e620ba04205730335b6fc7e (*)> --config 'extensions.strip=' strip -r 'desc("foo")' (glob) (no-windows !)
-  1970/01/01 00:00:00 * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> saved backup bundle to $TESTTMP/client/.hg/strip-backup/45f8b879de92-94c82517-backup.hg (glob)
+  * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> saved backup bundle to $TESTTMP/client/.hg/strip-backup/45f8b879de92-94c82517-backup.hg (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> strip detected, evo-ext-obscache cache reset (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-obscache in *.???? seconds (5r, 11o) (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-obscache in *.???? seconds (3r, 0o) (glob)
@@ -1042,14 +1042,14 @@
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-depthcache in *.???? seconds (8r) (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-stablerange-mergepoint in *.???? seconds (8r) (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> strip detected, evo-ext-obshashrange cache reset (glob)
-  1970/01/01 00:00:00 * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-obshashrange in *.???? seconds (8r, 11o) (glob)
+  * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-obshashrange in *.???? seconds (8r, 11o) (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> strip detected, evo-ext-stablesort cache reset (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-stablesort in *.???? seconds (8r) (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> strip detected, evo-ext-firstmerge cache reset (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-firstmerge in *.???? seconds (8r) (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> obsdiscovery, 1/8 mismatch - 1 obshashrange queries in *.???? seconds (glob)
-  1970/01/01 00:00:00 * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-obscache in *.???? seconds (1r, 5o) (glob)
-  1970/01/01 00:00:00 * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> 1 incoming changes - new heads: 45f8b879de92 (glob)
+  * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> updated evo-ext-obscache in *.???? seconds (1r, 5o) (glob)
+  * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> 1 incoming changes - new heads: 45f8b879de92 (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> pull exited 0 after *.?? seconds (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> log -G (glob)
   * @bebd167eb94d257ace0e814aeb98e6972ed2970d (*)> writing .hg/cache/tags2-visible with 0 tags (glob)
--- a/tests/test-evolve-abort-phasediv.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-evolve-abort-phasediv.t	Thu Aug 12 22:01:14 2021 +0200
@@ -179,13 +179,13 @@
   hg rebase --rev e44ebefe4f54 --dest ca1b80f7960a;
   hg update c41c793e0ef1;
   hg revert --all --rev e44ebefe4f54;
-  hg commit --msg "phase-divergent update to e44ebefe4f54"
+  hg commit --message "phase-divergent update to e44ebefe4f54"
   recreate:[9] added c
   atop:[3] added c
   hg rebase --rev 28cd06b3f801 --dest b1661037fa25;
   hg update ca1b80f7960a;
   hg revert --all --rev 28cd06b3f801;
-  hg commit --msg "phase-divergent update to 28cd06b3f801"
+  hg commit --message "phase-divergent update to 28cd06b3f801"
 
   $ hg glog --hidden
   @  9:28cd06b3f801 added c
--- a/tests/test-evolve-phase-divergence.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-evolve-phase-divergence.t	Thu Aug 12 22:01:14 2021 +0200
@@ -194,7 +194,7 @@
   hg rebase --rev 98bb3a6cfe1a --dest d3873e73d99e;
   hg update 4d1169d82e47;
   hg revert --all --rev 98bb3a6cfe1a;
-  hg commit --msg "phase-divergent update to 98bb3a6cfe1a"
+  hg commit --message "phase-divergent update to 98bb3a6cfe1a"
 
 XXX: evolve should have mentioned that draft commit is just obsoleted in favour
 of public one. From the message it looks like a new commit is created.
--- a/tests/test-fold.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-fold.t	Thu Aug 12 22:01:14 2021 +0200
@@ -448,3 +448,34 @@
   2 changesets folded
 
   $ cd ..
+
+Saving the last user-edited message in last-message.txt
+https://bz.mercurial-scm.org/show_bug.cgi?id=6549
+
+  $ hg init issue6549
+  $ cd issue6549
+
+  $ echo A > foo
+  $ hg ci -qAm A
+  $ echo B > foo
+  $ hg ci -m B
+
+  $ cat > editor.sh << 'EOF'
+  > echo 'Big commit message that was crafted with care.' > "$1"
+  > echo '' >> "$1"
+  > echo 'It would be a shame if something happened to it.' >> "$1"
+  > EOF
+  $ HGEDITOR="sh ./editor.sh" hg fold --exact --rev 'all()'
+  2 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ hg glog
+  @  2: Big commit message that was crafted with care.
+  
+     It would be a shame if something happened to it.
+  $ cat .hg/last-message.txt
+  Big commit message that was crafted with care.
+  
+  It would be a shame if something happened to it.
+
+  $ cd ..
--- a/tests/test-topic-dest.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-topic-dest.t	Thu Aug 12 22:01:14 2021 +0200
@@ -489,12 +489,27 @@
   o  0 () c_alpha
   
 
+Testing that default destination for update is not ignoring phases
+https://bz.mercurial-scm.org/show_bug.cgi?id=6553
+
+  $ hg phase --rev 'desc("Huc")' --public
+
+  $ hg up 'desc("Huc")^'
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg up
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  updated to "efbc6aa717fb: Huc"
+  1 other heads for branch "default"
+
 Default destination for histedit
 ================================
 
-By default histedit should edit with the current topic only
-(even when based on other draft
+By default histedit should edit changesets with the current topic only
+(even when based on other draft changesets)
 
+  $ hg up elephant
+  switching to topic elephant
+  2 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg phase 'desc(c_zeta)'
   11: draft
   $ HGEDITOR=cat hg histedit | grep pick
--- a/tests/test-topic.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-topic.t	Thu Aug 12 22:01:14 2021 +0200
@@ -96,17 +96,17 @@
   
   * everything pushed become public (the default):
   
-      [phase]
+      [phases]
       publish = yes
   
   * nothing push turned public:
   
-      [phase]
+      [phases]
       publish = no
   
   * topic branches are not published, changeset without topic are:
   
-      [phase]
+      [phases]
       publish = no
       [experimental]
       topic.publish-bare-branch = yes
--- a/tests/test-touch.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-touch.t	Thu Aug 12 22:01:14 2021 +0200
@@ -212,6 +212,145 @@
 
   $ cd ..
 
+Check that touching a merge commit doesn't lose file changes (issue 6416)
+
+  $ hg init issue-6416
+  $ cd issue-6416
+  $ echo base > base
+  $ hg ci -Aqm base
+  $ echo left1 > left1
+  $ hg ci -Aqm left1
+  $ echo left2 > left2
+  $ hg ci -Aqm left2
+  $ hg up 0 -q
+  $ echo right1 > right1
+  $ hg ci -Aqm right1
+  $ echo right2 > right2
+  $ hg ci -Aqm right2
+  $ hg up 2 -q
+  $ hg merge 4 -q
+  $ hg ci -m merge
+  $ hg touch tip
+  $ hg glog --hidden
+  @    6: merge
+  |\
+  +---x  5: merge
+  | |/
+  | o  4: right2
+  | |
+  | o  3: right1
+  | |
+  o |  2: left2
+  | |
+  o |  1: left1
+  |/
+  o  0: base
+  
+  $ hg glog --hidden --rev 'min(desc("merge"))' --rev 'max(desc("merge"))'
+  @    6: merge
+  |\
+  ~ ~
+  x    5: merge
+  |\
+  ~ ~
+  $ hg status --hidden --change 'min(desc("merge"))'
+  A right1
+  A right2
+  $ hg status --hidden --change 'max(desc("merge"))'
+  A right1
+  A right2
+  $ hg status --hidden --rev 'min(desc("merge"))' --rev 'max(desc("merge"))'
+  $ cd ..
+
+Check that touching a merge commit doesn't lose copies
+
+  $ hg init merge-copies
+  $ cd merge-copies
+  $ echo base > base
+  $ hg ci -Aqm base
+  $ echo left > left
+  $ hg cp base copy-on-left
+  $ hg ci -Aqm left
+  $ hg up 0 -q
+  $ echo right > right
+  $ hg cp base copy-on-right
+  $ hg ci -Aqm right
+  $ hg up 1 -q
+  $ hg merge 2 -q
+  $ hg cp left merge-copy-left
+  $ hg cp right merge-copy-right
+  $ hg ci -m merge
+  $ hg touch tip
+  $ hg glog --hidden
+  @    4: merge
+  |\
+  +---x  3: merge
+  | |/
+  | o  2: right
+  | |
+  o |  1: left
+  |/
+  o  0: base
+  
+  $ hg glog --hidden --rev 'min(desc("merge"))' --rev 'max(desc("merge"))'
+  @    4: merge
+  |\
+  ~ ~
+  x    3: merge
+  |\
+  ~ ~
+  $ hg status --copies --rev 'min(desc("base"))' --rev 'min(desc("merge"))'
+  A copy-on-left
+    base
+  A copy-on-right
+    base
+  A left
+  A merge-copy-left
+  A merge-copy-right
+  A right
+  $ hg status --copies --rev 'min(desc("base"))' --rev 'max(desc("merge"))'
+  A copy-on-left
+    base
+  A copy-on-right
+    base
+  A left
+  A merge-copy-left
+  A merge-copy-right
+  A right
+  $ hg status --copies --rev 'min(desc("left"))' --rev 'min(desc("merge"))'
+  M copy-on-left
+  A copy-on-right
+    base
+  A merge-copy-left
+    left
+  A merge-copy-right
+  A right
+  $ hg status --copies --rev 'min(desc("left"))' --rev 'max(desc("merge"))'
+  M copy-on-left
+  A copy-on-right
+    base
+  A merge-copy-left
+    left
+  A merge-copy-right
+  A right
+  $ hg status --copies --rev 'min(desc("right"))' --rev 'min(desc("merge"))'
+  M copy-on-right
+  A copy-on-left
+    base
+  A left
+  A merge-copy-left
+  A merge-copy-right
+    right
+  $ hg status --copies --rev 'min(desc("right"))' --rev 'max(desc("merge"))'
+  M copy-on-right
+  A copy-on-left
+    base
+  A left
+  A merge-copy-left
+  A merge-copy-right
+    right
+  $ cd ..
+
 Make sure touch doesn't fail to warn about divergence (issue6107)
 
   $ hg init touchdiv
@@ -236,3 +375,20 @@
   1 new content-divergent changesets
 
   $ cd ..
+
+Touch preserves copies
+
+  $ hg init copies
+  $ cd copies
+  $ echo a > a
+  $ hg ci -Aqm a
+  $ hg cp a b
+  $ hg ci -Aqm 'copy a to b'
+  $ hg status --copies --change .
+  A b
+    a
+  $ hg touch
+  $ hg status --copies --change .
+  A b
+    a
+  $ cd ..
--- a/tests/test-unstability-resolution-result.t	Fri May 28 00:23:12 2021 +0800
+++ b/tests/test-unstability-resolution-result.t	Thu Aug 12 22:01:14 2021 +0200
@@ -168,7 +168,7 @@
   hg rebase --rev 99c21c89bcef --dest 66719795a494;
   hg update 1cf0aacfd363;
   hg revert --all --rev 99c21c89bcef;
-  hg commit --msg "phase-divergent update to 99c21c89bcef"
+  hg commit --message "phase-divergent update to 99c21c89bcef"
   $ hg evolve --any --confirm --phase-divergent
   recreate:[9] newer a
   atop:[6] newer a