1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-02 06:40:55 +01:00

"Akinori MUSHA: 27892: update service & init completion for FreeBSD

This commit is contained in:
Peter Stephenson 2010-04-20 08:59:32 +00:00
parent df9cf1bf31
commit b230a690fa
7 changed files with 124 additions and 49 deletions

View file

@ -1,3 +1,12 @@
2010-04-20 Peter Stephenson <pws@csr.com>
* "Akinori MUSHA: 27892: Completion/Redhat/Command/.distfiles,
Completion/Redhat/Command/_service
Completion/Unix/Command/.distfiles,
Completion/Unix/Command/_init_d,
Completion/Unix/Command/_service (moved from Redhat),
Completion/Unix/Type/_services: updates for FreeBSD.
2010-04-15 Peter Stephenson <pws@csr.com>
* unposted: NEWS: update to include path-completion.
@ -13031,5 +13040,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.4958 $
* $Revision: 1.4959 $
*****************************************************

View file

@ -1,6 +1,5 @@
DISTFILES_SRC='
.distfiles
_rpm
_service
_yum
'

View file

@ -1,22 +0,0 @@
#compdef service
# *:: for last argument looks more like a hack but it is
# the simplest way known to me to reset $words and keep
# _sub_command happy
# we are interested in init service only
local ctx="${curcontext}argument-1:"
zstyle -T ":completion:${ctx}" tag-order && \
zstyle ":completion:${ctx}" tag-order init
_arguments -s \
'(-d --debug)'{-d,--debug}'[turn debugging on]' \
'(- :)'{-h,--help}'[print usage]' \
'(- :)'{-v,--version}'[print version]' \
'(-)'{-f,--full-restart}'[restart service]' \
'(- :)'{-R,--full-restart-all}'[restart all services]' \
'(- :)'{-s,--status-all}'[print status of all services]' \
':service name:_services' \
'*::service argument: _init_d'

View file

@ -180,6 +180,7 @@ _samba
_sccs
_screen
_sed
_service
_setfacl
_sh
_showmount

View file

@ -1,39 +1,90 @@
#compdef -p */(init|rc[0-9S]#).d/*
local magic cmds what script
local cmds script
_compskip=all
# This should probably be system specific...
if [[ $OSTYPE = freebsd* ]]; then
(( $+functions[_init_d_fullpath] )) ||
_init_d_fullpath() {
local -a scriptpath
local name=$1 dir
# Known locations of init scripts
# C.f. Unix/Type/_services
scriptpath=(/etc/rc.d $(/bin/sh -c '. /etc/rc.subr; load_rc_config XXX; echo $local_startup' 2>/dev/null))
script=$words[1]
if [[ $script != */* ]]; then
local -a scriptpath
local dir
# Known locations of init scripts
# C.f. Unix/Type/_services
scriptpath=(/etc/init.d /etc/rc.d /etc/rc.d/init.d)
for dir in $scriptpath; do
if [[ -f $dir/$name ]]; then
echo $dir/$name
return 0
fi
done
return 1
}
for dir in $scriptpath; do
if [[ -f $dir/$script ]]; then
script=$dir/$script
break
fi
done
fi
(( $+functions[_init_d_get_cmds] )) ||
_init_d_get_cmds() {
local magic cmds cmd_prefix
# If the file starts with `#!' we hope that this is a shell script
# and get lines looking like <space>foo|bar) with the words in $what.
[[ -x $script ]] || return 1
[[ $(read -u0 -k2 magic < $script && echo $magic) = '#!' ]] || return 0
[[ -f /etc/rc.subr ]] && [[ -x /sbin/rcorder ]] || return 0
grep -q '^ *\. */etc/rc\.subr *$' $script || return 0
cmds=(
start stop restart rcvar status poll
$(/bin/sh -c "set -- rcvar; . $script >/dev/null; echo \$extra_commands" 2>/dev/null)
)
what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)'
for cmd_prefix in {,one,fast,force,quiet}; do
echo ${cmds/#/$cmd_prefix}
done
read -u0 -k2 magic < $script && [[ $magic = '#!' ]] &&
return 0
}
else
(( $+functions[_init_d_fullpath] )) ||
_init_d_fullpath() {
local -a scriptpath
local name=$1 dir
# Known locations of init scripts
# C.f. Unix/Type/_services
scriptpath=(/etc/init.d /etc/rc.d /etc/rc.d/init.d)
for dir in $scriptpath; do
if [[ -f $dir/$name ]]; then
echo $dir/$name
return 0
fi
done
return 1
}
(( $+functions[_init_d_get_cmds] )) ||
_init_d_get_cmds() {
local what magic cmds
# If the file starts with `#!' we hope that this is a shell script
# and get lines looking like <space>foo|bar) with the words in $what.
what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)'
read -u0 -k2 magic < $script && [[ $magic = '#!' ]] &&
cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)${~what}([[:blank:]]#\|[[:blank:]]#${~what})#(\'|)\)}}//[^-a-z_]} )
# This would be the pattern to use every line of the form <space>foo).
# Some people say this might match too many lines...
#
# cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)[a-z_|]##\'|)\)}}//[^a-z_]} )
# This would be the pattern to use every line of the form <space>foo).
# Some people say this might match too many lines...
#
# cmds=( ${${(j:|:s:|:)${(M)${(f)"$(< $script)"}:#[[:blank:]]#(\'|)[a-z_|]##\'|)\)}}//[^a-z_]} )
echo $cmds
return 0
}
fi
script=$words[1]
[[ $script = */* ]] || script="$(_init_d_fullpath "$script")"
cmds=( $(_init_d_get_cmds) ) || return
(( $#cmds )) || zstyle -a ":completion:${curcontext}:commands" commands cmds ||
cmds=(start stop)

View file

@ -0,0 +1,31 @@
#compdef service
# *:: for last argument looks more like a hack but it is
# the simplest way known to me to reset $words and keep
# _sub_command happy
# we are interested in init service only
local ctx="${curcontext}argument-1:"
zstyle -T ":completion:${ctx}" tag-order && \
zstyle ":completion:${ctx}" tag-order init
if [[ $OSTYPE = freebsd* ]]; then
_arguments -s \
'(-)-e[show services that are enabled]' \
'(-)-l[list all scripts in /etc/rc.d and the local startup directory]' \
'(-)-r[show the results of boot time rcorder]' \
'(-)-v[verbose]' \
':service name:_services' \
'*::service argument:_init_d'
else
_arguments -s \
'(-d --debug)'{-d,--debug}'[turn debugging on]' \
'(- :)'{-h,--help}'[print usage]' \
'(- :)'{-v,--version}'[print version]' \
'(-)'{-f,--full-restart}'[restart service]' \
'(- :)'{-R,--full-restart-all}'[restart all services]' \
'(- :)'{-s,--status-all}'[print status of all services]' \
':service name:_services' \
'*::service argument: _init_d'
fi

View file

@ -3,7 +3,13 @@
local -a inits xinetds alls
local expl ret=1
if chkconfig --list > /dev/null 2>&1; then
if [[ $OSTYPE = freebsd* ]]; then
if [[ -x /usr/sbin/service ]]; then
alls=( $(service -l) ) && ret=0
_wanted services expl service compadd "$@" - $alls[@] && ret=0
fi
elif chkconfig --list > /dev/null 2>&1; then
alls=( ${(f)"$(LANGUAGE=C LANG=C LC_ALL=C chkconfig --list)"} )
inits=( ${${${alls[1,(r)xinetd based*]}[1,-2]}/%[[:space:]]*/} )
xinetds=( ${${${${alls[(r)xinetd based*,-1]}[2,-1]}/#[[:space:]]#}/%:*} )