--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-bundle-phases.t Thu Jun 22 10:10:02 2017 -0700
@@ -0,0 +1,259 @@
+ $ 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
+
+ $ 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