Skip to content

Commit 7b2e02d

Browse files
author
Chai Tadmor
committed
Fix lint + url encoding for new use case of ecosystem + '/'
1 parent 60d743f commit 7b2e02d

File tree

3 files changed

+23
-13
lines changed

3 files changed

+23
-13
lines changed

osv/ecosystems/_ecosystems_test.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,23 @@ def test_root_ecosystem(self):
7171
self.assertIsNotNone(root_alpine)
7272

7373
# Alpine format: -rXXXXX
74-
self.assertLess(root_alpine.sort_key('1.0.0-r10071'),
75-
root_alpine.sort_key('1.0.0-r10072'))
76-
self.assertLess(root_alpine.sort_key('1.0.0-r10071'),
77-
root_alpine.sort_key('2.0.0-r10071'))
74+
self.assertLess(
75+
root_alpine.sort_key('1.0.0-r10071'),
76+
root_alpine.sort_key('1.0.0-r10072'))
77+
self.assertLess(
78+
root_alpine.sort_key('1.0.0-r10071'),
79+
root_alpine.sort_key('2.0.0-r10071'))
7880

7981
# Python format: +root.io.X
8082
root_pypi = ecosystems.get('Root:PyPI')
8183
self.assertIsNotNone(root_pypi)
82-
self.assertLess(root_pypi.sort_key('1.0.0+root.io.1'),
83-
root_pypi.sort_key('1.0.0+root.io.2'))
84+
self.assertLess(
85+
root_pypi.sort_key('1.0.0+root.io.1'),
86+
root_pypi.sort_key('1.0.0+root.io.2'))
8487

8588
# Other format: .root.io.X
8689
root_debian = ecosystems.get('Root:Debian:12')
8790
self.assertIsNotNone(root_debian)
88-
self.assertLess(root_debian.sort_key('1.0.0.root.io.1'),
89-
root_debian.sort_key('1.0.0.root.io.2'))
91+
self.assertLess(
92+
root_debian.sort_key('1.0.0.root.io.1'),
93+
root_debian.sort_key('1.0.0.root.io.2'))

osv/purl_helpers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,11 @@ def package_to_purl(ecosystem: str, package_name: str) -> str | None:
142142
'BellSoft Hardened Containers'):
143143
suffix = '?arch=source'
144144

145-
return f'pkg:{purl_ecosystem}/{_url_encode(package_name)}{suffix}'
145+
# Encode package name: preserve '/' only when no namespace is defined
146+
safe_chars = '' if purl_namespace else '/'
147+
encoded_name = quote(package_name, safe=safe_chars)
148+
149+
return f'pkg:{purl_ecosystem}/{encoded_name}{suffix}'
146150

147151

148152
def parse_purl(purl_str: str) -> ParsedPURL | None:

osv/purl_helpers_test.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -291,11 +291,13 @@ def test_parse_purl(self):
291291
('Rocky Linux', 'test-package', '1.2.3'),
292292
purl_helpers.parse_purl('pkg:rpm/rocky-linux/[email protected]'))
293293

294-
self.assertEqual(('Root', 'root-nginx', '1.0.0-r10071'),
295-
purl_helpers.parse_purl('pkg:generic/root/[email protected]'))
294+
self.assertEqual(
295+
('Root', 'root-nginx', '1.0.0-r10071'),
296+
purl_helpers.parse_purl('pkg:generic/root/[email protected]'))
296297

297-
self.assertEqual(('Root', '@root/lodash', '4.17.21'),
298-
purl_helpers.parse_purl('pkg:generic/root/%40root%[email protected]'))
298+
self.assertEqual(
299+
('Root', '@root/lodash', '4.17.21'),
300+
purl_helpers.parse_purl('pkg:generic/root/%40root%[email protected]'))
299301

300302
self.assertEqual(('RubyGems', 'test-package', '1.2.3'),
301303
purl_helpers.parse_purl('pkg:gem/[email protected]'))

0 commit comments

Comments
 (0)