Mercurial > hg
changeset 39263:eebd591803ab
copies: correctly skip directories that have already been considered
Previously, `if dsrc in invalid` would never be true, since we added
`dsrc +"/"` to invalid, not `dsrc` itself. Since it's much more common for
individual files (not whole directories) to be moved, it seemed cleaner to
delay appending the "/" until we know we have some directory moves to
actually consider.
I haven't benchmarked this, but I imagine this is a mild performance win.
Differential Revision: https://phab.mercurial-scm.org/D4284
author | Kyle Lippincott <spectral@google.com> |
---|---|
date | Wed, 15 Aug 2018 14:41:27 -0700 |
parents | 5b9f116104f9 |
children | f98d3c57906f |
files | mercurial/copies.py |
diffstat | 1 files changed, 7 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/copies.py Fri Aug 24 12:55:05 2018 -0700 +++ b/mercurial/copies.py Wed Aug 15 14:41:27 2018 -0700 @@ -593,16 +593,16 @@ continue elif dsrc in d1 and ddst in d1: # directory wasn't entirely moved locally - invalid.add(dsrc + "/") + invalid.add(dsrc) elif dsrc in d2 and ddst in d2: # directory wasn't entirely moved remotely - invalid.add(dsrc + "/") - elif dsrc + "/" in dirmove and dirmove[dsrc + "/"] != ddst + "/": + invalid.add(dsrc) + elif dsrc in dirmove and dirmove[dsrc] != ddst: # files from the same directory moved to two different places - invalid.add(dsrc + "/") + invalid.add(dsrc) else: # looks good so far - dirmove[dsrc + "/"] = ddst + "/" + dirmove[dsrc] = ddst for i in invalid: if i in dirmove: @@ -612,6 +612,8 @@ if not dirmove: return copy, {}, diverge, renamedelete, {} + dirmove = {k + "/": v + "/" for k, v in dirmove.iteritems()} + for d in dirmove: repo.ui.debug(" discovered dir src: '%s' -> dst: '%s'\n" % (d, dirmove[d]))