branchmap: issue a single call to `ancestors` for all heads
There is no reason to make multiple calls. This provides a massive speedup for
repo with a lot of heads.
On a strongly headed repo this gives humble speedup in simple case:
from 8.1097 to 5.1051
And massive speedup in other case:
from 7.8787 to 0.1984
--- a/mercurial/branchmap.py Sat Aug 30 11:39:15 2014 +0200
+++ b/mercurial/branchmap.py Sat Aug 30 12:20:50 2014 +0200
@@ -252,15 +252,11 @@
newheadrevs.sort()
bheadset.update(newheadrevs)
- # This loop prunes out two kinds of heads - heads that are
- # superseded by a head in newheadrevs, and newheadrevs that are not
- # heads because an existing head is their descendant.
- while newheadrevs:
- latest = newheadrevs.pop()
- if latest not in bheadset:
- continue
- ancestors = set(cl.ancestors([latest], min(bheadset)))
- bheadset -= ancestors
+ # This prunes out two kinds of heads - heads that are superseded by
+ # a head in newheadrevs, and newheadrevs that are not heads because
+ # an existing head is their descendant.
+ ancestors = set(cl.ancestors(newheadrevs, min(bheadset)))
+ bheadset -= ancestors
bheadrevs = sorted(bheadset)
self[branch] = [cl.node(rev) for rev in bheadrevs]
tiprev = bheadrevs[-1]