#compdef pkg_replace

(( $+functions[_bsd_ports] )) ||
_bsd_ports() {
  local portsdir

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

  compadd -S '/' -- "${portsdir}"
}

(( $+functions[_pkg_replace_init] )) ||
_pkg_replace_init() {
  local service=
  _bsd_pkg
}

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

  if compset -P "*.t[bg]z"; then
    ret=0
  else
    if compset -P 1 "*="; then
      _bsd_ports && ret=0
    else
      _bsd_pkg_pkgs && ret=0
    fi
    _files -g "*.t[bg]z(-.)" && ret=0
  fi

  return ret
}

_pkg_replace_init

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]'
  '-i[be interactive]'
  '-I[use the INDEX file]'
  '-l[save the results to a file]:save the results as..:_files'
  '*-m[specify make(1) arguments]:arguments to append to each make(1) command:'
  '-n[do not actually replace 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:_bsd_pkg_pkgs'
)

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