mirror of
https://gitlab.com/buildroot.org/buildroot.git
synced 2026-08-01 21:23:51 -09:00
Use the 'C' locale when retrieving the date of the last change using 'svn info' since the svn download helper script expect "Last Changed Date" string. If another locale is used, the 'date' is empty so the generated archive (by mk_tar_gz) will not match the expected hash since the file timestamp is not set properly. If LANG=fr_FR.UTF-8 is defined in the host system, svn print some "French encrypted" text: eval svn --non-interactive --config-option servers:global:http-timeout=10 info ''\''https://svn.code.sf.net/p/xmlrpc-c/code/advanced@r3176'\''' ... Date de la dernière modification: 2023-09-02 19:13:35 +0200 (sam. 02 sept. 2023) diffoscope confirm that the file timestamp is not set correctly in the generated archive: $ diffoscope NOK/libxmlrpc-r3176-svn5.tar.gz OK/libxmlrpc-r3176-svn5.tar.gz Signed-off-by: Julien Olivain <ju.o@free.fr>
92 lines
3.1 KiB
Bash
Executable File
92 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# NOTE: if the output of this backend has to change (e.g. we change what gets
|
|
# included in the archive, or we change the format of the archive (e.g. tar
|
|
# options, compression ratio or method)), we MUST update the format version
|
|
# in the variable BR_FTM_VERSION_svn, in package/pkg-download.mk.
|
|
|
|
# We want to catch any unexpected failure, and exit immediately
|
|
set -e
|
|
|
|
# Download helper for svn, to be called from the download wrapper script
|
|
#
|
|
# Options:
|
|
# -q Be quiet.
|
|
# -o FILE Generate archive in FILE.
|
|
# -u URI Checkout from repository at URI.
|
|
# -c REV Use revision REV.
|
|
# -n NAME Use basename NAME.
|
|
# -r Recursive, i.e. use externals
|
|
#
|
|
# Environment:
|
|
# SVN : the svn command to call
|
|
|
|
# shellcheck disable=SC1090 # Only provides mk_tar_gz()
|
|
# shellcheck disable=SC1091
|
|
. "${0%/*}/helpers"
|
|
|
|
quiet=
|
|
externals=--ignore-externals
|
|
while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do
|
|
case "${OPT}" in
|
|
q) quiet=-q;;
|
|
o) output="${OPTARG}";;
|
|
u) uri="${OPTARG}";;
|
|
c) rev="${OPTARG}";;
|
|
n) basename="${OPTARG}";;
|
|
r) externals=;;
|
|
:) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;;
|
|
\?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;;
|
|
esac
|
|
done
|
|
|
|
shift $((OPTIND-1)) # Get rid of our options
|
|
|
|
# Caller needs to single-quote its arguments to prevent them from
|
|
# being expanded a second time (in case there are spaces in them)
|
|
_svn() {
|
|
if [ -z "${quiet}" ]; then
|
|
printf '%s ' "${SVN}" "${@}"; printf '\n'
|
|
fi
|
|
_plain_svn "$@"
|
|
}
|
|
# Note: please keep command below aligned with what is printed above
|
|
_plain_svn() {
|
|
# shellcheck disable=SC2086 # We want word-splitting for SVN
|
|
# shellcheck disable=SC2294
|
|
eval ${SVN} "${@}"
|
|
}
|
|
|
|
# shellcheck disable=SC2086 # externals and quiet may be empty
|
|
_svn export --ignore-keywords ${quiet} ${externals} "${@}" "'${uri}@${rev}'" "'${basename}'"
|
|
|
|
# For 'svn info', we only need the credentials, if any; other options
|
|
# would be invalid, as they are intended for 'svn export'.
|
|
# We can also consume the positional parameters, as we'll no longer
|
|
# be calling any other remote-reaching svn command.
|
|
creds=
|
|
while [ ${#} -gt 0 ]; do
|
|
case "${1}" in
|
|
--username=*) creds+=" ${1}"; shift;;
|
|
--password=*) creds+=" ${1}"; shift;;
|
|
--username) creds+=" ${1} ${2}"; shift 2;;
|
|
--password) creds+=" ${1} ${2}"; shift 2;;
|
|
*) shift;;
|
|
esac
|
|
done
|
|
|
|
# Get the date of the revision, to generate reproducible archives.
|
|
# The output format is YYYY-MM-DDTHH:MM:SS.mmmuuuZ (i.e. always in the
|
|
# UTC timezone), which we can feed as-is to the --mtime option for tar.
|
|
# In case there is a redirection (e.g. http -> https), just keep the
|
|
# last line (svn outputs everything on stdout)
|
|
# shellcheck disable=SC2086 # creds may be empty
|
|
date="$( LC_ALL=C _plain_svn info ${creds} "'${uri}@${rev}'" \
|
|
|sed -r -e '/^Last Changed Date: /!d; s///'
|
|
)"
|
|
|
|
# Generate the archive.
|
|
# We did a 'svn export' above, so it's not a working copy (there is no .svn
|
|
# directory or file to ignore).
|
|
mk_tar_gz "${basename}" "${basename}" "${date}" "${output}"
|