From 944dcd7d4b8eda10b62d85ea4ebf900f6fd77c9a Mon Sep 17 00:00:00 2001 From: Buddy Sandidge Date: Wed, 3 Nov 2021 11:03:28 -0700 Subject: [PATCH] Add github helper util functions --- base/.config/bash/prompt.sh | 9 +-- base/.config/profile/profile.d/base.sh | 13 ++- base/.local/share/buddy-up/includes/github.sh | 31 +++++++ base/.local/share/buddy-up/includes/utils.sh | 80 +++++++++---------- base/.profile | 5 +- node/.local/bin/install-node-home | 11 ++- node/.local/bin/install-node-system | 3 + node/.local/share/buddy-up/includes/node.sh | 23 +++--- 8 files changed, 105 insertions(+), 70 deletions(-) create mode 100644 base/.local/share/buddy-up/includes/github.sh diff --git a/base/.config/bash/prompt.sh b/base/.config/bash/prompt.sh index 9fac59c..c39aaa2 100644 --- a/base/.config/bash/prompt.sh +++ b/base/.config/bash/prompt.sh @@ -15,7 +15,7 @@ bblack='\e[1;30m' PS1="\[$green\]"'\u '"\[$blue\]"'$(hostname -s | tr ':A-Z:' ':a-z:') '"\[$green\]\w " if command -v git &> /dev/null ; then - function parse_git_status { + parse_git_status () ( if [[ $(git status 2> /dev/null | wc -l) -eq 0 ]]; then return fi @@ -23,11 +23,11 @@ if command -v git &> /dev/null ; then if [[ $(git status 2> /dev/null | grep -c "working tree clean") -eq 0 ]]; then echo ' ∓' fi - } + ) - function parse_git_branch { + parse_git_branch () ( git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' - } + ) # display git branch PS1="$PS1\[$bblack\]"'$(parse_git_branch)' # display git status @@ -37,4 +37,3 @@ fi # display date PS1="$PS1\[$purple\]\D{%F %I:%M%P} " PS1="$PS1\[$color_off\]\nλ " - diff --git a/base/.config/profile/profile.d/base.sh b/base/.config/profile/profile.d/base.sh index d2229ad..4e7a334 100644 --- a/base/.config/profile/profile.d/base.sh +++ b/base/.config/profile/profile.d/base.sh @@ -3,19 +3,18 @@ alias slugify="sed -e 's/[^[:alnum:]]/-/g' | tr -s '-' | tr A-Z a-z" source_env_file () { - file="${1}" - if [ ! -f "${file}" ]; then + if [ ! -f "${1}" ]; then return fi eval "$( - grep -v '^\s*\#' "${file}" | + grep -v '^\s*\#' "${1}" | grep -v '^\s*$' | sed 's/^\s*export//g' | sed 's/^/export /g' )" } -add_date_prefix () { +add_date_prefix () ( DIR=$(dirname "$1") FILE=$(basename "$1") DATE=$(date -r "$1" +"%F") @@ -24,9 +23,9 @@ add_date_prefix () { return fi mv "$1" "$DIR/${DATE}_${FILE}" -} +) -get_bitrate () { +get_bitrate () ( if [ ! -f "$1" ] ; then echo "[ERROR] unknown file: $1" return @@ -36,4 +35,4 @@ get_bitrate () { return fi exiftool -AudioBitrate "$1" | awk '{print $4}' -} +) diff --git a/base/.local/share/buddy-up/includes/github.sh b/base/.local/share/buddy-up/includes/github.sh new file mode 100644 index 0000000..bfce802 --- /dev/null +++ b/base/.local/share/buddy-up/includes/github.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +latest_download () ( + FILTER='import "github" as gh; gh::latest_download(env.OS; env.ARCH)' + OS=${2} ARCH="${3}" jq --raw-output "${FILTER}" <"$(release_json "${1}")" +) + +latest_type () ( + FILTER='import "github" as gh; gh::latest_type(env.OS; env.ARCH)' + OS=${2} ARCH="${3}" jq --raw-output "${FILTER}" <"$(release_json "${1}")" +) + +latest_version () ( + FILTER='import "github" as gh; gh::latest_version' + jq --raw-output "${FILTER}" <"$(release_json "${1}")" +) + +age_in_seconds () ( + echo $(( $(date +"%s") - $(stat -c "%Y" "${1}") )) +) + +release_json () ( + DAY=$((60 * 60 * 24)) + PROJECT=$1 + JSON=${XDG_CACHE_HOME}/apps/meta/${PROJECT}/releases.json + mkdir -p "$(dirname "${JSON}")" + if [[ ! -f "${JSON}" || "$(age_in_seconds "${JSON}")" -gt "${DAY}" ]]; then + curl --silent --output "${JSON}" "https://api.github.com/repos/${PROJECT}/releases" + fi + echo "${JSON}" +) diff --git a/base/.local/share/buddy-up/includes/utils.sh b/base/.local/share/buddy-up/includes/utils.sh index c584084..67df74c 100644 --- a/base/.local/share/buddy-up/includes/utils.sh +++ b/base/.local/share/buddy-up/includes/utils.sh @@ -1,29 +1,29 @@ #ft=bash -bail () { +bail () ( >&2 echo "ERROR: $1" exit 1 -} +) -must_be_root () { +must_be_root () ( if [ "$(id --user)" != 0 ]; then bail "must run as root" fi -} +) -set_link () { - TARGET="$1" - APP_DIR="$2" - APP_PATH="$3" +set_link () ( + TARGET=${1} + APP_DIR=${2} + APP_PATH=${3:-} pushd "$(dirname "${TARGET}")" >/dev/null || exit 1 unlink_if_set "${TARGET}" REL_PATH=$(relative_path "$(dirname "${TARGET}")" "${APP_DIR}/current/${APP_PATH}") ln -s "${REL_PATH}" "$(basename "${TARGET}")" popd >/dev/null || exit 1 -} +) -get_os () { +get_os () ( case $(uname -s) in Linux*) echo linux;; Darwin*) echo darwin;; @@ -36,9 +36,9 @@ get_os () { CYGWIN_NT*) echo windows;; *) >&2 echo "unsupported os"; return; esac -} +) -get_arch () { +get_arch () ( case $(uname -m) in x86_64*) echo amd64;; amd64*) echo amd64;; @@ -51,43 +51,43 @@ get_arch () { aarch64*) echo arm64;; *) >&2 echo "unsupported architecture: $(uname -m)"; exit 1;; esac -} +) -set_current_link () { - prefix="${1}" - version="${2}" - sudo="${3}" +set_current_link () ( + prefix=${1} + version=${2} + sudo=${3:-} current="${prefix}/current" if [ -L "${current}" ] ; then $sudo unlink "${current}" fi rel="$(relative_path "${prefix}" "${prefix}/${version}")" $sudo ln -s "$rel" "${current}" -} +) -unlink_if_set () { - dir="$1" - sudo="$2" +unlink_if_set () ( + dir=$1 + sudo=${2:-} if [ -L "${dir}" ]; then # shellcheck disable=SC2086 ${sudo} unlink "${dir}" fi -} +) -mkdir_if_missing () { - dir="$1" - sudo=$2 +mkdir_if_missing () ( + dir=${1} + sudo=${2:-} if [ ! -d "${dir}" ]; then # shellcheck disable=SC2086 $sudo mkdir -p "${dir}" fi -} +) -extract_zip () { - url="${1}" - dest="${2}" - args="${3}" - sudo="${4}" +extract_zip () ( + url=${1} + dest=${2} + args=${3} + sudo=${4:-} if [ -d "${dest}" ]; then return fi @@ -99,13 +99,13 @@ extract_zip () { # shellcheck disable=SC2086 $sudo unzip -o "${zipfile}" -d "${dest}" ${args} rm -rf "${tmp_dir}" -} +) -extract_tarball () { - url="${1}" - dest="${2}" - args="${3}" - sudo="${4}" +extract_tarball () ( + url=${1} + dest=${2} + args=${3} + sudo=${4:-} if [ -d "${dest}" ]; then return fi @@ -117,9 +117,9 @@ extract_tarball () { # shellcheck disable=SC2086 $sudo tar xf "${tarball}" --directory "${dest}" ${args} rm -rf "${tmp_dir}" -} +) -relative_path() { +relative_path() ( # both $1 and $2 are absolute paths beginning with / # $1 must be a canonical path; that is none of its directory # components may be ".", ".." or a symbolic link @@ -161,4 +161,4 @@ relative_path() { fi printf '%s' "$result" -} +) diff --git a/base/.profile b/base/.profile index 006b47c..f1d7d72 100644 --- a/base/.profile +++ b/base/.profile @@ -30,12 +30,11 @@ fi export XDG_RUNTIME_DIR env_file () { - file="${1}" - if [ ! -f "${file}" ]; then + if [ ! -f "${1}" ]; then return fi eval "$( - grep -v '^\s*\#' "${file}" | + grep -v '^\s*\#' "${1}" | grep -v '^\s*$' | sed 's/^\s*export//g' | sed 's/^/export /g' diff --git a/node/.local/bin/install-node-home b/node/.local/bin/install-node-home index 40c89b7..dadc126 100755 --- a/node/.local/bin/install-node-home +++ b/node/.local/bin/install-node-home @@ -1,13 +1,16 @@ #!/usr/bin/env bash -set -e +set -euo pipefail # shellcheck disable=SC1090 source "${XDG_DATA_HOME}/buddy-up/includes/node.sh" -VERSION=${VERSION:-14.17.6} -DEST="${XDG_DATA_HOME}/apps/releases/node" -CURRENT="${DEST}/current" +VERSION=${VERSION:-node_lts} +DEST=${XDG_DATA_HOME}/apps/releases/node +CURRENT=${DEST}/current + +# shellcheck disable=SC2034 +URL=https://nodejs.org/dist/${VERSION}/node-${VERSION}-$(get_os)-$(get_arch).tar.xz extract_tarball "${URL}" "${DEST}/${VERSION}" "--strip-components 1" set_current_link "${DEST}" "${VERSION}" diff --git a/node/.local/bin/install-node-system b/node/.local/bin/install-node-system index 8ddf964..c00f554 100755 --- a/node/.local/bin/install-node-system +++ b/node/.local/bin/install-node-system @@ -9,6 +9,9 @@ PREFIX=${PREFIX:-/usr/local} DEST="${PREFIX}/apps/releases/node" CURRENT="${DEST}/current" +# shellcheck disable=SC2034 +URL=https://nodejs.org/dist/${VERSION}/node-${VERSION}-$(get_os)-$(get_arch).tar.xz + extract_tarball "${URL}" "${DEST}/${VERSION}" "--strip-components 1" sudo set_current_link "${DEST}" "${VERSION}" sudo diff --git a/node/.local/share/buddy-up/includes/node.sh b/node/.local/share/buddy-up/includes/node.sh index c216ad5..f521e6a 100644 --- a/node/.local/share/buddy-up/includes/node.sh +++ b/node/.local/share/buddy-up/includes/node.sh @@ -3,7 +3,12 @@ # shellcheck disable=SC1090 source "${XDG_DATA_HOME}/buddy-up/includes/utils.sh" -get_arch () { +node_lts () ( + curl --silent https://nodejs.org/dist/index.tab | + cut -f 1,10 | grep '-' | head -n 1 | cut -f 1 +) + +get_arch () ( case $(uname -m) in x86_64*) echo x64;; amd64*) echo x64;; @@ -14,12 +19,12 @@ get_arch () { aarch64*) echo arm64;; *) >&2 echo "unsupported architecture: $(uname -m)"; exit 1;; esac -} +) -set_symlink () { - src="$1" - dest="$2" - sudo="$3" +set_symlink () ( + src=${1} + dest=${2} + sudo=${3:-} dest_dir=$(dirname "${dest}") mkdir_if_missing "${dest_dir}" "$sudo" @@ -27,8 +32,4 @@ set_symlink () { unlink_if_set "${dest}" "${sudo}" $sudo ln -s "$(relative_path "${dest_dir}" "${src}")" "$(basename "${dest}")" popd > /dev/null || exit 1 -} - -VERSION=${VERSION:-v14.17.3} -# shellcheck disable=SC2034 -URL=https://nodejs.org/dist/${VERSION}/node-${VERSION}-$(get_os)-$(get_arch).tar.xz +)