changeset 5280:11e1e574da02

convert: mercurial_source: also search for copies in modified files There are some corner cases where we may have a copy in a file that isn't in the added list: - the result of a hg copy --after --force - after a merge across a (local) rename
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sat, 01 Sep 2007 02:49:18 -0300
parents 2dbd750b3ddd
children a176f9c8b26e
files hgext/convert/hg.py tests/test-convert-hg-source tests/test-convert-hg-source.out
diffstat 3 files changed, 55 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/convert/hg.py
+++ b/hgext/convert/hg.py
@@ -187,12 +187,11 @@ class mercurial_source(converter_source)
         m, a, r = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3]
         changes = [(name, rev) for name in m + a + r]
         changes.sort()
-        return (changes, self.getcopies(ctx))
+        return (changes, self.getcopies(ctx, m + a))
 
-    def getcopies(self, ctx):
-        added = self.repo.status(ctx.parents()[0].node(), ctx.node())[1]
+    def getcopies(self, ctx, files):
         copies = {}
-        for name in added:
+        for name in files:
             try:
                 copies[name] = ctx.filectx(name).renamed()[0]
             except TypeError:
new file mode 100755
--- /dev/null
+++ b/tests/test-convert-hg-source
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+echo "[extensions]" >> $HGRCPATH
+echo "hgext.convert=" >> $HGRCPATH
+
+hg init orig
+cd orig
+
+echo foo > foo
+echo bar > bar
+hg ci -qAm 'add foo bar' -d '0 0'
+
+echo >> foo
+hg ci -m 'change foo'
+
+hg up -qC 0
+hg copy --after --force foo bar
+hg copy foo baz
+hg ci -m 'make bar and baz copies of foo' -d '1 0'
+
+hg merge
+hg ci -m 'merge local copy' -d '2 0'
+
+hg up -C 1
+hg merge 2
+hg ci -m 'merge remote copy' -d '3 0'
+
+cd ..
+hg convert --datesort orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
+cd new
+hg out ../orig
+
+true
new file mode 100644
--- /dev/null
+++ b/tests/test-convert-hg-source.out
@@ -0,0 +1,19 @@
+merging baz and foo
+1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+merging foo and baz
+1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+initializing destination new repository
+scanning source...
+sorting...
+converting...
+4 add foo bar
+3 change foo
+2 make bar and baz copies of foo
+1 merge local copy
+0 merge remote copy
+comparing with ../orig
+searching for changes
+no changes found