From c42caac69b5d32c6330716a829d33086b04f2b76 Mon Sep 17 00:00:00 2001
From: Helmut Grohne <helmut@subdivi.de>
Date: Tue, 27 Dec 2022 13:05:00 +0100
Subject: support long options

This change extends option parsing of the debvm tools:
 * Uses posix getopts. No additional dependencies.
 * Long option are supported. The option value may be a separate
   argument or separated with =.
 * Option value may follow short option immediately, e.g. -as390x
 * Multiple short options may be combined, e.g. -gs 2222

Technical limitation:
 * Short options are parsed inside a double dash, e.g.
   -g-image=rootfs.ext4
---
 debvm-create | 111 +++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 66 insertions(+), 45 deletions(-)

(limited to 'debvm-create')

diff --git a/debvm-create b/debvm-create
index d3631fc..5ac62e7 100755
--- a/debvm-create
+++ b/debvm-create
@@ -15,67 +15,88 @@ SSHKEY=
 SUITE=unstable
 VMNAME=testvm
 
+nth_arg() {
+	shift "$1"
+	printf "%s" "$1"
+}
+
 die() {
 	echo "$*" 1>&2
 	exit 1
 }
-
 usage() {
 	die "usage: $0 [-a architecture] [-h hostname] [-k sshkey] [-m mirror] [-o output] [-p packages] [-r release] [-s size_in_GB] [-- mmdebstrap options]"
 }
+usage_error() {
+	echo "error: $*" 1>&2
+	usage
+}
 
+opt_architecture() {
+	ARCHITECTURE=$1
+}
+opt_hostname() {
+	VMNAME=$1
+}
+opt_mirror() {
+	MIRROR=$1
+}
+opt_sshkey() {
+	SSHKEY=$1
+}
+opt_output() {
+	IMAGE=$1
+}
+opt_package() {
+	INCLUDE_PACKAGES="$INCLUDE_PACKAGES,$1"
+}
+opt_release() {
+	SUITE=$1
+}
+opt_size() {
+	SIZE=$(($1*1024*1024*1024))
+}
 
-while test "$#" -gt 0; do
-	case "$1" in
-		-a)
-			test "$#" -eq 1 && usage
-			ARCHITECTURE=$2
-			shift 2
-		;;
-		-h)
-			test "$#" -eq 1 && usage
-			VMNAME=$2
-			shift 2
-		;;
-		-k)
-			test "$#" -eq 1 && usage
-			SSHKEY=$2
-			shift 2
-		;;
-		-m)
-			test "$#" -eq 1 && usage
-			MIRROR=$2
-			shift 2
-		;;
-		-o)
-			test "$#" -eq 1 && usage
-			IMAGE=$2
-			shift 2
-		;;
-		-p)
-			test "$#" -eq 1 && usage
-			INCLUDE_PACKAGES="$INCLUDE_PACKAGES,$2"
-			shift 2
-		;;
-		-r)
-			test "$#" -eq 1 && usage
-			SUITE=$2
-			shift 2
+while getopts :a:h:k:m:o:p:r:s:-: OPTCHAR; do
+	case "$OPTCHAR" in
+		a)	opt_architecture "$OPTARG"	;;
+		h)	opt_hostname "$OPTARG"		;;
+		k)	opt_sshkey "$OPTARG"		;;
+		m)	opt_mirror "$OPTARG"		;;
+		o)	opt_output "$OPTARG"		;;
+		p)	opt_package "$OPTARG"		;;
+		r)	opt_release "$OPTARG"		;;
+		s)	opt_size "$OPTARG"		;;
+		-)
+			case "$OPTARG" in
+				help)
+					usage
+				;;
+				architecture|hostname|mirror|output|package|release|size|sshkey)
+					test "$OPTIND" -gt "$#" && usage_error "missing argument for --$OPTARG"
+					"opt_$OPTARG" "$(nth_arg "$OPTIND" "$@")"
+					OPTIND=$((OPTIND+1))
+				;;
+				architecture=*|hostname=*|mirror=*|output=*|package=*|release=*|size=*|sshkey=*)
+					"opt_${OPTARG%%=*}" "${OPTARG#*=}"
+				;;
+				*)
+					usage_error "unrecognized option --$OPTARG"
+				;;
+			esac
 		;;
-		-s)
-			test "$#" -eq 1 && usage
-			SIZE=$(($2*1024*1024*1024))
-			shift 2
+		:)
+			usage_error "missing argument for -$OPTARG"
 		;;
-		--)
-			shift
-			break
+		'?')
+			usage_error "unrecognized option -$OPTARG"
 		;;
 		*)
-			usage
+			die "internal error while parsing command options, please report a bug"
 		;;
 	esac
 done
+shift "$((OPTIND - 1))"
 
 if test -n "$SSHKEY" && ! test -f "$SSHKEY"; then
 	die "error: ssh keyfile '$SSHKEY' not found"
-- 
cgit v1.2.3