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