#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Build script that copies the go sources to a build destination."""

from __future__ import print_function

import argparse
import os.path
import re
import shutil
import subprocess
import sys


def parse_args():
  parser = argparse.ArgumentParser()
  default_output_dir = os.path.normpath(
      os.path.join(
          os.path.dirname(os.path.realpath(__file__)),
          '../../chromiumos-overlay/sys-devel/llvm/files/compiler_wrapper'))
  parser.add_argument(
      '--output_dir',
      default=default_output_dir,
      help='Output directory to place bundled files (default: %(default)s)')
  parser.add_argument(
      '--create',
      action='store_true',
      help='Create output_dir if it does not already exist')
  return parser.parse_args()


def copy_files(input_dir, output_dir):
  for filename in os.listdir(input_dir):
    if ((filename.endswith('.go') and not filename.endswith('_test.go')) or
        filename in ('build.py', 'go.mod')):
      shutil.copy(
          os.path.join(input_dir, filename), os.path.join(output_dir, filename))


def read_change_id(input_dir):
  last_commit_msg = subprocess.check_output(
      ['git', '-C', input_dir, 'log', '-1', '--pretty=%B'], encoding='utf-8')
  # Use last found change id to support reverts as well.
  change_ids = re.findall(r'Change-Id: (\w+)', last_commit_msg)
  if not change_ids:
    sys.exit("Couldn't find Change-Id in last commit message.")
  return change_ids[-1]


def write_readme(input_dir, output_dir, change_id):
  with open(
      os.path.join(input_dir, 'bundle.README'), 'r', encoding='utf-8') as r:
    with open(os.path.join(output_dir, 'README'), 'w', encoding='utf-8') as w:
      content = r.read()
      w.write(content.format(change_id=change_id))


def write_version(output_dir, change_id):
  with open(os.path.join(output_dir, 'VERSION'), 'w', encoding='utf-8') as w:
    w.write(change_id)


def main():
  args = parse_args()
  input_dir = os.path.dirname(__file__)
  change_id = read_change_id(input_dir)
  if not args.create:
    assert os.path.exists(
        args.output_dir
    ), f'Specified output directory ({args.output_dir}) does not exist'
  shutil.rmtree(args.output_dir, ignore_errors=True)
  os.makedirs(args.output_dir)
  copy_files(input_dir, args.output_dir)
  write_readme(input_dir, args.output_dir, change_id)
  write_version(args.output_dir, change_id)


if __name__ == '__main__':
  main()
