summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2011-12-10 18:23:00 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2011-12-10 18:23:00 +0000
commit2b4e0140d6609a5c952603ccc0faaed94fded180 (patch)
tree10f4e775b75592115edda2e065a520bca734628c
parent48c46fe9b1088198e61733955977b28fde565ca7 (diff)
downloadzsh-2b4e0140d6609a5c952603ccc0faaed94fded180.tar.gz
zsh-2b4e0140d6609a5c952603ccc0faaed94fded180.tar.xz
zsh-2b4e0140d6609a5c952603ccc0faaed94fded180.zip
GI: 29977: caching and function definition fixes for _modutils
-rw-r--r--ChangeLog7
-rw-r--r--Completion/Linux/Command/_modutils268
2 files changed, 141 insertions, 134 deletions
diff --git a/ChangeLog b/ChangeLog
index 9e979a7c5..446a1eda0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2295,6 +2295,11 @@
 
 	* unposted: Config/version.mk: update to 4.3.10-dev-2.
 
+2011-12-10  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* GI: 29977: Completion/Linux/Command/_modutils: caching and
+	function definition fixes.
+
 2010-07-24  Wayne Davison  <wayned@users.sourceforge.net>
 
 	* 28000: Completion/Unix/Command/_git: make the branch arg for
@@ -15706,5 +15711,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5530 $
+* $Revision: 1.5531 $
 *****************************************************
diff --git a/Completion/Linux/Command/_modutils b/Completion/Linux/Command/_modutils
index e2671f2a7..48aeee973 100644
--- a/Completion/Linux/Command/_modutils
+++ b/Completion/Linux/Command/_modutils
@@ -2,143 +2,145 @@
 
 _modules_caching_policy()
 {
-  # Rebuild every week, or if $modules_dir is newer than the cache
-  local -a oldp
+    # Rebuild if $modules_dir is newer than the cache, or every week.
+    local -a oldp
 
-  oldp=( "$1"(Nmw+1) )
-  (( $#oldp )) || [[ $modules_dir -nt $1 ]]
+    oldp=( "$1"(Nmw+0) )
+    (( $#oldp )) || [[ $modules_dir -nt $1 ]]
 }
 
-local curcontext="$curcontext" expl state line modules ign args ret=1
-local -r modules_dir=/lib/modules
-
-local update_policy
-zstyle -s ":completion:*:*:$service:*" cache-policy update_policy
-if [[ -z "$update_policy" ]]; then
-  zstyle ":completion:*:*:$service:*" cache-policy _modules_caching_policy
-fi
-
-args=(
-  '(-)'{-V,--version}'[print version]'
-  '(-)'{-h,--help}'[print help text]'
-)
-
-case "$service" in
-  lsmod) _arguments -s "$args[@]" && return ;;
-  
-  modinfo)
-    _arguments -s -C "$args[@]" \
-      '(-)'{-a,--author}"[display the module's author]" \
-      '(-)'{-d,--description}"[display the module's description]" \
-      '(-)'{-l,--license}"[display the module's license]" \
-      '(-)'{-n,--filename}"[display the module's filename]" \
-      '(-)'{-p,--parameters}'[display the typed parameters that a module may support]' \
-      '(-)'{-F,--field}"[display only selected module's information]:module_field:(
-        alias author depends description filename license parm)" \
-      '(-)-k[use modules from a different kernel version]:kernel_version:(
-        $(echo $modules_dir/*(/\:t)))' \
-      '1:module file:->all_modules' && ret=0
-  ;;
-
-  modprobe)
-    ign='-h --help -V --version -c --showconfig'
-    _arguments -s -C "$args[@]" \
-      "(-a --all $ign)"{-a,--all}'[load all matching modules]' \
-      '(-)'{-c,--showconfig}'[show current configuration]' \
-      "(-d --debug $ign)"{-d,--debug}'[print debug info]' \
-      "(-k --autoclean $ign)"{-k,--autoclean}'[set autoclean]' \
-      "(-n --show $ign)"{-n,--show}"[don't actually perform action]" \
-      "(-q --quiet $ign)"{-q,--quiet}"[don't complain about insmod failures]" \
-      "(-s --syslog $ign)"{-s,--syslog}'[report via syslog instead of stderr]' \
-      "(* -t --type $ign)"{-t,--type}'[module type]:module type' \
-      "(-v --verbose $ign)"{-v,--verbose}'[print all commands as executed]' \
-      '(-C --config)'{-C,--config}'[specify config file]:config file:_files' \
-      "(-r --remove -l --list -t --type -a --all $ign)"{-r,--remove}'[remove module (stacks)]' \
-      "(-l --list -t --type -a --all $ign)"{'-i[ignore install/remove commands in config file]','--ignore-install[ignore install commands in config file]','--ignore-remove[ignore remove commands in config file]'} \
-      "(* -l --list -r --remove $ign)"{-l,--list}'[list matching modules]' \
-      "(-c $ign)1:modules:->loadable_modules" \
-      "(-c -l --list -t --type $ign)*:params:->params" && ret=0
-      
-      [[ -n $state ]] && (( $+opt_args[-r] )) && state=loaded_modules        
-  ;;
-
-  rmmod)
-    _arguments -s -C "$args[@]" \
-      '(-a --all)'{-a,--all}'[remove all unused autocleanable modules]' \
-      '(-e --persist)'{-e,--persist}'[save persistent data]' \
-      '(-r --stacks)'{-r,--stacks}'[remove a module stack]' \
-      '(-s --syslog)'{-s,--syslog}'[output to syslog]' \
-      '(-v --verbose)'{-v,--verbose}'[be verbose]' \
-      '*:loaded module:->loaded_modules' && ret=0
-  ;;
-
-  insmod)
-    _arguments \
-      '1:module file:_files' \
-      '*:module parameters:' && ret=0
-  ;;
-esac 
-
-case "$state" in
-  loaded_modules|loadable_modules)
-    if [[ -r /proc/modules ]]; then
-     loaded_modules=(${${(f)"$(</proc/modules)"}%% *})
-    elif [[ -x /sbin/lsmod ]]; then
-     loaded_modules=(${${(f)"$(/sbin/lsmod)"}[2,-1]%% *})
-    else
-     return 1
-    fi
+_modutils() {
+    local curcontext="$curcontext" expl state line modules ign args ret=1
+    local -r modules_dir=/lib/modules
 
-    if [[ $state = loaded_modules ]]; then
-        _wanted modules expl 'loaded module' compadd -a loaded_modules && return
-        return ret
-    fi
-  ;&
-
-  all_modules)
-    local kver
-    integer kver_idx
-    if (( kver_idx=${words[(I)-k]} )); then
-      kver=${words[kver_idx+1]}
-    else
-      kver=$(uname -r)
-    fi
-    if [[ -z $modules ]] && ! _cache_invalid modules-$kver && \
-      ! _retrieve_cache modules-$kver;
-    then 
-      # 2011-01-02 gi1242: Do we need .o files? Or is .ko enough?
-      modules=( $modules_dir/$kver/(*~(source|build))/**/*.(o|ko|ko.gz)(.:t:r:r) )
-      _store_cache modules-$kver modules
+    local update_policy
+    zstyle -s ":completion:*:*:$service:*" cache-policy update_policy
+    if [[ -z "$update_policy" ]]; then
+	zstyle ":completion:*:*:$service:*" cache-policy _modules_caching_policy
     fi
 
-    if [[ $state = loadable_modules ]]; then
-        modules=( ${modules:#(${(j:|:)~${=loaded_modules//_/-}})} )
-    fi
-
-    _tags files modules
-    while _tags; do
-      _requested files expl "module file"  _files -g '*.ko' && ret=0
-      _requested modules expl module compadd -a modules && ret=0
-    done
-  ;;
-
-  params)
-    if compset -P '*='; then
-      _message -e value 'parameter value'
-    else
-      local params
-      params=( ${${(M)${(f)"$(_call_program module_parameter modinfo "$words[2]" 2>/dev/null)"}:#parm:*}##parm:[[:space:]]##} )
-      if [[ $#params -eq 0 ]]; then
-        _message -e parameter "This modules doesn't have parameters"
-      else
-        typeset -A val_args
-
-        _values -S = -C -w 'module parameter' \
-          ${${${(M)params:#*(:bool|\(bool\))}/:/[}/(bool| \(bool\))/]} \
-          ${^${params:#*(:bool|\(bool\))}/:/[}"]:auto added argument: " && ret=0
-      fi
-    fi
-  ;;
-esac
+    args=(
+	'(-)'{-V,--version}'[print version]'
+	'(-)'{-h,--help}'[print help text]'
+    )
+
+    case "$service" in
+	lsmod) _arguments -s "$args[@]" && return ;;
+
+	modinfo)
+	    _arguments -s -C "$args[@]" \
+		'(-)'{-a,--author}"[display the module's author]" \
+		'(-)'{-d,--description}"[display the module's description]" \
+		'(-)'{-l,--license}"[display the module's license]" \
+		'(-)'{-n,--filename}"[display the module's filename]" \
+		'(-)'{-p,--parameters}'[display the typed parameters that a module may support]' \
+		'(-)'{-F,--field}"[display only selected module's information]:module_field:(alias author depends description filename license parm)" \
+		'(-)-k[use modules from a different kernel version]:kernel_version:($(echo $modules_dir/*(/\:t)))' \
+		'1:module file:->all_modules' && ret=0
+	    ;;
+
+	modprobe)
+	    ign='-h --help -V --version -c --showconfig'
+	    _arguments -s -C "$args[@]" \
+		"(-a --all $ign)"{-a,--all}'[load all matching modules]' \
+		'(-)'{-c,--showconfig}'[show current configuration]' \
+		"(-d --debug $ign)"{-d,--debug}'[print debug info]' \
+		"(-k --autoclean $ign)"{-k,--autoclean}'[set autoclean]' \
+		"(-n --show $ign)"{-n,--show}"[don't actually perform action]" \
+		"(-q --quiet $ign)"{-q,--quiet}"[don't complain about insmod failures]" \
+		"(-s --syslog $ign)"{-s,--syslog}'[report via syslog instead of stderr]' \
+		"(* -t --type $ign)"{-t,--type}'[module type]:module type' \
+		"(-v --verbose $ign)"{-v,--verbose}'[print all commands as executed]' \
+		'(-C --config)'{-C,--config}'[specify config file]:config file:_files' \
+		"(-r --remove -l --list -t --type -a --all $ign)"{-r,--remove}'[remove module (stacks)]' \
+		"(-l --list -t --type -a --all $ign)"{'-i[ignore install/remove commands in config file]','--ignore-install[ignore install commands in config file]','--ignore-remove[ignore remove commands in config file]'} \
+		"(* -l --list -r --remove $ign)"{-l,--list}'[list matching modules]' \
+		"(-c $ign)1:modules:->loadable_modules" \
+		"(-c -l --list -t --type $ign)*:params:->params" && ret=0
+
+	    [[ -n $state ]] && (( $+opt_args[-r] )) && state=loaded_modules
+	    ;;
+
+	rmmod)
+	    _arguments -s -C "$args[@]" \
+		'(-a --all)'{-a,--all}'[remove all unused autocleanable modules]' \
+		'(-e --persist)'{-e,--persist}'[save persistent data]' \
+		'(-r --stacks)'{-r,--stacks}'[remove a module stack]' \
+		'(-s --syslog)'{-s,--syslog}'[output to syslog]' \
+		'(-v --verbose)'{-v,--verbose}'[be verbose]' \
+		'*:loaded module:->loaded_modules' && ret=0
+	    ;;
+
+	insmod)
+	    _arguments \
+		'1:module file:_files' \
+		'*:module parameters:' && ret=0
+	    ;;
+    esac 
+
+    case "$state" in
+	loaded_modules|loadable_modules)
+	    if [[ -r /proc/modules ]]; then
+		loaded_modules=(${${(f)"$(</proc/modules)"}%% *})
+	    elif [[ -x /sbin/lsmod ]]; then
+		loaded_modules=(${${(f)"$(/sbin/lsmod)"}[2,-1]%% *})
+	    else
+		return 1
+	    fi
+
+	    if [[ $state = loaded_modules ]]; then
+		_wanted modules expl 'loaded module' compadd -a loaded_modules \
+		    && return
+		return ret
+	    fi
+	    ;&
+
+	all_modules)
+	    local kver
+	    integer kver_idx
+	    if (( kver_idx=${words[(I)-k]} )); then
+		kver=${words[kver_idx+1]}
+	    else
+		kver=$(uname -r)
+	    fi
+
+	    if _cache_invalid modules-$kver || ! _retrieve_cache modules-$kver;
+	    then 
+		# 2011-01-02 gi1242: Do we need .o files? Or is .ko enough?
+		modules=( $modules_dir/$kver/(*~(source|build))/**/*.(o|ko|ko.gz)(.:t:r:r) )
+		_store_cache modules-$kver modules
+	    fi
+
+	    if [[ $state = loadable_modules ]]; then
+		modules=( ${modules:#(${(j:|:)~${=loaded_modules//_/-}})} )
+	    fi
+
+	    _tags files modules
+	    while _tags; do
+		_requested files expl "module file"  _files -g '*.ko' && ret=0
+		_requested modules expl module compadd -a modules && ret=0
+	    done
+	    ;;
+
+	params)
+	    if compset -P '*='; then
+		_message -e value 'parameter value'
+	    else
+		local params
+		params=( ${${(M)${(f)"$(_call_program module_parameter modinfo "$words[2]" 2>/dev/null)"}:#parm:*}##parm:[[:space:]]##} )
+		if [[ $#params -eq 0 ]]; then
+		    _message -e parameter "This modules doesn't have parameters"
+		else
+		    typeset -A val_args
+
+		    _values -S = -C -w 'module parameter' \
+			${${${(M)params:#*(:bool|\(bool\))}/:/[}/(bool| \(bool\))/]} ${^${params:#*(:bool|\(bool\))}/:/[}"]:auto added argument: " && ret=0
+		fi
+	    fi
+	    ;;
+    esac
+
+    return ret
+}
 
-return ret
+_modutils "$@"