--- a/mercurial/copies.py Tue Aug 11 15:06:02 2015 -0400
+++ b/mercurial/copies.py Tue Jan 27 11:26:27 2015 -0800
@@ -191,6 +191,9 @@
return cm
def _backwardrenames(a, b):
+ if a._repo.ui.configbool('experimental', 'disablecopytrace'):
+ return {}
+
# Even though we're not taking copies into account, 1:n rename situations
# can still exist (e.g. hg cp a b; hg mv a c). In those cases we
# arbitrarily pick one of the renames.
@@ -264,6 +267,12 @@
if c2.node() is None and c1.node() == repo.dirstate.p1():
return repo.dirstate.copies(), {}, {}, {}
+ # Copy trace disabling is explicitly below the node == p1 logic above
+ # because the logic above is required for a simple copy to be kept across a
+ # rebase.
+ if repo.ui.configbool('experimental', 'disablecopytrace'):
+ return {}, {}, {}, {}
+
limit = _findlimit(repo, c1.rev(), c2.rev())
if limit is None:
# no common ancestor, no copies
@@ -513,7 +522,12 @@
copies between fromrev and rev.
'''
exclude = {}
- if skiprev is not None:
+ if (skiprev is not None and
+ not repo.ui.configbool('experimental', 'disablecopytrace')):
+ # disablecopytrace skips this line, but not the entire function because
+ # the line below is O(size of the repo) during a rebase, while the rest
+ # of the function is much faster (and is required for carrying copy
+ # metadata across the rebase anyway).
exclude = pathcopies(repo[fromrev], repo[skiprev])
for dst, src in pathcopies(repo[fromrev], repo[rev]).iteritems():
# copies.pathcopies returns backward renames, so dst might not