From b7245ce6b885305b9c8ec5af7a80d69824d46799 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 23 Dec 2024 13:23:44 -0800 Subject: [PATCH] Update install script to work with Windows --- install.sh | 112 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 37 deletions(-) diff --git a/install.sh b/install.sh index a711ca2e89..01cd58df94 100755 --- a/install.sh +++ b/install.sh @@ -1,14 +1,18 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh -set -euo pipefail +set -eu -if [ ! -z ${GITHUB_ACTIONS-} ]; then +if [ -n "${GITHUB_ACTIONS-}" ]; then set -x fi +# Check pipefail support in a subshell, ignore if unsupported +# shellcheck disable=SC3040 +(set -o pipefail 2> /dev/null) && set -o pipefail + help() { cat <<'EOF' -Install a binary release of ord hosted on GitHub +Install a binary release of a ord hosted on GitHub USAGE: install.sh [options] @@ -18,7 +22,7 @@ FLAGS: -f, --force Force overwriting an existing binary OPTIONS: - --tag TAG Tag (version) of the crate to install, defaults to latest release + --tag TAG Tag (version) to install, defaults to latest release --to LOCATION Where to install the binary [default: ~/bin] --target TARGET EOF @@ -29,12 +33,12 @@ url=https://github.com/ordinals/ord releases=$url/releases say() { - echo "install.sh: $*" >&2 + echo "install: $*" >&2 } err() { - if [ ! -z ${tempdir-} ]; then - rm -rf $tempdir + if [ -n "${td-}" ]; then + rm -rf "$td" fi say "error: $*" @@ -42,11 +46,22 @@ err() { } need() { - if ! command -v $1 > /dev/null 2>&1; then + if ! command -v "$1" > /dev/null 2>&1; then err "need $1 (command not found)" fi } +download() { + url="$1" + output="$2" + + if command -v curl > /dev/null; then + curl --proto =https --tlsv1.2 -sSfL "$url" "-o$output" + else + wget --https-only --secure-protocol=TLSv1_2 --quiet "$url" "-O$output" + fi +} + force=false while test $# -gt 0; do case $1 in @@ -70,46 +85,68 @@ while test $# -gt 0; do shift ;; *) + say "error: unrecognized argument '$1'. Usage:" + help + exit 1 ;; esac shift done -# Dependencies -need curl -need install +command -v curl > /dev/null 2>&1 || + command -v wget > /dev/null 2>&1 || + err "need wget or curl (command not found)" + need mkdir need mktemp -need tar -dest=${dest-"$HOME/bin"} +if [ -z "${tag-}" ]; then + need grep + need cut +fi -if [ -z ${tag-} ]; then +if [ -z "${target-}" ]; then need cut +fi + +if [ -z "${dest-}" ]; then + dest="$HOME/bin" +fi - tag=$(curl --proto =https --tlsv1.2 -sSf https://api.github.com/repos/ordinals/ord/releases/latest | +if [ -z "${tag-}" ]; then + tag=$( + download https://api.github.com/repos/ordinals/ord/releases/latest - | grep tag_name | cut -d'"' -f4 ) fi -if [ -z ${target-} ]; then - uname_target=`uname -m`-`uname -s` +if [ -z "${target-}" ]; then + # bash compiled with MINGW (e.g. git-bash, used in github windows runners), + # unhelpfully includes a version suffix in `uname -s` output, so handle that. + # e.g. MINGW64_NT-10-0.19044 + kernel=$(uname -s | cut -d- -f1) + uname_target="$(uname -m)-$kernel" case $uname_target in arm64-Darwin) target=aarch64-apple-darwin;; x86_64-Darwin) target=x86_64-apple-darwin;; x86_64-Linux) target=x86_64-unknown-linux-gnu;; + x86_64-MINGW64_NT) target=x86_64-pc-windows-msvc;; + x86_64-Windows_NT) target=x86_64-pc-windows-msvc;; *) - say 'Could not determine target from output of `uname -m`-`uname -s`, please use `--target`:' $uname_target - say 'Target architecture is not supported by this install script.' - say 'Consider opening an issue or building from source: https://github.com/ordinals/ord' - exit 1 + # shellcheck disable=SC2016 + err 'Could not determine target from output of `uname -m`-`uname -s`, please use `--target`:' "$uname_target" ;; esac fi -archive="$releases/download/$tag/$crate-$tag-$target.tar.gz" +case $target in + x86_64-pc-windows-msvc) extension=zip; need unzip;; + *) extension=tar.gz; need tar;; +esac + +archive="$releases/download/$tag/$crate-$tag-$target.$extension" say "Repository: $url" say "Crate: $crate" @@ -118,20 +155,21 @@ say "Target: $target" say "Destination: $dest" say "Archive: $archive" -tempdir=`mktemp -d || mktemp -d -t tmp` - -curl --proto =https --tlsv1.2 -sSfL $archive | tar --directory $tempdir --strip-components 1 -xz +td=$(mktemp -d || mktemp -d -t tmp) -for name in `ls $tempdir`; do - file="$tempdir/$name" - test -x $file || continue +if [ "$extension" = "zip" ]; then + download "$archive" "$td/ord.zip" + unzip -d "$td" "$td/ord.zip" +else + download "$archive" - | tar --directory "$td" --strip-components 1 -xz +fi - if [ -e "$dest/$name" ] && [ $force = false ]; then - err "$name already exists in $dest" - else - mkdir -p $dest - install -m 755 $file $dest - fi -done +if [ -e "$dest/ord" ] && [ "$force" = false ]; then + err "\`$dest/ord\` already exists" +else + mkdir -p "$dest" + cp "$td/ord" "$dest/ord" + chmod 755 "$dest/ord" +fi -rm -rf $tempdir +rm -rf "$td"