--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -630,7 +630,9 @@ class localrepository(repo.repository):
elif fp1 != nullid: # copied on local side, reversed
meta["copyrev"] = hex(manifest2.get(cp))
fp2 = fp1
- else: # directory rename
+ elif cp in manifest2: # directory rename on local side
+ meta["copyrev"] = hex(manifest2[cp])
+ else: # directory rename on remote side
meta["copyrev"] = hex(manifest1.get(cp, nullid))
self.ui.debug(_(" %s: copy %s:%s\n") %
(fn, cp, meta["copyrev"]))
@@ -644,7 +646,7 @@ class localrepository(repo.repository):
fp2 = nullid
# is the file unmodified from the parent? report existing entry
- if fp2 == nullid and not fl.cmp(fp1, t):
+ if fp2 == nullid and not fl.cmp(fp1, t) and not meta:
return fp1
changelist.append(fn)
@@ -736,7 +738,8 @@ class localrepository(repo.repository):
new[f] = self.filecommit(f, m1, m2, linkrev, trp, changed)
new_exec = is_exec(f)
new_link = is_link(f)
- if not changed or changed[-1] != f:
+ if ((not changed or changed[-1] != f) and
+ m2.get(f) != new[f]):
# mention the file in the changelog if some
# flag changed, even if there was no content
# change.