Patrick Mézard committed a80b01c

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.

  • Participants
  • Parent commits 297e2b4

Comments (0)

Files changed (4)

File hgsubversion/

         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:

File hgsubversion/

                 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

File tests/

     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')

File tests/

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