Mercurial > hgsubversion
changeset 950:a80b01ceb1fc
editor: relax copyfrom dir checks to avoid extra missing entries
When renaming a branch you get something like:
D /branch/bar
A /branch/foo (from /branch/foo:42)
Unfortunately, the branch layout for the revision being converted is
computed before starting to convert it. It means the copyfrom path
supplied in the add_directory() for /branch/foo will be be considered
invalid, be added to missing and fetched the slow way despite being in
the repository history. Avoid that by checking the path looks like a
branch path and matching it with the filemap. It will be resolved
afterwards anyway.
author | Patrick Mezard <patrick@mezard.eu> |
---|---|
date | Sat, 06 Oct 2012 10:10:35 +0200 (2012-10-06) |
parents | 297e2b4a6e2c |
children | bd9c292665fd |
files | hgsubversion/editor.py hgsubversion/svnmeta.py tests/test_fetch_branches.py tests/test_fetch_command.py |
diffstat | 4 files changed, 14 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/hgsubversion/editor.py +++ b/hgsubversion/editor.py @@ -406,7 +406,11 @@ class HgEditor(svnwrap.Editor): tag = self.meta.get_path_tag(copyfrom_path) if tag not in self.meta.tags: tag = None - if not self.meta.is_path_valid(copyfrom_path): + if not self.meta.is_path_valid(copyfrom_path, existing=False): + # The source path only exists at copyfrom_revision, use + # existing=False to guess a possible branch location and + # test it against the filemap. The actual path and + # revision will be resolved below if necessary. self.current.addmissing('%s/' % path) return path if tag:
--- a/hgsubversion/svnmeta.py +++ b/hgsubversion/svnmeta.py @@ -393,10 +393,10 @@ class SVNMeta(object): return {ln: (src_branch, src_rev, revnum)} return {} - def is_path_valid(self, path): + def is_path_valid(self, path, existing=True): if path is None: return False - subpath = self.split_branch_path(path)[0] + subpath = self.split_branch_path(path, existing)[0] if subpath is None: return False return subpath in self.filemap
--- a/tests/test_fetch_branches.py +++ b/tests/test_fetch_branches.py @@ -58,8 +58,9 @@ class TestFetchBranches(test_util.TestBa self.test_unorderedbranch(True) def test_renamed_branch_to_trunk(self, stupid=False): + config = {'hgsubversion.failonmissing': 'true'} repo = self._load_fixture_and_fetch('branch_rename_to_trunk.svndump', - stupid=stupid) + stupid=stupid, config=config) self.assertEqual(repo['default'].parents()[0].branch(), 'dev_branch') self.assert_('iota' in repo['default']) self.assertEqual(repo['old_trunk'].parents()[0].branch(), 'default')
--- a/tests/test_fetch_command.py +++ b/tests/test_fetch_command.py @@ -95,13 +95,16 @@ class TestBasicRepoLayout(test_util.Test assert 'README' not in repo assert '../branches' not in repo - def test_files_copied_from_outside_btt(self): + def test_files_copied_from_outside_btt(self, stupid=False): repo = self._load_fixture_and_fetch( - 'test_files_copied_from_outside_btt.svndump') + 'test_files_copied_from_outside_btt.svndump', stupid=stupid) self.assertEqual(node.hex(repo['tip'].node()), '3c78170e30ddd35f2c32faa0d8646ab75bba4f73') self.assertEqual(len(repo.changelog), 2) + def test_files_copied_from_outside_btt_stupid(self): + self.test_files_copied_from_outside_btt(stupid=True) + def test_file_renamed_in_from_outside_btt(self): repo = self._load_fixture_and_fetch( 'file_renamed_in_from_outside_btt.svndump')