| # -*- coding: utf-8 -*- |
| # Copyright 2020 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Module for manipulating llvm-project-copy. Generally intended for tests.""" |
| |
| from __future__ import print_function |
| |
| import datetime |
| import os |
| import subprocess |
| import sys |
| |
| import get_llvm_hash |
| |
| |
| def get_location() -> str: |
| """Gets the absolute path for llvm-project-copy.""" |
| my_dir = os.path.dirname(os.path.abspath(__file__)) |
| return os.path.join(my_dir, 'llvm-project-copy') |
| |
| |
| def ensure_up_to_date(): |
| """Ensures that llvm-project-copy is checked out and semi-up-to-date.""" |
| |
| checkout = get_location() |
| if not os.path.isdir(checkout): |
| print( |
| 'No llvm-project exists locally; syncing it. This takes a while.', |
| file=sys.stderr) |
| actual_checkout = get_llvm_hash.GetAndUpdateLLVMProjectInLLVMTools() |
| assert checkout == actual_checkout, '%s != %s' % (actual_checkout, checkout) |
| |
| commit_timestamp = subprocess.check_output( |
| ['git', 'log', '-n1', '--format=%ct', 'origin/master'], |
| cwd=checkout, |
| encoding='utf-8') |
| |
| commit_time = datetime.datetime.fromtimestamp(int(commit_timestamp.strip())) |
| now = datetime.datetime.now() |
| |
| time_since_last_commit = now - commit_time |
| |
| # Arbitrary, but if it's been more than 2d since we've seen a commit, it's |
| # probably best to bring us up-to-date. |
| if time_since_last_commit <= datetime.timedelta(days=2): |
| return |
| |
| print( |
| '%d days have elapsed since the last commit to %s; auto-syncing' % |
| (time_since_last_commit.days, checkout), |
| file=sys.stderr) |
| |
| result = subprocess.run(['git', 'fetch', 'origin'], cwd=checkout) |
| if result.returncode: |
| print( |
| 'Sync failed somehow; hoping that things are fresh enough, then...', |
| file=sys.stderr) |