changeset 888:c6388ed0ec0a

svnmeta: only remove directory components in normalize() Previously, a file beginning with the repository subdirectory would be stripped, resulting in a leftover file name with a wrong name. A subsequent pull of a revision modifying the file would add it under its correct name, but leave the leftover file.
author Dan Villiom Podlaski Christiansen <dan@cabo.dk>
date Wed, 14 Dec 2011 00:07:57 +0100
parents f95c429124f3
children 7a98fbadcae9
files hgsubversion/svnmeta.py tests/comprehensive/test_verify_and_startrev.py tests/fixtures/subdir_is_file_prefix.svndump tests/test_single_dir_clone.py tests/test_util.py
diffstat 5 files changed, 98 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/hgsubversion/svnmeta.py
+++ b/hgsubversion/svnmeta.py
@@ -292,7 +292,9 @@ class SVNMeta(object):
             return ''
         if path and path[0] == '/':
             path = path[1:]
-        if path and path.startswith(self.subdir):
+        if path == self.subdir:
+            return ''
+        if path and path.startswith(self.subdir + '/'):
             path = path[len(self.subdir):]
         if path and path[0] == '/':
             path = path[1:]
--- a/tests/comprehensive/test_verify_and_startrev.py
+++ b/tests/comprehensive/test_verify_and_startrev.py
@@ -23,6 +23,14 @@ from hgsubversion import svncommands
     'emptyrepo.svndump',
 ])
 
+_skipall = set([
+    'project_root_not_repo_root.svndump',
+])
+
+_skipstandard = set([
+    'subdir_is_file_prefix.svndump',
+])
+
 def _do_case(self, name, stupid, layout):
     subdir = test_util.subdir.get(name, '')
     repo, svnpath = self.load_and_fetch(name, subdir=subdir, stupid=stupid,
@@ -65,13 +73,13 @@ def buildmethod(case, name, stupid, layo
 attrs = {'_do_case': _do_case}
 fixtures = [f for f in os.listdir(test_util.FIXTURES) if f.endswith('.svndump')]
 for case in fixtures:
-    # this fixture results in an empty repository, don't use it
-    if case == 'project_root_not_repo_root.svndump':
+    if case in _skipall:
         continue
     bname = 'test_' + case[:-len('.svndump')]
-    attrs[bname] = buildmethod(case, bname, False, 'standard')
-    name = bname + '_stupid'
-    attrs[name] = buildmethod(case, name, True, 'standard')
+    if case not in _skipstandard:
+        attrs[bname] = buildmethod(case, bname, False, 'standard')
+        name = bname + '_stupid'
+        attrs[name] = buildmethod(case, name, True, 'standard')
     name = bname + '_single'
     attrs[name] = buildmethod(case, name, False, 'single')
     # Disabled because the "stupid and real are the same" tests
new file mode 100644
--- /dev/null
+++ b/tests/fixtures/subdir_is_file_prefix.svndump
@@ -0,0 +1,72 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 924a052a-5e5a-4a8e-a677-da5565bec340
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2011-03-04T12:33:29.342045Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 123
+Content-length: 123
+
+K 7
+svn:log
+V 22
+Create directory flaf.
+K 10
+svn:author
+V 6
+danchr
+K 8
+svn:date
+V 27
+2011-03-04T12:34:00.349950Z
+PROPS-END
+
+Node-path: flaf
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 138
+Content-length: 138
+
+K 7
+svn:log
+V 37
+Create the file flaf.txt within flaf.
+K 10
+svn:author
+V 6
+danchr
+K 8
+svn:date
+V 27
+2011-03-04T12:45:01.701033Z
+PROPS-END
+
+Node-path: flaf/flaf.txt
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 15
+Text-content-md5: 8c0059c8f7998e8003836b8e8fcb74d7
+Text-content-sha1: b7d680bc5411f46395c4ef267001e1a307d7b0d5
+Content-length: 25
+
+PROPS-END
+Goodbye world.
+
+
--- a/tests/test_single_dir_clone.py
+++ b/tests/test_single_dir_clone.py
@@ -44,6 +44,15 @@ class TestSingleDir(test_util.TestBase):
         self.assertEqual(repo.branchtags().keys(), ['default', ])
         self.assertEqual(repo['default'].manifest().keys(), oldmanifest)
 
+    def test_clone_subdir_is_file_prefix(self, stupid=False):
+        FIXTURE = 'subdir_is_file_prefix.svndump'
+        repo = self._load_fixture_and_fetch(FIXTURE,
+                                            stupid=stupid,
+                                            layout='single',
+                                            subdir=test_util.subdir[FIXTURE])
+        self.assertEqual(repo.branchtags().keys(), ['default'])
+        self.assertEqual(repo['tip'].manifest().keys(), ['flaf.txt'])
+
     def test_externals_single(self):
         repo = self._load_fixture_and_fetch('externals.svndump',
                                             stupid=False,
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -96,6 +96,7 @@ subdir = {'truncatedhistory.svndump': '/
           'project_name_with_space.svndump': '/project name',
           'non_ascii_path_1.svndump': '/b\xC3\xB8b',
           'non_ascii_path_2.svndump': '/b%C3%B8b',
+          'subdir_is_file_prefix.svndump': '/flaf',
           }
 
 FIXTURES = os.path.join(os.path.abspath(os.path.dirname(__file__)),