add a fix for issue 1175
authorMatt Mackall <mpm@selenic.com>
Sun, 10 Aug 2008 18:01:03 -0500
changeset 6875 0d714a48ab53
parent 6874 8dc21876261e
child 6876 077f1e637cd8
child 6877 1d38f3605b20
add a fix for issue 1175 If we copy a file followed by an update, it's possible for the parent manifest to no longer contain the source file of the copy, which could cause commit to fail. If this happens, we search backwares from the first parent to find the most likely original revision.
mercurial/localrepo.py
tests/test-issue1175
tests/test-issue1175.out
--- a/mercurial/localrepo.py	Sun Aug 10 18:01:03 2008 -0500
+++ b/mercurial/localrepo.py	Sun Aug 10 18:01:03 2008 -0500
@@ -708,7 +708,7 @@
             #    \- 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 @@
                         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)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue1175	Sun Aug 10 18:01:03 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:01:03 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