diff --git a/fdroidserver/common.py b/fdroidserver/common.py index b49dea34..13aaebb0 100644 --- a/fdroidserver/common.py +++ b/fdroidserver/common.py @@ -2059,15 +2059,15 @@ def parse_srclib_spec(spec): "(not a string): '{}'") .format(spec)) - tokens = spec.split('@') - if len(tokens) > 2: - raise MetaDataException(_("could not parse srclib spec " - "(too many '@' signs): '{}'") - .format(spec)) - elif len(tokens) < 2: - raise MetaDataException(_("could not parse srclib spec " - "(no ref specified): '{}'") - .format(spec)) + tokens = spec.split('@', 1) + if not tokens[0]: + raise MetaDataException( + _("could not parse srclib spec (no name specified): '{}'").format(spec) + ) + if len(tokens) < 2 or not tokens[1]: + raise MetaDataException( + _("could not parse srclib spec (no ref specified): '{}'").format(spec) + ) name = tokens[0] ref = tokens[1] @@ -2103,11 +2103,7 @@ def getsrclib(spec, srclib_dir, basepath=False, name = spec ref = None else: - name, ref = spec.split('@', 1) - if ':' in name: - number, name = name.split(':', 1) - if '/' in name: - name, subdir = name.split('/', 1) + name, ref, number, subdir = parse_srclib_spec(spec) if name not in fdroidserver.metadata.srclibs: raise VCSException('srclib ' + name + ' not found.') diff --git a/tests/common.TestCase b/tests/common.TestCase index 266406bc..8a7ec438 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -1514,13 +1514,27 @@ class CommonTest(unittest.TestCase): self.assertEqual(fdroidserver.common.parse_srclib_spec('1:Support/v7/appcompat@android-4.4_r1.1'), ('Support', 'android-4.4_r1.1', '1', 'v7/appcompat')) - def test_parse_srclib_spec_bad(self): + def test_parse_srclib_spec_many_ats(self): + self.assertEqual( + fdroidserver.common.parse_srclib_spec('foo@@v2'), ('foo', '@v2', None, None) + ) + self.assertEqual( + fdroidserver.common.parse_srclib_spec('bar@2@f'), ('bar', '2@f', None, None) + ) + + def test_parse_srclib_spec_none(self): with self.assertRaises(MetaDataException): - self.assertEqual(fdroidserver.common.parse_srclib_spec(None)) + fdroidserver.common.parse_srclib_spec(None) + + def test_parse_srclib_spec_no_ref(self): with self.assertRaises(MetaDataException): - self.assertEqual(fdroidserver.common.parse_srclib_spec('no-ref')) + fdroidserver.common.parse_srclib_spec('no-ref') with self.assertRaises(MetaDataException): - self.assertEqual(fdroidserver.common.parse_srclib_spec('@multi@at-signs@')) + fdroidserver.common.parse_srclib_spec('noref@') + + def test_parse_srclib_spec_no_name(self): + with self.assertRaises(MetaDataException): + fdroidserver.common.parse_srclib_spec('@ref') def test_remove_signing_keys(self): shutil.copytree(