aboutsummaryrefslogblamecommitdiff
path: root/scripts/paku
blob: b31d2c4c6a2a90754a157a8efba108d87707bf12 (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')"
    SUFFIX="$(echo "$p" | base64 --decode | jq -r '.suffix')"
    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$SUFFIX
  (package
    (name "$NAME$SUFFIX")
    (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 p in $(jq -r '.packages[] | @base64' < paku.json); do
    NAME="$(echo "$p" | base64 --decode | jq -r '.name')"
    SUFFIX="$(echo "$p" | base64 --decode | jq -r '.suffix')"

    printf '\n  %s%s' "$NAME" "$SUFFIX" >>"$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')"
    SUFFIX="$(echo "$p" | base64 --decode | jq -r '.suffix')"
    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$SUFFIX = 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
}

gen_homebrew() {
  for p in $(jq -r '.packages[] | @base64' < paku.json); do
    HOMEBREW_OUT="$(mktemp)"
    NAME="$(echo "$p" | base64 --decode | jq -r '.name')"
    SUFFIX="$(echo "$p" | base64 --decode | jq -r '.suffix')"
    SUFFIX_UC="$(echo "$SUFFIX" | cut -c2-)"
    SUFFIX_UC="${SUFFIX_UC^}"
    VERSION="$(echo "$p" | base64 --decode | jq -r '.version')"
    TYPE="$(echo "$p" | base64 --decode | jq -r '.type')"

    TARBALL_URL="$(tarball_url "$NAME" "$VERSION")"
    TARBALL="$(mktemp)"
    wget -O "$TARBALL" "$TARBALL_URL"
    SHA256="$(sha256sum "$TARBALL" | cut -d\  -f 1)"
    DESCRIPTION="$(tar xvf "$TARBALL" -O "$NAME-$VERSION/description")"

    JSON_CHECK_INPUTS="$(echo "$p" | base64 --decode | jq -r '.check_inputs')"
    if [ "$JSON_CHECK_INPUTS" = 'null' ]; then
      CHECK_INPUTS=''
    else
      CHECK_INPUTS=''
      for check_input in $(echo "$JSON_CHECK_INPUTS" | jq -r '.[]'); do
        CHECK_INPUTS="$CHECK_INPUTS
  depends_on '$check_input' => :build"
      done
      CHECK_INPUTS="$CHECK_INPUTS
"
    fi

    TEST_SECTION=''
    if [ "$TYPE" = 'bin' ]; then
      TEST_SECTION="

  test do
    system \"#{bin}/$NAME\", '-V'
  end"
    fi

    cat <<EOF >>"$HOMEBREW_OUT"
class ${NAME^}$SUFFIX_UC < Formula
  desc '$DESCRIPTION'
  homepage 'https://$NAME.euandreh.xyz'
  url '$TARBALL_URL'
  sha256 '$SHA256'
  license 'AGPL-3.0-or-later'
$CHECK_INPUTS
  def install
    system './configure', "--prefix=#{prefix}"
    system 'make'
    system 'make', 'check'
    system 'make', 'install'
  end$TEST_SECTION
end
EOF
    mv "$HOMEBREW_OUT" "Formula/$NAME$SUFFIX.rb"
  done
}

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)"
    SUFFIX="$(jq -r ".packages[$N].suffix" < paku.json)"
    cd "../$NAME/"
    if [ "$SUFFIX" = '-latest' ]; then
      NEW_VERSION="$(git rev-parse HEAD)"
    else
      NEW_VERSION="$(git describe --tags --abbrev=0 | cut -c2-)"
    fi
    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
      gen_homebrew
      ;;
    r)
      refresh_packages
      ;;
    *)
      printf 'Unrecognized flag "%s".\n' "$flag" >&2
      ;;
  esac
done