# 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")
  assert(invoker.package_set == "base" || invoker.package_set == "cache",
         "must specify either base or cache package set")
  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"

  _binary_target = "${target_name}_bin"
  python_binary(_binary_target) {
    testonly = true
    main_source = "//build/assembly/scripts/package_list.py"
  }

  python_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "outputs",
                             "testonly",
                             "visibility",
                           ])
    binary_label = ":$_binary_target"
    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 ]
  }
}
