diff options
Diffstat (limited to 'Completion/Linux/Command/_btrfs')
-rw-r--r-- | Completion/Linux/Command/_btrfs | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/Completion/Linux/Command/_btrfs b/Completion/Linux/Command/_btrfs new file mode 100644 index 000000000..eac827050 --- /dev/null +++ b/Completion/Linux/Command/_btrfs @@ -0,0 +1,144 @@ +#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 |