blob: 326151787d60ced58cb834c596432c8976fe7912 [file] [log] [blame]
#!/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())