# HG changeset patch # User Matt Mackall # Date 1452701405 21600 # Node ID 602add6ad9e519598e72c873f7a6581dbbb9e390 # Parent add2ba16430ea5d31ee26e84e1b4c66dc3a6ee15 copies: fix detection of divergent directory renames If we move all the files out of one directory, but into two different directories, we should not consider it a directory rename. The detection of this case was broken. diff -r add2ba16430e -r 602add6ad9e5 mercurial/copies.py --- a/mercurial/copies.py Fri Jan 15 13:14:49 2016 -0800 +++ b/mercurial/copies.py Wed Jan 13 10:10:05 2016 -0600 @@ -401,13 +401,13 @@ 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 + "/" diff -r add2ba16430e -r 602add6ad9e5 tests/test-rename-dir-merge.t --- a/tests/test-rename-dir-merge.t Fri Jan 15 13:14:49 2016 -0800 +++ b/tests/test-rename-dir-merge.t Wed Jan 13 10:10:05 2016 -0600 @@ -231,3 +231,63 @@ R a/f $ cd .. + +Test renames to separate directories + + $ hg init a + $ cd a + $ mkdir a + $ touch a/s + $ touch a/t + $ hg ci -Am0 + adding a/s + adding a/t + +Add more files + + $ touch a/s2 + $ touch a/t2 + $ hg ci -Am1 + adding a/s2 + adding a/t2 + +Do moves on a branch + + $ hg up 0 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ mkdir s + $ mkdir t + $ hg mv a/s s + $ hg mv a/t t + $ hg ci -Am2 + created new head + $ hg st --copies --change . + A s/s + a/s + A t/t + a/t + R a/s + R a/t + +Merge shouldn't move s2, t2 + + $ hg merge + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg st --copies + M a/s2 + M a/t2 + +Try the merge in the other direction. It may or may not be appropriate for +status to list copies here. + + $ hg up -C 1 + 4 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg merge + 2 files updated, 0 files merged, 2 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg st --copies + M s/s + M t/t + R a/s + R a/t