D6422: copies: avoid calling matcher if matcher.always()
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Wed May 22 00:33:00 UTC 2019
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
When storing copy information in the changesets, this patch speeds up
hg debugpathcopies FENNEC_58_0_2_BUILD1 FIREFOX_59_0b8_BUILD2
from 5.9s to 4.7s.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D6422
AFFECTED FILES
mercurial/copies.py
CHANGE DETAILS
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -270,6 +270,7 @@
# came from.
work = [(r, 1, {}) for r in roots]
heapq.heapify(work)
+ alwaysmatch = match.always()
while work:
r, i1, copies1 = heapq.heappop(work)
if work and work[0][0] == r:
@@ -280,7 +281,7 @@
# TODO: perhaps this filtering should be done as long as ctx
# is merge, whether or not we're tracing from both parent.
for dst in allcopies:
- if not match(dst):
+ if not alwaysmatch and not match(dst):
continue
# Unlike when copies are stored in the filelog, we consider
# it a copy even if the destination already existed on the
@@ -306,7 +307,7 @@
assert r == childctx.p2().rev()
parent = 2
childcopies = childctx.p2copies()
- if not match.always():
+ if not alwaysmatch:
childcopies = {dst: src for dst, src in childcopies.items()
if match(dst)}
# Copy the dict only if later iterations will also need it
To: martinvonz, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list