2019-12-10 02:24:31 +03:00
|
|
|
#chg-compatible
|
|
|
|
|
2020-06-11 03:33:43 +03:00
|
|
|
$ configure mutation-norecord
|
2020-01-20 13:42:49 +03:00
|
|
|
$ disable treemanifest
|
2018-01-23 23:09:16 +03:00
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ setconfig format.usegeneraldelta=yes
|
2010-08-16 05:53:52 +04:00
|
|
|
|
|
|
|
$ restore() {
|
|
|
|
> hg unbundle -q .hg/strip-backup/*
|
|
|
|
> rm .hg/strip-backup/*
|
|
|
|
> }
|
|
|
|
$ teststrip() {
|
|
|
|
> hg up -C $1
|
|
|
|
> echo % before update $1, strip $2
|
|
|
|
> hg parents
|
2019-02-25 14:50:46 +03:00
|
|
|
> hg --traceback debugstrip $2
|
2010-08-16 05:53:52 +04:00
|
|
|
> 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
|
|
|
|
|
|
|
|
$ echo final >> bar
|
|
|
|
$ hg ci -Ame
|
|
|
|
|
|
|
|
$ hg log
|
|
|
|
changeset: 4:443431ffac4f
|
|
|
|
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
|
|
|
|
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
|
|
|
|
% after update 4, strip 4
|
|
|
|
changeset: 3:65bd5f99a4a3
|
|
|
|
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
|
|
|
|
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
|
|
|
|
% 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
|
|
|
|
|
|
|
|
% 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
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: e
|
|
|
|
|
|
|
|
% after update 4, strip 2
|
|
|
|
changeset: 3:443431ffac4f
|
|
|
|
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
|
|
|
|
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
|
|
|
|
% after update 4, strip 1
|
|
|
|
changeset: 0:9ab35a2d17cb
|
|
|
|
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
|
|
|
|
% after update null, strip 4
|
|
|
|
|
|
|
|
$ hg log
|
|
|
|
changeset: 4:264128213d29
|
|
|
|
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
|
|
|
|
|
2015-01-16 03:51:13 +03:00
|
|
|
$ hg up -C 4
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg parents
|
|
|
|
changeset: 4:264128213d29
|
|
|
|
parent: 1:ef3a871183d7
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: c
|
|
|
|
|
2015-01-22 02:54:52 +03:00
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg --traceback debugstrip 4
|
2015-02-06 22:27:25 +03:00
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg parents
|
|
|
|
changeset: 1:ef3a871183d7
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: b
|
|
|
|
|
|
|
|
$ hg debugbundle .hg/strip-backup/*
|
2017-08-23 06:11:35 +03:00
|
|
|
Stream params: {Compression: BZ}
|
|
|
|
changegroup -- {nbchanges: 1, version: 02}
|
2015-10-20 14:09:43 +03:00
|
|
|
264128213d290d868c54642d13aeaa3675551a78
|
2017-08-23 06:11:35 +03:00
|
|
|
phase-heads -- {}
|
2017-06-15 10:15:52 +03:00
|
|
|
264128213d290d868c54642d13aeaa3675551a78 draft
|
2015-02-06 22:27:25 +03:00
|
|
|
$ hg pull .hg/strip-backup/*
|
|
|
|
pulling from .hg/strip-backup/264128213d29-0b39d6bf-backup.hg
|
|
|
|
searching for changes
|
|
|
|
adding changesets
|
|
|
|
adding manifests
|
|
|
|
adding file changes
|
2019-11-07 21:50:10 +03:00
|
|
|
added 1 changesets with 0 changes to 0 files
|
2015-02-06 22:27:25 +03:00
|
|
|
$ rm .hg/strip-backup/*
|
|
|
|
$ hg log --graph
|
|
|
|
o changeset: 4:264128213d29
|
|
|
|
| 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
|
|
|
|
|
2010-08-16 05:53:52 +04:00
|
|
|
$ 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
|
|
|
|
parent: 1:ef3a871183d7
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: c
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip 4
|
2010-08-16 05:53:52 +04:00
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
|
|
|
|
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
|
2017-06-06 19:47:39 +03:00
|
|
|
updated to "264128213d29: c"
|
2016-02-02 17:49:02 +03:00
|
|
|
1 other heads for branch "default"
|
2013-11-22 22:14:17 +04:00
|
|
|
$ hg log -G
|
2010-08-16 05:53:52 +04:00
|
|
|
@ changeset: 4:264128213d29
|
|
|
|
| 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
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip "roots(2)" 3
|
2013-11-22 22:14:17 +04:00
|
|
|
$ hg log -G
|
2010-08-16 05:53:52 +04:00
|
|
|
@ 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
|
|
|
|
|
|
|
|
$ restore
|
2013-11-22 22:14:17 +04:00
|
|
|
$ hg log -G
|
2010-08-16 05:53:52 +04:00
|
|
|
o changeset: 4:443431ffac4f
|
|
|
|
| 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
|
|
|
|
|
2016-09-15 19:45:29 +03:00
|
|
|
Failed hook while applying "saveheads" bundle.
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip 2 --config hooks.pretxnchangegroup.bad=false
|
2016-09-15 19:45:29 +03:00
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
transaction abort!
|
|
|
|
rollback completed
|
2016-09-19 19:14:35 +03:00
|
|
|
strip failed, backup bundle stored in '$TESTTMP/test/.hg/strip-backup/*-backup.hg' (glob)
|
2016-09-19 19:14:32 +03:00
|
|
|
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)
|
2016-09-15 19:45:29 +03:00
|
|
|
abort: pretxnchangegroup.bad hook exited with status 1
|
|
|
|
[255]
|
|
|
|
$ restore
|
|
|
|
$ hg log -G
|
|
|
|
o changeset: 4:443431ffac4f
|
|
|
|
| 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
|
|
|
|
|
2010-08-16 05:53:52 +04:00
|
|
|
|
|
|
|
2 different branches: 2 strips
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip 2 4
|
2013-11-22 22:14:17 +04:00
|
|
|
$ hg log -G
|
2013-01-15 05:59:13 +04:00
|
|
|
o changeset: 2:65bd5f99a4a3
|
2010-08-16 05:53:52 +04:00
|
|
|
| user: test
|
|
|
|
| date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
| summary: d
|
|
|
|
|
|
2013-01-15 05:59:13 +04:00
|
|
|
@ changeset: 1:ef3a871183d7
|
2010-08-16 05:53:52 +04:00
|
|
|
| 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
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip 1 "2|4"
|
2010-08-16 05:53:52 +04:00
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ restore
|
|
|
|
|
2014-03-25 02:43:15 +04:00
|
|
|
verify fncache is kept up-to-date
|
|
|
|
|
|
|
|
$ touch a
|
|
|
|
$ hg ci -qAm a
|
|
|
|
$ cat .hg/store/fncache | sort
|
|
|
|
data/a.i
|
|
|
|
data/bar.i
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip tip
|
2014-03-25 02:43:15 +04:00
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ cat .hg/store/fncache
|
|
|
|
data/bar.i
|
|
|
|
|
2010-10-19 00:31:38 +04:00
|
|
|
stripping an empty revset
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip "1 and not 1"
|
2010-10-19 00:31:38 +04:00
|
|
|
abort: empty revision set
|
|
|
|
[255]
|
2010-08-16 05:53:52 +04:00
|
|
|
|
2013-03-07 08:13:09 +04:00
|
|
|
Strip adds, removes, modifies with --keep
|
|
|
|
|
|
|
|
$ touch b
|
|
|
|
$ hg add b
|
|
|
|
$ hg commit -mb
|
|
|
|
$ touch c
|
2013-04-27 09:07:25 +04:00
|
|
|
|
|
|
|
... with a clean working dir
|
|
|
|
|
|
|
|
$ hg add c
|
|
|
|
$ hg rm bar
|
|
|
|
$ hg commit -mc
|
|
|
|
$ hg status
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip --keep tip
|
2013-04-27 09:07:25 +04:00
|
|
|
$ hg status
|
|
|
|
! bar
|
|
|
|
? c
|
|
|
|
|
|
|
|
... with a dirty working dir
|
|
|
|
|
2013-03-07 08:13:09 +04:00
|
|
|
$ hg add c
|
|
|
|
$ hg rm bar
|
|
|
|
$ hg commit -mc
|
2013-04-27 09:07:25 +04:00
|
|
|
$ hg status
|
2013-03-07 08:13:09 +04:00
|
|
|
$ echo b > b
|
|
|
|
$ echo d > d
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip --keep tip
|
2013-03-07 08:13:09 +04:00
|
|
|
$ hg status
|
|
|
|
M b
|
|
|
|
! bar
|
|
|
|
? c
|
|
|
|
? d
|
2015-11-30 22:23:15 +03:00
|
|
|
|
|
|
|
... after updating the dirstate
|
|
|
|
$ hg add c
|
|
|
|
$ hg commit -mc
|
|
|
|
$ hg rm c
|
|
|
|
$ hg commit -mc
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip --keep '.^' -q
|
strip: enhance repair.strip to receive a list of nodes (issue3299)
Originally, mq.strip called repair.strip a single rev at a time.
repair.strip stores in a backup bundle any revision greater than
the revision being stripped, strips, then restores the backup with
repo.addchangegroup. So, when stripping revisions on more than one
topological branch, some could end up being restored from the backup
bundle, only to be later removed by a subsequent repair.strip call.
But repo.addchangegroup calls hooks for all those restore operations.
And 1671d21e8e41 changed it to delay all hook calls until the
repository lock were released - by mq.strip, after stripping all
revisions. Thus, the hooks could be called over revisions already
removed from the repository at that point.
By generating the revision lists at once inside repo.strip, we avoid
calling addchangegroup for temporary restores. Incidentally, this
also avoids creating many backup files for a single strip command.
2012-03-13 00:02:45 +04:00
|
|
|
$ 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'
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip 'not ancestors(x)'
|
strip: enhance repair.strip to receive a list of nodes (issue3299)
Originally, mq.strip called repair.strip a single rev at a time.
repair.strip stores in a backup bundle any revision greater than
the revision being stripped, strips, then restores the backup with
repo.addchangegroup. So, when stripping revisions on more than one
topological branch, some could end up being restored from the backup
bundle, only to be later removed by a subsequent repair.strip call.
But repo.addchangegroup calls hooks for all those restore operations.
And 1671d21e8e41 changed it to delay all hook calls until the
repository lock were released - by mq.strip, after stripping all
revisions. Thus, the hooks could be called over revisions already
removed from the repository at that point.
By generating the revision lists at once inside repo.strip, we avoid
calling addchangegroup for temporary restores. Incidentally, this
also avoids creating many backup files for a single strip command.
2012-03-13 00:02:45 +04:00
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
test hg debugstrip -B bookmark
|
2012-05-13 18:39:40 +04:00
|
|
|
|
|
|
|
$ cd ..
|
|
|
|
$ hg init bookmarks
|
|
|
|
$ cd bookmarks
|
2015-11-19 10:20:10 +03:00
|
|
|
$ hg debugbuilddag '..<2.*1/2:m<2+3:c<m+3:a<2.:b<m+2:d<2.:e<m+1:f'
|
2012-05-13 18:39:40 +04:00
|
|
|
$ hg bookmark -r 'a' 'todelete'
|
|
|
|
$ hg bookmark -r 'b' 'B'
|
|
|
|
$ hg bookmark -r 'b' 'nostrip'
|
|
|
|
$ hg bookmark -r 'c' 'delete'
|
2015-11-19 10:20:10 +03:00
|
|
|
$ hg bookmark -r 'd' 'multipledelete1'
|
|
|
|
$ hg bookmark -r 'e' 'multipledelete2'
|
|
|
|
$ hg bookmark -r 'f' 'singlenode1'
|
|
|
|
$ hg bookmark -r 'f' 'singlenode2'
|
2020-01-07 23:29:27 +03:00
|
|
|
$ hg book -d a b c d e f m
|
2012-05-13 18:39:40 +04:00
|
|
|
$ hg up -C todelete
|
|
|
|
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
2013-03-07 07:17:56 +04:00
|
|
|
(activating bookmark todelete)
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B nostrip
|
2012-05-13 18:39:40 +04:00
|
|
|
bookmark 'nostrip' deleted
|
|
|
|
abort: empty revision set
|
|
|
|
[255]
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B todelete
|
2012-05-13 18:39:40 +04:00
|
|
|
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
2014-07-09 03:24:23 +04:00
|
|
|
bookmark 'todelete' deleted
|
2012-05-13 18:39:40 +04:00
|
|
|
$ hg id -ir dcbb326fdec2
|
|
|
|
abort: unknown revision 'dcbb326fdec2'!
|
|
|
|
[255]
|
|
|
|
$ hg id -ir d62d843c9a01
|
|
|
|
d62d843c9a01
|
|
|
|
$ hg bookmarks
|
|
|
|
B 9:ff43616e5d0f
|
|
|
|
delete 6:2702dd0c91e7
|
2015-11-19 10:20:10 +03:00
|
|
|
multipledelete1 11:e46a4836065c
|
|
|
|
multipledelete2 12:b4594d867745
|
|
|
|
singlenode1 13:43227190fef8
|
|
|
|
singlenode2 13:43227190fef8
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B multipledelete1 -B multipledelete2
|
2015-11-19 10:20:10 +03:00
|
|
|
bookmark 'multipledelete1' deleted
|
|
|
|
bookmark 'multipledelete2' deleted
|
|
|
|
$ hg id -ir e46a4836065c
|
|
|
|
abort: unknown revision 'e46a4836065c'!
|
|
|
|
[255]
|
|
|
|
$ hg id -ir b4594d867745
|
|
|
|
abort: unknown revision 'b4594d867745'!
|
|
|
|
[255]
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B singlenode1 -B singlenode2
|
2015-11-19 10:20:10 +03:00
|
|
|
bookmark 'singlenode1' deleted
|
|
|
|
bookmark 'singlenode2' deleted
|
|
|
|
$ hg id -ir 43227190fef8
|
|
|
|
abort: unknown revision '43227190fef8'!
|
|
|
|
[255]
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B unknownbookmark
|
2019-06-03 18:42:57 +03:00
|
|
|
abort: bookmark not found: 'unknownbookmark'
|
2015-11-19 10:20:10 +03:00
|
|
|
[255]
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B unknownbookmark1 -B unknownbookmark2
|
2019-06-03 18:42:57 +03:00
|
|
|
abort: bookmark not found: 'unknownbookmark1', 'unknownbookmark2'
|
2015-11-19 10:20:10 +03:00
|
|
|
[255]
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B delete -B unknownbookmark
|
2019-06-03 18:42:57 +03:00
|
|
|
abort: bookmark not found: 'unknownbookmark'
|
2015-11-19 10:20:10 +03:00
|
|
|
[255]
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B delete
|
2014-07-09 03:24:23 +04:00
|
|
|
bookmark 'delete' deleted
|
2012-05-13 18:39:40 +04:00
|
|
|
$ hg id -ir 6:2702dd0c91e7
|
|
|
|
abort: unknown revision '2702dd0c91e7'!
|
|
|
|
[255]
|
2014-07-09 03:24:23 +04:00
|
|
|
$ hg update B
|
|
|
|
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
(activating bookmark B)
|
|
|
|
$ echo a > a
|
|
|
|
$ hg add a
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -B B
|
2014-07-09 03:24:23 +04:00
|
|
|
abort: local changes found
|
|
|
|
[255]
|
|
|
|
$ hg bookmarks
|
|
|
|
* B 6:ff43616e5d0f
|
2012-06-11 03:40:51 +04:00
|
|
|
|
2014-07-12 03:04:51 +04:00
|
|
|
Make sure no one adds back a -b option:
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -b tip
|
|
|
|
hg debugstrip: option -b not recognized
|
|
|
|
(use 'hg debugstrip -h' to get help)
|
2014-07-12 03:04:51 +04:00
|
|
|
[255]
|
2015-01-09 21:52:14 +03:00
|
|
|
|
|
|
|
$ cd ..
|
|
|
|
|
|
|
|
Verify bundles don't get overwritten:
|
|
|
|
|
|
|
|
$ hg init doublebundle
|
|
|
|
$ cd doublebundle
|
|
|
|
$ touch a
|
|
|
|
$ hg commit -Aqm a
|
|
|
|
$ touch b
|
|
|
|
$ hg commit -Aqm b
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -r 0
|
2015-01-09 21:52:14 +03:00
|
|
|
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
|
|
|
$ ls .hg/strip-backup
|
|
|
|
3903775176ed-e68910bd-backup.hg
|
|
|
|
$ hg pull -q -r 3903775176ed .hg/strip-backup/3903775176ed-e68910bd-backup.hg
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip -r 0
|
2015-01-09 21:52:14 +03:00
|
|
|
$ ls .hg/strip-backup
|
|
|
|
3903775176ed-54390173-backup.hg
|
|
|
|
3903775176ed-e68910bd-backup.hg
|
2015-06-29 21:20:09 +03:00
|
|
|
$ cd ..
|
|
|
|
|
|
|
|
Test that we only bundle the stripped changesets (issue4736)
|
|
|
|
------------------------------------------------------------
|
|
|
|
|
2015-08-28 20:57:20 +03:00
|
|
|
initialization (previous repo is empty anyway)
|
2015-06-29 21:20:09 +03:00
|
|
|
|
|
|
|
$ 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
|
|
|
|
$ 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
|
2019-12-18 00:45:17 +03:00
|
|
|
|\ parent: 2:5c51d8d6557d
|
2015-06-29 21:20:09 +03:00
|
|
|
| | 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
|
|
|
|
parent: 2:5c51d8d6557d
|
|
|
|
parent: 3:6625a5168474
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: mergeCD
|
|
|
|
|
|
|
|
|
|
|
|
check strip behavior
|
|
|
|
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip 'desc(commitD)' --debug
|
2015-06-29 21:20:09 +03:00
|
|
|
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
|
2016-02-29 09:01:20 +03:00
|
|
|
starting 4 threads for background file closing (?)
|
2015-06-29 21:20:09 +03:00
|
|
|
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
|
|
|
2 changesets found
|
|
|
|
list of changesets:
|
|
|
|
6625a516847449b6f0fa3737b9ba56e9f0f3032c
|
|
|
|
d8db9d1372214336d2b5570f20ee468d2c72fa8b
|
2017-06-15 10:15:52 +03:00
|
|
|
bundle2-output-bundle: "HG20", (1 params) 2 parts total
|
2016-07-18 01:13:51 +03:00
|
|
|
bundle2-output-part: "changegroup" (params: 1 mandatory 1 advisory) streamed payload
|
2017-06-15 10:15:52 +03:00
|
|
|
bundle2-output-part: "phase-heads" 24 bytes payload
|
2015-06-29 21:20:09 +03:00
|
|
|
$ hg log -G
|
|
|
|
o changeset: 2:5c51d8d6557d
|
|
|
|
| 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
|
|
|
|
parent: 2:5c51d8d6557d
|
|
|
|
parent: 3:6625a5168474
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: mergeCD
|
|
|
|
|
strip: invalidate phase cache after stripping changeset (issue5235)
When we remove a changeset from the changelog, the phase cache must be
invalidated, otherwise it could refer to changesets that are no longer in the
repo.
To reproduce the failure, I created an extension querying the phase cache after
the strip transaction is over.
To do that, I stripped two commits with a bookmark on one of them to force
another transaction (we open a transaction for moving bookmarks)
after the strip transaction.
Without the fix in this patch, the test leads to a stacktrace showing the issue:
repair.strip(ui, repo, revs, backup)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/repair.py", line 205, in strip
tr.close()
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/transaction.py", line 44, in _active
return func(self, *args, **kwds)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/transaction.py", line 490, in close
self._postclosecallback[cat](self)
File "$TESTTMP/crashstrip2.py", line 4, in test
[repo.changelog.node(r) for r in repo.revs("not public()")]
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/changelog.py", line 337, in node
return super(changelog, self).node(rev)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/revlog.py", line 377, in node
return self.index[rev][7]
IndexError: revlog index out of range
The situation was encountered in inhibit (evolve's repo) where we would crash
following the volatile set invalidation submitted by Augie in
cbc52a99d057d11790cf5011e877c6f698bf57bf. Before his patch the issue was masked
as we were not accessing the phasecache after stripping a revision.
This bug uncovered another but in histedit (see explanation in issue5235).
I changed the histedit test accordingly to avoid fixing two things at once.
2016-05-12 16:13:59 +03:00
|
|
|
Check that the phase cache is properly invalidated after a strip with bookmark.
|
|
|
|
|
|
|
|
$ cat > ../stripstalephasecache.py << EOF
|
2019-01-30 03:25:33 +03:00
|
|
|
> from edenscm.mercurial import extensions, localrepo
|
strip: invalidate phase cache after stripping changeset (issue5235)
When we remove a changeset from the changelog, the phase cache must be
invalidated, otherwise it could refer to changesets that are no longer in the
repo.
To reproduce the failure, I created an extension querying the phase cache after
the strip transaction is over.
To do that, I stripped two commits with a bookmark on one of them to force
another transaction (we open a transaction for moving bookmarks)
after the strip transaction.
Without the fix in this patch, the test leads to a stacktrace showing the issue:
repair.strip(ui, repo, revs, backup)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/repair.py", line 205, in strip
tr.close()
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/transaction.py", line 44, in _active
return func(self, *args, **kwds)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/transaction.py", line 490, in close
self._postclosecallback[cat](self)
File "$TESTTMP/crashstrip2.py", line 4, in test
[repo.changelog.node(r) for r in repo.revs("not public()")]
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/changelog.py", line 337, in node
return super(changelog, self).node(rev)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/revlog.py", line 377, in node
return self.index[rev][7]
IndexError: revlog index out of range
The situation was encountered in inhibit (evolve's repo) where we would crash
following the volatile set invalidation submitted by Augie in
cbc52a99d057d11790cf5011e877c6f698bf57bf. Before his patch the issue was masked
as we were not accessing the phasecache after stripping a revision.
This bug uncovered another but in histedit (see explanation in issue5235).
I changed the histedit test accordingly to avoid fixing two things at once.
2016-05-12 16:13:59 +03:00
|
|
|
> 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
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip ".^" --config extensions.crash=$TESTTMP/stripstalephasecache.py
|
strip: invalidate phase cache after stripping changeset (issue5235)
When we remove a changeset from the changelog, the phase cache must be
invalidated, otherwise it could refer to changesets that are no longer in the
repo.
To reproduce the failure, I created an extension querying the phase cache after
the strip transaction is over.
To do that, I stripped two commits with a bookmark on one of them to force
another transaction (we open a transaction for moving bookmarks)
after the strip transaction.
Without the fix in this patch, the test leads to a stacktrace showing the issue:
repair.strip(ui, repo, revs, backup)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/repair.py", line 205, in strip
tr.close()
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/transaction.py", line 44, in _active
return func(self, *args, **kwds)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/transaction.py", line 490, in close
self._postclosecallback[cat](self)
File "$TESTTMP/crashstrip2.py", line 4, in test
[repo.changelog.node(r) for r in repo.revs("not public()")]
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/changelog.py", line 337, in node
return super(changelog, self).node(rev)
File "/Users/lcharignon/facebook-hg-rpms/hg-crew/mercurial/revlog.py", line 377, in node
return self.index[rev][7]
IndexError: revlog index out of range
The situation was encountered in inhibit (evolve's repo) where we would crash
following the volatile set invalidation submitted by Augie in
cbc52a99d057d11790cf5011e877c6f698bf57bf. Before his patch the issue was masked
as we were not accessing the phasecache after stripping a revision.
This bug uncovered another but in histedit (see explanation in issue5235).
I changed the histedit test accordingly to avoid fixing two things at once.
2016-05-12 16:13:59 +03:00
|
|
|
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
|
|
|
$ hg up -C 1
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
2015-08-09 00:50:03 +03:00
|
|
|
|
|
|
|
Error during post-close callback of the strip transaction
|
|
|
|
(They should be gracefully handled and reported)
|
|
|
|
|
|
|
|
$ cat > ../crashstrip.py << EOF
|
2019-01-30 03:25:33 +03:00
|
|
|
> from edenscm.mercurial import error
|
2015-08-09 00:50:03 +03:00
|
|
|
> def reposetup(ui, repo):
|
|
|
|
> class crashstriprepo(repo.__class__):
|
|
|
|
> def transaction(self, desc, *args, **kwargs):
|
2017-07-16 03:38:14 +03:00
|
|
|
> tr = super(crashstriprepo, self).transaction(desc, *args, **kwargs)
|
2015-08-09 00:50:03 +03:00
|
|
|
> if desc == 'strip':
|
|
|
|
> def crash(tra): raise error.Abort('boom')
|
|
|
|
> tr.addpostclose('crash', crash)
|
|
|
|
> return tr
|
|
|
|
> repo.__class__ = crashstriprepo
|
|
|
|
> EOF
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip tip --config extensions.crash=$TESTTMP/crashstrip.py
|
2017-12-11 06:50:57 +03:00
|
|
|
strip failed, backup bundle stored in '$TESTTMP/issue4736/.hg/strip-backup/5c51d8d6557d-70daef06-backup.hg'
|
2015-08-09 00:50:03 +03:00
|
|
|
abort: boom
|
|
|
|
[255]
|
|
|
|
|
2017-06-25 20:38:45 +03:00
|
|
|
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
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
$ cp -R . ../scmutilcleanup
|
2017-06-25 20:38:45 +03:00
|
|
|
|
|
|
|
$ hg up -C I
|
|
|
|
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
2019-12-17 05:10:38 +03:00
|
|
|
(activating bookmark I)
|
2017-06-25 20:38:45 +03:00
|
|
|
$ echo 3 >> I
|
|
|
|
$ cat > $TESTTMP/delayedstrip.py <<EOF
|
2017-08-22 23:59:26 +03:00
|
|
|
> from __future__ import absolute_import
|
2019-01-30 03:25:33 +03:00
|
|
|
> from edenscm.mercurial import commands, registrar, repair
|
2017-10-04 02:59:17 +03:00
|
|
|
> cmdtable = {}
|
|
|
|
> command = registrar.command(cmdtable)
|
|
|
|
> @command('testdelayedstrip')
|
|
|
|
> def testdelayedstrip(ui, repo):
|
2017-06-25 20:38:45 +03:00
|
|
|
> def getnodes(expr):
|
|
|
|
> return [repo.changelog.node(r) for r in repo.revs(expr)]
|
|
|
|
> with repo.wlock():
|
|
|
|
> with repo.lock():
|
|
|
|
> with repo.transaction('delayedstrip'):
|
|
|
|
> repair.delayedstrip(ui, repo, getnodes('B+I+Z+D+E'), 'J')
|
|
|
|
> repair.delayedstrip(ui, repo, getnodes('G+H+Z'), 'I')
|
|
|
|
> commands.commit(ui, repo, message='J', date='0 0')
|
|
|
|
> EOF
|
2017-10-04 02:59:17 +03:00
|
|
|
$ hg testdelayedstrip --config extensions.t=$TESTTMP/delayedstrip.py
|
2017-06-25 20:38:45 +03:00
|
|
|
warning: orphaned descendants detected, not stripping 08ebfeb61bac, 112478962961, 7fb047a69f22
|
2017-10-04 02:59:17 +03:00
|
|
|
|
2017-06-25 20:38:45 +03:00
|
|
|
$ 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
|
|
|
|
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
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
|
2017-06-26 23:13:51 +03:00
|
|
|
$ hg bookmark -i -r E 'b-F@divergent1'
|
|
|
|
$ hg bookmark -i -r H 'b-F@divergent2'
|
|
|
|
$ hg bookmark -i -r G 'b-F@divergent3'
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
$ cp -R . ../scmutilcleanup.obsstore
|
|
|
|
|
|
|
|
$ cat > $TESTTMP/scmutilcleanup.py <<EOF
|
2019-01-30 03:25:33 +03:00
|
|
|
> from edenscm.mercurial import registrar, scmutil
|
2017-10-04 02:59:17 +03:00
|
|
|
> cmdtable = {}
|
|
|
|
> command = registrar.command(cmdtable)
|
|
|
|
> @command('testnodescleanup')
|
|
|
|
> def testnodescleanup(ui, repo):
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
> 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('delayedstrip'):
|
|
|
|
> mapping = {node('F'): [node('F2')],
|
|
|
|
> node('D'): [node('D2')],
|
|
|
|
> node('G'): [node('G2')]}
|
|
|
|
> scmutil.cleanupnodes(repo, mapping, 'replace')
|
|
|
|
> scmutil.cleanupnodes(repo, nodes('((B::)+I+Z)-D2'), 'replace')
|
|
|
|
> EOF
|
2017-10-04 02:59:17 +03:00
|
|
|
$ hg testnodescleanup --config extensions.t=$TESTTMP/scmutilcleanup.py
|
|
|
|
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
$ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)'
|
2020-06-11 03:33:43 +03:00
|
|
|
o 12:1473d4b996d1 G2 G G2 b-F@divergent3 b-G
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
|
|
2020-06-11 03:33:43 +03:00
|
|
|
| o 11:d11b3456a873 F2 F F2 b-F
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| |
|
2020-06-11 03:33:43 +03:00
|
|
|
| o 8:5cb05ba470a7 H H
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
|/|
|
2020-06-11 03:33:43 +03:00
|
|
|
| o 4:7fb047a69f22 E E b-F@divergent1
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| |
|
2020-06-11 03:33:43 +03:00
|
|
|
| | o 10:7c78f703e465 D2 D D2 b-D
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| | |
|
2020-06-11 03:33:43 +03:00
|
|
|
| | o 6:26805aba1e60 C
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| | |
|
2020-06-11 03:33:43 +03:00
|
|
|
| | o 3:112478962961 B
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| |/
|
|
|
|
o | 1:1fc8102cda62 G
|
|
|
|
/
|
2019-12-17 05:10:38 +03:00
|
|
|
o 0:426bada5c675 A A B C I b-B b-C b-I
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
|
|
|
|
$ hg bookmark
|
2019-12-17 05:10:38 +03:00
|
|
|
A 0:426bada5c675
|
|
|
|
B 0:426bada5c675
|
|
|
|
C 0:426bada5c675
|
2020-06-11 03:33:43 +03:00
|
|
|
D 10:7c78f703e465
|
|
|
|
D2 10:7c78f703e465
|
|
|
|
E 4:7fb047a69f22
|
|
|
|
F 11:d11b3456a873
|
|
|
|
F2 11:d11b3456a873
|
|
|
|
G 12:1473d4b996d1
|
|
|
|
G2 12:1473d4b996d1
|
|
|
|
H 8:5cb05ba470a7
|
2019-12-17 05:10:38 +03:00
|
|
|
I 0:426bada5c675
|
|
|
|
Z -1:000000000000
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
b-B 0:426bada5c675
|
|
|
|
b-C 0:426bada5c675
|
2020-06-11 03:33:43 +03:00
|
|
|
b-D 10:7c78f703e465
|
|
|
|
b-F 11:d11b3456a873
|
|
|
|
b-F@divergent1 4:7fb047a69f22
|
|
|
|
b-F@divergent3 12:1473d4b996d1
|
|
|
|
b-G 12:1473d4b996d1
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
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]
|
2017-10-17 12:29:26 +03:00
|
|
|
> evolution=true
|
2017-10-17 16:56:49 +03:00
|
|
|
> evolution.track-operation=1
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
> EOF
|
|
|
|
|
2017-10-04 02:59:17 +03:00
|
|
|
$ hg testnodescleanup --config extensions.t=$TESTTMP/scmutilcleanup.py
|
|
|
|
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
$ hg log -G -T '{rev}:{node|short} {desc} {bookmarks}' -r 'sort(all(), topo)'
|
2019-12-17 05:10:38 +03:00
|
|
|
o 12:1473d4b996d1 G2 G G2 b-F@divergent3 b-G
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
|
|
2019-12-17 05:10:38 +03:00
|
|
|
| o 11:d11b3456a873 F2 F F2 b-F
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| |
|
2019-12-17 05:10:38 +03:00
|
|
|
| o 8:5cb05ba470a7 H H
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
|/|
|
2019-12-17 05:10:38 +03:00
|
|
|
| o 4:7fb047a69f22 E E b-F@divergent1
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| |
|
2019-12-17 05:10:38 +03:00
|
|
|
| | o 10:7c78f703e465 D2 D D2 b-D
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| | |
|
2020-06-11 03:33:43 +03:00
|
|
|
| | o 6:26805aba1e60 C
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| | |
|
2020-06-11 03:33:43 +03:00
|
|
|
| | o 3:112478962961 B
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
| |/
|
2020-06-11 03:33:43 +03:00
|
|
|
o | 1:1fc8102cda62 G
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
/
|
2019-12-17 05:10:38 +03:00
|
|
|
o 0:426bada5c675 A A B C I b-B b-C b-I
|
scmutil: add a cleanupnodes method for developers
It's now common that an old node gets replaced by zero or more new nodes,
that could happen with amend, rebase, histedit, etc. And it's a common
requirement to do bookmark movements, strip or obsolete nodes and even
moving working copy parent.
Previously, amend, rebase, history have their own logic doing the above.
This patch is an attempt to unify them and future code.
This enables new developers to be able to do "replace X with Y" thing
correctly, without any knowledge about bookmarks, strip or obsstore.
The next step will be migrating rebase to the new API, so it works inside a
transaction, and its code could be simplified.
2017-06-25 23:31:56 +03:00
|
|
|
|
|
|
|
$ hg debugobsolete
|
2017-09-14 21:16:47 +03:00
|
|
|
$ 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]
|
2017-10-17 12:29:26 +03:00
|
|
|
> evolution=true
|
2017-09-14 21:16:47 +03:00
|
|
|
> EOF
|
|
|
|
$ echo a > a
|
|
|
|
$ hg ci -Aqm a
|
|
|
|
$ hg ci --amend -m a2
|
|
|
|
$ hg debugobsolete
|
2019-02-25 14:50:46 +03:00
|
|
|
$ hg debugstrip .
|
2017-09-14 21:16:47 +03:00
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg unbundle -q .hg/strip-backup/*
|
|
|
|
$ hg debugobsolete
|
|
|
|
$ cd ..
|