From b230a690fa8a33551d229db083bca53a7075e1c8 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 20 Apr 2010 08:59:32 +0000 Subject: "Akinori MUSHA: 27892: update service & init completion for FreeBSD --- ChangeLog | 11 +++- Completion/Redhat/Command/.distfiles | 1 - Completion/Redhat/Command/_service | 22 -------- Completion/Unix/Command/.distfiles | 1 + Completion/Unix/Command/_init_d | 101 ++++++++++++++++++++++++++--------- Completion/Unix/Command/_service | 31 +++++++++++ Completion/Unix/Type/_services | 8 ++- 7 files changed, 125 insertions(+), 50 deletions(-) delete mode 100644 Completion/Redhat/Command/_service create mode 100644 Completion/Unix/Command/_service diff --git a/ChangeLog b/ChangeLog index 91532696d..b71da9a51 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2010-04-20 Peter Stephenson + + * "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 * 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 $ ***************************************************** diff --git a/Completion/Redhat/Command/.distfiles b/Completion/Redhat/Command/.distfiles index 9f0a3ef6a..8f8a5da63 100644 --- a/Completion/Redhat/Command/.distfiles +++ b/Completion/Redhat/Command/.distfiles @@ -1,6 +1,5 @@ DISTFILES_SRC=' .distfiles _rpm -_service _yum ' diff --git a/Completion/Redhat/Command/_service b/Completion/Redhat/Command/_service deleted file mode 100644 index 591bd0184..000000000 --- a/Completion/Redhat/Command/_service +++ /dev/null @@ -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' - diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles index a18293893..73525ff12 100644 --- a/Completion/Unix/Command/.distfiles +++ b/Completion/Unix/Command/.distfiles @@ -180,6 +180,7 @@ _samba _sccs _screen _sed +_service _setfacl _sh _showmount diff --git a/Completion/Unix/Command/_init_d b/Completion/Unix/Command/_init_d index 72d11023f..dd9933a46 100644 --- a/Completion/Unix/Command/_init_d +++ b/Completion/Unix/Command/_init_d @@ -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/$script ]]; then - script=$dir/$script - break - fi - done -fi + 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 magic cmds cmd_prefix + + [[ -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) + ) + + for cmd_prefix in {,one,fast,force,quiet}; do + echo ${cmds/#/$cmd_prefix} + done + + 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 + } -# If the file starts with `#!' we hope that this is a shell script -# and get lines looking like foo|bar) with the words in $what. + (( $+functions[_init_d_get_cmds] )) || + _init_d_get_cmds() { + local what magic cmds -what='(st(art|op|atus)|(force-|)re(start|load)|debug_(up|down)|dump(|_stats)|add|delete|clean|list)' + # If the file starts with `#!' we hope that this is a shell script + # and get lines looking like foo|bar) with the words in $what. -read -u0 -k2 magic < $script && [[ $magic = '#!' ]] && + 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 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 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) diff --git a/Completion/Unix/Command/_service b/Completion/Unix/Command/_service new file mode 100644 index 000000000..e99ad556f --- /dev/null +++ b/Completion/Unix/Command/_service @@ -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 diff --git a/Completion/Unix/Type/_services b/Completion/Unix/Type/_services index 40136e3c1..496054795 100644 --- a/Completion/Unix/Type/_services +++ b/Completion/Unix/Type/_services @@ -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:]]#}/%:*} ) -- cgit 1.4.1