summary refs log tree commit diff
path: root/Util/reporter
diff options
context:
space:
mode:
Diffstat (limited to 'Util/reporter')
-rw-r--r--Util/reporter444
1 files changed, 444 insertions, 0 deletions
diff --git a/Util/reporter b/Util/reporter
new file mode 100644
index 000000000..8f8f530ae
--- /dev/null
+++ b/Util/reporter
@@ -0,0 +1,444 @@
+#!/usr/local/bin/zsh
+#
+# NAME:
+#	reporter
+#
+# SYNOPSIS:
+#	reporter [all | aliases | bindings | completion | functions |
+#			limits | options | variables]
+#
+# DESCRIPTION:
+#	"reporter" prints your current environment variables, shell
+#	variables, limits, completion settings, and option settings to
+#	stdout in the form of a script.
+#
+#	If you run into a zsh bug, someone can source the output script to
+#	recreate most of the environment under which you were working.
+#
+#	IMPORTANT:	"source" this script, don't try to run it directly.
+#			Otherwise it won't report the settings for your
+#			current shell session.
+#
+# OPTIONS:
+#	All command-line options can be abbreviated.
+#
+#	"aliases"	prints only aliases.
+#	"bindings"	prints only "bindkey" commands.
+#	"completion"	prints only "compctl" commands.
+#	"functions"	prints "autoload" commands or actual functions.
+#	"limits"	prints "limit" commands for things like cputime, etc.
+#	"modules"	prints "zmodload" commands.
+#	"options"	prints "setopt" commands.
+#	"variables"	prints both shell and environment variables.
+#
+#	"all"		tries to find every useful setting under your shell.
+#			This is the default, and it's the same as typing all
+#			of the above options on the command line.
+#
+# CAVEATS:
+#	Assumes that you have the following programs in your search path:
+#		awk, cut, echo, grep, sed, sort
+#	Assumes that your C preprocessor lives in /lib/cpp or /usr/ccs/lib/cpp.
+#	Uses (and unsets) variables beginning with "reporter_".
+#
+# RESTRICTIONS:
+#	DON'T:	pretend you wrote it, sell it, or blame me if it breaks.
+#	DO:	as ye will an' ye harm none.
+#					--Wiccan saying, I think
+#
+# BUGS:
+#	I'm sure there are more than a few.  To be safe, run "zsh -f" before
+#	sourcing the output from this script.  If you have "screen", you may
+#	want to use that, too; I hammered my terminal settings beyond repair
+#	when using an early version, and "screen" saved me from having to
+#	login on another terminal.
+#
+# HISTORY:
+#	The name was ripped off from the Emacs "reporter.el" function.
+#	The idea came from a mail message to the ZSH mailing list:
+#
+# Begin Configuration Section
+#
+
+reporter_OSVersion="`uname -s`_`uname -r`"
+
+#
+# Solaris 2.x
+#
+case ${reporter_OSVersion} in
+	SunOS_5.*)
+		CPP=${CPP:-/usr/ccs/lib/cpp}
+		AWK=${AWK:-nawk}	# GNU AWK doesn't come standard :-(
+		;;
+esac
+
+#
+# Default Values 
+#
+
+CPP=${CPP:-/lib/cpp}
+AWK=${AWK:-awk}
+
+#
+# End Configuration Section
+#
+
+reporter_do_all=yes
+
+for each in $*
+do
+	case "$each"
+	in
+		ali*)	reporter_do_aliases=yes; reporter_do_all=no ;;
+		b*)	reporter_do_bindings=yes; reporter_do_all=no ;;
+		c*)	reporter_do_compctl=yes; reporter_do_all=no ;;
+		f*)	reporter_do_fun=yes; reporter_do_all=no ;;
+		l*)	reporter_do_lim=yes; reporter_do_all=no ;;
+		m*)	reporter_do_mod=yes; reporter_do_all=no ;;
+		o*)	reporter_do_setopt=yes; reporter_do_all=no ;;
+		v*)	reporter_do_vars=yes; reporter_do_all=no ;;
+		*)	;;
+	esac
+done
+
+#
+#	The "cshjunkiequotes" option can break some of the commands
+#	used in the remainder of this script, so we check for that first
+#	and disable it.  We'll re-enable it later.
+#
+
+reporter_junkiequotes="no"
+
+if setopt | grep "cshjunkiequotes" > /dev/null
+then
+	reporter_junkiequotes="yes"
+	unsetopt cshjunkiequotes
+fi
+
+#
+#	UNAME
+#
+#	This shows your system name.  It's extremely system-dependent, so
+#	we need a way to find out what system you're on.  The easiest
+#	way to do this is by using "uname", but not everyone has that,
+#	so first we go through the search path.
+#
+#	If we don't find it, then the only thing I can think of is to
+#	check what's defined in your C compiler, and code in some exceptions
+#	for the location of "uname" or an equivalent.  For example, Pyramid
+#	has "uname" only in the ATT universe.  This code assumes that
+#	the "-a" switch is valid for "uname".
+#
+#	This section of code sees what is defined by "cpp".  It was
+#	originally written by brandy@tramp.Colorado.EDU (Carl Brandauer).
+#	Additional error checking and sed hacking added by Ken Phelps.
+#
+
+reporter_cppdef=`strings -3 ${CPP} |
+	sed -n '
+	/^[a-zA-Z_][a-zA-Z0-9_]*$/{
+	s/.*/#ifdef &/p
+	s/.* \(.*\)/"\1";/p
+	s/.*/#endif/p
+	}
+	' | ${CPP} |sed '
+	/^[	 ]*$/d
+	/^#/d
+	s/.*"\(.*\)".*/\1/'`
+
+reporter_uname=""
+
+for each in `echo $PATH | sed -e 's/:/ /g'`
+do
+	if [ -x $each/uname ]
+	then
+		reporter_uname="$each/uname"
+		break
+	fi
+done
+
+case "$reporter_uname"
+in
+	"")	reporter_uname="echo not found on this system" ;;
+	*)	;;
+esac
+
+for each in $reporter_cppdef
+do
+	case "$each"
+	in
+		pyr)	reporter_uname="/bin/att uname" ;;
+		*)	;;
+	esac
+done
+
+str=`eval $reporter_uname -a`
+
+echo '# START zsh saveset'
+echo '# uname: ' $str
+echo
+
+unset reporter_cppdef
+unset reporter_uname
+
+#
+#	ALIASES
+#
+#	Use "alias -L" to get a listing of the aliases in the form we want.
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_aliases" = "yes"
+then
+	echo '# Aliases.'
+	echo
+
+	alias -L
+fi
+
+#
+#	KEY BINDINGS
+#
+#	The -L option does most of the work.  The subshell is used to
+#	avoid modifying things that will be recorded later.
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_bindings" = "yes"
+then
+	echo
+	echo "# Key bindings."
+	echo
+	bindkey -lL
+	(
+		alias bindkey=bindkey
+		bindkey () {
+			[[ "$1" == "-N" ]] || return
+			[[ "$2" == "--" ]] && shift
+			echo
+			builtin bindkey -L -M -- "$2"
+		}
+		eval "`builtin bindkey -lL`"
+	)
+fi
+
+#
+#	COMPLETION COMMANDS
+#	Warning:  this won't work for zsh-2.5.03.
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_compctl" = "yes"
+then
+	echo
+	echo "# Completions."
+	echo
+
+	compctl -L
+fi
+
+#
+#	FUNCTIONS
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_fun" = "yes"
+then
+	echo 
+	echo "# Undefined functions."
+	echo
+
+	functions | grep "undefined" | ${AWK} '{print "autoload " $2}'
+
+	echo 
+	echo "# Defined functions."
+	echo
+
+	functions | grep -v "undefined"
+fi
+
+#
+#	LIMITS
+#
+#	"cputime" has to be handled specially, because you can specify
+#	the time as just hours, or "minutes:seconds".
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_lim" = "yes"
+then
+	echo
+	echo '# Limits.'
+	echo
+
+	(
+		set X `limit | grep "cputime" | grep -v "unlimited" |
+			sed -e 's/:/ /g'`
+
+		if test "$#" -gt 1
+		then
+			hr=$3
+			min=$4
+			sec=$5
+
+			if test "$hr" -gt 0
+			then
+				echo "limit cputime ${hr}h"
+			else
+				echo "limit cputime $min:$sec"
+			fi
+		fi
+	)
+
+	limit | grep -v "cputime" | grep -v "unlimited" |
+		sed -e 's/Mb/m/' -e 's/Kb/k/' |
+		${AWK} 'NF > 1 {print "limit " $0}'
+fi
+
+#
+#	MODULE LOADING COMMANDS
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_mod" = "yes"
+then
+	echo
+	if ( zmodload ) >& /dev/null; then
+		echo "# Modules."
+		echo
+		zmodload -d -L
+		echo
+		zmodload -a -L
+		echo
+		zmodload -L
+	else
+		echo "# Modules: zmodload not available."
+	fi
+fi
+
+#
+#	NON-ARRAY VARIABLES
+#
+#	We run this in a subshell to preserve the TERMCAP and TERM settings
+#	in the current shell.  Also, reset the prompt to show you're now
+#	in a test shell.  I can't find an easy way to do IFS, so I ignore it.
+#
+#	Most of the sed nonsense is to make sure that variables are quoted
+#	when being set.  We also have to make sure that single-quotes and
+#	back-quotes are escaped.  This is why variable settings are
+#	surrounded by double quotes; some variables like SPROMPT have single
+#	quotes and back-quotes, and it's just too hard to escape those
+#	properly when setting them.
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_vars" = "yes"
+then
+	echo
+	echo "# Non-array variables."
+	echo
+
+	(
+		echo "TERMCAP='$TERMCAP'"
+		echo "TERM='$TERM'"
+		unset TERMCAP
+
+		set | grep '=' | grep -v 'prompt=' |
+			grep -v 'reporter_do' |
+			grep -v '^[!#$*0?@_-]=' |
+			grep -v '=(' | sed -e "s/'/\\\'/g" |
+                        sed -e 's/`/\\`/g' |
+			sed -e 's/=/="/' -e 's/$/"/' |
+			grep -v '^IFS=' |
+			grep -v '^TERMCAP=' |
+			grep -v '^TERM='
+
+		echo "prompt='test%'"
+	)
+
+#
+#	ARRAY VARIABLES
+#
+#	The "grep -v" nonsense is to keep from setting shell variables
+#	that caused me some trouble from a script.
+#
+
+	echo
+	echo "# Array variables."
+	echo
+
+	echo "argv=()"
+	set | grep '=' | grep -v 'argv=' |
+		grep -v 'reporter_do' | grep -v '^[!#$*0?@_-]=' |
+		grep '=('
+
+#
+#	EXPORTED VARIABLES
+#
+#	Run this in a subshell to preserve the TERM and TERMCAP setting in
+#	the current shell.
+#
+
+	echo
+	echo "# Exported variables."
+	echo
+
+	(
+		echo "export TERMCAP"
+		echo "export TERM"
+		unset TERMCAP
+
+		export | grep -v '^[!#$*0?@_-]=' |
+			${AWK} -F='=' '{print "export " $1}' |
+			grep -v '^TERM=' | grep -v '^TERMCAP='
+	)
+fi
+
+#
+#	SETOPT
+#
+#	We exclude interactive because "setopt interactive" has no effect.
+#	The cshjunkiequotes option is dealt with separately; see the
+#	comments near the start of the script.
+#
+
+if test "$reporter_do_all" = "yes" -o "$reporter_do_setopt" = "yes"
+then
+	echo
+	echo '# Setopt.'
+	echo
+
+	(
+		setopt | grep -v 'interactive' | ${AWK} '{print "setopt " $0}'
+
+		case "$reporter_junkiequotes"
+		in
+			yes)	echo "setopt cshjunkiequotes" ;;
+			*)	;;
+		esac
+	) | sort
+fi
+
+echo
+echo '# END zsh saveset'
+
+#
+#	Don't put an exit here, or you'll get a nasty surprise when you
+#	source this thing.  Get rid of variables created when processing
+#	command line.
+#
+
+unset reporter_do_all
+unset reporter_do_aliases
+unset reporter_do_bindings
+unset reporter_do_compctl
+unset reporter_do_fun
+unset reporter_do_lim
+unset reporter_do_setopt
+unset reporter_do_vars
+
+#
+#	Turn cshjunkiequotes back on if necessary.
+#
+
+case "$reporter_junkiequotes"
+in
+	yes)	setopt cshjunkiequotes ;;
+	*)	;;
+esac
+
+unset reporter_junkiequotes
+