// 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 Rewrite {
  // Configure git to rewrite all URLs with a prefix of original to final.
  string original = 1;
  string final = 2;
}

message Options {
  // 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;

  // Automatically initialize submodules. Ignored if included_submodules or
  // excluded_submodules is set.
  bool initialize_submodules = 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;

  // Do shallow checkouts of Android Repo Tool projects.
  int32 repo_depth = 9;

  // 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 = 10;

  // 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 = 11;

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

  // Use buildbucket trigger data.
  bool use_trigger = 13;

  // 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.googlesource.com/foo",
  //         "https://b.googlesource.com/foo",
  //         "https://c.googlesource.com/foo",
  //     ],
  //     [
  //         "https://d.googlesource.com/bar",
  //         "https://e.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 = 14;

  // Subdirectory of checkout in which commands should be executed. Uncommon.
  string root_subdirectory = 15;

  // Do not use a cache of the checkout.
  bool do_not_cache = 16;

  // Instead of including all submodules (initialize_submodules == false) or
  // including no submodules (initialize_submodules == true), initialize a
  // subset of the submodules present in the source tree. Setting both of these
  // is not permitted.
  repeated string included_submodules = 17;
  repeated string excluded_submodules = 18;

  // Disable downloading precomputed packfiles from a CDN.
  bool do_not_use_packfiles = 19;

  // Limit the Android Repo Tool checkout to these groups from the manifest
  // file.
  repeated string manifest_groups = 20;

  // Rewrites of Git remotes.
  repeated Rewrite rewrites = 21;

  // Attempt to patch Bazel projects in the given files.
  repeated string eligible_workspace_paths = 22;

  // Whether to use the '--no-clone-bundle' option to 'repo init',
  bool repo_no_clone_bundle = 23;

  // Maximum number of attempts for 'git fetch' and 'git submodule update'
  // calls. Defaults to 2.
  int32 max_attempts = 24;
}
