diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -708,7 +708,7 @@ class localrepository(repo.repository): # \- 2 --- 4 as the merge base # - cr = manifest1.get(cf, nullid) + cr = manifest1.get(cf) nfp = fp2 if manifest2: # branch merge @@ -717,6 +717,24 @@ class localrepository(repo.repository): cr = manifest2[cf] nfp = fp1 + # find source in nearest ancestor if we've lost track + if not cr: + self.ui.debug(_(" %s: searching for copy revision for %s\n") % + (fn, cf)) + p1 = self.dirstate.parents()[0] + rev = self.changelog.rev(p1) + seen = {-1:None} + visit = [rev] + while visit: + for p in self.changelog.parentrevs(visit.pop(0)): + if p not in seen: + seen[p] = True + visit.append(p) + ctx = self.changectx(p) + if cf in ctx: + cr = ctx[cf].filenode() + break + self.ui.debug(_(" %s: copy %s:%s\n") % (fn, cf, hex(cr))) meta["copy"] = cf meta["copyrev"] = hex(cr) diff --git a/tests/test-issue1175 b/tests/test-issue1175 new file mode 100755 --- /dev/null +++ b/tests/test-issue1175 @@ -0,0 +1,20 @@ +#!/bin/sh +rm -rf a +hg init a +cd a +touch a +hg ci -Am0 +hg mv a a1 +hg ci -m1 +hg co 0 +hg mv a a2 +hg up +hg ci -m2 + +touch a +hg ci -Am3 +hg mv a b +hg ci -Am4 a +hg ci --debug --traceback -Am5 b +hg verify +hg export --git tip diff --git a/tests/test-issue1175.out b/tests/test-issue1175.out new file mode 100644 --- /dev/null +++ b/tests/test-issue1175.out @@ -0,0 +1,24 @@ +adding a +1 files updated, 0 files merged, 1 files removed, 0 files unresolved +warning: detected divergent renames of a to: + a2 + a1 +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +adding a +b + b: searching for copy revision for a + b: copy a:b80de5d138758541c5f05265ad144ab9fa86d1db +checking changesets +checking manifests +crosschecking files in changesets and manifests +checking files +4 files, 6 changesets, 4 total revisions +# HG changeset patch +# User test +# Date 0 0 +# Node ID 755e75751bf67eb4378bca61987df035d90a7a06 +# Parent 7399822c2e395fe7d57c2fcf4b310f6fb22f8c2d +5 + +diff --git a/b b/b +new file mode 100644