Sort removes first when applying updates (fixes issues 750 and 912)
authorPaul Moore <p.f.moore@gmail.com>
Tue, 01 Jul 2008 17:59:31 +0100
changeset 6805 482581431dcd
parent 6804 694223a29ad4
child 6806 2134d6c09432
Sort removes first when applying updates (fixes issues 750 and 912) This change ensures that removes happen first in applyupdates(). This avoids issues where we try to make a case-only rename of a file on a case insensitive system. Without this patch, the add of the new name happens before the remove of the old one - which results in the file not existing, as the two names are effectively the same. With the patch, the old name gets removed then the new one gets added, which is always safe.
mercurial/merge.py
tests/test-update-reverse.out
--- a/mercurial/merge.py	Thu Jul 03 20:53:14 2008 -0700
+++ b/mercurial/merge.py	Tue Jul 01 17:59:31 2008 +0100
@@ -258,6 +258,17 @@
 
     return action
 
+def actioncmp(a1, a2):
+    m1 = a1[1]
+    m2 = a2[1]
+    if m1 == m2:
+        return cmp(a1, a2)
+    if m1 == 'r':
+        return -1
+    if m2 == 'r':
+        return 1
+    return cmp(a1, a2)
+
 def applyupdates(repo, action, wctx, mctx):
     "apply the merge action list to the working directory"
 
@@ -265,7 +276,7 @@
     ms = mergestate(repo)
     ms.reset(wctx.parents()[0].node())
     moves = []
-    action.sort()
+    action.sort(actioncmp)
 
     # prescan for merges
     for a in action:
--- a/tests/test-update-reverse.out	Thu Jul 03 20:53:14 2008 -0700
+++ b/tests/test-update-reverse.out	Tue Jul 01 17:59:31 2008 +0100
@@ -46,9 +46,9 @@
  side2: remote deleted -> r
  side1: remote deleted -> r
  main: remote created -> g
-getting main
 removing side1
 removing side2
+getting main
 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
 Should only show a main
 a