# HG changeset patch # User Martin von Zweigbergk # Date 1497510952 25200 # Node ID 8e3021fd1a44e48a4720bb6fa4538fba399ad213 # Parent e8c8d81eb864aec3ad5a9360f4757c6c8d13ccd9 strip: include phases in bundle (BC) Before this patch, unbundling a stripped changeset would make it a draft (unless the parent was secret). This meant that one would lose phase information when stripping and unbundling secret changesets. The same thing was true for public changesets. While stripping public changesets is generally rare, it's done frequently by e.g. the narrowhg extension. We also include the phases in the temporary bundle, just in case stripping were to fail after that point, so the user can still restore the repo including phase information. Before this patch, the phases were left untouched during the bundling and unbundling of the temporary bundle. Only at the end of the transaction would phasecache.filterunknown() be called to remove phase roots that were no longer valid. We now need to call that also after the first stripping, i.e. before applying the temporary bundle. Otherwise unbundling the temporary bundle will cause a read of the phase cache which has stripped changesets in the cache and that fails. Like with obsmarkers, we unconditionally include the phases in the bundle when stripping (when using bundle2, such as when generaldelta is enabled). The reason for doing that for strip but not for bundle is that strip bundles are not meant to be shared outside the repo, so we don't care as much about compatibility. diff -r e8c8d81eb864 -r 8e3021fd1a44 mercurial/repair.py --- a/mercurial/repair.py Thu Jun 22 10:10:02 2017 -0700 +++ b/mercurial/repair.py Thu Jun 15 00:15:52 2017 -0700 @@ -49,7 +49,11 @@ bundletype = "HG10UN" outgoing = discovery.outgoing(repo, missingroots=bases, missingheads=heads) - contentopts = {'cg.version': cgversion, 'obsolescence': obsolescence} + contentopts = { + 'cg.version': cgversion, + 'obsolescence': obsolescence, + 'phases': True, + } return bundle2.writenewbundle(repo.ui, repo, 'strip', name, bundletype, outgoing, contentopts, vfs, compression=comp) @@ -194,6 +198,7 @@ deleteobsmarkers(repo.obsstore, stripobsidx) del repo.obsstore + repo._phasecache.filterunknown(repo) if tmpbundlefile: ui.note(_("adding branch\n")) f = vfs.open(tmpbundlefile, "rb") diff -r e8c8d81eb864 -r 8e3021fd1a44 tests/test-bundle-phases.t --- a/tests/test-bundle-phases.t Thu Jun 22 10:10:02 2017 -0700 +++ b/tests/test-bundle-phases.t Thu Jun 15 00:15:52 2017 -0700 @@ -170,6 +170,32 @@ | o A public +Unbundling change in the middle of a stack does not affect later changes + $ hg strip --no-backup E + $ hg phase --secret --force D + $ hg log -G -T '{desc} {phase}\n' + o D secret + | + o C draft + | + o B draft + | + o A public + + $ hg bundle --base A -r B bundle + 1 changesets found + $ hg unbundle -q bundle + $ rm bundle + $ hg log -G -T '{desc} {phase}\n' + o D secret + | + o C draft + | + o B draft + | + o A public + + $ cd .. Set up repo with non-linear history diff -r e8c8d81eb864 -r 8e3021fd1a44 tests/test-generaldelta.t --- a/tests/test-generaldelta.t Thu Jun 22 10:10:02 2017 -0700 +++ b/tests/test-generaldelta.t Thu Jun 15 00:15:52 2017 -0700 @@ -157,5 +157,7 @@ Stream params: sortdict([('Compression', 'BZ')]) changegroup -- "sortdict([('version', '02'), ('nbchanges', '1')])" 1c5d4dc9a8b8d6e1750966d343e94db665e7a1e9 + phase-heads -- 'sortdict()' + 1c5d4dc9a8b8d6e1750966d343e94db665e7a1e9 draft $ cd .. diff -r e8c8d81eb864 -r 8e3021fd1a44 tests/test-obsolete.t --- a/tests/test-obsolete.t Thu Jun 22 10:10:02 2017 -0700 +++ b/tests/test-obsolete.t Thu Jun 15 00:15:52 2017 -0700 @@ -1239,6 +1239,8 @@ obsmarkers -- 'sortdict()' version: 1 (70 bytes) f27abbcc1f77fb409cf9160482fe619541e2d605 0 {e008cf2834908e5d6b0f792a9d4b0e2272260fb8} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} + phase-heads -- 'sortdict()' + f27abbcc1f77fb409cf9160482fe619541e2d605 draft $ hg pull .hg/strip-backup/e008cf283490-*-backup.hg pulling from .hg/strip-backup/e008cf283490-39c978dc-backup.hg @@ -1283,6 +1285,8 @@ version: 1 (139 bytes) e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} f27abbcc1f77fb409cf9160482fe619541e2d605 0 {e008cf2834908e5d6b0f792a9d4b0e2272260fb8} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} + phase-heads -- 'sortdict()' + b0551702f918510f01ae838ab03a463054c67b46 draft $ hg unbundle .hg/strip-backup/e016b03fd86f-*-backup.hg adding changesets diff -r e8c8d81eb864 -r 8e3021fd1a44 tests/test-rebase-conflicts.t --- a/tests/test-rebase-conflicts.t Thu Jun 22 10:10:02 2017 -0700 +++ b/tests/test-rebase-conflicts.t Thu Jun 15 00:15:52 2017 -0700 @@ -281,16 +281,18 @@ list of changesets: e31216eec445e44352c5f01588856059466a24c9 2f2496ddf49d69b5ef23ad8cf9fb2e0e4faf0ac2 - bundle2-output-bundle: "HG20", (1 params) 1 parts total + bundle2-output-bundle: "HG20", (1 params) 2 parts total bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload + bundle2-output-part: "phase-heads" 24 bytes payload saved backup bundle to $TESTTMP/issue4041/.hg/strip-backup/e31216eec445-15f7a814-backup.hg (glob) 3 changesets found list of changesets: 4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c 19c888675e133ab5dff84516926a65672eaf04d9 2a7f09cac94c7f4b73ebd5cd1a62d3b2e8e336bf - bundle2-output-bundle: "HG20", 1 parts total + bundle2-output-bundle: "HG20", 2 parts total bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload + bundle2-output-part: "phase-heads" 24 bytes payload adding branch bundle2-input-bundle: with-transaction bundle2-input-part: "changegroup" (params: 1 mandatory 1 advisory) supported @@ -303,7 +305,9 @@ adding f1.txt revisions added 2 changesets with 2 changes to 1 files bundle2-input-part: total payload size 1686 - bundle2-input-bundle: 0 parts total + bundle2-input-part: "phase-heads" supported + bundle2-input-part: total payload size 24 + bundle2-input-bundle: 1 parts total updating the branch cache invalid branchheads cache (served): tip differs rebase completed diff -r e8c8d81eb864 -r 8e3021fd1a44 tests/test-strip.t --- a/tests/test-strip.t Thu Jun 22 10:10:02 2017 -0700 +++ b/tests/test-strip.t Thu Jun 15 00:15:52 2017 -0700 @@ -213,6 +213,8 @@ Stream params: sortdict([('Compression', 'BZ')]) changegroup -- "sortdict([('version', '02'), ('nbchanges', '1')])" 264128213d290d868c54642d13aeaa3675551a78 + phase-heads -- 'sortdict()' + 264128213d290d868c54642d13aeaa3675551a78 draft $ hg pull .hg/strip-backup/* pulling from .hg/strip-backup/264128213d29-0b39d6bf-backup.hg searching for changes @@ -839,8 +841,9 @@ list of changesets: 6625a516847449b6f0fa3737b9ba56e9f0f3032c d8db9d1372214336d2b5570f20ee468d2c72fa8b - bundle2-output-bundle: "HG20", (1 params) 1 parts total + bundle2-output-bundle: "HG20", (1 params) 2 parts total bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload + bundle2-output-part: "phase-heads" 24 bytes payload saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/6625a5168474-345bb43d-backup.hg (glob) updating the branch cache invalid branchheads cache (served): tip differs