Mercurial > public > mercurial-scm > hg
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