#!/usr/bin/env python
#
# Copyright 2019 Google LLC
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


"""Check the DEPS file for correctness."""


import os
import re
import subprocess
import sys

import utils


INFRA_BOTS_DIR = os.path.dirname(os.path.realpath(__file__))
SKIA_DIR = os.path.abspath(os.path.join(INFRA_BOTS_DIR, os.pardir, os.pardir))


def main():
  """Load the DEPS file and verify that all entries are valid."""
  # Find gclient.py and run that instead of simply "gclient", which calls into
  # update_depot_tools.
  gclient = subprocess.check_output([utils.WHICH, utils.GCLIENT])
  gclient_py = os.path.join(os.path.dirname(gclient), 'gclient.py')
  python = sys.executable or 'python'

  # Obtain the DEPS mapping.
  output = subprocess.check_output(
      [python, gclient_py, 'revinfo'], cwd=SKIA_DIR)

  # Check each entry.
  errs = []
  for e in output.rstrip().splitlines():
    split = e.split(': ')
    if len(split) != 2:
      errs.append(
          'Failed to parse `gclient revinfo` output; invalid format: %s' % e)
    if split[0] == 'skia':
      continue
    split = split[1].split('@')
    if len(split) != 2:
      errs.append(
          'Failed to parse `gclient revinfo` output; invalid format: %s' % e)
    repo = split[0]
    rev = split[1]
    if not 'googlesource.com' in repo:
      errs.append(
          'DEPS must be hosted on googlesource.com; %s is not allowed. '
          'See http://go/new-skia-git-mirror' % repo)
    if not re.match(r'^[a-z0-9]{40}$', rev):
      errs.append('%s: "%s" does not look like a commit hash.' % (repo, rev))
  if errs:
    print >> sys.stderr, 'Found problems in DEPS:'
    for err in errs:
      print >> sys.stderr, err
    sys.exit(1)


if __name__ == '__main__':
  main()
