Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH 24/25] Consider `--tree` when searching installed rocks.



From: Doron Behar <doron.behar@xxxxxxxxx>

---
 Completion/Unix/Command/_luarocks | 126 +++++++++++++++++++++---------
 1 file changed, 91 insertions(+), 35 deletions(-)

diff --git a/Completion/Unix/Command/_luarocks b/Completion/Unix/Command/_luarocks
index 8de95c188..17fa8248e 100644
--- a/Completion/Unix/Command/_luarocks
+++ b/Completion/Unix/Command/_luarocks
@@ -59,6 +59,7 @@ __luarocks_rock_version(){
           # TODO: actually complete versions of installed rocks using the cache
           # How does luarocks handles multiple versions of the same package?
           # If anybody knows, please write something beautiful here
+          # TODO: get somehow from $@ the option given (if used) to --tree
           _message -e "version for installed rock ${words[$i]}"
           return
           ;;
@@ -107,56 +108,95 @@ ___luarocks_installed_rocks_cache_policy(){
 # {{{ helper: installed rocks
 (( $+functions[__luarocks_installed_rocks] )) ||
 __luarocks_installed_rocks(){
-  local update_policy
-  zstyle -s ":completion:${curcontext}:" cache-policy update_policy
-  if [[ -z "$update_policy" ]]; then
-    zstyle ":completion:${curcontext}:" cache-policy ___luarocks_installed_rocks_cache_policy
-  fi
-  if _cache_invalid luarocks_installed_list; then
-    rocks_list=($(luarocks list --porcelain))
-    _store_cache luarocks_installed_list rocks_list
+  # This function optionally recieves one argument of the tree in which
+  # installed rocks are searched for. If this argument is used, the installed
+  # rocks which will be completed by this function will not use the cache which
+  # is valid only for installed rocks on default trees like /usr/lib/luarocks
+  # and ~/.luarocks
+  local tree="$1"
+  if [[ -z ${tree} ]]; then
+    local update_policy
+    zstyle -s ":completion:${curcontext}:" cache-policy update_policy
+    if [[ -z "$update_policy" ]]; then
+      zstyle ":completion:${curcontext}:" cache-policy ___luarocks_installed_rocks_cache_policy
+    fi
+    if _cache_invalid luarocks_installed_list; then
+      rocks_list=($(luarocks list --porcelain))
+      _store_cache luarocks_installed_list rocks_list
+    else
+      _retrieve_cache luarocks_installed_list
+    fi
+    if [[ -z ${rocks_list} ]]; then
+      _message -r "no installed rocks"
+      return
+    fi
+    if _cache_invalid luarocks_installed_names; then
+      rocks_names=()
+      for i in {1.."${#rocks_list[@]}"..4}; do
+        rocks_names+=("${rocks_list[$i]}")
+      done
+      _store_cache luarocks_installed_names rocks_names
+    else
+      _retrieve_cache luarocks_installed_names
+    fi
+    if _cache_invalid luarocks_installed_versions; then
+      rocks_versions=()
+      for i in {2.."${#rocks_list[@]}"..4}; do
+        rocks_versions+=("${rocks_list[$i]}")
+      done
+      _store_cache luarocks_installed_versions rocks_versions
+    else
+      _retrieve_cache luarocks_installed_versions
+    fi
+    if _cache_invalid luarocks_installed_descriptions; then
+      rocks_descriptions=()
+      for i in {1.."${#rocks_names[@]}"}; do
+        name_version_description="$(luarocks show ${rocks_names[$i]} 2>/dev/null | head -2 | tail -1)"
+        total_length=${#name_version_description}
+        garbage_length="$((${#rocks_names[$i]} + ${#rocks_versions[$i]} + 5))"
+        description="${name_version_description[${garbage_length},${total_length}]}"
+        rocks_descriptions+=("${description}")
+      done
+      _store_cache luarocks_installed_descriptions rocks_descriptions
+    else
+      _retrieve_cache luarocks_installed_descriptions
+    fi
+    if _cache_invalid luarocks_installed_names_and_descriptions; then
+      rocks_names_and_descriptions=()
+      for i in {1.."${#rocks_names[@]}"}; do
+        name_and_description=${rocks_names[$i]}:${rocks_descriptions[$i]}
+        rocks_names_and_descriptions+=(${name_and_description})
+      done
+    else
+      _store_cache luarocks_installed_names_and_descriptions rocks_names_and_descriptions
+    fi
   else
-    _retrieve_cache luarocks_installed_list
-  fi
-  if _cache_invalid luarocks_installed_names; then
+    rocks_list=($(luarocks --tree="${tree}" list --porcelain 2> /dev/null))
+    if [[ -z ${rocks_list} ]]; then
+      _message "no installed rocks in the specified tree"
+      return
+    fi
     rocks_names=()
     for i in {1.."${#rocks_list[@]}"..4}; do
       rocks_names+=("${rocks_list[$i]}")
     done
-    _store_cache luarocks_installed_names rocks_names
-  else
-    _retrieve_cache luarocks_installed_names
-  fi
-  if _cache_invalid luarocks_installed_versions; then
     rocks_versions=()
     for i in {2.."${#rocks_list[@]}"..4}; do
       rocks_versions+=("${rocks_list[$i]}")
     done
-    _store_cache luarocks_installed_versions rocks_versions
-  else
-    _retrieve_cache luarocks_installed_versions
-  fi
-  if _cache_invalid luarocks_installed_descriptions; then
     rocks_descriptions=()
     for i in {1.."${#rocks_names[@]}"}; do
-      name_version_description="$(luarocks show ${rocks_names[$i]} | head -2 | tail -1)"
+      name_version_description="$(luarocks show ${rocks_names[$i]} 2> /dev/null | head -2 | tail -1)"
       total_length=${#name_version_description}
       garbage_length="$((${#rocks_names[$i]} + ${#rocks_versions[$i]} + 5))"
       description="${name_version_description[${garbage_length},${total_length}]}"
       rocks_descriptions+=("${description}")
     done
-    _store_cache luarocks_installed_descriptions rocks_descriptions
-  else
-    _retrieve_cache luarocks_installed_descriptions
-  fi
-  if _cache_invalid luarocks_installed_names_and_descriptions; then
     rocks_names_and_descriptions=()
     for i in {1.."${#rocks_names[@]}"}; do
       name_and_description=${rocks_names[$i]}:${rocks_descriptions[$i]}
       rocks_names_and_descriptions+=(${name_and_description})
     done
-  else
-    _store_cache luarocks_installed_names_and_descriptions rocks_names_and_descriptions
   fi
   _describe 'installed rocks' rocks_names_and_descriptions
 }
@@ -169,21 +209,37 @@ __luarocks_installed_rocks(){
 (( $+functions[__luarocks_rock] )) ||
 __luarocks_rock(){
   local -a alts=()
-  for arg in "$@"; do
-    case $arg in
+  while [[ $# -gt 0 ]]; do
+    arg="$1"
+    case "$arg" in
       (rockspec)
         alts+=(':rock file:{_files -g "*.rockspec"}')
+        shift 1
+        continue
         ;;
       (rockpack)
         alts+=(':rock file:{_files -g "*.src.rock"}')
+        shift 1
+        continue
         ;;
       (external)
         alts+=(':external rock:')
+        shift 1
+        continue
         ;;
       (installed)
-        alts+=(':local rock:__luarocks_installed_rocks')
+        tree="$2"
+        alts+=(":local rock:{__luarocks_installed_rocks ${tree}}")
+        if [[ -z "${tree}" ]]; then
+          shift
+        else
+          shift 2
+        fi
+        continue
         ;;
     esac
+    shift
+    continue
   done
   _alternative ${alts[@]}
 }
@@ -250,7 +306,7 @@ local doc_command_options=(
 _luarocks_doc(){
   _arguments \
     "${doc_command_options[@]}" \
-    '1: :{__luarocks_rock "installed"}'
+    '1: :{__luarocks_rock "installed" '"${opt_args[--tree]}"'}'
 }
 # }}}
 # {{{ `download` command
@@ -383,7 +439,7 @@ local remove_command_options=(
 _luarocks_remove(){
   _arguments -A "-*" \
     "${remove_command_options[@]}" \
-    '1: :{__luarocks_rock "installed"}' \
+    '1: :{__luarocks_rock "installed" '"${opt_args[--tree]}"'}' \
     '2:: :{__luarocks_rock_version "installed"}'
 }
 # }}}
@@ -418,7 +474,7 @@ local show_command_options=(
 _luarocks_show(){
   _arguments \
     "${show_command_options[@]}" \
-    '1: :{__luarocks_rock "installed"}'
+    "1: :{__luarocks_rock 'installed' "${opt_args[--tree]}"}"
 }
 # }}}
 # {{{ `unpack` command
-- 
2.17.0



Messages sorted by: Reverse Date, Date, Thread, Author