summaryrefslogtreecommitdiff
path: root/Completion/Linux/Command/_btrfs
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Linux/Command/_btrfs')
-rw-r--r--Completion/Linux/Command/_btrfs144
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