blob: 239f1a5935ee31a86929d53dc66ad591df7338ae (
plain) (
tree)
|
|
#!/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
|