[pacman-dev] [PATCH 1/2] pkgdelta: rework option/argument parser

Dave Reisner d at falconindy.com
Fri Apr 6 15:24:40 EDT 2012


On Fri, Apr 06, 2012 at 08:56:04PM +0200, Florian Pritz wrote:
> Signed-off-by: Florian Pritz <bluewind at xinu.at>
> ---
>  scripts/pkgdelta.sh.in |   41 ++++++++++++++++++++++++-----------------
>  1 file changed, 24 insertions(+), 17 deletions(-)
> 
> diff --git a/scripts/pkgdelta.sh.in b/scripts/pkgdelta.sh.in
> index 5a2e6a3..806ae23 100644
> --- a/scripts/pkgdelta.sh.in
> +++ b/scripts/pkgdelta.sh.in
> @@ -38,11 +38,14 @@ m4_include(library/output_format.sh)
>  # print usage instructions
>  usage() {
>  	printf "pkgdelta (pacman) %s\n\n" "$myver"
> -	printf -- "$(gettext "Usage: pkgdelta [-q] <package1> <package2>\n")"
> +	printf -- "$(gettext "Usage: pkgdelta [options] <package1> <package2>\n")"
>  	printf -- "$(gettext "\
>  	pkgdelta will create a delta file between two packages.\n\
>  This delta file can then be added to a database using repo-add.\n\n")"
>  	printf -- "$(gettext "Example:  pkgdelta pacman-3.0.0.pkg.tar.gz pacman-3.0.1.pkg.tar.gz")\n"
> +	echo
> +	printf -- "$(gettext "Options:\n")"
> +	printf -- "  -q                ""$(gettext "quiet\n")"
>  }
>  
>  version() {
> @@ -123,32 +126,36 @@ create_xdelta()
>  	return 0
>  }
>  
> -case "$1" in
> -	-h|--help)    usage; exit 0 ;;
> -	-V|--version) version; exit 0 ;;
> -	-q|--quiet)   QUIET=1; shift ;;
> -esac
> +declare -a args
>  
> -if (( $# != 2 )); then
> +# parse arguments
> +while (( $# )); do
> +	case "$1" in
> +		-h|--help)    usage; exit 0 ;;
> +		-V|--version) version; exit 0 ;;
> +		-q|--quiet) QUIET=1;;
> +		*) args+=("$1");;

Be aware that this goes against POSIX options parsing (which should do a
full stop on the first non-option argument). Invalid options will be
treated as arguments as well. If you want longopts like this, maybe add
in an extra case or two...

while (( $# ));do
  case $1 in
    -h|--help)    usage; exit 0 ;;
    -V|--version) version; exit 0 ;;
    -q|--quiet) QUIET=1 ;;
    --) shift; args+=("$@"); break 2 ;;
    -*) echo "invalid option -- '$1'"; usage; exit 1 ;;
    *) args+=("$1") ;;
  esac
  shift
done

> +	esac
> +	shift
> +done
> +
> +if (( ${#args[@]} != 2 )); then
>  	usage
>  	exit 1
>  fi
>  
> -if [[ ! -f $1 ]]; then
> -	error "$(gettext "File '%s' does not exist")" "$1"
> -	exit 0
> -fi
> -
> -if [[ ! -f $2 ]]; then
> -	error "$(gettext "File '%s' does not exist")" "$2"
> -	exit 0
> -fi
> +for i in "${args[@]}"; do
> +	if [[ ! -f $i ]]; then
> +		error "$(gettext "File '%s' does not exist")" "$i"
> +		exit 0

exit 0 seems bad to me here since we're erroring out. I realize that
you're just copying the code that used to be here, though... Dan, what's
the rationale?

> +	fi
> +done
>  
>  if ! type xdelta3 &>/dev/null; then
>  	error "$(gettext "Cannot find the xdelta3 binary! Is xdelta3 installed?")"
>  	exit 1
>  fi
>  
> -create_xdelta "$1" "$2"
> +create_xdelta "${args[0]}" "${args[1]}"

You can simply use "${args[@]}" since we know that this is exactly 2
args.

>  
>  # vim: set ts=2 sw=2 noet:
> -- 
> 1.7.9.6
> 


More information about the pacman-dev mailing list