| #!/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. |
| |
| import scm |
| import subprocess2 |
| import sys |
| |
| from third_party import colorama |
| |
| |
| 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' |
| ) |
| |
| |
| 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' |
| if countdown: |
| print NOTICE_COUNTDOWN_HEADER % countdown |
| else: |
| print NOTICE_COLLECTION_HEADER |
| print NOTICE_FOOTER + colorama.Style.RESET_ALL |