summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Tay <sam.chong.tay@gmail.com>2020-06-25 14:40:49 -0700
committerSam Tay <sam.chong.tay@gmail.com>2020-06-25 14:40:49 -0700
commitccbeb6cb6678013a01423f552aff9c49098fbeda (patch)
tree054c4381da97a2195e89bde6a262b73b413abcd1
parent02bb73d1dea45db810ac2ae17d9870f0df355b4c (diff)
Improve install.sh
-rwxr-xr-xdocs/install.sh175
1 files changed, 77 insertions, 98 deletions
diff --git a/docs/install.sh b/docs/install.sh
index a3f55ea..1ef1dca 100755
--- a/docs/install.sh
+++ b/docs/install.sh
@@ -1,82 +1,83 @@
-#!/bin/sh
+#!/usr/bin/env bash
-set -e
+set -eu
help() {
- cat <<'EOF'
-Install a binary release of a Rust crate hosted on GitHub
+ cat <<'EOF'
+Install a binary release of `so` hosted on GitHub
Usage:
- install.sh [options]
+ install [options]
Options:
-h, --help Display this message
- --git SLUG Get the crate from "https://github/$SLUG"
-f, --force Force overwriting an existing binary
- --crate NAME Name of the crate to install (default <repository name>)
--tag TAG Tag (version) of the crate to install (default <latest release>)
- --target TARGET Install the release compiled for $TARGET (default <`rustc` host>)
--to LOCATION Where to install the binary (default ~/.cargo/bin)
EOF
}
+git=samtay/so
+crate=so
+url=https://github.com/samtay/so
+releases=$url/releases
+
+case "$(uname -s)" in
+ "Darwin")
+ platform="apple-darwin" ;;
+ "Linux")
+ platform="unknown-linux-musl" ;;
+ *)
+ platform="pc-windows-msvc";;
+esac
+
+target="$(uname -m)-$platform"
+
say() {
- echo "install.sh: $1"
+ echo "install: $1"
}
say_err() {
- say "$1" >&2
+ say "$1" >&2
}
err() {
- if [ ! -z $td ]; then
- rm -rf $td
- fi
+ if [ ! -z ${td-} ]; then
+ rm -rf $td
+ fi
- say_err "ERROR $1"
- exit 1
+ say_err "ERROR $1"
+ exit 1
}
need() {
- if ! command -v $1 > /dev/null 2>&1; then
- err "need $1 (command not found)"
- fi
+ if ! command -v $1 > /dev/null 2>&1; then
+ err "need $1 (command not found)"
+ fi
}
force=false
while test $# -gt 0; do
- case $1 in
- --crate)
- crate=$2
- shift
- ;;
- --force | -f)
- force=true
- ;;
- --git)
- git=$2
- shift
- ;;
- --help | -h)
- help
- exit 0
- ;;
- --tag)
- tag=$2
- shift
- ;;
- --target)
- target=$2
- shift
- ;;
- --to)
- dest=$2
- shift
- ;;
- *)
- ;;
- esac
- shift
+ case $1 in
+ --force | -f)
+ force=true
+ ;;
+ --help | -h)
+ help
+ exit 0
+ ;;
+ --tag)
+ tag=$2
+ shift
+ ;;
+ --to)
+ dest=$2
+ shift
+ ;;
+ *)
+ ;;
+ esac
+ shift
done
# Dependencies
@@ -88,67 +89,45 @@ need mktemp
need tar
# Optional dependencies
-if [ -z $crate ] || [ -z $tag ] || [ -z $target ]; then
- need cut
-fi
-
-if [ -z $tag ]; then
- need rev
-fi
-
-if [ -z $target ]; then
- need grep
- need rustc
+if [ -z ${tag-} ]; then
+ need cut
+ need rev
fi
-if [ -z $git ]; then
- err 'must specify a git repository using `--git`. Example: `install.sh --git japaric/cross`'
+if [ -z ${dest-} ]; then
+ dest="$HOME/.cargo/bin"
fi
-url="https://github.com/$git"
-say_err "GitHub repository: $url"
-
-if [ -z $crate ]; then
- crate=$(echo $git | cut -d'/' -f2)
+if [ -z ${tag-} ]; then
+ tag=$(curl -s "$releases/latest" | cut -d'"' -f2 | rev | cut -d'/' -f1 | rev)
fi
-say_err "Crate: $crate"
+archive="$releases/download/$tag/$crate-$tag-$target.tar.gz"
-url="$url/releases"
+say_err "Repository: $url"
+say_err "Crate: $crate"
+say_err "Tag: $tag"
+say_err "Target: $target"
+say_err "Destination: $dest"
+say_err "Archive: $archive"
-if [ -z $tag ]; then
- tag=$(curl -s "$url/latest" | cut -d'"' -f2 | rev | cut -d'/' -f1 | rev)
- say_err "Tag: latest ($tag)"
-else
- say_err "Tag: $tag"
+# Check if binary exists
+if [ "$(curl --head --write-out "%{http_code}\n" --silent --output /dev/null "$archive")" -eq "404" ]; then
+ err "The binary you need does not exist; you can build the crate from source or open an issue requesting the target: $target"
fi
-if [ -z $target ]; then
- target=$(rustc -Vv | grep host | cut -d' ' -f2)
-fi
-
-say_err "Target: $target"
-
-if [ -z $dest ]; then
- dest="$HOME/.cargo/bin"
-fi
-
-say_err "Installing to: $dest"
-
-url="$url/download/$tag/$crate-$tag-$target.tar.gz"
-
td=$(mktemp -d || mktemp -d -t tmp)
-curl -sL $url | tar -C $td -xz
+curl -sL $archive | tar -C $td -xz
for f in $(ls $td); do
- test -x $td/$f || continue
-
- if [ -e "$dest/$f" ] && [ $force = false ]; then
- err "$f already exists in $dest"
- else
- mkdir -p $dest
- install -m 755 $td/$f $dest
- fi
+ test -x $td/$f || continue
+
+ if [ -e "$dest/$f" ] && [ $force = false ]; then
+ err "$f already exists in $dest; use --force to overwrite it"
+ else
+ mkdir -p $dest
+ install -m 755 $td/$f $dest
+ fi
done
rm -rf $td