// 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.
syntax = "proto3";

package recipe_modules.fuchsia.auto_roller;

import "google/protobuf/struct.proto";

message Options {
  // Remote project URL to which changes should be sent for review, e.g.
  // "fuchsia.googlesource.com/foo".
  string remote = 1;

  // Whether to execute this method in dry_run mode (upload the changes and do a
  // CQ dry run, but don't submit).
  bool dry_run = 2;

  // Whether to commit untracked files in addition to modified already-tracked
  // files.
  bool commit_untracked = 3;

  // Whether to create a Gerrit Change ID for the roll that is unique to this
  // build. Default behavior is to calculate a change ID based solely on the
  // contents of the change's git diff.
  bool create_unique_change_id = 4;

  // One of "NONE", "OWNER", "OWNER_REVIEWERS", "ALL" specifying whom to send
  // roll CL notifications to.
  string cl_notify_option = 5;

  // Whether to force-submit the CL, bypassing CQ entirely (so changes will land
  // even if the tree is closed).  This is useful when rolling changes that have
  // already been validated well enough that it's considered safe to roll them
  // without further checks.
  bool force_submit = 6;

  // Whether CQ should skip running tryjobs on the CL. This is useful for
  // rolling changes that are known to be no-ops but for which the tree status
  // should still be respected to avoid launching unnecessary CI builds during
  // tree closures.
  bool no_tryjobs = 7;

  // Vote Bot-Commit+1 instead of Code-Review+2.
  bool bot_commit = 8;

  // The git ref to roll changes into.
  // Default: "main".
  string upstream_ref = 9;

  // Labels to set on created CL. This is in addition to Code-Review and
  // Commit-Queue (depending on dry_run), but {"Commit-Queue": 0} deletes the
  // "Commit-Queue" label. This allows for integration with projects not using
  // CQ.
  map<string, int32> labels_to_set = 10;

  // Non-CQ/CR labels to wait on before submitting.
  repeated string labels_to_wait_on = 11;

  // List of emails to CC on the roll CL.
  repeated string cc_emails = 12;

  // Like cc_emails, but only gets CCd on roll failures.
  repeated string cc_on_failure_emails = 13;

  // Emails of the human owners of the auto-roller that's creating this change.
  // If set, the emails will be included in a commit message footer for
  // informational purposes.
  repeated string roller_owners = 14;

  // Map of bucket to list of extra tryjobs to include.
  map<string, google.protobuf.ListValue> include_tryjobs = 15;

  // Whether to add 'GitWatcher: ignore' to the footer of the roll commit
  // message.
  bool add_gitwatcher_ignore = 16;

  // Controls what happens to a CL after a CQ run run. If set to "NEVER" the CL
  // is always abandoned or submitted. If set to "ALWAYS" the CL is kept
  // anot submitted, evene after a failure.
  // This is used to automate creating CLs for rolled code that also needs to
  // be reviewed before submitting.
  string keep_cl = 17;

  // List of emails to set as reviewers on the roll CL.
  repeated string reviewer_emails = 18;
}
