ports/Mk/Scripts/do-fetch.sh
Mathieu Arnold 3255095c16 Extract the larger bsd.port.mk targets into separate scripts.
Refactor all the fetch code so that there are not 6 slightly different
versions of it but one that does it all.

The targets that have been extracted are:
- check-vulnerable
- do-fetch
- fetch-list
- fetch-url-list-int
- fetch-urlall-list
- checksum.
- makesum.
- check-checksum-algorithms

Run the fetch code directly from make makesum instead of calling make
fetch, this is because some port change the options with OPTIONS_*_FORCE
when make(makesum) to be able to add all distfiles in one go, which was
a nice, non working, idea.

PR:		208916
Submitted by:	mat
Exp-run by:	antoine
With hat:	portmgr
Sponsored by:	Absolight
Differential Revision:	https://reviews.freebsd.org/D5997
2016-05-25 15:58:31 +00:00

175 lines
5.2 KiB
Bash

#!/bin/sh
# $FreeBSD$
#
# MAINTAINER: portmgr@FreeBSD.org
set -e
. "${dp_SCRIPTSDIR}/functions.sh"
validate_env dp_DEVELOPER dp_DISABLE_SIZE dp_DISTDIR dp_DISTINFO_FILE \
dp_DIST_SUBDIR dp_ECHO_MSG dp_FETCH_AFTER_ARGS dp_FETCH_BEFORE_ARGS \
dp_FETCH_CMD dp_FETCH_ENV dp_FORCE_FETCH_ALL dp_FORCE_FETCH_LIST \
dp_MASTER_SITE_BACKUP dp_MASTER_SITE_OVERRIDE dp_MASTER_SORT_AWK \
dp_NO_CHECKSUM dp_RANDOMIZE_SITES dp_SITE_FLAVOR dp_SCRIPTSDIR \
dp_SORTED_MASTER_SITES_DEFAULT_CMD dp_SORTED_PATCH_SITES_DEFAULT_CMD \
dp_TARGET
[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_FETCH}" ] && set -x
set -u
mkdir -p "${dp_DISTDIR}"
cd "${dp_DISTDIR}"
for _file in "${@}"; do
file=${_file%%:*}
unescaped_file=$(unescape "${file}")
# If this files has groups
if [ "$_file" = "$file" ]; then
select=''
else
select=$(echo "${_file##*:}" | sed -e 's/,/ /g')
fi
filebasename=${file##*/}
if [ -n "${dp_FORCE_FETCH_ALL}" ]; then
force_fetch=true
else
force_fetch=false
for afile in ${dp_FORCE_FETCH_LIST}; do
afile=${afile##*/}
if [ "x$afile" = "x$filebasename" ]; then
force_fetch=true
fi
done
fi
if [ ! -f "${unescaped_file}" -a ! -f "$filebasename" -o "$force_fetch" = "true" ]; then
full_file="${dp_DIST_SUBDIR:+${dp_DIST_SUBDIR}/}${file}"
if [ -L "$file" -o -L "$filebasename" ]; then
${dp_ECHO_MSG} "=> ${dp_DISTDIR}/$file is a broken symlink."
${dp_ECHO_MSG} "=> Perhaps a filesystem (most likely a CD) isn't mounted?"
${dp_ECHO_MSG} "=> Please correct this problem and try again."
exit 1
fi
if [ -f "${dp_DISTINFO_FILE}" -a -z "${dp_NO_CHECKSUM}" ]; then
_sha256sum=$(distinfo_data SHA256 "${full_file}")
if [ -z "$_sha256sum" ]; then
${dp_ECHO_MSG} "=> ${dp_DIST_SUBDIR:+$dp_DIST_SUBDIR/}$file is not in ${dp_DISTINFO_FILE}."
${dp_ECHO_MSG} "=> Either ${dp_DISTINFO_FILE} is out of date, or"
${dp_ECHO_MSG} "=> ${dp_DIST_SUBDIR:+$dp_DIST_SUBDIR/}$file is spelled incorrectly."
exit 1
fi
fi
case ${dp_TARGET} in
do-fetch|makesum)
${dp_ECHO_MSG} "=> $file doesn't seem to exist in ${dp_DISTDIR}."
;;
esac
if [ ! -w "${dp_DISTDIR}" ]; then
${dp_ECHO_MSG} "=> ${dp_DISTDIR} is not writable by you; cannot fetch."
exit 1
fi
if [ -n "$select" ] ; then
__MASTER_SITES_TMP=
for group in $select; do
# Disable nounset for this, it may come up empty.
set +u
eval ___MASTER_SITES_TMP="\${_${dp_SITE_FLAVOR}_SITES_${group}}"
set -u
if [ -n "${___MASTER_SITES_TMP}" ] ; then
__MASTER_SITES_TMP="${__MASTER_SITES_TMP} ${___MASTER_SITES_TMP}"
else
case ${dp_TARGET} in
do-fetch|makesum)
if [ -n "${dp_DEVELOPER}" ]; then
${dp_ECHO_MSG} "===> /!\\ Error /!\\"
else
${dp_ECHO_MSG} "===> /!\\ Warning /!\\"
fi
${dp_ECHO_MSG} " The :${group} group used for $file is missing"
${dp_ECHO_MSG} " from ${dp_SITE_FLAVOR}_SITES. Check for typos, or errors."
if [ -n "${dp_DEVELOPER}" ]; then
exit 1
fi
;;
esac
fi
done
___MASTER_SITES_TMP=
SORTED_MASTER_SITES_CMD_TMP="echo ${dp_MASTER_SITE_OVERRIDE} $(echo -n "${__MASTER_SITES_TMP}" | awk "${dp_MASTER_SORT_AWK}") ${dp_MASTER_SITE_BACKUP}"
else
if [ ${dp_SITE_FLAVOR} = "MASTER" ]; then
SORTED_MASTER_SITES_CMD_TMP="${dp_SORTED_MASTER_SITES_DEFAULT_CMD}"
else
SORTED_MASTER_SITES_CMD_TMP="${dp_SORTED_PATCH_SITES_DEFAULT_CMD}"
fi
fi
case ${dp_TARGET} in
fetch-list)
echo -n "mkdir -p ${dp_DISTDIR} && "
echo -n "cd ${dp_DISTDIR} && { "
;;
esac
sites_remaining=0
sites="$(eval "${SORTED_MASTER_SITES_CMD_TMP} ${dp_RANDOMIZE_SITES}")"
for site in ${sites}; do
sites_remaining=$((sites_remaining + 1))
done
for site in ${sites}; do
sites_remaining=$((sites_remaining - 1))
CKSIZE=$(distinfo_data SIZE "${full_file}")
# The site may contain special shell characters, they
# need to be escaped.
site=$(escape "${site}")
# There is a lot of escaping, but the " needs to survive echo/eval.
case ${file} in
*/*)
mkdir -p "${file%/*}"
args="-o \\\"${file}\\\" \\\"${site}${file}\\\""
;;
*)
args="\\\"${site}${file}\\\""
;;
esac
_fetch_cmd=$(eval "echo ${dp_FETCH_ENV} ${dp_FETCH_CMD} ${dp_FETCH_BEFORE_ARGS} ${args} ${dp_FETCH_AFTER_ARGS}")
case ${dp_TARGET} in
do-fetch|makesum)
${dp_ECHO_MSG} "=> Attempting to fetch ${site}${file}"
if eval "env ${_fetch_cmd}"; then
actual_size=$(eval stat -f %z "${file}")
if [ -n "${dp_DISABLE_SIZE}" ] || [ -z "${CKSIZE}" ] || [ "${actual_size}" -eq "${CKSIZE}" ]; then
continue 2
else
${dp_ECHO_MSG} "=> Fetched file size mismatch (expected ${CKSIZE}, actual ${actual_size})"
if [ ${sites_remaining} -gt 0 ]; then
${dp_ECHO_MSG} "=> Trying next site"
rm -f "${file}"
fi
fi
fi
;;
fetch-list)
echo -n "env ${_fetch_cmd} || "
;;
fetch-url-list-int)
eval "echo $(eval "echo ${args}")"
;;
esac
done
case ${dp_TARGET} in
do-fetch|makesum)
${dp_ECHO_MSG} "=> Couldn't fetch it - please try to retrieve this"
${dp_ECHO_MSG} "=> port manually into ${dp_DISTDIR} and try again."
exit 1
;;
fetch-list)
echo "echo ${file} not fetched; }" ; \
;;
esac
fi
done