diff -r 2d0c306a88c2 -r 1826d695ad58 mercurial/copies.py --- a/mercurial/copies.py Tue Sep 26 16:14:57 2017 +0300 +++ b/mercurial/copies.py Thu Sep 21 15:58:44 2017 +0530 @@ -371,22 +371,27 @@ # Do full copytracing if only drafts are involved as that will be fast # enough and will also cover the copies which can be missed by # heuristics - if _isfullcopytraceable(c1, base): + if _isfullcopytraceable(repo, c1, base): return _fullcopytracing(repo, c1, c2, base) return _heuristicscopytracing(repo, c1, c2, base) else: return _fullcopytracing(repo, c1, c2, base) -def _isfullcopytraceable(c1, base): +def _isfullcopytraceable(repo, c1, base): """ Checks that if base, source and destination are all draft branches, if yes let's use the full copytrace algorithm for increased capabilities since it will be fast enough. """ + if c1.rev() is None: + c1 = c1.p1() nonpublicphases = set([phases.draft, phases.secret]) if (c1.phase() in nonpublicphases) and (base.phase() in nonpublicphases): - return True + sourcecommitlimit = repo.ui.configint('experimental', + 'copytrace.sourcecommitlimit') + commits = len(repo.revs('%d::%d', base.rev(), c1.rev())) + return commits < sourcecommitlimit return False def _fullcopytracing(repo, c1, c2, base):