# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Calculate what workon packages have changed since the last build.

A workon package is treated as changed if any of the below are true:
  1) The package is not installed.
  2) A file exists in the associated repository which has a newer modification
     time than the installed package.
  3) The source ebuild has a newer modification time than the installed package.

Some caveats:
  - We do not look at eclasses. This replicates the existing behavior of the
    commit queue, which also does not look at eclass changes.
  - We do not try to fallback to the non-workon package if the local tree is
    unmodified. This is probably a good thing, since developers who are
    "working on" a package want to compile it locally.
  - Portage only stores the time that a package finished building, so we
    aren't able to detect when users modify source code during builds.
"""

import errno
import logging
import multiprocessing
import optparse
import os
try:
  import Queue
except ImportError:
  # Python-3 renamed to "queue".  We still use Queue to avoid collisions
  # with naming variables as "queue".  Maybe we'll transition at some point.
  # pylint: disable=F0401
  import queue as Queue

from chromite.cbuildbot import constants
from chromite.cbuildbot import portage_utilities
from chromite.lib import cros_build_lib
from chromite.lib import git
from chromite.lib import osutils
from chromite.lib import parallel


class WorkonProjectsMonitor(object):
  """Class for monitoring the last modification time of workon projects.

  Members:
    _tasks: A list of the (project, path) pairs to check.
    _result_queue: A queue. When GetProjectModificationTimes is called,
      (project, mtime) tuples are pushed onto the end of this queue.
  """

  def __init__(self, projects):
    """Create a new object for checking what projects were modified and when.

    Args:
      projects: A list of the project names we are interested in monitoring.
    """
    manifest = git.ManifestCheckout.Cached(constants.SOURCE_ROOT)
    self._tasks = []
    for project in set(projects).intersection(manifest.checkouts_by_name):
      for checkout in manifest.FindCheckouts(project):
        self._tasks.append((project, checkout.GetPath(absolute=True)))
    self._result_queue = multiprocessing.Queue(len(self._tasks))

  def _EnqueueProjectModificationTime(self, project, path):
    """Calculate the last time that this project was modified, and enqueue it.

    Args:
      project: The project to look at.
      path: The path associated with the specified project.
    """
    if os.path.isdir(path):
      self._result_queue.put((project, self._LastModificationTime(path)))

  def _LastModificationTime(self, path):
    """Calculate the last time a directory subtree was modified.

    Args:
      path: Directory to look at.
    """
    cmd = 'find . -name .git -prune -o -printf "%T@\n" | sort -nr | head -n1'
    ret = cros_build_lib.RunCommand(cmd, cwd=path, shell=True, print_cmd=False,
                                    capture_output=True)
    return float(ret.output) if ret.output else 0

  def GetProjectModificationTimes(self):
    """Get the last modification time of each specified project.

    Returns:
      A dictionary mapping project names to last modification times.
    """
    task = self._EnqueueProjectModificationTime
    parallel.RunTasksInProcessPool(task, self._tasks)

    # Create a dictionary mapping project names to last modification times.
    # All of the workon projects are already stored in the queue, so we can
    # retrieve them all without waiting any longer.
    mtimes = {}
    while True:
      try:
        project, mtime = self._result_queue.get_nowait()
      except Queue.Empty:
        break
      mtimes[project] = mtime
    return mtimes


class WorkonPackageInfo(object):
  """Class for getting information about workon packages.

  Members:
    cp: The package name (e.g. chromeos-base/power_manager).
    mtime: The modification time of the installed package.
    project: The project associated with the installed package.
    src_ebuild_mtime: The modification time of the source ebuild.
  """

  def __init__(self, cp, mtime, projects, src_ebuild_mtime):
    self.cp = cp
    self.pkg_mtime = int(mtime)
    self.projects = projects
    self.src_ebuild_mtime = src_ebuild_mtime


def ListWorkonPackages(board, host, all_opt=False):
  """List the packages that are currently being worked on.

  Args:
    board: The board to look at. If host is True, this should be set to None.
    host: Whether to look at workon packages for the host.
    all_opt: Pass --all to cros_workon. For testing purposes.
  """
  cmd = [os.path.join(constants.CROSUTILS_DIR, 'cros_workon'), 'list']
  cmd.extend(['--host'] if host else ['--board', board])
  if all_opt:
    cmd.append('--all')
  result = cros_build_lib.RunCommand(cmd, print_cmd=False, capture_output=True)
  return result.output.split()


def ListWorkonPackagesInfo(board, host):
  """Find the specified workon packages for the specified board.

  Args:
    board: The board to look at. If host is True, this should be set to None.
    host: Whether to look at workon packages for the host.

  Returns:
    A list of unique packages being worked on.
  """
  # Import portage late so that this script can be imported outside the chroot.
  # pylint: disable=F0401
  import portage.const
  packages = ListWorkonPackages(board, host)
  if not packages:
    return []
  results = {}
  install_root = cros_build_lib.GetSysroot(board=board)
  vdb_path = os.path.join(install_root, portage.const.VDB_PATH)
  buildroot, both = constants.SOURCE_ROOT, constants.BOTH_OVERLAYS
  for overlay in portage_utilities.FindOverlays(both, board, buildroot):
    for filename, projects in portage_utilities.GetWorkonProjectMap(overlay,
                                                                    packages):
      # chromeos-base/power_manager/power_manager-9999
      # cp = chromeos-base/power_manager
      # cpv = chromeos-base/power_manager-9999
      category, pn, p = portage_utilities.SplitEbuildPath(filename)
      cp = '%s/%s' % (category, pn)
      cpv = '%s/%s' % (category, p)

      # Get the time the package finished building. TODO(build): Teach Portage
      # to store the time the package started building and use that here.
      pkg_mtime_file = os.path.join(vdb_path, cpv, 'BUILD_TIME')
      try:
        pkg_mtime = int(osutils.ReadFile(pkg_mtime_file))
      except EnvironmentError as ex:
        if ex.errno != errno.ENOENT:
          raise
        pkg_mtime = 0

      # Get the modificaton time of the ebuild in the overlay.
      src_ebuild_mtime = os.lstat(os.path.join(overlay, filename)).st_mtime

      # Write info into the results dictionary, overwriting any previous
      # values. This ensures that overlays override appropriately.
      results[cp] = WorkonPackageInfo(cp, pkg_mtime, projects, src_ebuild_mtime)

  return results.values()


def ListModifiedWorkonPackages(board, host):
  """List the workon packages that need to be rebuilt.

  Args:
    board: The board to look at. If host is True, this should be set to None.
    host: Whether to look at workon packages for the host.
  """
  packages = ListWorkonPackagesInfo(board, host)
  if packages:
    projects = []
    for info in packages:
      projects.extend(info.projects)
    mtimes = WorkonProjectsMonitor(projects).GetProjectModificationTimes()
    for info in packages:
      mtime = int(max([mtimes.get(p, 0) for p in info.projects] +
                      [info.src_ebuild_mtime]))
      if mtime >= info.pkg_mtime:
        yield info.cp


def _ParseArguments(argv):
  parser = optparse.OptionParser(usage='USAGE: %prog [options]')

  parser.add_option('--board', default=None,
                    dest='board',
                    help='Board name')
  parser.add_option('--host', default=False,
                    dest='host', action='store_true',
                    help='Look at host packages instead of board packages')

  flags, remaining_arguments = parser.parse_args(argv)
  if not flags.board and not flags.host:
    parser.print_help()
    cros_build_lib.Die('--board or --host is required')
  if flags.board is not None and flags.host:
    parser.print_help()
    cros_build_lib.Die('--board and --host are mutually exclusive')
  if remaining_arguments:
    parser.print_help()
    cros_build_lib.Die('Invalid arguments')
  return flags


def main(argv):
  logging.getLogger().setLevel(logging.INFO)
  flags = _ParseArguments(argv)
  modified = ListModifiedWorkonPackages(flags.board, flags.host)
  print ' '.join(sorted(modified))
