# HG changeset patch # User Patrick Mezard # Date 1262350710 -3600 # Node ID 83cfa1baf8ad6d3f28eff03dec4c2ab282d87b65 # Parent c5c969e9eefbe1ab15ae7bcd48c348af71ecb72a copies: don't report copies with unrelated branch diff -r c5c969e9eefb -r 83cfa1baf8ad mercurial/copies.py --- 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() diff -r c5c969e9eefb -r 83cfa1baf8ad tests/test-mv-cp-st-diff --- 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 .. diff -r c5c969e9eefb -r 83cfa1baf8ad tests/test-mv-cp-st-diff.out --- 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