strip: explicitly compute the boundary of the backup bundle
authorPierre-Yves David <pierre-yves.david@octobus.net>
Thu, 09 Mar 2023 15:06:59 +0100
changeset 50394 7a017cd07a1e
parent 50393 f95ab2c53303
child 50395 71a2c061865d
strip: explicitly compute the boundary of the backup bundle We want to make change to the set of backed up revision in a future changeset, we start with a change of the computation without any changes in the semantic to clarify later changeset. The could of costly assert are here to testify that the result is still correct. They will be removed in the next changesets, but I wanted them in this changeset to help in case someone bisect a regression to this changeset in the future.
mercurial/repair.py
--- 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)