[PATCH] Sort removes first when applying updates (fixes issues 750 and 912)

Paul Moore p.f.moore at gmail.com
Tue Jul 1 12:10:07 CDT 2008


# HG changeset patch
# User Paul Moore <p.f.moore at gmail.com>
# Date 1214931571 -3600
# Node ID 78b3e254478e76d8f5058670f447ae1cbceab708
# Parent  88a1bcc5c6a7b1729eb97d0509531c0f9f4a606e
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.

diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -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:


More information about the Mercurial-devel mailing list