This commit is contained in:
Steve Wills 2020-10-19 12:19:14 +00:00
parent 7e010fa7b6
commit dd763c441c

91
Mk/Scripts/sed_checked.sh Executable file → Normal file
View file

@ -1,84 +1,13 @@
#!/bin/sh
# 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} ---"
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
fi
}
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
done