// Copyright 2020 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 recipe_modules.pigweed.checkout;

message EquivalentRemotes {
  // List of remotes that should be considered equivalent to each other.
  repeated string remotes = 1;
}

message InputProperties {
  // Path to remote repository. (Default:
  // "https://pigweed.googlesource.com/pigweed/pigweed")
  string remote = 1;

  // Branch of remote repository. (Default: "main")
  string branch = 2;

  // Is this repository an Android Repo Tool manifest? (Default: False)
  bool use_repo = 3;

  // Name of Android Repo Tool manifest file. (Default: "default.xml")
  string manifest_file = 4;

  // Lists of remotes that should be considered equivalent to each other.
  // This is intended to be used with branches that are automatically kept in
  // sync across Gerrit hosts, so a CL in one will be understood to apply to a
  // submodule or Android Repo Tool project with the other as the remote.
  //
  // Example:
  // [
  //     [
  //         "https://a-review.googlesource.com/foo",
  //         "https://b-review.googlesource.com/foo",
  //         "https://c-review.googlesource.com/foo",
  //     ],
  //     [
  //         "https://d-review.googlesource.com/bar",
  //         "https://e-review.googlesource.com/bar",
  //     ],
  // ]
  //
  // In this case a/foo, b/foo, and c/foo are all mirrors of each other, as
  // well as d/bar and e/bar, but a/foo and d/bar are unrelated.
  //
  // See also http://go/gob-ctl#copying-git-repository.
  repeated EquivalentRemotes equivalent_remotes = 5;

  // Timeouts for repo (which sometimes hangs). If 0 uses default of 20 for
  // init and 120 for sync. Cannot be disabled, but int32 supports some really
  // large values. If number of attempts is 0 it's set to 3.
  int32 repo_init_timeout_sec = 6;
  int32 repo_sync_timeout_sec = 7;
  int32 number_of_attempts = 8;

  // In try builds CLs are rebased by default. In ci builds they are not. This
  // option prevents rebasing on try builds.
  bool force_no_rebase = 9;

  // If a tryjob is triggered by a CL on branch 'foo', try to use branch 'foo'
  // of any superprojects or manifests containing the CL's repo as a submodule
  // or project. (Note: branch matching is not yet implemented for submodules.)
  bool match_branch = 10;

  // Timeout for 'git submodule update --init --recursive'. Default is
  // 10 minutes.
  int32 submodule_timeout_sec = 11;

  // Use buildbucket trigger data. Not used here but added for ease in
  // transitioning.
  bool use_trigger = 12;
}
