[PATCH 4 of 4 V2] graft: disallow grafting grafted csets in specific situations (issue3091)
Stefano Tortarolo
stefano.tortarolo at gmail.com
Mon Nov 14 13:22:40 CST 2011
# HG changeset patch
# User Stefano Tortarolo <stefano.tortarolo at gmail.com>
# Date 1321102825 -3600
# Node ID ceede36f64497ee8a9b2ea217f92c2e29f0ab49b
# Parent 2572625e9fcde7ecc975dcd473cccfb2ecbc1989
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
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -2572,17 +2572,36 @@
if not revs:
return -1
+ # analyze revs for earlier grafts
+ ids = {}
+ for ctx in repo.set("%ld", revs):
+ ids[ctx.hex()] = ctx.rev()
+ sources = ctx.extra().get('sources')
+ if sources:
+ for n in sources.split(sep):
+ ids[n] = ctx.rev()
+
# check ancestors for earlier grafts
ui.debug('scanning for duplicate grafts\n')
for ctx in repo.set("::. - ::%ld", revs):
sources = ctx.extra().get('sources')
if sources:
for n in sources.split(sep):
- 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])
+ if ctx.hex() in ids:
+ r = ids[ctx.hex()]
+ if r in revs:
+ ui.warn(_('skipping already grafted revision %s '
+ '(was grafted from %d)\n') % (r, ctx.rev()))
+ revs.remove(r)
if not revs:
return -1
diff --git a/tests/test-graft.t b/tests/test-graft.t
--- a/tests/test-graft.t
+++ b/tests/test-graft.t
@@ -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]
More information about the Mercurial-devel
mailing list