[PATCH 2 of 2] diff: pass the diff matcher to the copy logic

Durham Goode durham at fb.com
Thu Apr 16 14:03:08 CDT 2015


# HG changeset patch
# User Durham Goode <durham at fb.com>
# Date 1429209108 25200
#      Thu Apr 16 11:31:48 2015 -0700
# Node ID 6b80abe8862ed1f637748f6f3710b4ec6326a35b
# Parent  0270a44b46aabbaf794dbd62b08b622313fe1b85
diff: pass the diff matcher to the copy logic

This passes the existing diff matcher instance down to the copy logic so copy
tracing can be more efficient when possible and only trace copies for matching
files.

This only actually affects forwardcopies (i.e. Given A<-B<-C<-D, it works for
'hg diff -r B -r D foo.txt', but not for 'hg diff -r D -r B foo.txt') since
backward copies require walking all histories, and not just the individual
file's.

This reduces 'hg diff -r A -r B foo.txt' time from 15s to 1s when A and B have
80,000 files different.

diff --git a/mercurial/patch.py b/mercurial/patch.py
--- a/mercurial/patch.py
+++ b/mercurial/patch.py
@@ -2127,7 +2127,7 @@ def diff(repo, node1=None, node2=None, m
 
     copy = {}
     if opts.git or opts.upgrade:
-        copy = copies.pathcopies(ctx1, ctx2)
+        copy = copies.pathcopies(ctx1, ctx2, match=match)
 
     if relroot is not None:
         if not relfiltered:


More information about the Mercurial-devel mailing list