mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-07-03 14:11:26 +02:00
49668: update zfs completion
This commit is contained in:
parent
d82604843b
commit
85bf9740a0
5 changed files with 1315 additions and 844 deletions
|
@ -1,4 +1,9 @@
|
||||||
2021-12-24 Bart Schaefer <schaefer@zsh.org>
|
2021-12-29 Oliver Kiddle <opk@zsh.org>
|
||||||
|
|
||||||
|
* 49668: Completion/Unix/Command/_zfs,
|
||||||
|
Completion/Unix/Type/_zfs_dataset: update zfs completion
|
||||||
|
|
||||||
|
2021-12-24 Bart Schaefer <schaefer@zsh.org>
|
||||||
|
|
||||||
* m0viefreak: 38150: Src/Zle/compmatch.c: fix off-by-one error
|
* m0viefreak: 38150: Src/Zle/compmatch.c: fix off-by-one error
|
||||||
in matcher spec parsing
|
in matcher spec parsing
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,311 +0,0 @@
|
||||||
#compdef zpool
|
|
||||||
# Synced with the S11U1 man page
|
|
||||||
|
|
||||||
_zpool() {
|
|
||||||
local context state line expl implementation
|
|
||||||
local -a subcmds fields ro_props rw_props versions create_properties_dataset
|
|
||||||
|
|
||||||
_pick_variant -r implementation -c 'zpool upgrade -v' openzfs='This system supports ZFS pool feature flags' solaris
|
|
||||||
|
|
||||||
subcmds=(
|
|
||||||
create destroy add remove list iostat status online
|
|
||||||
offline clear attach detach replace scrub import export
|
|
||||||
upgrade history get set split help
|
|
||||||
)
|
|
||||||
|
|
||||||
if [[ $implementation = openzfs ]] && [[ $OSTYPE != solaris* ]]; then
|
|
||||||
subcmds+=( labelclear initialize )
|
|
||||||
fi
|
|
||||||
|
|
||||||
versions=(
|
|
||||||
${${${(M)"${(f)$(_call_program versions zpool upgrade -v)}":#[[:space:]]#<->*}##[[:space:]]}%%[[:space:]]*}
|
|
||||||
)
|
|
||||||
|
|
||||||
ro_props=(
|
|
||||||
"all[All properties]"
|
|
||||||
"allocated[Space allocated]"
|
|
||||||
"capacity[Space used (percentage)]"
|
|
||||||
"dedupratio[Deduplication ratio]"
|
|
||||||
"free[Space unallocated]"
|
|
||||||
"guid[Unique identifier]"
|
|
||||||
"health[Health status]"
|
|
||||||
"size[Total size]"
|
|
||||||
)
|
|
||||||
|
|
||||||
rw_props=(
|
|
||||||
"altroot[Alternate root directory]:value:"
|
|
||||||
"autoexpand[Automatic pool expansion]:value:(on off)"
|
|
||||||
"autoreplace[Automatic device replacement]:value:(on off)"
|
|
||||||
"bootfs[Default bootable dataset]:value:"
|
|
||||||
"cachefile[Pool configuration cache file location]:value:"
|
|
||||||
"dedupditto[Threshold for number of copies]:value:"
|
|
||||||
"delegation[Delegated administration]:value:(on off)"
|
|
||||||
"failmode[Failure-mode behavior]:value:(wait continue panic)"
|
|
||||||
"listshares[Show shares in 'zfs list']:value:(on off)"
|
|
||||||
"listsnaps[Show snapshots in 'zfs list']:value:(on off)"
|
|
||||||
"readonly[Controls whether the pool can be modified]:value:(on off)"
|
|
||||||
"version[Pool version]:version:($versions)"
|
|
||||||
)
|
|
||||||
|
|
||||||
fields=( ${ro_props%%:*} ${rw_props%%:*} )
|
|
||||||
|
|
||||||
create_properties_dataset=(
|
|
||||||
"aclinherit:value:(discard noallow restricted passthrough passthrough-x)"
|
|
||||||
"aclmode:value:(discard mask passthrough)"
|
|
||||||
"atime:value:(on off)"
|
|
||||||
"canmount:value:(on off noauto)"
|
|
||||||
"checksum:value:(on off fletcher2 fletcher4 sha256 sha256+mac)"
|
|
||||||
"compression:value:(on off lzjb gzip gzip-{1..9} zle)"
|
|
||||||
"copies:value:(1 2 3)"
|
|
||||||
"dedup:value:(on off verify sha256 sha256,verify)"
|
|
||||||
"devices:value:(on off)"
|
|
||||||
"encryption:value:(off on aes128-ccm aes-192-ccm aes-256-ccm aes-128-gcm aes-192-gcm aes-256-gcm)"
|
|
||||||
"exec:value:(on off)"
|
|
||||||
"groupquota@:value:" # TODO: complete group=size|none
|
|
||||||
"keysource:value:_zfs_keysource_props"
|
|
||||||
"logbias:value:(latency throughput)"
|
|
||||||
"mlslabel:value:(none)" # TODO: list sensitivity labels
|
|
||||||
"mountpoint:path, 'legacy', or 'none':{if [[ -prefix /* ]]; then _path_files -/; else _wanted mountpoints expl 'mountpoint (type \"/\" to start completing paths)' compadd legacy none; fi}"
|
|
||||||
"nbmand:value:(on off)"
|
|
||||||
"primarycache:value:(all none metadata)"
|
|
||||||
"quota:number or 'none':{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == quota= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'quota' compadd none; fi}"
|
|
||||||
"readonly:value:(on off)"
|
|
||||||
"recordsize:value:(512 1K 2K 4K 8K 16K 32K 64K 128K 256K 512K 1M)"
|
|
||||||
"refquota:number or 'none':{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == refquota= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'refquota' compadd none; fi}"
|
|
||||||
"refreservation:number or 'none':{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == refreservation= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'refreservation' compadd none; fi}"
|
|
||||||
"reservation:value:{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ $PREFIX == reservation= ]]; then _wanted none expl 'number or none' compadd none; else _wanted none expl 'reservation' compadd none; fi}"
|
|
||||||
"rstchown:value:(on off)"
|
|
||||||
"secondarycache:value:(all none metadata)"
|
|
||||||
"setuid:value:(on off)"
|
|
||||||
"shadow:value:" # TODO: complete URI|none
|
|
||||||
"share:share properties:"
|
|
||||||
"sharenfs:value:(on off)"
|
|
||||||
"sharesmb:value:(on off)"
|
|
||||||
"snapdir:value:(hidden visible)"
|
|
||||||
"sync:value:(standard always disabled)"
|
|
||||||
"userquota@:value:" # TODO: complete user=size|none
|
|
||||||
"version:value:(1 2 3 4 current)"
|
|
||||||
"volsize:value:" # <size>
|
|
||||||
"vscan:value:(on off)"
|
|
||||||
"xattr:value:(on off)"
|
|
||||||
"zoned:value:(on off)"
|
|
||||||
)
|
|
||||||
|
|
||||||
if [[ $service == "zpool" ]]; then
|
|
||||||
_arguments -C \
|
|
||||||
'-\?[show help information]' \
|
|
||||||
'1:subcommand:compadd -a subcmds' \
|
|
||||||
'*:: :->subcmd' && return
|
|
||||||
|
|
||||||
service="$words[1]"
|
|
||||||
curcontext="${curcontext%:*}-$service:"
|
|
||||||
fi
|
|
||||||
|
|
||||||
case $service in
|
|
||||||
(help)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
- set1 \
|
|
||||||
':command/property:($subcmds ${fields%%\[*} properties)' \
|
|
||||||
- set2 \
|
|
||||||
'-l[Display property information]' \
|
|
||||||
': :(properties)'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(clear)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-F[Discard transactions to allow pool opening]' \
|
|
||||||
'-f[Ignore fmadm acquit and fmadm repair failures]' \
|
|
||||||
'-n[With -F, check if discarding transactions would work]' \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
'*:virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(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]' \
|
|
||||||
'-l[Display configuration in /dev/chassis location form]' \
|
|
||||||
'-n[Display configuration without creating pool]' \
|
|
||||||
'-R[Use alternate root]:alternate root:_files -/' \
|
|
||||||
'-m[Set mountpoint for root dataset]:mountpoint:' \
|
|
||||||
':pool name:' \
|
|
||||||
'*:virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(destroy)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-f[Force active datasets to be unmounted]' \
|
|
||||||
':pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(add)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-f[Force use of in-use devices]' \
|
|
||||||
'-l[Display configuration in /dev/chassis location form]' \
|
|
||||||
'-n[Display configuration without modifying pool]' \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
'*:virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(list)
|
|
||||||
_arguments \
|
|
||||||
'-H[Scripted mode]' \
|
|
||||||
'-T[timestamp]:value:(u d)' \
|
|
||||||
'-o[Fields to list]:field:_values -s , "field" $fields' \
|
|
||||||
'::pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(initialize)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'(-c --cancel)'{-c,--cancel}'[cancel initializing on specified devices]' \
|
|
||||||
'(-s --suspend)'{-s,--suspend}'[suspend initializing on specified devices]' \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
'*:device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(iostat)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-l[Display configuration in /dev/chassis location form]' \
|
|
||||||
'-T[timestamp]:value:(u d)' \
|
|
||||||
'-v[Verbose statistics]' \
|
|
||||||
'*::pool name:_zfs_pool' \
|
|
||||||
'::interval:' \
|
|
||||||
'::count:'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(labelclear)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-f[treat exported or foreign devices as inactive]' \
|
|
||||||
'*:virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(status)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-l[Display configuration in /dev/chassis location form]' \
|
|
||||||
'-v[Verbose information]' \
|
|
||||||
'-x[Show only unhealthy pools]' \
|
|
||||||
'-T[timestamp]:value:(u d)' \
|
|
||||||
'*::pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(offline)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-t[Offline until next reboot]' \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
'*:virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(online)
|
|
||||||
_arguments \
|
|
||||||
'-e[Expand device to use all available space]' \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
'*:virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(attach)
|
|
||||||
# TODO: first device should choose first from existing.
|
|
||||||
_arguments \
|
|
||||||
'-f[Force attach, even if in use]' \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
':virtual device:_files' \
|
|
||||||
':virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(detach)
|
|
||||||
_arguments \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
':virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(replace)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-f[Force attach, even if in use]' \
|
|
||||||
':pool name:_zfs_pool' \
|
|
||||||
':virtual device:_files' \
|
|
||||||
'::virtual device:_files'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(scrub)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-s[Stop scrubbing]' \
|
|
||||||
'*:pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(export)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-f[Forcefully unmount all datasets]' \
|
|
||||||
'*:pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(import)
|
|
||||||
# TODO: -o should complete mount options, too
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-D[Destroyed pools]' \
|
|
||||||
'(-d)*-c[Use cache file]:cache file:_files' \
|
|
||||||
'(-c -D)*-d[Search for devices or files in directory]:directory:_files -/' \
|
|
||||||
'-F[Recovery mode: discard transactions if required]' \
|
|
||||||
'-f[Force import]' \
|
|
||||||
'-l[Display configuration in /dev/chassis location form]' \
|
|
||||||
'-m[Ignore missing log devices]' \
|
|
||||||
'-N[Import pool without mounting any filesystems]' \
|
|
||||||
'-n[With -F; do not perform input]' \
|
|
||||||
'-R[Alternate root]:alternate root:_files -/' \
|
|
||||||
'-o[Set pool or dataset property]:property:_values -s , "property" $create_properties_dataset $rw_props' \
|
|
||||||
- set1 \
|
|
||||||
'*:pool name or id:_zfs_pool' \
|
|
||||||
'::new pool name:' \
|
|
||||||
- set2 \
|
|
||||||
'-N[Do not mount any filesystems]' \
|
|
||||||
'-a[All pools]'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(get)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
':property:_values -s , "property" $fields' \
|
|
||||||
'*:pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(set)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
':property:_values -s , "property" $rw_props' \
|
|
||||||
'*:pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(split)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-R[Alternate root]:alternate root:_files -/' \
|
|
||||||
'-l[Display configuration in /dev/chassis location form]' \
|
|
||||||
'-n[Display configuration without splitting]' \
|
|
||||||
'-o[Set pool or dataset property]:property:_values -s , "property" $create_properties_dataset $rw_props' \
|
|
||||||
':pool name or id:_zfs_pool' \
|
|
||||||
':new pool name:' \
|
|
||||||
'*::virtual device:_files -/'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(upgrade)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
- set1 \
|
|
||||||
'-v[Display ZFS versions and descriptions]' \
|
|
||||||
- set2 \
|
|
||||||
"-V[Upgrade to given version]:version:($versions)" \
|
|
||||||
'-a[Upgrade all pools]' \
|
|
||||||
'*:pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(history)
|
|
||||||
_arguments -A "-*" \
|
|
||||||
'-i[Display internal events]' \
|
|
||||||
'-l[Long format]' \
|
|
||||||
'*:pool name:_zfs_pool'
|
|
||||||
;;
|
|
||||||
|
|
||||||
(*)
|
|
||||||
_message "unknown zpool subcommand: $service"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
_zpool "$@"
|
|
|
@ -11,10 +11,12 @@ local expl_type
|
||||||
# -t takes arguments (what kinds of datasets) and can appear multiple times
|
# -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
|
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)fs] ]] && typearg=( filesystem )
|
||||||
[[ -n $type[(r)vol] ]] && typearg=( $typearg volume )
|
[[ -n $type[(r)vol] ]] && typearg+=( volume )
|
||||||
[[ -n $type[(r)snap] ]] && typearg=( $typearg snapshot )
|
[[ -n $type[(r)snap] ]] && typearg+=( snapshot )
|
||||||
[[ -n $type[(r)share] ]] && typearg=( $typearg share )
|
[[ -n $type[(r)share] && $implementation = solaris ]] && typearg+=( share )
|
||||||
|
[[ -n $type[(r)bookmark] && $implementation = openzfs ]] &&
|
||||||
|
typearg+=( bookmark )
|
||||||
if [[ -n $typearg ]]; then
|
if [[ -n $typearg ]]; then
|
||||||
typearg=( -t ${(j:,:)typearg} )
|
typearg=( -t ${(j:,:)typearg} )
|
||||||
# We know we're in zfs list if paths_allowed is non-empty.
|
# We know we're in zfs list if paths_allowed is non-empty.
|
||||||
|
@ -58,7 +60,7 @@ if [[ ${#rdst} -gt 0 ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n $type[(r)clone] ]]; then
|
if [[ -n $type[(r)clone] ]]; then
|
||||||
datasetlist=( ${(f)"$(zfs list -H -o name,origin -t filesystem 2>/dev/null | awk -F $'\t' "\$2 != \"-\" {print \$1}")":#no cloned filesystems available} )
|
datasetlist=( ${(f)"$(zfs list -H -o name,origin -t filesystem 2>/dev/null | awk -F$'\t' "\$2 != \"-\" {print \$1}")":#no cloned filesystems available} )
|
||||||
else
|
else
|
||||||
datasetlist=( ${(f)"$(zfs list -H -o name $typearg 2>/dev/null)":#no datasets available} )
|
datasetlist=( ${(f)"$(zfs list -H -o name $typearg 2>/dev/null)":#no datasets available} )
|
||||||
fi
|
fi
|
||||||
|
@ -74,4 +76,5 @@ if [[ -n $expl_type_arr[2] ]]; then
|
||||||
expl_type=$expl_type_arr[2]
|
expl_type=$expl_type_arr[2]
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_wanted dataset expl "$expl_type" _multi_parts "$@" -q / datasetlist
|
_description datasets expl "$expl_type"
|
||||||
|
_multi_parts "$@" "$expl[@]" -q / datasetlist
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
#autoload
|
|
||||||
|
|
||||||
local -a suf
|
|
||||||
local expl
|
|
||||||
|
|
||||||
compset -S ",*" || suf=(-S ,)
|
|
||||||
if compset -P 1 "*,"; then
|
|
||||||
_alternative "zfs-keylocator-prompt:\"prompt\" locator:(prompt)" \
|
|
||||||
"zfs-keylocator-file:file locator:_path_files" \
|
|
||||||
"zfs-keylocator-pkcs11:PKCS#11 locator: " \
|
|
||||||
"zfs-keylocator-https:HTTPS URL locator: "
|
|
||||||
else
|
|
||||||
_description format expl "keysource format"
|
|
||||||
compadd $suf -q "$expl[@]" "$@" raw hex passphrase
|
|
||||||
fi
|
|
Loading…
Reference in a new issue