Skip to content

Instantly share code, notes, and snippets.

@jleclanche
Created April 18, 2017 07:31
Show Gist options
  • Save jleclanche/d60f381069a2c338228e96b95143e600 to your computer and use it in GitHub Desktop.
Save jleclanche/d60f381069a2c338228e96b95143e600 to your computer and use it in GitHub Desktop.
PKGBUILD autogeneration for npmjs packages
#!/usr/bin/env python
import json
import operator
import os
import requests
import sys
REGISTRY_URL = "https://registry.npmjs.org/{0}"
PKGBUILD_HEADER = """# Autogenerated from {registry_url}
pkgname={pkgname}
pkgver={pkgver}
pkgrel={pkgrel}
pkgdesc="{description}"
arch=("any")
url="{url}"
license=("{license}")
depends=("nodejs")
makedepends=("npm")
source=("$pkgname-$pkgver.tgz::{source}")
noextract=("$pkgname-$pkgver.tgz")
sha1sums=("{shasum}")
"""
PKGBUILD = """
package() {
npm install -g --user root --prefix "$pkgdir"/usr "$srcdir"/$pkgname-$pkgver.tgz
rm -r "$pkgdir"/usr/etc
}
"""
def get_most_popular(data, n):
"get most popular from keys.json"
if isinstance(data, str):
with open(data, "r") as f:
data = json.load(f)
ret = sorted(data["rows"], key=operator.itemgetter("value"), reverse=True)
return [row["key"][0] for row in ret[:n]]
def sanitize_name(name):
return (name.lower()
.strip("@")
.replace("/", "-")
.replace(".", "-")
)
def get_or_cache_metadata(name, filename):
if not os.path.exists(filename):
url = REGISTRY_URL.format(name)
print("Querying %r" % (url))
pkgdata = requests.get(url).json()
with open(filename, "w") as f:
json.dump(pkgdata, f)
else:
print("Generating from %r" % (filename))
with open(filename, "r") as f:
pkgdata = json.load(f)
return pkgdata
def do_package(package, metadata_dir, build_dir):
pkgname = sanitize_name(package)
metadata_json = os.path.join(metadata_dir, "%s.json" % (pkgname))
pkgdata = get_or_cache_metadata(package, metadata_json)
latest_version = pkgdata["dist-tags"]["latest"]
version = pkgdata["versions"][latest_version]
data = {
"pkgname": pkgname,
"pkgver": version["version"].replace("-", ""),
"pkgrel": 1,
"description": version.get("description", ""),
"url": version.get("homepage", ""),
"license": version.get("license", "N/A"),
"source": version["dist"]["tarball"],
"shasum": version["dist"]["shasum"],
"registry_url": REGISTRY_URL.format(package),
}
dirname = os.path.join(build_dir, sanitize_name(package))
if not os.path.exists(dirname):
os.makedirs(dirname)
with open(os.path.join(dirname, "PKGBUILD"), "w") as f:
f.write(PKGBUILD_HEADER.format(**data))
f.write(PKGBUILD)
print("Written to %r" % (f.name))
def main():
metadata_dir = sys.argv[1]
build_dir = sys.argv[2]
for package in sys.argv[3:]:
do_package(package, metadata_dir, build_dir)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment