changeset 7000:3415ee1278dc mercurial-4.9

test-compat: merge mercurial-5.0 into mercurial-4.9
author Anton Shestakov <av6@dwimlabs.net>
date Thu, 06 Feb 2025 12:17:01 +0100
parents 32a9dab5f899 (current diff) 3f1cf6277153 (diff)
children fffaff5b4205
files
diffstat 18 files changed, 236 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Tue Nov 26 18:03:09 2024 +0400
+++ b/.hgtags	Thu Feb 06 12:17:01 2025 +0100
@@ -112,3 +112,4 @@
 2d2da4f7742a0da2c2fbd5a95c48937720eeafd4 11.1.3
 ed7c98393e060210689f0b94d79e8b990403b6a9 11.1.4
 6219898ee0ad2ebd1d75500ac9d1b02e5b539de2 11.1.5
+885e8a8414bde9a14dcefbd342a9704e8ace7649 11.1.6
--- a/CHANGELOG	Tue Nov 26 18:03:09 2024 +0400
+++ b/CHANGELOG	Thu Feb 06 12:17:01 2025 +0100
@@ -1,7 +1,15 @@
 Changelog
 =========
 
-11.1.6 - in progress
+11.1.7 - in progress
+--------------------
+
+  * evolve: fix version check from 972d98ce3552 for hg 6.8 (issue6958)
+
+  * obslog: also display patch for rebased changesets (requires Mercurial 5.6
+    or newer for in-memory rebase support)
+
+11.1.6 -- 2024-11-27
 --------------------
 
   * evolve: unrelated parts of splits are no longer considered
--- a/contrib/merge-test-compat.sh	Tue Nov 26 18:03:09 2024 +0400
+++ b/contrib/merge-test-compat.sh	Thu Feb 06 12:17:01 2025 +0100
@@ -3,7 +3,7 @@
 
 unset GREP_OPTIONS
 
-compatbranches=$(hg branches --quiet | grep 'mercurial-' | grep -v ':' | sort -n --reverse)
+compatbranches=$(HGRCPATH= hg branches --quiet | grep -E '^mercurial-' | sort -n --reverse)
 prev='stable'
 topic=${1:-'test-compat'}
 for branch in $compatbranches; do
@@ -15,11 +15,15 @@
     # are definitely unrelated to what we're doing.
     # In other words, if you want to test certain commits, assign them all to
     # one topic and provide that topic as the first argument to this script.
-    uptarget="first(max(branch('$branch') and topic('$topic')) or max(branch('$branch') and not topic()))"
+    uptarget="first(max(branch('re:^$branch') and topic('$topic')) or max(branch('re:^$branch') and not topic()))"
     hg up -r "$uptarget"
     hg topic "$topic"
-    mergetarget="first(max(branch('$prev') and topic('$topic')) or max(branch('$prev') and not topic()))"
-    hg merge -r "$mergetarget"
-    hg commit -m "test-compat: merge $prev into $branch"
+    mergetarget="first(max(branch('re:^$prev') and topic('$topic')) or max(branch('re:^$prev') and not topic()))"
+    if hg log -r "$mergetarget and ancestors(.)" -T 'already merged' | grep 'merge'; then
+        echo "not merging $prev into $branch as it is already merged"
+    else
+        hg merge -r "$mergetarget"
+        hg commit -m "test-compat: merge $prev into $branch"
+    fi
     prev=$branch
 done
--- a/debian/changelog	Tue Nov 26 18:03:09 2024 +0400
+++ b/debian/changelog	Thu Feb 06 12:17:01 2025 +0100
@@ -1,3 +1,9 @@
+mercurial-evolve (11.1.6-1) unstable; urgency=medium
+
+  * new upstream release
+
+ -- Anton Shestakov <av6@dwimlabs.net>  Wed, 27 Nov 2024 16:35:08 +0400
+
 mercurial-evolve (11.1.5-1) unstable; urgency=medium
 
   * new upstream release
--- a/hgext3rd/evolve/compat.py	Tue Nov 26 18:03:09 2024 +0400
+++ b/hgext3rd/evolve/compat.py	Thu Feb 06 12:17:01 2025 +0100
@@ -40,6 +40,14 @@
 except (AttributeError, ImportError):
     mergestate = mergemod.mergestate  # pytype: disable=module-attr
 
+try:
+    from mercurial import mergestate as mergestatemod
+    mergestatemod.memmergestate
+    hasmemmergestate = True
+except (AttributeError, ImportError):
+    # hg <= 5.5 (19590b126764)
+    hasmemmergestate = False
+
 from . import (
     exthelper,
 )
@@ -494,6 +502,89 @@
 
     context.overlayworkingctx.markcopied = fixedmarkcopied
 
+# hg <= 6.9 (f071b18e1382)
+# we detect a502f3f389b5 because it's close enough and touches the same code
+def _detect_hit(code):
+    """ detect a502f3f389b5 by inspecting variables of getfile()
+    """
+    return 'hit' in code.co_varnames[code.co_argcount:]
+def _new_tomemctx(tomemctx):
+    """ diving into tomemctx() to find and inspect the nested getfile()
+    """
+    return any(
+        _detect_hit(c) for c in tomemctx.__code__.co_consts
+        if util.safehasattr(c, 'co_varnames')
+    )
+if not _new_tomemctx(context.overlayworkingctx.tomemctx):
+    def fixed_tomemctx(
+        self,
+        text,
+        branch=None,
+        extra=None,
+        date=None,
+        parents=None,
+        user=None,
+        editor=None,
+    ):
+        """Converts this ``overlayworkingctx`` into a ``memctx`` ready to be
+        committed.
+
+        ``text`` is the commit message.
+        ``parents`` (optional) are rev numbers.
+        """
+        # Default parents to the wrapped context if not passed.
+        if parents is None:
+            parents = self.parents()
+            if len(parents) == 1:
+                parents = (parents[0], None)
+
+        # ``parents`` is passed as rev numbers; convert to ``commitctxs``.
+        if parents[1] is None:
+            parents = (self._repo[parents[0]], None)
+        else:
+            parents = (self._repo[parents[0]], self._repo[parents[1]])
+
+        files = self.files()
+
+        def getfile(repo, memctx, path):
+            hit = self._cache.get(path)
+            ### FIXED PART ###
+            if hit is None:
+                return self.filectx(path)
+            ### END FIXED PART ###
+            elif hit[b'exists']:
+                return context.memfilectx(
+                    repo,
+                    memctx,
+                    path,
+                    hit[b'data'],
+                    b'l' in hit[b'flags'],
+                    b'x' in hit[b'flags'],
+                    hit[b'copied'],
+                )
+            else:
+                # Returning None, but including the path in `files`, is
+                # necessary for memctx to register a deletion.
+                return None
+
+        if branch is None:
+            branch = self._wrappedctx.branch()
+
+        return context.memctx(
+            self._repo,
+            parents,
+            text,
+            files,
+            getfile,
+            date=date,
+            extra=extra,
+            user=user,
+            branch=branch,
+            editor=editor,
+        )
+
+    context.overlayworkingctx.tomemctx = fixed_tomemctx
+
 # what we're actually targeting here is e079e001d536
 # hg <= 5.0 (dc3fdd1b5af4)
 try:
--- a/hgext3rd/evolve/evolvecmd.py	Tue Nov 26 18:03:09 2024 +0400
+++ b/hgext3rd/evolve/evolvecmd.py	Thu Feb 06 12:17:01 2025 +0100
@@ -911,12 +911,8 @@
     return commitmsg
 
 def use_in_memory_merge(repo):
-    try:
-        from mercurial import mergestate as mergestatemod
-        mergestatemod.memmergestate
-    except (AttributeError, ImportError):
+    if not compat.hasmemmergestate:
         # no in-memory evolve if Mercurial lacks the required code
-        # hg <= 5.5 (19590b126764)
         return False
     config_value = repo.ui.config(b'experimental', b'evolution.in-memory')
     if config_value == b'force':
--- a/hgext3rd/evolve/metadata.py	Tue Nov 26 18:03:09 2024 +0400
+++ b/hgext3rd/evolve/metadata.py	Thu Feb 06 12:17:01 2025 +0100
@@ -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'11.1.6.dev0'
+__version__ = b'11.1.7.dev0'
 testedwith = b'4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9'
 minimumhgversion = b'4.9'
 buglink = b'https://bz.mercurial-scm.org/'
--- a/hgext3rd/evolve/obscache.py	Tue Nov 26 18:03:09 2024 +0400
+++ b/hgext3rd/evolve/obscache.py	Thu Feb 06 12:17:01 2025 +0100
@@ -497,7 +497,8 @@
     wrapped = lambda repo: _computeobsoleteset(orig, repo)
     obsolete.cachefuncs[b'obsolete'] = wrapped
 
-    if util.versiontuple(n=3) < (6, 8, 2):
+    version = tuple(i if i is not None else 0 for i in util.versiontuple(n=3))
+    if version < (6, 8, 2):
         # e68fe567a780 was just before the 6.8.2 release
         # hg <= 6.8 (e68fe567a780)
         obsolete.cachefuncs[b'contentdivergent'] = _computecontentdivergentset
--- a/hgext3rd/evolve/obshistory.py	Tue Nov 26 18:03:09 2024 +0400
+++ b/hgext3rd/evolve/obshistory.py	Thu Feb 06 12:17:01 2025 +0100
@@ -11,6 +11,7 @@
 
 from mercurial import (
     commands,
+    context,
     error,
     graphmod,
     logcmdutil,
@@ -29,6 +30,7 @@
 from mercurial.i18n import _
 
 from . import (
+    compat,
     exthelper,
 )
 
@@ -306,27 +308,43 @@
         '''
         pass
 
-def patchavailable(node, repo, candidates, successive=True):
-    """ Check if it's possible to get a diff between node and candidates.
+class _NoPatchAvailable(Exception):
+    """small internal exception
+
+    Carries the reason of why we cannot offer a patch to `displaymarkers`.
+
+    XXX: we could raise a more semantic reason and let `displaymarkers` create
+    the message.
+    """
+    def __init__(self, reason):
+        self.reason = reason
+        super(_NoPatchAvailable, self).__init__()
+
+def prepare_patch(repo, node, candidates, successive=True):
+    """ Prepare 2 contexts for a diff between node and one of its candidates.
 
     `candidates` contains nodes, which can be either successors (`successive`
     is True) or predecessors (`successive` is False) of `node`.
+
+    Return a (from_ctx, to_ctx) tuple of contexts. One of these contexts could
+    be a result of in-memory rebase to align it with parents of the other
+    context.
     """
     if node not in repo:
-        return False, b"context is not local"
+        raise _NoPatchAvailable(b"context is not local")
 
     if len(candidates) == 0:
         if successive:
             msg = b"no successors"
         else:
             msg = b"no predecessors"
-        return False, msg
+        raise _NoPatchAvailable(msg)
     elif len(candidates) > 1:
         if successive:
             msg = b"too many successors (%d)"
         else:
             msg = b"too many predecessors (%d)"
-        return False, msg % len(candidates)
+        raise _NoPatchAvailable(msg % len(candidates))
 
     cand = candidates[0]
 
@@ -335,16 +353,69 @@
             msg = b"successor is unknown locally"
         else:
             msg = b"predecessor is unknown locally"
-        return False, msg
+        raise _NoPatchAvailable(msg)
+
+    node_ctx = repo[node]
+    cand_ctx = repo[cand]
 
     # Check that both node and cand have the same parents
-    nodep1, nodep2 = repo[node].p1(), repo[node].p2()
-    candp1, candp2 = repo[cand].p1(), repo[cand].p2()
+    nodep1, nodep2 = node_ctx.p1(), node_ctx.p2()
+    candp1, candp2 = cand_ctx.p1(), cand_ctx.p2()
+
+    if not compat.hasmemmergestate and (nodep1 != candp1 or nodep2 != candp2):
+        # we need hg 5.6+ for rebasing cand in-memory to show this diff
+        msg = b"Mercurial 5.6 or newer is required for in-memory rebase"
+        raise _NoPatchAvailable(msg)
+
+    if nodep1 != candp1:
+        # XXX the case when both p1 and p2 changed could be better.
+        #
+        # For simplicity if both parents change, we currently only reflect the
+        # impact on "p1" changeset. This should be improved at some point, but
+        # this is good enough for now.
+        cand_ctx = _rebase_cand(repo, cand_ctx, candp1, nodep1)
+    elif nodep2 != candp2:
+        cand_ctx = _rebase_cand(repo, cand_ctx, candp2, nodep2)
+    if successive:
+        return (node_ctx, cand_ctx)
+    else:
+        return (cand_ctx, node_ctx)
+
+
+def _rebase_cand(repo, ctx, old_base, new_base):
+    """return a view of ctx rebased in-memory from old_base to new_base
 
-    if nodep1 != candp1 or nodep2 != candp2:
-        return False, b"changesets rebased"
-
-    return True, cand
+    This can be used to produce a patch in obslog even when changesets were
+    rebased.
+    """
+    # XXX inspired by the diff.merge feature (mercurial.diffutil.diff_parent).
+    # We should move this logic to core.
+    base = context.overlayworkingctx(repo)
+    base.setbase(ctx)
+    configoverrides = {
+        (b'ui', b'forcemerge'): b'internal:merge3-lie-about-conflicts'
+    }
+    with repo.ui.configoverride(configoverrides, b'obslog-diff'):
+        # hg <= 5.8 (7a430116f639)
+        # this try-finally block can be replaced by ui.silent context manager
+        try:
+            repo.ui.pushbuffer()
+            compat._update(
+                repo,
+                new_base,
+                labels=[
+                    b'predecessor',
+                    b'successor-parent',
+                    b'predecessor-parent',
+                ],
+                force=True,
+                branchmerge=True,
+                wc=base,
+                ancestor=old_base,
+            )
+        finally:
+            repo.ui.popbuffer()
+    return base.tomemctx(text=ctx.description())
 
 def getmarkerdescriptionpatch(repo, basedesc, succdesc):
     # description are stored without final new line,
@@ -677,18 +748,14 @@
 
     # Patch display
     if includediff is True:
-        _patchavailable = patchavailable(node, repo, nodes,
-                                         successive=successive)
 
-        if _patchavailable[0] is True:
-            diffnode = _patchavailable[1]
-
-            if successive:
-                actx = repo[node]
-                bctx = repo[diffnode]
-            else:
-                actx = repo[diffnode]
-                bctx = repo[node]
+        try:
+            actx, bctx = prepare_patch(repo, node, nodes, successive=successive)
+            assert actx is not None
+            assert bctx is not None
+        except _NoPatchAvailable as exc:
+            fm.data(nopatchreason=exc.reason)
+        else:
             # Description patch
             descriptionpatch = getmarkerdescriptionpatch(repo,
                                                          actx.description(),
@@ -717,7 +784,7 @@
             matchfn = scmutil.matchall(repo)
             firstline = True
             linestart = True
-            for chunk, label in patch.diffui(repo, actx.node(), bctx.node(),
+            for chunk, label in patch.diffui(repo, actx, bctx,
                                              matchfn, opts=diffopts):
                 if firstline:
                     ui.write(b'\n')
@@ -728,8 +795,6 @@
                     linestart = True
                 ui.write(chunk, label=label)
             fm.data(patch=ui.popbuffer())
-        else:
-            fm.data(nopatchreason=_patchavailable[1])
 
 def _prepare_hunk(hunk):
     """Drop all information but the username and patch"""
--- a/hgext3rd/evolve/rewriteutil.py	Tue Nov 26 18:03:09 2024 +0400
+++ b/hgext3rd/evolve/rewriteutil.py	Thu Feb 06 12:17:01 2025 +0100
@@ -233,14 +233,6 @@
             revs = sorted(revs)
     return repomarks, revs
 
-try:
-    from mercurial import mergestate
-    mergestate.memmergestate
-    hasmemmergestate = True
-except (ImportError, AttributeError):
-    # hg <= 5.5 (19590b126764)
-    hasmemmergestate = False
-
 def rewrite(repo, old, head, newbases, commitopts):
     """Return (nodeid, created) where nodeid is the identifier of the
     changeset generated by the rewrite process, and created is True if
@@ -251,7 +243,7 @@
     # mergestate and use that. We don't want that to happen, so we'll require
     # users of old Mercurial versions to run `hg touch` etc without
     # mergestate.
-    if not hasmemmergestate:
+    if not compat.hasmemmergestate:
         ms = compat.mergestate.read(repo)
         mergeutil.checkunresolved(ms)
 
--- a/hgext3rd/topic/__init__.py	Tue Nov 26 18:03:09 2024 +0400
+++ b/hgext3rd/topic/__init__.py	Thu Feb 06 12:17:01 2025 +0100
@@ -238,7 +238,7 @@
               b'log.topic': b'green_background',
               }
 
-__version__ = b'1.1.6.dev0'
+__version__ = b'1.1.7.dev0'
 
 testedwith = b'4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9'
 minimumhgversion = b'4.9'
--- a/tests/test-evolve-obshistory-amend-then-fold.t	Tue Nov 26 18:03:09 2024 +0400
+++ b/tests/test-evolve-obshistory-amend-then-fold.t	Thu Feb 06 12:17:01 2025 +0100
@@ -101,7 +101,7 @@
   |
   x  b7ea6d14e664 (3) B1
   |    folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  0dec01379d3b (2) B0
        reworded(description) as b7ea6d14e664 using amend by test (Thu Jan 01 00:00:00 1970 +0000)
@@ -154,7 +154,7 @@
   |
   x  b7ea6d14e664 (3) B1
   |    folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  0dec01379d3b (2) B0
        reworded(description) as b7ea6d14e664 using amend by test (Thu Jan 01 00:00:00 1970 +0000)
--- a/tests/test-evolve-obshistory-fold.t	Tue Nov 26 18:03:09 2024 +0400
+++ b/tests/test-evolve-obshistory-fold.t	Thu Feb 06 12:17:01 2025 +0100
@@ -93,7 +93,7 @@
   |\
   x |  0dec01379d3b (2) B0
    /     folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  471f378eab4c (1) A0
        folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
@@ -116,7 +116,7 @@
   $ hg obslog --hidden 0dec01379d3b --patch --no-origin
   x  0dec01379d3b (2) B0
        folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
-         (No patch available, changesets rebased)
+         (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   
 Check that with all option, all changesets are shown
   $ hg obslog --hidden --all 0dec01379d3b --patch --no-origin
@@ -124,7 +124,7 @@
   |\
   x |  0dec01379d3b (2) B0
    /     folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  471f378eab4c (1) A0
        folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
@@ -148,7 +148,7 @@
   |\
   x |  0dec01379d3b (2) B0
    /     folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  471f378eab4c (1) A0
        folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000)
--- a/tests/test-evolve-obshistory-lots-of-splits.t	Tue Nov 26 18:03:09 2024 +0400
+++ b/tests/test-evolve-obshistory-lots-of-splits.t	Thu Feb 06 12:17:01 2025 +0100
@@ -180,7 +180,7 @@
   $ hg obslog de7290d8b885 --hidden --all --patch
   o  1ae8bc733a14 (4) A0
   |    split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   | o  337fec4d2edc (2) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
@@ -203,11 +203,11 @@
   |
   | @  c7f044602e9b (5) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   | o  f257fde29c7a (3) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  de7290d8b885 (1) A0
   
@@ -255,7 +255,7 @@
   $ hg obslog c7f044602e9b --patch
   @  c7f044602e9b (5) A0
   |    split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  de7290d8b885 (1) A0
   
@@ -351,7 +351,7 @@
   $ hg obslog 2::5 --patch
   o  1ae8bc733a14 (4) A0
   |    split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   | o  337fec4d2edc (2) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
@@ -374,11 +374,11 @@
   |
   | @  c7f044602e9b (5) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   | o  f257fde29c7a (3) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  de7290d8b885 (1) A0
   
@@ -398,7 +398,7 @@
   $ hg obslog 5 --all --patch
   o  1ae8bc733a14 (4) A0
   |    split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   | o  337fec4d2edc (2) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
@@ -421,11 +421,11 @@
   |
   | @  c7f044602e9b (5) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   | o  f257fde29c7a (3) A0
   |/     split(parent, content) from de7290d8b885 using split by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  de7290d8b885 (1) A0
   
--- a/tests/test-evolve-obshistory-split.t	Tue Nov 26 18:03:09 2024 +0400
+++ b/tests/test-evolve-obshistory-split.t	Thu Feb 06 12:17:01 2025 +0100
@@ -177,7 +177,7 @@
   | @  f257fde29c7a (3) A0
   |/     split(parent, content) from 471597cad322 using split by test (Thu Jan 01 00:00:00 1970 +0000)
   |        note: testing split
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  471597cad322 (1) A0
   
@@ -187,7 +187,7 @@
   @  f257fde29c7a (3) A0
   |    split(parent, content) from 471597cad322 using split by test (Thu Jan 01 00:00:00 1970 +0000)
   |      note: testing split
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  471597cad322 (1) A0
   
@@ -206,7 +206,7 @@
   | @  f257fde29c7a (3) A0
   |/     split(parent, content) from 471597cad322 using split by test (Thu Jan 01 00:00:00 1970 +0000)
   |        note: testing split
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  471597cad322 (1) A0
   
@@ -246,7 +246,7 @@
   | @  f257fde29c7a (3) A0
   |/     split(parent, content) from 471597cad322 using split by test (Thu Jan 01 00:00:00 1970 +0000)
   |        note: testing split
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  471597cad322 (1) A0
   
--- a/tests/test-evolve-phase-divergence.t	Tue Nov 26 18:03:09 2024 +0400
+++ b/tests/test-evolve-phase-divergence.t	Thu Feb 06 12:17:01 2025 +0100
@@ -1832,7 +1832,7 @@
   $ hg obslog --patch
   @  9eebcb77a7e2 (3) phase-divergent update to 3074c7249d20:
   |    rewritten(description, parent, content) from 599454370881 using evolve by test (Thu Jan 01 00:00:00 1970 +0000)
-  |      (No patch available, changesets rebased)
+  |      (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  599454370881 (2) E2
   |    rewritten(description, content) from 3074c7249d20 using amend by test (Thu Jan 01 00:00:00 1970 +0000)
--- a/tests/test-evolve-public-content-divergent-corner-cases.t	Tue Nov 26 18:03:09 2024 +0400
+++ b/tests/test-evolve-public-content-divergent-corner-cases.t	Thu Feb 06 12:17:01 2025 +0100
@@ -382,7 +382,7 @@
   |
   | *  e568fd1029bb (4) added c e
   |/     rewritten(description, parent, content) from 9150fe93bec6 using prune by test (Thu Jan 01 00:00:00 1970 +0000)
-  |        (No patch available, changesets rebased)
+  |        (No patch available, Mercurial 5.6 or newer is required for in-memory rebase)
   |
   x  9150fe93bec6 (3) added d
   
--- a/tests/test-stack-split-s0.t	Tue Nov 26 18:03:09 2024 +0400
+++ b/tests/test-stack-split-s0.t	Thu Feb 06 12:17:01 2025 +0100
@@ -44,8 +44,7 @@
   created new head
   (consider using topic for lightweight branches. See 'hg help topic')
 
-  $ hg --config extensions.evolve= prune --split --rev 'desc(A)' \
-  >    --successor 'desc(X)' --successor 'desc(Y)'
+  $ hg prune --split --rev 'desc(A)' --successor 'desc(X)' --successor 'desc(Y)'
   1 changesets pruned
   3 new orphan changesets