Skip to content

Commit 25143f5

Browse files
committed
Add support for APK download URLs
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent ab21805 commit 25143f5

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

src/packageurl/contrib/purl2url.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,41 @@ def build_deb_download_url(purl_str: str) -> str:
644644
return f"{base_url}{pool_path}/{filename}"
645645

646646

647+
@download_router.route("pkg:qpkg/.*")
648+
def build_qpkg_download_url(purl: str) -> str:
649+
purl = PackageURL.from_string(purl)
650+
repo_url = purl.qualifiers.get("repo_url")
651+
652+
if not repo_url:
653+
raise ValueError("repository_url qualifier is required for qpkg purl resolution")
654+
655+
if not purl.namespace or not purl.name or not purl.version:
656+
raise ValueError("namespace, name, and version must be present in qpkg purl")
657+
658+
path = f"{purl.namespace}/{purl.name}/{purl.version}.qpkg"
659+
return f"{repo_url.rstrip('/')}/{path}"
660+
661+
662+
@download_router.route("pkg:apk/.*")
663+
def build_apk_download_url(purl):
664+
"""
665+
Return a download URL for a fully qualified Alpine Linux package PURL.
666+
667+
Example:
668+
pkg:apk/acct@6.6.4-r0?arch=x86&alpine_version=v3.11&repo=main
669+
"""
670+
purl = PackageURL.from_string(purl)
671+
name = purl.name
672+
version = purl.version
673+
arch = purl.qualifiers.get("arch")
674+
repo = purl.qualifiers.get("repo")
675+
alpine_version = purl.qualifiers.get("alpine_version")
676+
677+
return (
678+
f"https://dl-cdn.alpinelinux.org/alpine/{alpine_version}/{repo}/{arch}/{name}-{version}.apk"
679+
)
680+
681+
647682
def get_repo_download_url(purl):
648683
"""
649684
Return ``download_url`` if present in ``purl`` qualifiers or

tests/contrib/test_purl2url.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ def test_purl2url_get_download_url():
112112
"pkg:alpm/arch/pacman@6.0.1-1?arch=x86_64": "https://archive.archlinux.org/packages/p/pacman/pacman-6.0.1-1-x86_64.pkg.tar.zst",
113113
"pkg:deb/debian/attr@1:2.4.48-6?arch=amd64": "https://deb.debian.org/debian/pool/main/a/attr/attr_2.4.48-6_amd64.deb",
114114
"pkg:deb/debian/attr@1:2.4.48-6?arch=amd64&repository_url=http://archive.debian.org/debian": "http://archive.debian.org/debian/pool/main/a/attr/attr_2.4.48-6_amd64.deb",
115+
"pkg:qpkg/blackberry/com.qnx.sdp@7.0.0.SGA201702151847?repo_url=http://repo.blackberry.com": "http://repo.blackberry.com/blackberry/com.qnx.sdp/7.0.0.SGA201702151847.qpkg",
116+
"pkg:apk/acct@6.6.4-r0?arch=x86&alpine_version=v3.11&repo=main": "https://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86/acct-6.6.4-r0.apk",
115117
# From `download_url` qualifier
116118
"pkg:github/yarnpkg/yarn@1.3.2?download_url=https://github.com/yarnpkg/yarn/releases/download/v1.3.2/yarn-v1.3.2.tar.gz&version_prefix=v": "https://github.com/yarnpkg/yarn/releases/download/v1.3.2/yarn-v1.3.2.tar.gz",
117119
"pkg:generic/lxc-master.tar.gz?download_url=https://salsa.debian.org/lxc-team/lxc/-/archive/master/lxc-master.tar.gz": "https://salsa.debian.org/lxc-team/lxc/-/archive/master/lxc-master.tar.gz",

0 commit comments

Comments
 (0)