#!/usr/bin/env fuchsia-vendored-python

# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import sys
import argparse
import shutil

from pathlib import Path


def main():
    params = argparse.ArgumentParser(
        description="Copy all files in a directory tree and touch a stamp file")
    params.add_argument("source", type=Path)
    params.add_argument("target", type=Path)
    params.add_argument("stamp", type=Path)
    params.add_argument("--ignore_patterns", nargs="+")
    params.add_argument("--depfile", nargs=1, type=Path)
    args = params.parse_args()

    if args.target.is_file():
        args.target.unlink()
    if args.target.is_dir():
        shutil.rmtree(args.target, ignore_errors=True)

    ignore = None
    if args.ignore_patterns:
        ignore = shutil.ignore_patterns(*args.ignore_patterns)

    file_list = [args.source]

    def ignore_wrapper(current, children):
        nonlocal file_list, ignore
        to_ignore = set(ignore(current, children)) if ignore else set()
        file_list.extend(
            (Path(current) / f) for f in children if f not in to_ignore)
        return to_ignore

    shutil.copytree(
        args.source,
        args.target,
        symlinks=True,
        ignore=ignore_wrapper,
    )

    if args.depfile:
        os.makedirs(os.path.dirname(args.depfile[0]), exist_ok=True)
        with open(args.depfile[0], "w") as f:
            f.write(str(args.stamp) + ": ")
            f.write(" ".join(map(str, file_list)))
            f.write("\n")
            for file in file_list:
                print(
                    os.path.join(
                        args.target, os.path.relpath(file, start=args.source)) +
                    ": " + str(file),
                    file=f)

    args.stamp.touch()


if __name__ == "__main__":
    sys.exit(main())
