# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/python_action.gni")

# Takes a set of input sources and zips them up to a .zip output.
#
# Users can either pass in specific input files or entire directories.
# This target type also supports renaming files as well as specifing
# desired zip destination directories for each input source.
#
# Args:
#   deps: Dependencies for this target.
#
#   inputs: List of input files following the custom input formatting
#      convention. See below for syntax.
#
#   dirs: List of directories to be completely zipped up following the same
#     input formatting convention. See below for syntax.
#
#   output: Filename of artifact .zip file produced by script's execution.
#
# Each input follows the following convention:
#   /source_path > /zip_destination/
#
# All directories are expected to be end with a '/'. Inputs must always specify
# both a source and a destination. Destinations are expected to have a leading
# '/' which stands for the root of the archive.
#
# Example:
#   Let's say we have the following structure for a //source/ directory:
#
#     source/
#     ├── file1.txt
#     ├── file2.txt
#     ├── file3.txt
#     └── some_dir/
#         ├── file4.txt
#         └── some_other_dir/
#             └── file5.txt
#
#   And we create the following build target:
#
#     import("$dir_pw_build/zip.gni")
#
#     pw_zip("target_name") {
#       inputs = [
#         "//source/file1.txt > /",             # Copied to the zip root dir.
#         "//source/file2.txt > /renamed.txt",  # File renamed.
#         "//source/file3.txt > /bar/",         # File moved to the /bar/ dir.
#       ]
#
#       dirs = [
#         "//source/some_dir/ > /bar/some_dir/",  # Whole /some_dir/ contents
#                                                 # copied as /bar/some_dir/.
#       ]
#
#       # Note on output: if the specific output directory isn't defined
#       # (such as output = "zoo.zip") then the .zip will output to the
#       # same directory as the BUILD.gn file that called the target.
#       output = "//$target_out_dir/foo.zip",  # Where the foo.zip will end up
#     }
#
#   This will result in a .zip file called foo.zip stored in //$target_out_dir
#   with the following structure:
#
#     foo.zip
#     ├── bar/
#     │   ├── file3.txt
#     │   └── some_dir/
#     │       ├── file4.txt
#     │       └── some_other_dir/
#     │           └── file5.txt
#     ├── file1.txt
#     └── renamed.txt
#
template("pw_zip") {
  _delimiter = ">"
  pw_python_action(target_name) {
    forward_variables_from(invoker, [ "deps" ])
    script = "$dir_pw_build/py/pw_build/zip.py"

    args = [ "--out_filename" ]
    args += [ rebase_path(invoker.output, root_build_dir) ]

    inputs = []
    args += [ "--input_list" ]
    if (defined(invoker.inputs)) {
      foreach(input, invoker.inputs) {
        # Adding spaces around our delimiter is great for readability,
        # but not great for the string split: remove the spacing.
        input = string_replace(input, " $_delimiter", _delimiter)
        input = string_replace(input, "$_delimiter ", _delimiter)

        input_list = []
        input_list = string_split(input, _delimiter)
        inputs += [ input_list[0] ]
        input_list[0] = rebase_path(input_list[0], root_build_dir)

        # Pass rebased and delimited path to script.
        args += [ string_join(_delimiter, input_list) ]
      }
    }

    if (defined(invoker.dirs)) {
      foreach(dir, invoker.dirs) {
        # Adding spaces around our delimiter is great for readability,
        # but not great for the string split: remove the spacing.
        dir = string_replace(dir, " $_delimiter", _delimiter)
        dir = string_replace(dir, "$_delimiter ", _delimiter)

        args += [ rebase_path(dir, root_build_dir) ]
      }
    }

    outputs = [ invoker.output ]
  }
}
