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 <[email protected]>
> ---
> 
> 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 $@ [email protected]
> -     @test -f $(srcdir)/[email protected] && $(edit) $(srcdir)/[email protected] >[email protected] || 
> true
> -     @test -f $(srcdir)/[email protected] && $(edit) $(srcdir)/[email protected] >[email protected] || 
> true
> -     @test -f [email protected] || false
> +     @rm -f $@ [email protected] [email protected]
> +     @test -f $(srcdir)/[email protected] && $(edit) $(srcdir)/[email protected] >[email protected] || true
> +     @test -f $(srcdir)/[email protected] && $(edit) $(srcdir)/[email protected] >[email protected] || true
> +     @test -f [email protected] || false
> +     @m4 -P [email protected] >[email protected]
> +     @rm -f [email protected]
>       @chmod +x [email protected]
>       @chmod a-w [email protected]
>       @mv [email protected] $@
> 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
> 
> 

Reply via email to