copies: don't report copies with unrelated branch stable
authorPatrick Mezard <pmezard@gmail.com>
Fri, 01 Jan 2010 13:58:30 +0100
branchstable
changeset 10179 83cfa1baf8ad
parent 10172 c5c969e9eefb
child 10180 a9f60014a20f
child 10184 8a47347d298b
copies: don't report copies with unrelated branch
mercurial/copies.py
tests/test-mv-cp-st-diff
tests/test-mv-cp-st-diff.out
--- a/mercurial/copies.py	Wed Dec 30 20:39:59 2009 -0200
+++ b/mercurial/copies.py	Fri Jan 01 13:58:30 2010 +0100
@@ -50,7 +50,9 @@
     return [o[1] for o in sorted(old.values())]
 
 def _findlimit(repo, a, b):
-    "find the earliest revision that's an ancestor of a or b but not both"
+    """Find the earliest revision that's an ancestor of a or b but not both,
+    None if no such revision exists.
+    """
     # basic idea:
     # - mark a and b with different sides
     # - if a parent's children are all on the same side, the parent is
@@ -73,6 +75,7 @@
     visit = [-a, -b]
     heapq.heapify(visit)
     interesting = len(visit)
+    hascommonancestor = False
     limit = working
 
     while interesting:
@@ -82,6 +85,8 @@
         else:
             parents = cl.parentrevs(r)
         for p in parents:
+            if p < 0:
+                continue
             if p not in side:
                 # first time we see p; add it to visit
                 side[p] = side[r]
@@ -92,9 +97,13 @@
                 # p was interesting but now we know better
                 side[p] = 0
                 interesting -= 1
+                hascommonancestor = True
         if side[r]:
             limit = r # lowest rev visited
             interesting -= 1
+
+    if not hascommonancestor:
+        return None
     return limit
 
 def copies(repo, c1, c2, ca, checkdirs=False):
@@ -110,6 +119,9 @@
         return repo.dirstate.copies(), {}
 
     limit = _findlimit(repo, c1.rev(), c2.rev())
+    if limit is None:
+        # no common ancestor, no copies
+        return {}, {}
     m1 = c1.manifest()
     m2 = c2.manifest()
     ma = ca.manifest()
--- a/tests/test-mv-cp-st-diff	Wed Dec 30 20:39:59 2009 -0200
+++ b/tests/test-mv-cp-st-diff	Fri Jan 01 13:58:30 2010 +0100
@@ -78,3 +78,18 @@
 tb "add a a1" "hg mv a b" "hg mv b a" "circular rename"
 
 tb "hg mv x y" "add y/x x1" "add y/x x2" "directory move"
+
+# Cannot implement unrelated branch with tb
+echo '% testing copies with unrelated branch'
+hg init unrelated
+cd unrelated
+add a a
+hg ci -Am adda
+hg mv a b
+hg ci -m movea
+hg up -C null
+add a a
+hg ci -Am addunrelateda
+echo '% unrelated branch diff'
+hg diff --git -r 2 -r 1
+cd ..
--- a/tests/test-mv-cp-st-diff.out	Wed Dec 30 20:39:59 2009 -0200
+++ b/tests/test-mv-cp-st-diff.out	Fri Jan 01 13:58:30 2010 +0100
@@ -1234,3 +1234,21 @@
 +y1
 
 
+% testing copies with unrelated branch
+adding a
+0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+adding a
+created new head
+% unrelated branch diff
+diff --git a/a b/a
+deleted file mode 100644
+--- a/a
++++ /dev/null
+@@ -1,1 +0,0 @@
+-a
+diff --git a/b b/b
+new file mode 100644
+--- /dev/null
++++ b/b
+@@ -0,0 +1,1 @@
++a