diff mercurial/commands.py @ 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 dc9fb7015d7f
children 6cae68a361ed
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