#!/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)