mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-04 07:21:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
	
		
			7.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#compdef rpm
 | 
						|
 | 
						|
# This uses `_arguments' in a state-machine kind of way. These states
 | 
						|
# have names and before executing the default action for such a state
 | 
						|
# we try to call a function with the name `_rpm_<state>'. If such a
 | 
						|
# function exists, we return with its return status immediately. This
 | 
						|
# allows users to override the default completions by simply defining
 | 
						|
# these functions.
 | 
						|
# The states (and possible values for the `<state>' above) are:
 | 
						|
#
 | 
						|
#  query
 | 
						|
#    complete for `rpm -q' query
 | 
						|
#  verify
 | 
						|
#    complete for `rpm --verify'
 | 
						|
#  install
 | 
						|
#    complete for `rpm -i' or `rpm --install'
 | 
						|
#  upgrade
 | 
						|
#    complete for `rpm -U' or `rpm --upgrade'
 | 
						|
#  uninstall
 | 
						|
#    complete for `rpm -e' or `rpm --erase'
 | 
						|
#  build_b
 | 
						|
#    complete for `rpm -bx' (the stage `x' is already completed)
 | 
						|
#  build_t
 | 
						|
#    complete for `rpm -tx' (the stage `x' is already completed)
 | 
						|
#  sigcheck
 | 
						|
#    complete for `rpm --sigcheck'
 | 
						|
#  rebuild
 | 
						|
#    complete for `rpm --rebuild'
 | 
						|
#  package
 | 
						|
#    complete a RPM package name
 | 
						|
#  package_file
 | 
						|
#    complete a RPM package file name
 | 
						|
#  package_or_file
 | 
						|
#    the previous two together
 | 
						|
#  tags
 | 
						|
#    complete a tag name
 | 
						|
#  capability
 | 
						|
#    complete a capability
 | 
						|
#  relocate
 | 
						|
#    complete a `old=new' pair of paths
 | 
						|
 | 
						|
local ret=1 tmp expl
 | 
						|
 | 
						|
# Used by `_arguments', made local here.
 | 
						|
 | 
						|
local curcontext="$curcontext" state lstate line
 | 
						|
typeset -A opt_args
 | 
						|
 | 
						|
state=''
 | 
						|
 | 
						|
# Do simple completions or get the first state.
 | 
						|
 | 
						|
_arguments -C -s \
 | 
						|
  '--rcfile:resource file:_files' \
 | 
						|
  '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
  '--ftpport:FTP port number:' \
 | 
						|
  '-q+[query mode]:*:query:->query' \
 | 
						|
  '*-v[verbose mode]' \
 | 
						|
  --{setperms,setugids,querytags,initdb,showrc} \
 | 
						|
  '--pipe:pipe command:_command_names -e' \
 | 
						|
  -{V,y}'[verify mode]:*:verify:->verify' \
 | 
						|
  '--verify[verify mode]:*:verify:->verify' \
 | 
						|
  '-i+[install mode]:*:install:->install' \
 | 
						|
  '--install:*:install:->install' \
 | 
						|
  '-U+[upgrade mode]:*:upgrade:->upgrade' \
 | 
						|
  '--upgrade:*:upgrade:->upgrade' \
 | 
						|
  '-F+[freshen mode]:*:upgrade:->upgrade' \
 | 
						|
  '--freshen:*:upgrade:->upgrade' \
 | 
						|
  '-e+[uninstall mode]:*:uninstall:->uninstall' \
 | 
						|
  '--erase:*:uninstall:->uninstall' \
 | 
						|
  -'b+[build mode (spec file)]:build stage:((p\:execute\ \%prep\ stage l\:do\ a\ list\ check c\:execute\ build\ stage i\:execute\ install\ stage b\:build\ a\ binary\ package a\:build\ binary\ and\ source\ packages)):*:build:->build_b' \
 | 
						|
  -'t+[build mode (tar file)]:build stage:((p\:execute\ \%prep\ stage l\:do\ a\ list\ check c\:execute\ build\ stage i\:execute\ install\ stage b\:build\ a\ binary\ package a\:build\ binary\ and\ source\ packages)):*:build:->build_t' \
 | 
						|
  --{rebuild,rmsource,recompile,resign,addsign}':*:RPM package:->package' \
 | 
						|
  '-K+[signature check mode]:*:sigcheck:->sigcheck' \
 | 
						|
  '--checksig:*:sigcheck:->sigcheck' \
 | 
						|
  '--rebuilddb:*:rebuild:->rebuild' && ret=0
 | 
						|
 | 
						|
# As long as we have a state name...
 | 
						|
 | 
						|
while [[ -n "$state" ]]; do
 | 
						|
 | 
						|
  # First try to call a user-defined function.
 | 
						|
 | 
						|
  _funcall ret _rpm_$state && return ret
 | 
						|
 | 
						|
  # Copy the state and reset `state', to simplify the test above.
 | 
						|
 | 
						|
  lstate="$state"
 | 
						|
  state=''
 | 
						|
  tmp=()
 | 
						|
 | 
						|
  # Dispatch...
 | 
						|
 | 
						|
  case "$lstate" in
 | 
						|
  query)
 | 
						|
    _arguments -s \
 | 
						|
      '*-v[verbose mode]' -q \
 | 
						|
      '--rcfile:resource file:_files' \
 | 
						|
      '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
      '--ftpport:FTP port number:' \
 | 
						|
      '--root:RPM root directory:_files -/' \
 | 
						|
      '--dbpath:RPM database path:_files -/' \
 | 
						|
      '--queryformat:RPM query format:->tags' \
 | 
						|
      '-f[specify file to query owner of]:file:_files' \
 | 
						|
      '-p[specify uninstalled package file to query]:RPM package file:->package_file' \
 | 
						|
      '--triggeredby:RPM package:->package' \
 | 
						|
      '--whatprovides:RPM capability:->capability' \
 | 
						|
      '--whatrequires:RPM capability:->capability' \
 | 
						|
      '*:RPM package:->package_or_file' && ret=0
 | 
						|
    ;;
 | 
						|
  verify)
 | 
						|
    _arguments -s \
 | 
						|
      '*-v[verbose mode]' '(-y)-V' '(-V)-y' \
 | 
						|
      '--rcfile:resource file:_files' \
 | 
						|
      '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
      '--ftpport:FTP port number:' \
 | 
						|
      --no{deps,md5,files} \
 | 
						|
      '--root:RPM root directory:_files -/' \
 | 
						|
      '--dbpath:RPM database path:_files -/' \
 | 
						|
      '*:RPM package:->package' && ret=0
 | 
						|
    ;;
 | 
						|
  upgrade)
 | 
						|
    tmp=( -U --oldpackage )
 | 
						|
    ;&
 | 
						|
  install)
 | 
						|
    (( $#tmp )) || tmp=(-i)
 | 
						|
    _arguments -s "$tmp[@]" \
 | 
						|
      '*-v[verbose mode]' \
 | 
						|
      '--rcfile:resource file:_files' \
 | 
						|
      '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
      '--ftpport:FTP port number:' \
 | 
						|
      '(-h)--hash' '(--hash)-h' \
 | 
						|
      '(--replacepkgs --replacefiles --oldpackage)--force' \
 | 
						|
      --{badreloc,excludedocs,allfiles,ignorearch,ignoreos,includedocs,justdb,nodeps,noorder,noscripts,notriggers,percent,replacefiles,replacepkgs,test} \
 | 
						|
      '--relocate:relocate:->relocate' \
 | 
						|
      '--prefix:package prefix directory:_files -/' \
 | 
						|
      '--root:RPM root directory:_files -/' \
 | 
						|
      '--dbpath:RPM database path:_files -/' \
 | 
						|
      '*:pkg file:->package_file' && ret=0
 | 
						|
    ;;
 | 
						|
  uninstall)
 | 
						|
    _arguments -s \
 | 
						|
      '*-v[verbose mode]' -e \
 | 
						|
      '--rcfile:resource file:_files' \
 | 
						|
      '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
      '--ftpport:FTP port number:' \
 | 
						|
      --{allmatches,justdb,nodeps,noorder,noscripts,notriggers} \
 | 
						|
      '--root:RPM root directory:_files -/' \
 | 
						|
      '--dbpath:RPM database path:_files -/' \
 | 
						|
      '*:RPM package:->package' && ret=0
 | 
						|
    ;;
 | 
						|
  build_b)
 | 
						|
    tmp=( '*:spec file:_files -g \*.spec' )
 | 
						|
    ;&
 | 
						|
  build_t)
 | 
						|
    (( $#tmp )) || tmp=( '*:tar file:_files -g \*.\(\#i\)tar\(.\*\|\)' )
 | 
						|
 | 
						|
    _arguments -s \
 | 
						|
      '*-v[verbose mode]' \
 | 
						|
      '--rcfile:resource file:_files' \
 | 
						|
      '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
      '--ftpport:FTP port number:' \
 | 
						|
      --{short-circuit,clean,rmsource,sign,test} \
 | 
						|
      '--buildroot:build root directory:_files -/' \
 | 
						|
      '--buildarch:architecture for which to build:' \
 | 
						|
      '--buildos:ositecture for which to build:' \
 | 
						|
      '--timecheck:time check (seconds):' "$tmp[1]" && ret=0
 | 
						|
    ;;
 | 
						|
  sigcheck)
 | 
						|
    _arguments -s \
 | 
						|
      '*-v[verbose mode]' -K \
 | 
						|
      '--rcfile:resource file:_files' \
 | 
						|
      '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
      '--ftpport:FTP port number:' \
 | 
						|
      --no{pgp,md5} \
 | 
						|
      '*:RPM package file:->package_or_file' && ret=0
 | 
						|
    ;;
 | 
						|
  rebuild)
 | 
						|
    _arguments -s \
 | 
						|
      '*-v[verbose mode]' \
 | 
						|
      '--rcfile:resource file:_files' \
 | 
						|
      '--ftpproxy:FTP proxy server:_hosts' \
 | 
						|
      '--ftpport:FTP port number:' \
 | 
						|
      '--root:RPM root directory:_files -/' \
 | 
						|
      '--dbpath:RPM database path:_files -/' \
 | 
						|
      '*:RPM source package file:->package_file' && ret=0
 | 
						|
    ;;
 | 
						|
  package_or_file)
 | 
						|
    state=package_file
 | 
						|
    ;&
 | 
						|
  package)
 | 
						|
    _wanted packages expl 'RPM package' \
 | 
						|
        compadd -M 'r:|-=* r:|=*' - $(_call packages rpm -qa) && ret=0
 | 
						|
    ;;
 | 
						|
  package_file)
 | 
						|
    if compset -P ftp://; then
 | 
						|
      _hosts -S/ && ret=0
 | 
						|
    else
 | 
						|
      _alternative \
 | 
						|
          'files:RPM package file:_files -g \*.\(\#i\)rpm' \
 | 
						|
	  'prefixes:ftp URL prefix:compadd ftp://' && ret=0
 | 
						|
    fi
 | 
						|
    ;;
 | 
						|
  tags)
 | 
						|
    if compset -P '*\{'; then
 | 
						|
      _wanted tags expl 'RPM tag' \
 | 
						|
          compadd -M 'm:{a-z}={A-Z}' -S '\}' - \
 | 
						|
                  "${(@)${(@f)$(_call tags rpm --querytags)}#RPMTAG_}" && ret=0
 | 
						|
    else
 | 
						|
      _message 'RPM format'
 | 
						|
    fi
 | 
						|
    ;;
 | 
						|
  capability)
 | 
						|
    _message 'RPM capability'
 | 
						|
    ;;
 | 
						|
  relocate)
 | 
						|
    if compset -P '*='; then
 | 
						|
      _description directories expl 'new path'
 | 
						|
    else
 | 
						|
      _description directories expl 'old path'
 | 
						|
    fi
 | 
						|
 | 
						|
    _files "$expl[@]" -/ && ret=0
 | 
						|
    ;;
 | 
						|
  esac
 | 
						|
done
 | 
						|
 | 
						|
return ret
 |