graft: use missing ancestors algorithm to find earlier grafts
When the revisions to graft are numerically close to the destination, this
avoids two walks up the DAG, which for a repository with over 470,000
changesets translates to around 2.2 seconds.
--- a/mercurial/commands.py Sat Apr 06 20:05:17 2013 -0700
+++ b/mercurial/commands.py Sat Apr 06 19:50:03 2013 -0700
@@ -2937,7 +2937,9 @@
# check ancestors for earlier grafts
ui.debug('scanning for duplicate grafts\n')
- for ctx in repo.set("::. - ::%ld", revs):
+
+ for rev in repo.changelog.findmissingrevs(revs, [crev]):
+ ctx = repo[rev]
n = ctx.extra().get('source')
if n in ids:
r = repo[n].rev()
@@ -2951,7 +2953,7 @@
elif ctx.hex() in ids:
r = ids[ctx.hex()]
ui.warn(_('skipping already grafted revision %s '
- '(was grafted from %d)\n') % (r, ctx.rev()))
+ '(was grafted from %d)\n') % (r, rev))
revs.remove(r)
if not revs:
return -1