Mercurial > hg
changeset 9925:9dfe34bf42c7
findrenames: first loop over the removed files, it's faster
Getting the file from the working dir is less expensive than getting it from
the repo history, hence the speedup.
benchmarked on crew repo with:
rm -rf * ; hg up -C ; for i in `find . -name "*.py"` ; do mv $i $i.new;done
followed by:
hg addremove -s 100
before: Time: real 68.760 secs (user 65.760+0.000 sys 2.490+0.000)
after : Time: real 28.890 secs (user 26.920+0.000 sys 1.450+0.000)
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Tue, 24 Nov 2009 17:26:42 +0100 |
parents | 3d718761157b |
children | 4b044b81cb54 |
files | mercurial/cmdutil.py |
diffstat | 1 files changed, 13 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/cmdutil.py Tue Nov 24 16:07:36 2009 +0200 +++ b/mercurial/cmdutil.py Tue Nov 24 17:26:42 2009 +0100 @@ -270,15 +270,16 @@ def findrenames(repo, added, removed, threshold): '''find renamed files -- yields (before, after, score) tuples''' + copies = {} ctx = repo['.'] - for a in added: - aa = repo.wread(a) - bestname, bestscore = None, threshold - for r in removed: - if r not in ctx: - continue - rr = ctx.filectx(r).data() - + for r in removed: + if r not in ctx: + continue + fctx = ctx.filectx(r) + rr = fctx.data() + for a in added: + bestscore = copies.get(a, (None, threshold))[1] + aa = repo.wread(a) # bdiff.blocks() returns blocks of matching lines # count the number of bytes in each equal = 0 @@ -292,9 +293,10 @@ if lengths: myscore = equal*2.0 / lengths if myscore >= bestscore: - bestname, bestscore = r, myscore - if bestname: - yield bestname, a, bestscore + copies[a] = (r, myscore) + for dest, v in copies.iteritems(): + source, score = v + yield source, dest, score def addremove(repo, pats=[], opts={}, dry_run=None, similarity=None): if dry_run is None: