[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