about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAurélien Olivier <aurelien@aolivier.eu>2024-01-10 21:28:51 +0100
committerOliver Kiddle <opk@zsh.org>2024-01-26 07:23:14 +0100
commit0119a57e9c3724a6ff72247d278163dc3e507328 (patch)
treed450e019bc063d7a4cfb1d2182b061b179a951d4
parent1a3ebb68d607c8f20077f50af16934b9236d5e41 (diff)
downloadzsh-0119a57e9c3724a6ff72247d278163dc3e507328.tar.gz
zsh-0119a57e9c3724a6ff72247d278163dc3e507328.tar.xz
zsh-0119a57e9c3724a6ff72247d278163dc3e507328.zip
github #108: add perlbrew completion
-rw-r--r--ChangeLog5
-rw-r--r--Completion/Unix/Command/_perlbrew315
2 files changed, 320 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 2caaecbdd..1e8ddc599 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2024-01-26  Oliver Kiddle  <opk@zsh.org>
+
+	* github #108: Aurélien Olivier: Completion/Unix/Command/_perlbrew:
+	add perlbrew completion
+
 2024-01-25  Bart Schaefer  <schaefer@zsh.org>
 
 	* 52385: Test/B03print.ztst: avoid "tr" in test output formatting
diff --git a/Completion/Unix/Command/_perlbrew b/Completion/Unix/Command/_perlbrew
new file mode 100644
index 000000000..8bf9ba7cc
--- /dev/null
+++ b/Completion/Unix/Command/_perlbrew
@@ -0,0 +1,315 @@
+#compdef perlbrew
+
+#
+# A zsh completion script for perlbrew (https://metacpan.org/dist/App-perlbrew/)
+#
+
+local curcontext="$curcontext" state state_descr line ret=1
+local -a args_common args_install
+typeset -A opt_args
+# others local variables
+typeset -g perlbrew_subcommands
+
+##
+## get the list of perl available versions
+##
+(( $+functions[_perlbrew_caching_policy] )) ||
+_perlbrew_caching_policy() {
+  # rebuild if cached data are more than one week old
+  local -a newer=( "$1"(Nmw-1) )
+  return $#newer
+}
+
+(( $+functions[_perl_available] )) ||
+_perl_available() {
+  local -a available_versions
+  local update_policy
+
+  zstyle -s ":completion:${curcontext}:" cache-policy update_policy
+  if [[ -z "$update_policy" ]]; then
+    zstyle ":completion:${curcontext}:" cache-policy _perlbrew_caching_policy
+  fi
+
+  if _cache_invalid perlbrew-available-versions || ! _retrieve_cache perlbrew-available-versions; then
+    # this can be slow
+    available_versions=( ${${${${(f)"$(_call_program perl_releases perlbrew available)"}/\# (cp|p)erl/}/(#s)i /}// /} \
+                         perl-stable \
+                         perl-blead )
+    _store_cache perlbrew-available-versions available_versions
+  fi
+  _values 'available version' ${(n)available_versions}
+}
+
+##
+## get the list of local perl installations
+##
+(( $+functions[_perl_installations] )) ||
+_perl_installations() {
+  local text
+  local -a installed alias_link
+
+  case "$1" in
+    (-with-lib)
+      installed=( ${${${(f)"$(_call_program perl_installed perlbrew list)"}/(#s)\*/}// /} )
+      text="perl installation"
+      ;;
+    (-only-lib)
+      installed=( ${(M)${${${(f)"$(_call_program perl_installed perlbrew list)"}/(#s)\*/}// /}:#*@*} )
+      text="perl installation"
+      ;;
+    (-without-lib)
+      installed=( ${${${${(f)"$(_call_program perl_installed perlbrew list)"}/(#s)\*/}// /}:#*@*} )
+      text="perl installation"
+      ;;
+    (-alias)
+      if [[ -n "$PERLBREW_ROOT" ]]; then
+        if [[ -d "$PERLBREW_ROOT/perls" ]]; then
+          alias_link=( $PERLBREW_ROOT/perls/*(@) )
+        fi
+      fi
+      installed=( ${(q)${alias_link:t}[@]} )
+      text="alias"
+      ;;
+  esac
+
+  if [[ ${#installed[@]} -eq 0 ]]; then
+    _message 'no local perl installation found'
+  else
+    case "$2" in
+      (-comma-separated)
+        _values -s , "$text" $installed
+        ;;
+      (*)
+        _values "$text" $installed
+        ;;
+    esac
+  fi
+}
+
+##
+## completion for the alias subcommand
+##
+(( $+functions[_perlbrew_alias] )) ||
+_perlbrew_alias() {
+  local line state ret=1
+
+  _arguments -C \
+    -f'[force]' \
+    "1: :->actions" \
+    "*::arg:->args" && ret 0
+
+  case "$state" in
+    (actions)
+      local -a alias_actions
+      alias_actions=(
+        "create:create an alias for the installation named <name>"
+        "rename:rename the alias to a new name"
+        "delete:delete the given alias"
+      )
+      _describe -t commands 'alias action' alias_actions && ret=0
+      ;;
+    (args)
+      case $line[1] in
+        (create)
+          _arguments \
+            '1:perl installation: _perl_installations -without-lib' \
+            '2: : _message "alias name"' && ret=0
+          ;;
+        (rename)
+          _arguments \
+            '1:perl installation: _perl_installations -alias' \
+            '2: : _message "new name"' && ret=0
+          ;;
+        (delete)
+          _arguments \
+            ':perl installation: _perl_installations -alias' && ret=0
+          ;;
+      esac
+      ;;
+  esac
+}
+
+##
+## completion for the lib subcommand
+##
+(( $+functions[_perlbrew_lib] )) ||
+_perlbrew_lib() {
+  local line state ret=1
+
+  _arguments -C \
+    "1: :->actions" \
+    "*::arg:->args" && ret=0
+
+  case "$state" in
+    (actions)
+      local -a lib_actions
+      lib_actions=(
+        "list:list existing local libs"
+        "create:create a local lib"
+        "delete:delete a local lib"
+      )
+      _describe -t commands 'lib action' lib_actions && ret=0
+      ;;
+    (args)
+      case $line[1] in
+        (list)
+          _nothing && ret=0
+          ;;
+        (create)
+          _message 'lib name' && ret=0
+          ;;
+        (delete)
+          _arguments \
+            ':perl installation: _perl_installations -only-lib' && ret=0
+          ;;
+      esac
+      ;;
+  esac
+}
+
+##
+## main completion script
+##
+
+args_common=(
+  '(-q --quiet)'{-q,--quiet}'[be quiet on informative output message]' \
+  '(-v --verbose)'{-v,--verbose}'[tell me more about it]' \
+  ':perlbrew command:->subcommands' \
+  '*::: := ->option-or-argument'
+)
+
+args_install=(
+  '(-f --force)'{-f,--force}'[force installation]' \
+  -j"[number of building jobs run in parallel]::number" \
+  '(-n --notest)'{-n,--notest}'[skip testing]' \
+  --switch"[automatically switch to this perl version once installed]" \
+  --as"[install the given version of perl by a name]:alias name" \
+  --noman"[skip installation of manpages]" \
+  --thread"[build perl with usethreads enabled]" \
+  --multi"[build perl with usemultiplicity enabled]" \
+  --64int"[build perl with use64bitint enabled]" \
+  --64all"[build perl with use64bitall enabled]" \
+  --ld"[build perl with uselongdouble enabled]" \
+  --debug"[build perl with DEBUGGING enabled]" \
+  --clang"[build perl using the clang compiler]" \
+  --no-patchperl"[skip calling patchperl]" \
+  {-D,-U,-A}"[switches passed to perl Configure script]:value:" \
+  --destdir"[install perl as per 'make install DESTDIR=\$path']: :_files -/" \
+  --sitecustomize"[specify a file to be installed as sitecustomize.pl]: :_files" \
+  --mirror"[specify a CPAN-mirror url]:URL:_urls"
+)
+
+_arguments -C $args_common && ret=0
+
+case $state in
+  (subcommands)
+
+    perlbrew_subcommands=(
+      "init:initialize perlbrew environment"
+      "info:show useful information about the perlbrew installation"
+      "install:install perl"
+      "uninstall:uninstall the given installation"
+      "available:list perls available to install"
+      "lib:manage local::lib directories"
+      "alias:give perl installations a new name"
+      "upgrade-perl:upgrade the current perl"
+      "list:list perl installations"
+      "use:use the specified perl in current shell"
+      "off:turn off perlbrew in current shell"
+      "switch:permanently use the specified perl as default"
+      "switch-off:permanently turn off perlbrew (revert to system perl)"
+      "exec:exec programs with specified perl environments"
+      "clone-modules:re-installs all CPAN modules from one installation to another"
+      "self-install:install perlbrew itself under PERLBREW_ROOT/bin"
+      "self-upgrade:upgrade perlbrew itself"
+      "install-patchperl:install patchperl"
+      "install-cpanm:install cpanm, a friendly companion"
+      "install-cpm:install cpm, a faster but still friendly companion"
+      "install-multiple:install multiple versions and flavors of perl"
+      "download:download the specified perl distribution tarball"
+      "clean:purge tarballs and build directories"
+      "version:display version"
+      "help:read more detailed instructions"
+    )
+
+    _describe -t commands 'perlbrew command' perlbrew_subcommands && ret=0
+
+    ;;
+  (option-or-argument)
+    curcontext=${curcontext%:*}-$line[1]:
+    case $line[1] in
+      (info)
+        _message 'perl module name' && ret=0
+        ;;
+      (install)
+        _arguments \
+           $args_install \
+           '1:perl release: _perl_available' && ret=0
+        ;;
+      (install-multiple)
+        _arguments \
+           $args_install \
+           '*'--both"[perl flavor]: :(thread multi ld 64int 64all debug clang )" \
+           --common-variations"[equivalent to '--both thread --both ld --both 64int']" \
+           --all-variations"[generates all the possible flavor combinations]" \
+           --append"[appends the given string to the generated names]:string" \
+           '*:perl release: _perl_available' && ret=0
+        ;;
+      (uninstall)
+        _arguments \
+          ":perl installation: _perl_installations -without-lib" && ret=0
+        ;;
+      (use|switch)
+        _arguments \
+          ':perl installation: _perl_installations -with-lib' && ret=0
+        ;;
+      (available)
+        _arguments \
+          '--all[list of all perls ever released, including development and RC versions]' \
+          '*: :' && ret=0
+        ;;
+      (alias)
+        _perlbrew_alias && ret=0
+        ;;
+      (exec)
+        _arguments -C \
+          --with'[specify one or more perl installations to use]: : _perl_installations -without-lib -comma-separated' \
+          --min'[minimum perl version]:version number (n.nnnnn):' \
+          --max'[maximum perl version]:version number (n.nnnnn):' \
+          --halt-on-error'[stop on first nonzero exit status]' \
+          "1:command:" \
+          "*:args:" && ret=0
+        ;;
+      (env) # NOTE: Low level command
+        _arguments \
+          ':perl installation: _perl_installations -with-lib' && ret=0
+        ;;
+      (symlink-executables) # NOTE: Low level command
+        _arguments \
+          ':perl installation: _perl_installations -with-lib' && ret=0
+        ;;
+      (lib)
+        _perlbrew_lib && ret=0
+        ;;
+      (download)
+        _arguments \
+          ':perl release: _perl_available' && ret=0
+        ;;
+      (clone-modules)
+        _arguments \
+          '--notest[skip all module tests]' \
+          ':perl installation: _perl_installations -with-lib' \
+          ':perl installation: _perl_installations -with-lib' && ret=0
+        ;;
+      (init|list|off|switch-off|install-cpanm|install-patchperl|self-upgrade|\
+        self-install|clean|version|upgrade-perl|list-modules)
+        _nothing && ret=0
+        ;;
+      (*)
+        _default && ret=0
+        ;;
+    esac
+    ;;
+esac
+
+return ret