diff options
-rwxr-xr-x | scripts/paku | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/scripts/paku b/scripts/paku new file mode 100755 index 0000000..239f1a5 --- /dev/null +++ b/scripts/paku @@ -0,0 +1,181 @@ +#!/bin/sh +set -eu + +TARBALL_TEMPLATE='https://git.euandreh.xyz/@NAME@/snapshot/@NAME@-@VERSION@.tar.gz' + +tarball_url() { + NAME="$1" + VERSION="$2" + echo "$TARBALL_TEMPLATE" | \ + sed -e "s/@NAME@/$NAME/g" \ + -e "s/@VERSION@/$VERSION/g" +} + +gen_guix() { + GUIX_OUT="$(mktemp)" + + cat <<EOF >>"$GUIX_OUT" +(define-module (xyz euandreh packages) + #:use-module (json) + #:use-module ((ice-9 textual-ports) #:prefix textual-ports:) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (gnu packages) + #:use-module (guix transformations) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix git-download) + #:use-module (guix utils) + #:use-module (guix store) + #:use-module (guix build-system gnu)) +EOF + + for p in $(jq -r '.packages[] | @base64' < paku.json); do + NAME="$(echo "$p" | base64 --decode | jq -r '.name')" + VERSION="$(echo "$p" | base64 --decode | jq -r '.version')" + + TARBALL="$(tarball_url "$NAME" "$VERSION")" + SHA256="$(guix download "$TARBALL" | tail -n 1)" + + JSON_CHECK_INPUTS="$(echo "$p" | base64 --decode | jq -r '.check_inputs')" + if [ "$JSON_CHECK_INPUTS" = 'null' ]; then + CHECK_INPUTS='' + else + INPUTS='' + for check_input in $(echo "$JSON_CHECK_INPUTS" | jq -r '.[]'); do + if [ "$INPUTS" = '' ]; then + INPUTS="(\"$check_input\" ,(specification->package \"$check_input\"))" + else + INPUTS="$INPUTS + (\"$check_input\" ,(specification->package \"$check_input\"))" + fi + done + + CHECK_INPUTS=" + (inputs + \`($INPUTS))" + fi + + cat <<EOF >>"$GUIX_OUT" + +(define-public $NAME + (package + (name "$NAME") + (version "$VERSION") + (source (origin + (method url-fetch) + (uri (string-append + "https://git.euandreh.xyz/$NAME/snapshot/$NAME-" + version + ".tar.gz")) + (sha256 + (base32 + "$SHA256")))) + (build-system gnu-build-system)$CHECK_INPUTS + (arguments \`(#:make-flags (list (string-append "CC=" ,(cc-for-target))))) + (synopsis (file-append source "/description")) + (description (file-append source "/long-description")) + (home-page (string-append "https://" name ".euandreh.xyz")) + (license license:agpl3+))) +EOF + done + + printf '\n(list' >>"$GUIX_OUT" + for name in $(jq -r '.packages[].name' < paku.json); do + printf '\n %s' "$name" >>"$GUIX_OUT" + done + printf ')\n' >>"$GUIX_OUT" + + mv "$GUIX_OUT" src/xyz/euandreh/packages.scm +} + +gen_nix() { + NIX_OUT="$(mktemp)" + + cat <<EOF >>"$NIX_OUT" +{ pkgs }: +self: super: { + xyz-euandreh = { +EOF + + for p in $(jq -r '.packages[] | @base64' < paku.json); do + NAME="$(echo "$p" | base64 --decode | jq -r '.name')" + VERSION="$(echo "$p" | base64 --decode | jq -r '.version')" + TARBALL="$(tarball_url "$NAME" "$VERSION")" + SHA256="$(nix-prefetch-url --unpack "$TARBALL")" + JSON_CHECK_INPUTS="$(echo "$p" | base64 --decode | jq -r '.check_inputs')" + if [ "$JSON_CHECK_INPUTS" = 'null' ]; then + CHECK_INPUTS='' + else + INPUTS='[' + for check_input in $(echo "$JSON_CHECK_INPUTS" | jq -r '.[]'); do + INPUTS="$INPUTS $check_input" + done + INPUTS="$INPUTS ]" + + CHECK_INPUTS=" + checkInputs = with pkgs; $INPUTS;" + fi + + cat <<EOF >>"$NIX_OUT" + $NAME = pkgs.stdenv.mkDerivation rec { + name = "$NAME"; + version = "$VERSION"; + + src = fetchTarball { + url = + "https://git.euandreh.xyz/\${name}/snapshot/\${name}-\${version}.tar.gz"; + sha256 = "$SHA256"; + }; + + makeFlags = [ "CC=cc" ]; +$CHECK_INPUTS + doCheck = true; + + meta = with pkgs.lib; { + description = readFile "\${src}/description"; + longDescription = readFile "\${src}/long-description"; + homepage = "https://\${name}.euandreh.xyz"; + changelog = "https://\${name}.euandreh.xyz/CHANGELOG.html"; + downloadPage = "https://\${name}.euandreh.xyz/#releases"; + license = licenses.agpl3; + platforms = platforms.unix; + }; + }; +EOF + done + + cat <<EOF >>"$NIX_OUT" + }; +} +EOF + + mv "$NIX_OUT" default.nix +} + +refresh_packages() { + COUNT="$(jq -r '.packages[].name' < paku.json | wc -l)" + INDEXES="$(seq 0 "$((COUNT - 1))")" + for N in $INDEXES; do + NAME="$(jq -r ".packages[$N].name" < paku.json)" + cd "../$NAME/" + NEW_VERSION="$(git rev-parse HEAD)" + cd - >/dev/null + jq -r ".packages[$N].version = \"$NEW_VERSION\"" paku.json | sponge paku.json + done +} + +while getopts 'gr' flag; do + case "$flag" in + g) + gen_guix + gen_nix + ;; + r) + refresh_packages + ;; + *) + printf 'Unrecognized flag "%s".\n' "$flag" >&2 + ;; + esac +done |