make link before add to PATH package's responsibility
[webi-installers/.git] / webi / template.bash
1 #!/bin/bash
2
3 {
4
5 set -e
6 set -u
7
8 #WEBI_PKG=
9 #WEBI_NAME=
10 # TODO should this be BASEURL instead?
11 #WEBI_HOST=
12 #WEBI_RELEASES=
13 #WEBI_CSV=
14 #WEBI_TAG=
15 #WEBI_VERSION=
16 #WEBI_MAJOR=
17 #WEBI_MINOR=
18 #WEBI_PATCH=
19 # TODO not sure if BUILD is the best name for this
20 #WEBI_BUILD=
21 #WEBI_LTS=
22 #WEBI_CHANNEL=
23 #WEBI_EXT=
24 #WEBI_PKG_URL=
25 #WEBI_PKG_FILE=
26 export WEBI_HOST
27
28 ##
29 ## Set up tmp, download, and install directories
30 ##
31
32 WEBI_TMP=${WEBI_TMP:-"$(mktemp -d -t webinstall-${WEBI_PKG:-}.XXXXXXXX)"}
33
34 mkdir -p "$HOME/Downloads"
35 mkdir -p "$HOME/.local/bin"
36 mkdir -p "$HOME/.local/opt"
37
38 ##
39 ## Detect http client
40 ##
41 set +e
42 export WEBI_CURL="$(command -v curl)"
43 export WEBI_WGET="$(command -v wget)"
44 set -e
45
46 webi_check() {
47     # Test for existing version
48     set +e
49     my_current_cmd="$(command -v "$pkg_cmd_name")"
50     set -e
51     if [ -n "$my_current_cmd" ]; then
52         pkg_current_version="$(pkg_get_current_version)"
53         # remove trailing '.0's for golang's sake
54         my_current_version="$(echo $pkg_current_version | sed 's:\.0::g')"
55         my_new_version="$(echo $WEBI_VERSION | sed 's:\.0::g')"
56         if [ -n "$(command -v pkg_format_cmd_version)" ]; then
57             my_canonical_name="$(pkg_format_cmd_version "$WEBI_VERSION")"
58         else
59             #my_canonical_name="$WEBI_NAME $WEBI_VERSION"
60             my_canonical_name="$pkg_cmd_name v$WEBI_VERSION"
61         fi
62         if [ "$my_new_version" == "$my_current_version" ]; then
63             echo "$my_canonical_name already installed at $my_current_cmd"
64             exit 0
65         else
66             if [ "$my_current_cmd" != "$pkg_common_cmd" ]; then
67                 echo "WARN: possible conflict between $my_canonical_name and $pkg_current_version at $my_current_cmd"
68             fi
69             if [ -x "$pkg_new_cmd" ]; then
70                 pkg_link_new_version
71                 echo "switched to $my_canonical_name at $pkg_new_opt"
72                 exit 0
73             fi
74           fi
75     fi
76 }
77
78 webi_download() {
79     if [ -n "${1:-}" ]; then
80         my_url="$1"
81     else
82         if [ "error" == "$WEBI_CHANNEL" ]; then
83             echo "Could not find $WEBI_NAME v$WEBI_VERSION"
84             exit 1
85         fi
86         my_url="$WEBI_PKG_URL"
87         echo "Downloading $WEBI_NAME v$WEBI_VERSION"
88     fi
89     if [ -n "${2:-}" ]; then
90         my_dl="$2"
91     else
92         my_dl="$HOME/Downloads/$WEBI_PKG_FILE"
93     fi
94
95     if [ -n "$WEBI_WGET" ]; then
96         # wget has resumable downloads
97         # TODO wget -c --content-disposition "$my_url"
98         set +e
99         wget -q --show-progress -c "$my_url" --user-agent="wget $WEBI_UA" -O "$my_dl"
100         if ! [ $? -eq 0 ]; then
101           echo "failed to download from $WEBI_PKG_URL"
102           exit 1
103         fi
104         set -e
105     else
106         # BSD curl is non-resumable, hence we don't bother
107         # TODO curl -fsSL --remote-name --remote-header-name --write-out "$my_url"
108         curl -fSL "$my_url" -H "User-Agent: curl $WEBI_UA" -o "$my_dl"
109     fi
110 }
111
112 webi_extract() {
113     pushd "$WEBI_TMP" 2>&1 >/dev/null
114         if [ "tar" == "$WEBI_EXT" ]; then
115             echo "Extracting $HOME/Downloads/$WEBI_PKG_FILE"
116             tar xf "$HOME/Downloads/$WEBI_PKG_FILE"
117         elif [ "zip" == "$WEBI_EXT" ]; then
118             echo "Extracting $HOME/Downloads/$WEBI_PKG_FILE"
119             unzip "$HOME/Downloads/$WEBI_PKG_FILE"
120         elif [ "exe" == "$WEBI_EXT" ]; then
121             # do nothing (but don't leave an empty if block either)
122             echo -n ""
123         elif [ "xz" == "$WEBI_EXT" ]; then
124             echo "Inflating $HOME/Downloads/$WEBI_PKG_FILE"
125             unxz -c "$HOME/Downloads/$WEBI_PKG_FILE" > $(basename "$WEBI_PKG_FILE")
126         else
127             # do nothing
128             echo "Failed to extract $HOME/Downloads/$WEBI_PKG_FILE"
129             exit 1
130         fi
131     popd 2>&1 >/dev/null
132 }
133
134 webi_path_add() {
135     # make sure that we don't recursively install pathman with webi
136     my_path="$PATH"
137     export PATH="$HOME/.local/bin:$PATH"
138     set +e
139     my_pathman=$(command -v pathman)
140     set -e
141     export PATH="$my_path"
142
143     # install pathman if not already installed
144     if [ -z "$my_pathman" ]; then
145         "$HOME/.local/bin/webi" pathman
146         "$HOME/.local/bin/pathman" add "$HOME/.local/bin"
147         export PATH="$HOME/.local/bin:$PATH"
148     fi
149
150     # in case pathman was recently installed and the PATH not updated
151     "$HOME/.local/bin/pathman" add "$1"
152 }
153
154 ##
155 ##
156 ## BEGIN user-submited script
157 ##
158 ##
159
160 {{ installer }}
161
162 ##
163 ##
164 ## END user-submitted script
165 ##
166 ##
167
168 if [ -n $(command -v pkg_install) ]; then
169     pkg_cmd_name="${pkg_cmd_name:-$WEBI_NAME}"
170
171     pkg_common_opt="${pkg_common_opt:-$HOME/.local/opt/$pkg_cmd_name}"
172     pkg_common_bin="${pkg_common_bin:-$pkg_common_opt/bin}"
173     pkg_common_cmd="${pkg_common_cmd:-$pkg_common_bin/$pkg_cmd_name}"
174
175     pkg_new_opt="${pkg_new_opt:-$HOME/.local/opt/$pkg_cmd_name-v$WEBI_VERSION}"
176     pkg_new_bin="${pkg_new_bin:-$pkg_new_opt/bin}"
177     pkg_new_cmd="${pkg_new_cmd:-$pkg_new_bin/$pkg_cmd_name}"
178
179     [ -n $(command -v pkg_pre_install) ] && pkg_pre_install
180
181     echo "Installing '$pkg_cmd_name' v$WEBI_VERSION as $pkg_new_cmd"
182     pkg_install
183
184     [ -n $(command -v pkg_post_install) ] && pkg_post_install
185
186     if [ -n $(command -v pkg_post_install_message) ]; then
187         pkg_post_install_message
188     else
189         echo "Installed '$pkg_cmd_name' v$WEBI_VERSION as $pkg_new_cmd"
190     fi
191     echo ""
192 fi
193
194 rm -rf "$WEBI_TMP"
195
196 }