[pacman-dev] [PATCH v4] makepkg: Move parseopts from library to libmakepkg
Alad Wenter
alad at archlinux.info
Mon Oct 10 08:44:10 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>
---
v4:
- move to new file util/parseopts.sh
- only source this file
- do not touch .po files
Makefile.am | 3 +-
scripts/Makefile.am | 9 +---
scripts/{library => libmakepkg/util}/parseopts.sh | 50 +++++++++++++++++++----
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 +-
9 files changed, 64 insertions(+), 23 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/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