You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.7 KiB
Python
114 lines
3.7 KiB
Python
#!/usr/bin/env python
|
|
# Copyright (c) 2018 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.
|
|
|
|
from __future__ import print_function
|
|
|
|
import scm
|
|
import subprocess2
|
|
import sys
|
|
|
|
from third_party import colorama
|
|
|
|
|
|
APP_URL = 'https://cit-cli-metrics.appspot.com'
|
|
|
|
NOTICE_COUNTDOWN_HEADER = (
|
|
'*****************************************************\n'
|
|
'* METRICS COLLECTION WILL START IN %2d EXECUTIONS *'
|
|
)
|
|
NOTICE_COLLECTION_HEADER = (
|
|
'*****************************************************\n'
|
|
'* METRICS COLLECTION IS TAKING PLACE *'
|
|
)
|
|
NOTICE_FOOTER = (
|
|
'* *\n'
|
|
'* For more information, and for how to disable this *\n'
|
|
'* message, please see metrics.README.md in your *\n'
|
|
'* depot_tools checkout. *\n'
|
|
'*****************************************************\n'
|
|
)
|
|
|
|
KNOWN_PROJECT_URLS = {
|
|
'https://chrome-internal.googlesource.com/chrome/ios_internal',
|
|
'https://chrome-internal.googlesource.com/infra/infra_internal',
|
|
'https://chromium.googlesource.com/breakpad/breakpad',
|
|
'https://chromium.googlesource.com/chromium/src',
|
|
'https://chromium.googlesource.com/chromium/tools/depot_tools',
|
|
'https://chromium.googlesource.com/crashpad/crashpad',
|
|
'https://chromium.googlesource.com/external/gyp',
|
|
'https://chromium.googlesource.com/external/naclports',
|
|
'https://chromium.googlesource.com/infra/goma/client',
|
|
'https://chromium.googlesource.com/infra/infra',
|
|
'https://chromium.googlesource.com/native_client/',
|
|
'https://chromium.googlesource.com/syzygy',
|
|
'https://chromium.googlesource.com/v8/v8',
|
|
'https://dart.googlesource.com/sdk',
|
|
'https://pdfium.googlesource.com/pdfium',
|
|
'https://skia.googlesource.com/buildbot',
|
|
'https://skia.googlesource.com/skia',
|
|
'https://webrtc.googlesource.com/src',
|
|
}
|
|
|
|
|
|
def get_python_version():
|
|
"""Return the python version in the major.minor.micro format."""
|
|
return '{v.major}.{v.minor}.{v.micro}'.format(v=sys.version_info)
|
|
|
|
|
|
def return_code_from_exception(exception):
|
|
"""Returns the exit code that would result of raising the exception."""
|
|
if exception is None:
|
|
return 0
|
|
if isinstance(exception[1], SystemExit):
|
|
return exception[1].code
|
|
return 1
|
|
|
|
|
|
def seconds_to_weeks(duration):
|
|
"""Transform a |duration| from seconds to weeks approximately.
|
|
|
|
Drops the lowest 19 bits of the integer representation, which ammounts to
|
|
about 6 days.
|
|
"""
|
|
return int(duration) >> 19
|
|
|
|
|
|
def get_repo_timestamp(path_to_repo):
|
|
"""Get an approximate timestamp for the upstream of |path_to_repo|.
|
|
|
|
Returns the top two bits of the timestamp of the HEAD for the upstream of the
|
|
branch path_to_repo is checked out at.
|
|
"""
|
|
# Get the upstream for the current branch. If we're not in a branch, fallback
|
|
# to HEAD.
|
|
try:
|
|
upstream = scm.GIT.GetUpstreamBranch(path_to_repo)
|
|
except subprocess2.CalledProcessError:
|
|
upstream = 'HEAD'
|
|
|
|
# Get the timestamp of the HEAD for the upstream of the current branch.
|
|
p = subprocess2.Popen(
|
|
['git', '-C', path_to_repo, 'log', '-n1', upstream, '--format=%at'],
|
|
stdout=subprocess2.PIPE, stderr=subprocess2.PIPE)
|
|
stdout, _ = p.communicate()
|
|
|
|
# If there was an error, give up.
|
|
if p.returncode != 0:
|
|
return None
|
|
|
|
# Get the age of the checkout in weeks.
|
|
return seconds_to_weeks(stdout.strip())
|
|
|
|
|
|
def print_notice(countdown):
|
|
"""Print a notice to let the user know the status of metrics collection."""
|
|
colorama.init()
|
|
print(colorama.Fore.RED + '\033[1m', file=sys.stderr)
|
|
if countdown:
|
|
print(NOTICE_COUNTDOWN_HEADER % countdown, file=sys.stderr)
|
|
else:
|
|
print(NOTICE_COLLECTION_HEADER, file=sys.stderr)
|
|
print(NOTICE_FOOTER + colorama.Style.RESET_ALL, file=sys.stderr)
|