| #!/bin/bash |
| # |
| # download.sh -- |
| # Download a tarball from the specified URL to the specified target |
| # directory, untar it, and remove the tarball file. If the URL is |
| # a repository and not a file, then clone it. |
| # |
| # Usage: download.sh <url> <target_dir> [<strip>|<commit>|<tag>] |
| # |
| # where: |
| # |
| # <url> is the URL of the repository to download. If the <url> ends |
| # in 'gz' then it is assumed to be a gzipped tarball format. |
| # Otherwise, it is assumed to be a clonable git repo. |
| # <target_dir> is the local name to call the untarred directory. The |
| # tarball will be downloaded to the directory above this, |
| # untarred while renaming to <target_dir>, and then the tarball |
| # file will be deleted. |
| # <strip> is the number of directory levels to strip off the front of the |
| # tarball contents. Defaults to 1 if not specified (only |
| # applicable if <url> points to a tarball). |
| # <commit> or <tag> is a specific reference commit to clone. If the |
| # <url> is not a git repository, then this option has no effect. |
| # |
| |
| # Check if <url> points to a tarball or a repository (note: this assumes |
| # the form on github where the filename is spelled out as ".tar.gz" and |
| # not ".tgz") |
| |
| function git_retry() { |
| set -Eeuo pipefail |
| RETRIES_NO=5 |
| RETRY_DELAY=3 |
| for i in $(seq 1 $RETRIES_NO); do |
| git $@ && break |
| sleep ${RETRY_DELAY} |
| [[ $i -eq $RETRIES_NO ]] && echo "Failed to execute git cmd after $RETRIES_NO retries" && return 1 |
| done |
| } |
| |
| set -e |
| |
| if [ "${1: -3}" == ".gz" ] ; then |
| |
| # Neither curl or wget are guaranteed to be included in all *nix systems, |
| # (but most have *one* of them). This tools tries its best to find one. |
| |
| DL_CMD= |
| if type "wget" > /dev/null; then |
| DL_CMD="wget --tries=5 -qO" |
| fi |
| |
| if type "curl" > /dev/null; then |
| DL_CMD="curl --retry 5 --retry-all-errors -sLo" |
| fi |
| |
| if [ "$DL_CMD" = "" ]; then |
| echo "ERROR: Either curl or wget are required to automatically install tools." |
| exit 1 |
| fi |
| |
| pdir=`dirname $2` |
| mkdir -p $pdir |
| cd $pdir |
| |
| echo "Downloading $1 to $2" |
| $DL_CMD $2.tar.gz $1 |
| |
| if [ $# -gt 2 ]; then |
| snum=$3 |
| else |
| snum=1 |
| fi |
| |
| mkdir -p $2 |
| echo "Untarring and removing $2.tar.gz" |
| tar -xf $2.tar.gz --strip-components $snum -C $2 |
| rm $2.tar.gz |
| |
| else |
| |
| if type "git" > /dev/null; then |
| echo "Cloning $1 to $2" |
| if [ $# -gt 2 ]; then |
| if [ "$3" == "unknown" ]; then |
| git_retry clone --depth 1 $1 $2 |
| else |
| # Not gonna retry on the first `git clone`- the backup command |
| # exists anyway |
| { git clone --branch $3 --single-branch $1 $2; } || |
| { git_retry clone $1 $2 && git -C $2 checkout $3; } |
| fi |
| else |
| git_retry clone --depth 1 $1 $2 |
| fi |
| |
| else |
| echo "ERROR: \"git\" is required to automatically install tools." |
| exit 1 |
| fi |
| fi |
| |
| exit 0 |