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:
parent
df9cf1bf31
commit
b230a690fa
7 changed files with 124 additions and 49 deletions
11
ChangeLog
11
ChangeLog
|
|
@ -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 $
|
||||
*****************************************************
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
DISTFILES_SRC='
|
||||
.distfiles
|
||||
_rpm
|
||||
_service
|
||||
_yum
|
||||
'
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
||||
|
|
@ -180,6 +180,7 @@ _samba
|
|||
_sccs
|
||||
_screen
|
||||
_sed
|
||||
_service
|
||||
_setfacl
|
||||
_sh
|
||||
_showmount
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
31
Completion/Unix/Command/_service
Normal file
31
Completion/Unix/Command/_service
Normal 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
|
||||
|
|
@ -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:]]#}/%:*} )
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue