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

Allan McRae allan at archlinux.org
Sun Jun 12 00:32:09 EDT 2011


On 11/06/11 07:18, Dan McGee wrote:
> 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

Hands up who was being lazy!


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

I have a patch for that but was deciding what to do with it...   Maybe 
this should be kept in case we do get a python (or other language) 
script as a template for how to deal with it.


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

OK.  Not that it really matters give it is all one sed to replace it.

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