svn commit: r257784 - head/usr.sbin/bsdconfig/share

Devin Teske dteske at FreeBSD.org
Thu Nov 7 10:28:12 UTC 2013


Author: dteske
Date: Thu Nov  7 10:28:12 2013
New Revision: 257784
URL: http://svnweb.freebsd.org/changeset/base/257784

Log:
  Add an f_eval_catch() function for debugging individual commands in a
  series of commands. Accepts the `-d' flag as a first argument to skip
  displaying messages in a dialog box. The command is logged as it
  appears to the shell prior to the first pass of parameter expansion to
  allow copy/pasting into a real shell (opposed to simply echo'ing the
  command which would produce debug output that has undergone at least one
  pass of parameter expansion, thus no-longer copacetic for copy/paste).
  Takes printf(1) style syntax and a utility identifier for error messages.

Modified:
  head/usr.sbin/bsdconfig/share/common.subr

Modified: head/usr.sbin/bsdconfig/share/common.subr
==============================================================================
--- head/usr.sbin/bsdconfig/share/common.subr	Thu Nov  7 10:23:37 2013	(r257783)
+++ head/usr.sbin/bsdconfig/share/common.subr	Thu Nov  7 10:28:12 2013	(r257784)
@@ -777,6 +777,88 @@ f_mounted()
 	mount | grep -Eq " on $dir \([^)]+\)$"
 }
 
+# f_eval_catch [-d] $funcname $utility $format [$arguments ...]
+#
+# Silently evaluate a command in a sub-shell and test for error. If debugging
+# is enabled a copy of the command and its output is sent to debug (either
+# stdout or file depending on environment). If an error occurs, output of the
+# command is displayed in a dialog(1) msgbox using the [above] f_show_err()
+# function (unless optional `-d' flag is the first argument, then no dialog).
+# The $funcname argument is sent to debugging while the $utility argument is
+# used in the title of the dialog box. The command that is sent to debugging
+# along with $funcname is the product of the printf(1) syntax produced by
+# $format with optional $arguments.
+#
+# Example 1:
+#
+# 	debug=1
+# 	f_eval_catch myfunc cat 'contents=$( cat "%s" )' /some/file
+# 	# Error displayed ``cat: /some/file: No such file or directory''
+#
+# 	Produces the following debug output:
+#
+# 		DEBUG: myfunc: cat "/some/file"
+# 		DEBUG: myfunc: retval=1 <output below>
+# 		cat: /some/file: No such file or directory
+#
+# Example 2:
+#
+# 	debug=1
+# 	f_eval_catch myfunc echo 'echo "%s"' "Hello, World!"
+# 	# No error displayed
+#
+# 	Produces the following debug output:
+#
+# 		DEBUG: myfunc: echo "Hello, World!"
+# 		DEBUG: myfunc: retval=0 <output below>
+# 		Hello, World!
+#
+# Example 3:
+#
+# 	debug=1
+# 	echo 123 | f_eval_catch myfunc rev rev
+# 	# No error displayed
+#
+# 	Produces the following debug output:
+#
+# 		DEBUG: myfunc: rev
+# 		DEBUG: myfunc: retval=0 <output below>
+# 		321
+#
+# Example 4:
+#
+# 	debug=1
+# 	f_eval_catch myfunc true true
+# 	# No error displayed
+#
+# 	Produces the following debug output:
+#
+# 		DEBUG: myfunc: true
+# 		DEBUG: myfunc: retval=0 <no output>
+#
+f_eval_catch()
+{
+	local no_dialog=
+	[ "$1" = "-d" ] && no_dialog=1 && shift 1
+	local funcname="$1" utility="$2"; shift 2
+	local cmd output retval
+	cmd=$( printf -- "$@" )
+	f_dprintf "%s: %s" "$funcname" "$cmd" # Log command *before* eval
+	output=$( exec 2>&1; eval "$cmd" )
+	retval=$?
+	if [ "$output" ]; then
+		f_dprintf "%s: retval=%i <output below>\n%s" "$funcname" \
+		          $retval "$output"
+	else
+		f_dprintf "%s: retval=%i <no output>" "$funcname" $retval
+	fi
+	! [ "$no_dialog" -o "$nonInteractive" -o $retval -eq $SUCCESS ] &&
+		msg_error="${msg_error:-Error}${utility:+: $utility}" \
+			f_show_err "%s" "$output"
+		# NB: f_show_err will handle NULL output appropriately
+	return $retval
+}
+
 ############################################################ MAIN
 
 #


More information about the svn-src-all mailing list