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