Mercurial > public > mercurial-scm > hg-stable
diff mercurial/copies.py @ 34846:f05a6e015ecc
copies: add a config to limit the number of candidates to check in heuristics
The heuristics algorithm find possible candidates for move/copy and then check
whether they are actually a copy or move. In some cases, there can be lot of
candidates possible which can actually slow down the algorithm.
This patch introduces a config option
`experimental.copytrace.movecandidateslimit` using which one can limit the
candidates to check. The limit defaults to 100.
Thanks to Yuya for suggesting to skip copytracing for that file with a
warning.
Differential Revision: https://phab.mercurial-scm.org/D987
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Tue, 10 Oct 2017 02:25:03 +0530 |
parents | 754b5117622f |
children | 7ddc1e96d9b0 |
line wrap: on
line diff
--- a/mercurial/copies.py Tue Oct 17 10:31:44 2017 -0700 +++ b/mercurial/copies.py Tue Oct 10 02:25:03 2017 +0530 @@ -11,6 +11,8 @@ import heapq import os +from .i18n import _ + from . import ( match as matchmod, node, @@ -644,6 +646,11 @@ [experimental] copytrace = heuristics + + In some cases the copy/move candidates found by heuristics can be very large + in number and that will make the algorithm slow. The number of possible + candidates to check can be limited by using the config + `experimental.copytrace.movecandidateslimit` which defaults to 100. """ if c1.rev() is None: @@ -704,6 +711,17 @@ # f is guaranteed to be present in c2, that's why # c2.filectx(f) won't fail f2 = c2.filectx(f) + # we can have a lot of candidates which can slow down the heuristics + # config value to limit the number of candidates moves to check + maxcandidates = repo.ui.configint('experimental', + 'copytrace.movecandidateslimit') + + if len(movecandidates) > maxcandidates: + repo.ui.status(_("skipping copytracing for '%s', more " + "candidates than the limit: %d\n") + % (f, len(movecandidates))) + continue + for candidate in movecandidates: f1 = c1.filectx(candidate) if _related(f1, f2, anc.rev()):