mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 08:47:12 +03:00
1f6af49532
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.
286 lines
6.1 KiB
Perl
286 lines
6.1 KiB
Perl
$ cat >> $HGRCPATH <<EOF
|
|
> [experimental]
|
|
> bundle-phases=yes
|
|
> [extensions]
|
|
> strip=
|
|
> drawdag=$TESTDIR/drawdag.py
|
|
> EOF
|
|
|
|
Set up repo with linear history
|
|
$ hg init linear
|
|
$ cd linear
|
|
$ hg debugdrawdag <<'EOF'
|
|
> E
|
|
> |
|
|
> D
|
|
> |
|
|
> C
|
|
> |
|
|
> B
|
|
> |
|
|
> A
|
|
> EOF
|
|
$ hg phase --public A
|
|
$ hg phase --force --secret D
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E secret
|
|
|
|
|
o D secret
|
|
|
|
|
o C draft
|
|
|
|
|
o B draft
|
|
|
|
|
o A public
|
|
|
|
Phases are restored when unbundling
|
|
$ hg bundle --base B -r E bundle
|
|
3 changesets found
|
|
$ hg debugbundle bundle
|
|
Stream params: sortdict([('Compression', 'BZ')])
|
|
changegroup -- "sortdict([('version', '02'), ('nbchanges', '3')])"
|
|
26805aba1e600a82e93661149f2313866a221a7b
|
|
f585351a92f85104bff7c284233c338b10eb1df7
|
|
9bc730a19041f9ec7cb33c626e811aa233efb18c
|
|
phase-heads -- 'sortdict()'
|
|
26805aba1e600a82e93661149f2313866a221a7b draft
|
|
$ hg strip --no-backup C
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E secret
|
|
|
|
|
o D secret
|
|
|
|
|
o C draft
|
|
|
|
|
o B draft
|
|
|
|
|
o A public
|
|
|
|
Root revision's phase is preserved
|
|
$ hg bundle -a bundle
|
|
5 changesets found
|
|
$ hg strip --no-backup A
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E secret
|
|
|
|
|
o D secret
|
|
|
|
|
o C draft
|
|
|
|
|
o B draft
|
|
|
|
|
o A public
|
|
|
|
Completely public history can be restored
|
|
$ hg phase --public E
|
|
$ hg bundle -a bundle
|
|
5 changesets found
|
|
$ hg strip --no-backup A
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E public
|
|
|
|
|
o D public
|
|
|
|
|
o C public
|
|
|
|
|
o B public
|
|
|
|
|
o A public
|
|
|
|
Direct transition from public to secret can be restored
|
|
$ hg phase --secret --force D
|
|
$ hg bundle -a bundle
|
|
5 changesets found
|
|
$ hg strip --no-backup A
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E secret
|
|
|
|
|
o D secret
|
|
|
|
|
o C public
|
|
|
|
|
o B public
|
|
|
|
|
o A public
|
|
|
|
Revisions within bundle preserve their phase even if parent changes its phase
|
|
$ hg phase --draft --force B
|
|
$ hg bundle --base B -r E bundle
|
|
3 changesets found
|
|
$ hg strip --no-backup C
|
|
$ hg phase --public B
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E secret
|
|
|
|
|
o D secret
|
|
|
|
|
o C draft
|
|
|
|
|
o B public
|
|
|
|
|
o A public
|
|
|
|
Phase of ancestors of stripped node get advanced to accommodate child
|
|
$ hg bundle --base B -r E bundle
|
|
3 changesets found
|
|
$ hg strip --no-backup C
|
|
$ hg phase --force --secret B
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E secret
|
|
|
|
|
o D secret
|
|
|
|
|
o C draft
|
|
|
|
|
o B draft
|
|
|
|
|
o A public
|
|
|
|
Unbundling advances phases of changesets even if they were already in the repo.
|
|
To test that, create a bundle of everything in draft phase and then unbundle
|
|
to see that secret becomes draft, but public remains public.
|
|
$ hg phase --draft --force A
|
|
$ hg phase --draft E
|
|
$ hg bundle -a bundle
|
|
5 changesets found
|
|
$ hg phase --public A
|
|
$ hg phase --secret --force E
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{desc} {phase}\n'
|
|
o E draft
|
|
|
|
|
o D draft
|
|
|
|
|
o C draft
|
|
|
|
|
o B draft
|
|
|
|
|
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
|
|
$ hg init non-linear
|
|
$ cd non-linear
|
|
$ hg debugdrawdag <<'EOF'
|
|
> D E
|
|
> |\|
|
|
> B C
|
|
> |/
|
|
> A
|
|
> EOF
|
|
$ hg phase --public C
|
|
$ hg phase --force --secret B
|
|
$ hg log -G -T '{node|short} {desc} {phase}\n'
|
|
o 03ca77807e91 E draft
|
|
|
|
|
| o 215e7b0814e1 D secret
|
|
|/|
|
|
o | dc0947a82db8 C public
|
|
| |
|
|
| o 112478962961 B secret
|
|
|/
|
|
o 426bada5c675 A public
|
|
|
|
|
|
Restore bundle of entire repo
|
|
$ hg bundle -a bundle
|
|
5 changesets found
|
|
$ hg debugbundle bundle
|
|
Stream params: sortdict([('Compression', 'BZ')])
|
|
changegroup -- "sortdict([('version', '02'), ('nbchanges', '5')])"
|
|
426bada5c67598ca65036d57d9e4b64b0c1ce7a0
|
|
112478962961147124edd43549aedd1a335e44bf
|
|
dc0947a82db884575bb76ea10ac97b08536bfa03
|
|
215e7b0814e1cac8e2614e7284f2a5dc266b4323
|
|
03ca77807e919db8807c3749086dc36fb478cac0
|
|
phase-heads -- 'sortdict()'
|
|
dc0947a82db884575bb76ea10ac97b08536bfa03 public
|
|
03ca77807e919db8807c3749086dc36fb478cac0 draft
|
|
$ hg strip --no-backup A
|
|
$ hg unbundle -q bundle
|
|
$ rm bundle
|
|
$ hg log -G -T '{node|short} {desc} {phase}\n'
|
|
o 03ca77807e91 E draft
|
|
|
|
|
| o 215e7b0814e1 D secret
|
|
|/|
|
|
o | dc0947a82db8 C public
|
|
| |
|
|
| o 112478962961 B secret
|
|
|/
|
|
o 426bada5c675 A public
|
|
|
|
|
|
$ hg bundle --base 'A + C' -r D bundle
|
|
2 changesets found
|
|
$ hg debugbundle bundle
|
|
Stream params: sortdict([('Compression', 'BZ')])
|
|
changegroup -- "sortdict([('version', '02'), ('nbchanges', '2')])"
|
|
112478962961147124edd43549aedd1a335e44bf
|
|
215e7b0814e1cac8e2614e7284f2a5dc266b4323
|
|
phase-heads -- 'sortdict()'
|
|
$ rm bundle
|
|
|
|
$ hg bundle --base A -r D bundle
|
|
3 changesets found
|
|
$ hg debugbundle bundle
|
|
Stream params: sortdict([('Compression', 'BZ')])
|
|
changegroup -- "sortdict([('version', '02'), ('nbchanges', '3')])"
|
|
112478962961147124edd43549aedd1a335e44bf
|
|
dc0947a82db884575bb76ea10ac97b08536bfa03
|
|
215e7b0814e1cac8e2614e7284f2a5dc266b4323
|
|
phase-heads -- 'sortdict()'
|
|
dc0947a82db884575bb76ea10ac97b08536bfa03 public
|
|
$ rm bundle
|
|
|
|
$ hg bundle --base 'B + C' -r 'D + E' bundle
|
|
2 changesets found
|
|
$ hg debugbundle bundle
|
|
Stream params: sortdict([('Compression', 'BZ')])
|
|
changegroup -- "sortdict([('version', '02'), ('nbchanges', '2')])"
|
|
215e7b0814e1cac8e2614e7284f2a5dc266b4323
|
|
03ca77807e919db8807c3749086dc36fb478cac0
|
|
phase-heads -- 'sortdict()'
|
|
03ca77807e919db8807c3749086dc36fb478cac0 draft
|
|
$ rm bundle
|