2022-11-14 05:58:55 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
set -eu
|
|
|
|
|
|
|
|
|
|
# *************
|
|
|
|
|
# DO NOT EDIT
|
|
|
|
|
#
|
|
|
|
|
# install.sh was bundled together from
|
|
|
|
|
#
|
|
|
|
|
# - ./ci/sub/lib/rand.sh
|
|
|
|
|
# - ./ci/sub/lib/log.sh
|
|
|
|
|
# - ./ci/sub/lib/flag.sh
|
2022-11-14 11:40:35 +00:00
|
|
|
# - ./ci/sub/lib/release.sh
|
2022-11-14 05:58:55 +00:00
|
|
|
# - ./ci/release/_install.sh
|
|
|
|
|
#
|
|
|
|
|
# The last of which implements the installation logic.
|
|
|
|
|
#
|
|
|
|
|
# Generated by ./ci/release/gen_install.sh.
|
|
|
|
|
# *************
|
|
|
|
|
|
|
|
|
|
#!/bin/sh
|
|
|
|
|
if [ "${LIB_RAND-}" ]; then
|
|
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
LIB_RAND=1
|
|
|
|
|
|
|
|
|
|
rand() {
|
|
|
|
|
seed="$1"
|
|
|
|
|
range="$2"
|
|
|
|
|
|
|
|
|
|
seed_file="$(mktemp)"
|
|
|
|
|
_echo "$seed" | md5sum > "$seed_file"
|
|
|
|
|
shuf -i "$range" -n 1 --random-source="$seed_file"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pick() {
|
|
|
|
|
seed="$1"
|
|
|
|
|
shift
|
|
|
|
|
i="$(rand "$seed" "1-$#")"
|
|
|
|
|
eval "_echo \"\$$i\""
|
|
|
|
|
}
|
|
|
|
|
#!/bin/sh
|
|
|
|
|
if [ "${LIB_LOG-}" ]; then
|
|
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
LIB_LOG=1
|
|
|
|
|
|
|
|
|
|
tput() {
|
|
|
|
|
if [ -n "$TERM" ]; then
|
|
|
|
|
command tput "$@"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setaf() {
|
|
|
|
|
tput setaf "$1"
|
|
|
|
|
shift
|
|
|
|
|
printf '%s' "$*"
|
|
|
|
|
tput sgr0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_echo() {
|
|
|
|
|
printf '%s\n' "$*"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get_rand_color() {
|
|
|
|
|
# 1-6 are regular and 9-14 are bright.
|
|
|
|
|
# 1,2 and 9,10 are red and green but we use those for success and failure.
|
|
|
|
|
pick "$*" 3 4 5 6 11 12 13 14
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
echop() {
|
|
|
|
|
prefix="$1"
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
if [ "$#" -gt 0 ]; then
|
|
|
|
|
printfp "$prefix" "%s\n" "$*"
|
|
|
|
|
else
|
|
|
|
|
printfp "$prefix"
|
|
|
|
|
printf '\n'
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printfp() {(
|
|
|
|
|
prefix="$1"
|
|
|
|
|
shift
|
|
|
|
|
|
|
|
|
|
if [ -z "${COLOR:-}" ]; then
|
|
|
|
|
COLOR="$(get_rand_color "$prefix")"
|
|
|
|
|
fi
|
|
|
|
|
printf '%s' "$(setaf "$COLOR" "$prefix")"
|
|
|
|
|
|
|
|
|
|
if [ $# -gt 0 ]; then
|
|
|
|
|
printf ': '
|
|
|
|
|
printf "$@"
|
|
|
|
|
fi
|
|
|
|
|
)}
|
|
|
|
|
|
|
|
|
|
catp() {
|
|
|
|
|
prefix="$1"
|
|
|
|
|
shift
|
|
|
|
|
|
2022-11-14 10:48:47 +00:00
|
|
|
sed "s/^/$(printfp "$prefix" '')/"
|
2022-11-14 05:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
repeat() {
|
|
|
|
|
char="$1"
|
|
|
|
|
times="$2"
|
|
|
|
|
seq -s "$char" "$times" | tr -d '[:digit:]'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strlen() {
|
|
|
|
|
printf %s "$1" | wc -c
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
echoerr() {
|
2022-11-14 10:48:47 +00:00
|
|
|
COLOR=1 echop err "$*" | humanpath>&2
|
2022-11-14 05:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
caterr() {
|
2022-11-14 10:48:47 +00:00
|
|
|
COLOR=1 catp err "$@" | humanpath >&2
|
2022-11-14 05:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printferr() {
|
2022-11-14 10:48:47 +00:00
|
|
|
COLOR=1 printfp err "$@" | humanpath >&2
|
2022-11-14 05:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logp() {
|
2022-11-14 10:48:47 +00:00
|
|
|
echop "$@" | humanpath >&2
|
2022-11-14 05:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logfp() {
|
2022-11-14 10:48:47 +00:00
|
|
|
printfp "$@" | humanpath >&2
|
2022-11-14 05:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logpcat() {
|
2022-11-14 10:48:47 +00:00
|
|
|
catp "$@" | humanpath >&2
|
2022-11-14 05:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log() {
|
|
|
|
|
COLOR=5 logp log "$@"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logf() {
|
|
|
|
|
COLOR=5 logfp log "$@"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logcat() {
|
|
|
|
|
COLOR=5 catp log "$@" >&2
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 06:41:58 +00:00
|
|
|
warn() {
|
|
|
|
|
COLOR=3 logp warn "$@"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
warnf() {
|
|
|
|
|
COLOR=3 logfp warn "$@"
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 05:58:55 +00:00
|
|
|
sh_c() {
|
|
|
|
|
COLOR=3 logp exec "$*"
|
2022-11-14 07:20:30 +00:00
|
|
|
if [ -z "${DRY_RUN-}" ]; then
|
2022-11-14 05:58:55 +00:00
|
|
|
eval "$@"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 10:48:47 +00:00
|
|
|
sudo_sh_c() {
|
|
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
|
|
|
sh_c "$@"
|
|
|
|
|
elif command -v doas >/dev/null; then
|
|
|
|
|
sh_c "doas $*"
|
|
|
|
|
elif command -v sudo >/dev/null; then
|
|
|
|
|
sh_c "sudo $*"
|
|
|
|
|
elif command -v su >/dev/null; then
|
|
|
|
|
sh_c "su root -c '$*'"
|
|
|
|
|
else
|
|
|
|
|
caterr <<EOF
|
|
|
|
|
This script needs to run the following command as root:
|
|
|
|
|
$*
|
|
|
|
|
Please install doas, sudo, or su.
|
|
|
|
|
EOF
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 05:58:55 +00:00
|
|
|
header() {
|
|
|
|
|
logp "/* $1 */"
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 10:48:47 +00:00
|
|
|
# humanpath replaces all occurrences of $HOME with ~
|
|
|
|
|
humanpath() {
|
|
|
|
|
if [ -z "${HOME-}" ]; then
|
|
|
|
|
cat
|
|
|
|
|
else
|
|
|
|
|
sed "s#$HOME#~#g"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 05:58:55 +00:00
|
|
|
hide() {
|
|
|
|
|
out="$(mktemp)"
|
|
|
|
|
set +e
|
|
|
|
|
"$@" >"$out" 2>&1
|
|
|
|
|
code="$?"
|
|
|
|
|
set -e
|
|
|
|
|
if [ "$code" -eq 0 ]; then
|
|
|
|
|
return
|
|
|
|
|
fi
|
|
|
|
|
cat "$out" >&2
|
|
|
|
|
exit "$code"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
echo_dur() {
|
|
|
|
|
local dur=$1
|
|
|
|
|
local h=$((dur/60/60))
|
|
|
|
|
local m=$((dur/60%60))
|
|
|
|
|
local s=$((dur%60))
|
|
|
|
|
printf '%dh%dm%ds' "$h" "$m" "$s"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sponge() {
|
|
|
|
|
dst="$1"
|
|
|
|
|
tmp="$(mktemp)"
|
|
|
|
|
cat > "$tmp"
|
|
|
|
|
cat "$tmp" > "$dst"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stripansi() {
|
|
|
|
|
# First regex gets rid of standard xterm escape sequences for controlling
|
|
|
|
|
# visual attributes.
|
|
|
|
|
# The second regex I'm not 100% sure, the reference says it selects the US
|
|
|
|
|
# encoding but I'm not sure why that's necessary or why it always occurs
|
|
|
|
|
# in tput sgr0 before the standard escape sequence.
|
|
|
|
|
# See tput sgr0 | xxd
|
|
|
|
|
sed -e $'s/\x1b\[[0-9;]*m//g' -e $'s/\x1b(.//g'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
runtty() {
|
|
|
|
|
case "$(uname)" in
|
|
|
|
|
Darwin)
|
|
|
|
|
script -q /dev/null "$@"
|
|
|
|
|
;;
|
|
|
|
|
Linux)
|
|
|
|
|
script -eqc "$*"
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echoerr "runtty: unsupported OS $(uname)"
|
|
|
|
|
return 1
|
|
|
|
|
esac
|
|
|
|
|
}
|
|
|
|
|
#!/bin/sh
|
|
|
|
|
if [ "${LIB_FLAG-}" ]; then
|
|
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
LIB_FLAG=1
|
|
|
|
|
|
|
|
|
|
# flag_parse implements a robust flag parser.
|
|
|
|
|
#
|
|
|
|
|
# For a full fledge example see ../examples/date.sh
|
|
|
|
|
#
|
|
|
|
|
# It differs from getopts(1) in that long form options are supported. Currently the only
|
|
|
|
|
# deficiency is that short combined options are not supported like -xyzq. That would be
|
|
|
|
|
# interpreted as a single -xyzq flag. The other deficiency is lack of support for short
|
|
|
|
|
# flag syntax like -carg where the arg is not separated from the flag. This one is
|
|
|
|
|
# unfixable I believe unfortunately but for combined short flags I have opened
|
|
|
|
|
# https://github.com/terrastruct/ci/issues/6
|
|
|
|
|
#
|
|
|
|
|
# flag_parse stores state in $FLAG, $FLAGRAW, $FLAGARG and $FLAGSHIFT.
|
|
|
|
|
# FLAG contains the name of the flag without hyphens.
|
|
|
|
|
# FLAGRAW contains the name of the flag as passed in with hyphens.
|
|
|
|
|
# FLAGARG contains the argument for the flag if there was any.
|
|
|
|
|
# If there was none, it will not be set.
|
|
|
|
|
# FLAGSHIFT contains the number by which the arguments should be shifted to
|
|
|
|
|
# start at the next flag/argument
|
|
|
|
|
#
|
|
|
|
|
# After each call check $FLAG for the name of the parsed flag.
|
|
|
|
|
# If empty, then no more flags are left.
|
|
|
|
|
# Still, call shift "$FLAGSHIFT" in case there was a --
|
|
|
|
|
#
|
|
|
|
|
# If the argument for the flag is optional, then use ${FLAGARG-} to access
|
|
|
|
|
# the argument if one was passed. Use ${FLAGARG+x} = x to check if it was set.
|
|
|
|
|
# You only need to explicitly check if the flag was set if you care whether the user
|
|
|
|
|
# explicitly passed the empty string as the argument.
|
|
|
|
|
#
|
|
|
|
|
# Otherwise, call one of the flag_*arg functions:
|
|
|
|
|
#
|
|
|
|
|
# If a flag requires an argument, call flag_reqarg
|
|
|
|
|
# - $FLAGARG is guaranteed to be set after.
|
|
|
|
|
# If a flag requires a non empty argument, call flag_nonemptyarg
|
|
|
|
|
# - $FLAGARG is guaranteed to be set to a non empty string after.
|
|
|
|
|
# If a flag should not be passed an argument, call flag_noarg
|
|
|
|
|
# - $FLAGARG is guaranteed to be unset after.
|
|
|
|
|
#
|
|
|
|
|
# And then shift "$FLAGSHIFT"
|
|
|
|
|
flag_parse() {
|
|
|
|
|
case "${1-}" in
|
|
|
|
|
-*=*)
|
|
|
|
|
# Remove everything after first equal sign.
|
|
|
|
|
FLAG="${1%%=*}"
|
|
|
|
|
# Remove leading hyphens.
|
|
|
|
|
FLAG="${FLAG#-}"; FLAG="${FLAG#-}"
|
2022-11-14 07:20:30 +00:00
|
|
|
FLAGRAW="$(flag_fmt)"
|
2022-11-14 05:58:55 +00:00
|
|
|
# Remove everything before first equal sign.
|
|
|
|
|
FLAGARG="${1#*=}"
|
|
|
|
|
FLAGSHIFT=1
|
|
|
|
|
;;
|
|
|
|
|
-)
|
|
|
|
|
FLAG=
|
|
|
|
|
FLAGRAW=
|
|
|
|
|
unset FLAGARG
|
|
|
|
|
FLAGSHIFT=0
|
|
|
|
|
;;
|
|
|
|
|
--)
|
|
|
|
|
FLAG=
|
|
|
|
|
FLAGRAW=
|
|
|
|
|
unset FLAGARG
|
|
|
|
|
FLAGSHIFT=1
|
|
|
|
|
;;
|
|
|
|
|
-*)
|
|
|
|
|
# Remove leading hyphens.
|
|
|
|
|
FLAG="${1#-}"; FLAG="${FLAG#-}"
|
2022-11-14 07:20:30 +00:00
|
|
|
FLAGRAW=$(flag_fmt)
|
2022-11-14 05:58:55 +00:00
|
|
|
unset FLAGARG
|
|
|
|
|
FLAGSHIFT=1
|
|
|
|
|
if [ $# -gt 1 ]; then
|
|
|
|
|
case "$2" in
|
|
|
|
|
-)
|
|
|
|
|
FLAGARG="$2"
|
|
|
|
|
FLAGSHIFT=2
|
|
|
|
|
;;
|
|
|
|
|
-*)
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
FLAGARG="$2"
|
|
|
|
|
FLAGSHIFT=2
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
FLAG=
|
|
|
|
|
FLAGRAW=
|
|
|
|
|
unset FLAGARG
|
|
|
|
|
FLAGSHIFT=0
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flag_reqarg() {
|
|
|
|
|
if [ "${FLAGARG+x}" != x ]; then
|
|
|
|
|
flag_errusage "flag $FLAGRAW requires an argument"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flag_nonemptyarg() {
|
|
|
|
|
flag_reqarg
|
|
|
|
|
if [ -z "$FLAGARG" ]; then
|
|
|
|
|
flag_errusage "flag $FLAGRAW requires a non-empty argument"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flag_noarg() {
|
|
|
|
|
if [ "$FLAGSHIFT" -eq 2 ]; then
|
|
|
|
|
unset FLAGARG
|
|
|
|
|
FLAGSHIFT=1
|
|
|
|
|
elif [ "${FLAGARG+x}" = x ]; then
|
|
|
|
|
# Means an argument was passed via equal sign as in -$FLAG=$FLAGARG
|
|
|
|
|
flag_errusage "flag $FLAGRAW does not accept an argument"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flag_errusage() {
|
|
|
|
|
caterr <<EOF
|
|
|
|
|
$1
|
|
|
|
|
Run with --help for usage.
|
|
|
|
|
EOF
|
|
|
|
|
return 1
|
|
|
|
|
}
|
2022-11-14 07:20:30 +00:00
|
|
|
|
|
|
|
|
flag_fmt() {
|
|
|
|
|
if [ "$(printf %s "$FLAG" | wc -c)" -eq 1 ]; then
|
|
|
|
|
echo "-$FLAG"
|
|
|
|
|
else
|
|
|
|
|
echo "--$FLAG"
|
|
|
|
|
fi
|
|
|
|
|
}
|
2022-11-14 05:58:55 +00:00
|
|
|
#!/bin/sh
|
2022-11-14 10:48:47 +00:00
|
|
|
if [ "${LIB_RELEASE-}" ]; then
|
|
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
LIB_RELEASE=1
|
|
|
|
|
|
|
|
|
|
goos() {
|
|
|
|
|
case $1 in
|
|
|
|
|
macos) echo darwin ;;
|
|
|
|
|
*) echo $1 ;;
|
|
|
|
|
esac
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
os() {
|
|
|
|
|
uname=$(uname)
|
|
|
|
|
case $uname in
|
|
|
|
|
Linux) echo linux ;;
|
|
|
|
|
Darwin) echo macos ;;
|
|
|
|
|
FreeBSD) echo freebsd ;;
|
|
|
|
|
*) echo "$uname" ;;
|
|
|
|
|
esac
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
arch() {
|
|
|
|
|
uname_m=$(uname -m)
|
|
|
|
|
case $uname_m in
|
|
|
|
|
aarch64) echo arm64 ;;
|
|
|
|
|
x86_64) echo amd64 ;;
|
|
|
|
|
*) echo "$uname_m" ;;
|
|
|
|
|
esac
|
|
|
|
|
}
|
|
|
|
|
#!/bin/sh
|
2022-11-14 05:58:55 +00:00
|
|
|
set -eu
|
|
|
|
|
|
|
|
|
|
|
2022-11-14 06:41:58 +00:00
|
|
|
help() {
|
|
|
|
|
arg0="$0"
|
|
|
|
|
if [ "$0" = sh ]; then
|
|
|
|
|
arg0="curl -fsSL https://d2lang.com/install.sh | sh -s --"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
cat <<EOF
|
2022-11-14 10:48:47 +00:00
|
|
|
usage: $arg0 [--dry-run] [--version vX.X.X] [--edge] [--method detect] [--prefix /usr/local]
|
2022-11-14 11:40:35 +00:00
|
|
|
[--tala latest] [--force] [--uninstall]
|
2022-11-14 06:41:58 +00:00
|
|
|
|
|
|
|
|
install.sh automates the installation of D2 onto your system. It currently only supports
|
|
|
|
|
the installation of standalone releases from GitHub. If you pass --edge, it will clone the
|
|
|
|
|
source, build a release and install from it.
|
|
|
|
|
|
|
|
|
|
Flags:
|
|
|
|
|
|
2022-11-14 07:20:30 +00:00
|
|
|
--dry-run
|
2022-11-14 06:41:58 +00:00
|
|
|
Pass to have install.sh show the install method and flags that will be used to install
|
|
|
|
|
without executing them. Very useful to understand what changes it will make to your system.
|
|
|
|
|
|
|
|
|
|
--version vX.X.X
|
|
|
|
|
Pass to have install.sh install the given version instead of the latest version.
|
|
|
|
|
|
|
|
|
|
--edge
|
2022-11-14 07:20:30 +00:00
|
|
|
Pass to build and install D2 from source. This will still use --method if set to detect
|
|
|
|
|
to install the release archive for your OS, whether it's apt, yum, brew or standalone
|
|
|
|
|
if an unsupported package manager is used. To install from source like a dev would,
|
|
|
|
|
use go install oss.terrastruct.com/d2
|
|
|
|
|
note: currently unimplemented.
|
2022-11-14 06:41:58 +00:00
|
|
|
|
|
|
|
|
--method [detect | standalone]
|
|
|
|
|
Pass to control the method by which to install. Right now we only support standalone
|
|
|
|
|
releases from GitHub but later we'll add support for brew, rpm, deb and more.
|
2022-11-14 10:48:47 +00:00
|
|
|
note: currently unimplemented.
|
2022-11-14 06:41:58 +00:00
|
|
|
|
|
|
|
|
- detect is currently unimplemented but would use your OS's package manager
|
|
|
|
|
automatically.
|
2022-11-14 10:48:47 +00:00
|
|
|
- standalone installs a standalone release archive into the unix hierarchy path
|
|
|
|
|
specified by --prefix which defaults to /usr/local
|
|
|
|
|
Ensure /usr/local/bin is in your \$PATH to use it.
|
2022-11-14 06:41:58 +00:00
|
|
|
|
2022-11-14 10:48:47 +00:00
|
|
|
--prefix /usr/local
|
2022-11-14 06:41:58 +00:00
|
|
|
Controls the unix hierarchy path into which standalone releases are installed.
|
2022-11-14 10:48:47 +00:00
|
|
|
Defaults to /usr/local. You may also want to use ~/.local to avoid needing sudo.
|
2022-11-14 06:41:58 +00:00
|
|
|
Remember that whatever you use, you must have the bin directory of your prefix
|
|
|
|
|
path in \$PATH to execute the d2 binary. For example, if my prefix directory is
|
|
|
|
|
/usr/local then my \$PATH must contain /usr/local/bin.
|
|
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
--tala [latest]
|
2022-11-14 06:41:58 +00:00
|
|
|
Install Terrastruct's closed source TALA for improved layouts.
|
|
|
|
|
See https://github.com/terrastruct/TALA
|
2022-11-14 11:40:35 +00:00
|
|
|
It optionally takes an argument of the TALA version to install.
|
|
|
|
|
Installation obeys all other flags, just like the installation of d2. For example,
|
|
|
|
|
the d2plugin-tala binary will be installed into /usr/local/bin/d2plugin-tala
|
2022-11-14 06:41:58 +00:00
|
|
|
|
|
|
|
|
--force:
|
2022-11-14 10:48:47 +00:00
|
|
|
Force installation over the existing version even if they match. It will attempt a
|
2022-11-14 11:40:35 +00:00
|
|
|
uninstall first before installing the new version. The installed release tree
|
|
|
|
|
will be deleted from /usr/local/lib/d2/d2-<VERSION> but the release archive in
|
|
|
|
|
~/.cache/d2/release will remain.
|
2022-11-14 06:41:58 +00:00
|
|
|
|
|
|
|
|
--uninstall:
|
2022-11-14 10:48:47 +00:00
|
|
|
Uninstall the installed version of d2. The --method and --prefix flags must be the same
|
|
|
|
|
as for installation. i.e if you used --method standalone you must again use --method
|
|
|
|
|
standalone for uninstallation. With detect, the install script will try to use the OS
|
|
|
|
|
package manager to uninstall instead.
|
2022-11-14 06:41:58 +00:00
|
|
|
|
2022-11-14 10:48:47 +00:00
|
|
|
All downloaded archives are cached into ~/.cache/d2/release. use \$XDG_CACHE_HOME to change
|
2022-11-14 11:40:35 +00:00
|
|
|
path of the cached assets. Release archives are unarchived into /usr/local/lib/d2/d2-<VERSION>
|
2022-11-14 10:48:47 +00:00
|
|
|
|
|
|
|
|
note: Deleting the unarchived releases will cause --uninstall to stop working.
|
2022-11-14 06:41:58 +00:00
|
|
|
|
|
|
|
|
You can rerun install.sh to update your version of D2. install.sh will avoid reinstalling
|
|
|
|
|
if the installed version is the latest unless --force is passed.
|
|
|
|
|
EOF
|
|
|
|
|
}
|
2022-11-14 07:20:30 +00:00
|
|
|
|
|
|
|
|
main() {
|
2022-11-14 10:48:47 +00:00
|
|
|
if [ -n "${DEBUG-}" ]; then
|
|
|
|
|
set -x
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
METHOD=standalone
|
2022-11-14 07:20:30 +00:00
|
|
|
while :; do
|
|
|
|
|
flag_parse "$@"
|
|
|
|
|
case "$FLAG" in
|
|
|
|
|
h|help)
|
|
|
|
|
help
|
|
|
|
|
return 0
|
|
|
|
|
;;
|
|
|
|
|
dry-run)
|
|
|
|
|
flag_noarg && shift "$FLAGSHIFT"
|
|
|
|
|
DRY_RUN=1
|
|
|
|
|
;;
|
|
|
|
|
version)
|
|
|
|
|
flag_nonemptyarg && shift "$FLAGSHIFT"
|
|
|
|
|
VERSION=$FLAGARG
|
|
|
|
|
;;
|
2022-11-14 11:40:35 +00:00
|
|
|
tala)
|
|
|
|
|
shift "$FLAGSHIFT"
|
|
|
|
|
TALA=${FLAGARG:-latest}
|
2022-11-14 07:20:30 +00:00
|
|
|
;;
|
|
|
|
|
edge)
|
|
|
|
|
flag_noarg && shift "$FLAGSHIFT"
|
|
|
|
|
EDGE=1
|
|
|
|
|
echoerr "$FLAGRAW is currently unimplemented"
|
2022-11-14 11:40:35 +00:00
|
|
|
return 1
|
2022-11-14 07:20:30 +00:00
|
|
|
;;
|
|
|
|
|
method)
|
|
|
|
|
flag_nonemptyarg && shift "$FLAGSHIFT"
|
|
|
|
|
METHOD=$FLAGARG
|
|
|
|
|
echoerr "$FLAGRAW is currently unimplemented"
|
2022-11-14 11:40:35 +00:00
|
|
|
return 1
|
2022-11-14 07:20:30 +00:00
|
|
|
;;
|
|
|
|
|
prefix)
|
|
|
|
|
flag_nonemptyarg && shift "$FLAGSHIFT"
|
|
|
|
|
export PREFIX=$FLAGARG
|
|
|
|
|
;;
|
|
|
|
|
force)
|
|
|
|
|
flag_noarg && shift "$FLAGSHIFT"
|
|
|
|
|
FORCE=1
|
|
|
|
|
;;
|
|
|
|
|
uninstall)
|
|
|
|
|
flag_noarg && shift "$FLAGSHIFT"
|
|
|
|
|
UNINSTALL=1
|
|
|
|
|
;;
|
|
|
|
|
'')
|
|
|
|
|
shift "$FLAGSHIFT"
|
|
|
|
|
break
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
flag_errusage "unrecognized flag $FLAGRAW"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [ $# -gt 0 ]; then
|
|
|
|
|
flag_errusage "no arguments are accepted"
|
|
|
|
|
fi
|
2022-11-14 10:13:37 +00:00
|
|
|
|
|
|
|
|
REPO=${REPO:-terrastruct/d2}
|
2022-11-14 10:48:47 +00:00
|
|
|
PREFIX=${PREFIX:-/usr/local}
|
|
|
|
|
OS=$(os)
|
|
|
|
|
ARCH=$(arch)
|
|
|
|
|
CACHE_DIR=$(cache_dir)
|
|
|
|
|
mkdir -p "$CACHE_DIR"
|
2022-11-14 11:40:35 +00:00
|
|
|
INSTALL_DIR=$PREFIX/lib/d2
|
2022-11-14 10:48:47 +00:00
|
|
|
|
|
|
|
|
if [ -n "${UNINSTALL-}" ]; then
|
2022-11-14 12:02:23 +00:00
|
|
|
uninstall
|
2022-11-14 10:48:47 +00:00
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
VERSION=${VERSION:-latest}
|
|
|
|
|
if [ "$VERSION" = latest ]; then
|
2022-11-14 11:40:35 +00:00
|
|
|
fetch_release_info
|
2022-11-14 10:48:47 +00:00
|
|
|
fi
|
|
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
install
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
install() {
|
2022-11-14 12:02:23 +00:00
|
|
|
install_d2
|
2022-11-14 11:40:35 +00:00
|
|
|
if [ "${TALA-}" ]; then
|
2022-11-14 12:02:23 +00:00
|
|
|
install_tala
|
2022-11-14 11:40:35 +00:00
|
|
|
fi
|
2022-11-14 10:48:47 +00:00
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
COLOR=2 header success
|
|
|
|
|
log "Standalone release $ARCHIVE has been successfully installed into $PREFIX"
|
|
|
|
|
if ! echo "$PATH" | grep -qF "$PREFIX/bin"; then
|
|
|
|
|
logcat >&2 <<EOF
|
|
|
|
|
Extend your path to use d2:
|
|
|
|
|
PATH=$PREFIX/bin:\$PATH
|
|
|
|
|
Then run:
|
|
|
|
|
d2 --help
|
|
|
|
|
EOF
|
|
|
|
|
else
|
|
|
|
|
log "You may now run d2 --help"
|
|
|
|
|
fi
|
2022-11-14 10:48:47 +00:00
|
|
|
}
|
|
|
|
|
|
2022-11-14 12:02:23 +00:00
|
|
|
install_d2() {
|
|
|
|
|
if command -v d2 >/dev/null; then
|
|
|
|
|
INSTALLED_VERSION="$(d2 version)"
|
|
|
|
|
if [ ! "${FORCE-}" -a "$VERSION" = "$INSTALLED_VERSION" ]; then
|
|
|
|
|
log "skipping installation as version $VERSION is already installed."
|
|
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
log "uninstalling $INSTALLED_VERSION to install $VERSION"
|
|
|
|
|
if ! uninstall_d2; then
|
|
|
|
|
warn "failed to uninstall $INSTALLED_VERSION"
|
|
|
|
|
fi
|
2022-11-14 11:40:35 +00:00
|
|
|
fi
|
2022-11-14 12:02:23 +00:00
|
|
|
|
|
|
|
|
install_standalone_d2
|
2022-11-14 11:40:35 +00:00
|
|
|
}
|
|
|
|
|
|
2022-11-14 12:02:23 +00:00
|
|
|
install_standalone_d2() {
|
2022-11-14 10:48:47 +00:00
|
|
|
ARCHIVE="d2-$VERSION-$OS-$ARCH.tar.gz"
|
2022-11-14 11:40:35 +00:00
|
|
|
header "installing standalone release $ARCHIVE from github"
|
2022-11-14 10:48:47 +00:00
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
fetch_release_info
|
|
|
|
|
asset_line=$(cat "$RELEASE_INFO" | grep -n "$ARCHIVE" | cut -d: -f1 | head -n1)
|
|
|
|
|
asset_url=$(sed -n $((asset_line-3))p "$RELEASE_INFO" | sed 's/^.*: "\(.*\)",$/\1/g')
|
2022-11-14 10:48:47 +00:00
|
|
|
fetch_gh "$asset_url" "$CACHE_DIR/$ARCHIVE" 'application/octet-stream'
|
|
|
|
|
|
|
|
|
|
sh_c="sh_c"
|
|
|
|
|
if ! is_prefix_writable; then
|
|
|
|
|
sh_c="sudo_sh_c"
|
|
|
|
|
fi
|
2022-11-14 11:40:35 +00:00
|
|
|
|
|
|
|
|
"$sh_c" tar -C "$INSTALL_DIR" -xzf "$CACHE_DIR/$ARCHIVE"
|
|
|
|
|
"$sh_c" sh -c "'cd \"$INSTALL_DIR/d2-$VERSION\" && make install PREFIX=\"$PREFIX\"'"
|
2022-11-14 10:48:47 +00:00
|
|
|
}
|
|
|
|
|
|
2022-11-14 12:02:23 +00:00
|
|
|
install_tala() {
|
|
|
|
|
install_standalone_tala
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
install_standalone_tala() {
|
|
|
|
|
REPO="${REPO_TALA:-terrastruct/TALA}"
|
|
|
|
|
VERSION=${TALA:-latest}
|
|
|
|
|
RELEASE_INFO=
|
|
|
|
|
fetch_release_info
|
|
|
|
|
|
|
|
|
|
ARCHIVE="d2plugin-tala-$VERSION-$OS-$ARCH.tar.gz"
|
|
|
|
|
header "installing standalone release $ARCHIVE from github"
|
|
|
|
|
|
|
|
|
|
asset_line=$(cat "$RELEASE_INFO" | grep -n "$ARCHIVE" | cut -d: -f1 | head -n1)
|
|
|
|
|
asset_url=$(sed -n $((asset_line-3))p "$RELEASE_INFO" | sed 's/^.*: "\(.*\)",$/\1/g')
|
|
|
|
|
|
|
|
|
|
fetch_gh "$asset_url" "$CACHE_DIR/$ARCHIVE" 'application/octet-stream'
|
|
|
|
|
|
|
|
|
|
sh_c="sh_c"
|
|
|
|
|
if ! is_prefix_writable; then
|
|
|
|
|
sh_c="sudo_sh_c"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
"$sh_c" tar -C "$INSTALL_DIR" -xzf "$CACHE_DIR/$ARCHIVE"
|
|
|
|
|
"$sh_c" sh -c "'cd \"$INSTALL_DIR/d2plugin-tala-$VERSION\" && make install PREFIX=\"$PREFIX\"'"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uninstall() {
|
|
|
|
|
if ! command -v d2 >/dev/null; then
|
|
|
|
|
echoerr "no version of d2 installed"
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
INSTALLED_VERSION="$(d2 --version)"
|
|
|
|
|
if ! uninstall_d2; then
|
|
|
|
|
echoerr "failed to uninstall $INSTALLED_VERSION"
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
if [ "${TALA-}" ]; then
|
|
|
|
|
if ! command -v d2plugin-tala >/dev/null; then
|
|
|
|
|
echoerr "no version of d2plugin-tala installed"
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
INSTALLED_VERSION="$(d2plugin-tala --version)"
|
|
|
|
|
if ! uninstall_tala; then
|
|
|
|
|
echoerr "failed to uninstall d2plugin-tala $INSTALLED_VERSION"
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uninstall_d2() {
|
|
|
|
|
uninstall_standalone_d2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uninstall_standalone_d2() {
|
2022-11-14 11:40:35 +00:00
|
|
|
header "uninstalling standalone release d2-$INSTALLED_VERSION"
|
2022-11-14 10:48:47 +00:00
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
if [ ! -e "$INSTALL_DIR/d2-$INSTALLED_VERSION" ]; then
|
2022-11-14 12:02:23 +00:00
|
|
|
echoerr "missing standalone install release directory $INSTALL_DIR/d2-$INSTALLED_VERSION"
|
2022-11-14 10:48:47 +00:00
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
sh_c="sh_c"
|
|
|
|
|
if ! is_prefix_writable; then
|
|
|
|
|
sh_c="sudo_sh_c"
|
|
|
|
|
fi
|
|
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
"$sh_c" sh -c "'cd \"$INSTALL_DIR/d2-$INSTALLED_VERSION\" && make uninstall PREFIX=\"$PREFIX\"'"
|
|
|
|
|
"$sh_c" rm -rf "$INSTALL_DIR/d2-$INSTALLED_VERSION"
|
2022-11-14 10:13:37 +00:00
|
|
|
}
|
|
|
|
|
|
2022-11-14 12:02:23 +00:00
|
|
|
uninstall_tala() {
|
|
|
|
|
uninstall_standalone_tala
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uninstall_standalone_tala() {
|
|
|
|
|
header "uninstalling standalone release d2plugin-tala-$INSTALLED_VERSION"
|
|
|
|
|
|
|
|
|
|
if [ ! -e "$INSTALL_DIR/d2plugin-tala-$INSTALLED_VERSION" ]; then
|
|
|
|
|
echoerr "missing standalone install release directory $INSTALL_DIR/d2plugin-tala-$INSTALLED_VERSION"
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
sh_c="sh_c"
|
|
|
|
|
if ! is_prefix_writable; then
|
|
|
|
|
sh_c="sudo_sh_c"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
"$sh_c" sh -c "'cd \"$INSTALL_DIR/d2plugin-tala-$INSTALLED_VERSION\" && make uninstall PREFIX=\"$PREFIX\"'"
|
|
|
|
|
"$sh_c" rm -rf "$INSTALL_DIR/d2plugin-tala-$INSTALLED_VERSION"
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 10:48:47 +00:00
|
|
|
is_prefix_writable() {
|
2022-11-14 11:40:35 +00:00
|
|
|
sh_c "mkdir -p '$INSTALL_DIR' 2>/dev/null" || true
|
2022-11-14 10:48:47 +00:00
|
|
|
# The reason for checking whether bin is writable specifically is that on macOS you have
|
|
|
|
|
# /usr/local owned by root but you don't need root to write to its subdirectories which
|
|
|
|
|
# is all we want to do.
|
|
|
|
|
if [ ! -w "$PREFIX/bin" ]; then
|
|
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cache_dir() {
|
|
|
|
|
if [ -n "${XDG_CACHE_HOME-}" ]; then
|
|
|
|
|
echo "$XDG_CACHE_HOME/d2/release"
|
|
|
|
|
elif [ -n "${HOME-}" ]; then
|
|
|
|
|
echo "$HOME/.cache/d2/release"
|
|
|
|
|
else
|
|
|
|
|
echo "/tmp/d2-cache/release"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
fetch_release_info() {
|
|
|
|
|
if [ -n "${RELEASE_INFO-}" ]; then
|
2022-11-14 10:48:47 +00:00
|
|
|
return 0
|
|
|
|
|
fi
|
|
|
|
|
|
2022-11-14 11:40:35 +00:00
|
|
|
log "fetching info on version $VERSION"
|
|
|
|
|
RELEASE_INFO=$(mktemp -d)/release-info.json
|
|
|
|
|
if [ "$VERSION" = latest ]; then
|
|
|
|
|
release_info_url="https://api.github.com/repos/$REPO/releases/$VERSION"
|
2022-11-14 10:48:47 +00:00
|
|
|
else
|
2022-11-14 11:40:35 +00:00
|
|
|
release_info_url="https://api.github.com/repos/$REPO/releases/tags/$VERSION"
|
2022-11-14 10:48:47 +00:00
|
|
|
fi
|
2022-11-14 11:40:35 +00:00
|
|
|
fetch_gh "$release_info_url" "$RELEASE_INFO" \
|
2022-11-14 10:48:47 +00:00
|
|
|
'application/json'
|
2022-11-14 11:40:35 +00:00
|
|
|
VERSION=$(cat "$RELEASE_INFO" | grep -m1 tag_name | sed 's/^.*: "\(.*\)",$/\1/g')
|
2022-11-14 10:48:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
curl_gh() {
|
|
|
|
|
sh_c curl -fL ${GITHUB_TOKEN+"-H \"Authorization: Bearer \$GITHUB_TOKEN\""} "$@"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fetch_gh() {
|
|
|
|
|
url=$1
|
|
|
|
|
file=$2
|
|
|
|
|
accept=$3
|
|
|
|
|
|
|
|
|
|
if [ -e "$file" ]; then
|
|
|
|
|
log "reusing $file"
|
|
|
|
|
return
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
curl_gh -#o "$file.inprogress" -C- -H "'Accept: $accept'" "$url"
|
|
|
|
|
sh_c mv "$file.inprogress" "$file"
|
2022-11-14 07:20:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
main "$@"
|