[PATCH 1 of 2] copies: add matcher parameter to copy logic
Durham Goode
durham at fb.com
Thu Apr 16 19:03:07 UTC 2015
# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1429208970 25200
# Thu Apr 16 11:29:30 2015 -0700
# Node ID 0270a44b46aabbaf794dbd62b08b622313fe1b85
# Parent c560d8c687916cb70a6d54c2c9ddcb5c9e457be2
copies: add matcher parameter to copy logic
This allows passing a matcher down the pathcopies() stack to _forwardcopies().
This will let us add logic in a later patch to avoid tracing copies when not
necessary (like when doing hg diff -r 1 -r 2 foo.txt).
diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -547,8 +547,8 @@ def overridefilemerge(origfn, repo, myno
repo.wwrite(fcd.path(), fco.data(), fco.flags())
return 0
-def copiespathcopies(orig, ctx1, ctx2):
- copies = orig(ctx1, ctx2)
+def copiespathcopies(orig, ctx1, ctx2, match=None):
+ copies = orig(ctx1, ctx2, match=match)
updated = {}
for k, v in copies.iteritems():
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -140,14 +140,16 @@ def _dirstatecopies(d):
del c[k]
return c
-def _computeforwardmissing(a, b):
+def _computeforwardmissing(a, b, match=None):
"""Computes which files are in b but not a.
This is its own function so extensions can easily wrap this call to see what
files _forwardcopies is about to process.
"""
- return b.manifest().filesnotin(a.manifest())
+ for f in b.manifest().filesnotin(a.manifest()):
+ if not match or match(f):
+ yield f
-def _forwardcopies(a, b):
+def _forwardcopies(a, b, match=None):
'''find {dst at b: src at a} copy mapping where a is an ancestor of b'''
# check for working copy
@@ -170,7 +172,7 @@ def _forwardcopies(a, b):
# we currently don't try to find where old files went, too expensive
# this means we can miss a case like 'hg rm b; hg cp a b'
cm = {}
- missing = _computeforwardmissing(a, b)
+ missing = _computeforwardmissing(a, b, match=match)
ancestrycontext = a._repo.changelog.ancestors([b.rev()], inclusive=True)
for f in missing:
fctx = b[f]
@@ -198,16 +200,17 @@ def _backwardrenames(a, b):
r[v] = k
return r
-def pathcopies(x, y):
+def pathcopies(x, y, match=None):
'''find {dst at y: src at x} copy mapping for directed compare'''
if x == y or not x or not y:
return {}
a = y.ancestor(x)
if a == x:
- return _forwardcopies(x, y)
+ return _forwardcopies(x, y, match=match)
if a == y:
return _backwardrenames(x, y)
- return _chain(x, y, _backwardrenames(x, a), _forwardcopies(a, y))
+ return _chain(x, y, _backwardrenames(x, a),
+ _forwardcopies(a, y, match=match))
def _computenonoverlap(repo, c1, c2, addedinm1, addedinm2):
"""Computes, based on addedinm1 and addedinm2, the files exclusive to c1
More information about the Mercurial-devel
mailing list