Changeset View
Changeset View
Standalone View
Standalone View
head/Mk/Scripts/sed_checked.sh
Property | Old Value | New Value |
---|---|---|
svn:executable | * \ No newline at end of property | null |
#!/bin/sh | #!/bin/sh | ||||
set -e | # Rationale: | ||||
/usr/bin/sed -i.bak "$@" | # 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 | 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 | if [ -f "${x}" ]; then | ||||
# File? Check if sed was effective. | |||||
files=$(($files + 1)) | |||||
if cmp -s "${x}" "${x}".bak ; then | if cmp -s "${x}" "${x}".bak ; then | ||||
if [ ! -z "${REWARNFILE}" ]; then | issues=$(($issues + 1)) | ||||
echo - - REINPLACE_CMD ran, but did not modify file contents: ${x#${WRKSRC}/} >> ${REWARNFILE} | if [ $issues -eq 1 ] ; then | ||||
echo "sed failed:${args} ..." | |||||
fi | fi | ||||
echo " - file content unchanged from backup: ${x#${WRKSRC}/}" | |||||
fi | fi | ||||
else | |||||
# Not a file? Collect sed(1) command. | |||||
args="${args} ${x}" | |||||
fi | fi | ||||
done | 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 | |||||
} | |||||
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 | |||||