1#!/bin/bash
2
3die() {
4	echo "$@" >&2
5	exit 1
6}
7
8have_binary() {
9	type "$1" > /dev/null 2> /dev/null
10}
11
12check_writeable() {
13	printf "" > "$1" && rm "$1"
14}
15
16download() {
17	local url="$1"
18	local output="$2"
19
20	if [ -z "$url" ] || [ -z "$output" ]; then
21		die "download takes exactly two arguments. was given '$@'"
22	fi
23
24	if ! check_writeable "$output"; then
25		die "download error: cannot write to $output"
26	fi
27
28	if have_binary wget; then
29		printf 'Using wget to download "%s" to "%s"\n' "$url" "$output"
30		wget "$url" -O "$output"
31	elif have_binary curl; then
32		printf 'Using curl to download "%s" to "%s"\n' "$url" "$output"
33		curl --silent "$url" > "$output"
34	elif have_binary fetch; then
35		printf 'Using fetch to download "%s" to "%s"\n' "$url" "$output"
36		fetch "$url" -o "$output"
37	else
38		die "no binary found to download $url. exiting."
39	fi
40}
41
42unarchive() {
43	local archivetype="$1"
44	local infile="$2"
45	local outfile="$3"
46	local distname="$4"
47
48	if ! check_writeable "$outfile"; then
49		die "unarchive error: cannot write to $outfile"
50	fi
51
52	case $archivetype in
53		tar.gz)
54			if have_binary tar; then
55				echo "==> using 'tar' to extract binary from archive"
56				cat "$infile" | tar -O -z -x "$distname/$distname" > "$outfile"
57			else
58				die "no binary on system for extracting tar files"
59			fi
60			;;
61		zip)
62			if have_binary unzip; then
63				echo "==> using 'unzip' to extract binary from archive"
64				unzip -p "$infile" "$distname/$distname" > "$outfile"
65			else
66				die "no installed method for extracting .zip archives"
67			fi
68			;;
69		*)
70			die "unrecognized archive type '$archivetype'"
71	esac
72
73	chmod +x "$outfile"
74}
75
76get_go_vars() {
77	if [ ! -z "$GOOS" ] && [ ! -z "$GOARCH" ]; then
78		printf "%s-%s" "$GOOS" "$GOARCH"
79	fi
80
81	if have_binary go; then
82		printf "%s-%s" "$(go env GOOS)" "$(go env GOARCH)"
83	else
84		die "no way of determining system GOOS and GOARCH\nPlease manually set GOOS and GOARCH then retry."
85	fi
86}
87
88mkurl() {
89	local name="$1"
90	local vers="$2"
91	local archive="$3"
92
93	local govars=$(get_go_vars)
94
95	echo "http://dist.ipfs.io/$name/$vers/${name}_${vers}_$govars.$archive"
96}
97
98distname="$1"
99outpath="$2"
100version="$3"
101
102if [ -z "$distname" ] || [ -z "$outpath" ] || [ -z "$version" ]; then
103	die "usage: dist_get <distname> <outpath> <version>"
104fi
105
106if [ ${version:0:1} != "v" ]; then
107	echo "invalid version '$version'" >&2
108	die "versions must begin with 'v', for example: v0.4.0"
109fi
110
111# TODO: don't depend on the go tool being installed to detect this
112goenv=$(get_go_vars)
113
114case $goenv in
115	linux-*)
116		archive="tar.gz"
117		;;
118	darwin-*)
119		archive="tar.gz"
120		;;
121	windows-*)
122		archive="zip"
123		;;
124	freebsd-*)
125		archive="tar.gz"
126		;;
127	*)
128		echo "unrecognized system environment: $goenv" >&2
129		die "currently only linux, darwin, windows and freebsd are supported by this script"
130esac
131
132
133mkdir -p bin/tmp
134
135url=$(mkurl "$distname" "$version" "$archive")
136tmpfi="bin/tmp/$distname.$archive"
137
138download "$url" "$tmpfi"
139if [ $? -ne 0 ]; then
140	die "failed to download $url to $tmpfi"
141fi
142
143unarchive "$archive" "$tmpfi" "$outpath" "$distname"
144if [ $? -ne 0 ]; then
145	die "failed to exract archive $tmpfi"
146fi
147