From patchwork Sun Apr 7 03:15:24 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2, of, 2] graft: use missing ancestors algorithm to find earlier grafts From: Siddharth Agarwal X-Patchwork-Id: 1258 Message-Id: <99a410e82b35e71d5f61.1365304524@sid0x220> To: mercurial-devel@selenic.com Date: Sat, 06 Apr 2013 20:15:24 -0700 # HG changeset patch # User Siddharth Agarwal # Date 1365303003 25200 # Sat Apr 06 19:50:03 2013 -0700 # Node ID 99a410e82b35e71d5f6121a9b9bfc11103678e83 # Parent aff777b0929f7c26ffe97f226389271dd3d353d4 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. diff -r aff777b0929f -r 99a410e82b35 mercurial/commands.py --- 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 @@ def graft(ui, repo, *revs, **opts): # 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 @@ def graft(ui, repo, *revs, **opts): 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