diff options
Diffstat (limited to 'Completion/Unix')
-rw-r--r-- | Completion/Unix/Command/_zfs | 27 | ||||
-rw-r--r-- | Completion/Unix/Command/_zpool | 3 | ||||
-rw-r--r-- | Completion/Unix/Type/_zfs_dataset | 54 |
3 files changed, 61 insertions, 23 deletions
diff --git a/Completion/Unix/Command/_zfs b/Completion/Unix/Command/_zfs index 204784d56..4cc24a59f 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 568f493d0..0af2ab32d 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 1cd49aebf..d862011ac 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 |