changeset 50428:7a017cd07a1e

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.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 09 Mar 2023 15:06:59 +0100
parents f95ab2c53303
children 71a2c061865d
files mercurial/repair.py
diffstat 1 files changed, 19 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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)