Skip to content

Instantly share code, notes, and snippets.

@jleclanche
Created December 30, 2015 15:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jleclanche/50f0a0e34756679cb550 to your computer and use it in GitHub Desktop.
Save jleclanche/50f0a0e34756679cb550 to your computer and use it in GitHub Desktop.
Build scripts for https://leclan.ch/arch/
#!/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()
#!/bin/bash
set -e
BASEDIR="$(readlink -f $(dirname $0))"
REPOSITORY="$HOME/npmjs"
# wget https://skimdb.npmjs.com/registry/_all_docs -O "$BASEDIR/keys.json"
# wget "https://skimdb.npmjs.com/registry/_design/app/_view/dependedUpon?group=true&group_level=1" -O "$BASEDIR/keys.json"
TOP=500
PACKAGES=$(head -n$TOP "$BASEDIR/packages.list")
python "$BASEDIR/do_package.py" "$BASEDIR/metadata" "$BASEDIR/build" $PACKAGES
for package in "$BASEDIR/build/"*; do
cd "$package"
echo "Preparing package $package"
makepkg --sign
repo-add --sign "$REPOSITORY/npmjs.db.tar.xz" "$BASEDIR/packages"/*.pkg.tar.xz
mv "$BASEDIR/packages"/* "$REPOSITORY"
rm -rf "$package"/*z
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment