#compdef pkg_add pkg_create pkg_delete pkg_info # James Devenish # Fri, 3 Jan 2003 16:35:32 +0800 # Posted to mailing list for opinions. # Replaced single quotes with double quotes. # (for readability/neatness when there are nested quote marks). # Detabbed. # OpenBSD compatability for pkg_delete, pkg_info, pkg_create options. # OpenBSD compatability for pkg_add packages list (requires $MACHTYPE, allows .tar). # _bsd_pkg_pkgs allow symlinks to directories in addition to directories # (rarely useful, but helped once when I was in a pinch). # - from James Devenish # _bsd_pkg_pkgfiles no longer includes matches from a lone empty path element # (fixes directories matching /* from appearing when cwd is not /) # - from Oliver Kiddle , arising out of a query from JD # includes abbreviated completion for pkg_add plus pkg_list # - some portions taken from Bart Schaefer local portsdir pkgsdir paths (( $+functions[_bsd_pkg_makepaths] )) || _bsd_pkg_makepaths() { case $OSTYPE in netbsd*) portsdir=${PORTSDIR:-/usr/pkgsrc} pkgsdir=${PACKAGES:-$portsdir/packages}/All paths=( . $pkgsdir ${(s.:.)PKG_PATH} ) ;; openbsd*) portsdir=${PORTSDIR:-/usr/ports} pkgsdir=${PACKAGES:-$portsdir/packages}/$(arch -s) paths=( . $pkgsdir/All $pkgsdir ${(s.:.)PKG_PATH} ) ;; *) portsdir=${PORTSDIR:-/usr/ports} pkgsdir=${PACKAGES:-$portsdir/packages}/All paths=( . $pkgsdir ${(s.:.)PKG_PATH} ) ;; esac } # files that could be package files: (( $+functions[_bsd_pkg_pkgfiles] )) || _bsd_pkg_pkgfiles() { local ret=1 portsdir pkgsdir paths _bsd_pkg_makepaths case $OSTYPE in openbsd*) _files "$@" -W paths -g '*.(t[bg]z|tar)' ;; *) _files "$@" -W paths -g '*.t[bg]z' ;; esac return ret } # names of packages that are currently installed: (( $+functions[_bsd_pkg_pkgs] )) || _bsd_pkg_pkgs() { compadd "$@" - ${PKG_DBDIR:-/var/db/pkg}/*(-/:t) } (( $+functions[_bsd_pkg_pkgs_and_files] )) || _bsd_pkg_pkgs_and_files() { local ret=1 if (( $words[(I)-*F*] )); then _files "$@" && ret=0 else _bsd_pkg_pkgs "$@" && ret=0 fi return ret } _bsd_pkg() { local flags case "$service" in pkg_add) flags=( "-f[force installation]" "-I[don't execute installation scripts]" "-M[run in master mode]" "-n[don't really install packages]" "-p[specify prefix]:prefix directory:_files -/" "-R[don't record]" "-S[run in slave mode]" "-t[specify mktemp template]:mktemp template:_files -/" "-v[be verbose]" ) case "$OSTYPE" in freebsd*) flags=( $flags[@] "-r[fetch from remote site]" ) ;; netbsd*) flags=( $flags[@] "-u[update]" "-V[show version and exit]" ) ;; esac _arguments -s \ $flags[@] \ "*:package to install:_bsd_pkg_pkgfiles" ;; pkg_create) flags=( "-f[specify plist file]:plist file:_files" "(-b)-c[specify comment file]:comment file:_files" "(-b)-d[specify descr file]:descr file:_files" "-Y[assume YES for any questions asked]" "-N[assume NO for any questions asked]" "(-b)-O[packing list only mode]" "-v[be verbose]" "-h[force tar to follow symlinks]" "(-b)-i[specify pre-install script]:pre-install script:_files" "(-b)-P[specify initial dependencies]:dependencies:_bsd_pkg_pkgs" "(-b)-p[specify prefix]:prefix directory:_files -/" "(-b)-k[specify deinstall script]:deinstall script:_files" "(-b)-r[specify req script]:req script:_files" "(-b)-t[specify mktemp template]:mktemp template:_files" "(-b)-X[specify exclude file]:exclude file for tar:_files" "(-b)-D[specify message file]:message file:_files" "(-b)-m[specify mtree file]:mtree file:_files" ) case "$OSTYPE" in netbsd*) # NetBSD users, improve me! flags=( $flags[@] "*:package name:_bsd_pkg_pkgs" ) ;; openbsd*) # TODO check -b flags=( $flags[@] "-C[specify conflict list]:conflicts:_bsd_pkg_pkgs" "-s[fake prefix]:fake destination directory:_files -/" "*:package file name:_files" ) ;; freebsd*) flags=( $flags[@] "(-b)-I[specify post-install script]:post-install script:_files" "(-b)-s[specify source directory]:source directory:_files -/" "(-b)-K[specify post-deinstall script]:post-deinstall script:_files" "(-b)-o[specify origin]:origin:_files -W ${PORTSDIR\:-/usr/ports} -/" "-j[use bzip2]" "-z[use gzip]" "(-c -d -O -i -I -P -p -k -K -r -s -t -X -D -m -o)-b[specify pkgname]:pkgname:_bsd_pkg_pkgs" "*:package file name:_files" ) ;; esac _arguments -s \ $flags[@] ;; pkg_delete) flags=( "-D[don't execute deinstallation scripts]" "-d[remove empty directories]" "-f[force deinstallation]" "-n[don't really deinstall packages]" "-p[specify prefix]:prefix directory:_files -/" "-v[be verbose]" ) case "$OSTYPE" in freebsd*) flags=( $flags[@] "(:)-a[delete all installed packages]" "-G[do not expand glob patterns]" "-i[be interactive]" "-r[delete recursively]" "-x[use regular expression]" ) ;; netbsd*) flags=( $flags[@] "(:)-a[delete all installed packages]" "-F[specify each package by an installed file]" "-i[be interactive]" "-O[only delete the package""s entries]" "-R[delete upward recursively]" "-r[delete recursively]" "-V[show version and exit]" ) ;; esac case "$OSTYPE" in openbsd*) _arguments -s \ $flags[@] \ "*:installed package name:_bsd_pkg_pkgs" ;; *) _arguments -s \ $flags[@] \ "(-a)*:package name:_bsd_pkg_pkgs_and_files" ;; esac ;; pkg_info) flags=( "-c[show comment fields]" "-D[show install-message files]" "-d[show long descriptions]" "-e[test if package is installed]:package name:_bsd_pkg_pkgs" "-f[show packing list instructions]" "-I[show index lines]" "-i[show install scripts]" "-k[show deinstall scripts]" "-L[show full pathnames of files]" "-l[specify prefix string]:prefix string:" "-m[show mtree files]" "-p[show installation prefixes]" "-q[be quiet]" "-R[show list list of installed requiring packages]" "-r[show requirements scripts]" "-v[be verbose]" ) case "$OSTYPE" in freebsd*) flags=( $flags[@] "-G[do not expand glob patterns]" "-g[show files that are modified]" "-o[show origin]" "-s[show total size occupied by each package]" "-t[specify mktemp template]:mktemp template:_files -/" "*-W[show which package the file belongs to]:file:_files" "-x[use regular expression]" ) ;; netbsd*) flags=( $flags[@] "-B[show build information]" "-b[show RCS Id strings]" "-F[specify each package by an installed file]" "-S[show total size occupied by each package and its dependents]" "-s[show total size occupied by each package]" "-V[show version and exit]" ) ;; esac case "$OSTYPE" in openbsd*) _arguments -s \ "(* -)-a[show all installed packages]" \ $flags[@] \ "*:installed package name:_bsd_pkg_pkgs" ;; *) _arguments -s \ "(:)-a[show all installed packages]" \ $flags[@] \ "(-a)*:package name:_bsd_pkg_pkgs_and_files" ;; esac ;; esac } # convert abbreviated package paths to full package paths pkg_add() { setopt localoptions noksharrays noshwordsplit integer i=$ARGC if ((i)); then _bsd_pkg_makepaths while ((i)) do for candidate in $paths do if [[ -f $candidate/$argv[i] ]]; then argv[i]=$candidate/$argv[i] continue fi done ((i--)) done echo pkg_add $* fi command pkg_add $* } _bsd_pkg "$@"