# 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

LOB_EXTENSIONS = ['ai','bin','bmp','bz2','crt','crx','dia','msi','gif',
                  'graffle','ico','jpg','jpeg','md','mp4','ninja','pdf',
                  'plist','png','PNG','svg','swf','tar.gz','tiff','_trace',
                  '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):
        error_msg = ('The file \'{file_name}\' is a binary that has not been '
          'uploaded to GCE. Please run:\n\tupload-lob.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