#!/usr/bin/env python3.8

# 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
        for f in children:
            file_list.append(Path(current) / f)
        if ignore:
            return ignore(current, children)
        return []

    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())
