#!/usr/bin/env python3
# -*- coding: utf8 -*-

import argparse
from collections import deque
from pycman import config



parser = argparse.ArgumentParser(description='List installed packages that depend on the given packages, either directly or indirectly.')
parser.add_argument(
  'pkgs', metavar='<pkgname>', nargs='+',
  help='the target dependency'
)
parser.add_argument(
  '-c', '--config', metavar='<path>', default='/etc/pacman.conf',
  help='Pacman configuration file'
)
parser.add_argument(
  '-e', '--explicit', action='store_true',
  help='Only list explicitly installed packages.',
)
parser.add_argument(
  '-d', '--deps', dest='implicit', action='store_true',
  help='Only list implicitly installed packages, i.e. dependencies.',
)


def main(args=None):
  pargs = parser.parse_args(args)
  roots = pargs.pkgs
  # Initialize the Pacman database.
  h = config.init_with_config(pargs.config)

  # Find all installed packages that depend on the given packages.
  queue =deque(roots)
  checked = set()
  explicit = set()
  implicit = set()
  while queue:
    pkg = queue.popleft()
    checked.add(pkg)
    pkgdata = h.get_localdb().get_pkg(pkg)
    if pkgdata.reason == 0:
      explicit.add(pkgdata.name)
    else:
      implicit.add(pkgdata.name)
    for p in pkgdata.compute_requiredby():
      if p not in checked and p not in queue:
        queue.append(p)

  if pargs.explicit:
    pkgs = explicit
  elif pargs.implicit:
    pkgs = implicit
  else:
    pkgs = explicit | implicit
  print(' '.join(sorted(pkgs)))



if __name__ == "__main__":
  try:
    main()
  except KeyboardInterrupt:
    pass

# vim: set ts=4 sw=4 tw=0 noet:
