diff --git a/Makefile b/Makefile index 014eb74dd..26d0d0a84 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,12 @@ else go_test=go test endif + +gx_bin=bin/gx-v0.6.0 +gx-go_bin=bin/gx-go-v1.1.0 + +# use things in our bin before any other system binaries +export PATH := bin:$(PATH) export IPFS_API ?= v04x.ipfs.io all: help @@ -21,21 +27,23 @@ toolkit_upgrade: gx_upgrade gxgo_upgrade go_check: @bin/check_go_version $(IPFS_MIN_GO_VERSION) -gx_upgrade: - go get -u github.com/whyrusleeping/gx +bin/gx-%: + @echo "installing gx $(@:bin/gx-%=%)" + @bin/dist_get gx $@ $(@:bin/gx-%=%) -gxgo_upgrade: - go get -u github.com/whyrusleeping/gx-go +bin/gx-go-%: + @echo "installing gx-go $(@:bin/gx-go-%=%)" + @bin/dist_get gx-go $@ $(@:bin/gx-go-%=%) + rm -f bin/gx-go + ln -s $(@:bin/%=%) bin/gx-go + +gx_check: ${gx_bin} ${gx-go_bin} path_check: @bin/check_go_path $(realpath $(shell pwd)) $(realpath $(GOPATH)/src/github.com/ipfs/go-ipfs) -gx_check: - @bin/check_gx_program "gx" $(IPFS_MIN_GX_VERSION) 'Upgrade or install gx using your package manager or run `make gx_upgrade`' - @bin/check_gx_program "gx-go" $(IPFS_MIN_GX_GO_VERSION) 'Upgrade or install gx-go using your package manager or run `make gxgo_upgrade`' - deps: go_check gx_check path_check - gx --verbose install --global + ${gx_bin} --verbose install --global # saves/vendors third-party dependencies to Godeps/_workspace # -r flag rewrites import paths to use the vendored path @@ -58,7 +66,7 @@ clean: uninstall: make -C cmd/ipfs uninstall -PHONY += all help godep toolkit_upgrade gx_upgrade gxgo_upgrade gx_check +PHONY += all help godep toolkit_upgrade gx_check PHONY += go_check deps vendor install build nofuse clean uninstall ############################################################## diff --git a/bin/dist_get b/bin/dist_get new file mode 100755 index 000000000..06f1be5a8 --- /dev/null +++ b/bin/dist_get @@ -0,0 +1,143 @@ +#!/bin/bash + +die() { + echo "$@" >&2 + exit 1 +} + +have_binary() { + type "$1" > /dev/null +} + +check_writeable() { + printf "" > "$1" && rm "$1" +} + +download() { + local url="$1" + local output="$2" + + if [ -z "$url" ] || [ -z "$output" ]; then + die "download takes exactly two arguments. was given '$@'" + fi + + if ! check_writeable "$output"; then + die "download error: cannot write to $output" + fi + + printf 'Downloading "%s" to "%s"\n' "$url" "$output" + if have_binary wget; then + wget "$url" -O "$output" + elif have_binary curl; then + curl --silent "$url" > "$output" + elif have_binary fetch; then + fetch "$url" -o "$output" + else + die "no binary found to download $url. exiting." + fi +} + +unarchive() { + local archivetype="$1" + local infile="$2" + local outfile="$3" + local distname="$4" + + if ! check_writeable "$outfile"; then + die "unarchive error: cannot write to $outfile" + fi + + case $archivetype in + tar.gz) + if have_binary tar; then + echo "==> using 'tar' to extract binary from archive" + tar -x "$distname/$distname" -f "$infile" -O > "$outfile" + else + die "no binary on system for extracting tar files" + fi + ;; + zip) + if have_binary unzip; then + echo "==> using 'unzip' to extract binary from archive" + unzip -p "$infile" "$distname/$distname" > "$outfile" + else + die "no installed method for extracting .zip archives" + fi + ;; + *) + die "unrecognized archive type '$archivetype'" + esac + + chmod +x "$outfile" +} + +get_go_vars() { + if [ ! -z "$GOOS" ] && [ ! -z "$GOARCH" ]; then + printf "%s-%s" "$GOOS" "$GOARCH" + fi + + if have_binary go; then + printf "%s-%s" "$(go env GOOS)" "$(go env GOARCH)" + else + die "no way of determining system GOOS and GOARCH\nPlease manually set GOOS and GOARCH then retry." + fi +} + +mkurl() { + local name="$1" + local vers="$2" + local archive="$3" + + local govars=$(get_go_vars) + + echo "http://dist.ipfs.io/$name/$vers/${name}_${vers}_$govars.$archive" +} + +distname="$1" +outpath="$2" +version="$3" + +if [ -z "$distname" ] || [ -z "$outpath" ] || [ -z "$version" ]; then + die "usage: dist_get " +fi + +if [ ${version:0:1} != "v" ]; then + die "versions must begin with 'v', for example: v0.4.0" +fi + +# TODO: don't depend on the go tool being installed to detect this +goenv=$(get_go_vars) + +case $goenv in + linux-*) + archive="tar.gz" + ;; + darwin-*) + archive="tar.gz" + ;; + windows-*) + archive="zip" + ;; + freebsd-*) + archive="tar.gz" + ;; + *) + echo "unrecognized system environment: $goenv" >&2 + die "currently only linux, darwin, windows and freebsd are supported by this script" +esac + + +mkdir -p bin/tmp + +url=$(mkurl "$distname" "$version" "$archive") +tmpfi="bin/tmp/$distname.$archive" + +download "$url" "$tmpfi" +if [ $? -ne 0 ]; then + die "failed to download $url to $tmpfi" +fi + +unarchive "$archive" "$tmpfi" "$outpath" "$distname" +if [ $? -ne 0 ]; then + die "failed to exract archive $tmpfi" +fi