[pacman-dev] [PATCH v5] makepkg: Move parseopts from library to libmakepkg

Alad Wenter alad at archlinux.info
Mon Oct 10 08:47:38 UTC 2016


parseopts is used in makepkg and other scripts such as pacman-key as a
getopt replacement.

Instead of including it in those scripts via a macro, move it to
libmakepkg/util/parseopts.sh and have scripts source this file where
appropriate.

To keep the parseopts test, a new variable was introduced:
PM_LIBMAKEPKG_DIR

Signed-off-by: Alad Wenter <alad at archlinux.info>
---
v5: update README

 Makefile.am                                       |  3 +-
 scripts/Makefile.am                               |  9 +---
 scripts/{library => libmakepkg/util}/parseopts.sh | 50 +++++++++++++++++++----
 scripts/library/README                            | 20 ---------
 scripts/makepkg.sh.in                             |  2 -
 scripts/pacman-db-upgrade.sh.in                   |  5 ++-
 scripts/pacman-key.sh.in                          |  7 +++-
 scripts/pkgdelta.sh.in                            |  7 +++-
 scripts/po/POTFILES.in                            |  2 +-
 test/scripts/parseopts_test.sh                    |  2 +-
 10 files changed, 64 insertions(+), 43 deletions(-)
 rename scripts/{library => libmakepkg/util}/parseopts.sh (56%)

diff --git a/Makefile.am b/Makefile.am
index a676878..f58344a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -39,7 +39,8 @@ TEST_EXTENSIONS = .py
 AM_TESTS_ENVIRONMENT = \
 	PMTEST_UTIL_DIR=$(top_builddir)/src/util/; export PMTEST_UTIL_DIR; \
 	PMTEST_SCRIPT_DIR=$(top_builddir)/scripts/; export PMTEST_SCRIPT_DIR; \
-	PMTEST_SCRIPTLIB_DIR=$(top_srcdir)/scripts/library/; export PMTEST_SCRIPTLIB_DIR;
+	PMTEST_SCRIPTLIB_DIR=$(top_srcdir)/scripts/library/; export PMTEST_SCRIPTLIB_DIR; \
+	PMTEST_LIBMAKEPKG_DIR=$(top_builddir)/scripts/libmakepkg/; export PMTEST_LIBMAKEPKG_DIR;
 LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
 								 $(top_srcdir)/build-aux/tap-driver.sh
 PY_LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) \
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index e4f9fb1..339b8ba 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -33,7 +33,6 @@ EXTRA_DIST = \
 
 LIBRARY = \
 	library/output_format.sh \
-	library/parseopts.sh \
 	library/human_to_size.sh \
 	library/size_to_human.sh \
 	library/term_colors.sh
@@ -162,7 +161,6 @@ $(LIBMAKEPKG_IN): %: %.in Makefile
 makepkg: \
 	$(srcdir)/makepkg.sh.in \
 	$(srcdir)/makepkg-wrapper.sh.in \
-	$(srcdir)/library/parseopts.sh \
 	$(LIBMAKEPKG_IN)
 
 makepkg-template: \
@@ -179,8 +177,7 @@ pacman-db-upgrade: \
 
 pacman-key: \
 	$(srcdir)/pacman-key.sh.in \
-	$(srcdir)/library/output_format.sh \
-	$(srcdir)/library/parseopts.sh
+	$(srcdir)/library/output_format.sh
 
 pacman-optimize: \
 	$(srcdir)/pacman-optimize.sh.in \
@@ -188,8 +185,7 @@ pacman-optimize: \
 
 pkgdelta: \
 	$(srcdir)/pkgdelta.sh.in \
-	$(srcdir)/library/output_format.sh \
-	$(srcdir)/library/parseopts.sh
+	$(srcdir)/library/output_format.sh
 
 repo-add: \
 	$(srcdir)/repo-add.sh.in \
@@ -207,7 +203,6 @@ makepkg-wrapper: \
 	Makefile \
 	$(srcdir)/makepkg-wrapper.sh.in \
 	$(srcdir)/makepkg.sh.in \
-	$(srcdir)/library/parseopts.sh \
 	| makepkg
 	$(AM_V_at)$(MKDIR_P) .lib
 	$(AM_V_at)mv -f makepkg .lib
diff --git a/scripts/library/parseopts.sh b/scripts/libmakepkg/util/parseopts.sh
similarity index 56%
rename from scripts/library/parseopts.sh
rename to scripts/libmakepkg/util/parseopts.sh
index cf6aa6c..802275e 100644
--- a/scripts/library/parseopts.sh
+++ b/scripts/libmakepkg/util/parseopts.sh
@@ -1,4 +1,40 @@
-# getopt-like parser
+#!/bin/bash
+#
+#   parseopts.sh - getopt_long-like parser
+#
+#   Copyright (c) 2012-2016 Pacman Development Team <pacman-dev at archlinux.org>
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# A getopt_long-like parser which portably supports longopts and
+# shortopts with some GNU extensions. It does not allow for options
+# with optional arguments. For both short and long opts, options
+# requiring an argument should be suffixed with a colon. After the
+# first argument containing the short opts, any number of valid long
+# opts may be be passed. The end of the options delimiter must then be
+# added, followed by the user arguments to the calling program.
+#
+# Recommended Usage:
+#   OPT_SHORT='fb:z'
+#   OPT_LONG=('foo' 'bar:' 'baz')
+#   if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
+#     exit 1
+#   fi
+#   set -- "${OPTRET[@]}"
+# Returns:
+#   0: parse success
+#   1: parse failure (error message supplied)
 parseopts() {
 	local opt= optarg= i= shortopts=$1
 	local -a longopts=() unused_argv=()
@@ -34,7 +70,7 @@ parseopts() {
 				return 255 ;;
 			*)
 				# fail, ambiguous match
-				printf "@SCRIPTNAME@: $(gettext "option '%s' is ambiguous; possibilities:")" "--$1"
+				printf "${0##*/}: $(gettext "option '%s' is ambiguous; possibilities:")" "--$1"
 				printf " '%s'" "${longmatch[@]%:}"
 				printf '\n'
 				return 254 ;;
@@ -53,7 +89,7 @@ parseopts() {
 
 					# option doesn't exist
 					if [[ $shortopts != *$opt* ]]; then
-						printf "@SCRIPTNAME@: $(gettext "invalid option") -- '%s'\n" "$opt" >&2
+						printf "${0##*/}: $(gettext "invalid option") -- '%s'\n" "$opt" >&2
 						OPTRET=(--)
 						return 1
 					fi
@@ -72,7 +108,7 @@ parseopts() {
 							break
 						# parse failure
 						else
-							printf "@SCRIPTNAME@: $(gettext "option requires an argument") -- '%s'\n" "$opt" >&2
+							printf "${0##*/}: $(gettext "option requires an argument") -- '%s'\n" "$opt" >&2
 							OPTRET=(--)
 							return 1
 						fi
@@ -86,7 +122,7 @@ parseopts() {
 					0)
 						# parse failure
 						if [[ $optarg ]]; then
-							printf "@SCRIPTNAME@: $(gettext "option '%s' does not allow an argument")\n" "--$opt" >&2
+							printf "${0##*/}: $(gettext "option '%s' does not allow an argument")\n" "--$opt" >&2
 							OPTRET=(--)
 							return 1
 						# --longopt
@@ -104,7 +140,7 @@ parseopts() {
 							shift
 						# parse failure
 						else
-							printf "@SCRIPTNAME@: $(gettext "option '%s' requires an argument")\n" "--$opt" >&2
+							printf "${0##*/}: $(gettext "option '%s' requires an argument")\n" "--$opt" >&2
 							OPTRET=(--)
 							return 1
 						fi
@@ -116,7 +152,7 @@ parseopts() {
 						;;
 					255)
 						# parse failure
-						printf "@SCRIPTNAME@: $(gettext "invalid option") '--%s'\n" "$opt" >&2
+						printf "${0##*/}: $(gettext "invalid option") '--%s'\n" "$opt" >&2
 						OPTRET=(--)
 						return 1
 						;;
diff --git a/scripts/library/README b/scripts/library/README
index e9615a2..a9d15f1 100644
--- a/scripts/library/README
+++ b/scripts/library/README
@@ -8,26 +8,6 @@ stdout and can be silenced by defining 'QUIET'.  The 'warning' and 'error'
 functions print to stderr with the appropriate prefix added to the
 message.
 
-parseopts.sh:
-A getopt_long-like parser which portably supports longopts and shortopts
-with some GNU extensions. It does not allow for options with optional
-arguments. For both short and long opts, options requiring an argument
-should be suffixed with a colon. After the first argument containing
-the short opts, any number of valid long opts may be be passed. The end
-of the options delimiter must then be added, followed by the user arguments
-to the calling program.
-
-Recommended Usage:
-  OPT_SHORT='fb:z'
-  OPT_LONG=('foo' 'bar:' 'baz')
-  if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
-    exit 1
-  fi
-  set -- "${OPTRET[@]}"
-Returns:
-  0: parse success
-  1: parse failure (error message supplied)
-
 human_to_size.sh:
 A function to convert human readable sizes (such as "5.3 GiB") to raw byte
 equivalents. base10 and base2 suffixes are supported, case sensitively. If
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 7b2ce51..b3cafa8 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -1153,8 +1153,6 @@ run_split_packaging() {
 	pkgname=("${pkgname_backup[@]}")
 }
 
-m4_include(library/parseopts.sh)
-
 usage() {
 	printf "makepkg (pacman) %s\n" "$makepkg_version"
 	echo
diff --git a/scripts/pacman-db-upgrade.sh.in b/scripts/pacman-db-upgrade.sh.in
index 79e1c59..62f4285 100644
--- a/scripts/pacman-db-upgrade.sh.in
+++ b/scripts/pacman-db-upgrade.sh.in
@@ -28,7 +28,10 @@ export TEXTDOMAINDIR='@localedir@'
 
 declare -r myver='@PACKAGE_VERSION@'
 
-m4_include(library/output_format.sh)
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+# Import parseopts.sh
+source "$LIBRARY"/util/parseopts.sh
 
 m4_include(library/parseopts.sh)
 
diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in
index ffefc68..81bea0b 100644
--- a/scripts/pacman-key.sh.in
+++ b/scripts/pacman-key.sh.in
@@ -26,6 +26,11 @@ export TEXTDOMAINDIR='@localedir@'
 
 declare -r myver="@PACKAGE_VERSION@"
 
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+# Import parseopts.sh
+source "$LIBRARY"/util/parseopts.sh
+
 # Options
 ADD=0
 DELETE=0
@@ -50,8 +55,6 @@ DEFAULT_KEYSERVER='hkp://pool.sks-keyservers.net'
 
 m4_include(library/output_format.sh)
 
-m4_include(library/parseopts.sh)
-
 usage() {
 	printf "pacman-key (pacman) %s\n" ${myver}
 	echo
diff --git a/scripts/pkgdelta.sh.in b/scripts/pkgdelta.sh.in
index fe63974..9f87185 100644
--- a/scripts/pkgdelta.sh.in
+++ b/scripts/pkgdelta.sh.in
@@ -28,6 +28,12 @@ export TEXTDOMAINDIR='@localedir@'
 
 declare -r myver='@PACKAGE_VERSION@'
 
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+# Import parseopts.sh
+source "$LIBRARY"/util/parseopts.sh
+
+# Options
 QUIET=0
 USE_COLOR='y'
 
@@ -41,7 +47,6 @@ max_delta_size=70
 # ensure we have a sane umask set
 umask 0022
 
-m4_include(library/parseopts.sh)
 m4_include(library/output_format.sh)
 
 # print usage instructions
diff --git a/scripts/po/POTFILES.in b/scripts/po/POTFILES.in
index 53dd545..81e3acd 100644
--- a/scripts/po/POTFILES.in
+++ b/scripts/po/POTFILES.in
@@ -50,6 +50,6 @@ scripts/libmakepkg/tidy/staticlibs.sh.in
 scripts/libmakepkg/tidy/strip.sh.in
 scripts/libmakepkg/tidy/zipman.sh.in
 scripts/libmakepkg/util/message.sh
+scripts/libmakepkg/util/parseopts.sh
 scripts/libmakepkg/util/source.sh.in
 scripts/library/output_format.sh
-scripts/library/parseopts.sh
diff --git a/test/scripts/parseopts_test.sh b/test/scripts/parseopts_test.sh
index a8738a4..a582198 100755
--- a/test/scripts/parseopts_test.sh
+++ b/test/scripts/parseopts_test.sh
@@ -3,7 +3,7 @@
 source "$(dirname "$0")"/../tap.sh || exit 1
 
 # source the library function
-lib=${1:-${PMTEST_SCRIPTLIB_DIR}parseopts.sh}
+lib=${1:-${PMTEST_LIBMAKEPKG_DIR}util/parseopts.sh}
 if [[ -z $lib || ! -f $lib ]]; then
 	tap_bail "parseopts library ($lib) could not be located"
 	exit 1
-- 
2.10.0


More information about the pacman-dev mailing list