#!/usr/bin/bash # This file is part of hey. # # hey is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # hey is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with hey. If not, see . # # For further information about hey you can visit # https://cdelord.fr/hey PREFIX=~/.local TARGET= CACHE=~/.local/var/cache/hey REPOS=$CACHE/repos TAGS=$CACHE/tags cmd-help() { cat </dev/null then sudo dnf install "$rpm_packet" else if hash apt 2>/dev/null then sudo apt install "$apt_packet" else if $required then echo "hey requires $name" exit 1 fi fi fi } cmd-install() { for package in "$@" do case "$package" in (all) install-all ;; (bang) install-bang ;; (calculadoira) install-calculadoira ;; (ditaa) install-ditaa ;; (luax) install-luax ;; (lsvg) install-lsvg ;; (panda) install-panda ;; (pandoc) install-pandoc ;; (pandoc-latex-template) install-pandoc-latex-template ;; (pandoc-panam-css) install-pandoc-panam-css ;; (plantuml) install-plantuml ;; (tagref) install-tagref ;; (typst) install-typst ;; (ypp) install-ypp ;; (*) echo "$package: unknown installation method"; exit 1 ;; esac done } gitclone() { local url="$1" local dir dir=$(basename "$url") mkdir -p $REPOS if [ -d "$REPOS/$dir" ] then ( cd "$REPOS/$dir" && git fetch && git rebase ) else git clone "$url" "$REPOS/$dir" fi } target() { case "$TARGET" in ("") [ -x $PREFIX/bin/luax ] || install-luax $PREFIX/bin/luax -e 'print(sys.os.."-"..sys.arch)' ;; (x86_64-linux-*) echo "linux-x86_64" ;; (aarch64-linux-*) echo "linux-aarch64" ;; (x86_64-windows-*) echo "windows-x86_64" ;; (x86_64-macos-*) echo "macos-x86_64" ;; (aarch64-macos-*) echo "macos-aarch64" ;; (*) echo "$TARGET" # the caller shall report an error ;; esac } tag_name() { local repo="$1" local request="https://api.github.com/repos/$repo/releases/latest" local tag_file tag_file="$TAGS/$(basename "$repo")" mkdir -p "$TAGS" local age=$(( $(date +%s) - $(stat -c %Y -- "$tag_file" 2>/dev/null || echo 0) )) if [ "$age" -gt 7200 ] then curl -sSL "$request" | jq -r .tag_name > "$tag_file" touch "$tag_file" fi cat "$tag_file" } install-all() { # shellcheck disable=SC2046 cmd-install $( grep "^install-.*()$" "$0" | grep -v "^install-all()$" | sed 's/^install-//' | tr -d '()' ) } luax-target() { local EXE="$1" shift local SOURCES="$*" if [ -n "$TARGET" ] then rm -v "$PREFIX/bin/$EXE" # shellcheck disable=SC2068 $REPOS/luax/.build/bin/luax -q -t "$TARGET" -o "$PREFIX/bin/$EXE" ${SOURCES[@]} fi } bang_installed=false install-bang() { $bang_installed && return install-luax figlet Bang gitclone https://github.com/CDSoft/bang ninja clean -C $REPOS/bang PREFIX=$PREFIX ninja install -C $REPOS/bang luax-target bang "$(ls $REPOS/bang/{src,lib}/*.lua)" "$REPOS/bang/.build/version" bang_installed=true } calculadoira_installed=false install-calculadoira() { $calculadoira_installed && return install-luax figlet Calculadoira gitclone https://github.com/CDSoft/calculadoira ninja clean -C $REPOS/calculadoira PREFIX=$PREFIX ninja install -C $REPOS/calculadoira luax-target calculadoira "$(ls $REPOS/calculadoira/src/*.lua)" calculadoira_installed=true } ditaa_installed=false install-ditaa() { $ditaa_installed && return figlet ditaa local DITAA_VERSION DITAA_VERSION=$(tag_name stathissideris/ditaa) mkdir -p $REPOS/ditaa $PREFIX/bin [ -f "$REPOS/ditaa/ditaa-${DITAA_VERSION#v}-standalone.jar" ] \ || wget "https://github.com/stathissideris/ditaa/releases/download/${DITAA_VERSION}/ditaa-${DITAA_VERSION#v}-standalone.jar" \ -O "$REPOS/ditaa/ditaa-${DITAA_VERSION#v}-standalone.jar" cp -v "$REPOS/ditaa/ditaa-${DITAA_VERSION#v}-standalone.jar" $PREFIX/bin/ditaa.jar ditaa_installed=true } lsvg_installed=false install-lsvg() { $lsvg_installed && return install-luax figlet lsvg gitclone https://github.com/CDSoft/lsvg ninja clean -C $REPOS/lsvg PREFIX=$PREFIX ninja install -C $REPOS/lsvg luax-target lsvg "$(ls $REPOS/lsvg/src/*.lua)" lsvg_installed=true } luax_installed=false install-luax() { $luax_installed && return figlet LuaX gitclone https://github.com/CDSoft/luax PREFIX=$PREFIX ninja install -C $REPOS/luax if [ -n "$TARGET" ] then rm -v $PREFIX/bin/luax case "$TARGET" in (*-windows-*) cp -av "$REPOS/luax/.build/bin/luax-$TARGET.exe" $PREFIX/bin/luax.exe ;; (*) cp -av "$REPOS/luax/.build/bin/luax-$TARGET" $PREFIX/bin/luax ;; esac fi eval "$($REPOS/luax/.build/bin/luax env)" luax_installed=true } panda_installed=false install-panda() { $panda_installed && return install-pandoc figlet Panda gitclone https://github.com/CDSoft/panda ninja clean -C $REPOS/panda PREFIX=$PREFIX ninja install -C $REPOS/panda panda_installed=true } pandoc_installed=false install-pandoc() { $pandoc_installed && return figlet Pandoc mkdir -p "$REPOS/pandoc/$TARGET" "$PREFIX/bin" local PANDOC_VERSION PANDOC_VERSION=$(tag_name jgm/pandoc) case "$(target)" in (linux-x86_64) local PANDOC_URL=https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-linux-amd64.tar.gz [ -f "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" ] || wget -c "$PANDOC_URL" -O "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" tar -C "$REPOS/pandoc/$TARGET/" -xzf "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" cp -av "$REPOS/pandoc/$TARGET/pandoc-${PANDOC_VERSION}/bin"/* "$PREFIX/bin/" ;; (linux-aarch64) local PANDOC_URL=https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-linux-arm64.tar.gz [ -f "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" ] || wget -c "$PANDOC_URL" -O "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" tar -C "$REPOS/pandoc/$TARGET/" -xzf "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" cp -av "$REPOS/pandoc/$TARGET/pandoc-${PANDOC_VERSION}/bin"/* "$PREFIX/bin/" ;; (windows-x86_64) local PANDOC_URL=https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-windows-x86_64.zip [ -f "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" ] || wget -c "$PANDOC_URL" -O "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" unzip -o -q "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" -d "$REPOS/pandoc/$TARGET/" cp -av "$REPOS/pandoc/$TARGET/pandoc-${PANDOC_VERSION}"/*.exe "$PREFIX/bin/" ;; (macos-x86_64) local PANDOC_URL=https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-x86_64-macOS.zip [ -f "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" ] || wget -c "$PANDOC_URL" -O "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" unzip -o -q "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" -d "$REPOS/pandoc/$TARGET/" cp -av "$REPOS/pandoc/$TARGET/pandoc-${PANDOC_VERSION}-x86_64/bin"/* "$PREFIX/bin/" ;; (macos-aarch64) local PANDOC_URL=https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-arm64-macOS.zip [ -f "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" ] || wget -c "$PANDOC_URL" -O "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" unzip -o -q "$REPOS/pandoc/$TARGET/$(basename "$PANDOC_URL")" -d "$REPOS/pandoc/$TARGET/" cp -av "$REPOS/pandoc/$TARGET/pandoc-${PANDOC_VERSION}-arm64/bin"/* "$PREFIX/bin/" ;; (*) echo "$(target): unsupported platform for Pandoc"; exit 1 ;; esac pandoc_installed=true } pandoc_latex_template_installed=false install-pandoc-latex-template() { $pandoc_latex_template_installed && return install-pandoc figlet Pandoc LaTeX template gitclone https://github.com/Wandmalfarbe/pandoc-latex-template.git mkdir -p $PREFIX/share/pandoc cp -v $REPOS/pandoc-latex-template.git/eisvogel.tex $PREFIX/share/pandoc pandoc_latex_template_installed=true } pandoc_panam_css=false install-pandoc-panam-css() { $pandoc_panam_css && return install-pandoc figlet Pandoc Pan-Am CSS gitclone https://github.com/CDSoft/pan-am mkdir -p $PREFIX/share/pandoc cp -v $REPOS/pan-am/styling.css $PREFIX/share/pandoc/panam.css pandoc_panam_css=true } plantuml_installed=false install-plantuml() { $plantuml_installed && return figlet PlantUML local PLANTUML_VERSION PLANTUML_VERSION=$(tag_name plantuml/plantuml) mkdir -p $REPOS/plantuml $PREFIX/bin [ -f "$REPOS/plantuml/plantuml-pdf-${PLANTUML_VERSION#v}.jar" ] \ || wget "https://github.com/plantuml/plantuml/releases/download/${PLANTUML_VERSION}/plantuml-pdf-${PLANTUML_VERSION#v}.jar" \ -O "$REPOS/plantuml/plantuml-pdf-${PLANTUML_VERSION#v}.jar" cp -v "$REPOS/plantuml/plantuml-pdf-${PLANTUML_VERSION#v}.jar" $PREFIX/bin/plantuml.jar plantuml_installed=true } tagref_installed=false install-tagref() { $tagref_installed && return install-luax figlet tagref gitclone https://github.com/CDSoft/tagref ninja clean -C $REPOS/tagref PREFIX=$PREFIX ninja install -C $REPOS/tagref luax-target tagref "$(ls $REPOS/tagref/src/*.lua)" tagref_installed=true } typst_installed=false install-typst() { $typst_installed && return figlet Typst local TYPST_VERSION TYPST_VERSION=$(tag_name typst/typst) mkdir -p "$REPOS/typst/$TARGET/$TYPST_VERSION" "$PREFIX/bin" case "$(target)" in (linux-x86_64) TYPST_URL=https://github.com/typst/typst/releases/download/${TYPST_VERSION}/typst-x86_64-unknown-linux-musl.tar.xz [ -f "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" ] || wget -c "$TYPST_URL" -O "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" tar -C "$REPOS/typst/$TARGET/$TYPST_VERSION" -xJf "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" cp -av "$REPOS/typst/$TARGET/$TYPST_VERSION/typst-x86_64-unknown-linux-musl/typst" "$PREFIX/bin/" ;; (linux-aarch64) TYPST_URL=https://github.com/typst/typst/releases/download/${TYPST_VERSION}/typst-aarch64-unknown-linux-musl.tar.xz [ -f "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" ] || wget -c "$TYPST_URL" -O "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" tar -C "$REPOS/typst/$TARGET/$TYPST_VERSION" -xJf "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" cp -av "$REPOS/typst/$TARGET/$TYPST_VERSION/typst-aarch64-unknown-linux-musl/typst" "$PREFIX/bin/" ;; (windows-x86_64) TYPST_URL=https://github.com/typst/typst/releases/download/${TYPST_VERSION}/typst-x86_64-pc-windows-msvc.zip [ -f "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" ] || wget -c "$TYPST_URL" -O "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" unzip -o -q "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" -d "$REPOS/typst/$TARGET/$TYPST_VERSION/" cp -av "$REPOS/typst/$TARGET/$TYPST_VERSION/typst-x86_64-pc-windows-msvc/typst.exe" "$PREFIX/bin/" ;; (macos-x86_64) TYPST_URL=https://github.com/typst/typst/releases/download/${TYPST_VERSION}/typst-x86_64-apple-darwin.tar.xz [ -f "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" ] || wget -c "$TYPST_URL" -O "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" tar -C "$REPOS/typst/$TARGET/$TYPST_VERSION" -xJf "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" cp -av "$REPOS/typst/$TARGET/$TYPST_VERSION/typst-x86_64-apple-darwin/typst" "$PREFIX/bin/" ;; (macos-aarch64) TYPST_URL=https://github.com/typst/typst/releases/download/${TYPST_VERSION}/typst-aarch64-apple-darwin.tar.xz [ -f "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" ] || wget -c "$TYPST_URL" -O "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" tar -C "$REPOS/typst/$TARGET/$TYPST_VERSION" -xJf "$REPOS/typst/$TARGET/$TYPST_VERSION/$(basename "$TYPST_URL")" cp -av "$REPOS/typst/$TARGET/$TYPST_VERSION/typst-aarch64-apple-darwin/typst" "$PREFIX/bin/" ;; (*) echo "$(target): unsupported platform for Typst"; exit 1 ;; esac typst_installed=true } ypp_installed=false install-ypp() { $ypp_installed && return figlet ypp gitclone https://github.com/CDSoft/ypp ninja clean -C $REPOS/ypp PREFIX=$PREFIX ninja install -C $REPOS/ypp luax-target ypp "$(ls $REPOS/ypp/src/*.lua)" "$(ls $REPOS/ypp/.build/src/*.lua)" ypp_installed=true } main() { local args=() while [ -n "$1" ] do case "$1" in (-p) PREFIX="$2"; shift 2;; (-t) TARGET="$2"; shift 2;; (-*) echo "$1: unknown option"; exit 1 ;; (*) args+=("$1"); shift 1 ;; esac done PREFIX=$(realpath "$PREFIX") local cmd="${args[0]}" unset "args[0]" #set -x case "$cmd" in (""|help) cmd-help ;; (list) cmd-list ;; (clean) cmd-clean ;; (install) echo "Installation prefix: $PREFIX" check-prerequisites cmd-install "${args[@]}" ;; (*) echo "$cmd: unknown command"; exit 1 ;; esac set +x } main "$@"