Patchwork [2,of,2,V2] graft: record intermediate grafts in extras

login
register
mail settings
Submitter Durham Goode
Date April 7, 2015, 1:28 a.m.
Message ID <5fab65d89cf42d7d396d.1428370131@dev2000.prn2.facebook.com>
Download mbox | patch
Permalink /patch/8518/
State Accepted
Headers show

Comments

Durham Goode - April 7, 2015, 1:28 a.m.
# HG changeset patch
# User Durham Goode <durham@fb.com>
# Date 1428261122 25200
#      Sun Apr 05 12:12:02 2015 -0700
# Node ID 5fab65d89cf42d7d396d44a32599b1686ae8ddcd
# Parent  cd7d644d0389ae9cf8a54d7b7033fdc5a98b4483
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.
Matt Mackall - April 7, 2015, 10:25 p.m.
On Mon, 2015-04-06 at 18:28 -0700, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham@fb.com>
> # Date 1428261122 25200
> #      Sun Apr 05 12:12:02 2015 -0700
> # Node ID 5fab65d89cf42d7d396d44a32599b1686ae8ddcd
> # Parent  cd7d644d0389ae9cf8a54d7b7033fdc5a98b4483
> graft: record intermediate grafts in extras

These are queued for default, thanks.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -3547,9 +3547,12 @@  def graft(ui, repo, *revs, **opts):
                 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']
diff --git a/tests/test-graft.t b/tests/test-graft.t
--- a/tests/test-graft.t
+++ b/tests/test-graft.t
@@ -313,7 +313,7 @@  Graft again onto another branch should p
   2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4
 
   $ hg log --debug -r tip
-  changeset:   13:9db0f28fd3747e92c57d015f53b5593aeec53c2d
+  changeset:   13:7a4785234d87ec1aa420ed6b11afe40fa73e12a9
   tag:         tip
   phase:       draft
   parent:      12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
@@ -324,6 +324,7 @@  Graft again onto another branch should p
   files+:      b
   files-:      a
   extra:       branch=default
+  extra:       intermediate-source=ef0ef43d49e79e81ddafdc7997401ba0041efc82
   extra:       source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
   description:
   2
@@ -338,10 +339,10 @@  Disallow grafting an already grafted cse
 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 @@  Disallow grafting already grafted csets 
   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 @@  Test simple destination
   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 @@  Test simple destination
   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 @@  All copies of a cset
   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 @@  All copies of a cset
   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 @@  graft works on complex revset
 
   $ 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 @@  graft with --force (still doesn't graft 
   $ 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 @@  graft --force after backout
   $ 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 @@  graft --continue after --force
   $ 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 @@  graft --continue after --force
   $ 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 @@  but do some destructive editing of the r
   $ 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 @@  Empty graft
   $ 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 @@  Graft to duplicate a commit
   |/
   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
+