#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 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.

"""Linter for various OWNERS files."""

from __future__ import print_function

import os
import sys

TOP_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))

# Find chromite!
sys.path.insert(0, os.path.join(TOP_DIR, '..', '..'))

from chromite.lib import commandline
from chromite.lib import git
from chromite.lib import cros_logging as logging


def GetActiveProjects():
  """Return the list of active projects."""
  # Look at all the paths (files & dirs) in the top of the git repo.  This way
  # we ignore local directories devs created that aren't actually committed.
  cmd = ['ls-tree', '--name-only', '-z', 'HEAD']
  result = git.RunGit(TOP_DIR, cmd)

  # Split the output on NULs to avoid whitespace/etc... issues.
  paths = result.stdout.split('\0')

  # ls-tree -z will include a trailing NUL on all entries, not just seperation,
  # so filter it out if found (in case ls-tree behavior changes on us).
  for path in [x for x in paths if x]:
    if os.path.isdir(os.path.join(TOP_DIR, path)):
      yield path


def CheckSubdirs():
  """Check the subdir OWNERS files exist."""
  # Legacy projects that don't have an OWNERS file.
  # Someone should claim them :D.
  LEGACYLIST = (
      'container_utils',
      'cros-fuzz',
      'screenshot',
  )

  ret = 0
  for proj in GetActiveProjects():
    path = os.path.join(TOP_DIR, proj, 'OWNERS')
    if os.path.exists(path):
      if proj in LEGACYLIST:
        logging.error('*** Project "%s" is in no-OWNERS LEGACYLIST, but '
                      ' actually has one. Please remove it from LEGACYLIST!',
                      proj)
    else:
      if not proj in LEGACYLIST:
        logging.error('*** Project "%s" needs an OWNERS file', proj)
        ret = 1
  return ret


def GetParser():
  """Return an argument parser."""
  parser = commandline.ArgumentParser(description=__doc__)
  return parser


def main(argv):
  """The main func!"""
  parser = GetParser()
  opts = parser.parse_args(argv)
  opts.Freeze()

  return CheckSubdirs()


if __name__ == '__main__':
  commandline.ScriptWrapperMain(lambda _: main)
