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.
--- a/mercurial/commands.py Sun Apr 05 11:55:38 2015 -0700
+++ b/mercurial/commands.py Sun Apr 05 12:12:02 2015 -0700
@@ -3547,9 +3547,12 @@
continue
source = ctx.extra().get('source')
- if not source:
- source = ctx.hex()
- extra = {'source': source}
+ extra = {}
+ if source:
+ extra['source'] = source
+ extra['intermediate-source'] = ctx.hex()
+ else:
+ extra['source'] = ctx.hex()
user = ctx.user()
if opts.get('user'):
user = opts['user']
--- a/tests/test-graft.t Sun Apr 05 11:55:38 2015 -0700
+++ b/tests/test-graft.t Sun Apr 05 12:12:02 2015 -0700
@@ -313,7 +313,7 @@
2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4
$ hg log --debug -r tip
- changeset: 13:9db0f28fd3747e92c57d015f53b5593aeec53c2d
+ changeset: 13:7a4785234d87ec1aa420ed6b11afe40fa73e12a9
tag: tip
phase: draft
parent: 12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
@@ -324,6 +324,7 @@
files+: b
files-: a
extra: branch=default
+ extra: intermediate-source=ef0ef43d49e79e81ddafdc7997401ba0041efc82
extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
description:
2
@@ -338,10 +339,10 @@
Disallow grafting already grafted csets with the same origin onto each other
$ hg up -q 13
$ hg graft 2
- skipping revision 2:5c095ad7e90f (already grafted to 13:9db0f28fd374)
+ skipping revision 2:5c095ad7e90f (already grafted to 13:7a4785234d87)
[255]
$ 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]
$ hg up -q 7
@@ -349,7 +350,7 @@
skipping revision 2:5c095ad7e90f (already grafted to 7:ef0ef43d49e7)
[255]
$ 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]
Graft with --log
@@ -543,7 +544,7 @@
date: Thu Jan 01 00:00:00 1970 +0000
summary: 3
- changeset: 13:9db0f28fd374
+ changeset: 13:7a4785234d87
user: foo
date: Thu Jan 01 00:00:00 1970 +0000
summary: 2
@@ -578,7 +579,7 @@
date: Thu Jan 01 00:00:00 1970 +0000
summary: 2
- changeset: 13:9db0f28fd374
+ changeset: 13:7a4785234d87
user: foo
date: Thu Jan 01 00:00:00 1970 +0000
summary: 2
@@ -621,7 +622,7 @@
date: Thu Jan 01 00:00:00 1970 +0000
summary: 2
- changeset: 13:9db0f28fd374
+ changeset: 13:7a4785234d87
user: foo
date: Thu Jan 01 00:00:00 1970 +0000
summary: 2
@@ -637,7 +638,7 @@
date: Thu Jan 01 00:00:00 1970 +0000
summary: 2
- changeset: 22:e95864da75a0
+ changeset: 22:d1cb6591fa4b
branch: dev
tag: tip
user: foo
@@ -649,11 +650,11 @@
$ hg graft 'origin(13) or destination(origin(13))'
skipping ancestor revision 21:7e61b508e709
- skipping ancestor revision 22:e95864da75a0
- skipping revision 2:5c095ad7e90f (already grafted to 22:e95864da75a0)
+ skipping ancestor revision 22:d1cb6591fa4b
+ skipping revision 2:5c095ad7e90f (already grafted to 22:d1cb6591fa4b)
grafting 7:ef0ef43d49e7 "2"
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'!
grafting 19:9627f653b421 "2"
merging b
@@ -664,7 +665,7 @@
$ hg graft 19 0 6
skipping ungraftable merge revision 6
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]
$ hg graft 19 0 6 --force
skipping ungraftable merge revision 6
@@ -679,12 +680,12 @@
$ hg ci -m 28
$ hg backout 28
reverting a
- changeset 29:8389853bba65 backs out changeset 28:cd42a33e1848
+ changeset 29:53177ba928f6 backs out changeset 28:50a516bb8b57
$ hg graft 28
- skipping ancestor revision 28:cd42a33e1848
+ skipping ancestor revision 28:50a516bb8b57
[255]
$ hg graft 28 --force
- grafting 28:cd42a33e1848 "28"
+ grafting 28:50a516bb8b57 "28"
merging a
$ cat a
abc
@@ -694,7 +695,7 @@
$ echo def > a
$ hg ci -m 31
$ hg graft 28 --force --tool internal:fail
- grafting 28:cd42a33e1848 "28"
+ grafting 28:50a516bb8b57 "28"
abort: unresolved conflicts, can't continue
(use hg resolve and hg graft --continue)
[255]
@@ -707,7 +708,7 @@
$ hg resolve -m a
(no more unresolved files)
$ hg graft -c
- grafting 28:cd42a33e1848 "28"
+ grafting 28:50a516bb8b57 "28"
$ cat a
abc
@@ -719,7 +720,7 @@
$ hg --config extensions.strip= strip 2
saved backup bundle to $TESTTMP/a/.hg/strip-backup/5c095ad7e90f-d323a1e4-backup.hg (glob)
$ 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]
Empty graft
@@ -728,8 +729,8 @@
$ hg tag -f something
$ hg graft -qr 27
$ hg graft -f 27
- grafting 27:3d35c4c79e5a "28"
- note: graft of 27:3d35c4c79e5a created no changes to commit
+ grafting 27:ed6c7e54e319 "28"
+ note: graft of 27:ed6c7e54e319 created no changes to commit
$ cd ..
@@ -756,3 +757,17 @@
|/
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
+