blob: eb9ce5922ac57a5e80fa6f2f110d9d3cef14cce9 [file] [log] [blame]
#!/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