• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2013 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import os
6import re
7import sys
8
9def _GetTelemetryPath(input_api):
10  return os.path.join(
11      os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(
12      input_api.PresubmitLocalPath())))), 'tools', 'telemetry')
13
14def LoadSupport(input_api):
15  if 'cloud_storage' not in globals():
16    # Avoid leaking changes to global sys.path.
17    _old_sys_path = sys.path
18    try:
19      telemetry_path = _GetTelemetryPath(input_api)
20      sys.path = [telemetry_path] + sys.path
21      from telemetry.util import cloud_storage
22      globals()['cloud_storage'] = cloud_storage
23    finally:
24      sys.path = _old_sys_path
25
26  return globals()['cloud_storage']
27
28
29def _GetFilesNotInCloud(input_api):
30  """Searches for .sha1 files and checks to see if they have already
31  been uploaded Cloud Storage. Returns a list of those that have not.
32  """
33  hash_paths = []
34  for affected_file in input_api.AffectedFiles(include_deletes=False):
35    hash_path = affected_file.AbsoluteLocalPath()
36    _, extension = os.path.splitext(hash_path)
37    if extension == '.sha1':
38      hash_paths.append(hash_path)
39  if not hash_paths:
40    return []
41
42  cloud_storage = LoadSupport(input_api)
43
44  # Look in both buckets, in case the user uploaded the file manually.
45  hashes_in_cloud_storage = cloud_storage.List(cloud_storage.PUBLIC_BUCKET)
46  try:
47    hashes_in_cloud_storage += cloud_storage.List(cloud_storage.INTERNAL_BUCKET)
48  except (cloud_storage.PermissionError, cloud_storage.CredentialsError):
49    pass
50
51  files = []
52  for hash_path in hash_paths:
53    file_hash = cloud_storage.ReadHash(hash_path)
54    if file_hash not in hashes_in_cloud_storage:
55      files.append((hash_path, file_hash))
56
57  return files
58
59
60def _VerifyFilesInCloud(input_api, output_api):
61  """Fails presubmit if any .sha1 files have not been previously uploaded to
62  Cloud storage.
63  """
64  results = []
65  hash_paths = _GetFilesNotInCloud(input_api)
66  file_paths = []
67  for hash_path, _ in hash_paths:
68    results.append(output_api.PresubmitError(
69        'Attemping to commit hash file, but corresponding '
70        'data file is not in Cloud Storage: %s' % hash_path))
71    file_paths.append(os.path.splitext(hash_path)[0])
72
73  if len(file_paths) > 0:
74    upload_script_path = os.path.join(
75        _GetTelemetryPath(input_api), 'cloud_storage')
76    results.append(output_api.PresubmitError(
77          'To upload missing files, Run: \n'
78          '%s upload %s google-only' %
79          (upload_script_path, ' '.join(file_paths))))
80  return results
81
82
83def CheckChangeOnUpload(input_api, output_api):
84  results = _VerifyFilesInCloud(input_api, output_api)
85  return results
86
87
88def CheckChangeOnCommit(input_api, output_api):
89  results = _VerifyFilesInCloud(input_api, output_api)
90  return results
91