// Copyright 2021 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

syntax = "proto3";

package recipes.pigweed.submodule_roller;

import "recipe_modules/pigweed/checkout/options.proto";
import "recipe_modules/fuchsia/auto_roller/options.proto";

message Submodule {
  // The path of the submodule to update. Required.
  string path = 1;

  // The name of the submodule to update. Defaults to the value of path. Only
  // necessary if the name and path in the .gitmodules file are different.
  string name = 2;

  // Branch to track. By default retrieved from .gitmodules or "main".
  string branch = 3;
}

message InputProperties {
  // Submodules to update.
  repeated Submodule submodules = 1;

  reserved 2;

  // Whether to CC authors and/or reviewers on roll CLs. In case the owner of a
  // CL is different from the author, both are included when
  // cc_authors_on_rolls is set.
  bool cc_authors_on_rolls = 3;
  bool cc_reviewers_on_rolls = 4;

  // Restrict CCing of authors/reviewers to the following domains. Including
  // "example.com" will not automatically include "subdomain.example.com". If
  // empty, all domains will included except those ending with
  // "gserviceaccount.com" are always excluded.
  repeated string cc_domains = 5;

  // By default, only CC when a roll fails. If always_cc is set, CC when the
  // roll is created.
  bool always_cc = 6;

  reserved 7;

  // Checkout module options.
  recipe_modules.pigweed.checkout.Options checkout_options = 8;

  // Forge the author so rolls of single commits are attributed to the original
  // commit author.
  bool forge_author = 9;

  // Auto roller module options.
  recipe_modules.fuchsia.auto_roller.Options auto_roller_options = 10;

  // Overrides for auto roller module options. Needed when rollers are launched
  // via the subbuild module, which does not have a mechanism to modify an
  // existing roller's auto_roller_options (only can overwrite it).
  recipe_modules.fuchsia.auto_roller.Options override_auto_roller_options = 12;

  // Max number of commits for which authors and reviewers should be CCd.
  // Default is 10. To disable CCing, don't set the "cc_*_on_rolls" values
  // above, or set this to a negative value.
  int32 max_commits_for_ccing = 11;
}
