// Copyright 2016 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

syntax = "proto3";

package recipe_engine;

message DepSpec {
  // (required) The URL of where to fetch the repo. Must be a valid git URL.
  //
  // If you wish to avoid network/git operations, please use the `-O` override
  // functionality of recipes.py. See also `recipes.py bundle`.
  string url = 1;

  // (required) The ref to git-fetch when syncing this dependency.
  //
  // This must be an absolute ref which the server at `url` recognizes (e.g.
  // 'refs/heads/...').
  //
  // DEPRECATED: Short refs (like 'main') will be implicitly converted to
  // 'refs/heads/...' with a warning.
  string branch = 2;

  // (required) The git commit that we depend on.
  string revision = 3;
}

// These options control the behavior of the autoroller recipe:
//   https://chromium.googlesource.com/infra/infra/+/main/recipes/recipes/recipe_autoroller.py
message AutorollRecipeOptions {
  // These control the behavior of the autoroller when it finds a trivial roll
  // (i.e. a roll without expectation changes).
  message TrivialOptions {
    // One of these email addresses will be randomly selected to be TBR'd.
    repeated string tbr_emails = 1;

    // If true, the autoroller recipe will automatically CQ the change.
    bool automatic_commit = 2;

    // If true and automatic_commit is false, the autoroller recipe will
    // automatically do a CQ dry run when uploading the change.
    bool dry_run = 3;

    enum SelfApproveMethod {
      // Will set Bot-Commit+1 label.
      BOT_COMMIT_APPROVE = 0;

      // Will set Code-Review+1 label.
      CODE_REVIEW_1_APPROVE = 1;

      // Will set Code-Review+2 label.
      CODE_REVIEW_2_APPROVE = 2;

      // Will not set any labels besides Commit-Queue.
      NO_LABELS_APPROVE = 3;
    }

    SelfApproveMethod self_approve_method = 4;
  }
  TrivialOptions trivial = 1;

  // These control the behavior of the autoroller when it finds a non-trivial
  // roll (i.e. a roll with expectation changes but which otherwise completes
  // the simulation tests).
  message NontrivialOptions {
    // These add additional reviewer emails on the change.
    repeated string extra_reviewer_emails = 1;

    // If true, the autoroller recipe will automatically do a CQ dry run when
    // uploading the change.
    bool automatic_commit_dry_run = 2;

    // If true, the autoroller recipe will set the Auto-Submit+1 label when
    // uploading the change. This should only be enabled for projects which
    // support Auto-Submit.
    bool set_autosubmit = 3;
  }
  NontrivialOptions nontrivial = 2;

  // Make the autoroller skip this repo entirely with a human-readable message.
  string disable_reason = 3;

  // If true, skip the autoroller will skip CCing authors of CLs in this repo
  // when rolling those CLs downstream.
  bool no_cc_authors = 4;

  // If true, don't use the --r-owner option to 'git cl upload'.
  bool no_owners = 5;
}

message RepoSpec {
  // The "API Version" of this proto. Should always equal 2, currently.
  int32 api_version = 1;  // Version 2

  // The "repo name" of this recipe repository. This becomes
  // the prefix in DEPS when something depends on one of this repo's modules
  // (e.g.  DEPS=["recipe_engine/path"]).
  //
  // By convention, this should match the luci-config project_id for this repo,
  // but the only requirements are that:
  //   * It is unique within its recipes microcosm (i.e. no dependency tree of
  //     recipe repos can ever have two repos with the same name).
  //   * It must not contain slashes.
  //
  // One of 'repo_name' and 'project_id' (the old field) must be specified;
  // 'repo_name' takes precedence, and the autoroller will upgrade all
  // recipes.cfg files to have both. Eventually we will remove 'project_id'.
  string repo_name = 7;

  // Deprecated: The old field for specifying repo_name.
  string project_id = 2;

  // This is the URL which points to the 'source of truth' for this repo. It's
  // meant to be used for documentation generation.
  string canonical_repo_url = 3;

  // The path (using forward slashes) to where the base of the recipes are found
  // in the repo (i.e. where the "recipes" and/or "recipe_modules" directories
  // live).
  string recipes_path = 4;

  // A mapping of a dependency ("repo_name") to spec needed to fetch its code.
  map<string, DepSpec> deps = 5;

  // The autoroller options for this repo. These options will be respected by
  // the autoroller recipe (which currently lives here:
  //   https://chromium.googlesource.com/infra/infra/+/main/recipes/recipes/recipe_autoroller.py
  // ).
  AutorollRecipeOptions autoroll_recipe_options = 6;

  // If true, `recipes.py test train` will not generate the README.recipes.md
  // docs file, and `recipes.py test run` will not assert that the docs file is
  // up-to-date.
  bool no_docs = 8;

  // DEPRECATED; python3 is always required.
  bool require_py3_compatibility = 9;

  // DEPRECATED; python3 is always used.
  bool py3_only = 10;

  // If true, this repo will not allow any tests to exit with a status code that
  // mismatches the expected status of the `test` kwarg of the test data (e.g.
  // `yield api.test("name", ..., status="FAILURE")`), which defaults to SUCCESS
  // if not specified.
  bool enforce_test_expected_status = 11;
}

// Emitted by the `recipes.py dump_specs` command.
message DepRepoSpecs {
  map<string, RepoSpec> repo_specs = 1;
}
