#!/bin/sh # ************* # DO NOT EDIT # # lib.sh was bundled together from # # - ./ci/sub/lib/rand.sh # - ./ci/sub/lib/log.sh # - ./ci/sub/lib/release.sh # # Generated by ./ci/release/gen_template_lib.sh. # ************* #!/bin/sh if [ "${LIB_RAND-}" ]; then return 0 fi LIB_RAND=1 pick() { seed="$1" shift seed_file="$(mktemp)" echo "$seed" >"$seed_file" # We add 16 more bytes to the seed file for sufficient entropy. Otherwise Cygwin's sort # for example complains and I'm sure there are more platforms that would too. # edit: nvm disabled for now, we don't use Cygwin anyway, we use MinGW who has a sort # that behaves correctly. # echo "================" >"$seed_file" while [ $# -gt 0 ]; do echo "$1" shift done \ | sort --sort=random --random-source="$seed_file" \ | head -n1 } #!/bin/sh if [ "${LIB_LOG-}" ]; then return 0 fi LIB_LOG=1 if [ -n "${DEBUG-}" ]; then set -x fi tput() { if should_color; then TERM=${TERM:-xterm-256color} command tput "$@" fi } should_color() { if [ -n "${COLOR-}" ]; then if [ "$COLOR" = 1 -o "$COLOR" = true ]; then _COLOR=1 __COLOR=1 return 0 elif [ "$COLOR" = 0 -o "$COLOR" = false ]; then _COLOR= __COLOR=0 return 1 else printf '$COLOR must be 0, 1, false or true but got %s\n' "$COLOR" >&2 fi fi if [ -t 1 -a "${TERM-}" != dumb ]; then _COLOR=1 __COLOR=1 return 0 else _COLOR= __COLOR=0 return 1 fi } setaf() { tput setaf "$1" shift printf '%s' "$*" tput sgr0 } _echo() { printf '%s\n' "$*" } # 1-6 are regular and 9-14 are bright. get_rand_color() { colors="" ncolors=$(command tput colors) if [ "$ncolors" -ge 8 ]; then colors="$colors 1 2 3 4 5 6" elif [ "$ncolors" -ge 16 ]; then colors="$colors 9 10 11 12 13 14" fi pick "$*" $colors } echop() { prefix="$1" shift if [ "$#" -gt 0 ]; then printfp "$prefix" "%s\n" "$*" else printfp "$prefix" printf '\n' fi } printfp() {( prefix="$1" shift if [ -z "${FGCOLOR-}" ]; then FGCOLOR="$(get_rand_color "$prefix")" fi should_color || true if [ $# -eq 0 ]; then printf '%s' "$(COLOR=$__COLOR setaf "$FGCOLOR" "$prefix")" else printf '%s: %s\n' "$(COLOR=$__COLOR setaf "$FGCOLOR" "$prefix")" "$(printf "$@")" fi )} catp() { prefix="$1" shift should_color || true sed "s/^/$(COLOR=$__COLOR printfp "$prefix" '')/" } repeat() { char="$1" times="$2" seq -s "$char" "$times" | tr -d '[:digit:]' } strlen() { printf %s "$1" | wc -c } echoerr() { FGCOLOR=1 logp err "$*" } caterr() { FGCOLOR=1 logpcat err "$@" } printferr() { FGCOLOR=1 logfp err "$@" } logp() { should_color >&2 || true COLOR=$__COLOR echop "$@" | humanpath >&2 } logfp() { should_color >&2 || true COLOR=$__COLOR printfp "$@" | humanpath >&2 } logpcat() { should_color >&2 || true COLOR=$__COLOR catp "$@" | humanpath >&2 } log() { FGCOLOR=5 logp log "$@" } logf() { FGCOLOR=5 logfp log "$@" } logcat() { FGCOLOR=5 logpcat log "$@" } warn() { FGCOLOR=3 logp warn "$@" } warnf() { FGCOLOR=3 logfp warn "$@" } warncat() { FGCOLOR=3 logpcat warn "$@" } sh_c() { FGCOLOR=3 logp exec "$*" if [ -z "${DRY_RUN-}" ]; then eval "$@" fi } 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 <"$out" 2>&1 code="$?" set -e if [ "$code" -eq 0 ]; then return fi cat "$out" >&2 return "$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 } capcode() { set +e "$@" code=$? set -e } #!/bin/sh 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;; CYGWIN_NT*|MINGW32_NT*) echo windows;; *) echo "$uname";; esac } arch() { uname_m=$(uname -m) case $uname_m in aarch64) echo arm64;; x86_64) echo amd64;; *) echo "$uname_m";; esac } gh_repo() { gh repo view --json nameWithOwner --template '{{ .nameWithOwner }}' } manpath() { if command -v manpath >/dev/null; then command manpath elif man -w 2>/dev/null; then man -w else echo "${MANPATH-}" fi } is_writable_dir() { # The path has to exist for -w to succeed. sh_c "mkdir -p '$1' 2>/dev/null" || true if [ ! -w "$1" ]; then return 1 fi }