graft: record intermediate grafts in extras

Previously the extra field for a graft only contained the original commit hash.
This made it impossible to use graft to copy a commit more than once, because
the extras fields did not change after the second graft.

The fix is to add an extra.intermediate-source field that records the immediate
predecessor to graft. This changes hashes for commits that have been grafted
twice, which is why the test was affected.
This commit is contained in:
Durham Goode 2015-04-05 12:12:02 -07:00
parent 9d87aed6e4
commit 1080800192
2 changed files with 41 additions and 23 deletions

View File

@ -3547,9 +3547,12 @@ def graft(ui, repo, *revs, **opts):
continue continue
source = ctx.extra().get('source') source = ctx.extra().get('source')
if not source: extra = {}
source = ctx.hex() if source:
extra = {'source': source} extra['source'] = source
extra['intermediate-source'] = ctx.hex()
else:
extra['source'] = ctx.hex()
user = ctx.user() user = ctx.user()
if opts.get('user'): if opts.get('user'):
user = opts['user'] user = opts['user']

View File

@ -313,7 +313,7 @@ Graft again onto another branch should preserve the original source
2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4 2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4
$ hg log --debug -r tip $ hg log --debug -r tip
changeset: 13:9db0f28fd3747e92c57d015f53b5593aeec53c2d changeset: 13:7a4785234d87ec1aa420ed6b11afe40fa73e12a9
tag: tip tag: tip
phase: draft phase: draft
parent: 12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f parent: 12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
@ -324,6 +324,7 @@ Graft again onto another branch should preserve the original source
files+: b files+: b
files-: a files-: a
extra: branch=default extra: branch=default
extra: intermediate-source=ef0ef43d49e79e81ddafdc7997401ba0041efc82
extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4 extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
description: description:
2 2
@ -338,10 +339,10 @@ Disallow grafting an already grafted cset onto its original branch
Disallow grafting already grafted csets with the same origin onto each other Disallow grafting already grafted csets with the same origin onto each other
$ hg up -q 13 $ hg up -q 13
$ hg graft 2 $ hg graft 2
skipping revision 2:5c095ad7e90f (already grafted to 13:9db0f28fd374) skipping revision 2:5c095ad7e90f (already grafted to 13:7a4785234d87)
[255] [255]
$ hg graft 7 $ hg graft 7
skipping already grafted revision 7:ef0ef43d49e7 (13:9db0f28fd374 also has origin 2:5c095ad7e90f) skipping already grafted revision 7:ef0ef43d49e7 (13:7a4785234d87 also has origin 2:5c095ad7e90f)
[255] [255]
$ hg up -q 7 $ hg up -q 7
@ -349,7 +350,7 @@ Disallow grafting already grafted csets with the same origin onto each other
skipping revision 2:5c095ad7e90f (already grafted to 7:ef0ef43d49e7) skipping revision 2:5c095ad7e90f (already grafted to 7:ef0ef43d49e7)
[255] [255]
$ hg graft tip $ hg graft tip
skipping already grafted revision 13:9db0f28fd374 (7:ef0ef43d49e7 also has origin 2:5c095ad7e90f) skipping already grafted revision 13:7a4785234d87 (7:ef0ef43d49e7 also has origin 2:5c095ad7e90f)
[255] [255]
Graft with --log Graft with --log
@ -543,7 +544,7 @@ Test simple destination
date: Thu Jan 01 00:00:00 1970 +0000 date: Thu Jan 01 00:00:00 1970 +0000
summary: 3 summary: 3
changeset: 13:9db0f28fd374 changeset: 13:7a4785234d87
user: foo user: foo
date: Thu Jan 01 00:00:00 1970 +0000 date: Thu Jan 01 00:00:00 1970 +0000
summary: 2 summary: 2
@ -578,7 +579,7 @@ Test simple destination
date: Thu Jan 01 00:00:00 1970 +0000 date: Thu Jan 01 00:00:00 1970 +0000
summary: 2 summary: 2
changeset: 13:9db0f28fd374 changeset: 13:7a4785234d87
user: foo user: foo
date: Thu Jan 01 00:00:00 1970 +0000 date: Thu Jan 01 00:00:00 1970 +0000
summary: 2 summary: 2
@ -621,7 +622,7 @@ All copies of a cset
date: Thu Jan 01 00:00:00 1970 +0000 date: Thu Jan 01 00:00:00 1970 +0000
summary: 2 summary: 2
changeset: 13:9db0f28fd374 changeset: 13:7a4785234d87
user: foo user: foo
date: Thu Jan 01 00:00:00 1970 +0000 date: Thu Jan 01 00:00:00 1970 +0000
summary: 2 summary: 2
@ -637,7 +638,7 @@ All copies of a cset
date: Thu Jan 01 00:00:00 1970 +0000 date: Thu Jan 01 00:00:00 1970 +0000
summary: 2 summary: 2
changeset: 22:e95864da75a0 changeset: 22:d1cb6591fa4b
branch: dev branch: dev
tag: tip tag: tip
user: foo user: foo
@ -649,11 +650,11 @@ graft works on complex revset
$ hg graft 'origin(13) or destination(origin(13))' $ hg graft 'origin(13) or destination(origin(13))'
skipping ancestor revision 21:7e61b508e709 skipping ancestor revision 21:7e61b508e709
skipping ancestor revision 22:e95864da75a0 skipping ancestor revision 22:d1cb6591fa4b
skipping revision 2:5c095ad7e90f (already grafted to 22:e95864da75a0) skipping revision 2:5c095ad7e90f (already grafted to 22:d1cb6591fa4b)
grafting 7:ef0ef43d49e7 "2" grafting 7:ef0ef43d49e7 "2"
warning: can't find ancestor for 'b' copied from 'a'! warning: can't find ancestor for 'b' copied from 'a'!
grafting 13:9db0f28fd374 "2" grafting 13:7a4785234d87 "2"
warning: can't find ancestor for 'b' copied from 'a'! warning: can't find ancestor for 'b' copied from 'a'!
grafting 19:9627f653b421 "2" grafting 19:9627f653b421 "2"
merging b merging b
@ -664,7 +665,7 @@ graft with --force (still doesn't graft merges)
$ hg graft 19 0 6 $ hg graft 19 0 6
skipping ungraftable merge revision 6 skipping ungraftable merge revision 6
skipping ancestor revision 0:68795b066622 skipping ancestor revision 0:68795b066622
skipping already grafted revision 19:9627f653b421 (22:e95864da75a0 also has origin 2:5c095ad7e90f) skipping already grafted revision 19:9627f653b421 (22:d1cb6591fa4b also has origin 2:5c095ad7e90f)
[255] [255]
$ hg graft 19 0 6 --force $ hg graft 19 0 6 --force
skipping ungraftable merge revision 6 skipping ungraftable merge revision 6
@ -679,12 +680,12 @@ graft --force after backout
$ hg ci -m 28 $ hg ci -m 28
$ hg backout 28 $ hg backout 28
reverting a reverting a
changeset 29:8389853bba65 backs out changeset 28:cd42a33e1848 changeset 29:53177ba928f6 backs out changeset 28:50a516bb8b57
$ hg graft 28 $ hg graft 28
skipping ancestor revision 28:cd42a33e1848 skipping ancestor revision 28:50a516bb8b57
[255] [255]
$ hg graft 28 --force $ hg graft 28 --force
grafting 28:cd42a33e1848 "28" grafting 28:50a516bb8b57 "28"
merging a merging a
$ cat a $ cat a
abc abc
@ -694,7 +695,7 @@ graft --continue after --force
$ echo def > a $ echo def > a
$ hg ci -m 31 $ hg ci -m 31
$ hg graft 28 --force --tool internal:fail $ hg graft 28 --force --tool internal:fail
grafting 28:cd42a33e1848 "28" grafting 28:50a516bb8b57 "28"
abort: unresolved conflicts, can't continue abort: unresolved conflicts, can't continue
(use hg resolve and hg graft --continue) (use hg resolve and hg graft --continue)
[255] [255]
@ -707,7 +708,7 @@ graft --continue after --force
$ hg resolve -m a $ hg resolve -m a
(no more unresolved files) (no more unresolved files)
$ hg graft -c $ hg graft -c
grafting 28:cd42a33e1848 "28" grafting 28:50a516bb8b57 "28"
$ cat a $ cat a
abc abc
@ -719,7 +720,7 @@ but do some destructive editing of the repo:
$ hg --config extensions.strip= strip 2 $ hg --config extensions.strip= strip 2
saved backup bundle to $TESTTMP/a/.hg/strip-backup/5c095ad7e90f-d323a1e4-backup.hg (glob) saved backup bundle to $TESTTMP/a/.hg/strip-backup/5c095ad7e90f-d323a1e4-backup.hg (glob)
$ hg graft tmp $ hg graft tmp
skipping already grafted revision 8:9db0f28fd374 (2:ef0ef43d49e7 also has unknown origin 5c095ad7e90f) skipping already grafted revision 8:7a4785234d87 (2:ef0ef43d49e7 also has unknown origin 5c095ad7e90f)
[255] [255]
Empty graft Empty graft
@ -728,8 +729,8 @@ Empty graft
$ hg tag -f something $ hg tag -f something
$ hg graft -qr 27 $ hg graft -qr 27
$ hg graft -f 27 $ hg graft -f 27
grafting 27:3d35c4c79e5a "28" grafting 27:ed6c7e54e319 "28"
note: graft of 27:3d35c4c79e5a created no changes to commit note: graft of 27:ed6c7e54e319 created no changes to commit
$ cd .. $ cd ..
@ -756,3 +757,17 @@ Graft to duplicate a commit
|/ |/
o 0 o 0
Graft to duplicate a commit twice
$ hg up -q 0
$ hg graft -r 2
grafting 2:044ec77f6389 "b" (tip)
$ hg log -G -T '{rev}\n'
@ 3
|
| o 2
|/
| o 1
|/
o 0