Skip to content

Commit 24ea308

Browse files
authored
Merge pull request #199 from package-url/purl_2_download_url_batch2
Collect more download URLs in purl2url
2 parents d0805c1 + cc3c456 commit 24ea308

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

src/packageurl/contrib/purl2url.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,83 @@ def build_swift_download_url(purl):
513513
return f"https://{namespace}/{name}/archive/{version}.zip"
514514

515515

516+
@download_router.route("pkg:luarocks/.*")
517+
def build_luarocks_download_url(purl):
518+
"""
519+
Return a LuaRocks download URL from the `purl` string.
520+
"""
521+
purl_data = PackageURL.from_string(purl)
522+
523+
qualifiers = purl_data.qualifiers or {}
524+
525+
repository_url = qualifiers.get("repository_url", "https://luarocks.org")
526+
527+
name = purl_data.name
528+
version = purl_data.version
529+
530+
if name and version:
531+
return f"{repository_url}/{name}-{version}.src.rock"
532+
533+
534+
@download_router.route("pkg:conda/.*")
535+
def build_conda_download_url(purl):
536+
"""
537+
Resolve a Conda PURL to a real downloadable URL
538+
539+
Supported qualifiers:
540+
- channel: e.g., main, conda-forge (required for deterministic base)
541+
- subdir: e.g., linux-64, osx-arm64, win-64, noarch
542+
- build: exact build string (optional but recommended)
543+
- type: 'conda' or 'tar.bz2' (preference; fallback to whichever exists)
544+
"""
545+
p = PackageURL.from_string(purl)
546+
if not p.name or not p.version:
547+
return None
548+
549+
q = p.qualifiers or {}
550+
name = p.name
551+
version = p.version
552+
build = q.get("build")
553+
channel = q.get("channel") or "main"
554+
subdir = q.get("subdir") or "noarch"
555+
req_type = q.get("type")
556+
557+
def _conda_base_for_channel(channel: str) -> str:
558+
"""
559+
Map a conda channel to its base URL.
560+
- 'main' / 'defaults' -> repo.anaconda.com
561+
- any other channel -> conda.anaconda.org/<channel>
562+
"""
563+
ch = (channel or "").lower()
564+
if ch in ("main", "defaults"):
565+
return "https://repo.anaconda.com/pkgs/main"
566+
return f"https://conda.anaconda.org/{ch}"
567+
568+
base = _conda_base_for_channel(channel)
569+
570+
package_identifier = (
571+
f"{name}-{version}-{build}.{req_type}" if build else f"{name}-{version}.{req_type}"
572+
)
573+
574+
download_url = f"{base}/{subdir}/{package_identifier}"
575+
return download_url
576+
577+
578+
@download_router.route("pkg:alpm/.*")
579+
def build_alpm_download_url(purl_str):
580+
purl = PackageURL.from_string(purl_str)
581+
name = purl.name
582+
version = purl.version
583+
arch = purl.qualifiers.get("arch", "any")
584+
585+
if not name or not version:
586+
return None
587+
588+
first_letter = name[0]
589+
url = f"https://archive.archlinux.org/packages/{first_letter}/{name}/{name}-{version}-{arch}.pkg.tar.zst"
590+
return url
591+
592+
516593
def get_repo_download_url(purl):
517594
"""
518595
Return ``download_url`` if present in ``purl`` qualifiers or

tests/contrib/test_purl2url.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ def test_purl2url_get_download_url():
105105
"pkg:pub/http@0.13.3": "https://pub.dev/api/archives/http-0.13.3.tar.gz",
106106
"pkg:swift/github.com/Alamofire/Alamofire@5.4.3": "https://github.com/Alamofire/Alamofire/archive/5.4.3.zip",
107107
"pkg:swift/github.com/RxSwiftCommunity/RxFlow@2.12.4": "https://github.com/RxSwiftCommunity/RxFlow/archive/2.12.4.zip",
108+
"pkg:luarocks/luasocket@3.1.0-1": "https://luarocks.org/luasocket-3.1.0-1.src.rock",
109+
"pkg:luarocks/hisham/luafilesystem@1.8.0-1": "https://luarocks.org/luafilesystem-1.8.0-1.src.rock",
110+
"pkg:conda/absl-py@0.4.1?build=py36h06a4308_0&channel=main&subdir=linux-64&type=tar.bz2": "https://repo.anaconda.com/pkgs/main/linux-64/absl-py-0.4.1-py36h06a4308_0.tar.bz2",
111+
"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",
108112
# From `download_url` qualifier
109113
"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",
110114
"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)