mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-05 11:01:13 +02:00
144 lines
5 KiB
Text
144 lines
5 KiB
Text
#compdef btrfs
|
|
|
|
local curcontext="$curcontext" curstate state line expl grp cmd ret=1
|
|
local -a groups args
|
|
|
|
groups=( subvolume filesystem device scrub balance inspect-internal help version )
|
|
cmds_1=( create delete list snapshot get-default set-default find-new help )
|
|
cmds_2=( df show sync defragment resize label balance help )
|
|
cmds_3=( add delete scan help )
|
|
cmds_4=( start cancel resume status help )
|
|
cmds_5=( start pause cancel resume status )
|
|
cmds_6=( inode-resolve logical-resolve help )
|
|
|
|
[[ $words[2] = h(|e(|l(|p))) ]] && args=( '--full[display detailed help]' )
|
|
|
|
_arguments -C "$args[@]" \
|
|
'(- *)--help[print help information]' \
|
|
'(- *)--version[print version information]' \
|
|
'(--version)1: :->groups' \
|
|
'2: :->cmds' \
|
|
'*:: :->args' && ret=0
|
|
|
|
while (( $#state )); do
|
|
curstate=$state
|
|
shift state
|
|
case $curstate in
|
|
groups)
|
|
_wanted command-groups expl 'btrfs command group' compadd -a groups && ret=0
|
|
;;
|
|
cmds)
|
|
: $words
|
|
local grp=${groups[(i)$words[2]*]}
|
|
: $grp
|
|
(( grp && grp < 7 )) || return 1
|
|
curcontext="${curcontext%:*:*}:$service-${groups[grp]}:"
|
|
_wanted commands expl command compadd -a cmds_$grp && ret=0
|
|
;;
|
|
args)
|
|
: $words
|
|
local grp=${groups[(i)$words[1]*]}
|
|
(( grp && grp < 7 )) || return 1
|
|
local group=cmds_$grp
|
|
local cmd=${${(P)group}[(i)$words[2]*]}
|
|
(( cmd )) || return 1
|
|
curcontext="${curcontext%:*:*}:$service-${groups[grp]}-${${(P)group}[cmd]}:"
|
|
args=( '(-)--help[print help information]' )
|
|
case ${groups[grp]}:${${(P)group}[cmd]} in
|
|
filesystem:balance)
|
|
if (( CURRENT == 3 )); then
|
|
state+=cmds
|
|
else
|
|
shift words
|
|
(( CURRENT-- ))
|
|
state+=args
|
|
fi
|
|
continue
|
|
;;
|
|
subvolume:create) args+=( '1:destination:->mounts' );;
|
|
subvolume:delete) args+=( '1:subvolume:_files -/' );;
|
|
subvolume:snapshot) args+=( '-r[readonly snapshot]' '1:snapshot:_files -/' );;
|
|
subvolume:list) args+=( '-p[include parent ID in output]' '1:path:->mounts' );;
|
|
subvolume:set-default) args+=( '1:id:_guard "[0-9]#" id' '2:path:->mounts' );;
|
|
filesystem:resize) args+=( '1:size:_guart "(|+|-)[0-9]#[GKM]"' '2:path:->mounts' );;
|
|
filesystem:defragment)
|
|
args+=(
|
|
'-v[verbose]'
|
|
'-c[compress files while defragmenting]'
|
|
'-f[flush after defragmenting]'
|
|
'-s[start position]:byte position'
|
|
'-l[defragment limited number of bytes]:length (bytes)'
|
|
'-t[defragment only files over a certain size]:minimum size (bytes)'
|
|
'*:file:_files'
|
|
)
|
|
;;
|
|
filesystem:label) args+=( '1:device:_files -g "*(d)"' '2:label' );;
|
|
filesystem:show) args+=( '(1 -)--all-devices[scan all devices in /dev]' '1: :_guard "^-*" uuid or label' );;
|
|
device:(add|delete)) args+=( '1:device:_files -g "*(d)"' '2:path:->mounts' );;
|
|
device:scan) args+=( '(1 -)--all-devices[scan all devices in /dev]' '1:device:_files -g "*(d)"' );;
|
|
scrub:(start|resume))
|
|
args+=(
|
|
"-B[don't background and print statistics at end]"
|
|
'-d[print separate statistics for each device]'
|
|
'-q[omit error message and statistics]'
|
|
'-r[read only mode]'
|
|
'-u[scrub unused space too]'
|
|
'1:path or device:_files'
|
|
)
|
|
;;
|
|
scrub:cancel) args+=( '1:path or device' );;
|
|
scrub:status) args+=( '-d[separate statistics for each device]' '1:path or device:_files' );;
|
|
balance:start)
|
|
args+=(
|
|
'(-m -s)-d+[act on data chunks]:filter:->filters'
|
|
'(-d -s)-m+[act on metadata chunks]:filter:->filters'
|
|
'(-d -m)-s+[act on system chunks (only under -f)]:filters:->filters'
|
|
'-v[verbose mode]'
|
|
'-f[force reducing of metadata integrity]'
|
|
'1:path:_files -/'
|
|
)
|
|
;;
|
|
balance:status) args+=( '-v[verbose mode]' '2:path:_files -/' );;
|
|
balance:(pause|cancel|resume)) args+=( '2:path:_files -/' );;
|
|
inspect*:inode*) args+=( '-v[verbose mode]' '1:inode:_files' '2:path:_files -/' );;
|
|
inspect*:logical*)
|
|
args+=(
|
|
'-v[verbose mode]'
|
|
'-P[skip the path resolving and print the inodes instead]'
|
|
'1:logical address:_files'
|
|
'2:filesystem path:_files -/'
|
|
)
|
|
;;
|
|
subvolume:get-default) ;&
|
|
*:sync) ;&
|
|
*:df) args+=( '1:path:->mounts' );;
|
|
*) args+=( '*: :_default' );; # fallback for unknown subcommands
|
|
esac
|
|
shift words
|
|
(( CURRENT-- ))
|
|
_arguments -C "$args[@]" && ret=0
|
|
;;
|
|
mounts)
|
|
_wanted mount-points expl 'mount point' compadd \
|
|
${${${(M)${(f)"$(</etc/mtab)"}:#*btrfs*}#* }%% *} && ret=0
|
|
;;
|
|
filters)
|
|
state=()
|
|
_values -s , filter \
|
|
'profiles[balance only block groups in given replication profiles]:profile:->profiles' \
|
|
'usage[balance block groups with usage below percentage]:percentage' \
|
|
'devid[limit by device ID]:device ID' \
|
|
'drange[balance block groups overlapping byte range]:range' \
|
|
'vrange[balance block groups overlapping byte range in virtual address space]:range' \
|
|
'convert[convert block groups to given profile]:profile:->profiles' \
|
|
'soft[leave chunks that already have target profile]' && ret=0
|
|
state=( $state )
|
|
;;
|
|
profiles)
|
|
compset -P '*\|'
|
|
_values -s ',' profile raid0 raid1 raid10 dup single && ret=0
|
|
;;
|
|
esac
|
|
done
|
|
|
|
return ret
|