#!/usr/bin/env bash # We want to catch any unexpected failure, and exit immediately set -e # Download helper for git, to be called from the download wrapper script # # Call it as: # .../git [-q] OUT_FILE REPO_URL CSET BASENAME # # Environment: # GIT : the git command to call verbose= while getopts :q OPT; do case "${OPT}" in q) verbose=-q; exec >/dev/null;; \?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;; esac done shift $((OPTIND-1)) output="${1}" repo="${2}" cset="${3}" basename="${4}" # Caller needs to single-quote its arguments to prevent them from # being expanded a second time (in case there are spaces in them) _git() { eval ${GIT} "${@}" } # Try a shallow clone, since it is faster than a full clone - but that only # works if the version is a ref (tag or branch). Before trying to do a shallow # clone we check if ${cset} is in the list provided by git ls-remote. If not # we fall back on a full clone. # # Messages for the type of clone used are provided to ease debugging in case of # problems git_done=0 if [ -n "$(_git ls-remote "'${repo}'" "'${cset}'" 2>&1)" ]; then printf "Doing shallow clone\n" if _git clone ${verbose} --depth 1 -b "'${cset}'" --bare "'${repo}'" "'${basename}'"; then git_done=1 else printf "Shallow clone failed, falling back to doing a full clone\n" fi fi if [ ${git_done} -eq 0 ]; then printf "Doing full clone\n" _git clone ${verbose} --mirror "'${repo}'" "'${basename}'" fi GIT_DIR="${basename}" \ _git archive --prefix="'${basename}/'" -o "'${output}.tmp'" --format=tar "'${cset}'" gzip <"${output}.tmp" >"${output}"