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
--- 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]))