diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -3110,10 +3110,14 @@ def graft(ui, repo, *revs, **opts): # check for ancestors of dest branch crev = repo['.'].rev() ancestors = repo.changelog.ancestors([crev], inclusive=True) + # Cannot use x.remove(y) on smart set, this has to be a list. + # XXX make this lazy in the future + revs = list(revs) # don't mutate while iterating, create a copy for rev in list(revs): if rev in ancestors: ui.warn(_('skipping ancestor revision %s\n') % rev) + # XXX remove on list is slow revs.remove(rev) 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 @@ -571,3 +571,14 @@ All copies of a cset date: Thu Jan 01 00:00:00 1970 +0000 summary: 2 + +graft works on complex revset + + $ hg graft 'origin(13) or destination(origin(13))' + skipping ancestor revision 21 + skipping ancestor revision 22 + skipping revision 2 (already grafted to 22) + grafting revision 7 + grafting revision 13 + grafting revision 19 + merging b