Mercurial > hg
view tests/test-strip.t @ 42044:bb271ec2fbfb
compression: introduce a `storage.revlog.zstd.level` configuration
This option control the zstd compression level used when compressing revlog
chunk. The usage of zstd for revlog compression has not graduated from
experimental yet, but we intend to fix that soon.
The option name for the compression level is more straight forward to pick, so
this changesets comes first. Having a dedicated option for each compression
engine is useful because they don't support the same range of values.
I ran the same measurement as for the zlib compression level (in the parent
changesets). The variation in repository size is stay mostly in the same (small)
range. The "read/write" performance see smallish variation, but are overall much
better than zlib. Write performance show the same tend of having better write
performance for when reaching high-end compression.
Again, we don't intend to change the default zstd compression level (currently:
3) in this series. However this is worth investigating in the future.
The Performance comparison of zlib vs zstd is quite impressive. The repository
size stay in the same range, but the performance are much better in all
situations.
Comparison summary
==================
We are looking at:
- performance range for zlib
- performance range for zstd
- comparison of default zstd (level-3) to default zlib (level 6)
- comparison of the slowest zstd time to the fastest zlib time
Read performance:
-----------------
| zlib | zstd | cmp | f2s
mercurial | 0.170159 - 0.189219 | 0.144127 - 0.149624 | 80% | 88%
pypy | 2.679217 - 2.768691 | 1.532317 - 1.705044 | 60% | 63%
netbeans | 122.477027 - 141.620281 | 72.996346 - 89.731560 | 58% | 73%
mozilla | 147.867662 - 170.572118 | 91.700995 - 105.853099 | 56% | 71%
Write performance:
------------------
| zlib | zstd | cmp | f2s
mercurial | 53.250304 - 56.2936129 | 40.877025 - 45.677286 | 75% | 86%
pypy | 460.721984 - 476.589918 | 270.545409 - 301.002219 | 63% | 65%
netbeans | 520.560316 - 715.930400 | 370.356311 - 428.329652 | 55% | 82%
mozilla | 739.803002 - 987.056093 | 505.152906 - 591.930683 | 57% | 80%
Raw data
--------
repo alg lvl .hg/store size 00manifest.d read write
mercurial zlib 1 49,402,813 5,963,475 0.170159 53.250304
mercurial zlib 6 47,197,397 5,875,730 0.182820 56.264320
mercurial zlib 9 47,121,596 5,849,781 0.189219 56.293612
mercurial zstd 1 49,737,084 5,966,355 0.144127 40.877025
mercurial zstd 3 48,961,867 5,895,208 0.146376 42.268142
mercurial zstd 5 48,200,592 5,938,676 0.149624 43.162875
mercurial zstd 10 47,833,520 5,913,353 0.145185 44.012489
mercurial zstd 15 47,314,604 5,728,679 0.147686 45.677286
mercurial zstd 20 47,330,502 5,830,539 0.145789 45.025407
mercurial zstd 22 47,330,076 5,830,539 0.143996 44.690460
pypy zlib 1 370,830,572 28,462,425 2.679217 460.721984
pypy zlib 6 340,112,317 27,648,747 2.768691 467.537158
pypy zlib 9 338,360,736 27,639,003 2.763495 476.589918
pypy zstd 1 362,377,479 27,916,214 1.532317 270.545409
pypy zstd 3 354,137,693 27,905,988 1.686718 294.951509
pypy zstd 5 342,640,043 27,655,774 1.705044 301.002219
pypy zstd 10 334,224,327 27,164,493 1.567287 285.186239
pypy zstd 15 329,000,363 26,645,965 1.637729 299.561332
pypy zstd 20 324,534,039 26,199,547 1.526813 302.149827
pypy zstd 22 324,530,595 26,198,932 1.525718 307.821218
netbeans zlib 1 1,281,847,810 165,495,457 122.477027 520.560316
netbeans zlib 6 1,205,284,353 159,161,207 139.876147 715.930400
netbeans zlib 9 1,197,135,671 155,034,586 141.620281 678.297064
netbeans zstd 1 1,259,581,737 160,840,613 72.996346 370.356311
netbeans zstd 3 1,232,978,122 157,691,551 81.622317 396.733087
netbeans zstd 5 1,208,034,075 160,246,880 83.080549 364.342626
netbeans zstd 10 1,188,624,176 156,083,417 79.323935 403.594602
netbeans zstd 15 1,176,973,589 153,859,477 89.731560 428.329652
netbeans zstd 20 1,162,958,258 151,147,535 82.842667 392.335349
netbeans zstd 22 1,162,707,029 151,150,220 82.565695 402.840655
mozilla zlib 1 2,775,497,186 298,527,987 147.867662 751.263721
mozilla zlib 6 2,596,856,420 286,597,671 170.572118 987.056093
mozilla zlib 9 2,587,542,494 287,018,264 163.622338 739.803002
mozilla zstd 1 2,723,159,348 286,617,532 91.700995 570.042751
mozilla zstd 3 2,665,055,001 286,152,013 95.240155 561.412805
mozilla zstd 5 2,607,819,817 288,060,030 101.978048 505.152906
mozilla zstd 10 2,558,761,085 283,967,648 104.113481 497.771202
mozilla zstd 15 2,526,216,060 275,581,300 105.853099 591.930683
mozilla zstd 20 2,485,114,806 266,478,859 95.268795 576.515389
mozilla zstd 22 2,484,869,080 266,456,505 94.429282 572.785537
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 27 Mar 2019 18:35:59 +0100 |
parents | 943248e47864 |
children | 1acaa9f37377 |
line wrap: on
line source
$ echo "[extensions]" >> $HGRCPATH $ echo "strip=" >> $HGRCPATH $ echo "drawdag=$TESTDIR/drawdag.py" >> $HGRCPATH $ restore() { > hg unbundle -q .hg/strip-backup/* > rm .hg/strip-backup/* > } $ teststrip() { > hg up -C $1 > echo % before update $1, strip $2 > hg parents > hg --traceback strip $2 > echo % after update $1, strip $2 > hg parents > restore > } $ hg init test $ cd test $ echo foo > bar $ hg ci -Ama adding bar $ echo more >> bar $ hg ci -Amb $ echo blah >> bar $ hg ci -Amc $ hg up 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo blah >> bar $ hg ci -Amd created new head $ echo final >> bar $ hg ci -Ame $ hg log changeset: 4:443431ffac4f tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: e changeset: 3:65bd5f99a4a3 parent: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: d changeset: 2:264128213d29 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: c changeset: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: b changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ teststrip 4 4 0 files updated, 0 files merged, 0 files removed, 0 files unresolved % before update 4, strip 4 changeset: 4:443431ffac4f tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: e 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) % after update 4, strip 4 changeset: 3:65bd5f99a4a3 tag: tip parent: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: d $ teststrip 4 3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved % before update 4, strip 3 changeset: 4:443431ffac4f tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: e 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) % after update 4, strip 3 changeset: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: b $ teststrip 1 4 0 files updated, 0 files merged, 0 files removed, 0 files unresolved % before update 1, strip 4 changeset: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: b saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) % after update 1, strip 4 changeset: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: b $ teststrip 4 2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved % before update 4, strip 2 changeset: 4:443431ffac4f tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: e saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) % after update 4, strip 2 changeset: 3:443431ffac4f tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: e $ teststrip 4 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved % before update 4, strip 1 changeset: 4:264128213d29 tag: tip parent: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: c 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) % after update 4, strip 1 changeset: 0:9ab35a2d17cb tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ teststrip null 4 0 files updated, 0 files merged, 1 files removed, 0 files unresolved % before update null, strip 4 saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) % after update null, strip 4 $ hg log changeset: 4:264128213d29 tag: tip parent: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: c changeset: 3:443431ffac4f user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: e changeset: 2:65bd5f99a4a3 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: d changeset: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: b changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ hg up -C 4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg parents changeset: 4:264128213d29 tag: tip parent: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: c $ hg --traceback strip 4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/264128213d29-0b39d6bf-backup.hg $ hg parents changeset: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: b $ hg debugbundle .hg/strip-backup/* Stream params: {Compression: BZ} changegroup -- {nbchanges: 1, version: 02} (mandatory: True) 264128213d290d868c54642d13aeaa3675551a78 cache:rev-branch-cache -- {} (mandatory: False) phase-heads -- {} (mandatory: True) 264128213d290d868c54642d13aeaa3675551a78 draft $ hg unbundle .hg/strip-backup/* adding changesets adding manifests adding file changes added 1 changesets with 0 changes to 1 files (+1 heads) new changesets 264128213d29 (1 drafts) (run 'hg heads' to see heads, 'hg merge' to merge) $ rm .hg/strip-backup/* $ hg log --graph o changeset: 4:264128213d29 | tag: tip | parent: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | | o changeset: 3:443431ffac4f | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: e | | | o changeset: 2:65bd5f99a4a3 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | @ changeset: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ hg up -C 2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 4 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) before strip of merge parent $ hg parents changeset: 2:65bd5f99a4a3 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: d changeset: 4:264128213d29 tag: tip parent: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: c $ hg strip 4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) after strip of merge parent $ hg parents changeset: 1:ef3a871183d7 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: b $ restore $ hg up 1 files updated, 0 files merged, 0 files removed, 0 files unresolved updated to "264128213d29: c" 1 other heads for branch "default" $ hg log -G @ changeset: 4:264128213d29 | tag: tip | parent: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | | o changeset: 3:443431ffac4f | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: e | | | o changeset: 2:65bd5f99a4a3 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | o changeset: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a 2 is parent of 3, only one strip should happen $ hg strip "roots(2)" 3 saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) $ hg log -G @ changeset: 2:264128213d29 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ restore $ hg log -G o changeset: 4:443431ffac4f | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: e | o changeset: 3:65bd5f99a4a3 | parent: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | | @ changeset: 2:264128213d29 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | o changeset: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a Failed hook while applying "saveheads" bundle. $ hg strip 2 --config hooks.pretxnchangegroup.bad=false 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) transaction abort! rollback completed strip failed, backup bundle stored in '$TESTTMP/test/.hg/strip-backup/*-backup.hg' (glob) strip failed, unrecovered changes stored in '$TESTTMP/test/.hg/strip-backup/*-temp.hg' (glob) (fix the problem, then recover the changesets with "hg unbundle '$TESTTMP/test/.hg/strip-backup/*-temp.hg'") (glob) abort: pretxnchangegroup.bad hook exited with status 1 [255] $ restore $ hg log -G o changeset: 4:443431ffac4f | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: e | o changeset: 3:65bd5f99a4a3 | parent: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | | o changeset: 2:264128213d29 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: c | @ changeset: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a 2 different branches: 2 strips $ hg strip 2 4 saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) $ hg log -G o changeset: 2:65bd5f99a4a3 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: d | @ changeset: 1:ef3a871183d7 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ restore 2 different branches and a common ancestor: 1 strip $ hg strip 1 "2|4" 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) $ restore verify fncache is kept up-to-date $ touch a $ hg ci -qAm a #if repofncache $ cat .hg/store/fncache | sort data/a.i data/bar.i #endif $ hg strip tip 0 files updated, 0 files merged, 1 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) #if repofncache $ cat .hg/store/fncache data/bar.i #endif stripping an empty revset $ hg strip "1 and not 1" abort: empty revision set [255] remove branchy history for qimport tests $ hg strip 3 saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) strip of applied mq should cleanup status file $ echo "mq=" >> $HGRCPATH $ hg up -C 3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo fooagain >> bar $ hg ci -mf $ hg qimport -r tip:2 applied patches before strip $ hg qapplied d e f stripping revision in queue $ hg strip 3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) applied patches after stripping rev in queue $ hg qapplied d stripping ancestor of queue $ hg strip 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) applied patches after stripping ancestor of queue $ hg qapplied Verify strip protects against stripping wc parent when there are uncommitted mods $ echo b > b $ echo bb > bar $ hg add b $ hg ci -m 'b' $ hg log --graph @ changeset: 1:76dcf9fab855 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: b | o changeset: 0:9ab35a2d17cb user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ hg up 0 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ echo c > bar $ hg up -t false merging bar merging bar failed! 1 files updated, 0 files merged, 0 files removed, 1 files unresolved use 'hg resolve' to retry unresolved file merges [1] $ hg sum parent: 1:76dcf9fab855 tip b branch: default commit: 1 modified, 1 unknown, 1 unresolved update: (current) phases: 2 draft mq: 3 unapplied $ echo c > b $ hg strip tip abort: local changes found [255] $ hg strip tip --keep saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) $ hg log --graph @ changeset: 0:9ab35a2d17cb tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: a $ hg status M bar ? b ? bar.orig $ rm bar.orig $ hg sum parent: 0:9ab35a2d17cb tip a branch: default commit: 1 modified, 1 unknown update: (current) phases: 1 draft mq: 3 unapplied Strip adds, removes, modifies with --keep $ touch b $ hg add b $ hg commit -mb $ touch c ... with a clean working dir $ hg add c $ hg rm bar $ hg commit -mc $ hg status $ hg strip --keep tip saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) $ hg status ! bar ? c ... with a dirty working dir $ hg add c $ hg rm bar $ hg commit -mc $ hg status $ echo b > b $ echo d > d $ hg strip --keep tip saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob) $ hg status M b ! bar ? c ? d ... after updating the dirstate $ hg add c $ hg commit -mc $ hg rm c $ hg commit -mc $ hg strip --keep '.^' -q $ cd .. stripping many nodes on a complex graph (issue3299) $ hg init issue3299 $ cd issue3299 $ hg debugbuilddag '@a.:a@b.:b.:x<a@a.:a<b@b.:b<a@a.:a' $ hg strip 'not ancestors(x)' saved backup bundle to $TESTTMP/issue3299/.hg/strip-backup/*-backup.hg (glob) test hg strip -B bookmark $ cd .. $ hg init bookmarks $ cd bookmarks $ hg debugbuilddag '..<2.*1/2:m<2+3:c<m+3:a<2.:b<m+2:d<2.:e<m+1:f' $ hg bookmark -r 'a' 'todelete' $ hg bookmark -r 'b' 'B' $ hg bookmark -r 'b' 'nostrip' $ hg bookmark -r 'c' 'delete' $ hg bookmark -r 'd' 'multipledelete1' $ hg bookmark -r 'e' 'multipledelete2' $ hg bookmark -r 'f' 'singlenode1' $ hg bookmark -r 'f' 'singlenode2' $ hg up -C todelete 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (activating bookmark todelete) $ hg strip -B nostrip bookmark 'nostrip' deleted abort: empty revision set [255] $ hg strip -B todelete 0 files updated, 0 files merged, 0 files removed, 0 files unresolved saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob) bookmark 'todelete' deleted $ hg id -ir dcbb326fdec2 abort: unknown revision 'dcbb326fdec2'! [255] $ hg id -ir d62d843c9a01 d62d843c9a01 $ hg bookmarks B 9:ff43616e5d0f delete 6:2702dd0c91e7 multipledelete1 11:e46a4836065c multipledelete2 12:b4594d867745 singlenode1 13:43227190fef8 singlenode2 13:43227190fef8 $ hg strip -B multipledelete1 -B multipledelete2 saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/e46a4836065c-89ec65c2-backup.hg bookmark 'multipledelete1' deleted bookmark 'multipledelete2' deleted $ hg id -ir e46a4836065c abort: unknown revision 'e46a4836065c'! [255] $ hg id -ir b4594d867745 abort: unknown revision 'b4594d867745'! [255] $ hg strip -B singlenode1 -B singlenode2 saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/43227190fef8-8da858f2-backup.hg bookmark 'singlenode1' deleted bookmark 'singlenode2' deleted $ hg id -ir 43227190fef8 abort: unknown revision '43227190fef8'! [255] $ hg strip -B unknownbookmark abort: bookmark 'unknownbookmark' not found [255] $ hg strip -B unknownbookmark1 -B unknownbookmark2 abort: bookmark 'unknownbookmark1,unknownbookmark2' not found [255] $ hg strip -B delete -B unknownbookmark abort: bookmark 'unknownbookmark' not found [255] $ hg strip -B delete saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob) bookmark 'delete' deleted $ hg id -ir 6:2702dd0c91e7 abort: unknown revision '2702dd0c91e7'! [255] $ hg update B 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (activating bookmark B) $ echo a > a $ hg add a $ hg strip -B B abort: local changes found [255] $ hg bookmarks * B 6:ff43616e5d0f Make sure no one adds back a -b option: $ hg strip -b tip hg strip: option -b not recognized hg strip [-k] [-f] [-B bookmark] [-r] REV... strip changesets and all their descendants from the repository (use 'hg help -e strip' to show help for the strip extension) options ([+] can be repeated): -r --rev REV [+] strip specified revision (optional, can specify revisions without this option) -f --force force removal of changesets, discard uncommitted changes (no backup) --no-backup do not save backup bundle -k --keep do not modify working directory during strip -B --bookmark BOOKMARK [+] remove revs only reachable from given bookmark --mq operate on patch repository (use 'hg strip -h' to show more help) [255] $ cd .. Verify bundles don't get overwritten: $ hg init doublebundle $ cd doublebundle $ touch a $ hg commit -Aqm a $ touch b $ hg commit -Aqm b $ hg strip -r 0 0 files updated, 0 files merged, 2 files removed, 0 files unresolved saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-e68910bd-backup.hg $ ls .hg/strip-backup 3903775176ed-e68910bd-backup.hg #if repobundlerepo $ hg pull -q -r 3903775176ed .hg/strip-backup/3903775176ed-e68910bd-backup.hg $ hg strip -r 0 saved backup bundle to $TESTTMP/doublebundle/.hg/strip-backup/3903775176ed-54390173-backup.hg $ ls .hg/strip-backup 3903775176ed-54390173-backup.hg 3903775176ed-e68910bd-backup.hg #endif $ cd .. Test that we only bundle the stripped changesets (issue4736) ------------------------------------------------------------ initialization (previous repo is empty anyway) $ hg init issue4736 $ cd issue4736 $ echo a > a $ hg add a $ hg commit -m commitA $ echo b > b $ hg add b $ hg commit -m commitB $ echo c > c $ hg add c $ hg commit -m commitC $ hg up 'desc(commitB)' 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ echo d > d $ hg add d $ hg commit -m commitD created new head $ hg up 'desc(commitC)' 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg merge 'desc(commitD)' 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg ci -m 'mergeCD' $ hg log -G @ changeset: 4:d8db9d137221 |\ tag: tip | | parent: 2:5c51d8d6557d | | parent: 3:6625a5168474 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: mergeCD | | | o changeset: 3:6625a5168474 | | parent: 1:eca11cf91c71 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: commitD | | o | changeset: 2:5c51d8d6557d |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitC | o changeset: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA Check bundle behavior: $ hg bundle -r 'desc(mergeCD)' --base 'desc(commitC)' ../issue4736.hg 2 changesets found #if repobundlerepo $ hg log -r 'bundle()' -R ../issue4736.hg changeset: 3:6625a5168474 parent: 1:eca11cf91c71 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitD changeset: 4:d8db9d137221 tag: tip parent: 2:5c51d8d6557d parent: 3:6625a5168474 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: mergeCD #endif check strip behavior $ hg --config extensions.strip= strip 'desc(commitD)' --debug resolving manifests branchmerge: False, force: True, partial: False ancestor: d8db9d137221+, local: d8db9d137221+, remote: eca11cf91c71 c: other deleted -> r removing c d: other deleted -> r removing d starting 4 threads for background file closing (?) 0 files updated, 0 files merged, 2 files removed, 0 files unresolved 2 changesets found list of changesets: 6625a516847449b6f0fa3737b9ba56e9f0f3032c d8db9d1372214336d2b5570f20ee468d2c72fa8b bundle2-output-bundle: "HG20", (1 params) 3 parts total bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload bundle2-output-part: "cache:rev-branch-cache" (advisory) streamed payload bundle2-output-part: "phase-heads" 24 bytes payload saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/6625a5168474-345bb43d-backup.hg updating the branch cache invalid branchheads cache (served): tip differs $ hg log -G o changeset: 2:5c51d8d6557d | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitC | @ changeset: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA strip backup content #if repobundlerepo $ hg log -r 'bundle()' -R .hg/strip-backup/6625a5168474-*-backup.hg changeset: 3:6625a5168474 parent: 1:eca11cf91c71 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitD changeset: 4:d8db9d137221 tag: tip parent: 2:5c51d8d6557d parent: 3:6625a5168474 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: mergeCD #endif Check that the phase cache is properly invalidated after a strip with bookmark. $ cat > ../stripstalephasecache.py << EOF > from mercurial import extensions, localrepo > def transactioncallback(orig, repo, desc, *args, **kwargs): > def test(transaction): > # observe cache inconsistency > try: > [repo.changelog.node(r) for r in repo.revs(b"not public()")] > except IndexError: > repo.ui.status(b"Index error!\n") > transaction = orig(repo, desc, *args, **kwargs) > # warm up the phase cache > list(repo.revs(b"not public()")) > if desc != b'strip': > transaction.addpostclose(b"phase invalidation test", test) > return transaction > def extsetup(ui): > extensions.wrapfunction(localrepo.localrepository, b"transaction", > transactioncallback) > EOF $ hg up -C 2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo k > k $ hg add k $ hg commit -m commitK $ echo l > l $ hg add l $ hg commit -m commitL $ hg book -r tip blah $ hg strip ".^" --config extensions.crash=$TESTTMP/stripstalephasecache.py 0 files updated, 0 files merged, 2 files removed, 0 files unresolved saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/8f0b4384875c-4fa10deb-backup.hg $ hg up -C 1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved Error during post-close callback of the strip transaction (They should be gracefully handled and reported) $ cat > ../crashstrip.py << EOF > from mercurial import error > def reposetup(ui, repo): > class crashstriprepo(repo.__class__): > def transaction(self, desc, *args, **kwargs): > tr = super(crashstriprepo, self).transaction(desc, *args, **kwargs) > if desc == b'strip': > def crash(tra): raise error.Abort(b'boom') > tr.addpostclose(b'crash', crash) > return tr > repo.__class__ = crashstriprepo > EOF $ hg strip tip --config extensions.crash=$TESTTMP/crashstrip.py saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg strip failed, backup bundle stored in '$TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg' abort: boom [255] test stripping a working directory parent doesn't switch named branches $ hg log -G @ changeset: 1:eca11cf91c71 | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA $ hg branch new-branch marked working directory as branch new-branch (branches are permanent and global, did you want a bookmark?) $ hg ci -m "start new branch" $ echo 'foo' > foo.txt $ hg ci -Aqm foo $ hg up default 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ echo 'bar' > bar.txt $ hg ci -Aqm bar $ hg up new-branch 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg merge default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg log -G @ changeset: 4:35358f982181 | tag: tip | parent: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: bar | | @ changeset: 3:f62c6c09b707 | | branch: new-branch | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: foo | | | o changeset: 2:b1d33a8cadd9 |/ branch: new-branch | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: start new branch | o changeset: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA $ hg strip --force -r 35358f982181 0 files updated, 0 files merged, 1 files removed, 0 files unresolved saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/35358f982181-50d992d4-backup.hg $ hg log -G @ changeset: 3:f62c6c09b707 | branch: new-branch | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: foo | o changeset: 2:b1d33a8cadd9 | branch: new-branch | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: start new branch | o changeset: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA $ hg up default 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ echo 'bar' > bar.txt $ hg ci -Aqm bar $ hg up new-branch 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg merge default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg ci -m merge $ hg log -G @ changeset: 5:4cf5e92caec2 |\ branch: new-branch | | tag: tip | | parent: 3:f62c6c09b707 | | parent: 4:35358f982181 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: merge | | | o changeset: 4:35358f982181 | | parent: 1:eca11cf91c71 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: bar | | o | changeset: 3:f62c6c09b707 | | branch: new-branch | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 | | summary: foo | | o | changeset: 2:b1d33a8cadd9 |/ branch: new-branch | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: start new branch | o changeset: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA $ hg strip -r 35358f982181 0 files updated, 0 files merged, 1 files removed, 0 files unresolved saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/35358f982181-a6f020aa-backup.hg $ hg log -G @ changeset: 3:f62c6c09b707 | branch: new-branch | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: foo | o changeset: 2:b1d33a8cadd9 | branch: new-branch | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: start new branch | o changeset: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA $ hg unbundle -u $TESTTMP/issue4736/.hg/strip-backup/35358f982181-a6f020aa-backup.hg adding changesets adding manifests adding file changes added 2 changesets with 1 changes to 1 files new changesets 35358f982181:4cf5e92caec2 (2 drafts) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg strip -k -r 35358f982181 saved backup bundle to $TESTTMP/issue4736/.hg/strip-backup/35358f982181-a6f020aa-backup.hg $ hg log -G @ changeset: 3:f62c6c09b707 | branch: new-branch | tag: tip | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: foo | o changeset: 2:b1d33a8cadd9 | branch: new-branch | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: start new branch | o changeset: 1:eca11cf91c71 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 | summary: commitB | o changeset: 0:105141ef12d0 user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: commitA $ hg diff diff -r f62c6c09b707 bar.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bar.txt Thu Jan 01 00:00:00 1970 +0000 @@ -0,0 +1,1 @@ +bar Use delayedstrip to strip inside a transaction $ cd $TESTTMP $ hg init delayedstrip $ cd delayedstrip $ hg debugdrawdag <<'EOS' > D > | > C F H # Commit on top of "I", > | |/| # Strip B+D+I+E+G+H+Z > I B E G > \|/ > A Z > EOS $ cp -R . ../scmutilcleanup $ hg up -C I 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo 3 >> I $ cat > $TESTTMP/delayedstrip.py <<EOF > from __future__ import absolute_import > from mercurial import commands, registrar, repair > cmdtable = {} > command = registrar.command(cmdtable) > @command(b'testdelayedstrip') > def testdelayedstrip(ui, repo): > def getnodes(expr): > return [repo.changelog.node(r) for r in repo.revs(expr)] > with repo.wlock(): > with repo.lock(): > with repo.transaction(b'delayedstrip'): > repair.delayedstrip(ui, repo, getnodes(b'B+I+Z+D+E'), b'J') > repair.delayedstrip(ui, repo, getnodes(b'G+H+Z'), b'I') > commands.commit(ui, repo, message=b'J', date=b'0 0') > EOF $ hg testdelayedstrip --config extensions.t=$TESTTMP/delayedstrip.py warning: orphaned descendants detected, not stripping 08ebfeb61bac, 112478962961, 7fb047a69f22 saved backup bundle to $TESTTMP/delayedstrip/.hg/strip-backup/f585351a92f8-17475721-I.hg $ hg log -G -T '{rev}:{node|short} {desc}' -r 'sort(all(), topo)' @ 6:2f2d51af6205 J | o 3:08ebfeb61bac I | | o 5:64a8289d2492 F | | | o 2:7fb047a69f22 E |/ | o 4:26805aba1e60 C | | | o 1:112478962961 B |/ o 0:426bada5c675 A Test high-level scmutil.cleanupnodes API $ cd $TESTTMP/scmutilcleanup $ hg debugdrawdag <<'EOS' > D2 F2 G2 # D2, F2, G2 are replacements for D, F, G > | | | > C H G > EOS $ for i in B C D F G I Z; do > hg bookmark -i -r $i b-$i > done $ hg bookmark -i -r E 'b-F@divergent1' $ hg bookmark -i -r H 'b-F@divergent2' $ hg bookmark -i -r G 'b-F@divergent3' $ cp -R . ../scmutilcleanup.obsstore $ cat > $TESTTMP/scmutilcleanup.py <<EOF > from mercurial import registrar, scmutil > cmdtable = {} > command = registrar.command(cmdtable) > @command(b'testnodescleanup') > def testnodescleanup(ui, repo): > def nodes(expr): > return [repo.changelog.node(r) for r in repo.revs(expr)] > def node(expr): > return nodes(expr)[0] > with repo.wlock(): > with repo.lock(): > with repo.transaction(b'delayedstrip'): > mapping = {node(b'F'): [node(b'F2')], > node(b'D'): [node(b'D2')], > node(b'G'): [node(b'G2')]} > scmutil.cleanupnodes(repo, mapping, b'replace') > scmutil.cleanupnodes(repo, nodes(b'((B::)+I+Z)-D2-obsolete()'), > b'replace') > EOF $ hg testnodescleanup --config extensions.t=$TESTTMP/scmutilcleanup.py warning: orphaned descendants detected, not stripping 112478962961, 1fc8102cda62, 26805aba1e60 saved backup bundle to $TESTTMP/scmutilcleanup/.hg/strip-backup/f585351a92f8-73fb7c03-replace.hg $ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)' o 8:1473d4b996d1 G2 b-F@divergent3 b-G | | o 7:d11b3456a873 F2 b-F | | | o 5:5cb05ba470a7 H |/| | o 3:7fb047a69f22 E b-F@divergent1 | | | | o 6:7c78f703e465 D2 b-D | | | | | o 4:26805aba1e60 C | | | | | o 2:112478962961 B | |/ o | 1:1fc8102cda62 G / o 0:426bada5c675 A b-B b-C b-I $ hg bookmark b-B 0:426bada5c675 b-C 0:426bada5c675 b-D 6:7c78f703e465 b-F 7:d11b3456a873 b-F@divergent1 3:7fb047a69f22 b-F@divergent3 8:1473d4b996d1 b-G 8:1473d4b996d1 b-I 0:426bada5c675 b-Z -1:000000000000 Test the above using obsstore "by the way". Not directly related to strip, but we have reusable code here $ cd $TESTTMP/scmutilcleanup.obsstore $ cat >> .hg/hgrc <<EOF > [experimental] > evolution=true > evolution.track-operation=1 > EOF $ hg testnodescleanup --config extensions.t=$TESTTMP/scmutilcleanup.py 4 new orphan changesets $ rm .hg/localtags $ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)' * 12:1473d4b996d1 G2 b-F@divergent3 b-G | | * 11:d11b3456a873 F2 b-F | | | * 8:5cb05ba470a7 H |/| | o 4:7fb047a69f22 E b-F@divergent1 | | | | * 10:7c78f703e465 D2 b-D | | | | | x 6:26805aba1e60 C | | | | | x 3:112478962961 B | |/ x | 1:1fc8102cda62 G / o 0:426bada5c675 A b-B b-C b-I $ hg debugobsolete 1fc8102cda6204549f031015641606ccf5513ec3 1473d4b996d1d1b121de6b39fab6a04fbf9d873e 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'replace', 'user': 'test'} 64a8289d249234b9886244d379f15e6b650b28e3 d11b3456a873daec7c7bc53e5622e8df6d741bd2 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'replace', 'user': 'test'} f585351a92f85104bff7c284233c338b10eb1df7 7c78f703e465d73102cc8780667ce269c5208a40 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'replace', 'user': 'test'} 48b9aae0607f43ff110d84e6883c151942add5ab 0 {0000000000000000000000000000000000000000} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'replace', 'user': 'test'} 112478962961147124edd43549aedd1a335e44bf 0 {426bada5c67598ca65036d57d9e4b64b0c1ce7a0} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'replace', 'user': 'test'} 08ebfeb61bac6e3f12079de774d285a0d6689eba 0 {426bada5c67598ca65036d57d9e4b64b0c1ce7a0} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'replace', 'user': 'test'} 26805aba1e600a82e93661149f2313866a221a7b 0 {112478962961147124edd43549aedd1a335e44bf} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'replace', 'user': 'test'} $ cd .. Test that obsmarkers are restored even when not using generaldelta $ hg --config format.usegeneraldelta=no init issue5678 $ cd issue5678 $ cat >> .hg/hgrc <<EOF > [experimental] > evolution=true > EOF $ echo a > a $ hg ci -Aqm a $ hg ci --amend -m a2 $ hg debugobsolete cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b 489bac576828490c0bb8d45eac9e5e172e4ec0a8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'} $ hg strip . 0 files updated, 0 files merged, 1 files removed, 0 files unresolved saved backup bundle to $TESTTMP/issue5678/.hg/strip-backup/489bac576828-bef27e14-backup.hg $ hg unbundle -q .hg/strip-backup/* $ hg debugobsolete cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b 489bac576828490c0bb8d45eac9e5e172e4ec0a8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'} $ cd ..