# Copyright (c) 2013 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.
import os
import re
import sys
def _GetTelemetryPath(input_api):
return os.path.join(
os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(
input_api.PresubmitLocalPath())))), 'tools', 'telemetry')
def LoadSupport(input_api):
if 'cloud_storage' not in globals():
# Avoid leaking changes to global sys.path.
_old_sys_path = sys.path
try:
telemetry_path = _GetTelemetryPath(input_api)
sys.path = [telemetry_path] + sys.path
from telemetry.util import cloud_storage
globals()['cloud_storage'] = cloud_storage
finally:
sys.path = _old_sys_path
return globals()['cloud_storage']
def _GetFilesNotInCloud(input_api):
"""Searches for .sha1 files and checks to see if they have already
been uploaded Cloud Storage. Returns a list of those that have not.
"""
hash_paths = []
for affected_file in input_api.AffectedFiles(include_deletes=False):
hash_path = affected_file.AbsoluteLocalPath()
_, extension = os.path.splitext(hash_path)
if extension == '.sha1':
hash_paths.append(hash_path)
if not hash_paths:
return []
cloud_storage = LoadSupport(input_api)
# Look in both buckets, in case the user uploaded the file manually.
hashes_in_cloud_storage = cloud_storage.List(cloud_storage.PUBLIC_BUCKET)
try:
hashes_in_cloud_storage += cloud_storage.List(cloud_storage.INTERNAL_BUCKET)
except (cloud_storage.PermissionError, cloud_storage.CredentialsError):
pass
files = []
for hash_path in hash_paths:
file_hash = cloud_storage.ReadHash(hash_path)
if file_hash not in hashes_in_cloud_storage:
files.append((hash_path, file_hash))
return files
def _VerifyFilesInCloud(input_api, output_api):
"""Fails presubmit if any .sha1 files have not been previously uploaded to
Cloud storage.
"""
results = []
hash_paths = _GetFilesNotInCloud(input_api)
file_paths = []
for hash_path, _ in hash_paths:
results.append(output_api.PresubmitError(
'Attemping to commit hash file, but corresponding '
'data file is not in Cloud Storage: %s' % hash_path))
file_paths.append(os.path.splitext(hash_path)[0])
if len(file_paths) > 0:
upload_script_path = os.path.join(
_GetTelemetryPath(input_api), 'cloud_storage')
results.append(output_api.PresubmitError(
'To upload missing files, Run: \n'
'%s upload %s google-only' %
(upload_script_path, ' '.join(file_paths))))
return results
def CheckChangeOnUpload(input_api, output_api):
results = _VerifyFilesInCloud(input_api, output_api)
return results
def CheckChangeOnCommit(input_api, output_api):
results = _VerifyFilesInCloud(input_api, output_api)
return results