Patchwork D763: copytrace: add a a new config to limit the number of drafts in heuristics

login
register
mail settings
Submitter phabricator
Date Sept. 26, 2017, 12:49 p.m.
Message ID <bdee61cbe87b7f8159ebff255ddb945f@localhost.localdomain>
Download mbox | patch
Permalink /patch/24158/
State Not Applicable
Headers show

Comments

phabricator - Sept. 26, 2017, 12:49 p.m.
pulkit updated this revision to Diff 2084.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D763?vs=1967&id=2084

REVISION DETAIL
  https://phab.mercurial-scm.org/D763

AFFECTED FILES
  mercurial/configitems.py
  mercurial/copies.py

CHANGE DETAILS




To: pulkit, #hg-reviewers, yuja
Cc: yuja, mercurial-devel

Patch

diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -371,22 +371,25 @@ 
         # 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.ui, 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(ui, 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.
     """
 
     nonpublicphases = set([phases.draft, phases.secret])
 
     if (c1.phase() in nonpublicphases) and (base.phase() in nonpublicphases):
-        return True
+        sourcecommitlimit = 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):
diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -176,6 +176,9 @@ 
 coreconfigitem('experimental', 'copytrace',
     default='on',
 )
+coreconfigitem('experimental', 'copytrace.sourcecommitlimit',
+    default=100
+)
 coreconfigitem('experimental', 'crecordtest',
     default=None,
 )