##// END OF EJS Templates
revlog: skeleton support for version 2 revlogs...
revlog: skeleton support for version 2 revlogs There are a number of improvements we want to make to revlogs that will require a new version - version 2. It is unclear what the full set of improvements will be or when we'll be done with them. What I do know is that the process will likely take longer than a single release, will require input from various stakeholders to evaluate changes, and will have many contentious debates and bikeshedding. It is unrealistic to develop revlog version 2 up front: there are just too many uncertainties that we won't know until things are implemented and experiments are run. Some changes will also be invasive and prone to bit rot, so sitting on dozens of patches is not practical. This commit introduces skeleton support for version 2 revlogs in a way that is flexible and not bound by backwards compatibility concerns. An experimental repo requirement for denoting revlog v2 has been added. The requirement string has a sub-version component to it. This will allow us to declare multiple requirements in the course of developing revlog v2. Whenever we change the in-development revlog v2 format, we can tweak the string, creating a new requirement and locking out old clients. This will allow us to make as many backwards incompatible changes and experiments to revlog v2 as we want. In other words, we can land code and make meaningful progress towards revlog v2 while still maintaining extreme format flexibility up until the point we freeze the format and remove the experimental labels. To enable the new repo requirement, you must supply an experimental and undocumented config option. But not just any boolean flag will do: you need to explicitly use a value that no sane person should ever type. This is an additional guard against enabling revlog v2 on an installation it shouldn't be enabled on. The specific scenario I'm trying to prevent is say a user with a 4.4 client with a frozen format enabling the option but then downgrading to 4.3 and accidentally creating repos with an outdated and unsupported repo format. Requiring a "challenge" string should prevent this. Because the format is not yet finalized and I don't want to take any chances, revlog v2's version is currently 0xDEAD. I figure squatting on a value we're likely never to use as an actual revlog version to mean "internal testing only" is acceptable. And "dead" is easily recognized as something meaningful. There is a bunch of cleanup that is needed before work on revlog v2 begins in earnest. I plan on doing that work once this patch is accepted and we're comfortable with the idea of starting down this path.

File last commit:

r32267:c2380b44 default
r32697:19b9fc40 default
Show More
test-strip.t
939 lines | 25.8 KiB | text/troff | Tads3Lexer
$ echo "[format]" >> $HGRCPATH
$ echo "usegeneraldelta=yes" >> $HGRCPATH
$ echo "[extensions]" >> $HGRCPATH
$ echo "strip=" >> $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 (glob)
$ 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: sortdict([('Compression', 'BZ')])
changegroup -- "sortdict([('version', '02'), ('nbchanges', '1')])"
264128213d290d868c54642d13aeaa3675551a78
$ hg pull .hg/strip-backup/*
pulling from .hg/strip-backup/264128213d29-0b39d6bf-backup.hg
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 0 files (+1 heads)
(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
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
$ cat .hg/store/fncache | sort
data/a.i
data/bar.i
$ 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)
$ cat .hg/store/fncache
data/bar.i
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 (glob)
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 (glob)
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 no backups
-k --keep do not modify working directory during strip
-B --bookmark VALUE [+] 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 (glob)
$ ls .hg/strip-backup
3903775176ed-e68910bd-backup.hg
$ 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 (glob)
$ ls .hg/strip-backup
3903775176ed-54390173-backup.hg
3903775176ed-e68910bd-backup.hg
$ 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
$ 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
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) 1 parts total
bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed 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
truncating cache/rbc-revs-v1 to 24
$ 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
$ 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
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("not public()")]
> except IndexError:
> repo.ui.status("Index error!\n")
> transaction = orig(repo, desc, *args, **kwargs)
> # warm up the phase cache
> list(repo.revs("not public()"))
> if desc != 'strip':
> transaction.addpostclose("phase invalidation test", test)
> return transaction
> def extsetup(ui):
> extensions.wrapfunction(localrepo.localrepository, "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 (glob)
$ 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(self, desc, *args, **kwargs)
> if desc == 'strip':
> def crash(tra): raise error.Abort('boom')
> tr.addpostclose('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 (glob)
strip failed, backup bundle stored in '$TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg' (glob)
abort: boom
[255]