diff --git a/_mvn b/_mvn index c2dbe58..2fc4737 100644 --- a/_mvn +++ b/_mvn @@ -72,9 +72,66 @@ # ------------------------------------------------------------------------------ -# ------------------------------------------------------------------------------ -# Maven commands completers -# ------------------------------------------------------------------------------ +typeset -A opt_args +local context state line + +_mvn() { + local curcontext="$curcontext" maven_version excl_opts + + excl_opts=(-h --help -v --version -ep --encrypt-password -emp --encrypt-master-password) + + _pick_variant -r maven_version maven3='Maven 3' maven2='Maven 2' unknown --version + if [[ $maven_version == 'maven3' ]]; then + opts=( + "($excl_opts -T --threads)"{-T,--threads}'[thread count, for instance 2.0C where C is core multiplied]:thread count:_mvn_thread_counts' + "($excl_opts -t --toolchains)"{-t,--toolchains}'[alternate path for the user toolchains file]:toolchains file:_mvn_toolchains_files' + "($excl_opts -l --log-file)"{-l,--log-file}'[log file to where all build output will go]:log file:_mvn_log_files' + ) + elif [[ $maven_version == 'maven2' ]]; then + opts=( + "($excl_opts -cpu --check-plugin-updates -up --update-plugins -npu --no-plugin-updates -o --offline)"{-cpu,--check-plugin-updates,-up,--update-plugins}'[force upToDate check for any relevant registered plugins]' + "($excl_opts -npr --no-plugin-registry)"{-npr,--no-plugin-registry}'[don'\''t use plugin-registry.xml for plugin versions]' + "($excl_opts -npu --no-plugin-updates -cpu --check-plugin-updates -up --update-plugins)"{-npu,--no-plugin-updates}'[suppress upToDate check for any relevant registered plugins]' + "($excl_opts -r --reactor)"{-r,--reactor}'[dynamically build reactor from subdirectories]:reactor:_mvn_reactors' + ) + else + return 1 + fi + + [[ -n ${(M)words:#"-pl"} || -n ${(M)words:#"--projects"} ]] && opts+=( + "($excl_opts -am --also-make)"{-am,--also-make}'[if project list is specified, also build projects required by the list]' + "($excl_opts -amd --also-make-dependents)"{-amd,--also-make-dependents}'[if project list is specified, also build projects that depend on projects on the list]' + ) + + _arguments -C \ + "(- : *)"{-h,--help}'[display help information]' \ + "(- : *)"{-v,--version}'[display version information]' \ + "(- : *)"{-emp,--encrypt-master-password}'[encrypt master security password]:master password:_mvn_passwords' \ + "(- : *)"{-ep,--encrypt-password}'[encrypt server password]:password:_mvn_passwords' \ + "($excl_opts -B --batch-mode)"{-B,--batch-mode}'[run in non-interactive (batch) mode]' \ + "($excl_opts -V --show-version)"{-V,--show-version}'[display version information without stopping build]' \ + "($excl_opts -q --quiet -X --debug)"{-q,--quiet}'[quiet output, only show errors]' \ + "($excl_opts -X --debug -q --quiet)"{-X,--debug}'[produce execution debug output]' \ + "($excl_opts -N --non-recursive)"{-N,--non-recursive}'[do not recurse into sub-projects]' \ + "($excl_opts -C --strict-checksums -c --lax-checksums)"{-C,--strict-checksums}'[fail the build if checksums don'\''t match]' \ + "($excl_opts -c --lax-checksums -C --strict-checksums)"{-c,--lax-checksums}'[warn if checksums don'\''t match]' \ + "($excl_opts -e --errors)"{-e,--errors}'[produce execution error messages]' \ + "($excl_opts -f --file)"{-f,--file}'[force the use of an alternate POM file]:POM file:_mvn_pom_files' \ + "($excl_opts -s --settings)"{-s,--settings}'[alternate path for the user settings file]:settings file:_mvn_settings_files' \ + "($excl_opts -gs --global-settings)"{-gs,--global-settings}'[alternate path for the global settings file]:global settings file:_mvn_settings_files' \ + "($excl_opts -fae --fail-at-end -ff --fail-fast -fn --fail-never)"{-fae,--fail-at-end}'[only fail the build afterwards, allow all non-impacted builds to continue]' \ + "($excl_opts -ff --fail-fast -fae --fail-at-end -fn --fail-never)"{-ff,--fail-fast}'[stop at first failure in reactorized builds]' \ + "($excl_opts -fn --fail-never -fae --fail-at-end -ff --fail-fast)"{-fn,--fail-never}'[nerver fail the build, regardless of project result]' \ + "($excl_opts -P --activate-profiles)"{-P,--activate-profiles}'[comma-delimited list of profiles to activate]:profile:_mvn_profiles' \ + "($excl_opts -pl --projects)"{-pl,--projects}'[build specified reactor projects instead of all projects]:project list:_mvn_projects -s ,' \ + "($excl_opts -rf --resume-from)"{-rf,--resume-from}'[resume reactor from specified project]:project:_mvn_projects' \ + "($excl_opts -o --offline -U --update-snapshots -cpu --check-plugin-updates -up --update-plugins)"{-o,--offline}'[work offline]' \ + "($excl_opts -U --update-snapshots -nsu --no-snapshot-updates -o --offline)"{-U,--update-snapshots}'[force a check for updated releases and snapshots on remote repositories]' \ + "($excl_opts -nsu --no-snapshot-updates -U --update-snapshots -o --offline)"{-nsu,--no-snapshot-updates}'[Supress SNAPSHOT updates]' \ + {-D-,--define}'[define a system property]:property:_mvn_properties' \ + "$opts[@]" \ + "($excl_opts)*: :_mvn_args" +} (( $+functions[_mvn_args] )) || _mvn_args() { @@ -151,6 +208,7 @@ _mvn_plugins() { 'dependency:provides the capability to manipulate artifacts' 'archetype:create a Maven project from an existing template called an archetype' 'site:generate a site for the project' + 'install:copies the project artifacts to the local repository.' ) _describe -t 'plugin' "plugin" plugins -S ':' } @@ -236,7 +294,7 @@ _mvn_profiles() { settings_file=${~opt_args[-s]:-${opt_args[--settings]:-~/.m2/settings.xml}} if [[ -f $settings_file ]]; then unset profiles - cache_name="mvn/profiles${settings_file:A}" + cache_name="mvn/profiles${settings_file:A}" # FIXME Don't use A modifier, it is only available on Zsh >= 4.3.10 if ( [[ ${+profiles} -eq 0 ]] || _cache_invalid "$cache_name" ) && ! _retrieve_cache "$cache_name"; then profiles=() profiles_section="${(M)${(f)$(<$settings_file)}:#**}" @@ -255,7 +313,7 @@ _mvn_profiles() { while [[ -f ${parent_pom_file:a:h:h}/pom.xml ]]; do parent_pom_file=${parent_pom_file:a:h:h}/pom.xml; done if [[ -f $parent_pom_file ]]; then unset profiles - cache_name="mvn/profiles${parent_pom_file:A}" + cache_name="mvn/profiles${parent_pom_file:A}" # FIXME Don't use A modifier, it is only available on Zsh >= 4.3.10 if ( [[ ${+profiles} -eq 0 ]] || _cache_invalid "$cache_name" ) && ! _retrieve_cache "$cache_name"; then profiles=() setopt localoptions extendedglob @@ -300,6 +358,13 @@ _mvn_properties() { local ret=1 if compset -P '*='; then # TODO Add callback for plugin specific handlers + # TODO Add completion handlers for commonly used command line goals: + # * help:describe + # * release:prepare + # * release:perform + # * gpg:sign + # * deploy:deploy-file + # * install:install-file _default && ret=0 else local alternatives; alternatives=( @@ -333,8 +398,7 @@ _mvn_plugin_goal_properties() { unset properties if ( [[ ${+properties} -eq 0 ]] || _cache_invalid "mvn/plugins/${plugin}/${goal}" ) && ! _retrieve_cache "mvn/plugins/${plugin}/${goal}"; then - # TODO Extract property description too - properties=(${${${(M)${(f)"$(_call_program goals $words[1] -N org.apache.maven.plugins:maven-help-plugin:2.1.1:describe -Dplugin=$plugin -Dgoal=$goal -Ddetail)"}:#*Expression: *}#*\{}%\}*}) + properties=(${(M)${(ps:,,,:)${${${${(pj: :)${${${(f)${"$(_call_program goals $words[1] -N org.apache.maven.plugins:maven-help-plugin:2.1.1:describe -Dplugin=$plugin -Dgoal=$goal -Ddetail)"#*Available parameters:}%%\[INFO\]*}//# [a-z]*/,,,}##*Expression: \$\{}}//\}[[:space:]]##/:}//[[:space:]]##/ }//[[:space:]]#,,,[[:space:]]#/,,,}}:#[a-zA-Z]##:*}) [[ $#properties -gt 0 ]] && _store_cache "mvn/plugins/${plugin}/${goal}" properties fi @@ -343,11 +407,6 @@ _mvn_plugin_goal_properties() { return ret } - -# ------------------------------------------------------------------------------ -# Default caching policies -# ------------------------------------------------------------------------------ - _mvn_plugin_goals_caching_policy() { # Rebuild if cache is older than one month. local -a oldp @@ -377,83 +436,4 @@ _mvn_profiles_caching_policy() { return 1 } - -# ------------------------------------------------------------------------------ -# Plugin specific completions -# ------------------------------------------------------------------------------ - -# TODO Add completion handlers for commonly used command line goals: -# * help:describe -# * release:prepare -# * release:perform -# * gpg:sign -# * deploy:deploy-file -# * install:install-file - - -# ------------------------------------------------------------------------------ -# Core mvn command completion -# ------------------------------------------------------------------------------ - -typeset -A opt_args -local context state line - -_mvn() { - local curcontext="$curcontext" maven_version excl_opts - - excl_opts=(-h --help -v --version -ep --encrypt-password -emp --encrypt-master-password) - - _pick_variant -r maven_version maven3='Maven 3' maven2='Maven 2' unknown --version - if [[ $maven_version == 'maven3' ]]; then - opts=( - "($excl_opts -T --threads)"{-T,--threads}'[thread count, for instance 2.0C where C is core multiplied]:thread count:_mvn_thread_counts' - "($excl_opts -t --toolchains)"{-t,--toolchains}'[alternate path for the user toolchains file]:toolchains file:_mvn_toolchains_files' - "($excl_opts -l --log-file)"{-l,--log-file}'[log file to where all build output will go]:log file:_mvn_log_files' - ) - elif [[ $maven_version == 'maven2' ]]; then - opts=( - "($excl_opts -cpu --check-plugin-updates -up --update-plugins -npu --no-plugin-updates -o --offline)"{-cpu,--check-plugin-updates,-up,--update-plugins}'[force upToDate check for any relevant registered plugins]' - "($excl_opts -npr --no-plugin-registry)"{-npr,--no-plugin-registry}'[don'\''t use plugin-registry.xml for plugin versions]' - "($excl_opts -npu --no-plugin-updates -cpu --check-plugin-updates -up --update-plugins)"{-npu,--no-plugin-updates}'[suppress upToDate check for any relevant registered plugins]' - "($excl_opts -r --reactor)"{-r,--reactor}'[dynamically build reactor from subdirectories]:reactor:_mvn_reactors' - ) - else - return 1 - fi - - [[ -n ${(M)words:#"-pl"} || -n ${(M)words:#"--projects"} ]] && opts+=( - "($excl_opts -am --also-make)"{-am,--also-make}'[if project list is specified, also build projects required by the list]' - "($excl_opts -amd --also-make-dependents)"{-amd,--also-make-dependents}'[if project list is specified, also build projects that depend on projects on the list]' - ) - - _arguments -C \ - "(- : *)"{-h,--help}'[display help information]' \ - "(- : *)"{-v,--version}'[display version information]' \ - "(- : *)"{-emp,--encrypt-master-password}'[encrypt master security password]:master password:_mvn_passwords' \ - "(- : *)"{-ep,--encrypt-password}'[encrypt server password]:password:_mvn_passwords' \ - "($excl_opts -B --batch-mode)"{-B,--batch-mode}'[run in non-interactive (batch) mode]' \ - "($excl_opts -V --show-version)"{-V,--show-version}'[display version information without stopping build]' \ - "($excl_opts -q --quiet -X --debug)"{-q,--quiet}'[quiet output, only show errors]' \ - "($excl_opts -X --debug -q --quiet)"{-X,--debug}'[produce execution debug output]' \ - "($excl_opts -N --non-recursive)"{-N,--non-recursive}'[do not recurse into sub-projects]' \ - "($excl_opts -C --strict-checksums -c --lax-checksums)"{-C,--strict-checksums}'[fail the build if checksums don'\''t match]' \ - "($excl_opts -c --lax-checksums -C --strict-checksums)"{-c,--lax-checksums}'[warn if checksums don'\''t match]' \ - "($excl_opts -e --errors)"{-e,--errors}'[produce execution error messages]' \ - "($excl_opts -f --file)"{-f,--file}'[force the use of an alternate POM file]:POM file:_mvn_pom_files' \ - "($excl_opts -s --settings)"{-s,--settings}'[alternate path for the user settings file]:settings file:_mvn_settings_files' \ - "($excl_opts -gs --global-settings)"{-gs,--global-settings}'[alternate path for the global settings file]:global settings file:_mvn_settings_files' \ - "($excl_opts -fae --fail-at-end -ff --fail-fast -fn --fail-never)"{-fae,--fail-at-end}'[only fail the build afterwards, allow all non-impacted builds to continue]' \ - "($excl_opts -ff --fail-fast -fae --fail-at-end -fn --fail-never)"{-ff,--fail-fast}'[stop at first failure in reactorized builds]' \ - "($excl_opts -fn --fail-never -fae --fail-at-end -ff --fail-fast)"{-fn,--fail-never}'[nerver fail the build, regardless of project result]' \ - "($excl_opts -P --activate-profiles)"{-P,--activate-profiles}'[comma-delimited list of profiles to activate]:profile:_mvn_profiles' \ - "($excl_opts -pl --projects)"{-pl,--projects}'[build specified reactor projects instead of all projects]:project list:_mvn_projects -s ,' \ - "($excl_opts -rf --resume-from)"{-rf,--resume-from}'[resume reactor from specified project]:project:_mvn_projects' \ - "($excl_opts -o --offline -U --update-snapshots -cpu --check-plugin-updates -up --update-plugins)"{-o,--offline}'[work offline]' \ - "($excl_opts -U --update-snapshots -nsu --no-snapshot-updates -o --offline)"{-U,--update-snapshots}'[force a check for updated releases and snapshots on remote repositories]' \ - "($excl_opts -nsu --no-snapshot-updates -U --update-snapshots -o --offline)"{-nsu,--no-snapshot-updates}'[Supress SNAPSHOT updates]' \ - {-D-,--define}'[define a system property]:property:_mvn_properties' \ - "$opts[@]" \ - "($excl_opts)*: :_mvn_args" -} - _mvn "$@"