#compdef pkg_replace

(( $+_pkg_replace_portsdir )) || {
  case $OSTYPE in
  freebsd*|openbsd*)
    _pkg_replace_portsdir=${PORTSDIR:-/usr/ports} ;;
  *)
    _pkg_replace_portsdir=${PKGSRCDIR:-/usr/pkgsrc} ;;
  esac
}

(( $+functions[_pkg_replace_pkgs] )) ||
_pkg_replace_pkgs() {
  compadd "$@" -- ${PKG_DBDIR:-/var/db/pkg}/*(/:t)
}

(( $+functions[_pkg_replace_args] )) ||
_pkg_replace_args() {
  local ret=1

  if (( $words[(I)-*N*] )); then
   _files -/ -W "${_pkg_replace_portsdir}" && ret=0
  elif compset -P "*.t[bg]z"; then
    ret=0
  else
    if compset -P 1 "*="; then
      compadd -S '/' -- "${_pkg_replace_portsdir}" && ret=0
    else
      _pkg_replace_pkgs && ret=0
    fi
    _files -g "*.t[bg]z(-.)" && ret=0
  fi

  return ret
}

local flags
flags=(
  '(:)-a[all installed packages]'
  '(-B)-b[keep backup packages of the old versions]'
  '(-b)-B[do not backup old packages]'
  '(-w)-c[clean before each build]'
  '(-W)-C[clean after each install (default)]'
  '-f[force replace]'
  '-F[fetch distfiles or packages]'
  '-i[be interactive]'
  '-l[save the results to a file]:save the results as..:_files'
  '-L[save the logs to files]:save the logs as..:_files'
  '*-m[specify make arguments]:arguments for make:'
  '-n[do not actually replace packages]'
  '-N[install new packages]'
  '-p[do make package]'
  '-P[use packages]'
  '-q[do not read pkg_replace.conf]'
  '-r[do recursively]'
  '-R[do upward recursively]'
  '-u[do not preserve old shared libraries]'
  '-v[be verbose]'
  '-V[report whether packages require updating]'
  '(-c)-w[do not clean before each build (default)]'
  '(-C)-W[do not clean after each install]'
  '*-x[exclude packages]:exclude pattern:_pkg_replace_pkgs'
)

_arguments -s \
  $flags[@] \
  '(-a)*:package name:_pkg_replace_args'
