#!/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 "$@"