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>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Alad Wenter 2016-10-10 10:47:38 +02:00 committed by Allan McRae
parent dfc78129be
commit 1f8f0bd9ac
11 changed files with 70 additions and 44 deletions

View File

@ -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) \

2
scripts/.gitignore vendored
View File

@ -1,9 +1,9 @@
makepkg
makepkg-template
makepkg-wrapper
pacman-db-upgrade
pacman-key
pkgdelta
repo-add
repo-elephant
repo-remove
*-wrapper

View File

@ -36,7 +36,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
@ -97,6 +96,7 @@ LIBMAKEPKG_IN = \
libmakepkg/util.sh \
libmakepkg/util/message.sh \
libmakepkg/util/option.sh \
libmakepkg/util/parseopts.sh \
libmakepkg/util/pkgbuild.sh \
libmakepkg/util/source.sh \
libmakepkg/util/util.sh
@ -105,7 +105,10 @@ LIBMAKEPKG_DIST = \
$(addsuffix .in, $(LIBMAKEPKG_IN))
WRAPPER = \
makepkg-wrapper
makepkg-wrapper \
pacman-db-upgrade-wrapper \
pacman-key-wrapper \
pkgdelta-wrapper
COMPLETION_IN = \
completion/bash_completion \
@ -180,7 +183,6 @@ all-am: $(COMPLETION_IN)
makepkg: \
$(srcdir)/makepkg.sh.in \
$(srcdir)/wrapper.sh.in \
$(srcdir)/library/parseopts.sh \
$(LIBMAKEPKG_IN)
makepkg-template: \
@ -197,13 +199,11 @@ pacman-db-upgrade: \
pacman-key: \
$(srcdir)/pacman-key.sh.in \
$(srcdir)/library/output_format.sh \
$(srcdir)/library/parseopts.sh
$(srcdir)/library/output_format.sh
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 \

View File

@ -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
;;

View File

@ -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

View File

@ -1153,8 +1153,6 @@ run_split_packaging() {
pkgname=("${pkgname_backup[@]}")
}
m4_include(library/parseopts.sh)
usage() {
printf "makepkg (pacman) %s\n" "$makepkg_version"
echo

View File

@ -30,7 +30,10 @@ declare -r myver='@PACKAGE_VERSION@'
m4_include(library/output_format.sh)
m4_include(library/parseopts.sh)
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
# Import parseopts.sh
source "$LIBRARY"/util/parseopts.sh
usage() {
printf "pacman-db-upgrade (pacman) %s\n" "${myver}"

View File

@ -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

View File

@ -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

View File

@ -49,6 +49,6 @@ scripts/libmakepkg/tidy/staticlibs.sh.in
scripts/libmakepkg/tidy/strip.sh.in
scripts/libmakepkg/tidy/zipman.sh.in
scripts/libmakepkg/util/message.sh.in
scripts/libmakepkg/util/parseopts.sh.in
scripts/libmakepkg/util/source.sh.in
scripts/library/output_format.sh
scripts/library/parseopts.sh

View File

@ -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