mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-06-19 09:48:03 +02:00
432 lines
12 KiB
Text
432 lines
12 KiB
Text
#compdef pkg
|
|
|
|
_pkg5_pkgs() {
|
|
local cache_policy cache_id=pkg5_installed_pkgs:$HOST:${pkg5_root//\//+}
|
|
typeset -a -g _pkg5_installed_pkgs
|
|
|
|
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
|
|
if [[ -z "$cache_policy" ]]; then
|
|
zstyle ":completion:${curcontext}:" cache-policy _pkg5_installed_caching_policy
|
|
fi
|
|
|
|
if ( [[ $#_pkg5_installed_pkgs -eq 0 ]] || _cache_invalid $cache_id ) && ! _retrieve_cache $cache_id; then
|
|
_pkg5_installed_pkgs=( $(
|
|
pkg -R $pkg5_root list -H | while read pkg junk; do
|
|
pkga=( ${(s:/:)pkg} )
|
|
for i in {1..$#pkga}; do
|
|
print ${(j:/:)${pkga[$i,-1]}}
|
|
done
|
|
done) )
|
|
_store_cache $cache_id _pkg5_installed_pkgs
|
|
fi
|
|
|
|
compadd "$@" - ${_pkg5_installed_pkgs}
|
|
}
|
|
|
|
_pkg5_pkgs_a() {
|
|
local cache_policy cache_id=pkg5_known_pkgs:$HOST:${pkg5_root//\//+}
|
|
typeset -a -g _pkg5_known_pkgs
|
|
|
|
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
|
|
if [[ -z "$cache_policy" ]]; then
|
|
zstyle ":completion:${curcontext}:" cache-policy _pkg5_known_caching_policy
|
|
fi
|
|
|
|
if ( [[ $#_pkg5_known_pkgs -eq 0 ]] || _cache_invalid $cache_id ) && ! _retrieve_cache $cache_id; then
|
|
_pkg5_known_pkgs=( $(
|
|
pkg -R $pkg5_root list -aH --no-refresh | while read pkg junk; do
|
|
pkga=( ${(s:/:)pkg} )
|
|
for i in {1..$#pkga}; do
|
|
print ${(j:/:)${pkga[$i,-1]}}
|
|
done
|
|
done) )
|
|
_store_cache $cache_id _pkg5_known_pkgs
|
|
fi
|
|
|
|
compadd "$@" - ${_pkg5_known_pkgs}
|
|
}
|
|
|
|
_pkg5_avoided_pkgs() {
|
|
compadd "$@" - $(pkg -R $pkg5_root unavoid)
|
|
}
|
|
|
|
_pkg5_pubs() {
|
|
compadd "$@" - $(pkg -R $pkg5_root publisher -H | awk '{print $1}')
|
|
}
|
|
|
|
_pkg5_variants() {
|
|
compadd "$@" - $(pkg -R $pkg5_root variant -H | awk '{print $1}')
|
|
}
|
|
|
|
_pkg5_facets() {
|
|
compadd "$@" - $(pkg -R $pkg5_root facet -H | awk '{print $1}')
|
|
}
|
|
|
|
_pkg5_known_caching_policy() {
|
|
[[ $pkg5_root/var/pkg/state/known/catalog.attrs -nt "$1" ]]
|
|
}
|
|
|
|
_pkg5_installed_caching_policy() {
|
|
[[ $pkg5_root/var/pkg/state/installed/catalog.attrs -nt "$1" ]]
|
|
}
|
|
|
|
_pkg5() {
|
|
local expl context state line pkg5_root prop
|
|
typeset -A opt_args
|
|
local -a subcmds pkg5_actions pkg5_cattr pkg5_sattr be_opts
|
|
local -a publisher_properties image_properties certs
|
|
|
|
subcmds=(
|
|
install uninstall list update refresh version help
|
|
info search verify fix revert contents image-create
|
|
{change-,}{variant,facet} avoid unavoid history
|
|
{{un,}set-,}property {add,remove}-property-value
|
|
{{un,}set-,}publisher purge-history rebuild-index
|
|
update-format freeze unfreeze {{un,}set-,}mediator
|
|
)
|
|
|
|
pkg5_actions=(
|
|
set depend dir driver file group hardlink legacy license link
|
|
signature unknown user
|
|
)
|
|
|
|
# Pseudo attributes for the contents subcommand
|
|
pkg5_cattr=(
|
|
action.hash action.key action.name action.raw
|
|
pkg.fmri pkg.name pkg.publisher pkg.shortfmri
|
|
)
|
|
|
|
# Pseudo attributes for the search subcommand
|
|
pkg5_sattr=(
|
|
$pkg5_cattr search.match search.match_type
|
|
)
|
|
|
|
publisher_properties=(
|
|
"signature-policy:value:(ignore verify require-signatures require-names)"
|
|
"signature-required-names:value:"
|
|
)
|
|
|
|
image_properties=(
|
|
"be-policy:value:(default always-new create-backup when-required)"
|
|
"ca-path:value:_path_files -/"
|
|
"check-certificate-revocation:value:(true false)"
|
|
"flush-content-cache-on-success:value:(true false)"
|
|
"mirror-discovery:value:(true false)"
|
|
"send-uuid:value:(true false)"
|
|
"signature-policy:value:(ignore verify require-signatures require-names)"
|
|
"signature-required-names:value:"
|
|
"trust-anchor-directory:value:_path_files -/"
|
|
"use-system-repo:value:(true false)"
|
|
)
|
|
|
|
if [[ $service == "pkg" ]]; then
|
|
_arguments -C -A "-*" \
|
|
'(-\? --help)'{-\?,--help}'[Help]' \
|
|
'-R[Root directory]:directory:_path_files -/' \
|
|
'*::command:->subcmd' && return 0
|
|
|
|
if (( CURRENT == 1 )); then
|
|
_wanted commands expl "pkg subcommand" compadd -a subcmds
|
|
return
|
|
fi
|
|
service="$words[1]"
|
|
curcontext="${curcontext%:*}=$service:"
|
|
fi
|
|
|
|
pkg5_root=${${${opt_args[-R]}:-$PKG_IMAGE}:-/}
|
|
|
|
certs=( $(pkg -R $pkg5_root property -H ca-path | awk '{print $2}')/* )
|
|
|
|
# Options common to subcommands which might have to deal with BEs.
|
|
# Note that --backup-be-name needs to precede --be-name in order to
|
|
# ensure that completion sees "--b" as being ambiguous.
|
|
be_opts=(
|
|
"(--require-new-be)--deny-new-be[Fail the operation if a new BE would be required]"
|
|
"(--deny-new-be)--require-new-be[Force a new BE to be created]"
|
|
"--backup-be-name[Specify the name for the backup BE]:BE name: "
|
|
"--be-name[Specify a BE name]:BE name: "
|
|
"--no-be-activate[Don't activate the new BE]"
|
|
"(--require-backup-be)--no-backup-be[Don't leave behind a backup BE]"
|
|
"(--no-backup-be)--require-backup-be[Force leaving behind a backup BE]"
|
|
)
|
|
|
|
case $service in
|
|
("install")
|
|
_arguments -A "-*" \
|
|
'-n[Dry run]' \
|
|
'-q[Quiet]' \
|
|
'-v[Verbose]' \
|
|
'-g[Specify additional source of packages]:source:_path_files -/' \
|
|
"--accept[Accept all licenses]" \
|
|
"--licenses[Display all licenses]" \
|
|
"--reject[Specify an FMRI to exclude from the result]:fmri:_pkg5_pkgs" \
|
|
"--no-refresh[Don't refresh catalogs]" \
|
|
"--no-index[Don't reindex search database]" \
|
|
$be_opts \
|
|
'*:package:_pkg5_pkgs_a'
|
|
;;
|
|
|
|
("uninstall")
|
|
_arguments -A "-*" \
|
|
'-n[Dry run]' \
|
|
'-q[Quiet]' \
|
|
'-v[Verbose]' \
|
|
$be_opts \
|
|
"--no-index[Don't reindex search database]" \
|
|
'*:package:_pkg5_pkgs'
|
|
;;
|
|
|
|
("update")
|
|
_arguments -A "-*" \
|
|
"-f[Don't check for pkg(5) updates]" \
|
|
'-n[Dry run]' \
|
|
'-q[Quiet]' \
|
|
'-v[Verbose]' \
|
|
'-g[Specify additional source of packages]:source:_path_files -/' \
|
|
"--accept[Accept all licenses]" \
|
|
"--licenses[Display all licenses]" \
|
|
$be_opts \
|
|
"--reject[Specify an FMRI to exclude from the result]:fmri:_pkg5_pkgs" \
|
|
"--no-refresh[Don't refresh catalogs]" \
|
|
"--no-index[Don't reindex search database]" \
|
|
'*:package:_pkg5_pkgs'
|
|
;;
|
|
|
|
("list")
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'-a[Show not-installed packages]' \
|
|
'-f[Show all versions]' \
|
|
'-g[Specify additional source of packages]:source:_path_files -/' \
|
|
'-n[Show newest versions]' \
|
|
'-s[Show summaries]' \
|
|
'-u[Show upgradable versions]' \
|
|
'-v[Show verbose pkg: FMRIs]' \
|
|
"--no-refresh[Don't refresh catalogs]" \
|
|
'*:package:_pkg5_pkgs_a'
|
|
;;
|
|
|
|
("refresh")
|
|
_arguments -A "-*" \
|
|
"--full[Full refresh]" \
|
|
'*:publisher:_pkg5_pubs'
|
|
;;
|
|
|
|
("info")
|
|
_arguments -A "-*" \
|
|
'--license[Display license text(s)]' \
|
|
'(-r)-l[Installed package]' \
|
|
'(-l)-r[Uninstalled package; fetch info from depot]:*:package:_pkg5_pkgs_a' \
|
|
'*:package:_pkg5_pkgs'
|
|
;;
|
|
|
|
("search")
|
|
_arguments -A "-*" \
|
|
"(-p)-a[Show matching actions]" \
|
|
'-l[Local search]' \
|
|
'(-a)-p[Show packages]' \
|
|
'-r[Remote search]' \
|
|
'-H[Omit headers]' \
|
|
'-I[Case sensitive search]' \
|
|
'-s[Depot URI]' \
|
|
'*-o[Attribute output]:attributes:_values -s , "attribute" $pkg5_sattr' \
|
|
':query:'
|
|
;;
|
|
|
|
("verify")
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'-q[Quiet]' \
|
|
'-v[Verbose]' \
|
|
'*:package:_pkg5_pkgs'
|
|
;;
|
|
|
|
("fix")
|
|
_arguments -A "-*" \
|
|
'--accept[Accept all licenses]' \
|
|
'--licenses[Display all licenses]' \
|
|
'*:package:_pkg5_pkgs'
|
|
;;
|
|
|
|
("revert")
|
|
_arguments -A "-*" \
|
|
'-n[Dry run]' \
|
|
'-v[Verbose]' \
|
|
'--tagged[Revert all tagged files]:tag:' \
|
|
$be_opts \
|
|
"--no-refresh[Don't refresh catalogs]" \
|
|
"--no-index[Don't reindex search database]" \
|
|
'*:file:_path_files'
|
|
;;
|
|
|
|
("contents")
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'-m[Print raw manifests]' \
|
|
'*-a[Attribute matching]:attribute=pattern:' \
|
|
'*-o[Attribute output]:attributes:_values -s , "attribute" $pkg5_cattr' \
|
|
'*-s[Sort key]:attribute:' \
|
|
'*-t[Action type]:action:_values -s , "action" $pkg5_actions' \
|
|
'-r[Fetch manifests from depot]:*:package:_pkg5_pkgs_a' \
|
|
'*:package:_pkg5_pkgs'
|
|
;;
|
|
|
|
("image-create")
|
|
_arguments -A "-*" \
|
|
'(-f --force)'{-f,--force}'[Force image creation]' \
|
|
'(-F --full -P --partial -U --user)'{-F,--full}'[Full image]' \
|
|
'(-F --full -P --partial -U --user)'{-P,--partial}'[Partial image]' \
|
|
'(-F --full -P --partial -U --user)'{-U,--user}'[User image]' \
|
|
'(-z --zone)'{-z,--zone}'[Zoned image]' \
|
|
'-k[Path to SSL key]:file:_path_files' \
|
|
'-c[Path to SSL cert]:file:_path_files' \
|
|
"--no-refresh[Don't refresh catalogs]" \
|
|
"*--variant[Specify image variants]:variant=instance:" \
|
|
"*--facet[Specify image facets]:facet=True/False:" \
|
|
'(-p --publisher)'{-p,--publisher}'[Specify publisher]:prefix=URI:' \
|
|
':directory:_path_files -/'
|
|
;;
|
|
|
|
("change-variant")
|
|
_arguments -A "-*" \
|
|
'-n[Dry run]' \
|
|
'-q[Quiet'] \
|
|
'-v[Verbose'] \
|
|
'-g[Specify additional source of packages]:source:_path_files -/' \
|
|
'--accept[Accept all licenses]' \
|
|
'--licenses[Display all licenses]' \
|
|
$be_opts \
|
|
"*:variant:_values -s , 'variant' $(pkg -R $pkg5_root variant -H | awk '{print $1}')" \
|
|
;;
|
|
|
|
("change-facet")
|
|
_arguments -A "-*" \
|
|
'-n[Dry run]' \
|
|
'-q[Quiet'] \
|
|
'-v[Verbose'] \
|
|
'-g[Specify additional source of packages]:source:_path_files -/' \
|
|
'--accept[Accept all licenses]' \
|
|
'--licenses[Display all licenses]' \
|
|
$be_opts \
|
|
"*:facet:_values -s , 'facet' $(pkg -R $pkg5_root facet -H | awk '{print $1}')" \
|
|
;;
|
|
|
|
("variant")
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'*:variant:_pkg5_variants'
|
|
;;
|
|
|
|
("facet")
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'*:facet:_pkg5_facets'
|
|
;;
|
|
|
|
("avoid")
|
|
_arguments -A "-*" \
|
|
'*:package:_pkg5_pkgs_a'
|
|
;;
|
|
|
|
("unavoid")
|
|
_arguments -A "-*" \
|
|
'*:package:_pkg5_avoided_pkgs'
|
|
;;
|
|
|
|
("set-property")
|
|
_arguments -A "-*" \
|
|
':property:_values "property" $image_properties' \
|
|
':value:'
|
|
;;
|
|
|
|
("add-property-value")
|
|
_arguments -A "-*" \
|
|
':property:_values "property" $image_properties' \
|
|
':value:'
|
|
;;
|
|
|
|
("remove-property-value")
|
|
_arguments -A "-*" \
|
|
':property:(${image_properties%%\:*})' \
|
|
':value:'
|
|
;;
|
|
|
|
("unset-property")
|
|
_arguments -A "-*" \
|
|
'*:property:(${image_properties%%\:*})'
|
|
;;
|
|
|
|
("property")
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'*:property:(${image_properties%%\:*})'
|
|
;;
|
|
|
|
("set-publisher")
|
|
_arguments -A "-*" \
|
|
'-P[Make preferred]' \
|
|
'(-e --enable)'{-e,--enable}'[Enable publisher]' \
|
|
'(-d --disable)'{-d,--disable}'[Disable publisher]' \
|
|
'(-g --add-origin)'{-g,--add-origin}'[Add origin URI]:uri:' \
|
|
'(-G --remove-origin)'{-G,--remove-origin}'[Remove origin URI]:uri:' \
|
|
'(-m --add-mirror)'{-m,--add-mirror}'[Add mirror URI]:uri:' \
|
|
'(-M --remove-mirror)'{-M,--remove-mirror}'[Remove mirror URI]:uri:' \
|
|
'-p[Repository URI]:url:' \
|
|
"--no-refresh[Don't refresh catalogs]" \
|
|
'--reset-uuid[Reset the image UUID for this publisher]' \
|
|
'--sticky[Make this publisher sticky]' \
|
|
'--non-sticky[Make this publisher non-sticky]' \
|
|
'--search-after[Set publisher search-order]:publisher:_pkg5_pubs' \
|
|
'--search-before[Set publisher search-order]:publisher:_pkg5_pubs' \
|
|
'--search-first[set the specified publisher first in the search order]' \
|
|
'--approve-ca-cert[Add trusted CA certificate]:CA cert path:_path_files' \
|
|
'--revoke-ca-cert[Revoke CA certificate]:CA cert hash:(${${certs#/etc/openssl/certs/}%.0})' \
|
|
'--unset-ca-cert[Remove trusted CA certificate]:CA cert hash:' \
|
|
'--set-property[Set publisher property]:property:_values "property" $publisher_properties' \
|
|
'--unset-property[Remove publisher property]:property:(${publisher_properties%%\:*})' \
|
|
'--add-property-value[Add publisher property value]:property:_values "property" $publisher_properties' \
|
|
'--remove-property-value[Remove publisher property value]:property:(${publisher_properties%%\:*})' \
|
|
':publisher:_pkg5_pubs'
|
|
;;
|
|
|
|
("unset-publisher")
|
|
_arguments -A "-*" \
|
|
'*:publisher:_pkg5_pubs'
|
|
;;
|
|
|
|
("publisher")
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'-P[Display only preferred publisher]' \
|
|
'-n[Display only enabled publishers]' \
|
|
'*:publisher:_pkg5_pubs'
|
|
;;
|
|
|
|
("history")
|
|
local -a hist_columns
|
|
hist_columns=(
|
|
"be" "be_uuid" "client" "client_ver" "command" "finish"
|
|
"id" "new_be" "new_be_uuid" "operation" "outcome"
|
|
"reason" "snapshot" "start" "time" "user"
|
|
)
|
|
_arguments -A "-*" \
|
|
'-H[Omit headers]' \
|
|
'-l[Long history]' \
|
|
'-n[Last n records]:number:' \
|
|
'-o[Column]:number:_values -s , "column" $hist_columns' \
|
|
'-t[Time range]'
|
|
;;
|
|
|
|
("freeze"|"unfreeze")
|
|
;;
|
|
|
|
("mediator"|"set-mediator"|"unset-mediator")
|
|
;;
|
|
|
|
(*)
|
|
_message "unknown pkg subcommand: $service" ;;
|
|
|
|
esac
|
|
}
|
|
|
|
_pkg5 "$@"
|