zsh-users
 help / color / mirror / code / Atom feed
From: Scott Murray <semurray@ntlworld.com>
To: zsh-users@sunsite.dk
Subject: Completion for yum
Date: Sat, 05 Nov 2005 23:30:46 +0000	[thread overview]
Message-ID: <436D40A6.6090605@ntlworld.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 359 bytes --]

Hi Zsh-Users,

I am a Fedora Core user and have been annoyed by the lack completion
for yum (the apt equivalent for FC and some other distros).

So I've developed a compdef fopr yum which I attach. 
It is comprehensive and seems to work (for me).

What is the process for getting this tested and included among the
compdefs provided with Zsh?

regards Scott


[-- Attachment #2: _yum --]
[-- Type: text/plain, Size: 7135 bytes --]

#compdef yum

# Main dispatcher
_yum() 
{
	local curcontext="$curcontext" state lstate line

	local comp_num='compadd "$expl[@]" -S0 -r "0-9" - ""'
												  
	_arguments -s \
	   {-h,--help}'[show the help message]' \
	   {-t,--tolerant}'[be tolerant of errors]' \
	   '-C[Run entirely from cache]' \
	   '-c[Config file location]:Yum conf file:_files' \
	   '-R[Maximum command wait time (in minutes)]:Max wait time' \
	   '-d[Debug level (0-10)]:Debug level' \
	   '-e[Error level (0-10)]:Error level' \
	   '-y[Answer yes for all questions]' \
	   '--installroot=[Set install root]:Install Root:_files -/' \
	   '--enablerepo=[Enable or or more repositories]:Repos to enable' \
	   '--disablerepo=[Disable one or more repositories]:Disable Repos' \
	   '--exclude=[Exclude package(s) by name or glob]:Exclude Repos' \
	   '--version[Show yum version]' \
	   '--obseletes[Enable obsoletes processing during updates]' \
	   '--noplugins[Disable yum plugins]' \
	   '*::yum command:_yum_command'
}

(( $+functions[_yum_command] )) || _yum_command() 
{
  	local -a _yum_cmds
  	_yum_cmds=(
		"install:Install the latest version of a package or group of packages"
		"erase:Remove an installed package (with its dependencies)"
		"remove:Remove an installed package (with its dependencies)"
		"clean:Clean local yum cache"
		"deplist:Gives a list of all dependencies for a package"
		"check-update:Check if any updates are available"
		"info:Get description of available packages"
		"list:Is used to list various information about packages"
		"groupinfo:Get info on package groups"
		"groupinstall:Install a package group or groups"
		"groupremove:Remove a package group or groups"
		"grouplist:List package groups"
		"groupupdate:Update a package group or groups"
		"localinstall:Install packages with local rpm files"
		"localupdate:Update packages with local rpm files"
		"makecache:Makes a local yum cache"
		"provides:Find out which package provides some feature or file"
		"whatprovides:Find out which package provides some feature or file"
		"resolvedep:List packages providing the specified dependencies"
		"search:Find any packages matching pattern"
		"shell:Enter the 'yum shell'"
		"update:Update one or more packages"
		"upgrade:Upgrade one or more packages"
  	)

  	if (( CURRENT == 1 )); then
		_describe -t commands 'yum command' _yum_cmds || compadd "$@"
  	else
    	local curcontext="$curcontext"

	    cmd="${${_yum_cmds[(r)$words[1]:*]%%:*}}"
		# Deal with any aliases
		case $cmd in
			remove) cmd="erase";;
			whatprovides) cmd="provides";;
			upgrade) cmd="update";;
		esac
		
    	if (( $#cmd )); then
    		curcontext="${curcontext%:*:*}:yum-${cmd}:"
	
	      	local update_policy
		  	zstyle -s ":completion:${curcontext}:" cache-policy update_policy
		  	if [[ -z "$update_policy" ]]; then
				zstyle ":completion:${curcontext}:" cache-policy _yum_caching_policy
	  		fi

      		_call_function ret _yum_$cmd || _message 'no more arguments'
    	else
      		_message "unknown yum command: $words[1]"
    	fi
    	return ret
  	fi
}

# Fills the installed pkg cache
_yum_all_pkgs()
{
	if ( [[ ${+_all_pkgs} -eq 0 ]] || _cache_invalid ALL ) &&
		! _retrieve_cache ALL;
	then
		local prog="yum -C list all | sed 's/\s.*//' | grep '\.'"
		_all_pkgs=( $(_call_program allpackages $prog 2>/dev/null) )
		_store_cache ALL _all_pkg
	fi
}

# Fills the installed pkg cache
_yum_installed_pkgs()
{
	if ( [[ ${+_installed_pkgs} -eq 0 ]] || _cache_invalid INSTALLED ) &&
		! _retrieve_cache INSTALLED;
	then
		local prog="yum -C list installed | sed 's/\s.*//' | grep '\.'"
		_installed_pkgs=( $(_call_program ipackages $prog 2>/dev/null) )
		_store_cache INSTALLED _installed_pkgs
	fi
}

# Fills the available pkg cache
_yum_available_pkgs()
{
	if ( [[ ${+_available_pkgs} -eq 0 ]] || _cache_invalid AVAILABLE ) &&
		! _retrieve_cache AVAILABLE;
	then
		local prog="yum -C list available | sed 's/\s.*//' | grep '\.'"
		_available_pkgs=( $(_call_program apackages $prog 2>/dev/null) )
		_store_cache AVAILABLE _available_pkgs
	fi
}

# Fills the upgrade pkg cache
_yum_upgrade_pkgs()
{
	if ( [[ ${+_upgrade_pkgs} -eq 0 ]] || _cache_invalid UPGRADE ) &&
		! _retrieve_cache UPGRADE;
	then
		local prog="yum -C list upgrade | sed 's/\s.*//' | grep '\.'"
		_upgrade_pkgs=( $(_call_program upackages $prog 2>/dev/null) )
		_store_cache UPGRADE _upgrade_pkgs
	fi
}

# Completion function for erase|remove
(( $+functions[_yum_erase] )) || _yum_erase()
{
	_yum_installed_pkgs
	compadd "$@" -a -- _installed_pkgs
}

# Completion function for install
(( $+functions[_yum_install] )) || _yum_install()
{
	_yum_available_pkgs
	compadd "$@" -a -- _available_pkgs
}

# Completion function for localinstall
(( $+functions[_yum_localinstall] )) || _yum_localinstall()
{
	_files -g '(#i)*.rpm(-.)'
}

# Completion function for localupdate
(( $+functions[_yum_localupdate] )) || _yum_localupdate()
{
	_files -g '(#i)*.rpm(-.)'
}

# Completion function for update/upgrade
(( $+functions[_yum_update] )) || _yum_update()
{
	_yum_upgrade_pkgs
	compadd "$@" -a -- _upgrade_pkgs
}

# Completion function for deplist
(( $+functions[_yum_deplist] )) || _yum_deplist()
{
	_yum_available_pkgs
	compadd "$@" -a -- _available_pkgs
}

_yum_all()
{
	_yum_all_pkgs
	compadd "$@" -a -- _all_pkgs
}
_yum_list_or_info()
{
	local -a listlist
	listlist=(
		"all:all packages in repositories"
		"available:packages available in repositories"
		"updates:packages with updates available"
		"installed:installed packages"
		"extras:packages installed that are not available in any yum repository"
		"obsoletes:packages installed that are obsoleted"
		"recent:packages recently added to repositories"
	)
	
  	if (( CURRENT == 2 )); then
		_describe -t yum-list-subcmds "Yum info/list sub-commands" listlist || _yum_all
	else
	    local subcmd
		subcmd="${${listlist[(r)$words[2]:*]%%:*}}"
		# Deal with any aliases
		case $subcmd in
			installed) _yum_erase;;
			available) _yum_install;;
			updates) _yum_update;;
		esac
	fi
}

# Completion function for list
(( $+functions[_yum_list] )) || _yum_list()
{
	_yum_list_or_info
}

# Completion function for info
(( $+functions[_yum_info] )) || _yum_info()
{
	_yum_list_or_info
}

# Completion function for provides|whatprovides
(( $+functions[_yum_provides] )) || _yum_provides()
{
	_files	
}

# Completion function for resolvedep
(( $+functions[_yum_resolvedep] )) || _yum_resolvedep()
{
	_files	
}

# Completion function for clean
(( $+functions[_yum_clean] )) || _yum_clean()
{
	local -a cleanlist
	cleanlist=(
		"all:all cache"
		"cache:all cache"
		"dbcache:DB cache"
		"headers:cache headers"
		"packages:cache packages"
		"metadata:cache meta-data"
	)
	
  	if (( CURRENT == 2 )); then
		_describe -t yum-clean-subcmds "Yum clean sub-commands" cleanlist 
	fi
}

_yum_caching_policy() 
{
	local _yumrepomds

  	# rebuild if cache is more than a week old
  	oldp=( "$1"(mw+1) )
  	(( $#oldp )) && return 0

  	_yumrepomds=( /var/cache/yum/**/repomd.xml )

  	if (( $#__yumrepomds )); then
    	for repo in $_yumrepomds; do
      		[[ "$repo" -nt "$1" ]] && return 0
    	done
  	fi

  	return 1
}

_yum "$@"

             reply	other threads:[~2005-11-05 23:31 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-11-05 23:30 Scott Murray [this message]
2005-11-06 16:46 ` Peter Stephenson
2011-04-10 14:57 cat.in.136
2011-04-11  8:47 ` Peter Stephenson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=436D40A6.6090605@ntlworld.com \
    --to=semurray@ntlworld.com \
    --cc=zsh-users@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).