# -*- 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, )