# HG changeset patch # User Dan Villiom Podlaski Christiansen # Date 1323817677 -3600 # Node ID c6388ed0ec0a59e70189f95869c8f2087fcbb8a6 # Parent f95c429124f3f0952a06e34c7773b09c9f7a9a81 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. diff --git a/hgsubversion/svnmeta.py b/hgsubversion/svnmeta.py --- 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:] diff --git a/tests/comprehensive/test_verify_and_startrev.py b/tests/comprehensive/test_verify_and_startrev.py --- 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 diff --git a/tests/fixtures/subdir_is_file_prefix.svndump b/tests/fixtures/subdir_is_file_prefix.svndump 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. + + diff --git a/tests/test_single_dir_clone.py b/tests/test_single_dir_clone.py --- 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, diff --git a/tests/test_util.py b/tests/test_util.py --- 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__)),