aboutsummaryrefslogtreecommitdiff
path: root/Tools/scripts/sed_checked.sh
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/scripts/sed_checked.sh')
-rwxr-xr-xTools/scripts/sed_checked.sh91
1 files changed, 81 insertions, 10 deletions
diff --git a/Tools/scripts/sed_checked.sh b/Tools/scripts/sed_checked.sh
index 647d59c7ba19..dd03284db720 100755
--- a/Tools/scripts/sed_checked.sh
+++ b/Tools/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 sed failed: file content unchanged from backup: ${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
+