Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update install script to work with Windows #4149

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 75 additions & 37 deletions install.sh
Original file line number Diff line number Diff line change
@@ -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]
Expand All @@ -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
Expand All @@ -29,24 +33,35 @@ 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: $*"
exit 1
}

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
Expand All @@ -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"
Expand All @@ -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"
Copy link
Collaborator

@cryptoni9n cryptoni9n Jan 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this code suggestion eliminates the 404/file not found error I was running into on Windows when running ./install.sh --force with the fix from this branch.

Suggested change
if [ "$extension" = "zip" ]; then
if [ "$extension" = "zip" ]; then
download "$archive" "$td/ord.zip"
unzip -d "$td" "$td/ord.zip"
binary_path=$(find "$td" -type f \( -name "ord.exe" -o -name "ord" \) | head -n 1)
else
download "$archive" - | tar --directory "$td" --strip-components 1 -xz
binary_path=$(find "$td" -name ord | head -n 1)
fi
if [ -z "$binary_path" ]; then
err "Binary not found in the archive"
fi
binary_name=$(basename "$binary_path")
if [ -e "$dest/$binary_name" ] && [ "$force" = false ]; then
err "\`$dest/$binary_name\` already exists"
else
mkdir -p "$dest"
cp "$binary_path" "$dest/$binary_name"
chmod 755 "$dest/$binary_name"
fi
rm -rf "$td"

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the error I was hitting was as follows:

Archive:  /tmp/tmp.yF7M2GQnOS/ord.zip
   creating: /tmp/tmp.yF7M2GQnOS/ord-0.22.1/
  inflating: /tmp/tmp.yF7M2GQnOS/ord-0.22.1/Cargo.lock
  inflating: /tmp/tmp.yF7M2GQnOS/ord-0.22.1/Cargo.toml
  inflating: /tmp/tmp.yF7M2GQnOS/ord-0.22.1/LICENSE
  inflating: /tmp/tmp.yF7M2GQnOS/ord-0.22.1/ord.exe
  inflating: /tmp/tmp.yF7M2GQnOS/ord-0.22.1/README.md
cp: cannot stat '/tmp/tmp.yF7M2GQnOS/ord.exe': No such file or directory

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"
Loading