From 6eb64cb5bdce43fb5b1a83f93496083761ea2718 Mon Sep 17 00:00:00 2001
From: Luke Shumaker <LukeShu@sbcglobal.net>
Date: Sat, 4 Jan 2014 19:37:33 -0500
Subject: librefetch: clean up option parsing

---
 src/librefetch/librefetch | 74 +++++++++++++++++++++++++++--------------------
 1 file changed, 43 insertions(+), 31 deletions(-)

(limited to 'src')

diff --git a/src/librefetch/librefetch b/src/librefetch/librefetch
index 42253b2..eb7eb61 100755
--- a/src/librefetch/librefetch
+++ b/src/librefetch/librefetch
@@ -99,11 +99,6 @@ main() {
 	# Mode: checksums ######################################################
 
 	if [[ $mode =~ checksums ]]; then
-		if [[ ${#extra_opts[@]} != 0 ]]; then
-			print "%s: found extra non-flag arguments: %s" "$cmd" "${extra_opts[*]}" >> /dev/stderr
-			usage >> /dev/stderr
-			return 1
-		fi
 		"$makepkg" "${makepkg_opts[@]}" -g -p "$srcbuild" |
 		case ${BUILDFILE##*/} in
 			PKGBUILD) sed -e 's/^[a-z]/mk&/' -e 's/^\s/  &/';;
@@ -115,42 +110,27 @@ main() {
 	# Mode: print ##########################################################
 
 	if [[ $mode =~ print ]]; then
-		if [[ ${#extra_opts[@]} != 0 ]]; then
-			print "%s: found extra non-flag arguments: %s" "$cmd" "${extra_opts[*]}" >> /dev/stderr
-			usage >> /dev/stderr
-			return 1
-		fi
 		cat "$srcbuild"
 		return 0
 	fi
 
 	########################################################################
 
-	local src dst
-	case ${#extra_opts[@]} in
-		1)
-			src="${extra_opts[0]}"
-			dst="${src##*/}"
-			;;
-		2)
-			src="${extra_opts[0]}"
-			dst="${extra_opts[1]}"
-			;;
-		*)
-			print "%s: %d non-flag arguments found, expected 1 or 2: %s" "$cmd" ${#extra_opts[@]} >> /dev/stderr
-			usage >> /dev/stderr
-			return 1
-	esac
+	local src="${extra_opts[0]}"
+	local dst="${extra_opts[1]:-${src##*/}}"
 
+	# canonicalize $src
 	if [[ "$src" == libre://* ]]; then
 		src="${MIRROR}/${src#libre://}"
 	fi
+	# canonicalize $dst
+	dst="$(readlink -m -- "$dst")"
 
+	# check to see if $src is a candidate for create mode
 	if [[ "$src" != "$MIRROR"* ]]; then
 		# inhibit create
 		mode=download
 	fi
-	dst="$(readlink -m -- "$dst")" # canonicalize $dst
 
 	# Mode: download #######################################################
 
@@ -179,10 +159,17 @@ main() {
 
 # sets the variables BUILDFILE, makepkg_opts, extra_opts, mode
 parse_options() {
-	# Detect makepkg options that take a second argument
+	# Detect makepkg options
 	local makepkg_orig="$(which makepkg)"
-	local makepkg_opt2long=($("${makepkg_orig}" -h | sed -rn 's/\s*(--\S*) <.*/\1/p'))
-	local makepkg_opt2short=($("${makepkg_orig}" -h | sed -rn 's/\s*(-.) <.*/\1/p'))
+	# --long flags that take a second argument
+	local makepkg_opt2long=( $(LC_ALL=C "${makepkg_orig}" -h | sed -rn 's/\s*(--\S*) <.*/\1/p'))
+	# -s hort flags that take a second argument
+	local makepkg_opt2short=($(LC_ALL=C "${makepkg_orig}" -h | sed -rn 's/\s*(-.) <.*/\1/p'))
+	# all flags
+	local makepkg_argall=(   $(LC_ALL=C "${makepkg_orig}" -h | sed -rn \
+		-e 's/^ +(-.) .*/\1/p' \
+		-e 's/^ +(-.), (--\S*) .*/\1\n\2/p' \
+		-e 's/^ +(--\S*) .*/\1/p'))
 
 	local opt
 	local have_opt
@@ -207,8 +194,13 @@ parse_options() {
 			-p) BUILDFILE="$(readlink -m -- "$opt")";;
 			-h|--help) mode=help;;
 			-*)
-				makepkg_opts+=("$arg")
-				$have_opt && makepkg_opts+=("$opt")
+				if in_array "${arg}" "${makepkg_argall[@]}"; then
+					makepkg_opts+=("$arg")
+					$have_opt && makepkg_opts+=("$opt")
+				else
+					printf '%s: invalid flag: %s' "$cmd" "$arg"
+					return 1
+				fi
 				;;
 			--) shift; break;;
 			*) extra_opts+=("$arg");;
@@ -216,6 +208,26 @@ parse_options() {
 		shift
 	done
 	extra_opts+=("$@")
+
+	# check the number of extra_opts
+	case "$mode" in
+		help) # don't worry about it
+			:;;
+		checksums|print) # don't take any extra arguments
+			if [[ ${#extra_opts[@]} != 0 ]]; then
+				print "%s: found extra non-flag arguments: %s" "$cmd" "${extra_opts[*]}" >> /dev/stderr
+				usage >> /dev/stderr
+				return 1
+			fi
+			;;
+		*download*|*create*) # take 1 or 2 extra arguments
+			if [[ ${#extra_opts[@]} != 1 ]] && [[ ${#extra_opts[@]} != 2 ]]; then
+				print "%s: %d non-flag arguments found, expected 1 or 2: %s" "$cmd" ${#extra_opts[@]} >> /dev/stderr
+				usage >> /dev/stderr
+				return 1
+			fi
+			;;
+	esac
 }
 
 # Modify makepkg ###############################################################
-- 
cgit v1.2.3-2-g168b