--- a/mercurial/context.py Sat Jul 19 18:19:50 2008 +0200
+++ b/mercurial/context.py Sun Aug 10 18:38:43 2008 -0500
@@ -100,6 +100,14 @@
c = self._repo.changelog.children(self._node)
return [changectx(self._repo, x) for x in c]
+ def ancestors(self):
+ for a in self._repo.changelog.ancestors(self._rev):
+ yield changectx(self._repo, a)
+
+ def descendants(self):
+ for d in self._repo.changelog.descendants(self._rev):
+ yield changectx(self._repo, d)
+
def _fileinfo(self, path):
if '_manifest' in self.__dict__:
try:
--- a/mercurial/localrepo.py Sat Jul 19 18:19:50 2008 +0200
+++ b/mercurial/localrepo.py Sun Aug 10 18:38:43 2008 -0500
@@ -672,7 +672,6 @@
meta = {}
cp = fctx.renamed()
if cp and cp[0] != fn:
- cp = cp[0]
# Mark the new revision of this file as a copy of another
# file. This copy data will effectively act as a parent
# of this new revision. If this is a merge, the first
@@ -691,22 +690,30 @@
# \ / merging rev3 and rev4 should use bar@rev2
# \- 2 --- 4 as the merge base
#
- meta["copy"] = cp
- if not manifest2: # not a branch merge
- meta["copyrev"] = hex(manifest1[cp])
- fp2 = nullid
- elif fp2 != nullid: # copied on remote side
- meta["copyrev"] = hex(manifest1[cp])
- elif fp1 != nullid: # copied on local side, reversed
- meta["copyrev"] = hex(manifest2[cp])
- fp2 = fp1
- elif cp in manifest2: # directory rename on local side
- meta["copyrev"] = hex(manifest2[cp])
- else: # directory rename on remote side
- meta["copyrev"] = hex(manifest1[cp])
- self.ui.debug(_(" %s: copy %s:%s\n") %
- (fn, cp, meta["copyrev"]))
- fp1 = nullid
+
+ cf = cp[0]
+ cr = manifest1.get(cf)
+ nfp = fp2
+
+ if manifest2: # branch merge
+ if fp2 == nullid: # copied on remote side
+ if fp1 != nullid or cf in manifest2:
+ 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))
+ for a in self['.'].ancestors():
+ if cf in a:
+ cr = a[cf].filenode()
+ break
+
+ self.ui.debug(_(" %s: copy %s:%s\n") % (fn, cf, hex(cr)))
+ meta["copy"] = cf
+ meta["copyrev"] = hex(cr)
+ fp1, fp2 = nullid, nfp
elif fp2 != nullid:
# is one parent an ancestor of the other?
fpa = fl.ancestor(fp1, fp2)
--- a/tests/test-convert-mtn Sat Jul 19 18:19:50 2008 +0200
+++ b/tests/test-convert-mtn Sun Aug 10 18:38:43 2008 -0500
@@ -63,7 +63,7 @@
mkdir dir2/dir/subdir
echo f > dir2/dir/subdir/f
mkdir dir2/dir/emptydir
-mtn add -R dir2/dir
+mtn add --quiet -R dir2/dir
mtn ci -m emptydir
mtn drop -R dir2/dir
mtn ci -m dropdirectory
--- a/tests/test-convert-mtn.out Sat Jul 19 18:19:50 2008 +0200
+++ b/tests/test-convert-mtn.out Sun Aug 10 18:38:43 2008 -0500
@@ -29,10 +29,6 @@
mtn: renaming dir to dir2 in workspace manifest
mtn: beginning commit on branch 'com.selenic.test'
mtn: committed revision 5de5abe7c15eae70cf3acdda23c9c319ea50c1af
-mtn: adding dir2/dir to workspace manifest
-mtn: adding dir2/dir/emptydir to workspace manifest
-mtn: adding dir2/dir/subdir to workspace manifest
-mtn: adding dir2/dir/subdir/f to workspace manifest
mtn: beginning commit on branch 'com.selenic.test'
mtn: committed revision 27a423be1e406595cc57f50f42a8790fa0a93d8e
mtn: dropping dir2/dir/subdir/f from workspace manifest
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue1175 Sun Aug 10 18:38:43 2008 -0500
@@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue1175.out Sun Aug 10 18:38:43 2008 -0500
@@ -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