summary refs log tree commit diff
path: root/Completion/Unix/Command
diff options
context:
space:
mode:
authorDoron Behar <doron.behar@gmail.com>2018-06-07 19:26:29 +0300
committerOliver Kiddle <okiddle@yahoo.co.uk>2018-06-07 23:18:34 +0200
commit880098352cdcbe20e7b237e144869296537a07f1 (patch)
tree1eb56d024757b625821b4432692855a6932c44d0 /Completion/Unix/Command
parentdbbe7794ef50b93ce78fa07efa146dcf26e231fc (diff)
downloadzsh-880098352cdcbe20e7b237e144869296537a07f1.tar.gz
zsh-880098352cdcbe20e7b237e144869296537a07f1.tar.xz
zsh-880098352cdcbe20e7b237e144869296537a07f1.zip
42947: new luarocks completion
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r--Completion/Unix/Command/_luarocks591
1 files changed, 591 insertions, 0 deletions
diff --git a/Completion/Unix/Command/_luarocks b/Completion/Unix/Command/_luarocks
new file mode 100644
index 000000000..363cedc8d
--- /dev/null
+++ b/Completion/Unix/Command/_luarocks
@@ -0,0 +1,591 @@
+#compdef luarocks
+
+# Start of options' arguments' helpers
+(( $+functions[__luarocks_command] )) ||
+__luarocks_command(){
+  local -a commands=(
+    build:'build/compile a rock'
+    config:'query information about the LuaRocks configuration'
+    doc:'show documentation for an installed rock'
+    download:'download a specific rock file from a rocks server'
+    help:'help on commands'
+    install:'install a rock'
+    lint:'check syntax of a rockspec'
+    list:'list currently installed rocks'
+    make:'compile package in current directory using a rockspec'
+    new_version:'auto-write a rockspec for a new version of a rock'
+    pack:'create a rock, packing sources or binaries'
+    path:'return the currently configured package path'
+    purge:'remove all installed rocks from a tree'
+    remove:'uninstall a rock'
+    search:'query the LuaRocks servers'
+    show:'show information about an installed rock'
+    unpack:'unpack the contents of a rock'
+    upload:'upload a rockspec to the public rocks repository'
+    write_rockspec:'write a template for a rockspec file'
+  )
+  _describe -t commands 'command' commands "$@"
+}
+local option_deps_modes='--deps-mode=[specify how to handle dependencies]:mode:__luarocks_deps_modes'
+(( $+functions[__luarocks_deps_modes] )) ||
+__luarocks_deps_modes(){
+  local modes=(
+    'all:use all trees from the rocks_trees list for finding dependencies'
+    'one:use only the current tree (possibly set with --tree)'
+    'order:use trees based on order (use the current tree and all trees below it on the rocks_trees list)'
+    'none:ignore dependencies altogether'
+  )
+  _describe 'dependencies mode' modes
+}
+(( $+functions[__luarocks_rock_version] )) ||
+__luarocks_rock_version(){
+  local i=2
+  while [[ -n "${words[$i]}" ]]; do
+    if [[ ! "${words[$i]}" =~ '^-' ]]; then
+      case "$1" in
+        "external_or_local")
+          if [[ ! -f "${words[$i]}" ]]; then
+            _message -e "version for external rock ${words[$i]}"
+            return
+          else
+            _message -e "version for local rock ${words[$i]}"
+          fi
+          ;;
+        "installed")
+          # 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
+          tree="$2"
+          if [[ -z "${tree}" ]]; then
+            _message -e "version for installed rock ${words[$i]}"
+          else
+            _message -e "version for installed rock ${words[$i]} on tree ${tree}"
+          fi
+          return
+          ;;
+        "new_version")
+          if [[ -f "${words[$i]}" ]]; then
+            _message -e "new version for rock ${words[$i]}"
+            return
+          fi
+          ;;
+        "new_rock")
+          _message -e "version for new rock ${words[$i]}"
+          return
+          ;;
+      esac
+    fi
+    i=$(( i + 1 ))
+  done
+}
+(( $+functions[__luarocks_lua_versions] )) ||
+__luarocks_lua_versions(){
+  _values -s , 5.3 5.2 5.1
+}
+(( $+functions[___luarocks_manually_store_cache_configs_paths] )) ||
+___luarocks_manually_store_cache_configs_paths(){
+  user_config_path="$(_call_program user_config_path luarocks config --user-config)"
+  system_config_path="$(_call_program system_config_path luarocks config --system-config)"
+  {
+    print -r user_config_path=${(qq)user_config_path}
+    print -r system_config_path=${(qq)system_config_path}
+  } >! ${cache_dir}/luarocks_configs_paths
+}
+(( $+functions[___luarocks_manually_store_cache_configured_values] )) ||
+___luarocks_manually_store_cache_configured_values(){
+  local default_trees=($(_call_program rock_trees luarocks config --rock-trees))
+  # The following command usually gives somethins like this
+  #
+  #   /home/me/.luarocks	user
+  #   /usr	system
+  #
+  # We'll just use the 1st and 3rd elements in the array for the default trees
+  configured_user_tree="${default_trees[1]}"
+  configured_system_tree="${default_trees[3]}"
+  configured_lua_version="$(_call_program lua_ver luarocks config --lua-ver)"
+  {
+    print -r configured_lua_version=${(qq)configured_lua_version}
+    print -r configured_user_tree=${(qq)configured_user_tree}
+    print -r configured_system_tree=${(qq)configured_system_tree}
+  } >! ${cache_dir}/luarocks_configured_values
+}
+(( $+functions[___luarocks_installed_rocks_cache_policy] )) ||
+___luarocks_installed_rocks_cache_policy(){
+  local cache_file="$1"
+  # Before checking the modification date of the manifests files vs the
+  # installed rocks cache files, we need to perform the following checks:
+  # - luarocks executable modification date vs modification date of cache file
+  #   holding the default configuration files' locations
+  # ) if configuration files' locations were possibly changed, we need to:
+  #   * set and cache the *possibly* new locations of the configuration files
+  # ) else:
+  #   * retrieve from cache the configuration files' locations
+  # ) end if
+  # - configuration files' modification date vs modification date of cache file
+  #   holding the values from `luarocks config --lua-ver` and `luarocks config
+  #   --rock-trees`
+  # ) if the configuration files' locations were changed:
+  #   * set and cache the values from the commands above
+  # ) else:
+  #   ) if configuration files are newer:
+  #     * set and cache the values from the commands above
+  #   ) else:
+  #     * retrive from cache the values of the commands above
+  #   ) end if
+  # ) end if
+
+  # Decide which directory to retrieve cache from, and ensure it exists
+  local cache_dir
+  zstyle -s ":completion:${curcontext}:" cache-path cache_dir
+  : ${cache_dir:=${ZDOTDIR:-$HOME}/.zcompcache}
+  if [[ ! -d "$cache_dir" ]]; then
+    [[ -e "$cache_dir" ]] &&
+      _message "cache-dir ($cache_dir) isn't a directory\!"
+  fi
+  local where_luarocks="${commands[luarocks]}"
+  # luarocks_configured_values
+  local configured_lua_version configured_user_tree configured_system_tree
+  # luarocks_configs_paths
+  local user_config_path system_config_path
+  if [[ -e ${cache_dir}/luarocks_configs_paths ]]; then
+    if [[ ${where_luarocks} -nt ${cache_dir}/luarocks_configs_paths ]]; then
+      ___luarocks_manually_store_cache_configs_paths
+    else
+      . ${cache_dir}/luarocks_configs_paths
+    fi
+  else
+    ___luarocks_manually_store_cache_configs_paths
+  fi
+  if [[ -e ${cache_dir}/luarocks_configured_values ]]; then
+    if [[ ${user_config_path} -nt ${cache_dir}/luarocks_configured_values ]] || [[ ${system_config_path} -nt ${cache_dir}/luarocks_configured_values ]]; then
+      ___luarocks_manually_store_cache_configured_values
+    else
+      . ${cache_dir}/luarocks_configured_values
+    fi
+  else
+    ___luarocks_manually_store_cache_configured_values
+  fi
+
+  local user_manifest_file="${configured_user_tree}/lib/luarocks/rocks-${configured_lua_version}/manifest"
+  local system_manifest_file="${configured_system_tree}/lib/luarocks/rocks-${configured_lua_version}/manifest"
+  local cache_status=1
+  if [[ -f ${cache_file} ]]; then
+    if [[ -f ${user_manifest_file} ]]; then
+      if [[ ${user_manifest_file} -nt ${cache_file} ]]; then
+        cache_status=0
+      fi
+    fi
+    if [[ -f ${system_manifest_file} ]]; then
+      if [[ ${system_manifest_file} -nt ${cache_file} ]]; then
+        cache_status=0
+      fi
+    fi
+  fi
+  return cache_status
+}
+(( $+functions[__luarocks_installed_rocks] )) ||
+__luarocks_installed_rocks(){
+  # 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
+    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
+    rocks_versions=()
+    for i in {2.."${#rocks_list[@]}"..4}; do
+      rocks_versions+=("${rocks_list[$i]}")
+    done
+    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
+    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
+  fi
+  _describe 'installed rocks' rocks_names_and_descriptions
+}
+# Used to complete one or more of the followings:
+# - .rockspec file
+# - .src.rock file
+# - external rock
+(( $+functions[__luarocks_rock] )) ||
+__luarocks_rock(){
+  local -a alts=()
+  while [[ $# -gt 0 ]]; do
+    arg="$1"
+    case "$arg" in
+      (rockspec)
+        alts+=('files: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)
+        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[@]}
+}
+(( $+functions[__luarocks_git_tags] )) ||
+__luarocks_git_tags(){
+  # Copied straight from definition of _git
+  local expl
+  declare -a tags
+  tags=(${${(f)"$(_call_program tagrefs git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/})
+  __git_command_successful $pipestatus || return 1
+  _wanted tags expl tag compadd -M 'r:|/=**' "$@" -a - tags
+}
+
+# End of options' arguments' helpers & Start of sub commands helpers
+
+# arguments:
+# - must: .rockspec file / external rock
+# - optional: version (only when chossing external rock)
+local make_command_options=(
+  '--pack-binary-rock[produce a .rock file with the contents of compilation inside the current directory instead of installing it]'
+  '--keep[do not remove previously installed versions of the rock after building a new one]'
+  '--branch=[override the `source.branch` field in the loaded rockspec]:NAME:{_message "branch name"}'
+)
+local build_command_options=(
+  "${make_command_options[@]}"
+  '--only-deps[installs only the dependencies of the rock]'
+  $option_deps_modes
+)
+(( $+functions[_luarocks_build] )) ||
+_luarocks_build(){
+  _arguments -A "-*" \
+    "${build_command_options[@]}" \
+    '1: :{__luarocks_rock "rockspec" "external"}' \
+    '2:: :{__luarocks_rock_version "external_or_local"}'
+}
+# arguments:
+# - must: option
+local config_command_options=(
+  '--lua-incdir[path to Lua header files]'
+  '--lua-libdir[path to Lua library files]'
+  '--lua-ver[lua version (in major.minor format)]'
+  '--system-config[location of the system config file]'
+  '--user-config[location of the user config file]'
+  '--rock-trees[rocks trees in useFirst the user tree, then the system tree]'
+)
+(( $+functions[_luarocks_config] )) ||
+_luarocks_config(){
+  _arguments "${config_command_options[@]}"
+}
+# arguments:
+# - must: installed rock
+local doc_command_options=(
+  '--home[open the home page of project]'
+  '--list[list documentation files only]'
+)
+(( $+functions[_luarocks_doc] )) ||
+_luarocks_doc(){
+  _arguments \
+    "${doc_command_options[@]}" \
+    '1: :{__luarocks_rock "installed" '"${opt_args[--tree]}"'}'
+}
+# arguments:
+# - must: external only rockspec
+local download_command_options=(
+  '--all[download all files if there are multiple matches]'
+  '--source[download .src.rock if available]'
+  '--rockspec[download .rockspec if available]'
+  '--arch=[download rock for a specific architecture]:ARCH:'
+)
+(( $+functions[_luarocks_download] )) ||
+_luarocks_download(){
+  _arguments -A "-*" \
+    "${download_command_options[@]}" \
+    '1: :{__luarocks_rock "external"}' \
+    '2:: :{__luarocks_rock_version "external_or_local"}'
+}
+# arguments:
+# must: luarocks sub command
+(( $+functions[_luarocks_help] )) ||
+_luarocks_help(){
+  _arguments '1: :__luarocks_command'
+}
+# arguments:
+# - must: .rockspec file / external rock
+# - optional: version
+# NOTE: it receives the same argument as the build command and it accepts the same options as well
+(( $+functions[_luarocks_install] )) ||
+_luarocks_install(){
+  _luarocks_build
+}
+# arguments:
+# - must: rockspec file (first and last)
+(( $+functions[_luarocks_lint] )) ||
+_luarocks_lint(){
+  _arguments '1:: :{__luarocks_rock "rockspec"}'
+}
+# arguments:
+# NOTE: receives only options
+local list_command_options=(
+  '--outdated[list only rocks for which there is a higher version available in the rocks server]'
+  '--porcelain[produce machine-friendly output]'
+)
+(( $+functions[_luarocks_list] )) ||
+_luarocks_list(){
+  _arguments "${list_command_options[@]}"
+}
+# arguments:
+# - optional: rockspec file
+# NOTE: it's options were already described above.
+(( $+functions[_luarocks_make] )) ||
+_luarocks_make(){
+  _arguments '1:: :{__luarocks_rock "rockspec"}'
+}
+# arguments:
+# - optional: .rockspec file / external rock
+# - optional: version (unless a --tag was given)
+# - optional: URL
+local new_version_command_options=(
+  '--tag=[if no version is specified, this option'"'"'s argument is used instead]:tag:__luarocks_git_tags'
+)
+(( $+functions[_luarocks_new_version] )) ||
+_luarocks_new_version(){
+  _arguments -A "-*" \
+    "${new_version_command_options[@]}" \
+    '1:: :{__luarocks_rock "external" "rockspec"}' \
+    '2:: :{__luarocks_rock_version "external_or_local"}' \
+    '3:: :_urls'
+}
+# arguments:
+# - must: .rockspec file / external rock
+# - optional: version
+(( $+functions[_luarocks_pack] )) ||
+_luarocks_pack(){
+  _luarocks_build
+}
+# arguments:
+# NOTE: receives only options
+local path_command_options=(
+  '--bin[adds the system path to the output]'
+  '--append[appends the paths to the existing paths]'
+  '--lr-path[exports the Lua path (not formatted as shell command)]'
+  '--lr-cpath[exports the Lua cpath (not formatted as shell command)]'
+  '--lr-bin[exports the system path (not formatted as shell command)]'
+)
+(( $+functions[_luarocks_path] )) ||
+_luarocks_path(){
+  _arguments "${path_command_options[@]}"
+}
+# NOTE: receives only options yet --tree is mandatory
+# NOTE: --force can be used only in conjunction with --old-versions
+local option_force='--force[force removing old versions when]'
+local purge_command_options=(
+  '--old-versions[keep the highest-numbered version of each rock and remove the other ones]'
+  $option_force
+)
+(( $+functions[_luarocks_purge] )) ||
+_luarocks_purge(){
+  _arguments "${purge_command_options[@]}"
+}
+# arguments:
+# - must: locally installed rock
+# - optional: version
+local option_force_fast='--force-fast[works like --force but doesn'"'"'t reports forced removals]'
+local remove_command_options=(
+  $option_deps_modes
+  $option_force
+  $option_force_fast
+)
+(( $+functions[_luarocks_remove] )) ||
+_luarocks_remove(){
+  _arguments -A "-*" \
+    "${remove_command_options[@]}" \
+    '1: :{__luarocks_rock "installed" '"${opt_args[--tree]}"'}' \
+    '2:: :{__luarocks_rock_version "installed" '"${opt_args[--tree]}"'}'
+}
+# arguments:
+# - must: string as a search query
+local search_command_options=(
+  '--source[return only rockspecs and source rocks]'
+  '--binary[return only pure Lua and binary rocks (rocks that can be used with the "install" command without requiring a C toolchain)]'
+  '--all[list all contents of the server that are suitable to this platform, do not filter by name]'
+)
+(( $+functions[_luarocks_search] )) ||
+_luarocks_search(){
+  _arguments \
+    "${search_command_options[@]}" \
+    '*:SEARCH QUERY:'
+}
+# arguments:
+# - must: installed rock
+local show_command_options=(
+  '--home[home page of project]'
+  '--modules[all modules provided by this package as used by require()]'
+  '--deps[packages this package depends on]'
+  '--rockspec[the full path of the rockspec file]'
+  '--mversion[the package version]'
+  '--rock-tree[local tree where rock is installed]'
+  '--rock-dir[data directory of the installed rock]'
+)
+(( $+functions[_luarocks_show] )) ||
+_luarocks_show(){
+  _arguments \
+    "${show_command_options[@]}" \
+    "1: :{__luarocks_rock 'installed' "${opt_args[--tree]}"}"
+}
+# arguments:
+# - must: rockpack file / external rock
+# - optional: version (only when chossing external rock)
+local unpack_command_options=(
+  '--force[unpack files even if the output directory already exists]'
+)
+(( $+functions[_luarocks_unpack] )) ||
+_luarocks_unpack(){
+  _arguments \
+    "${unpack_command_options[@]}" \
+    '1: :{__luarocks_rock "rockpack" "external"}'
+}
+# arguments:
+# - must: rockspec file
+local upload_command_options=(
+  '--skip-pack[do not pack and send source rock]'
+  '--api-key=[give it an API key]:KEY:{_message "api key"}'
+  '--force[replace existing rockspec if the same revision of a module already exists]'
+)
+(( $+functions[_luarocks_upload] )) ||
+_luarocks_upload(){
+  _arguments \
+    "${upload_command_options[@]}" \
+    '1: :{__luarocks_rock "rockspec"}'
+}
+# arguments:
+# - optional: name
+# - optional: version
+# - optional: URL / PATH
+# receives as an argument a name and a version with optionally a URL/PATH
+local write_rockspec_command_options=(
+  '--output=[write the rockspec with the given filename]:FILE:_files'
+  '--license=[specify a license string]:license (e.g. "MIT/X11" or "GNU GPL v3")'
+  '--summary=[a short one-line description summary]:summary:{_message -e "short summary of the rock"}'
+  '--detailed=[a longer description string]:detailed_text:{_message -e "detailed description of the rock"}'
+  '--homepage=[project homepage]:URL:_urls'
+  '--lua-version=[supported Lua versions]:LUA_VER:__luarocks_lua_versions'
+  '--rockspec-format=[rockspec format version, such as "1.0" or "1.1"]:VER: '
+  '--tag=[tag to use. Will attempt to extract version number from it]:tag:__git_tag'
+  '--lib=[comma separated list of C library files to link to]:library files'
+)
+(( $+functions[_luarocks_write_rockspec] )) ||
+_luarocks_write_rockspec(){
+  _arguments -A "-*" \
+    "${write_rockspec_command_options[@]}" \
+    '1:: :{_message "new rock name"}' \
+    '2:: :{__luarocks_rock_version "new_rock"}' \
+    '3:: :_urls'
+}
+
+# The real thing
+_arguments -C \
+  '(--server --only-server)--server=[fetch rocks/rockspecs from this server]:HOST:_hosts' \
+  '(--server --only-server)--only-server=[fetch rocks/rockspecs from this server only]:HOST:_hosts' \
+  '--only-sources=[restrict downloads to paths matching the given URL]:URL:_urls' \
+  '--tree=[which tree to operate on]:TREE:{_files -/}' \
+  '--local[use the tree in the user'"'"'s home directory]' \
+  '--verbose[display verbose output of commands executed]' \
+  '--timeout=[timeout on network operations]:SECONDS:{_message "timeout (seconds)"}' \
+  '1: :__luarocks_command' \
+  '*::arg:->args'
+
+case "$state" in
+  (args)
+    curcontext="${curcontext%:*:*}:luarocks-${words[1]}:"
+    if [[ $? != 1 ]]; then
+      _call_function ret _luarocks_${words[1]}
+    fi
+esac