changeset 6018:01154958e0cf

branching: merge stable into default
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 13 Aug 2021 20:25:11 +0200
parents 3a3341e44a0e (diff) ae0ef35c2dd9 (current diff)
children 6f6b6218b6fe
files CHANGELOG hgext3rd/evolve/compat.py hgext3rd/evolve/metadata.py hgext3rd/evolve/rewriteutil.py hgext3rd/topic/__init__.py tests/test-fold.t
diffstat 57 files changed, 632 insertions(+), 432 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGELOG	Fri Aug 13 19:44:42 2021 +0200
+++ b/CHANGELOG	Fri Aug 13 20:25:11 2021 +0200
@@ -1,6 +1,18 @@
 Changelog
 =========
 
+10.4.0 - in progress
+--------------------
+
+  * next: add an --abort flag
+  * evolve: use a more stable criteria for picking p1 when solving
+            content-divergence (most recent evolution will be used).
+  * evolve: drop the deprecated --unstable, --divergent and --bumped flags,
+    they were replaced by --orphan, --content-divergent and --phase-divergent
+    respectively a long time ago
+  * evolve: remove experimental.obshashrange.lru-size docs, that config option
+    didn't do anything for a long time
+
 10.3.3 -- 2021-08-13
 --------------------
 
@@ -15,7 +27,8 @@
     when hg update is called without any revision (issue6553)
   * topic: fix the help text to show how to disable publishing
 
-10.3.2 - 2021-05-28
+
+10.3.2 -- 2021-05-28
 --------------------
 
   * next: remove duplicated targets when updating from an unstable changeset
--- a/hgext3rd/evolve/__init__.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/__init__.py	Fri Aug 13 20:25:11 2021 +0200
@@ -90,13 +90,10 @@
     [extensions]
     blackbox =
 
-Finally some extra options are available to help tame the experimental
+Finally one more option is available to help tame the experimental
 implementation of some of the algorithms::
 
     [experimental]
-    # restrict cache size to reduce memory consumption
-    obshashrange.lru-size = 2000 # default is 2000
-
     # automatically disable obshashrange related computation and capabilities
     # if the repository has more than N revisions.  This is meant to help large
     # server deployment to enable the feature on smaller repositories while
@@ -819,7 +816,8 @@
      (b'', b'evolve', True, _(b'evolve the next changeset if necessary')),
      (b'', b'no-topic', False, _(b'ignore topic and move topologically')),
      (b'n', b'dry-run', False,
-      _(b'do not perform actions, just print what would be done'))],
+      _(b'do not perform actions, just print what would be done')),
+     (b'', b'abort', False, _(b'abort the interrupted next'))],
     b'[OPTION]...',
     helpbasic=True,
     **compat.helpcategorykwargs('CATEGORY_WORKING_DIRECTORY'))
@@ -833,6 +831,26 @@
     """
     wlock = None
     dryrunopt = opts['dry_run']
+    abortopt = opts['abort']
+
+    compat.check_incompatible_arguments(opts, 'abort', ['move_bookmark', 'merge'])
+    if abortopt:
+        evolvestate = state.cmdstate(repo)
+        if not evolvestate:
+            raise error.Abort(_(b'no interrupted next to abort'))
+
+        evolvestate.load()
+        if evolvestate[b'command'] != b'next':
+            raise error.Abort(_(b'no interrupted next to abort'))
+
+        pctx = repo[b'.']
+        compat.clean_update(pctx)
+        ui.status(_(b'next aborted\n'))
+        ui.status(_(b'working directory is now at %s\n')
+                  % ui.label(bytes(pctx), b'evolve.node'))
+        evolvestate.delete()
+        return 0
+
     if not dryrunopt:
         wlock = repo.wlock()
     try:
--- a/hgext3rd/evolve/cmdrewrite.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/cmdrewrite.py	Fri Aug 13 20:25:11 2021 +0200
@@ -1124,7 +1124,8 @@
         bmupdate = rewriteutil.bookmarksupdater(repo, ctx.node(), tr)
         bookactive = repo._activebookmark
         if bookactive is not None:
-            repo.ui.status(_(b"(leaving bookmark %s)\n") % repo._activebookmark)
+            b = ui.label(repo._activebookmark, b'bookmarks')
+            ui.status(_(b"(leaving bookmark %s)\n") % b)
         bookmarksmod.deactivate(repo)
 
         # Prepare the working directory
@@ -1222,7 +1223,7 @@
                     continue
                 break # propagate the previous break
             else:
-                ui.status(_(b"no more change to split\n"))
+                ui.status(_(b"no more changes to split\n"))
                 if haschanges():
                     # XXX: Should we show a message for informing the user
                     # that we create another commit with remaining changes?
@@ -1356,7 +1357,20 @@
         pickstate = state.cmdstate(repo, path=b'pickstate')
         pctx = repo[b'.']
 
-        if not cont and not abort:
+        if cont:
+            if revs:
+                raise error.Abort(_(b"cannot specify both --continue and "
+                                    b"revision"))
+            if not pickstate:
+                raise error.Abort(_(b"no interrupted pick state exists"))
+
+            pickstate.load()
+            orignode = pickstate[b'orignode']
+            origctx = repo[orignode]
+
+        elif abort:
+            return abortpick(ui, repo, pickstate)
+        else:
             cmdutil.bailifchanged(repo)
             revs = scmutil.revrange(repo, revs)
             if len(revs) > 1:
@@ -1384,21 +1398,6 @@
                 pickstate.save()
                 raise error.InterventionRequired(_(b"unresolved merge conflicts"
                                                    b" (see hg help resolve)"))
-
-        elif abort:
-            return abortpick(ui, repo, pickstate)
-
-        else:
-            if revs:
-                raise error.Abort(_(b"cannot specify both --continue and "
-                                    b"revision"))
-            if not pickstate:
-                raise error.Abort(_(b"no interrupted pick state exists"))
-
-            pickstate.load()
-            orignode = pickstate[b'orignode']
-            origctx = repo[orignode]
-
         overrides = {(b'phases', b'new-commit'): origctx.phase()}
         with repo.ui.configoverride(overrides, b'pick'):
             newnode = repo.commit(text=origctx.description(),
--- a/hgext3rd/evolve/compat.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/compat.py	Fri Aug 13 20:25:11 2021 +0200
@@ -8,16 +8,19 @@
 
 import contextlib
 
+from mercurial.i18n import _
 from mercurial import (
     cmdutil,
     context,
     copies as copiesmod,
     dirstate,
+    error,
     hg,
     logcmdutil,
     merge as mergemod,
     node,
     obsolete,
+    pycompat,
     registrar,
     repair,
     scmutil,
@@ -436,6 +439,52 @@
         return logcmdutil.changesetdisplayer(ui, repo,
                                              {b'template': default_spec}).show
 
+if util.safehasattr(cmdutil, 'check_at_most_one_arg'):
+    def check_at_most_one_arg(opts, *args):
+        return cmdutil.check_at_most_one_arg(opts, *args)
+else:
+    # hg <= 5.2 (d587937600be)
+    def check_at_most_one_arg(opts, *args):
+        def to_display(name):
+            return pycompat.sysbytes(name).replace(b'_', b'-')
+
+        if util.safehasattr(error, 'InputError'):
+            err = error.InputError
+        else:
+            # hg <= 5.6 (8d72e29ad1e0)
+            err = error.Abort
+        previous = None
+        for x in args:
+            if opts.get(x):
+                if previous:
+                    raise err(_(b'cannot specify both --%s and --%s')
+                              % (to_display(previous), to_display(x)))
+                previous = x
+        return previous
+
+if util.safehasattr(cmdutil, 'check_incompatible_arguments'):
+    def check_incompatible_arguments(opts, first, others):
+        return cmdutil.check_incompatible_arguments(opts, first, others)
+else:
+    # hg <= 5.2 (023ad45e2fd2)
+    def check_incompatible_arguments(opts, first, others):
+        for other in others:
+            check_at_most_one_arg(opts, first, other)
+
+# allowdivergenceopt is a much newer addition to obsolete.py
+# hg <= 5.8 (ba6881c6a178)
+allowdivergenceopt = b'allowdivergence'
+def isenabled(repo, option):
+    if option == allowdivergenceopt:
+        if obsolete._getoptionvalue(repo, obsolete.createmarkersopt):
+            return obsolete._getoptionvalue(repo, allowdivergenceopt)
+        else:
+            # note that we're not raising error.Abort when divergence is
+            # allowed, but creating markers is not, even on older hg versions
+            return False
+    else:
+        return obsolete.isenabled(repo, option)
+
 if util.safehasattr(dirstate.dirstate, 'set_clean'):
     movedirstate = scmutil.movedirstate
 else:  # hg <= 5.8 (8a50fb0784a9)
--- a/hgext3rd/evolve/evolvecmd.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/evolvecmd.py	Fri Aug 13 20:25:11 2021 +0200
@@ -300,7 +300,7 @@
         ui.write_err(hint)
         return (False, b".")
 
-    if not (divergent.mutable() and other.mutable()):
+    if not divergent.mutable():
         # Public divergence: we keep public one to local side while merging
         # When public branch is behind to the mutable branch, for now we
         # relocate mutable cset to public one's side in every case.
@@ -310,9 +310,8 @@
         #
         # Otherwise, we are going to rebase the "behind" branch up to the new
         # brancmap level.
-        publicdiv = divergent if other.mutable() else other
-        resolutionparent = publicdiv.p1().rev()
-        evolvestate[b'public-divergent'] = publicdiv.node()
+        resolutionparent = divergent.p1().rev()
+        evolvestate[b'public-divergent'] = divergent.node()
         return (True, resolutionparent)
 
     otherp1 = succsotherp1 = other.p1().rev()
@@ -447,10 +446,12 @@
         ui.write_err(msg)
         return (False, b".")
     other = others[0]
+    evolvestate[b'orig-divergent'] = divergent.node()
+    if not other.mutable():
+        divergent, other = other, divergent
     evolvestate[b'divergent'] = divergent.node()
     evolvestate[b'other-divergent'] = other.node()
     evolvestate[b'base'] = base.node()
-    evolvestate[b'orig-divergent'] = divergent.node()
 
     # sometimes we will relocate a node in case of different parents and we can
     # encounter conflicts after relocation is done while solving
@@ -531,10 +532,7 @@
         evolvestate[b'other-divergent'] = newother
         other = repo[newother]
 
-    localside, otherside = divergent, other
-    if not otherside.mutable():
-        localside, otherside = other, divergent
-    _mergecontentdivergents(repo, progresscb, localside, otherside, base,
+    _mergecontentdivergents(repo, progresscb, divergent, other, base,
                             evolvestate)
     res, newnode = _completecontentdivergent(ui, repo, progresscb, divergent,
                                              other, base, evolvestate)
@@ -555,7 +553,7 @@
         if newnode == publicdiv.node():
             # case 2)
             pubstr = bytes(publicdiv)
-            othstr = bytes(otherside)
+            othstr = bytes(other)
             msg = _(b'content divergence resolution between %s '
                     b'(public) and %s has same content as %s, '
                     b'discarding %s\n')
@@ -575,7 +573,7 @@
                      local)
         compat.update(local)
     # merging the two content-divergent changesets
-    repo.ui.note(_(b"merging \"other\" %s changeset '%s'\n") %
+    repo.ui.note(_(b"merging \"other\" %s changeset %s\n") %
                  (TROUBLES['CONTENTDIVERGENT'], other))
     if progresscb:
         progresscb()
@@ -652,9 +650,6 @@
         else:
             date = max(divergent.date(), other.date())
 
-    localside, otherside = divergent, other
-    if not otherside.mutable():
-        localside, otherside = other, divergent
     # We really want a new commit in order to avoid obsmarker cycles (otherwise
     # divergence resolutions done in separate repos may create markers in the
     # opposite directions). For that reason, we set ui.allowemptycommit and
@@ -664,8 +659,8 @@
         {(b'ui', b'allowemptycommit'): b'true'}, b'evolve'
     ):
         extra = {
-            b'divergence_source_local': localside.hex(),
-            b'divergence_source_other': otherside.hex()
+            b'divergence_source_local': divergent.hex(),
+            b'divergence_source_other': other.hex()
         }
         newnode = repo.commit(text=desc, user=user, date=date, extra=extra)
     new = repo[newnode]
@@ -1118,8 +1113,8 @@
     return revs
 
 def _dedupedivergents(repo, revs):
-    """Dedupe the divergents revs in revs to get one from each group with the
-    lowest revision numbers
+    """Dedupe the divergents revs in revs to get one from each group which
+    will be used as p1 while merging the divergent csets
     """
     repo = repo.unfiltered()
     res = set()
@@ -1131,10 +1126,42 @@
         divergent = repo[rev]
         base, others = divergentdata(divergent)
         othersrevs = [o.rev() for o in others]
-        res.add(min([divergent.rev()] + othersrevs))
-        discarded.update(othersrevs)
+        all_divergents = othersrevs + [divergent.rev()]
+        pick, discard = _pick_latest_divergent(repo, all_divergents)
+        res.add(pick)
+        discarded.update(discard)
     return res
 
+def _pick_latest_divergent(repo, divergent_revs):
+    """On the basis of evolution date, pick out the latest evolved revision
+    from all the `divergent_revs` (which are divergent with each other)
+
+    Return a tuple (latest_evolved, others)
+    """
+    mapping = []
+    for rev in divergent_revs:
+        led = latest_evolution_date(repo, repo[rev])
+        # For purpose of comparing, from `led` which is (unixtime, offset)
+        # we only need `unixtime`.
+        mapping.append((led[0], rev))
+    # Sorting by negating the `rev` in key func, to fallback to the old way
+    # of selecting revision, in case when `led` is same while comparing.
+    # Old way: was to select the one with minimum revision number
+    mapping = sorted(mapping, key=lambda v: (v[0], -v[1]))
+    latest_evolved = mapping[-1][1]
+    others = mapping[:-1]
+    others = [val[1] for val in others[:]]
+    return latest_evolved, others
+
+def latest_evolution_date(repo, ctx):
+    """Return latest evolution date of a changeset `ctx`"""
+    node = ctx.node()
+    pred = list(obsutil.closestpredecessors(repo, node))
+    pred.append(node)
+    markers = obsutil.getmarkers(repo, nodes=pred, exclusive=True)
+    markers_dates = (m.date() for m in markers)
+    return max(markers_dates)
+
 def divergentdata(ctx):
     """return base, other part of a conflict
 
@@ -1447,28 +1474,6 @@
         if opts['all']:
             raise error.Abort(_(b'cannot specify both "--rev" and "--all"'))
 
-    # Backward compatibility
-    if opts['unstable']:
-        msg = (b"'evolve --unstable' is deprecated, "
-               b"use 'evolve --orphan'")
-        repo.ui.deprecwarn(msg, b'4.4')
-
-        opts['orphan'] = opts['divergent']
-
-    if opts['divergent']:
-        msg = (b"'evolve --divergent' is deprecated, "
-               b"use 'evolve --content-divergent'")
-        repo.ui.deprecwarn(msg, b'4.4')
-
-        opts['content_divergent'] = opts['divergent']
-
-    if opts['bumped']:
-        msg = (b"'evolve --bumped' is deprecated, "
-               b"use 'evolve --phase-divergent'")
-        repo.ui.deprecwarn(msg, b'4.4')
-
-        opts['phase_divergent'] = opts['bumped']
-
     return opts
 
 def _cleanup(ui, repo, startnode, shouldupdate, headnode):
@@ -1529,11 +1534,8 @@
       _(b'also consider troubled changesets unrelated to current working '
         b'directory')),
      (b'r', b'rev', [], _(b'solves troubles of these revisions'), _(b'REV')),
-     (b'', b'bumped', False, _(b'solves only bumped changesets (DEPRECATED)')),
      (b'', b'phase-divergent', False, _(b'solves only phase-divergent changesets')),
-     (b'', b'divergent', False, _(b'solves only divergent changesets (DEPRECATED)')),
      (b'', b'content-divergent', False, _(b'solves only content-divergent changesets')),
-     (b'', b'unstable', False, _(b'solves only unstable changesets (DEPRECATED)')),
      (b'', b'orphan', False, _(b'solves only orphan changesets (default)')),
      (b'a', b'all', None, _(b'evolve all troubled changesets related to the current'
                             b' working directory and its descendants (default)')),
@@ -2075,10 +2077,7 @@
                 evolvestate[b'other-divergent'] = newother
                 other = repo[newother]
             # continue the resolution by merging the content-divergent csets
-            localside, otherside = divergent, other
-            if not otherside.mutable():
-                localside, otherside = other, divergent
-            _mergecontentdivergents(repo, progresscb, localside, otherside,
+            _mergecontentdivergents(repo, progresscb, divergent, other,
                                     base, evolvestate)
 
         if evolvestate[b'relocating-other']:
@@ -2093,10 +2092,7 @@
             evolvestate[b'other-divergent'] = newother
             other = repo[newother]
             # continue the resolution by merging the content-divergent csets
-            localside, otherside = divergent, other
-            if not otherside.mutable():
-                localside, otherside = other, divergent
-            _mergecontentdivergents(repo, progresscb, localside, otherside,
+            _mergecontentdivergents(repo, progresscb, divergent, other,
                                     base, evolvestate)
 
         res, newnode = _completecontentdivergent(ui, repo, progresscb,
--- a/hgext3rd/evolve/metadata.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/metadata.py	Fri Aug 13 20:25:11 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.4.dev'
+__version__ = b'10.4.0.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 5.9'
 minimumhgversion = b'4.6'
 buglink = b'https://bz.mercurial-scm.org/'
--- a/hgext3rd/evolve/obsdiscovery.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/obsdiscovery.py	Fri Aug 13 20:25:11 2021 +0200
@@ -47,7 +47,7 @@
     stablerangecache,
 )
 
-from mercurial import wireprototypes, wireprotov1server
+from mercurial import wireprotov1server
 from mercurial.wireprotov1peer import wirepeer
 from mercurial.wireprototypes import encodelist, decodelist
 
@@ -63,7 +63,6 @@
 eh.configitem(b'experimental', b'obshashrange', True)
 eh.configitem(b'experimental', b'obshashrange.warm-cache', b'auto')
 eh.configitem(b'experimental', b'obshashrange.max-revs', None)
-eh.configitem(b'experimental', b'obshashrange.lru-size', 2000)
 
 ##################################
 ###  Code performing discovery ###
@@ -729,23 +728,13 @@
     caps = orig(repo, proto)
     enabled = _useobshashrange(repo)
     if obsolete.isenabled(repo, obsolete.exchangeopt) and enabled:
-        caps = caps.data.split()
         caps.append(b'_evoext_obshashrange_v1')
-        caps.sort()
-        caps = wireprototypes.bytesresponse(b' '.join(caps))
     return caps
 
 @eh.extsetup
 def obshashrange_extsetup(ui):
-    ###
-    extensions.wrapfunction(wireprotov1server, 'capabilities',
+    extensions.wrapfunction(wireprotov1server, '_capabilities',
                             _obshashrange_capabilities)
-    # wrap command content
-    oldcap, args = wireprotov1server.commands[b'capabilities']
-
-    def newcap(repo, proto):
-        return _obshashrange_capabilities(oldcap, repo, proto)
-    wireprotov1server.commands[b'capabilities'] = (newcap, args)
 
 ##########################################
 ###  trigger discovery during exchange ###
--- a/hgext3rd/evolve/obsexchange.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/obsexchange.py	Fri Aug 13 20:25:11 2021 +0200
@@ -117,15 +117,11 @@
         else:
             exchange.buildobsmarkerspart(bundler, markers)
 
-# manual wrap up in extsetup because of the wireproto.commands mapping
 def _obscommon_capabilities(orig, repo, proto):
     """wrapper to advertise new capability"""
     caps = orig(repo, proto)
     if obsolete.isenabled(repo, obsolete.exchangeopt):
-        caps = caps.data.split()
         caps.append(b'_evoext_getbundle_obscommon')
-        caps.sort()
-        caps = wireprototypes.bytesresponse(b' '.join(caps))
     return caps
 
 @eh.extsetup
@@ -140,14 +136,8 @@
         return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
     exchange.getbundle2partsmapping[b'obsmarkers'] = newfunc
 
-    extensions.wrapfunction(wireprotov1server, 'capabilities',
+    extensions.wrapfunction(wireprotov1server, '_capabilities',
                             _obscommon_capabilities)
-    # wrap command content
-    oldcap, args = wireprotov1server.commands[b'capabilities']
-
-    def newcap(repo, proto):
-        return _obscommon_capabilities(oldcap, repo, proto)
-    wireprotov1server.commands[b'capabilities'] = (newcap, args)
 
 abortmsg = b"won't exchange obsmarkers through pushkey"
 hint = b"upgrade your client or server to use the bundle2 protocol"
--- a/hgext3rd/evolve/rewriteutil.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/rewriteutil.py	Fri Aug 13 20:25:11 2021 +0200
@@ -24,6 +24,7 @@
     obsolete,
     obsutil,
     revset,
+    rewriteutil as corerewriteutil,
     util,
 )
 
@@ -57,6 +58,12 @@
 
     <action> can be used to control the commit message.
     """
+    # If this attribute exists, then core's rewriteutil is recent enough
+    # that it has all the features from our own implementation.
+    if util.safehasattr(corerewriteutil, 'find_new_divergence_from'):
+        return corerewriteutil.precheck(repo, revs, action)
+
+    # hg <= 5.8 (d90f6237)
     if node.nullrev in revs:
         msg = _(b"cannot %s the null revision") % (action)
         hint = _(b"no changeset checked out")
@@ -78,8 +85,7 @@
         hint = _(b"see 'hg help evolution.instability'")
         raise error.Abort(msg, hint=hint)
     divrisk = revs_hascontentdivrisk(repo, revs)
-    allowdivergence = repo.ui.configbool(b'experimental',
-                                         b'evolution.allowdivergence')
+    allowdivergence = compat.isenabled(repo, compat.allowdivergenceopt)
     if divrisk and not allowdivergence:
         localdiv = repo[divrisk[0]]
         otherdiv, base = repo[divrisk[1][0]], repo[divrisk[1][1]]
@@ -148,9 +154,9 @@
     if len(baseparents) > 2:
         raise error.Abort(_(b"cannot fold revisions that merge with more than "
                             b"one external changeset (not in revisions)"))
-    if not repo.ui.configbool(b'experimental', b'evolution.allowdivergence'):
-        obsolete = repo.revs(b'%ld and obsolete()', revs)
-        if obsolete:
+    if not compat.isenabled(repo, compat.allowdivergenceopt):
+        obsoleterevs = repo.revs(b'%ld and obsolete()', revs)
+        if obsoleterevs:
             msg = _(b'folding obsolete revisions may cause divergence')
             hint = _(b'set experimental.evolution.allowdivergence=yes'
                      b' to allow folding them')
@@ -173,7 +179,8 @@
         repo._bookmarks.applychanges(repo, tr, bmchanges)
         tr.close()
         for bookmark in sorted(bookmarks):
-            repo.ui.write(_(b"bookmark '%s' deleted\n") % bookmark)
+            b = repo.ui.label(bookmark, b'bookmarks')
+            repo.ui.write(_(b"bookmark '%s' deleted\n") % b)
     finally:
         lockmod.release(tr, lock, wlock)
 
--- a/hgext3rd/evolve/stablerange.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/evolve/stablerange.py	Fri Aug 13 20:25:11 2021 +0200
@@ -423,7 +423,7 @@
         (b'r', b'rev', [], b'operate on (rev, 0) ranges for rev in REVS'),
         (b'', b'subranges', False, b'recursively display data for subranges too'),
         (b'', b'verify', False, b'checks subranges content (EXPENSIVE)'),
-        (b'', b'method', b'branchpoint',
+        (b'', b'method', b'mergepoint',
          b'method to use, one of "branchpoint", "mergepoint"')
     ],
     _(b''))
--- a/hgext3rd/topic/__init__.py	Fri Aug 13 19:44:42 2021 +0200
+++ b/hgext3rd/topic/__init__.py	Fri Aug 13 20:25:11 2021 +0200
@@ -229,10 +229,9 @@
               # default color to help log output and thg
               # (first pick I could think off, update as needed
               b'log.topic': b'green_background',
-              b'topic.active': b'green',
               }
 
-__version__ = b'0.22.4.dev'
+__version__ = b'0.23.0.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 5.9'
 minimumhgversion = b'4.6'
@@ -670,7 +669,8 @@
                 csetcount = stack.stack(repo, topic=ct).changesetcount
                 empty = csetcount == 0
                 if empty and not ctwasempty:
-                    ui.status(b"active topic '%s' is now empty\n" % ct)
+                    ui.status(b"active topic '%s' is now empty\n"
+                              % ui.label(ct, b'topic.active'))
                     trnames = getattr(tr, 'names', getattr(tr, '_names', ()))
                     if (b'phase' in trnames
                             or any(n.startswith(b'push-response')
@@ -680,10 +680,10 @@
                 if ctwasempty and not empty:
                     if csetcount == 1:
                         msg = _(b"active topic '%s' grew its first changeset\n%s")
-                        ui.status(msg % (ct, hint))
+                        ui.status(msg % (ui.label(ct, b'topic.active'), hint))
                     else:
                         msg = _(b"active topic '%s' grew its %d first changesets\n%s")
-                        ui.status(msg % (ct, csetcount, hint))
+                        ui.status(msg % (ui.label(ct, b'topic.active'), csetcount, hint))
 
             tr.addpostclose(b'signalcurrenttopicempty', currenttopicempty)
             return tr
@@ -870,7 +870,8 @@
 
     if topic:
         if not ct:
-            ui.status(_(b'marked working directory as topic: %s\n') % topic)
+            ui.status(_(b'marked working directory as topic: %s\n')
+                      % ui.label(topic, b'topic.active'))
         return _changecurrenttopic(repo, topic)
 
     ui.pager(b'topics')
@@ -958,8 +959,8 @@
 
             revnum = repo[node].rev()
             if len(nodetobook[node]) > 1:
-                ui.status(_(b"skipping revision '%d' as it has multiple bookmarks "
-                          b"on it\n") % revnum)
+                ui.status(_(b"skipping revision %d as it has multiple "
+                            b"bookmarks on it\n") % revnum)
                 return
             targetrevs = _findconvertbmarktopic(repo, bookmark)
             if targetrevs:
@@ -971,8 +972,8 @@
                 if revnum in skipped:
                     continue
                 if len(nodetobook[revnode]) > 1:
-                    ui.status(_(b"skipping '%d' as it has multiple bookmarks on"
-                              b" it\n") % revnum)
+                    ui.status(_(b"skipping revision %d as it has multiple "
+                                b"bookmarks on it\n") % revnum)
                     skipped.append(revnum)
                     continue
                 if bmark == b'@':
--- a/tests/test-amend-patch.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-amend-patch.t	Fri Aug 13 20:25:11 2021 +0200
@@ -655,7 +655,7 @@
   $ HGEDITOR=cat hg amend --patch
   abort: cannot amend public changesets: 36454bda1fdb
   (see 'hg help phases' for details)
-  [255]
+  [10]
 
   $ hg phase -r . --draft --force
 
--- a/tests/test-amend.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-amend.t	Fri Aug 13 20:25:11 2021 +0200
@@ -199,16 +199,16 @@
 when rewritting an already rewritten changeset (i.e cset being rewritten will
 be the base of divergence)
   $ hg amend -m "i am gonna create divergence"
-  abort: amend of 9092f1db7931 creates content-divergence with aafaf407b00d
+  abort: cannot amend 9092f1db7931, as that creates content-divergence with aafaf407b00d
   (add --verbose for details or see 'hg help evolution.instability')
-  [255]
+  [10]
   $ hg amend -m "i am gonna create divergence" --verbose
-  abort: amend of 9092f1db7931 creates content-divergence with aafaf407b00d
-      changeset 9092f1db7931 already have a successors as changeset aafaf407b00d
+  abort: cannot amend 9092f1db7931, as that creates content-divergence with aafaf407b00d
+      changeset 9092f1db7931 already has a successor in changeset aafaf407b00d
       rewriting changeset 9092f1db7931 would create "content-divergence"
-      set experimental.evolution.allowdivergence=True to overwrite this check
+      set experimental.evolution.allowdivergence=True to skip this check
   (see 'hg help evolution.instability' for details on content-divergence)
-  [255]
+  [10]
 
 when rewritting a cset which has a predecessor with non-obsolete successor
 
@@ -229,14 +229,14 @@
 
   $ hg evolve -l
   $ hg amend -m "i am gonna create divergence"
-  abort: amend of f8c05838af90 creates content-divergence with aafaf407b00d, from 9092f1db7931
+  abort: cannot amend f8c05838af90, as that creates content-divergence with aafaf407b00d, from 9092f1db7931
   (add --verbose for details or see 'hg help evolution.instability')
-  [255]
+  [10]
   $ hg amend -m "i am gonna create divergence" --verbose
-  abort: amend of f8c05838af90 creates content-divergence with aafaf407b00d, from 9092f1db7931
-      changeset f8c05838af90 is an evolution of changeset 9092f1db7931
-      changeset 9092f1db7931 already have a successors as changeset aafaf407b00d
+  abort: cannot amend f8c05838af90, as that creates content-divergence with aafaf407b00d, from 9092f1db7931
+      changeset f8c05838af90 is a successor of changeset 9092f1db7931
+      changeset 9092f1db7931 already has a successor in changeset aafaf407b00d
       rewriting changeset f8c05838af90 would create "content-divergence"
-      set experimental.evolution.allowdivergence=True to overwrite this check
+      set experimental.evolution.allowdivergence=True to skip this check
   (see 'hg help evolution.instability' for details on content-divergence)
-  [255]
+  [10]
--- a/tests/test-check-sdist.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-check-sdist.t	Fri Aug 13 20:25:11 2021 +0200
@@ -35,7 +35,7 @@
 
   $ tar -tzf hg-evolve-*.tar.gz | sed 's|^hg-evolve-[^/]*/||' | sort > files
   $ wc -l files
-  350 files
+  351 files
   $ fgrep debian files
   tests/test-check-debian.t
   $ fgrep __init__.py files
--- a/tests/test-discovery-obshashrange-cache.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-discovery-obshashrange-cache.t	Fri Aug 13 20:25:11 2021 +0200
@@ -8,9 +8,6 @@
   $ cat << EOF >> $HGRCPATH
   > [extensions]
   > evolve =
-  > blackbox =
-  > [defaults]
-  > blackbox = -l 100
   > [experimental]
   > obshashrange=1
   > verbose-obsolescence-exchange=1
--- a/tests/test-evolve-content-divergent-basic.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-content-divergent-basic.t	Fri Aug 13 20:25:11 2021 +0200
@@ -517,7 +517,7 @@
   merge:[3] More addition
   with: [2] More addition
   base: [1] More addition
-  merging "other" content-divergent changeset 'fc6349f931da'
+  merging "other" content-divergent changeset fc6349f931da
   resolving manifests
   merging a
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
--- a/tests/test-evolve-content-divergent-interrupted.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-content-divergent-interrupted.t	Fri Aug 13 20:25:11 2021 +0200
@@ -376,7 +376,7 @@
 this test case is mainly to test that we hit merge conlict while merging the
 two divergent csets, so resolving this one which happened during relocation
   $ echo a > a
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
--- a/tests/test-evolve-content-divergent-stack.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-content-divergent-stack.t	Fri Aug 13 20:25:11 2021 +0200
@@ -274,7 +274,7 @@
   (see 'hg help evolve.interrupted')
   [240]
   $ echo c > c
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -303,7 +303,7 @@
   +new_file
 
   $ echo c > c
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
   $ hg evolve -c
@@ -545,7 +545,7 @@
   [240]
 
   $ echo b > b
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
   $ hg evolve --continue
@@ -558,7 +558,7 @@
   [240]
 
   $ echo b > b
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
   $ hg evolve --continue
@@ -867,7 +867,7 @@
   [240]
 
   $ echo foo > b
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
   $ hg evolve --continue
@@ -1149,14 +1149,14 @@
   o  0:bde1d2b6b5e5 added base
       () [default] draft
 
-  $ hg reb -r 10 -d 7
+  $ hg rebase -r 10 -d 7
   rebasing 10:9a1f460df8b5 "added dar"
   $ hg up 0 -q
   $ echo alpha > alpha
   $ hg ci -Am "added alpha"
   adding alpha
   created new head
-  $ hg reb -r 6 -d 'desc("added alpha")'
+  $ hg rebase -r 6 -d 'desc("added alpha")'
   rebasing 6:57a3f8edf065 "added dar"
   $ hg evolve --content-divergent
   skipping 8b68d5104188: have a different parent than cf9a46e19942 (not handled yet)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve-content-divergent-user-independent-resolution.t	Fri Aug 13 20:25:11 2021 +0200
@@ -0,0 +1,127 @@
+=====================================
+Testing content-divergence resolution
+=====================================
+
+Independent rewrites of same changeset can lead to content-divergence. In most
+common cases, it can occur when multiple users rewrite the same changeset
+independently and push it.
+
+This test aims to check that the resolution of content-divergent changesets is
+independent of the user resolving the divergence. In other words, the two users
+resolving the same divergence should end up with the same result.
+
+Setup
+-----
+  $ . $TESTDIR/testlib/content-divergence-util.sh
+  $ setuprepos user-independent-resolution
+  creating test repo for test case user-independent-resolution
+  - upstream
+  - local
+  - other
+  cd into `local` and proceed with env setup
+
+initial
+
+  $ cd upstream
+  $ mkcommit A0
+
+  $ cd ../local
+  $ hg pull -uq
+  $ hg amend -m "A1" --config devel.default-date='172800 19800'
+
+  $ cd ../other
+  $ hg pull -uq
+  $ hg amend -d '2 0' --config devel.default-date='86400 7200'
+  $ hg push -q
+
+  $ cd ../local
+  $ hg push -q
+  2 new content-divergent changesets
+  $ hg pull -q
+  2 new content-divergent changesets
+
+'local' amended desc, 'other' amended date
+------------------------------------------
+  $ hg log -G
+  *  3:1a0af03d20ad (draft): A0 [content-divergent]
+  |
+  | @  2:0d8c87cec5fc (draft): A1 [content-divergent]
+  |/
+  o  0:a9bdc8b26820 (public): O
+  
+  $ hg evolve --content-div
+  merge:[2] A1
+  with: [3] A0
+  base: [1] A0
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 276e2aee8fe1
+  $ hg log -G
+  @  4:276e2aee8fe1 (draft): A1
+  |
+  o  0:a9bdc8b26820 (public): O
+  
+  $ hg evolve -l
+
+'local' amended date, 'other' amended desc
+------------------------------------------
+  $ cd ../other
+  $ hg pull -q
+  2 new content-divergent changesets
+  $ hg log -G
+  *  3:0d8c87cec5fc (draft): A1 [content-divergent]
+  |
+  | @  2:1a0af03d20ad (draft): A0 [content-divergent]
+  |/
+  o  0:a9bdc8b26820 (public): O
+  
+  $ hg evolve --content-div
+  merge:[3] A1
+  with: [2] A0
+  base: [1] A0
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 276e2aee8fe1
+
+  $ hg log -G
+  @  4:276e2aee8fe1 (draft): A1
+  |
+  o  0:a9bdc8b26820 (public): O
+  
+  $ hg evolve -l
+
+both users can push/pull without any issue
+------------------------------------------
+
+  $ hg push
+  pushing to $TESTTMP/user-independent-resolution/upstream
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 0 changes to 1 files (+1 heads)
+  2 new obsolescence markers
+  obsoleted 2 changesets
+  $ hg pull ../local
+  pulling from ../local
+  searching for changes
+  no changes found
+  $ hg debugobsolete -r tip
+  0d8c87cec5fc1540b7c0324332375d530856fb56 276e2aee8fe1d3aae5e21dfee47be818fba8d7fc 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '32', 'operation': 'evolve', 'user': 'test'}
+  1a0af03d20ad8b4e3a99d30620c8734efe076900 276e2aee8fe1d3aae5e21dfee47be818fba8d7fc 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'evolve', 'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0d8c87cec5fc1540b7c0324332375d530856fb56 0 (Fri Jan 02 18:30:00 1970 -0530) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 1a0af03d20ad8b4e3a99d30620c8734efe076900 0 (Thu Jan 01 22:00:00 1970 -0200) {'ef1': '32', 'operation': 'amend', 'user': 'test'}
+
+  $ cd ../local
+  $ hg push
+  pushing to $TESTTMP/user-independent-resolution/upstream
+  searching for changes
+  no changes found
+  [1]
+  $ hg pull ../other
+  pulling from ../other
+  searching for changes
+  no changes found
+  $ hg debugobsolete -r tip
+  0d8c87cec5fc1540b7c0324332375d530856fb56 276e2aee8fe1d3aae5e21dfee47be818fba8d7fc 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '32', 'operation': 'evolve', 'user': 'test'}
+  1a0af03d20ad8b4e3a99d30620c8734efe076900 276e2aee8fe1d3aae5e21dfee47be818fba8d7fc 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'evolve', 'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0d8c87cec5fc1540b7c0324332375d530856fb56 0 (Fri Jan 02 18:30:00 1970 -0530) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 1a0af03d20ad8b4e3a99d30620c8734efe076900 0 (Thu Jan 01 22:00:00 1970 -0200) {'ef1': '32', 'operation': 'amend', 'user': 'test'}
--- a/tests/test-evolve-continue.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-continue.t	Fri Aug 13 20:25:11 2021 +0200
@@ -473,7 +473,7 @@
   $ echo 2b > a
   $ hg amend -q
   1 new orphan changesets
-  $ hg ev -q
+  $ hg evolve -q
   warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
   unresolved merge conflicts
   (see 'hg help evolve.interrupted')
--- a/tests/test-evolve-obshistory-complex.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-obshistory-complex.t	Fri Aug 13 20:25:11 2021 +0200
@@ -170,7 +170,7 @@
   record this change to 'B'?
   (enter ? for help) [Ynesfdaq?] Y
   
-  no more change to split
+  no more changes to split
   $ hg split --rev "desc(fold1)" -d "0 0" << EOF
   > Y
   > Y
@@ -209,7 +209,7 @@
   record this change to 'D'?
   (enter ? for help) [Ynesfdaq?] Y
   
-  no more change to split
+  no more changes to split
   1 new orphan changesets
   $ hg split --rev "desc(fold2)" -d "0 0" << EOF
   > Y
@@ -249,7 +249,7 @@
   record this change to 'F'?
   (enter ? for help) [Ynesfdaq?] Y
   
-  no more change to split
+  no more changes to split
   1 new orphan changesets
   $ hg log -G
   @  changeset:   15:d4a000f63ee9
--- a/tests/test-evolve-obshistory-lots-of-splits.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-obshistory-lots-of-splits.t	Fri Aug 13 20:25:11 2021 +0200
@@ -134,7 +134,7 @@
   record this change to 'd'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
 
   $ hg log --hidden -G
   @  changeset:   5:c7f044602e9b
--- a/tests/test-evolve-obshistory-split.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-obshistory-split.t	Fri Aug 13 20:25:11 2021 +0200
@@ -71,7 +71,7 @@
   record this change to 'b'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
 
   $ sync
 
--- a/tests/test-evolve-phase-divergence.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-phase-divergence.t	Fri Aug 13 20:25:11 2021 +0200
@@ -8,7 +8,6 @@
   > glog = log -GT "{rev}:{node|short} {desc|firstline}\n ({bookmarks}) {phase}"
   > [extensions]
   > rebase =
-  > [extensions]
   > evolve =
   > EOF
 
@@ -27,8 +26,6 @@
   adding a
   $ cd ..
 
-  $ evolvepath=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/
-
 Setting up a private non-publishing repo
 ----------------------------------------
 
--- a/tests/test-evolve-public-content-divergent-corner-cases.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-public-content-divergent-corner-cases.t	Fri Aug 13 20:25:11 2021 +0200
@@ -388,10 +388,10 @@
   
 
   $ hg evolve --content-divergent --any --update
-  merge:[4] added c e
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added c e
   base: [3] added d
-  rebasing "divergent" content-divergent changeset e568fd1029bb on 155349b645be
+  rebasing "other" content-divergent changeset e568fd1029bb on 155349b645be
   merging c
   warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
   unresolved merge conflicts
@@ -415,7 +415,7 @@
   +e
 
   $ echo c > c
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
--- a/tests/test-evolve-public-content-divergent-discard.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-public-content-divergent-discard.t	Fri Aug 13 20:25:11 2021 +0200
@@ -89,8 +89,8 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[3] added ch
-  with: [4] added c
+  merge:[4] added c
+  with: [3] added ch
   base: [2] added c
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   other divergent changeset 90522bccf499 has same content as local f7c1071f1e7c and differs by "description" only, discarding 90522bccf499
@@ -98,7 +98,7 @@
 
   $ hg evolve -l
 
-  $ hg par
+  $ hg parents
   changeset:   4:f7c1071f1e7c
   tag:         tip
   parent:      1:5f6d8a4bf34a
@@ -180,17 +180,17 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[4] added dh
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added dh
   base: [3] added d
-  rebasing "divergent" content-divergent changeset 5acd58ef5066 on 155349b645be
+  rebasing "other" content-divergent changeset 5acd58ef5066 on 155349b645be
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   other divergent changeset ae3429430ef1 has same content as local e800202333a4 and differs by "description" only, discarding ae3429430ef1
   content divergence resolution between e800202333a4 (public) and ae3429430ef1 has same content as e800202333a4, discarding ae3429430ef1
 
   $ hg evolve -l
 
-  $ hg par
+  $ hg parents
   changeset:   5:e800202333a4
   tag:         tip
   parent:      2:155349b645be
@@ -265,8 +265,8 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[3] added ch
-  with: [4] added c
+  merge:[4] added c
+  with: [3] added ch
   base: [2] added c
   merging ch
   warning: conflicts while merging ch! (edit, then use 'hg resolve --mark')
@@ -287,7 +287,7 @@
   +>>>>>>> other: 229da2719b19 - test: added ch
 
   $ echo ch > ch
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -296,7 +296,7 @@
 
   $ hg evolve -l
 
-  $ hg par
+  $ hg parents
   changeset:   4:f7c1071f1e7c
   tag:         tip
   parent:      1:5f6d8a4bf34a
@@ -379,10 +379,10 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[4] added dh
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added dh
   base: [3] added d
-  rebasing "divergent" content-divergent changeset f89a8e2f86ac on 155349b645be
+  rebasing "other" content-divergent changeset f89a8e2f86ac on 155349b645be
   merging c
   warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
   unresolved merge conflicts
@@ -390,7 +390,7 @@
   [240]
 
   $ echo c > c
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -401,7 +401,7 @@
 
   $ hg evolve -l
 
-  $ hg par
+  $ hg parents
   changeset:   5:e800202333a4
   tag:         tip
   parent:      2:155349b645be
@@ -483,10 +483,10 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[4] added dh
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added dh
   base: [3] added d
-  rebasing "divergent" content-divergent changeset db0b7bba0aae on 155349b645be
+  rebasing "other" content-divergent changeset db0b7bba0aae on 155349b645be
   merging dh
   warning: conflicts while merging dh! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -495,7 +495,7 @@
   [240]
 
   $ echo dh > dh
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -504,7 +504,7 @@
 
   $ hg evolve -l
 
-  $ hg par
+  $ hg parents
   changeset:   5:e800202333a4
   tag:         tip
   parent:      2:155349b645be
@@ -587,10 +587,10 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[4] added dh
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added dh
   base: [3] added d
-  rebasing "divergent" content-divergent changeset 67b19bbd770f on 155349b645be
+  rebasing "other" content-divergent changeset 67b19bbd770f on 155349b645be
   merging c
   warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
   unresolved merge conflicts
@@ -598,7 +598,7 @@
   [240]
 
   $ echo c > c
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -612,7 +612,7 @@
   [240]
 
   $ echo dh > dh
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -621,7 +621,7 @@
 
   $ hg evolve -l
 
-  $ hg par
+  $ hg parents
   changeset:   5:e800202333a4
   tag:         tip
   parent:      2:155349b645be
--- a/tests/test-evolve-public-content-divergent-main.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-public-content-divergent-main.t	Fri Aug 13 20:25:11 2021 +0200
@@ -353,10 +353,10 @@
       public
   
   $ hg evolve --content-divergent --any --update
-  merge:[4] added d c e
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added d c e
   base: [3] added d
-  rebasing "divergent" content-divergent changeset f31bcc378766 on 155349b645be
+  rebasing "other" content-divergent changeset f31bcc378766 on 155349b645be
   merging c
   warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
   unresolved merge conflicts
@@ -385,7 +385,7 @@
   +e
 
   $ echo c > c
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -483,10 +483,10 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[4] added d
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added d
   base: [3] added d
-  rebasing "divergent" content-divergent changeset 9411ad1fe615 on 155349b645be
+  rebasing "other" content-divergent changeset 9411ad1fe615 on 155349b645be
   merging d
   warning: conflicts while merging d! (edit, then use 'hg resolve --mark')
   0 files updated, 0 files merged, 0 files removed, 1 files unresolved
@@ -495,7 +495,7 @@
   [240]
 
   $ echo d > d
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -576,10 +576,10 @@
       public
   
   $ hg evolve --content-divergent --any
-  merge:[4] added c e
-  with: [5] added d
+  merge:[5] added d
+  with: [4] added c e
   base: [3] added d
-  rebasing "divergent" content-divergent changeset 3c17c7afaf6e on 155349b645be
+  rebasing "other" content-divergent changeset 3c17c7afaf6e on 155349b645be
   merging c
   warning: conflicts while merging c! (edit, then use 'hg resolve --mark')
   unresolved merge conflicts
@@ -608,7 +608,7 @@
   +e
 
   $ echo cfoo > c
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
@@ -622,7 +622,7 @@
   [240]
 
   $ echo d > d
-  $ hg res -m
+  $ hg resolve -m
   (no more unresolved files)
   continue: hg evolve --continue
 
--- a/tests/test-evolve-serveronly-legacy.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-serveronly-legacy.t	Fri Aug 13 20:25:11 2021 +0200
@@ -11,7 +11,6 @@
   > bundle2-exp=False # < Mercurial-4.0
   > [devel]
   > legacy.exchange=bundle1
-  > [extensions]
   > EOF
 
   $ mkcommit() {
--- a/tests/test-evolve-split.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-split.t	Fri Aug 13 20:25:11 2021 +0200
@@ -1,5 +1,6 @@
-Check that evolve shows error while handling split commits
---------------------------------------
+Check that evolve can handle split commits
+------------------------------------------
+
   $ cat >> $HGRCPATH <<EOF
   > [ui]
   > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline}\n
--- a/tests/test-evolve-templates.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve-templates.t	Fri Aug 13 20:25:11 2021 +0200
@@ -327,7 +327,7 @@
   record this change to 'b'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
 
   $ hg log --hidden -G
   @  changeset:   3:f257fde29c7a
--- a/tests/test-evolve.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-evolve.t	Fri Aug 13 20:25:11 2021 +0200
@@ -148,7 +148,7 @@
   $ hg prune 1
   abort: cannot prune public changesets: 7c3bad9141dc
   (see 'hg help phases' for details)
-  [255]
+  [10]
   $ hg log -r 1 --template '{rev} {phase} {obsolete}\n'
   1 public 
 
@@ -556,11 +556,11 @@
   crosschecking files in changesets and manifests
   checking files
   checked 3 changesets with 3 changes to 3 files
-  $ hg --config extensions.hgext.mq= strip 'extinct()'
+  $ hg --config extensions.mq= strip 'extinct()'
   abort: empty revision set
   [255]
 (do some garbare collection)
-  $ hg --config extensions.hgext.mq= strip --hidden 'extinct()'  --config devel.strip-obsmarkers=no
+  $ hg --config extensions.mq= strip --hidden 'extinct()'  --config devel.strip-obsmarkers=no
   saved backup bundle to $TESTTMP/alpha/.hg/strip-backup/e87767087a57-a365b072-backup.hg (glob)
   $ hg verify
   checking changesets
@@ -1261,9 +1261,9 @@
   $ hg up 274b6cd0c101^
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ hg uncommit --all
-  abort: uncommit will orphan 4 descendants
+  abort: cannot uncommit changeset, as that will orphan 4 descendants
   (see 'hg help evolution.instability')
-  [255]
+  [10]
   $ hg up 274b6cd0c101
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg uncommit --all
@@ -1318,13 +1318,13 @@
   $ mkcommit c5_
   created new head
   $ hg prune '0ef9ff75f8e2 + f1b85956c48c'
-  abort: prune will orphan 1 descendants
+  abort: cannot prune changeset, as that will orphan 1 descendants
   (see 'hg help evolution.instability')
-  [255]
+  [10]
   $ hg prune '98e171e2f272::0d9203b74542'
-  abort: prune will orphan 1 descendants
+  abort: cannot prune changeset, as that will orphan 1 descendants
   (see 'hg help evolution.instability')
-  [255]
+  [10]
   $ hg prune '0ef9ff75f8e2::'
   3 changesets pruned
   $ glog -r "0cf3707e8971::"
--- a/tests/test-fold.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-fold.t	Fri Aug 13 20:25:11 2021 +0200
@@ -11,11 +11,6 @@
   > [ui]
   > logtemplate = '{rev} - {node|short} {desc|firstline} [{author}] ({phase}) {bookmarks}\n'
   > EOF
-  $ mkcommit() {
-  >    echo "$1" > "$1"
-  >    hg add "$1"
-  >    hg ci -qm "$1"
-  > }
 
   $ hg init fold-tests
   $ cd fold-tests/
@@ -52,7 +47,7 @@
   $ hg fold --exact null::
   abort: cannot fold the null revision
   (no changeset checked out)
-  [255]
+  [10]
   $ hg fold
   abort: no revisions specified
   [255]
@@ -86,7 +81,7 @@
   $ hg fold --from -r 0
   abort: cannot fold public changesets: 1ea73414a91b
   (see 'hg help phases' for details)
-  [255]
+  [10]
 
 Test actual folding
 
@@ -227,13 +222,13 @@
   > evolution = createmarkers, allnewcommands
   > EOF
   $ hg fold --from 'desc("r4")'
-  abort: fold will orphan 1 descendants
+  abort: cannot fold changeset, as that will orphan 1 descendants
   (see 'hg help evolution.instability')
-  [255]
+  [10]
   $ hg fold --from 'desc("r3")::desc("r11")'
-  abort: fold will orphan 1 descendants
+  abort: cannot fold changeset, as that will orphan 1 descendants
   (see 'hg help evolution.instability')
-  [255]
+  [10]
 
 test --user variant
 
@@ -319,6 +314,7 @@
   $ hg up null
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ mkcommit apple
+  created new head
   $ mkcommit banana
 
   $ hg merge
@@ -434,9 +430,9 @@
 
   $ hg fold --exact -r 'desc("A")::desc("B")' -m 'second fold' \
   >         --config experimental.evolution.allowdivergence=no
-  abort: fold of 4b34ecfb0d56 creates content-divergence with fcfd42a7fa46
+  abort: cannot fold 4b34ecfb0d56, as that creates content-divergence with fcfd42a7fa46
   (add --verbose for details or see 'hg help evolution.instability')
-  [255]
+  [10]
 
 but if we allow divergence, this should work and should create new content-divergent changesets
 
--- a/tests/test-issue-6028.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-issue-6028.t	Fri Aug 13 20:25:11 2021 +0200
@@ -155,7 +155,7 @@
 
 test that we successfully got rid of the bad file
 
-  $ hg d --git -r 'predecessors(.)' -r '.'
+  $ hg diff --git -r 'predecessors(.)' -r '.'
   diff --git a/a_bad_commit b/a_bad_commit
   deleted file mode 100644
   --- a/a_bad_commit
--- a/tests/test-metaedit.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-metaedit.t	Fri Aug 13 20:25:11 2021 +0200
@@ -74,7 +74,7 @@
   $ hg metaedit -r 0 --fold
   abort: cannot fold public changesets: ea207398892e
   (see 'hg help phases' for details)
-  [255]
+  [10]
   $ hg metaedit 'desc(C) + desc(F)' --fold
   abort: cannot fold non-linear revisions (multiple roots given)
   [255]
@@ -87,9 +87,9 @@
   (587528abfffe will become unstable and new unstable changes are not allowed)
   [255]
   $ hg metaedit 'desc(A)::desc(B)' --fold --config 'experimental.evolution=createmarkers, allnewcommands'
-  abort: fold will orphan 4 descendants
+  abort: cannot fold changeset, as that will orphan 4 descendants
   (see 'hg help evolution.instability')
-  [255]
+  [10]
   $ hg metaedit --user foobar
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg log --template '{rev}: {author}\n' -r 'desc(F):' --hidden
--- a/tests/test-obsolete.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-obsolete.t	Fri Aug 13 20:25:11 2021 +0200
@@ -1,17 +1,12 @@
 
   $ . $TESTDIR/testlib/common.sh
   $ cat >> $HGRCPATH <<EOF
-  > [web]
-  > push_ssl = false
-  > allow_push = *
   > [phases]
-  > publish=False
-  > [alias]
-  > debugobsolete=debugobsolete -d '0 0'
+  > publish = False
   > [extensions]
-  > hgext.rebase=
+  > rebase =
+  > evolve =
   > EOF
-  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
   $ mkcommit() {
   >    echo "$1" > "$1"
   >    hg add "$1"
--- a/tests/test-pick.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-pick.t	Fri Aug 13 20:25:11 2021 +0200
@@ -292,7 +292,7 @@
   $ hg pick -r 7c15c05db6fa
   abort: cannot pick public changesets: 7c15c05db6fa
   (see 'hg help phases' for details)
-  [255]
+  [10]
 
   $ hg glog
   @  10:c437988de89f foo to b
--- a/tests/test-prev-next.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-prev-next.t	Fri Aug 13 20:25:11 2021 +0200
@@ -229,7 +229,7 @@
 
 next with ambiguity in aspiring children
 
-  $ hg am -m 'added b (3)'
+  $ hg amend -m 'added b (3)'
   2 new orphan changesets
   $ hg next --no-evolve
   no children
@@ -564,7 +564,7 @@
   record this change to 'b'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
   1 new orphan changesets
 
   $ hg up 3 -q
@@ -611,6 +611,49 @@
 
   $ cd ..
 
+hg next --abort
+
+  $ hg init next-abort
+  $ cd next-abort
+
+  $ echo apple > a
+  $ hg ci -qAm apple
+  $ echo banana > b
+  $ hg ci -qAm banana
+  $ hg up 0
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo blueberry > b
+  $ hg ci -qAm 'apple and blueberry' --amend
+  1 new orphan changesets
+
+  $ hg next
+  move:[1] banana
+  atop:[2] apple and blueberry
+  merging b
+  warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
+  unresolved merge conflicts
+  (see 'hg help evolve.interrupted')
+  [240]
+
+  $ hg next --abort
+  next aborted
+  working directory is now at 1c7f51cf0ef0
+  $ hg next --abort
+  abort: no interrupted next to abort
+  [255]
+  $ hg evolve --abort
+  abort: no interrupted evolve to abort
+  [255]
+
+  $ hg next --abort --move-bookmark
+  abort: cannot specify both --abort and --move-bookmark
+  [10]
+  $ hg next --abort --merge
+  abort: cannot specify both --abort and --merge
+  [10]
+
+  $ cd ..
+
 Testing --merge and --evolve flags: 1 child, 1 aspchild, dirty working copy
 
   $ hg init next-dirty-evolve
--- a/tests/test-prune.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-prune.t	Fri Aug 13 20:25:11 2021 +0200
@@ -94,7 +94,7 @@
   $ hg prune 0
   abort: cannot prune public changesets: 1f0dee641bb7
   (see 'hg help phases' for details)
-  [255]
+  [10]
   $ hg debugobsolete
   9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'blah'}
   7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'test'}
@@ -482,7 +482,7 @@
   $ hg prune -r "desc('added c')"
   1 changesets pruned
 
-  $ hg par
+  $ hg parents
   1:5f6d8a4bf34a[] (obsolete/draft) added b
   working directory parent is obsolete! (5f6d8a4bf34a)
   (use 'hg evolve' to update to its parent successor)
--- a/tests/test-sharing.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-sharing.t	Fri Aug 13 20:25:11 2021 +0200
@@ -165,7 +165,7 @@
   $ hg amend -m 'fix bug 37'
   abort: cannot amend public changesets: 7b49f864d655
   (see 'hg help phases' for details)
-  [255]
+  [10]
 
 Figure SG05
   $ hg -R ../public shortlog -G
--- a/tests/test-split.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-split.t	Fri Aug 13 20:25:11 2021 +0200
@@ -88,7 +88,7 @@
   record this change to '_d'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
 
   $ hg debugobsolete
   1334a80b33c3f9873edab728fbbcf500eab61d2e d2fe56e71366c2c5376c89960c281395062c0619 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
@@ -140,7 +140,7 @@
   $ hg split --rev 'desc("_a")'
   abort: cannot split public changesets: 135f39f4bd78
   (see 'hg help phases' for details)
-  [255]
+  [10]
   $ hg phase --rev 'desc("_a")' --draft --force
 
 Split a revision specified with -r
@@ -352,9 +352,9 @@
   > evolutioncommands=split
   > EOF
   $ hg split -r "desc(split3)"
-  abort: split will orphan 4 descendants
+  abort: cannot split changeset, as that will orphan 4 descendants
   (see 'hg help evolution.instability')
-  [255]
+  [10]
 
 Changing evolution level to createmarkers
   $ echo "[experimental]" >> $HGRCPATH
@@ -562,7 +562,7 @@
   examine changes to 'SPLIT2'?
   (enter ? for help) [Ynesfdaq?] Y
   
-  no more change to split
+  no more changes to split
 
 The split changesets should be on the 'another-branch'
   $ hg log -G -l 3
@@ -875,7 +875,7 @@
   record this change to 'SPLIT3'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
 
   $ hg status --change '.~2'
   A SPLIT2
@@ -911,7 +911,7 @@
   record change 2/2 to 'SPLIT3'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
   $ hg status --change '.~1'
   A SPLIT2
   A SPLIT3
@@ -948,7 +948,7 @@
   
   continue splitting? [Ycdq?] d
   discarding remaining changes
-  no more change to split
+  no more changes to split
   $ hg status --change '.~1'
   A SPLIT2
   $ hg status --change '.'
@@ -981,7 +981,7 @@
   adding SPLIT2
   adding SPLIT3
   adding SPLIT4
-  no more change to split
+  no more changes to split
   $ hg status --change '.'
   A SPLIT2
   A SPLIT3
@@ -994,7 +994,7 @@
   adding SPLIT2
   adding SPLIT3
   adding SPLIT4
-  no more change to split
+  no more changes to split
   $ hg status --change '.~1'
   A SPLIT2
   $ hg status --change '.'
@@ -1011,7 +1011,7 @@
   adding SPLIT2
   adding SPLIT3
   adding SPLIT4
-  no more change to split
+  no more changes to split
   $ hg status --change '.~1'
   A SPLIT2
   A SPLIT3
@@ -1029,7 +1029,7 @@
   adding SPLIT2
   adding SPLIT3
   adding SPLIT4
-  no more change to split
+  no more changes to split
   $ hg status --change '.'
   A SPLIT2
   A SPLIT3
@@ -1112,7 +1112,7 @@
   record this change to 'b'?
   (enter ? for help) [Ynesfdaq?] y
   
-  no more change to split
+  no more changes to split
   1 new orphan changesets
 
   $ hg glog -p
--- a/tests/test-stablerange-branchpoint.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-stablerange-branchpoint.t	Fri Aug 13 20:25:11 2021 +0200
@@ -5,12 +5,26 @@
 
   $ cat << EOF >> $HGRCPATH
   > [extensions]
-  > hgext3rd.evolve =
+  > evolve =
   > [ui]
   > logtemplate = "{rev} {node|short} {desc} {tags}\n"
+  > EOF
+
+#testcases basic-branchpoint branchpoint
+
+#if basic-branchpoint
+  $ cat << EOF >> $HGRCPATH
+  > [defaults]
+  > debugstablerange = --method basic-branchpoint
+  > EOF
+#endif
+
+#if branchpoint
+  $ cat << EOF >> $HGRCPATH
   > [defaults]
   > debugstablerange = --method branchpoint
   > EOF
+#endif
 
 Simple linear test
 ==================
@@ -26,15 +40,14 @@
   bebd167eb94d 5
   c8d03c1b5e94 6
   f69452c5b1af 7
-  $ hg debugstablerange --verify --verbose --subranges --rev 1
+  $ hg debugstablerange --verify --verbose --subranges --rev 1 | tee 1.range
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 1 > 1.range
 
 bigger subset reuse most of the previous one
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 4
+  $ hg debugstablerange --verify --verbose --subranges --rev 4 | tee 4.range
   bebd167eb94d-0 (4, 5, 5) [complete] - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
@@ -44,7 +57,6 @@
   2dc09a01254d-3 (3, 4, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 4 > 4.range
   $ diff -u 1.range 4.range
   --- 1.range	* (glob)
   +++ 4.range	* (glob)
@@ -63,7 +75,7 @@
 Using a range not ending on 2**N boundary
 we fall back on 2**N as much as possible
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 5
+  $ hg debugstablerange --verify --verbose --subranges --rev 5 | tee 5.range
   c8d03c1b5e94-0 (5, 6, 6) [complete] - 2dc09a01254d-0 (3, 4, 4), c8d03c1b5e94-4 (5, 6, 2)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
@@ -75,7 +87,6 @@
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
   c8d03c1b5e94-5 (5, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 5 > 5.range
   $ diff -u 4.range 5.range
   --- 4.range	* (glob)
   +++ 5.range	* (glob)
@@ -96,7 +107,7 @@
 
 Even two unperfect range overlap a lot
 
-  $ hg debugstablerange --verify --verbose --subranges --rev tip
+  $ hg debugstablerange --verify --verbose --subranges --rev tip | tee tip.range
   f69452c5b1af-0 (6, 7, 7) [complete] - 2dc09a01254d-0 (3, 4, 4), f69452c5b1af-4 (6, 7, 3)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   f69452c5b1af-4 (6, 7, 3) [complete] - c8d03c1b5e94-4 (5, 6, 2), f69452c5b1af-6 (6, 7, 1)
@@ -110,7 +121,6 @@
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
   c8d03c1b5e94-5 (5, 6, 1) [leaf] - 
   f69452c5b1af-6 (6, 7, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev tip > tip.range
   $ diff -u 5.range tip.range
   --- 5.range	* (glob)
   +++ tip.range	* (glob)
@@ -182,12 +192,11 @@
 
 (left branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2'
+  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' | tee left-2.range
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' > left-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev left
+  $ hg debugstablerange --verify --verbose --subranges --rev left | tee left.range
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
@@ -195,7 +204,6 @@
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   2dc09a01254d-3 (3, 4, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left' > left.range
   $ diff -u left-2.range left.range
   --- left-2.range	* (glob)
   +++ left.range	* (glob)
@@ -211,12 +219,11 @@
 
 (right branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev right~2
+  $ hg debugstablerange --verify --verbose --subranges --rev right~2 | tee right-2.range
   e7bd5218ca15-0 (4, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   e7bd5218ca15-1 (4, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right~2' > right-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev right
+  $ hg debugstablerange --verify --verbose --subranges --rev right | tee right.range
   a2f58e9c1e56-0 (6, 4, 4) [complete] - e7bd5218ca15-0 (4, 2, 2), a2f58e9c1e56-2 (6, 4, 2)
   a2f58e9c1e56-2 (6, 4, 2) [complete] - 3a367db1fabc-2 (5, 3, 1), a2f58e9c1e56-3 (6, 4, 1)
   e7bd5218ca15-0 (4, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
@@ -224,7 +231,6 @@
   3a367db1fabc-2 (5, 3, 1) [leaf] - 
   a2f58e9c1e56-3 (6, 4, 1) [leaf] - 
   e7bd5218ca15-1 (4, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right' > right.range
   $ diff -u right-2.range right.range
   --- right-2.range	* (glob)
   +++ right.range	* (glob)
@@ -240,7 +246,7 @@
 
 The merge reuse as much of the slicing created for one of the branch
 
-  $ hg debugstablerange --verify --verbose --subranges --rev merge
+  $ hg debugstablerange --verify --verbose --subranges --rev merge | tee merge.range
   5f18015f9110-0 (7, 8, 8) [complete] - 2dc09a01254d-0 (3, 4, 4), 5f18015f9110-4 (7, 8, 4)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   5f18015f9110-4 (7, 8, 4) [complete] - 3a367db1fabc-1 (5, 3, 2), 5f18015f9110-6 (7, 8, 2)
@@ -256,7 +262,6 @@
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   a2f58e9c1e56-3 (6, 4, 1) [leaf] - 
   e7bd5218ca15-1 (4, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'merge' > merge.range
   $ diff -u left.range merge.range
   --- left.range	* (glob)
   +++ merge.range	* (glob)
@@ -367,14 +372,13 @@
 
 (left branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2'
+  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' | tee left-2.range
   01241442b3c2-0 (2, 3, 3) [complete] - 66f7d451a68b-0 (1, 2, 2), 01241442b3c2-2 (2, 3, 1)
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
   01241442b3c2-2 (2, 3, 1) [leaf] - 
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' > left-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev left
+  $ hg debugstablerange --verify --verbose --subranges --rev left | tee left.range
   bebd167eb94d-0 (4, 5, 5) [complete] - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
@@ -384,7 +388,6 @@
   2dc09a01254d-3 (3, 4, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left' > left.range
   $ diff -u left-2.range left.range
   --- left-2.range	* (glob)
   +++ left.range	* (glob)
@@ -403,7 +406,7 @@
 
 (right branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev right~2
+  $ hg debugstablerange --verify --verbose --subranges --rev right~2 | tee right-2.range
   42b07e8da27d-0 (7, 4, 4) [complete] - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
   42b07e8da27d-2 (7, 4, 2) [complete] - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
   de561312eff4-0 (5, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
@@ -411,8 +414,7 @@
   42b07e8da27d-3 (7, 4, 1) [leaf] - 
   b9bc20507e0b-2 (6, 3, 1) [leaf] - 
   de561312eff4-1 (5, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right~2' > right-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev right
+  $ hg debugstablerange --verify --verbose --subranges --rev right | tee right.range
   f4b7da68b467-0 (9, 6, 6) [complete] - 42b07e8da27d-0 (7, 4, 4), f4b7da68b467-4 (9, 6, 2)
   42b07e8da27d-0 (7, 4, 4) [complete] - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
   42b07e8da27d-2 (7, 4, 2) [complete] - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
@@ -424,7 +426,6 @@
   b9bc20507e0b-2 (6, 3, 1) [leaf] - 
   de561312eff4-1 (5, 2, 1) [leaf] - 
   f4b7da68b467-5 (9, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right' > right.range
   $ diff -u right-2.range right.range
   --- right-2.range	* (glob)
   +++ right.range	* (glob)
@@ -448,7 +449,7 @@
 
 We are still able to reuse one of the branch however
 
-  $ hg debugstablerange --verify --verbose --subranges --rev merge
+  $ hg debugstablerange --verify --verbose --subranges --rev merge | tee merge.range
   8aca7f8c9bd2-0 (10, 11, 11) [complete] - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-1 (7, 4, 3), 8aca7f8c9bd2-8 (10, 11, 3)
   bebd167eb94d-0 (4, 5, 5) [complete] - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
@@ -469,7 +470,6 @@
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
   de561312eff4-1 (5, 2, 1) [leaf] - 
   f4b7da68b467-5 (9, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'merge' > merge.range
   $ diff -u left.range merge.range
   --- left.range	* (glob)
   +++ merge.range	* (glob)
@@ -526,7 +526,7 @@
 
 Range above the merge, reuse subrange from the merge
 
-  $ hg debugstablerange --verify --verbose --subranges --rev tip
+  $ hg debugstablerange --verify --verbose --subranges --rev tip | tee tip.range
   e6b8d5b46647-0 (12, 13, 13) [complete] - bebd167eb94d-0 (4, 5, 5), 42b07e8da27d-1 (7, 4, 3), e6b8d5b46647-8 (12, 13, 5)
   bebd167eb94d-0 (4, 5, 5) [complete] - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
   e6b8d5b46647-8 (12, 13, 5) [complete] - 485383494a89-8 (11, 12, 4), e6b8d5b46647-12 (12, 13, 1)
@@ -551,7 +551,6 @@
   de561312eff4-1 (5, 2, 1) [leaf] - 
   e6b8d5b46647-12 (12, 13, 1) [leaf] - 
   f4b7da68b467-5 (9, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'tip' > tip.range
   $ diff -u merge.range tip.range
   --- merge.range	* (glob)
   +++ tip.range	* (glob)
--- a/tests/test-stablerange.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-stablerange.t	Fri Aug 13 20:25:11 2021 +0200
@@ -5,12 +5,33 @@
 
   $ cat << EOF >> $HGRCPATH
   > [extensions]
-  > hgext3rd.evolve =
+  > evolve =
   > [ui]
   > logtemplate = "{rev} {node|short} {desc} {tags}\n"
+  > EOF
+
+#testcases default basic-mergepoint mergepoint
+
+#if default
+  $ cat << EOF >> $HGRCPATH
   > [defaults]
   > debugstablerange = --method default
   > EOF
+#endif
+
+#if basic-mergepoint
+  $ cat << EOF >> $HGRCPATH
+  > [defaults]
+  > debugstablerange = --method basic-mergepoint
+  > EOF
+#endif
+
+#if mergepoint
+  $ cat << EOF >> $HGRCPATH
+  > [defaults]
+  > debugstablerange = --method mergepoint
+  > EOF
+#endif
 
 Simple linear test
 ==================
@@ -26,15 +47,14 @@
   bebd167eb94d 5
   c8d03c1b5e94 6
   f69452c5b1af 7
-  $ hg debugstablerange --verify --verbose --subranges --rev 1
+  $ hg debugstablerange --verify --verbose --subranges --rev 1 | tee 1.range
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 1 > 1.range
 
 bigger subset reuse most of the previous one
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 4
+  $ hg debugstablerange --verify --verbose --subranges --rev 4 | tee 4.range
   bebd167eb94d-0 (4, 5, 5) [complete] - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
@@ -44,7 +64,6 @@
   2dc09a01254d-3 (3, 4, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 4 > 4.range
   $ diff -u 1.range 4.range
   --- 1.range	* (glob)
   +++ 4.range	* (glob)
@@ -63,7 +82,7 @@
 Using a range not ending on 2**N boundary
 we fall back on 2**N as much as possible
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 5
+  $ hg debugstablerange --verify --verbose --subranges --rev 5 | tee 5.range
   c8d03c1b5e94-0 (5, 6, 6) [complete] - 2dc09a01254d-0 (3, 4, 4), c8d03c1b5e94-4 (5, 6, 2)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
@@ -75,7 +94,6 @@
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
   c8d03c1b5e94-5 (5, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 5 > 5.range
   $ diff -u 4.range 5.range
   --- 4.range	* (glob)
   +++ 5.range	* (glob)
@@ -96,7 +114,7 @@
 
 Even two unperfect range overlap a lot
 
-  $ hg debugstablerange --verify --verbose --subranges --rev tip
+  $ hg debugstablerange --verify --verbose --subranges --rev tip | tee tip.range
   f69452c5b1af-0 (6, 7, 7) [complete] - 2dc09a01254d-0 (3, 4, 4), f69452c5b1af-4 (6, 7, 3)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   f69452c5b1af-4 (6, 7, 3) [complete] - c8d03c1b5e94-4 (5, 6, 2), f69452c5b1af-6 (6, 7, 1)
@@ -110,7 +128,6 @@
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
   c8d03c1b5e94-5 (5, 6, 1) [leaf] - 
   f69452c5b1af-6 (6, 7, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev tip > tip.range
   $ diff -u 5.range tip.range
   --- 5.range	* (glob)
   +++ tip.range	* (glob)
@@ -182,12 +199,11 @@
 
 (left branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2'
+  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' | tee left-2.range
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' > left-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev left
+  $ hg debugstablerange --verify --verbose --subranges --rev left | tee left.range
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
@@ -195,7 +211,6 @@
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   2dc09a01254d-3 (3, 4, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left' > left.range
   $ diff -u left-2.range left.range
   --- left-2.range	* (glob)
   +++ left.range	* (glob)
@@ -211,12 +226,11 @@
 
 (right branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev right~2
+  $ hg debugstablerange --verify --verbose --subranges --rev right~2 | tee right-2.range
   e7bd5218ca15-0 (4, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   e7bd5218ca15-1 (4, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right~2' > right-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev right
+  $ hg debugstablerange --verify --verbose --subranges --rev right | tee right.range
   a2f58e9c1e56-0 (6, 4, 4) [complete] - e7bd5218ca15-0 (4, 2, 2), a2f58e9c1e56-2 (6, 4, 2)
   a2f58e9c1e56-2 (6, 4, 2) [complete] - 3a367db1fabc-2 (5, 3, 1), a2f58e9c1e56-3 (6, 4, 1)
   e7bd5218ca15-0 (4, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), e7bd5218ca15-1 (4, 2, 1)
@@ -224,7 +238,6 @@
   3a367db1fabc-2 (5, 3, 1) [leaf] - 
   a2f58e9c1e56-3 (6, 4, 1) [leaf] - 
   e7bd5218ca15-1 (4, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right' > right.range
   $ diff -u right-2.range right.range
   --- right-2.range	* (glob)
   +++ right.range	* (glob)
@@ -240,7 +253,7 @@
 
 The merge reuse as much of the slicing created for one of the branch
 
-  $ hg debugstablerange --verify --verbose --subranges --rev merge
+  $ hg debugstablerange --verify --verbose --subranges --rev merge | tee merge.range
   5f18015f9110-0 (7, 8, 8) [complete] - 2dc09a01254d-0 (3, 4, 4), 5f18015f9110-4 (7, 8, 4)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   5f18015f9110-4 (7, 8, 4) [complete] - 3a367db1fabc-1 (5, 3, 2), 5f18015f9110-6 (7, 8, 2)
@@ -256,7 +269,6 @@
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   a2f58e9c1e56-3 (6, 4, 1) [leaf] - 
   e7bd5218ca15-1 (4, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'merge' > merge.range
   $ diff -u left.range merge.range
   --- left.range	* (glob)
   +++ merge.range	* (glob)
@@ -367,14 +379,13 @@
 
 (left branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2'
+  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' | tee left-2.range
   01241442b3c2-0 (2, 3, 3) [complete] - 66f7d451a68b-0 (1, 2, 2), 01241442b3c2-2 (2, 3, 1)
   66f7d451a68b-0 (1, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), 66f7d451a68b-1 (1, 2, 1)
   01241442b3c2-2 (2, 3, 1) [leaf] - 
   1ea73414a91b-0 (0, 1, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left~2' > left-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev left
+  $ hg debugstablerange --verify --verbose --subranges --rev left | tee left.range
   bebd167eb94d-0 (4, 5, 5) [complete] - 2dc09a01254d-0 (3, 4, 4), bebd167eb94d-4 (4, 5, 1)
   2dc09a01254d-0 (3, 4, 4) [complete] - 66f7d451a68b-0 (1, 2, 2), 2dc09a01254d-2 (3, 4, 2)
   2dc09a01254d-2 (3, 4, 2) [complete] - 01241442b3c2-2 (2, 3, 1), 2dc09a01254d-3 (3, 4, 1)
@@ -384,7 +395,6 @@
   2dc09a01254d-3 (3, 4, 1) [leaf] - 
   66f7d451a68b-1 (1, 2, 1) [leaf] - 
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'left' > left.range
   $ diff -u left-2.range left.range
   --- left-2.range	* (glob)
   +++ left.range	* (glob)
@@ -403,7 +413,7 @@
 
 (right branch)
 
-  $ hg debugstablerange --verify --verbose --subranges --rev right~2
+  $ hg debugstablerange --verify --verbose --subranges --rev right~2 | tee right-2.range
   42b07e8da27d-0 (7, 4, 4) [complete] - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
   42b07e8da27d-2 (7, 4, 2) [complete] - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
   de561312eff4-0 (5, 2, 2) [complete] - 1ea73414a91b-0 (0, 1, 1), de561312eff4-1 (5, 2, 1)
@@ -411,8 +421,7 @@
   42b07e8da27d-3 (7, 4, 1) [leaf] - 
   b9bc20507e0b-2 (6, 3, 1) [leaf] - 
   de561312eff4-1 (5, 2, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right~2' > right-2.range
-  $ hg debugstablerange --verify --verbose --subranges --rev right
+  $ hg debugstablerange --verify --verbose --subranges --rev right | tee right.range
   f4b7da68b467-0 (9, 6, 6) [complete] - 42b07e8da27d-0 (7, 4, 4), f4b7da68b467-4 (9, 6, 2)
   42b07e8da27d-0 (7, 4, 4) [complete] - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
   42b07e8da27d-2 (7, 4, 2) [complete] - b9bc20507e0b-2 (6, 3, 1), 42b07e8da27d-3 (7, 4, 1)
@@ -424,7 +433,6 @@
   b9bc20507e0b-2 (6, 3, 1) [leaf] - 
   de561312eff4-1 (5, 2, 1) [leaf] - 
   f4b7da68b467-5 (9, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'right' > right.range
   $ diff -u right-2.range right.range
   --- right-2.range	* (glob)
   +++ right.range	* (glob)
@@ -448,7 +456,7 @@
 
 We are still able to reuse one of the branch however
 
-  $ hg debugstablerange --verify --verbose --subranges --rev merge
+  $ hg debugstablerange --verify --verbose --subranges --rev merge | tee merge.range
   8aca7f8c9bd2-0 (10, 11, 11) [complete] - f4b7da68b467-0 (9, 6, 6), 01241442b3c2-1 (2, 3, 2), 8aca7f8c9bd2-8 (10, 11, 3)
   f4b7da68b467-0 (9, 6, 6) [complete] - 42b07e8da27d-0 (7, 4, 4), f4b7da68b467-4 (9, 6, 2)
   42b07e8da27d-0 (7, 4, 4) [complete] - de561312eff4-0 (5, 2, 2), 42b07e8da27d-2 (7, 4, 2)
@@ -469,7 +477,6 @@
   bebd167eb94d-4 (4, 5, 1) [leaf] - 
   de561312eff4-1 (5, 2, 1) [leaf] - 
   f4b7da68b467-5 (9, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'merge' > merge.range
   $ diff -u left.range merge.range
   --- left.range	* (glob)
   +++ merge.range	* (glob)
@@ -527,7 +534,7 @@
 
 Range above the merge, reuse subrange from the merge
 
-  $ hg debugstablerange --verify --verbose --subranges --rev tip
+  $ hg debugstablerange --verify --verbose --subranges --rev tip | tee tip.range
   e6b8d5b46647-0 (12, 13, 13) [complete] - f4b7da68b467-0 (9, 6, 6), 01241442b3c2-1 (2, 3, 2), e6b8d5b46647-8 (12, 13, 5)
   f4b7da68b467-0 (9, 6, 6) [complete] - 42b07e8da27d-0 (7, 4, 4), f4b7da68b467-4 (9, 6, 2)
   e6b8d5b46647-8 (12, 13, 5) [complete] - 485383494a89-8 (11, 12, 4), e6b8d5b46647-12 (12, 13, 1)
@@ -552,7 +559,6 @@
   de561312eff4-1 (5, 2, 1) [leaf] - 
   e6b8d5b46647-12 (12, 13, 1) [leaf] - 
   f4b7da68b467-5 (9, 6, 1) [leaf] - 
-  $ hg debugstablerange --verify --verbose --subranges --rev 'tip' > tip.range
   $ diff -u merge.range tip.range
   --- merge.range	* (glob)
   +++ tip.range	* (glob)
--- a/tests/test-stablesort-branchpoint-criss-cross.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-stablesort-branchpoint-criss-cross.t	Fri Aug 13 20:25:11 2021 +0200
@@ -5,7 +5,7 @@
 
   $ cat << EOF >> $HGRCPATH
   > [extensions]
-  > hgext3rd.evolve =
+  > evolve =
   > [ui]
   > logtemplate = "{rev} {node|short} {desc} {tags}\n"
   > [alias]
--- a/tests/test-stablesort-branchpoint.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-stablesort-branchpoint.t	Fri Aug 13 20:25:11 2021 +0200
@@ -5,15 +5,13 @@
 
   $ cat << EOF >> $HGRCPATH
   > [extensions]
-  > hgext3rd.evolve =
+  > evolve =
   > [ui]
   > logtemplate = "{rev} {node|short} {desc} {tags}\n"
   > [alias]
   > showsort = debugstablesort --template="{node|short}\n" --method branchpoint
   > EOF
 
-
-
   $ checktopo () {
   >     seen='null';
   >     for node in `hg showsort --rev "$1"`; do
--- a/tests/test-stablesort-criss-cross.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-stablesort-criss-cross.t	Fri Aug 13 20:25:11 2021 +0200
@@ -5,7 +5,7 @@
 
   $ cat << EOF >> $HGRCPATH
   > [extensions]
-  > hgext3rd.evolve =
+  > evolve =
   > [ui]
   > logtemplate = "{rev} {node|short} {desc} {tags}\n"
   > [alias]
--- a/tests/test-stablesort.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-stablesort.t	Fri Aug 13 20:25:11 2021 +0200
@@ -5,7 +5,7 @@
 
   $ cat << EOF >> $HGRCPATH
   > [extensions]
-  > hgext3rd.evolve =
+  > evolve =
   > [ui]
   > logtemplate = "{rev} {node|short} {desc} {tags}\n"
   > [alias]
@@ -13,8 +13,6 @@
   > showsorthead = debugstablesort --template="{node|short}\n" --method headondisk
   > EOF
 
-
-
   $ checktopo () {
   >     seen='null';
   >     for node in `hg showsort --rev "$1"`; do
--- a/tests/test-topic-change.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-topic-change.t	Fri Aug 13 20:25:11 2021 +0200
@@ -4,8 +4,6 @@
   $ . "$TESTDIR/testlib/topic_setup.sh"
   $ cat <<EOF >> $HGRCPATH
   > [experimental]
-  > # disable the new graph style until we drop 3.7 support
-  > graphstyle.missing = |
   > evolution=createmarkers, allowunstable
   > [phases]
   > publish=false
@@ -143,7 +141,7 @@
   $ hg glog -r .
   @  20:c2d6b7df5dcf {foobar}
   |  Added h  ()
-  |
+  ~
 
 Changing topic in between the stack
 
@@ -228,7 +226,7 @@
   $ hg glog -r .
   @  28:61470c956807 {wat}
   |  Added h  ()
-  |
+  ~
 
 Clear the current topic and amending
 
@@ -237,7 +235,7 @@
   $ hg glog -r .
   @  29:b584fa49f42e {}
   |  Added h  ()
-  |
+  ~
 
 When the changeset does not has a topic but we have an active topic
 
@@ -249,7 +247,7 @@
   $ hg glog -r .
   @  30:a24c31c35013 {watwat}
   |  Added h  ()
-  |
+  ~
 
 Testing changing topics on public changeset
 -------------------------------------------
--- a/tests/test-topic-debugcb.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-topic-debugcb.t	Fri Aug 13 20:25:11 2021 +0200
@@ -132,7 +132,7 @@
   o  [0:249055fcca50] root
   
   $ hg debugconvertbookmark --all
-  skipping '9' as it has multiple bookmarks on it
+  skipping revision 9 as it has multiple bookmarks on it
   $ hg log -G
   @  [9:4ad3e7d421d4] Trying multiple bookmarks
   |    bookmark: book1
--- a/tests/test-topic-flow-reject-untopiced.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-topic-flow-reject-untopiced.t	Fri Aug 13 20:25:11 2021 +0200
@@ -17,7 +17,7 @@
   $ hg topic server
   marked working directory as topic: server
   $ for ch in a b c; do echo foo > $ch; hg ci -Aqm "Added "$ch; done
-  $ hg ph -p 0
+  $ hg phase -p 0
 
   $ hg log -G -T "{rev}:{node|short}\n{desc}  {topics}"
   @  2:a7b96f87a214
--- a/tests/test-topic-fold.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-topic-fold.t	Fri Aug 13 20:25:11 2021 +0200
@@ -1,18 +1,15 @@
 test of the fold command
 ------------------------
 
+  $ . $TESTDIR/testlib/common.sh
   $ cat >> $HGRCPATH <<EOF
   > [ui]
   > interactive = true
   > [extensions]
+  > evolve =
+  > topic =
   > EOF
-  $ echo "topic=$(echo $(dirname $TESTDIR))/hgext3rd/topic/" >> $HGRCPATH
-  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
-  $ mkcommit() {
-  >    echo "$1" > "$1"
-  >    hg add "$1"
-  >    hg ci -m "add $1" $2 $3
-  > }
+
   $ logtopic() {
   >    hg log -G -T "{rev}:{node}\ntopics: {topics}" 
   > }
@@ -30,11 +27,11 @@
   (see 'hg help topics' for more information)
   $ mkcommit feature2
   $ logtopic
-  @  2:d76a6166b18c835be9a487c5e21c7d260f0a1676
+  @  2:6e0fb07fa151928b633485a01b6d815b27f5a26d
   |  topics: myfeature
-  o  1:39e7a938055e87615edf675c24a10997ff05bb06
+  o  1:95b29fc10be4e6343c8d344ad4354d6ff4098df1
   |  topics: myfeature
-  o  0:3e7df3b3b17c6deb4a1c70e790782fdf17af96a7
+  o  0:ea207398892eb49e06441f10dda2a731f0450f20
      topics:
   $ hg fold --exact -r "(tip~1)::" -m "folded"
   2 changesets folded
@@ -43,14 +40,14 @@
   ### topic: myfeature
   ### target: default (branch)
   s1@ folded (current)
-  s0^ add ROOT (base)
+  s0^ ROOT (base)
   $ logtopic
-  @  3:4fd43e5bdc443dc8489edffac19bd8f93ccf1a5c
+  @  3:ba602426356f35854a83b02183d999749142443c
   |  topics: myfeature
-  o  0:3e7df3b3b17c6deb4a1c70e790782fdf17af96a7
+  o  0:ea207398892eb49e06441f10dda2a731f0450f20
      topics:
   $ hg summary
-  parent: 3:4fd43e5bdc44 tip
+  parent: 3:ba602426356f tip
    folded
   branch: default:myfeature
   commit: (clean)
@@ -73,13 +70,13 @@
   active topic 'myotherfeature' grew its first changeset
   (see 'hg help topics' for more information)
   $ logtopic
-  @  5:5ded4d6d578c37f339b0716de2e46e12ece7cbde
+  @  5:85e76d22bde1cb5ce44b00fc91a88cb805c93b1b
   |  topics: myotherfeature
-  o  4:bdf6950b9b5b7c6b377c8132667c73ec86d5734f
+  o  4:6508e0bfb6a188bb94d77c107f4e969291010b42
   |  topics:
-  o  3:4fd43e5bdc443dc8489edffac19bd8f93ccf1a5c
+  o  3:ba602426356f35854a83b02183d999749142443c
   |  topics: myfeature
-  o  0:3e7df3b3b17c6deb4a1c70e790782fdf17af96a7
+  o  0:ea207398892eb49e06441f10dda2a731f0450f20
      topics:
   $ hg fold --exact -r "(tip~1)::" -m "folded 2"
   active topic 'myotherfeature' is now empty
@@ -87,14 +84,14 @@
   clearing empty topic "myotherfeature"
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ logtopic
-  @  6:03da8f7238e9a4d708d6b8af402c91c68f271477
+  @  6:9fa327ea84f90ba000b75b90446680c993972df0
   |  topics:
-  o  3:4fd43e5bdc443dc8489edffac19bd8f93ccf1a5c
+  o  3:ba602426356f35854a83b02183d999749142443c
   |  topics: myfeature
-  o  0:3e7df3b3b17c6deb4a1c70e790782fdf17af96a7
+  o  0:ea207398892eb49e06441f10dda2a731f0450f20
      topics:
   $ hg summary
-  parent: 6:03da8f7238e9 tip
+  parent: 6:9fa327ea84f9 tip
    folded 2
   branch: default
   commit: (clean)
--- a/tests/test-topic-stack-data.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-topic-stack-data.t	Fri Aug 13 20:25:11 2021 +0200
@@ -11,13 +11,10 @@
   > EOF
   $ cat <<EOF >> $HGRCPATH
   > [experimental]
-  > # disable the new graph style until we drop 3.7 support
-  > graphstyle.missing = |
   > # turn evolution on
   > evolution=all
   > EOF
 
-
   $ mkcommit() {
   >    echo "$1" > "$1"
   >    hg add "$1"
--- a/tests/test-topic.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-topic.t	Fri Aug 13 20:25:11 2021 +0200
@@ -6,11 +6,6 @@
   > [phases]
   > publish=false
   > EOF
-  $ cat <<EOF >> $HGRCPATH
-  > [experimental]
-  > # disable the new graph style until we drop 3.7 support
-  > graphstyle.missing = |
-  > EOF
 
   $ hg help -e topic
   topic extension - support for topic branches
@@ -522,9 +517,9 @@
   |
   o  changeset:   4:fb147b0b417c
   |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     start on narf
-  |
+  ~  date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on narf
+  
 
   $ hg push -f ../pinky -r query
   pushing to ../pinky
@@ -552,16 +547,16 @@
   |
   | o  changeset:   5:0469d521db49
   | |  topic:       fran
-  | |  parent:      3:a53952faf762
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:00 1970 +0000
-  | |  summary:     start on fran
-  | |
-  o |  changeset:   4:fb147b0b417c
-  |/   user:        test
+  | ~  parent:      3:a53952faf762
+  |    user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    summary:     start on narf
+  |    summary:     start on fran
   |
+  o  changeset:   4:fb147b0b417c
+  |  user:        test
+  ~  date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on narf
+  
 
   $ hg topics
    * query (1 changesets)
@@ -633,16 +628,16 @@
   |
   | o  changeset:   5:0469d521db49
   | |  topic:       fran
-  | |  parent:      3:a53952faf762
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:00 1970 +0000
-  | |  summary:     start on fran
-  | |
-  o |  changeset:   4:fb147b0b417c
-  |/   user:        test
+  | ~  parent:      3:a53952faf762
+  |    user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
-  |    summary:     start on narf
+  |    summary:     start on fran
   |
+  o  changeset:   4:fb147b0b417c
+  |  user:        test
+  ~  date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on narf
+  
 
   $ cd ../brain
   $ hg topics
@@ -682,12 +677,12 @@
   $ hg log -Gr 'draft()'
   o  changeset:   9:0469d521db49
   |  tag:         tip
-  |  topic:       fran
-  |  parent:      3:a53952faf762
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     start on fran
-  |
+  ~  topic:       fran
+     parent:      3:a53952faf762
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on fran
+  
 
 query is not an open topic, so when we clear the current topic it'll
 fade out:
@@ -701,12 +696,12 @@
   $ hg log -r 'topic()' -G
   o  changeset:   9:0469d521db49
   |  tag:         tip
-  |  topic:       fran
-  |  parent:      3:a53952faf762
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     start on fran
-  |
+  ~  topic:       fran
+     parent:      3:a53952faf762
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on fran
+  
   $ hg log -r 'not topic()' -G
   o    changeset:   8:ae074045b7a7
   |\   parent:      7:54c943c1c167
@@ -763,22 +758,22 @@
   $ hg log -r 'topic("re:.ra.")' -G
   o  changeset:   9:0469d521db49
   |  tag:         tip
-  |  topic:       fran
-  |  parent:      3:a53952faf762
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     start on fran
-  |
+  ~  topic:       fran
+     parent:      3:a53952faf762
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on fran
+  
 Exact match on fran:
   $ hg log -r 'topic(fran)' -G
   o  changeset:   9:0469d521db49
   |  tag:         tip
-  |  topic:       fran
-  |  parent:      3:a53952faf762
-  |  user:        test
-  |  date:        Thu Jan 01 00:00:00 1970 +0000
-  |  summary:     start on fran
-  |
+  ~  topic:       fran
+     parent:      3:a53952faf762
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on fran
+  
 
 Match current topic:
   $ hg topic
@@ -851,17 +846,17 @@
   |
   | o  changeset:   10:de75ec1bdbe8
   | |  parent:      8:ae074045b7a7
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:00 1970 +0000
-  | |  summary:     non-topic
-  | |
-  o |  changeset:   9:0469d521db49
-  | |  topic:       fran
-  | |  parent:      3:a53952faf762
-  | |  user:        test
-  | |  date:        Thu Jan 01 00:00:00 1970 +0000
-  | |  summary:     start on fran
-  | |
+  | ~  user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     non-topic
+  |
+  o  changeset:   9:0469d521db49
+  |  topic:       fran
+  ~  parent:      3:a53952faf762
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     start on fran
+  
 
   $ hg topics
      fran (1 changesets)
--- a/tests/test-touch.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-touch.t	Fri Aug 13 20:25:11 2021 +0200
@@ -5,7 +5,7 @@
   > [alias]
   > glog = log -GT "{rev}: {desc}"
   > [extensions]
-  > hgext.rebase=
+  > rebase =
   > EOF
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
 
@@ -179,7 +179,7 @@
   $ hg touch 2
   abort: cannot touch public changesets: * (glob)
   (see 'hg help phases' for details)
-  [255]
+  [10]
   $ hg touch --duplicate 2
 
 Reviving merge commit
--- a/tests/test-uncommit.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-uncommit.t	Fri Aug 13 20:25:11 2021 +0200
@@ -17,7 +17,7 @@
   $ hg uncommit
   abort: cannot uncommit the null revision
   (no changeset checked out)
-  [255]
+  [10]
 
 Cannot uncommit public changeset
 
@@ -27,7 +27,7 @@
   $ hg uncommit
   abort: cannot uncommit public changesets: 07f494440405
   (see 'hg help phases' for details)
-  [255]
+  [10]
   $ hg phase --force --draft .
 
 Cannot uncommit merge
@@ -105,7 +105,7 @@
   R g
   R m
   R n
-  $ hg man -r .
+  $ hg manifest -r .
   a
   aa
   b
@@ -203,7 +203,7 @@
   M d
   A e
   R n
-  $ hg man -r .
+  $ hg manifest -r .
   a
   b
   c
--- a/tests/test-unstability-resolution-result.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-unstability-resolution-result.t	Fri Aug 13 20:25:11 2021 +0200
@@ -9,7 +9,7 @@
 
   $ cat >> $HGRCPATH <<EOF
   > [extensions]
-  > hgext.rebase=
+  > rebase =
   > EOF
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
 
--- a/tests/test-unstable-orphan.t	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/test-unstable-orphan.t	Fri Aug 13 20:25:11 2021 +0200
@@ -51,7 +51,7 @@
   o  0:135f39f4bd78@default(draft) add _a
   
 
-  $ hg evo --all --any --orphan
+  $ hg evolve --all --any --orphan
   move:[2] add _c
   atop:[3] bprime
   $ hg log -G
@@ -102,7 +102,7 @@
   o  0:135f39f4bd78@default(draft) add _a
   
 
-  $ hg evo --all --any --orphan
+  $ hg evolve --all --any --orphan
   move:[2] add _c
   atop:[6] add bsecondsplit2
   $ hg log -G
--- a/tests/testlib/common.sh	Fri Aug 13 19:44:42 2021 +0200
+++ b/tests/testlib/common.sh	Fri Aug 13 20:25:11 2021 +0200
@@ -9,8 +9,3 @@
 getid() {
    hg log --hidden --template '{node}\n' --rev "$1"
 }
-
-cat >> $HGRCPATH <<EOF
-[alias]
-debugobsolete=debugobsolete -d '0 0'
-EOF