# HG changeset patch # User Paul Moore # Date 2008-07-01 16:59:31 # Node ID 482581431dcd86001f5e2272acaeb82457dd0679 # Parent 694223a29ad494fbd2cee69ebdceadfc6ac127cf 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 @@ def manifestmerge(repo, p1, p2, pa, over 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 @@ def applyupdates(repo, action, wctx, mct ms = mergestate(repo) ms.reset(wctx.parents()[0].node()) moves = [] - action.sort() + action.sort(actioncmp) # prescan for merges for a in action: diff --git a/tests/test-update-reverse.out b/tests/test-update-reverse.out --- a/tests/test-update-reverse.out +++ b/tests/test-update-reverse.out @@ -46,9 +46,9 @@ resolving manifests 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