# HG changeset patch # User Patrick Mezard # Date 1208205094 -7200 # Node ID 075b2c9aed373077e9efff29aafc53a43337de3a # Parent a7492fb2107b9c3ba8fc865af8915e9989dca4e0 convert: fix svn file copy detection code diff -r a7492fb2107b -r 075b2c9aed37 hgext/convert/subversion.py --- a/hgext/convert/subversion.py Mon Apr 14 22:31:34 2008 +0200 +++ b/hgext/convert/subversion.py Mon Apr 14 22:31:34 2008 +0200 @@ -553,20 +553,19 @@ kind = svn.ra.check_path(self.ra, entrypath, revnum) if kind == svn.core.svn_node_file: entries.append(self.recode(entry)) - - if not ent.copyfrom_path: + if not ent.copyfrom_path or not parents: continue - copyfrom_path = self.getrelpath(ent.copyfrom_path) + # Copy sources not in parent revisions cannot be represented, + # ignore their origin for now + pmodule, prevnum = self.revsplit(parents[0])[1:] + if ent.copyfrom_rev < prevnum: + continue + copyfrom_path = self.getrelpath(ent.copyfrom_path, pmodule) if not copyfrom_path: continue self.ui.debug("copied to %s from %s@%s\n" % (entrypath, copyfrom_path, ent.copyfrom_rev)) - # It's probably important for hg that the source - # exists in the revision's parent, not just the - # ent.copyfrom_rev - fromkind = svn.ra.check_path(self.ra, copyfrom_path, ent.copyfrom_rev) - if fromkind != 0: - copies[self.recode(entry)] = self.recode(copyfrom_path) + copies[self.recode(entry)] = self.recode(copyfrom_path) elif kind == 0: # gone, but had better be a deleted *file* self.ui.debug("gone from %s\n" % ent.copyfrom_rev) diff -r a7492fb2107b -r 075b2c9aed37 tests/test-convert-svn-branches.out --- a/tests/test-convert-svn-branches.out Mon Apr 14 22:31:34 2008 +0200 +++ b/tests/test-convert-svn-branches.out Mon Apr 14 22:31:34 2008 +0200 @@ -117,7 +117,7 @@ | | | | o | branch= 3 change a files: a | | | -| | o branch=old 2 branch trunk, remove c files: +| | o branch=old 2 branch trunk, remove c files: a b | |/ | o branch= 1 hello files: a b c |/ diff -r a7492fb2107b -r 075b2c9aed37 tests/test-convert-svn-move --- a/tests/test-convert-svn-move Mon Apr 14 22:31:34 2008 +0200 +++ b/tests/test-convert-svn-move Mon Apr 14 22:31:34 2008 +0200 @@ -58,6 +58,8 @@ svn rm subproject/trunk/d2 svn ci -m "changeb and rm d2" svn mv $svnurl/subproject/trunk/d1 $svnurl/subproject/branches/d1 -m moved1again +echo % copy a file from a past revision +svn copy -r 7 $svnurl/subproject/trunk/d2/d $svnurl/subproject/trunk -m copyfilefrompast echo % copy a directory from a past revision svn copy -r 7 $svnurl/subproject/trunk/d2 $svnurl/subproject/trunk -m copydirfrompast cd .. diff -r a7492fb2107b -r 075b2c9aed37 tests/test-convert-svn-move.out --- a/tests/test-convert-svn-move.out Mon Apr 14 22:31:34 2008 +0200 +++ b/tests/test-convert-svn-move.out Mon Apr 14 22:31:34 2008 +0200 @@ -60,24 +60,30 @@ Committed revision 8. Committed revision 9. +% copy a file from a past revision + +Committed revision 10. % copy a directory from a past revision -Committed revision 10. +Committed revision 11. % convert trunk and branches initializing destination A-hg repository scanning source... sorting... converting... -8 createtrunk +9 createtrunk +8 moved1 7 moved1 -6 moved1 -5 moved2 +6 moved2 +5 changeb and rm d2 4 changeb and rm d2 -3 changeb and rm d2 +3 moved1again 2 moved1again -1 moved1again +1 copyfilefrompast 0 copydirfrompast -o 8 copydirfrompast files: d2/d +o 9 copydirfrompast files: d2/d +| +o 8 copyfilefrompast files: d | o 7 moved1again files: d1/b d1/c | @@ -95,5 +101,5 @@ | o 0 createtrunk files: -default 8: +default 9: d1 6: