diff --git a/internal/build-bootstrapper/assets/main.sh b/internal/build-bootstrapper/assets/main.sh index 69c9dd66..07cb52af 100644 --- a/internal/build-bootstrapper/assets/main.sh +++ b/internal/build-bootstrapper/assets/main.sh @@ -3,10 +3,8 @@ GITHUB_DOWNLOAD=https://github.com/WillAbides/bindown/releases/download usage() { this=$1 - cat < "${tmpdir}/checksums.txt" @@ -39,15 +45,17 @@ execute() { srcdir="${tmpdir}" (cd "${tmpdir}" && untar "${TARBALL}") test ! -d "${BINDIR}" && install -d "${BINDIR}" - binexe="bindown" - if [ "$OS" = "windows" ]; then - binexe="${binexe}.exe" - fi - install "${srcdir}/${binexe}" "${BINDIR}/" - log_info "installed ${BINDIR}/${binexe}" + install "${srcdir}/$(bindown_name)" "${BINDIR}/" + log_info "installed ${BINDIR}/$(bindown_name)" rm -rf "${tmpdir}" } +already_installed() { + VERSION="$1" + [ -f "${BINDIR}/$(bindown_name)" ] && + "${BINDIR}/$(bindown_name)" version 2> /dev/null | grep -q "$VERSION" +} + OS=$(uname_os) ARCH=$(uname_arch) @@ -57,6 +65,12 @@ uname_arch_check "$ARCH" parse_args "$@" VERSION=${TAG#v} + +if already_installed "$VERSION"; then + log_debug "bindown ${VERSION} is already installed" + exit 0 +fi + NAME=bindown_${VERSION}_${OS}_${ARCH} TARBALL=${NAME}.${FORMAT} TARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL} diff --git a/internal/build-bootstrapper/assets/shlib.sh b/internal/build-bootstrapper/assets/shlib.sh index e1f973c8..b8979518 100644 --- a/internal/build-bootstrapper/assets/shlib.sh +++ b/internal/build-bootstrapper/assets/shlib.sh @@ -1,4 +1,4 @@ -cat /dev/null </dev/null + command -v "$1" > /dev/null } echoerr() { echo "$@" 1>&2 @@ -175,7 +175,7 @@ hash_sha256() { hash=$(sha256sum "$TARGET") || return 1 echo "$hash" | cut -d ' ' -f 1 elif is_command shasum; then - hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 + hash=$(shasum -a 256 "$TARGET" 2> /dev/null) || return 1 echo "$hash" | cut -d ' ' -f 1 elif is_command openssl; then hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 @@ -193,7 +193,7 @@ hash_sha256_verify() { return 1 fi BASENAME=${TARGET##*/} - want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) + want=$(grep "${BASENAME}" "${checksums}" 2> /dev/null | tr '\t' ' ' | cut -d ' ' -f 1) if [ -z "$want" ]; then log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" return 1 @@ -204,7 +204,7 @@ hash_sha256_verify() { return 1 fi } -cat /dev/null < "${tmpdir}/checksums.txt" @@ -276,15 +282,17 @@ execute() { srcdir="${tmpdir}" (cd "${tmpdir}" && untar "${TARBALL}") test ! -d "${BINDIR}" && install -d "${BINDIR}" - binexe="bindown" - if [ "$OS" = "windows" ]; then - binexe="${binexe}.exe" - fi - install "${srcdir}/${binexe}" "${BINDIR}/" - log_info "installed ${BINDIR}/${binexe}" + install "${srcdir}/$(bindown_name)" "${BINDIR}/" + log_info "installed ${BINDIR}/$(bindown_name)" rm -rf "${tmpdir}" } +already_installed() { + VERSION="$1" + [ -f "${BINDIR}/$(bindown_name)" ] && + "${BINDIR}/$(bindown_name)" version 2> /dev/null | grep -q "$VERSION" +} + OS=$(uname_os) ARCH=$(uname_arch) @@ -294,6 +302,12 @@ uname_arch_check "$ARCH" parse_args "$@" VERSION=${TAG#v} + +if already_installed "$VERSION"; then + log_debug "bindown ${VERSION} is already installed" + exit 0 +fi + NAME=bindown_${VERSION}_${OS}_${ARCH} TARBALL=${NAME}.${FORMAT} TARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL} diff --git a/script/bootstrap-bindown.sh b/script/bootstrap-bindown.sh deleted file mode 100755 index a1ebe607..00000000 --- a/script/bootstrap-bindown.sh +++ /dev/null @@ -1,302 +0,0 @@ -#!/bin/sh -set -e - -TAG="v3.14.0" - -CHECKSUMS="$(cat </dev/null -} -echoerr() { - echo "$@" 1>&2 -} -log_prefix() { - echo "$0" -} -_logp=6 -log_set_priority() { - _logp="$1" -} -log_priority() { - if test -z "$1"; then - echo "$_logp" - return - fi - [ "$1" -le "$_logp" ] -} -log_tag() { - case $1 in - 0) echo "emerg" ;; - 1) echo "alert" ;; - 2) echo "crit" ;; - 3) echo "err" ;; - 4) echo "warning" ;; - 5) echo "notice" ;; - 6) echo "info" ;; - 7) echo "debug" ;; - *) echo "$1" ;; - esac -} -log_debug() { - log_priority 7 || return 0 - echoerr "$(log_prefix)" "$(log_tag 7)" "$@" -} -log_info() { - log_priority 6 || return 0 - echoerr "$(log_prefix)" "$(log_tag 6)" "$@" -} -log_err() { - log_priority 3 || return 0 - echoerr "$(log_prefix)" "$(log_tag 3)" "$@" -} -log_crit() { - log_priority 2 || return 0 - echoerr "$(log_prefix)" "$(log_tag 2)" "$@" -} -uname_os() { - os=$(uname -s | tr '[:upper:]' '[:lower:]') - case "$os" in - cygwin_nt*) os="windows" ;; - mingw*) os="windows" ;; - msys_nt*) os="windows" ;; - esac - echo "$os" -} -uname_arch() { - arch=$(uname -m) - case $arch in - x86_64) arch="amd64" ;; - x86) arch="386" ;; - i686) arch="386" ;; - i386) arch="386" ;; - aarch64) arch="arm64" ;; - armv5*) arch="armv5" ;; - armv6*) arch="armv6" ;; - armv7*) arch="armv7" ;; - esac - echo ${arch} -} -uname_os_check() { - os=$(uname_os) - case "$os" in - darwin) return 0 ;; - dragonfly) return 0 ;; - freebsd) return 0 ;; - linux) return 0 ;; - android) return 0 ;; - nacl) return 0 ;; - netbsd) return 0 ;; - openbsd) return 0 ;; - plan9) return 0 ;; - solaris) return 0 ;; - windows) return 0 ;; - esac - log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" - return 1 -} -uname_arch_check() { - arch=$(uname_arch) - case "$arch" in - 386) return 0 ;; - amd64) return 0 ;; - arm64) return 0 ;; - armv5) return 0 ;; - armv6) return 0 ;; - armv7) return 0 ;; - ppc64) return 0 ;; - ppc64le) return 0 ;; - mips) return 0 ;; - mipsle) return 0 ;; - mips64) return 0 ;; - mips64le) return 0 ;; - s390x) return 0 ;; - amd64p32) return 0 ;; - esac - log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" - return 1 -} -untar() { - tarball=$1 - case "${tarball}" in - *.tar.gz | *.tgz) tar --no-same-owner -xzf "${tarball}" ;; - *.tar) tar --no-same-owner -xf "${tarball}" ;; - *.zip) unzip "${tarball}" ;; - *) - log_err "untar unknown archive format for ${tarball}" - return 1 - ;; - esac -} -http_download_curl() { - local_file=$1 - source_url=$2 - header=$3 - if [ -z "$header" ]; then - code=$(curl -w '%{http_code}' -sL -o "$local_file" "$source_url") - else - code=$(curl -w '%{http_code}' -sL -H "$header" -o "$local_file" "$source_url") - fi - if [ "$code" != "200" ]; then - log_debug "http_download_curl received HTTP status $code" - return 1 - fi - return 0 -} -http_download_wget() { - local_file=$1 - source_url=$2 - header=$3 - if [ -z "$header" ]; then - wget -q -O "$local_file" "$source_url" - else - wget -q --header "$header" -O "$local_file" "$source_url" - fi -} -http_download() { - log_debug "http_download $2" - if is_command curl; then - http_download_curl "$@" - return - elif is_command wget; then - http_download_wget "$@" - return - fi - log_crit "http_download unable to find wget or curl" - return 1 -} -hash_sha256() { - TARGET=${1:-/dev/stdin} - if is_command gsha256sum; then - hash=$(gsha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command sha256sum; then - hash=$(sha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command shasum; then - hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command openssl; then - hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f a - else - log_crit "hash_sha256 unable to find command to compute sha-256 hash" - return 1 - fi -} -hash_sha256_verify() { - TARGET=$1 - checksums=$2 - if [ -z "$checksums" ]; then - log_err "hash_sha256_verify checksum file not specified in arg2" - return 1 - fi - BASENAME=${TARGET##*/} - want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) - if [ -z "$want" ]; then - log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'" - return 1 - fi - got=$(hash_sha256 "$TARGET") - if [ "$want" != "$got" ]; then - log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got" - return 1 - fi -} -cat /dev/null < "${tmpdir}/checksums.txt" - log_debug "downloading files into ${tmpdir}" - http_download "${tmpdir}/${TARBALL}" "${TARBALL_URL}" - hash_sha256_verify "${tmpdir}/${TARBALL}" "${tmpdir}/checksums.txt" - srcdir="${tmpdir}" - (cd "${tmpdir}" && untar "${TARBALL}") - test ! -d "${BINDIR}" && install -d "${BINDIR}" - binexe="bindown" - if [ "$OS" = "windows" ]; then - binexe="${binexe}.exe" - fi - install "${srcdir}/${binexe}" "${BINDIR}/" - log_info "installed ${BINDIR}/${binexe}" - rm -rf "${tmpdir}" -} - -OS=$(uname_os) -ARCH=$(uname_arch) - -uname_os_check "$OS" -uname_arch_check "$ARCH" - -parse_args "$@" - -VERSION=${TAG#v} -NAME=bindown_${VERSION}_${OS}_${ARCH} -TARBALL=${NAME}.${FORMAT} -TARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL} - -execute \ No newline at end of file diff --git a/script/fmt b/script/fmt index d452e123..0c0e9543 100755 --- a/script/fmt +++ b/script/fmt @@ -9,3 +9,4 @@ script/bindown -q install gofumpt shfmt bin/gofumpt -w internal/*/*.go cmd/*/*.go find script -type f -not -name 'bootstrap-bindown.sh' -print0 | xargs -0 bin/shfmt -w -i 2 -ci -sr +bin/shfmt -w -i 2 -ci -sr internal/build-bootstrapper/assets/*.sh