Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 17 Oct 2020 12:37:13 +0000 (UTC)
From:      Matthias Andree <mandree@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r552563 - head/Mk/Scripts
Message-ID:  <202010171237.09HCbDfa005544@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mandree
Date: Sat Oct 17 12:37:13 2020
New Revision: 552563
URL: https://svnweb.freebsd.org/changeset/ports/552563

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

Modified:
  head/Mk/Scripts/sed_checked.sh   (contents, props changed)

Modified: head/Mk/Scripts/sed_checked.sh
==============================================================================
--- head/Mk/Scripts/sed_checked.sh	Sat Oct 17 12:19:45 2020	(r552562)
+++ head/Mk/Scripts/sed_checked.sh	Sat Oct 17 12:37:13 2020	(r552563)
@@ -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
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010171237.09HCbDfa005544>