[pacman-dev] [PATCH] makepkg: move option parsing code to separte file

Dan McGee dpmcgee at gmail.com
Fri Jun 10 17:18:44 EDT 2011


Subject typo ^^

On Fri, Jun 10, 2011 at 4:36 AM, Allan McRae <allan at archlinux.org> 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>
> ---
>  scripts/Makefile.am              |   10 +++-
>  scripts/library/parse_options.sh |   87 +++++++++++++++++++++++++++++++++++++
>  scripts/makepkg.sh.in            |   88 +-------------------------------------
>  3 files changed, 95 insertions(+), 90 deletions(-)
>  create mode 100644 scripts/library/parse_options.sh
>
> diff --git a/scripts/Makefile.am b/scripts/Makefile.am
> index daa5b2a..74ee180 100644
> --- a/scripts/Makefile.am
> +++ b/scripts/Makefile.am
> @@ -23,6 +23,9 @@ EXTRA_DIST = \
>        rankmirrors.sh.in \
>        repo-add.sh.in
>
> +LIBRARY = \
> +       library/parse_options.sh
> +
>  # Files that should be removed, but which Automake does not know.
>  MOSTLYCLEANFILES = $(bin_SCRIPTS) *.tmp
>
> @@ -47,6 +50,7 @@ edit = sed \
>        -e 's|@SIZECMD[@]|$(SIZECMD)|g' \
>        -e 's|@SEDINPLACE[@]|$(SEDINPLACE)|g' \
>        -e 's|@DUPATH[@]|$(DUPATH)|g' \
> +       -e 's|@SCRIPTNAME[@]|$@|g' \
>        -e 's|@configure_input[@]|Generated from $@.sh.in; do not edit by hand.|g'
>
>  ## All the scripts depend on Makefile so that they are rebuilt when the
> @@ -54,11 +58,11 @@ edit = sed \
>  ## wrong file by accident.
>  # two 'test' lines- make sure we can handle both sh and py type scripts
>  # third 'test' line- make sure one of the two checks succeeded
> -$(OURSCRIPTS): Makefile
> +$(OURSCRIPTS): Makefile $(LIBRARY)

Is this overkill for the deps? I think I'd rather just see explicitly
down below what needs to go on, e.g.

makepkg: $(srcdir)/makepkg.sh.in library/parse_options.sh

>        @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 $(srcdir)/$@.sh.in && m4 -P $(srcdir)/$@.sh.in | $(edit) >$@.tmp || true
> +       @test -f $(srcdir)/$@.py.in && m4 -P $(srcdir)/$@.py.in | $(edit) >$@.tmp || true

We don't actually have any python scripts anymore I just realized...
I'll kill the cruft in another patch.

>        @test -f $@.tmp || false
>        @chmod +x $@.tmp
>        @chmod a-w $@.tmp
> diff --git a/scripts/library/parse_options.sh b/scripts/library/parse_options.sh
> new file mode 100644
> index 0000000..32aa0be
> --- /dev/null
> +++ b/scripts/library/parse_options.sh
> @@ -0,0 +1,87 @@
> +# getopt like parser
> +parse_options() {
maybe a
    local scriptname="@@SCRIPTNAME@@"
once here to avoid scattering it all over the place?

> +       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 "@SCRIPTNAME@: option '$1' $(gettext "requires an argument")" >&2
> +                                                       ret=1
> +                                               fi
> +                                       fi
> +                               else
> +                                       echo "@SCRIPTNAME@: $(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 "@SCRIPTNAME@: option $(gettext "requires an argument") -- '${1:i:1}'" >&2
> +                                                               ret=1
> +                                                       fi
> +                                               fi
> +                                               break
> +                                       else
> +                                               printf ' -%s' "${1:i:1}"
> +                                       fi
> +                               else
> +                                       echo "@SCRIPTNAME@: $(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