# HG changeset patch # User Pierre-Yves David # Date 1678269671 -3600 # Node ID bcf54837241d2efa0d4e0b727d7fe9b6433e3448 # Parent cc712ce3361fdee787155c52fb45b71b29fdf39f bundle: prevent implicite bundling of internal changeset Now that the two mains source of on-disk bundle are preventing the inclusion of internal changesets in their bundling. We can add a lower level check that would prevent any other leakage of internal-phase changesets. We keep the door open to some usage, like the temporary bundle using during strip for example. diff -r cc712ce3361f -r bcf54837241d mercurial/bundle2.py --- a/mercurial/bundle2.py Fri Mar 10 07:19:25 2023 +0100 +++ b/mercurial/bundle2.py Wed Mar 08 11:01:11 2023 +0100 @@ -1703,6 +1703,7 @@ vfs=None, compression=None, compopts=None, + allow_internal=False, ): if bundletype.startswith(b'HG10'): cg = changegroup.makechangegroup(repo, outgoing, b'01', source) @@ -1718,6 +1719,14 @@ elif not bundletype.startswith(b'HG20'): raise error.ProgrammingError(b'unknown bundle type: %s' % bundletype) + # enforce that no internal phase are to be bundled + bundled_internal = repo.revs(b"%ln and _internal()", outgoing.ancestorsof) + if bundled_internal and not allow_internal: + count = len(repo.revs(b'%ln and _internal()', outgoing.missing)) + msg = "backup bundle would contains %d internal changesets" + msg %= count + raise error.ProgrammingError(msg) + caps = {} if opts.get(b'obsolescence', False): caps[b'obsmarkers'] = (b'V1',) diff -r cc712ce3361f -r bcf54837241d mercurial/repair.py --- a/mercurial/repair.py Fri Mar 10 07:19:25 2023 +0100 +++ b/mercurial/repair.py Wed Mar 08 11:01:11 2023 +0100 @@ -36,7 +36,14 @@ def backupbundle( - repo, bases, heads, node, suffix, compress=True, obsolescence=True + repo, + bases, + heads, + node, + suffix, + compress=True, + obsolescence=True, + tmp_backup=False, ): """create a bundle with the specified revisions as a backup""" @@ -83,6 +90,7 @@ contentopts, vfs, compression=comp, + allow_internal=tmp_backup, ) @@ -199,6 +207,7 @@ b'temp', compress=False, obsolescence=False, + tmp_backup=True, ) with ui.uninterruptible():