# HG changeset patch # User Siddharth Agarwal # Date 1365303917 25200 # Node ID 177774e4b04a88023278369f2aecd993640ea363 # Parent 3cfaace0441e936826a4a0d4ae12d545f11a903d graft: find ancestors of destination lazily When the revisions to graft are numerically close to the destination, this avoids one walk up the DAG, which for a repository with over 470,000 changesets translates to around 1.1 seconds. diff -r 3cfaace0441e -r 177774e4b04a mercurial/commands.py --- a/mercurial/commands.py Thu Apr 04 20:22:29 2013 -0700 +++ b/mercurial/commands.py Sat Apr 06 20:05:17 2013 -0700 @@ -2917,9 +2917,13 @@ return -1 # check for ancestors of dest branch - for rev in repo.revs('::. and %ld', revs): - ui.warn(_('skipping ancestor revision %s\n') % rev) - revs.remove(rev) + crev = repo['.'].rev() + ancestors = repo.changelog.ancestors([crev], inclusive=True) + # 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) + revs.remove(rev) if not revs: return -1