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

"""Top-level presubmit script for Chromium.

See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details about the presubmit API built into depot_tools.
"""
PRESUBMIT_VERSION = '2.0.0'

# This line is 'magic' in that git-cl looks for it to decide whether to
# use Python3 instead of Python2 when running the code in this file.
USE_PYTHON3 = True

# This list must be kept in sync with the lists in //.eleventy.js and
# //scripts/upload_lobs.py.
# TODO(dpranke): Figure out how to share these lists to eliminate the
# duplication and need to keep them in sync.

LOB_EXTENSIONS = [
                  '.ai',
                  '.bin',
                  '.bmp',
                  '.bz2',
                  '.crx',
                  '.dia',
                  '.msi',
                  '.gif',
                  '.ico',
                  '.jpg',
                  '.jpeg',
                  '.mp4',
                  '.pdf',
                  '.png',
                  '.PNG',
                  '.swf',
                  '.tar.gz',
                  '.tiff',
                  '.webp',
                  '.xcf',
                  '.xlsx',
                  '.zip'
                  ]

import os

def CheckPatchFormatted(input_api, output_api):
  return input_api.canned_checks.CheckPatchFormatted(input_api, output_api)


def CheckChangeHasDescription(input_api, output_api):
  return input_api.canned_checks.CheckChangeHasDescription(
      input_api, output_api)

def CheckForLobs(input_api, output_api):
  output_status = []
  for file in input_api.change.AffectedFiles():
    # The tar.gz for example prevents using a hashmap to look up the extension
    for ext in LOB_EXTENSIONS:
      if str(file).endswith(ext) and file.Action() != 'D':
        error_msg = ('The file \'{file_name}\' is a binary that has not been '
          'uploaded to GCE. Please run:\n\tscripts/upload_lobs.py '
          '"{file_name}"\nand commit {file_name}.sha1 instead'
          .format(file_name = file.LocalPath()))

        error = output_api.PresubmitError(error_msg)
        output_status.append(error)
        break

  return output_status

def CheckLobIgnores(input_api, output_api):
  output_status = []
  with open("site/.gitignore", 'r+') as ignore_file:
    ignored_lobs = set(line.rstrip() for line in ignore_file.readlines())

    for ignored_lob in ignored_lobs:
      lob_sha_file = os.path.join('site', ignored_lob + '.sha1')
      if not os.path.exists(lob_sha_file):
        error_msg = ('The sha1 file \'{removed_file}\' no longer exists, '
          'please remove {ignored_file} from site/.gitignore'
          .format(removed_file = lob_sha_file, ignored_file = ignored_lob))

        error = output_api.PresubmitError(error_msg)
        output_status.append(error)
  return output_status