# Copyright 2021 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.

# Copies a directory preserving its structure.
#
# NOTE: Don't use this tempalte if GN's built-in `copy` can be used instead, see
# example below, also `gn help copy`. Usually the reason to use this template is
# the content of the directory cannot be determined in BUILD.gn. Because of
# this, it is impossible for this template to guarantee incremental correctness.
# For example, changes to files in a directory may not cause its mtime to
# change, so the build system won't rerun this action when building
# incrementally. The `inputs` parameter is required to mitigate this problem,
# but it provides no guarantees. See more details in https://fxbug.dev/73250.
#
# Example:
#
# ```
# copy_tree("my_copy") {
#   src_dir = "path/to/src/dir"
#   dest_dir = "path/to/dest/dir"
#   inputs = [
#     "version/of/src/dir",
#   ]
#   ignore_patterns = [
#     "*not_useful*",
#     "*.to_ignore",
#   ]
# }
# ```
#
# Use `copy` if content of dir can be determined in BUILD.gn:
#
# ```
# copy("my_copy") {
#   sources = [
#     "path/to/src/dir/file1",
#     "path/to/src/dir/file2",
#     "path/to/src/dir/file3",
#   ]
#   outputs = [ "path/to/dest/dir/{{source_file_part}}" ]
# }
# ```
#
# Parameters
#
#   src_dir (required)
#     Path to the directory to copy.
#     Type: path
#
#   dest_dir (required)
#     Path to copy the directory to.
#     Type: path
#
#   inputs (optional)
#     A list of files that changes when the content of the directory changes, so
#     in incremental builds a rerun of this action can be correctly triggered.
#     Type: list(path)
#     Default: empty
#
#   ignore_patterns (optional)
#     Glob-style patterns to ignore when copying.
#     Type: list(string)
#     Default: empty
#
#   deps
#   testonly
#   visibility
template("copy_tree") {
  action(target_name) {
    # Not all inputs and outputs are listed by this action, so it is not
    # hermetic. This is usually the very reason a user would want this template
    # instead of, GN's built-in copy tool.
    hermetic_deps = false

    forward_variables_from(invoker,
                           [
                             "deps",
                             "dest_dir",
                             "ignore_patterns",
                             "inputs",
                             "src_dir",
                             "testonly",
                             "visibility",
                           ])

    assert(defined(src_dir), "src_dir must be defined for ${target_name}")
    assert(defined(dest_dir), "dest_dir must be defined for ${target_name}")

    if (defined(inputs)) {
      inputs += [ src_dir ]
    } else {
      inputs = [ src_dir ]
    }

    script = "//build/copy_tree.py"

    stamp_file = "${dest_dir}.stamp"
    args = [
      rebase_path(src_dir, root_build_dir),
      rebase_path(dest_dir, root_build_dir),
      rebase_path(stamp_file, root_build_dir),
    ]
    if (defined(ignore_patterns)) {
      args += [ "--ignore_patterns" ] + ignore_patterns
    }

    outputs = [
      dest_dir,
      stamp_file,
    ]
  }
}
