svn commit: r415842 - in head/Mk: . Scripts

Mathieu Arnold mat at FreeBSD.org
Wed May 25 15:58:33 UTC 2016


Author: mat
Date: Wed May 25 15:58:31 2016
New Revision: 415842
URL: https://svnweb.freebsd.org/changeset/ports/415842

Log:
  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

Added:
  head/Mk/Scripts/check-vulnerable.sh   (contents, props changed)
  head/Mk/Scripts/checksum.sh   (contents, props changed)
  head/Mk/Scripts/do-fetch.sh   (contents, props changed)
  head/Mk/Scripts/makesum.sh   (contents, props changed)
Modified:
  head/Mk/Scripts/functions.sh   (contents, props changed)
  head/Mk/bsd.port.mk   (contents, props changed)

Added: head/Mk/Scripts/check-vulnerable.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/Mk/Scripts/check-vulnerable.sh	Wed May 25 15:58:31 2016	(r415842)
@@ -0,0 +1,37 @@
+#!/bin/sh
+# $FreeBSD$
+#
+# MAINTAINER: portmgr at FreeBSD.org
+
+set -e
+
+. "${dp_SCRIPTSDIR}/functions.sh"
+
+validate_env dp_ECHO_MSG dp_PKG_BIN dp_PORTNAME
+
+[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_CHECK_VULNERABLE}" ] && set -x
+
+set -u
+
+# If the package is pkg, disable these checks, it fails while
+# upgrading when pkg is not there.
+# FIXME: check is this is still true
+if [ "${dp_PORTNAME}" = "pkg" ]; then
+	exit 0
+fi
+
+if [ -x "${dp_PKG_BIN}" ]; then
+	vlist=$(${dp_PKG_BIN} audit "${dp_PKGNAME}" || :)
+	if [ "${vlist}" = "0 problem(s) in the installed packages found." ]; then
+		vlist=""
+	fi
+fi
+
+if [ -n "$vlist" ]; then
+	${dp_ECHO_MSG} "===>  ${dp_PKGNAME} has known vulnerabilities:"
+	${dp_ECHO_MSG} "$vlist"
+	${dp_ECHO_MSG} "=> Please update your ports tree and try again."
+	${dp_ECHO_MSG} "=> Note: Vulnerable ports are marked as such even if there is no update available."
+	${dp_ECHO_MSG} "=> If you wish to ignore this vulnerability rebuild with 'make DISABLE_VULNERABILITIES=yes'"
+	exit 1
+fi

Added: head/Mk/Scripts/checksum.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/Mk/Scripts/checksum.sh	Wed May 25 15:58:31 2016	(r415842)
@@ -0,0 +1,91 @@
+#!/bin/sh
+# $FreeBSD$
+#
+# MAINTAINER: portmgr at FreeBSD.org
+
+set -e
+
+. "${dp_SCRIPTSDIR}/functions.sh"
+
+validate_env dp_CHECKSUM_ALGORITHMS dp_CURDIR dp_DISTDIR dp_DISTINFO_FILE \
+	dp_DIST_SUBDIR dp_ECHO_MSG dp_FETCH_REGET dp_MAKE dp_MAKEFLAGS \
+	dp_DISABLE_SIZE dp_NO_CHECKSUM
+
+[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_CHECKSUM}" ] && set -x
+
+set -u
+
+check_checksum_algorithms
+
+if [ -f "${dp_DISTINFO_FILE}" ]; then
+	cd "${dp_DISTDIR}"
+	OK=
+	refetchlist=
+	for file in "${@}"; do
+		ignored="true"
+		for alg in ${dp_CHECKSUM_ALGORITHMS}; do
+			ignore="false"
+			eval "alg_executable=\$dp_${alg}"
+
+			if [ "$alg_executable" != "NO" ]; then
+				MKSUM=$(eval $alg_executable \< "${file}")
+				CKSUM=$(distinfo_data "${alg}" "${file}")
+			else
+				ignore="true"
+			fi
+
+			if [ $ignore = "false" -a -z "$CKSUM" ]; then
+				${dp_ECHO_MSG} "=> No $alg checksum recorded for $file."
+				ignore="true"
+			fi
+
+			if [ $ignore = "false" ]; then
+				match="false"
+				for chksum in $CKSUM; do
+					if [ "$chksum" = "$MKSUM" ]; then
+						match="true"
+						break
+					fi
+				done
+				if [ $match = "true" ]; then
+					${dp_ECHO_MSG} "=> $alg Checksum OK for $file."
+					ignored="false"
+				else
+					${dp_ECHO_MSG} "=> $alg Checksum mismatch for $file."
+					refetchlist="$refetchlist $file "
+					OK="${OK:-retry}"
+					[ "${OK}" = "retry" -a "${dp_FETCH_REGET}" -gt 0 ] && rm -f "${file}"
+					ignored="false"
+				fi
+			fi
+		done
+
+		if [ $ignored = "true" ]; then
+			${dp_ECHO_MSG} "=> No suitable checksum found for $file."
+			OK=false
+		fi
+	done
+
+	if [ "${OK:=true}" = "retry" ] && [ "${dp_FETCH_REGET}" -gt 0 ]; then
+		${dp_ECHO_MSG} "===>  Refetch for ${dp_FETCH_REGET} more times files: $refetchlist"
+		if ${dp_MAKE} -C "${dp_CURDIR}" ${dp_MAKEFLAGS} FORCE_FETCH_LIST="$refetchlist" FETCH_REGET="$((dp_FETCH_REGET - 1))" fetch; then
+			if ${dp_MAKE} -C "${dp_CURDIR}" ${dp_MAKEFLAGS} FETCH_REGET="$((dp_FETCH_REGET - 1))" checksum ; then
+			OK="true"
+			fi
+		fi
+	fi
+
+	if [ "$OK" != "true" -a "${dp_FETCH_REGET}" -eq 0 ]; then
+		${dp_ECHO_MSG} "===>  Giving up on fetching files: $refetchlist"
+		${dp_ECHO_MSG} "Make sure the Makefile and distinfo file (${dp_DISTINFO_FILE})"
+		${dp_ECHO_MSG} "are up to date.  If you are absolutely sure you want to override this"
+		${dp_ECHO_MSG} "check, type \"make NO_CHECKSUM=yes [other args]\"."
+		exit 1
+	fi
+	if [ "$OK" != "true" ]; then
+		exit 1
+	fi
+elif [ -n "${@}" ]; then
+	${dp_ECHO_MSG} "=> No checksum file (${DISTINFO_FILE})."
+	exit 1
+fi

Added: head/Mk/Scripts/do-fetch.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/Mk/Scripts/do-fetch.sh	Wed May 25 15:58:31 2016	(r415842)
@@ -0,0 +1,174 @@
+#!/bin/sh
+# $FreeBSD$
+#
+# MAINTAINER: portmgr at 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
+

Modified: head/Mk/Scripts/functions.sh
==============================================================================
--- head/Mk/Scripts/functions.sh	Wed May 25 15:55:37 2016	(r415841)
+++ head/Mk/Scripts/functions.sh	Wed May 25 15:58:31 2016	(r415842)
@@ -216,3 +216,37 @@ export_ports_env() {
 		fi
 	done
 }
+
+distinfo_data() {
+	local alg file
+
+	alg=$1
+	file=$2
+
+	if [ \( -n "${dp_DISABLE_SIZE}" -a -n "${dp_NO_CHECKSUM}" \) -o ! -f "${dp_DISTINFO_FILE}" ]; then
+		exit
+	fi
+	awk -v alg="$alg" -v file="${file}" \
+		'$1 == alg && $2 == "(" file ")" {print $4}' "${dp_DISTINFO_FILE}"
+}
+
+check_checksum_algorithms() {
+	for alg in ${dp_CHECKSUM_ALGORITHMS}; do
+		eval "alg_executable=\$dp_$alg"
+		if [ -z "$alg_executable" ]; then
+			${dp_ECHO_MSG} "Checksum algorithm $alg: Couldn't find the executable."
+			${dp_ECHO_MSG} "Set $alg=/path/to/$alg in /etc/make.conf and try again."
+			exit 1
+		elif [ ! -x "$alg_executable" ]; then
+			${dp_ECHO_MSG} "Checksum algorithm $alg: $alg_executable is not executable."
+			${dp_ECHO_MSG} "Fix modes, or change $alg=$alg_executable in /etc/make.conf and try again."
+			exit 1
+		fi
+	done
+}
+escape() {
+	echo "$1" | sed -e 's/[&;()!#]/\\&/g'
+}
+unescape() {
+	echo "$1" | sed -e 's/\\//g'
+}

Added: head/Mk/Scripts/makesum.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/Mk/Scripts/makesum.sh	Wed May 25 15:58:31 2016	(r415842)
@@ -0,0 +1,53 @@
+#!/bin/sh
+# $FreeBSD$
+#
+# MAINTAINER: portmgr at FreeBSD.org
+
+set -e
+
+. "${dp_SCRIPTSDIR}/functions.sh"
+
+validate_env dp_CHECKSUM_ALGORITHMS dp_CKSUMFILES dp_DISTDIR dp_DISTINFO_FILE \
+	dp_ECHO_MSG
+
+[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_MAKESUM}" ] && set -x
+
+set -u
+
+DISTINFO_OLD=$(mktemp -t makesum-old)
+DISTINFO_NEW=$(mktemp -t makesum-new)
+
+trap 'rm -f ${DISTINFO_OLD} ${DISTINFO_NEW}' EXIT INT TERM
+
+check_checksum_algorithms
+
+cd "${dp_DISTDIR}"
+
+# Running `make makesum` a twice should not change the timestamp generated from
+# the first run.
+# So, we extract the content of the distinfo file minus the TIMESTAMP, if it
+# contains a TIMESTAMP.
+if [ -f "${dp_DISTINFO_FILE}" ] && grep -q "^TIMESTAMP " ${dp_DISTINFO_FILE}; then
+	grep -v "^TIMESTAMP " ${dp_DISTINFO_FILE} > ${DISTINFO_OLD}
+fi
+
+for file in ${dp_CKSUMFILES}; do
+	for alg in ${dp_CHECKSUM_ALGORITHMS}; do
+		eval "alg_executable=\$dp_$alg"
+
+		if [ "$alg_executable" != "NO" ]; then
+			$alg_executable "$file" >> "${DISTINFO_NEW}"
+		fi
+	done
+	echo "SIZE ($file) = $(stat -f %z "$file")" >> "${DISTINFO_NEW}"
+done
+
+# Now, we generate the distinfo file in two cases:
+# - If the saved file is empty, it means there was no TIMESTAMP in it, so we
+#   need to add one.
+# - If the old and new distinfo content minus the TIMESTAMP differ, it means
+#   something was updated or changed, it is time to generate a new timestamp.
+if [ ! -s ${DISTINFO_OLD} ] || ! cmp -s ${DISTINFO_OLD} ${DISTINFO_NEW}; then
+	echo "TIMESTAMP = $(date '+%s')" > ${dp_DISTINFO_FILE}
+	cat ${DISTINFO_NEW} >> ${dp_DISTINFO_FILE}
+fi

Modified: head/Mk/bsd.port.mk
==============================================================================
--- head/Mk/bsd.port.mk	Wed May 25 15:55:37 2016	(r415841)
+++ head/Mk/bsd.port.mk	Wed May 25 15:58:31 2016	(r415842)
@@ -2065,8 +2065,8 @@ FETCH_CMD?=		${FETCH_BINARY} ${FETCH_ARG
 .if defined(RANDOMIZE_MASTER_SITES)
 .if exists(/usr/games/random)
 RANDOM_CMD?=	/usr/games/random
-RANDOM_ARGS?=	"-w -f -"
-_RANDOMIZE_SITES=	" |${RANDOM_CMD} ${RANDOM_ARGS}"
+RANDOM_ARGS?=	-w -f -
+_RANDOMIZE_SITES=	 |${RANDOM_CMD} ${RANDOM_ARGS}
 .endif
 .endif
 
@@ -3062,195 +3062,114 @@ check-deprecated:
 AUDITFILE?=		${PKG_DBDIR}/vuln.xml
 
 check-vulnerable:
-.if !defined(DISABLE_VULNERABILITIES) && !defined(PACKAGE_BUILDING)
-	@if [ -f "${AUDITFILE}" ]; then \
-		if [ -x "${PKG_BIN}" ]; then \
-			vlist=`${PKG_BIN} audit "${PKGNAME}" || :`; \
-			if [ "$${vlist}" = "0 problem(s) in the installed packages found." ]; then \
-				vlist=""; \
-			fi; \
-		elif [ "${PORTNAME}" = "pkg" ]; then \
-			vlist=""; \
-		fi; \
-		if [ -n "$$vlist" ]; then \
-			${ECHO_MSG} "===>  ${PKGNAME} has known vulnerabilities:"; \
-			${ECHO_MSG} "$$vlist"; \
-			${ECHO_MSG} "=> Please update your ports tree and try again."; \
-			${ECHO_MSG} "=> Note: Vulnerable ports are marked as such even if there is no update available."; \
-			${ECHO_MSG} "=> If you wish to ignore this vulnerability rebuild with 'make DISABLE_VULNERABILITIES=yes'"; \
-			exit 1; \
-		fi; \
-	fi
+.if !defined(DISABLE_VULNERABILITIES) && !defined(PACKAGE_BUILDING) \
+		&& exists(${AUDITFILE})
+	@${SETENV} \
+			dp_ECHO_MSG="${ECHO_MSG}" \
+			dp_PKG_BIN="${PKG_BIN}" \
+			dp_PORTNAME="${PORTNAME}" \
+			dp_SCRIPTSDIR="${SCRIPTSDIR}" \
+			${SH} ${SCRIPTSDIR}/check-vulnerable.sh
 .endif
 
-# set alg to any of SIZE, SHA256 (or any other checksum algorithm):
-DISTINFO_DATA?=	if [ \( -n "${DISABLE_SIZE}" -a -n "${NO_CHECKSUM}" \) -o ! -f "${DISTINFO_FILE}" ]; then exit; fi; \
-	DIR=${DIST_SUBDIR}; ${AWK} -v alg=$$alg -v file=$${DIR:+$$DIR/}$${file}	\
-		'$$1 == alg && $$2 == "(" file ")" {print $$4}' ${DISTINFO_FILE}
+# Quote simply quote all variables, except FETCH_ENV, some ports are creative
+# with it, and it needs to be quoted twice to pass through the echo/eval in
+# do-fetch.
+_DO_FETCH_ENV= \
+			dp_DISABLE_SIZE='${DISABLE_SIZE}' \
+			dp_DISTDIR='${_DISTDIR}' \
+			dp_DISTINFO_FILE='${DISTINFO_FILE}' \
+			dp_DIST_SUBDIR='${DIST_SUBDIR}' \
+			dp_ECHO_MSG='${ECHO_MSG}' \
+			dp_FETCH_AFTER_ARGS='${FETCH_AFTER_ARGS}' \
+			dp_FETCH_BEFORE_ARGS='${FETCH_BEFORE_ARGS}' \
+			dp_FETCH_CMD='${FETCH_CMD}' \
+			dp_FETCH_ENV=${FETCH_ENV:Q:Q} \
+			dp_FORCE_FETCH_ALL='${FORCE_FETCH_ALL}' \
+			dp_FORCE_FETCH_LIST='${FORCE_FETCH_LIST}' \
+			dp_MASTER_SITE_BACKUP='${_MASTER_SITE_BACKUP}' \
+			dp_MASTER_SITE_OVERRIDE='${_MASTER_SITE_OVERRIDE}' \
+			dp_MASTER_SORT_AWK='${MASTER_SORT_AWK}' \
+			dp_NO_CHECKSUM='${NO_CHECKSUM}' \
+			dp_RANDOMIZE_SITES='${_RANDOMIZE_SITES}' \
+			dp_SCRIPTSDIR='${SCRIPTSDIR}' \
+			dp_SORTED_MASTER_SITES_DEFAULT_CMD='${SORTED_MASTER_SITES_DEFAULT_CMD}' \
+			dp_SORTED_PATCH_SITES_DEFAULT_CMD='${SORTED_PATCH_SITES_DEFAULT_CMD}' \
+			dp_TARGET='${.TARGET}'
+.if defined(DEVELOPER)
+_DO_FETCH_ENV+= dp_DEVELOPER=yes
+.else
+_DO_FETCH_ENV+= dp_DEVELOPER=
+.endif
 
 # Fetch
 
 .if !target(do-fetch)
 do-fetch:
-	@${MKDIR} ${_DISTDIR}
-	@cd ${_DISTDIR};\
-	${_MASTER_SITES_ENV} ; \
-	for _file in ${DISTFILES}; do \
-		file=$${_file%%:*}; \
-		if [ $$_file = $$file ]; then	\
-			select='';	\
-		else	\
-			select=`${ECHO_CMD} $${_file##*:} | ${SED} -e 's/,/ /g'` ;	\
-		fi;	\
-		force_fetch=false; \
-		filebasename=$${file##*/}; \
-		for afile in ${FORCE_FETCH}; do \
-			afile=$${afile##*/}; \
-			if [ "x$$afile" = "x$$filebasename" ]; then \
-				force_fetch=true; \
-			fi; \
-		done; \
-		if [ ! -f $$file -a ! -f $$filebasename -o "$$force_fetch" = "true" ]; then \
-			if [ -L $$file -o -L $$filebasename ]; then \
-				${ECHO_MSG} "=> ${_DISTDIR}/$$file is a broken symlink."; \
-				${ECHO_MSG} "=> Perhaps a filesystem (most likely a CD) isn't mounted?"; \
-				${ECHO_MSG} "=> Please correct this problem and try again."; \
-				exit 1; \
-			fi; \
-			if [ -f ${DISTINFO_FILE} -a "x${NO_CHECKSUM}" = "x" ]; then \
-				_sha256sum=`alg=SHA256; ${DISTINFO_DATA}`; \
-				if [ -z "$$_sha256sum" ]; then \
-					${ECHO_MSG} "=> $${DIR:+$$DIR/}$$file is not in ${DISTINFO_FILE}."; \
-					${ECHO_MSG} "=> Either ${DISTINFO_FILE} is out of date, or"; \
-					${ECHO_MSG} "=> $${DIR:+$$DIR/}$$file is spelled incorrectly."; \
-					exit 1; \
-				fi; \
-			fi; \
-			${ECHO_MSG} "=> $$file doesn't seem to exist in ${_DISTDIR}."; \
-			if [ ! -w ${_DISTDIR} ]; then \
-			   ${ECHO_MSG} "=> ${_DISTDIR} is not writable by you; cannot fetch."; \
-			   exit 1; \
-			fi; \
-			if [ ! -z "$$select" ] ; then \
-				__MASTER_SITES_TMP= ; \
-				for group in $$select; do \
-					if [ ! -z \$${_MASTER_SITES_$${group}} ] ; then \
-						eval ___MASTER_SITES_TMP="\$${_MASTER_SITES_$${group}}" ; \
-						__MASTER_SITES_TMP="$${__MASTER_SITES_TMP} $${___MASTER_SITES_TMP}" ; \
-					fi; \
-				done; \
-				___MASTER_SITES_TMP= ; \
-				SORTED_MASTER_SITES_CMD_TMP="${ECHO_CMD} ${_MASTER_SITE_OVERRIDE} `${ECHO_CMD} $${__MASTER_SITES_TMP} | ${AWK} '${MASTER_SORT_AWK:S|\\|\\\\|g}'` ${_MASTER_SITE_BACKUP}" ; \
-			else \
-				SORTED_MASTER_SITES_CMD_TMP="${SORTED_MASTER_SITES_DEFAULT_CMD}" ; \
-			fi; \
-			sites_remaining=0; \
-			sites="`eval $$SORTED_MASTER_SITES_CMD_TMP ${_RANDOMIZE_SITES}`"; \
-			for site in $${sites}; do \
-				sites_remaining=$$(($${sites_remaining} + 1)); \
-			done; \
-			for site in $${sites}; do \
-				sites_remaining=$$(($${sites_remaining} - 1)); \
-			    ${ECHO_MSG} "=> Attempting to fetch $${site}$${file}"; \
-				CKSIZE=`alg=SIZE; ${DISTINFO_DATA}`; \
-				case $${file} in \
-				*/*)	${MKDIR} $${file%/*}; \
-						args="-o $${file} $${site}$${file}";; \
-				*)		args=$${site}$${file};; \
-				esac; \
-				if ${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${args} ${FETCH_AFTER_ARGS}; then \
-					actual_size=`stat -f %z "$${file}"`; \
-					if [ -n "${DISABLE_SIZE}" ] || [ -z "$${CKSIZE}" ] || [ $${actual_size} -eq $${CKSIZE} ]; then \
-						continue 2; \
-					else \
-						${ECHO_MSG} "=> Fetched file size mismatch (expected $${CKSIZE}, actual $${actual_size})"; \
-						if [ $${sites_remaining} -gt 0 ]; then \
-							${ECHO_MSG} "=> Trying next site"; \
-							${RM} -f $${file}; \
-						fi; \
-					fi; \
-				fi; \
-			done; \
-			${ECHO_MSG} "=> Couldn't fetch it - please try to retrieve this";\
-			${ECHO_MSG} "=> port manually into ${_DISTDIR} and try again."; \
-			exit 1; \
-	    fi; \
-	 done
-.if defined(PATCHFILES)
-	@cd ${_DISTDIR};\
-	${_PATCH_SITES_ENV} ; \
-	for _file in ${PATCHFILES}; do \
-		file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^-:][^:]*$$//'` ; \
-		if [ $$_file = $$file ]; then	\
-			select='';	\
-		else	\
-			select=`${ECHO_CMD} $${_file##*:} | ${SED} -e 's/,/ /g'` ;	\
-		fi;	\
-		file=`${ECHO_CMD} $$file | ${SED} -E -e 's/:-[^:]+$$//'` ; \
-		force_fetch=false; \
-		filebasename=$${file##*/}; \
-		for afile in ${FORCE_FETCH}; do \
-			afile=$${afile##*/}; \
-			if [ "x$$afile" = "x$$filebasename" ]; then \
-				force_fetch=true; \
-			fi; \
-		done; \
-		if [ ! -f $$file -a ! -f $$filebasename -o "$$force_fetch" = "true" ]; then \
-			if [ -L $$file -o -L $${file##*/} ]; then \
-				${ECHO_MSG} "=> ${_DISTDIR}/$$file is a broken symlink."; \
-				${ECHO_MSG} "=> Perhaps a filesystem (most likely a CD) isn't mounted?"; \
-				${ECHO_MSG} "=> Please correct this problem and try again."; \
-				exit 1; \
-			fi; \
-			${ECHO_MSG} "=> $$file doesn't seem to exist in ${_DISTDIR}."; \
-			if [ ! -z "$$select" ] ; then \
-				__PATCH_SITES_TMP= ; \
-				for group in $$select; do \
-					if [ ! -z \$${_PATCH_SITES_$${group}} ] ; then \
-						eval ___PATCH_SITES_TMP="\$${_PATCH_SITES_$${group}}" ; \
-						__PATCH_SITES_TMP="$${__PATCH_SITES_TMP} $${___PATCH_SITES_TMP}" ; \
-					fi; \
-				done; \
-				___PATCH_SITES_TMP= ; \
-				SORTED_PATCH_SITES_CMD_TMP="${ECHO_CMD} ${_MASTER_SITE_OVERRIDE} `${ECHO_CMD} $${__PATCH_SITES_TMP} | ${AWK} '${MASTER_SORT_AWK:S|\\|\\\\|g}'` ${_MASTER_SITE_BACKUP}" ; \
-			else \
-				SORTED_PATCH_SITES_CMD_TMP="${SORTED_PATCH_SITES_DEFAULT_CMD}" ; \
-			fi; \
-			sites_remaining=0; \
-			sites="`eval $$SORTED_PATCH_SITES_CMD_TMP`"; \
-			for site in $${sites}; do \
-				sites_remaining=$$(($${sites_remaining} + 1)); \
-			done; \
-			for site in $${sites}; do \
-				sites_remaining=$$(($${sites_remaining} - 1)); \
-			    ${ECHO_MSG} "=> Attempting to fetch $${site}$${file}"; \
-				CKSIZE=`alg=SIZE; ${DISTINFO_DATA}`; \
-				case $${file} in \
-				*/*)	${MKDIR} $${file%/*}; \
-						args="-o $${file} $${site}$${file}";; \
-				*)		args=$${site}$${file};; \
-				esac; \
-				if ${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${args} ${FETCH_AFTER_ARGS}; then \
-					actual_size=`stat -f %z "$${file}"`; \
-					if [ -n "${DISABLE_SIZE}" ] || [ -z "$${CKSIZE}" ] || [ $${actual_size} -eq $${CKSIZE} ]; then \
-						continue 2; \
-					else \
-						${ECHO_MSG} "=> Fetched file size mismatch (expected $${CKSIZE}, actual $${actual_size})"; \
-						if [ $${sites_remaining} -gt 1 ]; then \
-							${ECHO_MSG} "=> Trying next site"; \
-							${RM} -f $${file}; \
-						fi; \
-					fi; \
-				fi; \
-			done; \
-			${ECHO_MSG} "=> Couldn't fetch it - please try to retrieve this";\
-			${ECHO_MSG} "=> port manually into ${_DISTDIR} and try again."; \
-			exit 1; \
-		fi; \
-	 done
+.if !empty(DISTFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_MASTER_SITES_ENV} \
+			dp_SITE_FLAVOR=MASTER \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${DISTFILES:C/.*/'&'/}
+.endif
+.if defined(PATCHFILES) && !empty(PATCHFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_PATCH_SITES_ENV} \
+			dp_SITE_FLAVOR=PATCH \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${PATCHFILES:C/:-p[0-9]//:C/.*/'&'/}
+.endif
+.endif
+#
+# Prints out a list of files to fetch (useful to do a batch fetch)
+
+.if !target(fetch-list)
+fetch-list:
+.if !empty(DISTFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_MASTER_SITES_ENV} \
+			dp_SITE_FLAVOR=MASTER \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${DISTFILES:C/.*/'&'/}
+.endif
+.if defined(PATCHFILES) && !empty(PATCHFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_PATCH_SITES_ENV} \
+			dp_SITE_FLAVOR=PATCH \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${PATCHFILES:C/:-p[0-9]//:C/.*/'&'/}
 .endif
 .endif
 
+# Used by fetch-urlall-list and fetch-url-list
+
+.if !target(fetch-url-list-int)
+fetch-url-list-int:
+.if !empty(DISTFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_MASTER_SITES_ENV} \
+			dp_SITE_FLAVOR=MASTER \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${DISTFILES:C/.*/'&'/}
+.endif
+.if defined(PATCHFILES) && !empty(PATCHFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_PATCH_SITES_ENV} \
+			dp_SITE_FLAVOR=PATCH \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${PATCHFILES:C/:-p[0-9]//:C/.*/'&'/}
+.endif
+.endif
+
+# Prints out all the URL for all the DISTFILES and PATCHFILES.
+
+.if !target(fetch-urlall-list)
+fetch-urlall-list:
+	@cd ${.CURDIR} && ${SETENV} FORCE_FETCH_ALL=yes ${MAKE} fetch-url-list-int
+.endif
+
+# Prints the URL for all the DISTFILES and PATCHFILES that are not here
+
+.if !target(fetch-url-list)
+fetch-url-list: fetch-url-list-int
+.endif
+
+
 # Extract
 
 clean-wrkdir:
@@ -3968,176 +3887,6 @@ delete-distfiles-list:
 .endif
 .endif
 
-# Prints out a list of files to fetch (useful to do a batch fetch)
-
-.if !target(fetch-list)
-fetch-list:
-	@${MKDIR} ${_DISTDIR}
-	@(cd ${_DISTDIR}; \
-	 ${_MASTER_SITES_ENV} ; \
-	 for _file in ${DISTFILES}; do \
-		file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \
-		if [ $$_file = $$file ]; then	\
-			select='';	\
-		else	\
-			select=`${ECHO_CMD} $${_file##*:} | ${SED} -e 's/,/ /g'` ;	\
-		fi;	\
-		if [ ! -f $$file -a ! -f $${file##*/} ]; then \
-			if [ ! -z "$$select" ] ; then \
-				__MASTER_SITES_TMP= ; \
-				for group in $$select; do \
-					if [ ! -z \$${_MASTER_SITES_$${group}} ] ; then \
-						eval ___MASTER_SITES_TMP=\$${_MASTER_SITES_$${group}} ; \
-						__MASTER_SITES_TMP="$${__MASTER_SITES_TMP} $${___MASTER_SITES_TMP}" ; \
-					fi; \
-				done; \
-				___MASTER_SITES_TMP= ; \
-				SORTED_MASTER_SITES_CMD_TMP="${ECHO_CMD} ${_MASTER_SITE_OVERRIDE} `${ECHO_CMD} $${__MASTER_SITES_TMP} | ${AWK} '${MASTER_SORT_AWK:S|\\|\\\\|g}'` ${_MASTER_SITE_BACKUP}" ; \
-			else \
-				SORTED_MASTER_SITES_CMD_TMP="${SORTED_MASTER_SITES_DEFAULT_CMD}" ; \
-			fi; \
-			${ECHO_CMD} -n ${MKDIR} ${_DISTDIR} '&& ' ; \
-			${ECHO_CMD} -n cd ${_DISTDIR} '&& { ' ; \
-			for site in `eval $$SORTED_MASTER_SITES_CMD_TMP ${_RANDOMIZE_SITES}`; do \
-				if [ ! -z "`${ECHO_CMD} ${NOFETCHFILES} | ${GREP} -w $${file}`" ]; then \
-					if [ -z "`${ECHO_CMD} ${MASTER_SITE_OVERRIDE} | ${GREP} -w $${site}`" ]; then \
-						continue; \
-					fi; \
-				fi; \
-				CKSIZE=`alg=SIZE; ${DISTINFO_DATA}`; \
-				case $${file} in \
-				*/*)	args="-o $${file} $${site}$${file}";; \
-				*)		args=$${site}$${file};; \
-				esac; \
-				${ECHO_CMD} -n ${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${args} "${FETCH_AFTER_ARGS}" '|| ' ; \
-			done; \
-			${ECHO_CMD} "${ECHO_CMD} $${file} not fetched; }" ; \
-		fi; \
-	done)
-.if defined(PATCHFILES)
-	@(cd ${_DISTDIR}; \
-	 ${_PATCH_SITES_ENV} ; \
-	 for _file in ${PATCHFILES}; do \
-		file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^-:][^:]*$$//'` ; \
-		if [ $$_file = $$file ]; then	\
-			select='';	\
-		else	\
-			select=`${ECHO_CMD} $${_file##*:} | ${SED} -e 's/,/ /g'` ;	\
-		fi;	\
-		file=`${ECHO_CMD} $$file | ${SED} -E -e 's/:-[^:]+$$//'` ; \
-		if [ ! -f $$file -a ! -f $${file##*/} ]; then \
-			if [ ! -z "$$select" ] ; then \
-				__PATCH_SITES_TMP= ; \
-				for group in $$select; do \
-					if [ ! -z \$${_PATCH_SITES_$${group}} ] ; then \
-						eval ___PATCH_SITES_TMP=\$${_PATCH_SITES_$${group}} ; \
-						__PATCH_SITES_TMP="$${__PATCH_SITES_TMP} $${___PATCH_SITES_TMP}" ; \
-				fi; \
-				done; \
-				___PATCH_SITES_TMP= ; \
-				SORTED_PATCH_SITES_CMD_TMP="${ECHO_CMD} ${_MASTER_SITE_OVERRIDE} `${ECHO_CMD} $${__PATCH_SITES_TMP} | ${AWK} '${MASTER_SORT_AWK:S|\\|\\\\|g}'` ${_MASTER_SITE_BACKUP}" ; \
-			else \
-				SORTED_PATCH_SITES_CMD_TMP="${SORTED_PATCH_SITES_DEFAULT_CMD}" ; \
-			fi; \
-			${ECHO_CMD} -n ${MKDIR} ${_DISTDIR} '&& ' ; \
-			${ECHO_CMD} -n cd ${_DISTDIR} '&& { ' ; \
-			for site in `eval $$SORTED_PATCH_SITES_CMD_TMP ${_RANDOMIZE_SITES}`; do \
-				CKSIZE=`alg=SIZE; ${DISTINFO_DATA}`; \
-				case $${file} in \
-				*/*)	args="-o $${file} $${site}$${file}";; \
-				*)		args=$${site}$${file};; \
-				esac; \
-				${ECHO_CMD} -n ${SETENV} ${FETCH_ENV} ${FETCH_CMD} ${FETCH_BEFORE_ARGS} $${args} "${FETCH_AFTER_ARGS}" '|| ' ; \
-			done; \
-			${ECHO_CMD} "${ECHO_CMD} $${file} not fetched; }" ; \
-		fi; \
-	 done)
-.endif
-.endif
-
-.if !target(fetch-url-list-int)
-fetch-url-list-int:
-	@${MKDIR} ${_DISTDIR}
-	@(cd ${_DISTDIR}; \
-	${_MASTER_SITES_ENV}; \
-	for _file in ${DISTFILES}; do \
-		file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^:]+$$//'` ; \
-			fileptn=`${ECHO_CMD} $$file | ${SED} 's|/|\\\\/|g;s/\./\\\\./g;s/\+/\\\\+/g;s/\?/\\\\?/g'` ; \
-		if [ $$_file = $$file ]; then	\
-			select='';	\
-		else	\
-			select=`${ECHO_CMD} $${_file##*:} | ${SED} -e 's/,/ /g'` ;	\
-		fi;	\
-		if [ ! -z "${LISTALL}" -o ! -f $$file -a ! -f $${file##*/} ]; then \
-			if [ ! -z "$$select" ] ; then \
-				__MASTER_SITES_TMP= ; \
-				for group in $$select; do \
-					if [ ! -z \$${_MASTER_SITES_$${group}} ] ; then \
-						eval ___MASTER_SITES_TMP=\$${_MASTER_SITES_$${group}} ; \
-						__MASTER_SITES_TMP="$${__MASTER_SITES_TMP} $${___MASTER_SITES_TMP}" ; \
-					fi \
-				done; \
-				___MASTER_SITES_TMP= ; \
-				SORTED_MASTER_SITES_CMD_TMP="${ECHO_CMD} ${_MASTER_SITE_OVERRIDE} `${ECHO_CMD} $${__MASTER_SITES_TMP} | ${AWK} '${MASTER_SORT_AWK:S|\\|\\\\|g}'` ${_MASTER_SITE_BACKUP}" ; \
-			else \
-				SORTED_MASTER_SITES_CMD_TMP="${SORTED_MASTER_SITES_DEFAULT_CMD}" ; \
-			fi ; \
-			for site in `eval $$SORTED_MASTER_SITES_CMD_TMP ${_RANDOMIZE_SITES}`; do \
-				case $${file} in \
-				*/*)	args="-o $${file} $${site}$${file}";; \
-				*)		args=$${site}$${file};; \
-				esac; \
-				${ECHO_CMD} $${args} ; \
-			done; \
-		fi \
-	done)
-.if defined(PATCHFILES)
-	@(cd ${_DISTDIR}; \
-	${_PATCH_SITES_ENV} ; \
-	for _file in ${PATCHFILES}; do \
-		file=`${ECHO_CMD} $$_file | ${SED} -E -e 's/:[^-:][^:]*$$//'` ; \
-		if [ $$_file = $$file ]; then	\
-			select='';	\
-		else	\
-			select=`${ECHO_CMD} $${_file##*:} | ${SED} -e 's/,/ /g'` ;	\
-		fi;	\
-		file=`${ECHO_CMD} $$file | ${SED} -E -e 's/:-[^:]+$$//'` ; \
-		fileptn=`${ECHO_CMD} $$file | ${SED} 's|/|\\\\/|g;s/\./\\\\./g;s/\+/\\\\+/g;s/\?/\\\\?/g'` ; \
-		if [ ! -z "${LISTALL}" -o ! -f $$file -a ! -f $${file##*/} ]; then \
-			if [ ! -z "$$select" ] ; then \
-				__PATCH_SITES_TMP= ; \
-				for group in $$select; do \
-					if [ ! -z \$${_PATCH_SITES_$${group}} ] ; then \
-						eval ___PATCH_SITES_TMP=\$${_PATCH_SITES_$${group}} ; \
-						__PATCH_SITES_TMP="$${__PATCH_SITES_TMP} $${___PATCH_SITES_TMP}" ; \
-					fi \
-				done; \
-				___PATCH_SITES_TMP= ; \
-				SORTED_PATCH_SITES_CMD_TMP="${ECHO_CMD} ${_MASTER_SITE_OVERRIDE} `${ECHO_CMD} $${__PATCH_SITES_TMP} | ${AWK} '${MASTER_SORT_AWK:S|\\|\\\\|g}'` ${_MASTER_SITE_BACKUP}" ; \
-			else \
-				SORTED_PATCH_SITES_CMD_TMP="${SORTED_PATCH_SITES_DEFAULT_CMD}" ; \
-			fi ; \
-			for site in `eval $$SORTED_PATCH_SITES_CMD_TMP ${_RANDOMIZE_SITES}`; do \
-				case $${file} in \
-				*/*)	args="-o $${file} $${site}$${file}";; \
-				*)		args=$${site}$${file};; \
-				esac; \
-				${ECHO_CMD} $${args} ; \
-			done; \
-		fi \
-	 done)
-.endif
-.endif
-
-.if !target(fetch-urlall-list)
-fetch-urlall-list:
-	@cd ${.CURDIR} && LISTALL=yes ${MAKE} fetch-url-list-int
-.endif
-
-.if !target(fetch-url-list)
-fetch-url-list: fetch-url-list-int
-.endif
-
 # Generates patches.
 
 update-patches:
@@ -4153,132 +3902,62 @@ update-patches:
 
 # Checksumming utilities
 
-check-checksum-algorithms:
-	@ \
-	${checksum_init} \
-	\
-	for alg in ${CHECKSUM_ALGORITHMS:tu}; do \
-		eval alg_executable=\$$$$alg; \
-		if [ -z "$$alg_executable" ]; then \
-			${ECHO_MSG} "Checksum algorithm $$alg: Couldn't find the executable."; \
-			${ECHO_MSG} "Set $$alg=/path/to/$$alg in /etc/make.conf and try again."; \
-			exit 1; \
-		fi; \
-	done; \
-
-checksum_init=\
-	SHA256=${SHA256};
+# List all algorithms here, all the variables name must begin with dp_
+_CHECKSUM_INIT_ENV= \
+	dp_SHA256=${SHA256}
 
 .if !target(makesum)
-makesum: check-checksum-algorithms
-	@cd ${.CURDIR} && ${MAKE} fetch NO_CHECKSUM=yes \
-		DISABLE_SIZE=yes
-	@if [ -f ${DISTINFO_FILE} ]; then \
-		if ${GREP} -q "^TIMESTAMP " ${DISTINFO_FILE}; then \
-			${GREP} -v "^TIMESTAMP " ${DISTINFO_FILE} > ${DISTINFO_FILE}.sav; \
-		fi; \
-	fi
-	@( \
-		cd ${DISTDIR}; \
-		\
-		${checksum_init} \
-		\
-		for file in ${_CKSUMFILES}; do \
-			for alg in ${CHECKSUM_ALGORITHMS:tu}; do \
-				eval alg_executable=\$$$$alg; \
-				\
-				if [ $$alg_executable != "NO" ]; then \
-					$$alg_executable $$file >> ${DISTINFO_FILE}.new; \
-				fi; \
-			done; \
-			${ECHO_CMD} "SIZE ($$file) = `${STAT} -f \"%z\" $$file`" >> ${DISTINFO_FILE}.new; \
-		done; \
-		if [ ! -f ${DISTINFO_FILE}.sav ] || ! cmp -s ${DISTINFO_FILE}.sav ${DISTINFO_FILE}.new; then \
-			${ECHO_CMD} "TIMESTAMP = `date '+%s'`" > ${DISTINFO_FILE} ; \
-				${CAT} ${DISTINFO_FILE}.new >> ${DISTINFO_FILE} ; \
-		fi ; \
-		rm -f ${DISTINFO_FILE}.new ${DISTINFO_FILE}.sav ; \
-	)
+# Some port change the options with OPTIONS_*_FORCE when make(makesum) to be
+# able to add all distfiles in one go.
+# For this to work, we need to call the do-fetch script directly here so that
+# the options consistent when fetching and when makesum'ing.
+# As we're fetching new distfiles, that are not in the distinfo file, disable
+# checksum and sizes checks.
+makesum:
+.if !empty(DISTFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_MASTER_SITES_ENV} \
+			dp_NO_CHECKSUM=yes dp_DISABLE_SIZE=yes \
+			dp_SITE_FLAVOR=MASTER \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${DISTFILES:C/.*/'&'/}
+.endif
+.if defined(PATCHFILES) && !empty(PATCHFILES)
+	@${SETENV} \
+			${_DO_FETCH_ENV} ${_PATCH_SITES_ENV} \
+			dp_NO_CHECKSUM=yes dp_DISABLE_SIZE=yes \
+			dp_SITE_FLAVOR=PATCH \
+			${SH} ${SCRIPTSDIR}/do-fetch.sh ${PATCHFILES:C/:-p[0-9]//:C/.*/'&'/}
+.endif
+	@${SETENV} \
+			${_CHECKSUM_INIT_ENV} \
+			dp_CHECKSUM_ALGORITHMS='${CHECKSUM_ALGORITHMS:tu}' \
+			dp_CKSUMFILES='${_CKSUMFILES}' \
+			dp_DISTDIR='${DISTDIR}' \
+			dp_DISTINFO_FILE='${DISTINFO_FILE}' \
+			dp_ECHO_MSG='${ECHO_MSG}' \
+			dp_SCRIPTSDIR='${SCRIPTSDIR}' \
+			${SH} ${SCRIPTSDIR}/makesum.sh ${DISTFILES:C/.*/'&'/}
 .endif
 
 .if !target(checksum)
-checksum: fetch check-checksum-algorithms
-	@set -e ; \
-	${checksum_init} \
-	if [ -f ${DISTINFO_FILE} ]; then \
-		cd ${DISTDIR}; OK="";\
-		for file in ${_CKSUMFILES}; do \
-			ignored="true"; \
-			_file=$${file#${DIST_SUBDIR}/*};	\
-			for alg in ${CHECKSUM_ALGORITHMS:tu}; do \
-				ignore="false"; \
-				eval alg_executable=\$$$$alg; \
-				\
-				if [ $$alg_executable != "NO" ]; then \
-					MKSUM=`$$alg_executable < $$file`; \
-					CKSUM=`file=$$_file; ${DISTINFO_DATA}`; \
-				else \
-					ignore="true"; \
-				fi; \
-				\
-				if [ $$ignore = "false" -a -z "$$CKSUM" ]; then \
-					${ECHO_MSG} "=> No $$alg checksum recorded for $$file."; \
-					ignore="true"; \
-				fi; \

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-ports-all mailing list