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

"""Clones helper scripts into chromiumos-overlay.

Some files in here also need to live in chromiumos-overlay (e.g., the
patch_manager ones). This script simplifies the copying of those around.
"""

# Necessary until crbug.com/1006448 is fixed

import argparse
import os
import shutil
import sys


def _find_repo_root(script_root):
    repo_root = os.path.abspath(os.path.join(script_root, "../../../../"))
    if not os.path.isdir(os.path.join(repo_root, ".repo")):
        return None
    return repo_root


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--chroot_path",
        help="Path to where CrOS' source tree lives. Will autodetect if you're "
        "running this from inside the CrOS source tree.",
    )
    args = parser.parse_args()

    my_dir = os.path.abspath(os.path.dirname(__file__))

    repo_root = args.chroot_path
    if repo_root is None:
        repo_root = _find_repo_root(my_dir)
        if repo_root is None:
            sys.exit(
                "Couldn't detect the CrOS checkout root; please provide a "
                "value for --chroot_path"
            )

    chromiumos_overlay = os.path.join(
        repo_root, "src/third_party/chromiumos-overlay"
    )

    clone_files = [
        "failure_modes.py",
        "get_llvm_hash.py",
        "git_llvm_rev.py",
        "patch_manager.py",
        "subprocess_helpers.py",
    ]

    filesdir = os.path.join(
        chromiumos_overlay, "sys-devel/llvm/files/patch_manager"
    )
    for f in clone_files:
        source = os.path.join(my_dir, f)
        dest = os.path.join(filesdir, f)
        print("%r => %r" % (source, dest))
        shutil.copyfile(source, dest)


if __name__ == "__main__":
    main()
