mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01: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 cmds_1 cmds_2 cmds_3 cmds_4 cmds_5 cmds_6
 | |
| 
 | |
| 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
 |