8773182092
The way we use it, gzip will store the current time in the header, which leads to unreproducible archives. Fix that by telling gzip to not store the name and date of the file it compresses, with the -n option. Since it compresses its stdin, there was already no filename stored; now there's even no date stored. Note: gzip has had -n since at least 1.2.4, released in 1993, so virtually every gzip out there nowadays has it. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
59 lines
1.6 KiB
Bash
Executable File
59 lines
1.6 KiB
Bash
Executable File
#!/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 -n <"${output}.tmp" >"${output}"
|