| # -*- coding: utf-8 -*- |
| # Copyright 2020 The ChromiumOS Authors |
| # 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.""" |
| |
| |
| import datetime |
| import os |
| import subprocess |
| import sys |
| |
| import get_llvm_hash |
| import git_llvm_rev |
| |
| |
| 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/" + git_llvm_rev.MAIN_BRANCH, |
| ], |
| 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"], check=False, cwd=checkout |
| ) |
| if result.returncode: |
| print( |
| "Sync failed somehow; hoping that things are fresh enough, then...", |
| file=sys.stderr, |
| ) |