# Copyright 2022 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("//build/python/python_action.gni")
import("//build/python/python_binary.gni")

# Collect a newline-delimited text file of package names from the create-system call.
#
# Arguments:
#
#   system_label (GN label)
#     Label for the assembled_system() invocation to use, e.g. //build/images/fuchsia.
#
#   outputs (list of paths)
#     Usual GN meaning, expects a single file to write to.
#
#   package_set (string, either "base" or "cache")
#     Which package set's metadata to dump into the output.
#
#   contents (string, either "name" or "manifest")
#     Which field in each package's metadata to extract for the newline-delimited file.
#
#   testonly
#   visibility
template("package_list_from_assembly") {
  assert(
      defined(invoker.system_label),
      "must define a `system_label` argument which points to an assembled_system() invocation")
  assert(defined(invoker.outputs), "must define `outputs`")
  assert(defined(invoker.package_set), "must define `package_set` argument")
  allowed_package_sets = [
    "base",
    "cache",
  ]
  assert(allowed_package_sets + [ invoker.package_set ] -
             [ invoker.package_set ] != allowed_package_sets,
         "package_set must be one of: ${allowed_package_sets}")
  assert(defined(invoker.contents),
         "must define a `contents` type for dumping package info")

  _assembly_target_dir = get_label_info(invoker.system_label, "target_out_dir")
  _assembly_target_name = get_label_info(invoker.system_label, "name")
  _images_manifest = "$_assembly_target_dir/$_assembly_target_name/images.json"

  python_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "outputs",
                             "testonly",
                             "visibility",
                           ])
    binary_label = "//build/assembly/scripts:package_list"
    args = [
      "--package-set",
      invoker.package_set,
      "--contents",
      invoker.contents,
      "--images-manifest",
      rebase_path(_images_manifest, root_build_dir),
      "--output",
      rebase_path(outputs[0], root_build_dir),
    ]
    inputs = [ _images_manifest ]
    deps = [ invoker.system_label ]
  }
}
