diff --git a/CHANGELOG.rst b/CHANGELOG.rst index bfa5100..ffb868e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,12 @@ Changelog ========= +0.13.2 (2024-01-04) +------------------- + +- Improve support for SourceForge URLs in `url2purl`. + https://github.com/package-url/packageurl-python/issues/139 + 0.13.1 (2023-12-11) ------------------- diff --git a/setup.cfg b/setup.cfg index 33611bd..20d3c22 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = packageurl-python -version = 0.13.1 +version = 0.13.2 license = MIT description = A purl aka. Package URL parser and builder long_description = file:README.rst diff --git a/src/packageurl/contrib/url2purl.py b/src/packageurl/contrib/url2purl.py index ac6b954..d1d2034 100644 --- a/src/packageurl/contrib/url2purl.py +++ b/src/packageurl/contrib/url2purl.py @@ -344,7 +344,7 @@ def build_pypi_purl(uri): register_pattern("nuget", nuget_api_pattern) -@purl_router.route("https?://.*sourceforge.net/project/.*") +@purl_router.route("https?://.*sourceforge.net/projects?/.*") def build_sourceforge_purl(uri): # We use a more general route pattern instead of using `sourceforge_pattern` # below by itself because we want to capture all sourceforge download URLs, @@ -353,9 +353,11 @@ def build_sourceforge_purl(uri): # URL that we can't handle. # http://master.dl.sourceforge.net/project/libpng/zlib/1.2.3/zlib-1.2.3.tar.bz2 + # https://sourceforge.net/projects/scribus/files/scribus/1.6.0/scribus-1.6.0.tar.gz/download sourceforge_pattern = ( - r"^https?://.*sourceforge.net/project/" + r"^https?://.*sourceforge.net/projects?/" r"(?P([^/]+))/" # do not allow more "/" segments + r"(files/)?" # optional segment for "*/download" type URLs r"(?P.+)/" r"(?P[0-9\.]+)/" # version restricted to digits and dots r"(?P=name)-(?P=version).*" # {name}-{version} repeated in the filename diff --git a/tests/contrib/data/url2purl.json b/tests/contrib/data/url2purl.json index 62a7bbc..ddc43ed 100644 --- a/tests/contrib/data/url2purl.json +++ b/tests/contrib/data/url2purl.json @@ -171,6 +171,7 @@ "http://master.dl.sourceforge.net/project/urlchecker/lu/ng/urlchecker/urlchecker/1.7/urlchecker-1.7-javadoc.jar": "pkg:sourceforge/urlchecker?download_url=http://master.dl.sourceforge.net/project/urlchecker/lu/ng/urlchecker/urlchecker/1.7/urlchecker-1.7-javadoc.jar", "http://master.dl.sourceforge.net/project/zclasspath/maven2/org/zclasspath/zclasspath/1.5/zclasspath-1.5.jar": "pkg:sourceforge/zclasspath?download_url=http://master.dl.sourceforge.net/project/zclasspath/maven2/org/zclasspath/zclasspath/1.5/zclasspath-1.5.jar", "http://master.dl.sourceforge.net/project/googleimagedown/project/v1.1/GoogleImageDownloader-v1.1-src.tar.bz2": "pkg:sourceforge/googleimagedown?download_url=http://master.dl.sourceforge.net/project/googleimagedown/project/v1.1/GoogleImageDownloader-v1.1-src.tar.bz2", + "https://sourceforge.net/projects/scribus/files/scribus/1.6.0/scribus-1.6.0.tar.gz/download": "pkg:sourceforge/scribus/scribus@1.6.0", "https://crates.io/api/v1/crates/rand/0.7.2/download": "pkg:cargo/rand@0.7.2", "https://crates.io/api/v1/crates/clap/2.33.0/download": "pkg:cargo/clap@2.33.0", "https://crates.io/api/v1/crates/structopt/0.3.11/download": "pkg:cargo/structopt@0.3.11",