changeset 10874:4f11978ae45d stable

copies: properly visit file context ancestors on working file contexts
author Henrik Stuart <henrik.stuart@edlund.dk>
date Wed, 07 Apr 2010 21:31:47 +0200
parents 9606edb8777e
children a9702c47a19f
files mercurial/copies.py tests/test-update-renames tests/test-update-renames.out
diffstat 3 files changed, 39 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/copies.py	Wed Apr 07 16:55:01 2010 +0200
+++ b/mercurial/copies.py	Wed Apr 07 21:31:47 2010 +0200
@@ -117,8 +117,23 @@
     diverge = {}
 
     def related(f1, f2, limit):
+        # Walk back to common ancestor to see if the two files originate
+        # from the same file. Since workingfilectx's rev() is None it messes
+        # up the integer comparison logic, hence the pre-step check for
+        # None (f1 and f2 can only be workingfilectx's initially).
+
+        if f1 == f2:
+            return f1 # a match
+
         g1, g2 = f1.ancestors(), f2.ancestors()
         try:
+            f1r, f2r = f1.rev(), f2.rev()
+
+            if f1r is None:
+                f1 = g1.next()
+            if f2r is None:
+                f2 = g2.next()
+
             while 1:
                 f1r, f2r = f1.rev(), f2.rev()
                 if f1r > f2r:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-update-renames	Wed Apr 07 21:31:47 2010 +0200
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+# test update logic when there are renames
+
+
+# update with local changes across a file rename
+hg init a
+cd a
+echo a > a
+hg add a
+hg ci -m a
+hg mv a b
+hg ci -m rename
+echo b > b
+hg ci -m change
+hg up -q 0
+echo c > a
+hg up
+cd ..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-update-renames.out	Wed Apr 07 21:31:47 2010 +0200
@@ -0,0 +1,5 @@
+merging a and b to b
+warning: conflicts during merge.
+merging b failed!
+0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+use 'hg resolve' to retry unresolved file merges