changeset 15508:00276525e2b7 stable

graft: disallow grafting grafted csets in specific situations (issue3091) In particular, we do not allow: - grafting an already grafted cset onto its original branch - grafting already grafted csets with the same origin onto each other
author Stefano Tortarolo <stefano.tortarolo@gmail.com>
date Sat, 12 Nov 2011 14:00:25 +0100
parents 7186b54b07c6
children 3774e1453ef4
files mercurial/commands.py tests/test-graft.t
diffstat 2 files changed, 40 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/commands.py	Sat Nov 12 11:23:52 2011 +0100
+++ b/mercurial/commands.py	Sat Nov 12 14:00:25 2011 +0100
@@ -2547,15 +2547,32 @@
     if not revs:
         return -1
 
+    # analyze revs for earlier grafts
+    ids = {}
+    for ctx in repo.set("%ld", revs):
+        ids[ctx.hex()] = ctx.rev()
+        n = ctx.extra().get('source')
+        if n:
+            ids[n] = ctx.rev()
+
     # check ancestors for earlier grafts
     ui.debug('scanning for duplicate grafts\n')
     for ctx in repo.set("::. - ::%ld", revs):
         n = ctx.extra().get('source')
-        if n and n in repo:
+        if n in ids:
             r = repo[n].rev()
             if r in revs:
                 ui.warn(_('skipping already grafted revision %s\n') % r)
                 revs.remove(r)
+            elif ids[n] in revs:
+                ui.warn(_('skipping already grafted revision %s '
+                            '(same origin %d)\n') % (ids[n], r))
+                revs.remove(ids[n])
+        elif ctx.hex() in ids:
+            r = ids[ctx.hex()]
+            ui.warn(_('skipping already grafted revision %s '
+                            '(was grafted from %d)\n') % (r, ctx.rev()))
+            revs.remove(r)
     if not revs:
         return -1
 
--- a/tests/test-graft.t	Sat Nov 12 11:23:52 2011 +0100
+++ b/tests/test-graft.t	Sat Nov 12 14:00:25 2011 +0100
@@ -255,3 +255,25 @@
   2
   
   
+Disallow grafting an already grafted cset onto its original branch
+  $ hg up -q 6
+  $ hg graft 7
+  skipping already grafted revision 7 (was grafted from 2)
+  [255]
+
+Disallow grafting already grafted csets with the same origin onto each other
+  $ hg up -q 13
+  $ hg graft 2
+  skipping already grafted revision 2
+  [255]
+  $ hg graft 7
+  skipping already grafted revision 7 (same origin 2)
+  [255]
+
+  $ hg up -q 7
+  $ hg graft 2
+  skipping already grafted revision 2
+  [255]
+  $ hg graft tip
+  skipping already grafted revision 13 (same origin 2)
+  [255]