mercurial/repair.py
changeset 50394 7a017cd07a1e
parent 49284 d44e3c45f0e4
child 50395 71a2c061865d
--- a/mercurial/repair.py	Fri Mar 10 04:04:10 2023 +0100
+++ b/mercurial/repair.py	Thu Mar 09 15:06:59 2023 +0100
@@ -349,8 +349,25 @@
 def _createstripbackup(repo, stripbases, node, topic):
     # backup the changeset we are about to strip
     vfs = repo.vfs
-    cl = repo.changelog
-    backupfile = backupbundle(repo, stripbases, cl.heads(), node, topic)
+    unfi = repo.unfiltered()
+    to_node = unfi.changelog.node
+    all_backup = unfi.revs(
+        b"(%ln)::(%ld)", stripbases, unfi.changelog.headrevs()
+    )
+    if not all_backup:
+        return None
+
+    def to_nodes(revs):
+        return [to_node(r) for r in revs]
+
+    simpler_bases = to_nodes(
+        unfi.revs("roots(%ln::%ln)", stripbases, stripbases)
+    )
+    bases = to_nodes(unfi.revs("roots(%ld)", all_backup))
+    heads = to_nodes(unfi.revs("heads(%ld)", all_backup))
+    assert bases == simpler_bases
+    assert set(heads).issubset(set(repo.changelog.heads()))
+    backupfile = backupbundle(repo, bases, heads, node, topic)
     repo.ui.status(_(b"saved backup bundle to %s\n") % vfs.join(backupfile))
     repo.ui.log(
         b"backupbundle", b"saved backup bundle to %s\n", vfs.join(backupfile)