Skip to content

Commit b622e33

Browse files
authored
Merge pull request #69 from JonoYang/68-url2purl-default-purl-generation
Create PURLs for URLs that don't have a router #68
2 parents 31f372d + 53be89f commit b622e33

File tree

6 files changed

+107
-63
lines changed

6 files changed

+107
-63
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ pyvenv.cfg
1414
.Python
1515
/.tox/
1616
/.pytest_cache/
17+
venv

CHANGELOG.rst

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Changelog
22
=========
33

4+
0.9.7 (2022-02-04)
5+
------------------
6+
7+
- Create a generic PackageURL for URLs that do not fit existing routes in url2purl #68
8+
49
0.9.6 (2021-10-05)
510
------------------
611

@@ -31,7 +36,7 @@ Changelog
3136
- Document usage in README
3237
- Adopt SPDX license identifier
3338
- Add support for GitHub "raw" URLs in url2purl #43
34-
- Improve GitHub support for "v" prefixed version in url2purl #43
39+
- Improve GitHub support for "v" prefixed version in url2purl #43
3540

3641

3742
0.9.1 (2020-08-05)

src/packageurl/contrib/url2purl.py

+75-27
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ def url2purl(url):
5353
try:
5454
return purl_router.process(url)
5555
except NoRouteAvailable:
56-
return
56+
# If `url` does not fit in one of the existing routes,
57+
# we attempt to create a generic PackageURL for `url`
58+
return build_generic_purl(url)
5759

5860

5961
get_purl = url2purl
@@ -83,21 +85,37 @@ def endpoint(url):
8385

8486
def get_path_segments(url):
8587
"""
86-
Return a list of path segments from a `url` string. This list may be empty.
88+
Return a list of path segments from a `url` string.
8789
"""
8890
path = unquote_plus(urlparse(url).path)
8991
segments = [seg for seg in path.split("/") if seg]
92+
return segments
9093

91-
if len(segments) <= 1:
92-
segments = []
9394

94-
return segments
95+
def build_generic_purl(uri):
96+
"""
97+
Return a PackageURL from `uri`, if `uri` is a parsable URL, or None
98+
99+
`uri` is assumed to be a download URL, e.g. http://example.com/example.tar.gz
100+
"""
101+
parsed_uri = urlparse(uri)
102+
if parsed_uri.scheme and parsed_uri.netloc and parsed_uri.path:
103+
# Get file name from `uri`
104+
uri_path_segments = get_path_segments(uri)
105+
file_name = uri_path_segments[-1]
106+
return PackageURL(
107+
type='generic',
108+
name=file_name,
109+
qualifiers={
110+
'download_url': uri
111+
}
112+
)
95113

96114

97115
@purl_router.route('https?://registry.npmjs.*/.*',
98116
'https?://registry.yarnpkg.com/.*',
99-
'https?://(www\\.)?npmjs.*/package/.*',
100-
'https?://(www\\.)?yarnpkg.com/package/.*')
117+
'https?://(www\\.)?npmjs.*/package.*',
118+
'https?://(www\\.)?yarnpkg.com/package.*')
101119
def build_npm_purl(uri):
102120
# npm URLs are difficult to disambiguate with regex
103121
if '/package/' in uri:
@@ -226,14 +244,21 @@ def build_maven_purl(uri):
226244
return PackageURL('maven', namespace, name, version, qualifiers)
227245

228246

229-
# https://rubygems.org/downloads/jwt-0.1.8.gem
230-
rubygems_pattern = (
231-
r"^https?://rubygems.org/downloads/"
232-
r"(?P<name>.+)-(?P<version>.+)"
233-
r"(\.gem)$"
234-
)
247+
@purl_router.route('https?://rubygems.org/downloads/.*')
248+
def build_rubygems_purl(uri):
249+
# We use a more general route pattern instead of using `rubygems_pattern`
250+
# below by itself because we want to capture all rubygems download URLs,
251+
# even the ones that are not completly formed. This helps prevent url2purl
252+
# from attempting to create a generic PackageURL from an invalid rubygems
253+
# download URL.
235254

236-
register_pattern('rubygems', rubygems_pattern)
255+
# https://rubygems.org/downloads/jwt-0.1.8.gem
256+
rubygems_pattern = (
257+
r"^https?://rubygems.org/downloads/"
258+
r"(?P<name>.+)-(?P<version>.+)"
259+
r"(\.gem)$"
260+
)
261+
return purl_from_pattern('rubygems', rubygems_pattern, uri)
237262

238263

239264
# https://pypi.python.org/packages/source/a/anyjson/anyjson-0.3.3.tar.gz
@@ -295,17 +320,40 @@ def build_pypi_purl(uri):
295320
register_pattern('nuget', nuget_api_pattern)
296321

297322

298-
# http://master.dl.sourceforge.net/project/libpng/zlib/1.2.3/zlib-1.2.3.tar.bz2
299-
sourceforge_pattern = (
300-
r"^https?://.*sourceforge.net/project/"
301-
r"(?P<namespace>([^/]+))/" # do not allow more "/" segments
302-
r"(?P<name>.+)/"
303-
r"(?P<version>[0-9\.]+)/" # version restricted to digits and dots
304-
r"(?P=name)-(?P=version).*" # {name}-{version} repeated in the filename
305-
r"[^/]$" # not ending with "/"
306-
)
323+
@purl_router.route('https?://.*sourceforge.net/project/.*')
324+
def build_sourceforge_purl(uri):
325+
# We use a more general route pattern instead of using `sourceforge_pattern`
326+
# below by itself because we want to capture all sourceforge download URLs,
327+
# even the ones that do not fit `sourceforge_pattern`. This helps prevent
328+
# url2purl from attempting to create a generic PackageURL from a sourceforge
329+
# URL that we can't handle.
330+
331+
# http://master.dl.sourceforge.net/project/libpng/zlib/1.2.3/zlib-1.2.3.tar.bz2
332+
sourceforge_pattern = (
333+
r"^https?://.*sourceforge.net/project/"
334+
r"(?P<namespace>([^/]+))/" # do not allow more "/" segments
335+
r"(?P<name>.+)/"
336+
r"(?P<version>[0-9\.]+)/" # version restricted to digits and dots
337+
r"(?P=name)-(?P=version).*" # {name}-{version} repeated in the filename
338+
r"[^/]$" # not ending with "/"
339+
)
340+
341+
sourceforge_purl = purl_from_pattern('sourceforge', sourceforge_pattern, uri)
342+
343+
if not sourceforge_purl:
344+
# We create a more generic PackageURL from `uri` if `uri` doesn't fit
345+
# `sourceforge_pattern`
346+
uri_path_segments = get_path_segments(uri)
347+
file_name = uri_path_segments[-1]
348+
sourceforge_purl = PackageURL(
349+
type='sourceforge',
350+
name=file_name,
351+
qualifiers={
352+
'download_url': uri
353+
}
354+
)
307355

308-
register_pattern('sourceforge', sourceforge_pattern)
356+
return sourceforge_purl
309357

310358

311359
# https://crates.io/api/v1/crates/rand/0.7.2/download
@@ -435,7 +483,7 @@ def build_github_purl(url):
435483
)
436484

437485
segments = get_path_segments(url)
438-
if not segments:
486+
if not len(segments) >= 2:
439487
return
440488

441489
namespace = segments[0]
@@ -474,7 +522,7 @@ def build_bitbucket_purl(url):
474522

475523
segments = get_path_segments(url)
476524

477-
if not segments:
525+
if not len(segments) >= 2:
478526
return
479527
namespace = segments[0]
480528
name = segments[1]
@@ -529,7 +577,7 @@ def build_gitlab_purl(url):
529577
"""
530578
segments = get_path_segments(url)
531579

532-
if not segments:
580+
if not len(segments) >= 2:
533581
return
534582
namespace = segments[0]
535583
name = segments[1]

tests/contrib/data/url2purl.json

+22-31
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
"http://central.maven.org/maven2/org/apache/axis2/mex/1.6.2/mex-1.6.2.mar": "pkg:maven/org.apache.axis2/[email protected]?type=mar",
5757
"http://central.maven.org/maven2/servicemix/servicemix/1.0/servicemix-1.0-src.zip": "pkg:maven/servicemix/[email protected]?classifier=src&type=zip",
5858
"http://central.maven.org/maven2/org/apache/yoko/yoko/1.0/yoko-1.0.pom": "pkg:maven/org.apache.yoko/[email protected]?type=pom",
59-
6059
"https://registry.yarnpkg.com/@invisionag/": null,
6160
"https://registry.yarnpkg.com/@invisionag": null,
6261
"https://registry.yarnpkg.com/@invisionag/eslint-config-ivx": "pkg:npm/%40invisionag/eslint-config-ivx",
@@ -106,9 +105,8 @@
106105
"https://www.npmjs.org/package/@angular/cli": "pkg:npm/%40angular/cli",
107106
"https://www.npmjs.org/package": null,
108107
"https://www.npmjs.org/package/": null,
109-
110-
"http://rubygems.org/downloads/": null,
111-
"http://rubygems.org/downloads/macaddr-1.6.1": null,
108+
"http://rubygems.org/downloads/": null,
109+
"http://rubygems.org/downloads/macaddr-1.6.1": null,
112110
"http://rubygems.org/downloads/macaddr-1.6.1.gem": "pkg:rubygems/[email protected]",
113111
"http://rubygems.org/downloads/open4-1.3.0.gem": "pkg:rubygems/[email protected]",
114112
"https://rubygems.org/downloads/actionmailer-4.0.3.gem": "pkg:rubygems/[email protected]",
@@ -121,7 +119,6 @@
121119
"https://rubygems.org/downloads/talentbox-delayed_job_sequel-4.0.0.gem": "pkg:rubygems/[email protected]",
122120
"https://rubygems.org/downloads/unf-0.1.3.gem": "pkg:rubygems/[email protected]",
123121
"https://rubygems.org/downloads/yajl-ruby-1.2.0.gem": "pkg:rubygems/[email protected]",
124-
125122
"https://pypi.python.org/packages/source/z/zc.recipe.egg/zc.recipe.egg-2.0.0.tar.gz": "pkg:pypi/[email protected]",
126123
"https://pypi.python.org/packages/source/p/python-openid/python-openid-2.2.5.zip": "pkg:pypi/[email protected]",
127124
"https://pypi.python.org/packages/38/e2/b23434f4030bbb1af3bcdbb2ecff6b11cf2e467622446ce66a08e99f2ea9/pluggy-0.4.0.zip#md5=447a92368175965d2fbacaef9f3df842": "pkg:pypi/[email protected]",
@@ -134,39 +131,35 @@
134131
"https://pypi.python.org/packages/f6/ae/bbc6a204f33d9d57c798fb3857a072cd14b836792244eea4b446fdb674c6/pycryptodome-3.4.7-cp27-cp27m-win32.whl#md5=78b341de1cd686077745cd9e3a93d8d3": "pkg:pypi/[email protected]",
135132
"https://pypi.python.org/packages/bd/e8/ea44ba5357a0b4fd16e5fb60c355fc8722eae31b93d7597eec50f7c35a52/pycryptodome-3.4.7-cp27-cp27m-win_amd64.whl#md5=f20bb847322baf7ae24700e5cbb15e07": "pkg:pypi/[email protected]",
136133
"https://pypi.python.org/packages/1e/75/8005d086cac4cc41d3b320d338972c5e5c6a21f88472f21ac9d0e031d300/pyahocorasick-1.1.4.tar.bz2#md5=ad445b6648dc06e9040705ce1ccb4384": "pkg:pypi/[email protected]",
137-
138134
"http://nuget.org/packages/EntityFramework/4.2.0.0": "pkg:nuget/[email protected]",
139135
"http://www.nuget.org/packages/SharpGIS.GZipWebClient/1.2.0": "pkg:nuget/[email protected]",
140136
"https://www.nuget.org/api/v2/package/Newtonsoft.Json/11.0.1": "pkg:nuget/[email protected]",
141137
"http://www.nuget.org/api/v2/package/EntityFramework/6.1.0": "pkg:nuget/[email protected]",
142138
"https://www.nuget.org/api/v2/package/MvvmLightLibs/4.1.23": "pkg:nuget/[email protected]",
143139
"https://www.nuget.org/api/v2/package/Twilio/3.4.1": "pkg:nuget/[email protected]",
144140
"https://api.nuget.org/v3-flatcontainer/newtonsoft.json/10.0.1/newtonsoft.json.10.0.1.nupkg": "pkg:nuget/[email protected]",
145-
146141
"http://master.dl.sourceforge.net/project/zznotes/zznotes/1.1.2/zznotes-1.1.2.tar.gz": "pkg:sourceforge/zznotes/[email protected]",
147142
"http://master.dl.sourceforge.net/project/zapping/zvbi/0.2.35/zvbi-0.2.35.tar.bz2": "pkg:sourceforge/zapping/[email protected]",
148143
"http://master.dl.sourceforge.net/project/libpng/zlib/1.2.3/zlib-1.2.3.tar.bz2": "pkg:sourceforge/libpng/[email protected]",
149144
"http://master.dl.sourceforge.net/project/xmlstar/xmlstarlet/1.0.0/xmlstarlet-1.0.0-1.src.rpm": "pkg:sourceforge/xmlstar/[email protected]",
150145
"http://master.dl.sourceforge.net/project/wxmozilla/wxMozilla/0.5.5/wxMozilla-0.5.5.exe": "pkg:sourceforge/wxmozilla/[email protected]",
151146
"http://iweb.dl.sourceforge.net/project/sblim/sblim-cim-client2/2.2.5/sblim-cim-client2-2.2.5-src.zip": "pkg:sourceforge/sblim/[email protected]",
152147
"http://master.dl.sourceforge.net/project/zinnia/zinnia-win32/0.06/zinnia-win32-0.06.zip": "pkg:sourceforge/zinnia/[email protected]",
153-
"http://iweb.dl.sourceforge.net/project/findbugs/findbugs/1.3.4/findbugs-1.3.4.tar.gz/": null,
154-
"http://master.dl.sourceforge.net/project/arestc/net/sf/arestc/arestc/0.1.4/arestc-0.1.4-javadoc.jar": null,
155-
"http://master.dl.sourceforge.net/project/intraperson/OldFiles/intraperson/0.28/intraperson-0.28.tar.gz": null,
156-
"http://master.dl.sourceforge.net/project/pwiki/pwiki/0.1.2/0.1.2.zip": null,
157-
"http://master.dl.sourceforge.net/project/iswraid/iswraid/0.1.4.3/2.4.28-pre3-iswraid.patch.gz": null,
158-
"http://master.dl.sourceforge.net/project/aloyscore/aloyscore/0.1a1%20stable/0.1a1_stable_AloysCore.zip": null,
159-
"http://master.dl.sourceforge.net/project/myenterprise/OldFiles/1.0.0.2.MyEnterprise.Source.zip": null,
160-
"http://master.dl.sourceforge.net/project/wxhaskell/wxhaskell/wxhaskell-0.9/wxhaskell-src-0.9.zip": null,
161-
"http://master.dl.sourceforge.net/project/a2freedom/A2/1.2/a2freedom-1.2.zip": null,
162-
"http://master.dl.sourceforge.net/project/tinyos/OldFiles/tinyos/1.1.0/tinyos-1.1.0.tar.gz": null,
163-
"http://master.dl.sourceforge.net/project/urlchecker/lu/ng/urlchecker/urlchecker/1.7/urlchecker-1.7-javadoc.jar": null,
164-
"http://master.dl.sourceforge.net/project/zclasspath/maven2/org/zclasspath/zclasspath/1.5/zclasspath-1.5.jar": null,
165-
148+
"http://iweb.dl.sourceforge.net/project/findbugs/findbugs/1.3.4/findbugs-1.3.4.tar.gz/": "pkg:sourceforge/findbugs-1.3.4.tar.gz?download_url=http://iweb.dl.sourceforge.net/project/findbugs/findbugs/1.3.4/findbugs-1.3.4.tar.gz/",
149+
"http://master.dl.sourceforge.net/project/arestc/net/sf/arestc/arestc/0.1.4/arestc-0.1.4-javadoc.jar": "pkg:sourceforge/arestc-0.1.4-javadoc.jar?download_url=http://master.dl.sourceforge.net/project/arestc/net/sf/arestc/arestc/0.1.4/arestc-0.1.4-javadoc.jar",
150+
"http://master.dl.sourceforge.net/project/intraperson/OldFiles/intraperson/0.28/intraperson-0.28.tar.gz": "pkg:sourceforge/intraperson-0.28.tar.gz?download_url=http://master.dl.sourceforge.net/project/intraperson/OldFiles/intraperson/0.28/intraperson-0.28.tar.gz",
151+
"http://master.dl.sourceforge.net/project/pwiki/pwiki/0.1.2/0.1.2.zip": "pkg:sourceforge/0.1.2.zip?download_url=http://master.dl.sourceforge.net/project/pwiki/pwiki/0.1.2/0.1.2.zip",
152+
"http://master.dl.sourceforge.net/project/iswraid/iswraid/0.1.4.3/2.4.28-pre3-iswraid.patch.gz": "pkg:sourceforge/2.4.28-pre3-iswraid.patch.gz?download_url=http://master.dl.sourceforge.net/project/iswraid/iswraid/0.1.4.3/2.4.28-pre3-iswraid.patch.gz",
153+
"http://master.dl.sourceforge.net/project/aloyscore/aloyscore/0.1a1%20stable/0.1a1_stable_AloysCore.zip": "pkg:sourceforge/0.1a1_stable_AloysCore.zip?download_url=http://master.dl.sourceforge.net/project/aloyscore/aloyscore/0.1a1%2520stable/0.1a1_stable_AloysCore.zip",
154+
"http://master.dl.sourceforge.net/project/myenterprise/OldFiles/1.0.0.2.MyEnterprise.Source.zip": "pkg:sourceforge/1.0.0.2.MyEnterprise.Source.zip?download_url=http://master.dl.sourceforge.net/project/myenterprise/OldFiles/1.0.0.2.MyEnterprise.Source.zip",
155+
"http://master.dl.sourceforge.net/project/wxhaskell/wxhaskell/wxhaskell-0.9/wxhaskell-src-0.9.zip": "pkg:sourceforge/wxhaskell-src-0.9.zip?download_url=http://master.dl.sourceforge.net/project/wxhaskell/wxhaskell/wxhaskell-0.9/wxhaskell-src-0.9.zip",
156+
"http://master.dl.sourceforge.net/project/a2freedom/A2/1.2/a2freedom-1.2.zip": "pkg:sourceforge/a2freedom-1.2.zip?download_url=http://master.dl.sourceforge.net/project/a2freedom/A2/1.2/a2freedom-1.2.zip",
157+
"http://master.dl.sourceforge.net/project/tinyos/OldFiles/tinyos/1.1.0/tinyos-1.1.0.tar.gz": "pkg:sourceforge/tinyos-1.1.0.tar.gz?download_url=http://master.dl.sourceforge.net/project/tinyos/OldFiles/tinyos/1.1.0/tinyos-1.1.0.tar.gz",
158+
"http://master.dl.sourceforge.net/project/urlchecker/lu/ng/urlchecker/urlchecker/1.7/urlchecker-1.7-javadoc.jar": "pkg:sourceforge/urlchecker-1.7-javadoc.jar?download_url=http://master.dl.sourceforge.net/project/urlchecker/lu/ng/urlchecker/urlchecker/1.7/urlchecker-1.7-javadoc.jar",
159+
"http://master.dl.sourceforge.net/project/zclasspath/maven2/org/zclasspath/zclasspath/1.5/zclasspath-1.5.jar": "pkg:sourceforge/zclasspath-1.5.jar?download_url=http://master.dl.sourceforge.net/project/zclasspath/maven2/org/zclasspath/zclasspath/1.5/zclasspath-1.5.jar",
166160
"https://crates.io/api/v1/crates/rand/0.7.2/download": "pkg:cargo/[email protected]",
167161
"https://crates.io/api/v1/crates/clap/2.33.0/download": "pkg:cargo/[email protected]",
168162
"https://crates.io/api/v1/crates/structopt/0.3.11/download": "pkg:cargo/[email protected]",
169-
170163
"https://github.com/TG1999/fetchcode/tree/documentation/fetchcode": "pkg:github/tg1999/fetchcode@documentation#fetchcode",
171164
"https://github.com/nexB/scancode-toolkit/tree/develop/plugins/scancode-ctags-macosx_10_9_intel": "pkg:github/nexb/scancode-toolkit@develop#plugins/scancode-ctags-macosx_10_9_intel",
172165
"https://github.com/package-url/packageurl-js/tree/master/test/data": "pkg:github/package-url/packageurl-js@master#test/data",
@@ -216,15 +209,14 @@
216209
"https://github.com/swagger-api/swagger-codegen/archive/refs/tags/v3.0.25.tar.gz": "pkg:github/swagger-api/[email protected]",
217210
"https://github.com/bareos/bareos/archive/Release/16.2.6.zip": "pkg:github/bareos/[email protected]",
218211
"https://github.com/hessu/bchunk/archive/release/1.2.2.tar.gz": "pkg:github/hessu/[email protected]",
219-
"https://github.com/downloads/mozilla/rhino/rhino1_7R4.zip" : "pkg:github/mozilla/rhino@1_7R4",
220-
"https://github.com/pombredanne/schematics.git" : "pkg:github/pombredanne/schematics",
212+
"https://github.com/downloads/mozilla/rhino/rhino1_7R4.zip": "pkg:github/mozilla/rhino@1_7R4",
213+
"https://github.com/pombredanne/schematics.git": "pkg:github/pombredanne/schematics",
221214
"https://github.com/jgoerzen/configfile/archive/upstream/1.1.4.tar.gz": "pkg:github/jgoerzen/[email protected]",
222215
"https://github.com/JetBrains/intellij-community/archive/idea/173.4710.11.zip": "pkg:github/jetbrains/[email protected]",
223216
"https://github.com/knime/knime-core/archive/analytics-platform/3.6.0.zip": "pkg:github/knime/[email protected]",
224217
"https://github.com/renozao/NMF/archive/hotfix/0.20.1.zip": "pkg:github/renozao/[email protected]",
225218
"https://github.com/apache/cordova-osx/archive/rel/4.0.0.zip": "pkg:github/apache/[email protected]",
226219
"https://github.com/sehmaschine/django-grappelli/archive/stable/2.13.x.zip": "pkg:github/sehmaschine/[email protected]",
227-
228220
"https://bitbucket.org/TG1999/first_repo/src/qa/": "pkg:bitbucket/tg1999/first_repo@qa",
229221
"https://bitbucket.org/TG1999/first_repo/src/QA/": "pkg:bitbucket/tg1999/first_repo@QA",
230222
"https://bitbucket.org/TG1999/first_repo/": "pkg:bitbucket/tg1999/first_repo",
@@ -234,21 +226,20 @@
234226
"https://bitbucket.org/TG1999/first_repo/src/master/new_folder/": "pkg:bitbucket/tg1999/first_repo@master#new_folder",
235227
"https://bitbucket.org/TG1999/first_repo/src/MASTER/NEW_FOLDER/": "pkg:bitbucket/tg1999/first_repo@MASTER#NEW_FOLDER",
236228
"https://bitbucket.org/TG1999/first_repo/new_folder/": "pkg:bitbucket/tg1999/first_repo@new_folder",
237-
"https://bitbucket.org/multicoreware/x265/downloads/x265_2.6.tar.gz" : "pkg:bitbucket/multicoreware/x265?download_url=https://bitbucket.org/multicoreware/x265/downloads/x265_2.6.tar.gz",
238-
"https://bitbucket.org/robeden/trove/downloads/trove-3.0.3.zip" : "pkg:bitbucket/robeden/trove?download_url=https://bitbucket.org/robeden/trove/downloads/trove-3.0.3.zip",
239-
229+
"https://bitbucket.org/multicoreware/x265/downloads/x265_2.6.tar.gz": "pkg:bitbucket/multicoreware/x265?download_url=https://bitbucket.org/multicoreware/x265/downloads/x265_2.6.tar.gz",
230+
"https://bitbucket.org/robeden/trove/downloads/trove-3.0.3.zip": "pkg:bitbucket/robeden/trove?download_url=https://bitbucket.org/robeden/trove/downloads/trove-3.0.3.zip",
240231
"https://gitlab.com/TG1999/firebase/-/tree/1a122122/views": "pkg:gitlab/tg1999/firebase@1a122122#views",
241232
"https://gitlab.com/tg1999/firebase": "pkg:gitlab/tg1999/firebase",
242233
"https://gitlab.com/TG1999/firebase/-/": "pkg:gitlab/tg1999/firebase",
243234
"https://gitlab.com/TG1999/firebase/-/tree": "pkg:gitlab/tg1999/firebase",
244-
"https://gitlab.com/TG1999/firebase/-/master": "pkg:gitlab/tg1999/firebase@master",
235+
"https://gitlab.com/TG1999/firebase/-/master": "pkg:gitlab/tg1999/firebase",
245236
"https://gitlab.com/TG1999/firebase/tree/": "pkg:gitlab/tg1999/firebase",
246237
"https://gitlab.com/TG1999/firebase/master": "pkg:gitlab/tg1999/firebase@master",
247238
"https://gitlab.com/TG1999/firebase/-/tree/master": "pkg:gitlab/tg1999/firebase@master",
248239
"https://gitlab.com/tg1999/Firebase/-/tree/master": "pkg:gitlab/tg1999/firebase@master",
249240
"https://gitlab.com/TG1999/FIREBASE": "pkg:gitlab/tg1999/firebase",
250-
251241
"https://hackage.haskell.org/package/a50-0.5/a50-0.5.tar.gz": "pkg:hackage/[email protected]",
252242
"https://hackage.haskell.org/package/AC-HalfInteger-1.2.1/AC-HalfInteger-1.2.1.tar.gz": "pkg:hackage/[email protected]",
253-
"https://hackage.haskell.org/package/3d-graphics-examples-0.0.0.2/3d-graphics-examples-0.0.0.2.tar.gz": "pkg:hackage/[email protected]"
254-
}
243+
"https://hackage.haskell.org/package/3d-graphics-examples-0.0.0.2/3d-graphics-examples-0.0.0.2.tar.gz": "pkg:hackage/[email protected]",
244+
"https://salsa.debian.org/lxc-team/lxc/-/archive/master/lxc-master.tar.gz": "pkg:generic/lxc-master.tar.gz?download_url=https://salsa.debian.org/lxc-team/lxc/-/archive/master/lxc-master.tar.gz"
245+
}

tests/contrib/test_get_path_segments.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,4 @@ def test_parsing_empty_string():
4343
def test_parsing_with_one_segment():
4444
url = 'https://github.com/TG1999'
4545
segments = get_path_segments(url)
46-
assert [] == segments
46+
assert ["TG1999"] == segments

0 commit comments

Comments
 (0)