[pacman-dev] [PATCH v4] makepkg: Move parseopts from library to libmakepkg
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@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@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
participants (1)
-
Alad Wenter