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
This commit is contained in:
Alexis S. L. Carvalho 2007-09-01 02:49:18 -03:00
parent 6309fee56a
commit 7dac6f1262
3 changed files with 55 additions and 4 deletions

View File

@ -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:

33
tests/test-convert-hg-source Executable file
View File

@ -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

View File

@ -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