# Copyright 2018 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/compiled_action.gni")

declare_args() {
  # Directory containing files named by their merkleroot content IDs in
  # ASCII hex.  The //build/image:amber_publish_blobs target populates
  # this with copies of build products, but never removes old files.
  amber_repository_dir = "$root_out_dir/amber-files"

  # Directory containing signing keys used by amber-publish.
  amber_keys_dir = "//garnet/go/src/amber/keys"

  amber_repository_blobs_dir = "$amber_repository_dir/repository/blobs"
}

template("amber_publish") {
  # These files are copied from amber_keys_dir into $amber_repository_dir/keys.
  amber_copied_keys_files = [
    "snapshot.json",
    "targets.json",
    "timestamp.json",
  ]
  # These files are read from $amber_keys_dir by amber-publish.
  amber_keys_files = [
    "root.json",
    "root_manifest.json",
  ]

  compiled_action(target_name) {
    tool = "//garnet/go/src/amber:amber-publish"

    forward_variables_from(invoker,
                           [
                             "deps",
                             "data_deps",
                             "inputs",
                             "testonly",
                             "visibility",
                           ])

    assert(inputs == [ inputs[0] ],
           "amber_publish(\"$target_name\") requires exactly one input")

    outputs = [
      "$amber_repository_dir/repository/root.json",
    ]
    foreach(file, amber_copied_keys_files) {
      outputs += [ "$amber_repository_dir/keys/$file" ]
    }
    foreach(file, amber_keys_files + amber_copied_keys_files) {
      inputs += [ "$amber_keys_dir/$file" ]
    }

    args = [
      "-r",
      rebase_path(amber_repository_dir),
      "-k",
      rebase_path(amber_keys_dir),
      "-ps",
      "-f",
      rebase_path(inputs[0]),
      "-vt",
    ]
  }
}
