#!/bin/sh set -eu cd -- "$(dirname "$0")/../sub/lib" . ./log.sh . ./flag.sh . ./release.sh cd - >/dev/null help() { arg0="$0" if [ "$0" = sh ]; then arg0="curl -fsSL https://d2lang.com/install.sh | sh -s --" fi cat </dev/null; then echoerr "no version of d2 installed" return 1 fi INSTALLED_VERSION="$(d2 version)" if ! uninstall_standalone; then echoerr "failed to uninstall $INSTALLED_VERSION" return 1 fi return 0 fi VERSION=${VERSION:-latest} if [ "$VERSION" = latest ]; then VERSION=$(fetch_version_info) fi # TODO: --tala, --tala-version 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_standalone; then warn "failed to uninstall $INSTALLED_VERSION" fi fi install_standalone } install_standalone() { ARCHIVE="d2-$VERSION-$OS-$ARCH.tar.gz" log "installing standalone release $ARCHIVE from github" VERSION=$(fetch_version_info) asset_line=$(cat "$CACHE_DIR/$VERSION.json" | grep -n "$ARCHIVE" | cut -d: -f1 | head -n1) asset_url=$(sed -n $((asset_line-3))p "$CACHE_DIR/$VERSION.json" | sed 's/^.*: "\(.*\)",$/\1/g') fetch_gh "$asset_url" "$CACHE_DIR/$ARCHIVE" 'application/octet-stream' sh_c tar -C "$DATA_DIR" -xzf "$CACHE_DIR/$ARCHIVE" sh_c cd "$DATA_DIR/d2-$VERSION" sh_c="sh_c" if ! is_prefix_writable; then sh_c="sudo_sh_c" fi "$sh_c" make install PREFIX="$PREFIX" } uninstall_standalone() { log "uninstalling standalone release d2-$INSTALLED_VERSION" if [ ! -e "$DATA_DIR/d2-$INSTALLED_VERSION" ]; then echoerr "no standalone release directory for d2-$INSTALLED_VERSION" return 1 fi sh_c cd "$DATA_DIR/d2-$INSTALLED_VERSION" sh_c="sh_c" if ! is_prefix_writable; then sh_c="sudo_sh_c" fi "$sh_c" make uninstall PREFIX="$PREFIX" sh_c rm -rf "$DATA_DIR/d2-$INSTALLED_VERSION" sh_c rm -rf "$CACHE_DIR/$INSTALLED_VERSION.json" sh_c rm -rf "$CACHE_DIR/d2-$INSTALLED_VERSION-$OS-$ARCH.tar.gz" } is_prefix_writable() { sh_c mkdir -p "$PREFIX" 2>/dev/null || true # 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 } data_dir() { if [ -n "${XDG_DATA_HOME-}" ]; then echo "$XDG_DATA_HOME/d2/release" elif [ -n "${HOME-}" ]; then echo "$HOME/.local/d2/release" else echo "/tmp/d2-data/release" fi } fetch_version_info() { req_version=$VERSION if [ -e "$CACHE_DIR/$req_version.json" ]; then echo "$VERSION" return 0 fi log "fetching info on version $req_version" rm -f "$CACHE_DIR/req_version.json" if [ "$req_version" = latest ]; then release_info_url="https://api.github.com/repos/$REPO/releases/$req_version" else release_info_url="https://api.github.com/repos/$REPO/releases/tags/$req_version" fi fetch_gh "$release_info_url" "$CACHE_DIR/$req_version.json" \ 'application/json' VERSION=$(cat "$CACHE_DIR/$req_version.json" | grep -m1 tag_name | sed 's/^.*: "\(.*\)",$/\1/g') if [ "$req_version" = latest ]; then sh_c mv "$CACHE_DIR/$req_version.json" "$CACHE_DIR/$VERSION.json" fi echo "$VERSION" } 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" } main "$@"