#!/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()
. "${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
    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="$( _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}"
