# HG changeset patch # User Alexis S. L. Carvalho # Date 2007-09-01 05:49:18 # Node ID 11e1e574da02591083fc191ec81f342bc39e5284 # Parent 2dbd750b3ddddd43aaf253eb905d0ef3d509cb6f 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 diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py --- 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: diff --git a/tests/test-convert-hg-source b/tests/test-convert-hg-source 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 diff --git a/tests/test-convert-hg-source.out b/tests/test-convert-hg-source.out 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