diff --git a/ci/install-cargo-update.sh b/ci/install-cargo-update.sh index 0755adc..12382e6 100755 --- a/ci/install-cargo-update.sh +++ b/ci/install-cargo-update.sh @@ -12,8 +12,7 @@ main() { | sort --version-sort \ | tail -n1) - curl -LSfs https://japaric.github.io/trust/install.sh | \ - sh -s -- --git nabijaczleweli/cargo-update --tag $tag + $(dirname $(realpath $0))/install-tbz2.sh --git nabijaczleweli/cargo-update --tag $tag --crate cargo-install-update } main diff --git a/ci/install-tbz2.sh b/ci/install-tbz2.sh new file mode 100755 index 0000000..94a6529 --- /dev/null +++ b/ci/install-tbz2.sh @@ -0,0 +1,158 @@ +#!/bin/sh + +# NOTE: This is based on https://japaric.github.io/trust/install.sh, +# but has been modified to not expect a target tag, and to instead +# expect bzip2 tar files (.tbz2) instead of gzip tar files (.tar.gz) + +set -e + +help() { + cat <<'EOF' +Install a binary release of a Rust crate hosted on GitHub + +Usage: + install.sh [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 ) + --tag TAG Tag (version) of the crate to install (default ) + --target TARGET Install the release compiled for $TARGET (default <`rustc` host>) + --to LOCATION Where to install the binary (default ~/.cargo/bin) +EOF +} + +say() { + echo "install.sh: $1" +} + +say_err() { + say "$1" >&2 +} + +err() { + if [ ! -z $td ]; then + rm -rf $td + fi + + say_err "ERROR $1" + exit 1 +} + +need() { + 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 +done + +# Dependencies +need basename +need curl +need install +need mkdir +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 +fi + +if [ -z $git ]; then + err 'must specify a git repository using `--git`. Example: `install.sh --git japaric/cross`' +fi + +url="https://github.com/$git" +say_err "GitHub repository: $url" + +if [ -z $crate ]; then + crate=$(echo $git | cut -d'/' -f2) +fi + +say_err "Crate: $crate" + +url="$url/releases" + +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" +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.tbz2" + +td=$(mktemp -d || mktemp -d -t tmp) +curl -sL $url | tar -C $td -xj + +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 +done + +rm -rf $td