[pacman-dev] [PATCH v2 2/2] contrib/*: Support the "--help" and "--version" options

Lukas Fleischer archlinux at cryptocrack.de
Mon Dec 12 16:36:57 EST 2011


Add "--help"/"-h" and "--version"/"-V" support to all contrib scripts.
Also, update scripts that used "-v" as a short option for "--version"
and use "-V" for the sake of consistency.

Additionally:

* Move version and usage messages to separate convenience functions in
  all scripts.

* Add a workaround to paccache to support "--help" and "--version". This
  should be replaced by a proper POSIX-compliant command line parser
  that supports long options in a future patch.

* Add a "$myver" variable to all scripts and use it whenever we refer to
  the program version (e.g. in version messages). Also, use the pacman
  version number everywhere instead of using a different versioning
  scheme for each contrib script. This is achieved by adding a
  "PACKAGE_VERSION" placeholder that is replaced by sed(1) when the
  script is built.

* Ensure we always return with exit status 0 if "--help" is used and
  return with exit status 1 if we display the usage message due to
  invalid arguments.

* Add "AUTOMAKE_OPTIONS = std-options" and add all scripts to
  "bin_SCRIPTS" to make `make installcheck` check that installed scripts
  actually support the "--help" and "--version" options.

Signed-off-by: Lukas Fleischer <archlinux at cryptocrack.de>
---
* Use "[[ $1 = -@(h|-help) ]]" instead of "[[ $1 == "--help" || $1 ==
  "-h" ]]" everywhere.

* Deal with new contrib script pacsysclean.

 contrib/Makefile.am       |   14 ++++++++++++++
 contrib/bacman.in         |   18 ++++++++++--------
 contrib/paccache.in       |   20 +++++++++++++++++---
 contrib/pacdiff.in        |   12 +++++++++++-
 contrib/paclist.in        |   21 ++++++++++++++++++++-
 contrib/paclog-pkglist.in |   19 ++++++++++++++++---
 contrib/pacscripts.in     |   10 ++++++++--
 contrib/pacsearch.in      |   20 +++++++++++++++-----
 contrib/pacsysclean.in    |   13 +++++++++++--
 9 files changed, 122 insertions(+), 25 deletions(-)

diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index c9f6365..8751fd9 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -1,3 +1,9 @@
+# enforce that all scripts have a --help and --version option
+AUTOMAKE_OPTIONS = std-options
+
+bin_SCRIPTS = \
+  $(OURSCRIPTS)
+
 OURSCRIPTS = \
 	bacman \
 	paccache \
@@ -30,9 +36,17 @@ EXTRA_DIST = \
 # Files that should be removed, but which Automake does not know.
 MOSTLYCLEANFILES = $(OURSCRIPTS) $(OURFILES) *.tmp
 
+if USE_GIT_VERSION
+GIT_VERSION := $(shell sh -c 'git describe --abbrev=4 --dirty | sed s/^v//')
+REAL_PACKAGE_VERSION = $(GIT_VERSION)
+else
+REAL_PACKAGE_VERSION = $(PACKAGE_VERSION)
+endif
+
 edit = sed \
 	-e 's|@sysconfdir[@]|$(sysconfdir)|g' \
 	-e 's|@localstatedir[@]|$(localstatedir)|g' \
+	-e 's|@PACKAGE_VERSION[@]|$(REAL_PACKAGE_VERSION)|g' \
 	-e 's|@SIZECMD[@]|$(SIZECMD)|g' \
 	-e '1s|!/bin/bash|!$(BASH_SHELL)|g'
 
diff --git a/contrib/bacman.in b/contrib/bacman.in
index 00d0691..9362356 100755
--- a/contrib/bacman.in
+++ b/contrib/bacman.in
@@ -24,7 +24,7 @@ shopt -s extglob
 shopt -s nullglob
 
 declare -r myname='bacman'
-readonly progver="0.2.1"
+declare -r myver='@PACKAGE_VERSION@'
 
 #
 # User Friendliness
@@ -35,19 +35,21 @@ usage() {
 	echo "Example: $myname kernel26"
 }
 
+version() {
+	printf "%s %s\n" "$myname" "$myver"
+	echo 'Copyright (C) 2008 locci <carlocci_at_gmail_dot_com>'
+}
+
 if (( $# != 1 )); then
 	usage
 	exit 1
 fi
 
-if [[ $1 == "--help" || $1 == "-h" ]]; then
+if [[ $1 = -@(h|-help) ]]; then
 	usage
 	exit 0
-fi
-
-if [[ $1 == "--version" || $1 == "-v" ]]; then
-	echo "$myname version $progver"
-	echo "Copyright (C) 2008 locci"
+elif [[ $1 = -@(V|-version) ]]; then
+	version
 	exit 0
 fi
 
@@ -177,7 +179,7 @@ pkg_size=$(du -sk | awk '{print $1 * 1024}')
 # TODO adopt makepkg's write_pkginfo() into this or scripts/library
 #
 echo Generating .PKGINFO metadata...
-echo "# Generated by $myname $progver"    > .PKGINFO
+echo "# Generated by $myname $myver"    > .PKGINFO
 if [[ $INFAKEROOT == "1" ]]; then
 	echo "# Using $(fakeroot -v)"    >> .PKGINFO
 fi
diff --git a/contrib/paccache.in b/contrib/paccache.in
index b95b964..da65f47 100755
--- a/contrib/paccache.in
+++ b/contrib/paccache.in
@@ -21,6 +21,7 @@
 shopt -s extglob
 
 declare -r myname='paccache'
+declare -r myver='@PACKAGE_VERSION@'
 
 declare -a candidates=() cmdopts=() whitelist=() blacklist=()
 declare -i delete=0 dryrun=0 filecount=0 move=0 needsroot=0 totalsaved=0 verbose=0
@@ -202,19 +203,32 @@ containing pacman package tarballs.
 EOF
 }
 
+version() {
+	printf "%s %s\n" "$myname" "$myver"
+	echo 'Copyright (C) 2011 Dave Reisner <dreisner at archlinux.org>'
+}
+
 if (( ! UID )); then
 	error "Do not run this script as root. You will be prompted for privilege escalation."
 	exit 42
 fi
 
-while getopts ':a:c:dfhi:k:m:rsuvz' opt; do
+# TODO: remove this workaround and use a sane command line parser (like the
+# parse_options library from scripts/) here
+if [[ $1 = -@(h|-help) ]]; then
+	usage
+	exit 0
+elif [[ $1 = -@(V|-version) ]]; then
+	version
+	exit 0
+fi
+
+while getopts ':a:c:dfi:k:m:rsuvz' opt; do
 	case $opt in
 		a) scanarch=$OPTARG ;;
 		c) cachedir=$OPTARG ;;
 		d) dryrun=1 ;;
 		f) cmdopts=(-f) ;;
-		h) usage
-			exit 0 ;;
 		i) if [[ $OPTARG = '-' ]]; then
 				 [[ ! -t 0 ]] && IFS=$'\n' read -r -d '' -a ign
 			 else
diff --git a/contrib/pacdiff.in b/contrib/pacdiff.in
index 79cf809..bfafda2 100755
--- a/contrib/pacdiff.in
+++ b/contrib/pacdiff.in
@@ -18,6 +18,7 @@
 #
 
 declare -r myname='pacdiff'
+declare -r myver='@PACKAGE_VERSION@'
 
 diffprog=${DIFFPROG:-vimdiff}
 diffsearchpath=${DIFFSEARCHPATH:-/etc}
@@ -32,6 +33,11 @@ usage() {
 	echo "Example : DIFFPROG=meld DIFFSEARCHPATH=\"/boot /etc /usr\" $myname"
 }
 
+version() {
+	printf "%s %s\n" "$myname" "$myver"
+	echo 'Copyright (C) 2007 Aaron Griffin <aaronmgriffin at gmail.com>'
+}
+
 cmd() {
 	if [ $locate -eq 1 ]; then
 		locate -0 -e -b \*.pacnew \*.pacorig \*.pacsave
@@ -44,8 +50,12 @@ if [ $# -gt 0 ]; then
 	case $1 in
 		-l|--locate)
 		locate=1;;
-		*)
+		-V|--version)
+		version; exit 0;;
+		-h|--help)
 		usage; exit 0;;
+		*)
+		usage; exit 1;;
 	esac
 fi
 
diff --git a/contrib/paclist.in b/contrib/paclist.in
index 8623049..7883e21 100755
--- a/contrib/paclist.in
+++ b/contrib/paclist.in
@@ -18,6 +18,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 declare -r myname='paclist'
+declare -r myver='@PACKAGE_VERSION@'
 
 export TEXTDOMAIN='pacman'
 export TEXTDOMAINDIR='/usr/share/locale'
@@ -29,13 +30,31 @@ if ! type gettext &>/dev/null; then
 	}
 fi
 
-if [[ -z $1 || $1 = -@(h|-help) ]]; then
+usage() {
 	printf '%s - List all packages installed from a given repo\n' "$myname"
 	printf 'Usage:   %s <repo>\n' "$myname"
 	printf 'Example: %s testing\n' "$myname"
+}
+
+version() {
+	printf "%s %s\n" "$myname" "$myver"
+	echo 'Copyright (C) 2008 Dan McGee <dpmcgee at gmail.com>'
+	echo 'Copyright (C) 2011 Dave Reisner <dreisner at archlinux.org>'
+}
+
+if [[ -z $1 ]]; then
+	usage
 	exit 1
 fi
 
+if [[ $1 = -@(h|-help) ]]; then
+	usage
+	exit 0
+elif [[ $1 = -@(V|-version) ]]; then
+	version
+	exit 0
+fi
+
 printf -v installed '[%s]' "$(gettext installed)"
 pacman -Sl $1 | awk -v i="$installed" '$NF == i { print $2,$3 }'
 
diff --git a/contrib/paclog-pkglist.in b/contrib/paclog-pkglist.in
index 0b27bf3..222bbc4 100755
--- a/contrib/paclog-pkglist.in
+++ b/contrib/paclog-pkglist.in
@@ -18,16 +18,29 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 declare -r myname='paclog-pkglist'
+declare -r myver='@PACKAGE_VERSION@'
 
 export TEXTDOMAIN='pacman'
 export TEXTDOMAINDIR='/usr/share/locale'
 declare logfile=${1:- at localstatedir@/log/pacman.log}
 
+usage() {
+	printf 'usage:   %s [pacman log]\n' "$myname"
+	printf 'example: %s @localstatedir@/log/pacman.log\n' "$myname"
+	printf '\ndefaults to: @localstatedir@/log/pacman.log\n'
+}
+
+version() {
+	printf "%s %s\n" "$myname" "$myver"
+	echo 'Copyright (C) 2011 Dave Reisner <dave at archlinux.org>'
+}
+
 if [[ $1 ]]; then
 	if [[ $1 = -@(h|-help) ]]; then
-		printf 'usage:   %s [pacman log]\n' "$myname"
-		printf 'example: %s @localstatedir@/log/pacman.log\n' "$myname"
-		printf '\ndefaults to: @localstatedir@/log/pacman.log\n'
+		usage
+		exit 0
+	elif [[ $1 = -@(V|-version) ]]; then
+		version
 		exit 0
 	elif [[ ! -e $logfile ]]; then
 		printf $"target not found: %s\n" "$1"
diff --git a/contrib/pacscripts.in b/contrib/pacscripts.in
index 967f782..8468714 100755
--- a/contrib/pacscripts.in
+++ b/contrib/pacscripts.in
@@ -25,7 +25,7 @@ set -o nounset
 set -o errexit
 
 declare -r myname='pacscripts'
-progver="0.4"
+declare -r myver='@PACKAGE_VERSION@'
 
 conf="@sysconfdir@/pacman.conf"
 
@@ -57,6 +57,12 @@ usage() {
 	echo "Example: $myname gconf-editor-2.24.1-1-x86_64.pkg.tar.gz"
 }
 
+version() {
+	printf "%s %s\n" "$myname" "$myver"
+	echo 'Copyright (c) 2009 Giulio "giulivo" Fidente <giulivo.navigante at gmail.com>'
+	echo 'Copyright (c) 2009 Xavier Chantry <shiningxc at gmail.com>'
+}
+
 spacman() {
 	if [ $EUID -eq 0 ]; then
 		pacman "$@"
@@ -127,6 +133,6 @@ fi
 
 case "$1" in
 	--help|-h) usage; exit 0 ;;
-	--version|-v) echo "$myname version $progver"; exit 0 ;;
+	--version|-V) version; exit 0 ;;
 	*) print_scriptlet $1 ;;
 esac
diff --git a/contrib/pacsearch.in b/contrib/pacsearch.in
index 794110e..b1db8ab 100755
--- a/contrib/pacsearch.in
+++ b/contrib/pacsearch.in
@@ -25,21 +25,31 @@ use strict;
 use warnings;
 
 my $myname = 'pacsearch';
-my $version = "2.0";
+my $myver = '@PACKAGE_VERSION@';
 
-if ($#ARGV lt 0 || $ARGV[0] eq "--help" || $ARGV[0] eq "-h") {
+sub usage {
 	print "$myname - Add color and install information to a pacman -Ss search\n";
 	print "Usage:   $myname <pattern>\n";
 	print "Example: $myname ^gnome\n";
+}
+
+sub version {
+	printf "%s %s\n", $myname, $myver;
+	print "Copyright (C) 2008-2011 Dan McGee <dan\@archlinux.org>\n\n";
+	print "Based off original shell script version:\n";
+	print "Copyright (C) 2006-2007 Dan McGee <dan\@archlinux.org>\n";
+}
+
+if ($#ARGV lt 0 || $ARGV[0] eq "--help" || $ARGV[0] eq "-h") {
+	usage;
 	if ($#ARGV lt 0) {
 		exit 1;
 	}
 	exit 0;
 }
 
-if ($ARGV[0] eq "--version" || $ARGV[0] eq "-v") {
-	print "$myname version $version\n";
-	print "Copyright (C) 2006-2011 Dan McGee\n";
+if ($ARGV[0] eq "--version" || $ARGV[0] eq "-V") {
+	version;
 	exit 0;
 }
 
diff --git a/contrib/pacsysclean.in b/contrib/pacsysclean.in
index c87082e..17f7681 100755
--- a/contrib/pacsysclean.in
+++ b/contrib/pacsysclean.in
@@ -2,23 +2,32 @@
 
 # pacsysclean - Sort installed packages by decreasing installed size. Useful for system clean-up.
 
+declare -r myname='pacsysclean'
+declare -r myver='@PACKAGE_VERSION@'
+
 PACMAN_OPTS=
 
 usage() {
-       echo "pacsysclean - Sort installed packages by decreasing installed size."
+       echo "$myname - Sort installed packages by decreasing installed size."
        echo
-       echo "Usage: pacsysclean [options]"
+       echo "Usage: $myname [options]"
        echo
        echo "Options:"
        echo "  -o <options>     Specify custom pacman query options (e.g., dt)"
        echo "  -h, --help       Show this help message and exit"
 }
 
+version() {
+  printf "%s %s\n" "$myname" "$myver"
+  echo 'Copyright (C) 2011 Eric Bélanger <snowmaniscool at gmail.com>'
+}
+
 
 if [ -n "$1" ]; then
        case "$1" in
                -o) PACMAN_OPTS="${2}" ;;
                -h|--help) usage; exit 0 ;;
+               -V|--version) version; exit 0 ;;
                *) usage; exit 1 ;;
        esac
 fi
-- 
1.7.8



More information about the pacman-dev mailing list