[pacman-dev] [PATCH] makepkg: move option parsing code to separte file
Dave Reisner
d at falconindy.com
Wed Jun 8 09:55:22 EDT 2011
On Wed, Jun 08, 2011 at 11:40:41PM +1000, Allan McRae wrote:
> This move the getopt replacement function parse_options out of
> makepkg.sh.in and into a separate file. The code is inserted
> into the relevant place in makepkg using m4.
>
> This will allow the reuse of the option parsing code in other
> scripts (i.e. pacman-key) while avoiding code duplication.
>
> Signed-off-by: Allan McRae <allan at archlinux.org>
> ---
>
> Is there a better way to do this that I am missing?
I'm no m4 ninja, but this all looks good. The only alternative I can
think of is distributing the library as a separate entity. That,
however, doesn't seem sane given the minimal space savings for added
complexity.
Ack from me.
d
>
> scripts/Makefile.am | 10 +++--
> scripts/library/parse_options.sh | 87 +++++++++++++++++++++++++++++++++++++
> scripts/makepkg.sh.in | 88 +-------------------------------------
> 3 files changed, 94 insertions(+), 91 deletions(-)
> create mode 100644 scripts/library/parse_options.sh
>
> diff --git a/scripts/Makefile.am b/scripts/Makefile.am
> index fd9b20d..6335ba1 100644
> --- a/scripts/Makefile.am
> +++ b/scripts/Makefile.am
> @@ -56,10 +56,12 @@ edit = sed \
> # third 'test' line- make sure one of the two checks succeeded
> $(OURSCRIPTS): Makefile
> @echo ' ' GEN $@;
> - @rm -f $@ $@.tmp
> - @test -f $(srcdir)/$@.sh.in && $(edit) $(srcdir)/$@.sh.in >$@.tmp || true
> - @test -f $(srcdir)/$@.py.in && $(edit) $(srcdir)/$@.py.in >$@.tmp || true
> - @test -f $@.tmp || false
> + @rm -f $@ $@.m4 $@.tmp
> + @test -f $(srcdir)/$@.sh.in && $(edit) $(srcdir)/$@.sh.in >$@.m4 || true
> + @test -f $(srcdir)/$@.py.in && $(edit) $(srcdir)/$@.py.in >$@.m4 || true
> + @test -f $@.m4 || false
> + @m4 -P $@.m4 >$@.tmp
> + @rm -f $@.m4
> @chmod +x $@.tmp
> @chmod a-w $@.tmp
> @mv $@.tmp $@
> diff --git a/scripts/library/parse_options.sh b/scripts/library/parse_options.sh
> new file mode 100644
> index 0000000..878cff1
> --- /dev/null
> +++ b/scripts/library/parse_options.sh
> @@ -0,0 +1,87 @@
> +# getopt like parser
> +parse_options() {
> + local short_options=$1; shift;
> + local long_options=$1; shift;
> + local ret=0;
> + local unused_options=""
> + local i
> +
> + while [[ -n $1 ]]; do
> + if [[ ${1:0:2} = '--' ]]; then
> + if [[ -n ${1:2} ]]; then
> + local match=""
> + for i in ${long_options//,/ }; do
> + if [[ ${1:2} = ${i//:} ]]; then
> + match=$i
> + break
> + fi
> + done
> + if [[ -n $match ]]; then
> + if [[ ${1:2} = $match ]]; then
> + printf ' %s' "$1"
> + else
> + if [[ -n $2 ]]; then
> + printf ' %s' "$1"
> + shift
> + printf " '%s'" "$1"
> + else
> + echo "makepkg: option '$1' $(gettext "requires an argument")" >&2
> + ret=1
> + fi
> + fi
> + else
> + echo "makepkg: $(gettext "unrecognized option") '$1'" >&2
> + ret=1
> + fi
> + else
> + shift
> + break
> + fi
> + elif [[ ${1:0:1} = '-' ]]; then
> + for ((i=1; i<${#1}; i++)); do
> + if [[ $short_options =~ ${1:i:1} ]]; then
> + if [[ $short_options =~ ${1:i:1}: ]]; then
> + if [[ -n ${1:$i+1} ]]; then
> + printf ' -%s' "${1:i:1}"
> + printf " '%s'" "${1:$i+1}"
> + else
> + if [[ -n $2 ]]; then
> + printf ' -%s' "${1:i:1}"
> + shift
> + printf " '%s'" "${1}"
> + else
> + echo "makepkg: option $(gettext "requires an argument") -- '${1:i:1}'" >&2
> + ret=1
> + fi
> + fi
> + break
> + else
> + printf ' -%s' "${1:i:1}"
> + fi
> + else
> + echo "makepkg: $(gettext "invalid option") -- '${1:i:1}'" >&2
> + ret=1
> + fi
> + done
> + else
> + unused_options="${unused_options} '$1'"
> + fi
> + shift
> + done
> +
> + printf " --"
> + if [[ -n $unused_options ]]; then
> + for i in ${unused_options[@]}; do
> + printf ' %s' "$i"
> + done
> + fi
> + if [[ -n $1 ]]; then
> + while [[ -n $1 ]]; do
> + printf " '%s'" "${1}"
> + shift
> + done
> + fi
> + printf "\n"
> +
> + return $ret
> +}
> \ No newline at end of file
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index b3081fc..0639fbd 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -1506,93 +1506,7 @@ canonicalize_path() {
> fi
> }
>
> -# getopt like parser
> -parse_options() {
> - local short_options=$1; shift;
> - local long_options=$1; shift;
> - local ret=0;
> - local unused_options=""
> - local i
> -
> - while [[ -n $1 ]]; do
> - if [[ ${1:0:2} = '--' ]]; then
> - if [[ -n ${1:2} ]]; then
> - local match=""
> - for i in ${long_options//,/ }; do
> - if [[ ${1:2} = ${i//:} ]]; then
> - match=$i
> - break
> - fi
> - done
> - if [[ -n $match ]]; then
> - if [[ ${1:2} = $match ]]; then
> - printf ' %s' "$1"
> - else
> - if [[ -n $2 ]]; then
> - printf ' %s' "$1"
> - shift
> - printf " '%s'" "$1"
> - else
> - echo "makepkg: option '$1' $(gettext "requires an argument")" >&2
> - ret=1
> - fi
> - fi
> - else
> - echo "makepkg: $(gettext "unrecognized option") '$1'" >&2
> - ret=1
> - fi
> - else
> - shift
> - break
> - fi
> - elif [[ ${1:0:1} = '-' ]]; then
> - for ((i=1; i<${#1}; i++)); do
> - if [[ $short_options =~ ${1:i:1} ]]; then
> - if [[ $short_options =~ ${1:i:1}: ]]; then
> - if [[ -n ${1:$i+1} ]]; then
> - printf ' -%s' "${1:i:1}"
> - printf " '%s'" "${1:$i+1}"
> - else
> - if [[ -n $2 ]]; then
> - printf ' -%s' "${1:i:1}"
> - shift
> - printf " '%s'" "${1}"
> - else
> - echo "makepkg: option $(gettext "requires an argument") -- '${1:i:1}'" >&2
> - ret=1
> - fi
> - fi
> - break
> - else
> - printf ' -%s' "${1:i:1}"
> - fi
> - else
> - echo "makepkg: $(gettext "invalid option") -- '${1:i:1}'" >&2
> - ret=1
> - fi
> - done
> - else
> - unused_options="${unused_options} '$1'"
> - fi
> - shift
> - done
> -
> - printf " --"
> - if [[ -n $unused_options ]]; then
> - for i in ${unused_options[@]}; do
> - printf ' %s' "$i"
> - done
> - fi
> - if [[ -n $1 ]]; then
> - while [[ -n $1 ]]; do
> - printf " '%s'" "${1}"
> - shift
> - done
> - fi
> - printf "\n"
> -
> - return $ret
> -}
> +m4_include(library/parse_options.sh)
>
> usage() {
> printf "makepkg (pacman) %s\n" "$myver"
> --
> 1.7.5.4
>
>
More information about the pacman-dev
mailing list