Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

another Solaris/zfs completion update



Here's another set of updates for Solaris-specific completion functions, as
well as for zfs.  Code review is welcome, but not necessary.

Thanks,
Danek

diff --git a/Completion/Solaris/Command/_dladm b/Completion/Solaris/Command/_dladm
index 636b766..5e5ab01 100644
--- a/Completion/Solaris/Command/_dladm
+++ b/Completion/Solaris/Command/_dladm
@@ -1,5 +1,5 @@
 #compdef dladm
-# Synced with the S11U1 build 16 man page
+# Synced with the S11U1 build 19 man page
 
 _dladm_links() {
 	compadd "$@" - $(dladm show-link -p -o link)
@@ -81,15 +81,15 @@ _dladm() {
 	# TODO: some subcommands may take different arguments based on options
 
 	subcmds=(
-		"show-ether" "show-ib" "show-usage"
+		"help" "show-ether" "show-ib" "show-usage"
 		{"rename","show"}"-link"
 		{"add","create","delete","modify","remove","show"}"-aggr"
 		{"connect","disconnect","scan","show"}"-wifi"
 		{"reset","set","show"}"-linkprop"
 		{"create","delete","show"}"-secobj"
-		{"create","delete","show"}"-vlan"
+		{"create","delete","modify","show"}"-vlan"
 		{"delete","show"}"-phys"
-		{"create","delete","show"}"-vnic"
+		{"create","delete","modify","show"}"-vnic"
 		{"create","delete","show"}"-etherstub"
 		{"create","modify","delete","add","remove","show"}"-bridge"
 		{"create","modify","delete","show"}"-iptun"
@@ -112,7 +112,7 @@ _dladm() {
 	link_properties=( "link" "zone" "class" "mtu" "state" "over" )
 	link_stats_properties=( "link" "ipackets" "rbytes" "ierrors" "opackets" "obytes" "oerrors" )
 
-	aggr_properties=( "link" "policy" "addrpolicy" "lacpactivity" "lacptimer" "flags" )
+	aggr_properties=( "link" "policy" "addrpolicy" "lacpactivity" "lacptimer" "mode" "flags" )
 	aggr_lacp_properties=( "link" "port" "aggregatable" "sync" "coll" "dist" "defaulted" "expired" )
 	aggr_ext_properties=( "link" "port" "speed" "duplex" "state" "address" "portstate" )
 
@@ -148,8 +148,15 @@ _dladm() {
 
 	linkprops_general=(
 		"autopush:streams modules:"
+		"cos:value:(0 1 2 3 4 5 6 7)"
 		"cpus:processors:"
 		"cpus-effective"
+		"etsbw-lcl:percentage:"
+		"etsbw-lcl-advice"
+		"etsbw-lcl-effective"
+		"etsbw-rmt-effective"
+		"lro:value:(off on auto)"
+		"lro-effective"
 		"mac-address:MAC address:"
 		"maxbw:bandwith:"
 		"pool:pools:"
@@ -216,6 +223,8 @@ _dladm() {
 		"mtu:value:"
 		"ntcs"
 		"pfcmap:value:"
+		"pfcmap-lcl-effective"
+		"pfcmap-rmt-effective"
 		"speed"
 		"tagmode:value:(normal vlanonly)"
 		"vlan-announce:value:(off gvrp)"
@@ -233,6 +242,10 @@ _dladm() {
 	)
 
 	case $service in
+	("help")
+		_arguments ':subcommand:($subcmds)'
+		;;
+
 	("show-link")
 		_arguments -A "-*" \
 			'(-P --persistent)'{-P,--persistent}'[Display persistent link configuration]' \
@@ -257,6 +270,7 @@ _dladm() {
 
 	("show-phys")
 		_arguments -A "-*" \
+			'-D[Show Data Center Bridging information]:featureset:(ets pfc)' \
 			'-H[Show hardware resource usage]' \
 			'-L[Display location information]' \
 			'(-P --persistent)'{-P,--persistent}'[Display persistent link configuration]' \
@@ -280,6 +294,7 @@ _dladm() {
 			'(-t --temporary)'{-t,--temporary}'[Aggregation should be temporary]' \
 			'(-R --root)'{-R,--root}'[Root directory]:directory:_path_files -/' \
 			'(-l --link)'{-l,--link}'[Component link]:link:_dladm_links' \
+			'(-m --mode)'{-m,--mode}'[Aggregation mode]:mode:(dlmp trunk)' \
 			'(-P --policy)'{-P,--policy}'[Port selection policy]:policy:_values -s , "policy" L2 L3 L4' \
 			'(-L --lacp-mode)'{-L,--lacp-mode}'[LACP mode]:lacp mode:(off active passive)' \
 			'(-T --lacp-timer)'{-T,--lacp-timer}'[LACP timer]:lacp timer:(short long)' \
@@ -292,6 +307,7 @@ _dladm() {
 			'(-t --temporary)'{-t,--temporary}'[Aggregation should be temporary]' \
 			'(-R --root)'{-R,--root}'[Root directory]:directory:_path_files -/' \
 			'(-l --link)'{-l,--link}'[Component link]:link:_dladm_links' \
+			'(-m --mode)'{-m,--mode}'[Aggregation mode]:mode:(dlmp trunk)' \
 			'(-P --policy)'{-P,--policy}'[Port selection policy]:policy:_values -s , "policy" L2 L3 L4' \
 			'(-L --lacp-mode)'{-L,--lacp-mode}'[LACP mode]:lacp mode:(off active passive)' \
 			'(-T --lacp-timer)'{-T,--lacp-timer}'[LACP timer]:lacp timer:(short long)' \
@@ -358,6 +374,19 @@ _dladm() {
 			':VLAN link name:_dladm_vlans'
 		;;
 
+	("modify-vlan")
+		_arguments -A "-*" \
+			'(-t --temporary)'{-t,--temporary}'[VLAN should be temporary]' \
+			'(-f --force)'{-f,--force}'[Force VLAN creation]' \
+			'(-R --root-dir)'{-R,--root-dir}'[Root directory]:directory:_path_files -/' \
+			'(-l --link)'{-l,--link}'[Component link]:link:_dladm_links' \
+			'-v[VLAN ID]:id:' \
+			- set1 \
+			'-L[Source link]:link:_dladm_links' \
+			- set2 \
+			':VLAN link name:'
+		;;
+
 	("show-vlan")
 		_arguments -A "-*" \
 			'(-P --persistent)'{-P,--persistent}'[Display persistent link configuration]' \
@@ -486,6 +515,21 @@ _dladm() {
 			':VNIC name:_dladm_vnics'
 		;;
 
+	("modify-vnic")
+		# TODO: MAC address completion could be richer
+		_arguments -A "-*" \
+			'(-t --temporary)'{-t,--temporary}'[Creation should be temporary]' \
+			'(-R --root)'{-R,--root}'[Root directory]:directory:_path_files -/' \
+			'(-l --link)'{-l,--link}'[Component link]:link:_dladm_links' \
+			'(-m --mac-address)'{-m,--mac-address}'[MAC address]:address:(factory random auto vrrp)' \
+			'-v[VLAN ID]:id:' \
+			'(-p --prop)'{-p,--prop}'[Property values]:value:_values -s , "property" ${(M)linkprops_general\:#*\:*}' \
+			- set1 \
+			'-L[Source link]:link:_dladm_links' \
+			- set2 \
+			':VNIC name:'
+		;;
+
 	("show-vnic")
 		_arguments -A "-*" \
 			'(-P --persistent)'{-P,--persistent}'[Display persistent object information]' \
diff --git a/Completion/Solaris/Command/_flowadm b/Completion/Solaris/Command/_flowadm
index 2a18ecc..53a9f22 100644
--- a/Completion/Solaris/Command/_flowadm
+++ b/Completion/Solaris/Command/_flowadm
@@ -1,5 +1,5 @@
 #compdef flowadm
-# Synced with the Nevada build 171 man page
+# Synced with the S11U1 build 19 man page
 
 _flowadm() {
 
@@ -16,6 +16,7 @@ _flowadm_flow_int(){
 }
 
 subcmds=(
+	"help"
 	"show-flow"
 	"add-flow"
 	"remove-flow"
@@ -49,6 +50,10 @@ if [[ $service == "flowadm" ]]; then
 fi
 case $service in
 
+	("help")
+		_arguments ':subcommand:($subcmds)'
+		;;
+
 	("show-flow")
 	_arguments -A "-*" \
 		'-o[specify field to display]:field:(flow link ipaddr proto port dsfield)' \
diff --git a/Completion/Solaris/Command/_ipadm b/Completion/Solaris/Command/_ipadm
index 062abaa..34d1eac 100644
--- a/Completion/Solaris/Command/_ipadm
+++ b/Completion/Solaris/Command/_ipadm
@@ -1,5 +1,5 @@
 #compdef ipadm
-# Synced with the S11U1 build 16 man page
+# Synced with the S11U1 build 19 man page
 
 _ipadm_ifs() {
 	local -a extra
@@ -81,6 +81,7 @@ _ipadm() {
 	local -a proto_all_properties proto_propproperties
 
 	subcmds=(
+		"help"
 		{"show","disable","enable"}"-if"
 		{"create","delete"}"-ip"
 		{"create","delete"}"-vni"
@@ -153,6 +154,10 @@ _ipadm() {
 	fi
 
 	case $service in
+	("help")
+		_arguments ':subcommand:($subcmds)'
+		;;
+
 	("create-ip")
 		_arguments -A "-*" \
 			'(-t --temporary)'{-t,--temporary}'[Interface should be temporary]' \
diff --git a/Completion/Solaris/Command/_zoneadm b/Completion/Solaris/Command/_zoneadm
index f0a45a1..3f42673 100644
--- a/Completion/Solaris/Command/_zoneadm
+++ b/Completion/Solaris/Command/_zoneadm
@@ -1,5 +1,5 @@
 #compdef zoneadm
-# Synced with the Solaris 11 build 168 man page
+# Synced with the S11U1 build 19 man page
 
 _zoneadm_bootargs() {
 	# This is a subset of the arguments to kernel(1M)
@@ -129,7 +129,7 @@ _zoneadm() {
 
 	("mark")
 		_arguments -A "-*" \
-			':"incomplete":_values \"incomplete\" incomplete'
+			':state:(incomplete unavailable)'
 		;;
 
 	("move")
diff --git a/Completion/Unix/Command/_zfs b/Completion/Unix/Command/_zfs
index 204784d..4cc24a5 100644
--- a/Completion/Unix/Command/_zfs
+++ b/Completion/Unix/Command/_zfs
@@ -1,5 +1,5 @@
 #compdef zfs
-# Synced with the S11U1 build 16 man page
+# Synced with the S11U1 build 20 man page
 
 _zfs() {
 	local context state line expl
@@ -21,7 +21,7 @@ _zfs() {
 		"compressratio" "mounted" "origin" "usedbychildren"
 		"usedbydataset" "usedbyrefreservation" "usedbysnapshots"
 		"defer_destroy" "userused@" "userrefs" "groupused@"
-		"keystatus" "rekeydate"
+		"keychangedate" "keystatus" "rekeydate"
 	)
 
 	# TODO: Be cleverer about what values can be set.  Is there any way to
@@ -111,12 +111,12 @@ _zfs() {
 			'-p[Create parent datasets]' \
 			'-o[Set initial properties]:property:_values -s , "property" $create_properties' \
 			- set1 \
-			':filesystem:' \
+			':filesystem:_zfs_dataset -t fs -e "parent dataset"' \
 			- set2 \
 			'-s[Create sparse volume]' \
 			'-b[Set volblocksize]:blocksize:' \
 			'-V[Set size]:size:' \
-			':volume:'
+			':volume:_zfs_dataset -t fs -e "parent dataset"'
 		;;
 
 	("destroy")
@@ -153,25 +153,20 @@ _zfs() {
 			'-K[Create encryption key]' \
 			'-o[Set property]:property:_values -s , "property" $create_properties' \
 			':snapshot:_zfs_dataset -t snap' \
-			':filesystem/volume:'
+			':filesystem/volume:_zfs_dataset -t fs -e "parent dataset"'
 		;;
 
 	("promote")
-		# XXX complete only cloned filesystems
 		_arguments \
-			':filesystem:_zfs_dataset -t fs' \
+			':filesystem:_zfs_dataset -t clone' \
 		;;
 
 	("rename")
 		_arguments -A "-*" \
-			- set1 \
-			'-p[Create parent datasets]' \
-			':filesystem/volume/snapshot:_zfs_dataset' \
-			':filesystem/volume/snapshot:' \
-			- set2 \
-			'-r[Recursively rename snapshots of all descendent datasets]' \
-			':snapshot:_zfs_dataset -t snap' \
-			':snapshot:'
+			'(-r)-p[Create parent datasets]' \
+			'(-p)-r[Recursively rename snapshots of all descendent datasets]' \
+			':dataset:_zfs_dataset -r1' \
+			':dataset:_zfs_dataset -r2'
 		;;
 
 	("list")
@@ -182,7 +177,7 @@ _zfs() {
 			'-o[Properties to list]:property:_values -s , "property" $ro_properties $rw_propnames' \
 			'*-s[Sort key (ascending)]:property:_values "property" $ro_properties $rw_propnames' \
 			'*-S[Sort key (descending)]:property:_values "property" $ro_properties $rw_propnames' \
-			'-t[Dataset types to list]:dataset type:_values -s , "dataset type" filesystem snapshot volume' \
+			'-t[Dataset types to list]:dataset type:_values -s , "dataset type" all filesystem snapshot volume' \
 			'*:filesystem/volume/snapshot/path:_zfs_dataset -p'
 		;;
 
diff --git a/Completion/Unix/Command/_zpool b/Completion/Unix/Command/_zpool
index 568f493..0af2ab3 100644
--- a/Completion/Unix/Command/_zpool
+++ b/Completion/Unix/Command/_zpool
@@ -1,5 +1,5 @@
 #compdef zpool
-# Synced with the S11U1 build 16 man page
+# Synced with the S11U1 build 19 man page
 
 _zpool() {
 	local context state line expl
@@ -108,6 +108,7 @@ _zpool() {
 	(create)
 		# TODO: investigate better vdev handling
 		_arguments -A "-*" \
+			'-B[Create EFI boot partition on whole disks]' \
 			'-o[Set pool property at creation time]:property:_values -s , "property" $rw_props' \
 			'-O[Set dataset property at creation time]:property:_values -s , "property" $create_properties_dataset' \
 			'-f[Force use of in-use devices]' \
diff --git a/Completion/Unix/Type/_zfs_dataset b/Completion/Unix/Type/_zfs_dataset
index 1cd49ae..d862011 100644
--- a/Completion/Unix/Type/_zfs_dataset
+++ b/Completion/Unix/Type/_zfs_dataset
@@ -1,13 +1,19 @@
 #autoload
 
-local -a type paths_allowed typearg datasetlist expl
+local -a type expl_type_arr rsrc rdst paths_allowed
+local -a typearg datasetlist expl mlist
 local expl_type
 
-zparseopts -D -E t+:=type p=paths_allowed
+# -e takes an argument which is passed as as the "descr" argument to _wanted
+# -p indicates that filesystem paths, not just dataset names, are allowed
+# -r1 indicates that we're completing the source of a rename
+# -r2 indicates that we're completing the destination of a rename
+# -t takes arguments (what kinds of datasets) and can appear multiple times
+zparseopts -D -E e:=expl_type_arr p=paths_allowed r1=rsrc r2=rdst t+:=type
 
-[[ -n $type[(r)fs] ]]   && typearg=( filesystem )
-[[ -n $type[(r)vol] ]]  && typearg=( $typearg volume )
-[[ -n $type[(r)snap] ]] && typearg=( $typearg snapshot )
+[[ -n $type[(r)fs] ]]    && typearg=( filesystem )
+[[ -n $type[(r)vol] ]]   && typearg=( $typearg volume )
+[[ -n $type[(r)snap] ]]  && typearg=( $typearg snapshot )
 if [[ -n $typearg ]]; then
 	typearg=( -t ${(j:,:)typearg} )
 # We know we're in zfs list if paths_allowed is non-empty.
@@ -20,7 +26,39 @@ if [[ ${#paths_allowed} -gt 0 && $PREFIX == /* ]]; then
 	return
 fi
 
-datasetlist=( ${="$(zfs list -H -o name $typearg)":#no datasets available} )
+if [[ ${#rsrc} -gt 0 ]]; then
+	# With the -r option to zfs rename, we can only rename snapshots.  With the
+	# -p option, we can only rename filesystems and volumes.
+	if [[ -n $words[(r)-r] ]]; then
+		typearg=( -t snapshot )
+	elif [[ -n $words[(r)-p] ]]; then
+		typearg=( -t filesystem,volume )
+	else
+		typearg=( -t filesystem,snapshot,volume )
+	fi
+fi
+
+if [[ ${#rdst} -gt 0 ]]; then
+	if [[ ${words[CURRENT - 1]} == *@* ]]; then
+		# If we're renaming snapshots, there's nothing to complete, so
+		# we simply give instructions.  (In non-recursive cases, we
+		# could put the name of the snapshotted dataset first, but why
+		# bother with the long form?)
+		_message -e 'snapshot name (beginning with "@")'
+		return
+	else
+		# The parent dataset must be a filesystem, and can't rename
+		# a dataset into another pool.  Plus we hardcode the expl.
+		typearg=( -t fs -r ${${words[CURRENT - 1]}%%/*} )
+		expl_type_arr=( -e "parent dataset" )
+	fi
+fi
+
+if [[ -n $type[(r)clone] ]]; then
+	datasetlist=( ${="$(zfs list -H -o name,origin -t fs | awk "\$2 != \"-\" {print \$1}")":#no cloned filesystems available} )
+else
+	datasetlist=( ${="$(zfs list -H -o name $typearg)":#no datasets available} )
+fi
 
 expl_type=${typearg[2,-1]//,/\/}
 if [[ -n $type[(r)mtpt] ]]; then
@@ -29,4 +67,8 @@ if [[ -n $type[(r)mtpt] ]]; then
 	expl_type="$expl_type/mountpoint"
 fi
 
+if [[ -n $expl_type_arr[2] ]]; then
+	expl_type=$expl_type_arr[2]
+fi
+
 _wanted dataset expl "$expl_type" _multi_parts "$@" -q / datasetlist



Messages sorted by: Reverse Date, Date, Thread, Author