// 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.

syntax = "proto3";

package recipes.fuchsia.fuchsia_cipd_roller;

import "google/protobuf/struct.proto";

message InputProperties {
  // Jiri remote manifest project.
  string project = 1;

  // Jiri manifest to checkout.
  string checkout_manifest = 2;

  // Remote manifest repository.
  string remote = 3;

  // Mapping from manifest path (relative to `project`) to list of packages that
  // are pinned in that manifest and should be rolled.
  map<string, google.protobuf.ListValue> packages_by_manifest = 4;

  // The subset of packages that must have the specified ref.
  repeated string packages_requiring_ref = 5;

  // Jiri attribute to match debug symbol packages.
  string debug_symbol_attribute = 6;

  // GCS buckets to upload debug symbols to prior to starting roll.
  repeated string preroll_debug_symbol_gcs_buckets = 7;

  // GCS buckets to upload debug symbols to after a successful roll. If
  // specified, preroll_debug_symbol_gcs_buckets is required.
  repeated string postroll_debug_symbol_gcs_buckets = 8;

  // The list of lockfiles to update in "${manifest}=${lockfile}" format.
  repeated string lockfiles = 9;

  // Whether to make roll Change-Id unique to the build.
  bool create_unique_change_id = 10;

  // Whether to dry-run the auto-roller (CQ+1 and abandon the change).
  bool dry_run = 11;

  // Whether to force-submit the change, bypassing CQ.
  bool force_submit = 12;

  // Line of text to divide the commit header and body from the footers.
  string commit_divider = 13;

  // A CIPD tag prefix common to all $packages where a common version can be
  // extracted.
  string tag = 14;

  // A common CIPD ref to resolve when rolling a set of packages.
  string ref = 15;

  // The owners responsible for watching this roller (example:
  // "username@google.com").
  repeated string owners = 16;

  // JSON schema for multiplying a test in fuchsia CQ. See
  // https://fuchsia.dev/fuchsia-src/development/testing/testing_for_flakiness_in_cq?hl=en#multiply-examples
  // Ideally this recipe would just pass through all fields without knowing the
  // schema, but then JSON serialization would emit a float value for
  // `total_runs`.
  message TestMultiplier {
    string name = 1;
    string os = 2;  // Optional.
    int32 total_runs = 3;  // Optional.
  }

  // A list of test multipliers to pass into the roll CL's MULTIPLY footer.
  repeated TestMultiplier test_multipliers = 17;

  // Notify option when pushing roll CL.
  string cl_notify_option = 18;

  // Extra tryjobs to include, as a mapping from absolute bucket name to list of
  // builder names. Example: {"luci.project.bucket": ["builder1", "builder2"]}
  map<string, google.protobuf.ListValue> include_tryjobs = 19;

  // The max number of days for the packages in a manifest to be older than.
  // If set and the roller doesn't find new versions to roll for more than
  // max_stale_days, the roller will fail. If max_stale_days == 0, the roller
  // will never fail if it has nothing to roll.
  int32 max_stale_days = 20;
}
