diff options
author | Matthias Andree <mandree@FreeBSD.org> | 2020-10-17 12:37:13 +0000 |
---|---|---|
committer | Matthias Andree <mandree@FreeBSD.org> | 2020-10-17 12:37:13 +0000 |
commit | 07deda62178b64259375b3b5628427c1c22f5ec1 (patch) | |
tree | 1e5a6b6f81da7d67831b1e348827eee5781f8682 /Mk | |
parent | 2601ff5d185d32dd11a0dfdd96ae69b96d0aa0ab (diff) | |
download | freebsd-ports-07deda62178b64259375b3b5628427c1c22f5ec1.zip |
Tools/scripts/sed_checked.sh: make more useful
- when sed expressions fail, report them, and the failing files,
to aid developers in identifying the commits
- check whether a REINPLACE_CMD is partially effective, or totally
ineffective, and adjust wording (please check vs. please FIX)
- use SED variable instead of /usr/bin/sed if set, for consistency.
portmgr@ hasn't raised objections other than performing power play,
and haven't responded with reasons to core@s question in
https://reviews.freebsd.org/D24240#592660 posed Sept 30 (17 days ago)
Approved by: portmgr@ (timeout, 200 days)
Differential Revision: https://reviews.freebsd.org/D24240
Diffstat (limited to 'Mk')
-rw-r--r--[-rwxr-xr-x] | Mk/Scripts/sed_checked.sh | 91 |
1 files changed, 81 insertions, 10 deletions
diff --git a/Mk/Scripts/sed_checked.sh b/Mk/Scripts/sed_checked.sh index 9c8c270f6099..dd03284db720 100755..100644 --- a/Mk/Scripts/sed_checked.sh +++ b/Mk/Scripts/sed_checked.sh @@ -1,13 +1,84 @@ #!/bin/sh -set -e -/usr/bin/sed -i.bak "$@" -for x in "${@}" ; do - if [ -f "${x}" ]; then - if cmp -s "${x}" "${x}".bak ; then - if [ ! -z "${REWARNFILE}" ]; then - echo - - REINPLACE_CMD ran, but did not modify file contents: ${x#${WRKSRC}/} >> ${REWARNFILE} - fi - fi +# Rationale: +# The ports tree has accumulated quite a bit of REINPLACE_CMD lines +# in its Makefile. Some of these have gone stale as ports were updated +# upstream, or as the ports have evolved. + +# For DEVELOPERS, we check the effectiveness of REINPLACE_CMD lines +# by requesting backup files be written, and comparing them against +# source files. + +set -eu + +DEBUG=: +#DEBUG=echo + +check_dash_i() { + # this must be called from a subshell so as not to clobber $@ + # WARNING: assumes that -i is given at least once! + unset OPTIND + $DEBUG >&2 DEBUG: check_dash_i "$@" + while getopts :EI:ae:f:i:lnru var ; do + $DEBUG >&2 DEBUG: option "$var" '"'"${OPTARG-""}"'"' + case "$var" in [iI]) + last_i="$OPTARG" + esac + done + + $DEBUG >&2 DEBUG: last_i='"'"$last_i"'"' + printf '"%s"\n' "$last_i" +} + +shadowed="$( (check_dash_i -i.bak "$@") )" +if [ "$shadowed" != '".bak"' ] ; then + echo >&2 "WARNING: $0 -i.bak clobbered by caller's backup suffix $shadowed" +fi + +${SED-/usr/bin/sed} -i.bak "$@" +check() { + issues=0 + files=0 + args= + for x in "${@}" ; do + # we decide very simply whether the argument we are looking at is + # a sed command or a file: if it's not a regular file, it must be + # a sed argument worth collecting for our warning message, + # so that maintainers can identify the failing sed command. + # + # We cannot easily relate to Makefile lines here. + if [ -f "${x}" ]; then + # File? Check if sed was effective. + files=$(($files + 1)) + if cmp -s "${x}" "${x}".bak ; then + issues=$(($issues + 1)) + if [ $issues -eq 1 ] ; then + echo "sed failed:${args} ..." + fi + echo " - file content unchanged from backup: ${x#${WRKSRC}/}" + fi + else + # Not a file? Collect sed(1) command. + args="${args} ${x}" + fi + done + + if [ ${issues} -gt 0 ] ; then + action="review" + if [ ${issues} -eq ${files} ] ; then + action=" FIX " # blanks at either end + else + action="review" + fi + echo "--- issues found: ${issues}, files to edit: ${files}, please ${action} ---" fi -done +} + +if [ ! -z "${REWARNFILE}" ] ; then + check "$@" | tee -a ${REWARNFILE} + # if ${REWARNFILE} is a regular file (not /dev/null) and empty, delete it. + if [ -f "${REWARNFILE}" -a ! -s "${REWARNFILE}" ] ; then rm -f "${REWARNFILE}" ; fi +else + check "$@" +fi + |