syntax = "proto2";

// This message describes a Commit Queue configuration. The config file cq.cfg
// should be stored in the config directory located on the branch that this CQ
// should commit to.
message Config {
  // Required. Version of the config format.
  optional int32 version = 1;

  // Required. Name of the CQ. May only contain characters [a-zA-Z0-9_]. It is
  // used for various purposes, including, but not limited to match the project
  // name for CLs on Rietveld, name of the project in the status app, internal
  // name for logging etc. CQ name should not be confused with the project name
  // in LUCI as there may be multiple CQs per project.
  optional string cq_name = 2;

  // List of verifiers that verify if the CL is ready to be committed.
  optional Verifiers verifiers = 3;

  // URL of the CQ status app to push updates to.
  optional string cq_status_url = 4;

  // When true, hash of the commit is not posted by CQ. This is used for
  // projects using gnumbd as latter publishes actual hash later. Default value
  // is false.
  optional bool hide_ref_in_committed_msg = 5;

  // Delay between commit bursts in seconds. Default value is 480.
  optional int32 commit_burst_delay = 6;

  // Maximum number of commits done sequentially, before waiting for
  // commit_burst_delay. Default value is 4.
  optional int32 max_commit_burst = 7;

  // Defines whether a CQ is used in production. Allows to disable CQ for a
  // given branch. Default is true.
  optional bool in_production = 8;

  // Configuration options for Rietveld code review.
  optional Rietveld rietveld = 9;

  // This can be used to override the Git repository URL used to checkout and
  // commit changes on CQ host. This should only be used in case, when the
  // source repository is not supported by luci-config (e.g. GitHub).
  optional string git_repo_url = 10;

  // Target ref to commit to. This can be used to specify a different ref than
  // the one where the luci config is located. This is useful, e.g. for projects
  // that use gnumbd where CQ should commit into a pending ref.
  optional string target_ref = 11;

  // Deprecated. URL of the SVN repository. We are deprecating SVN support.
  optional string svn_repo_url = 12;

  // Deprecated. Should be set to true, when the project's SVN repository does
  // not have server-side hooks configured.
  optional bool server_hooks_missing = 13;

  // Deprecated. Specifies a list of verifiers that are run on a local checkout
  // with patch applied. The only remaining use case for this is PRESUBMIT_CHECK
  // verifier, which we are deprecating as well.
  optional Verifiers verifiers_with_patch = 14;
}

message Rietveld {
  // Required. URL of the codereview site.
  optional string url = 1;

  // List of regular expressions used to check if CL's base URL should be
  // processed by this CQ. This may be useful if a single branch has multiple
  // sub-directories that are handled by different CQs. When no regular
  // expressions are specified, the regular expression '.*', which matches any
  // directory, is used.
  repeated string project_bases = 2;
}

// Verifiers are various types of checks that a Commit Queue performs on a CL.
// All verifiers must pass in order for a CL to be landed. Configuration file
// describes types of verifiers that should be applied to each CL and their
// parameters.
message Verifiers {
  // This verifier is used to ensure that an LGTM was posted to the code review
  // site from a valid project committer.
  optional ReviewerLgtmVerifier reviewer_lgtm = 1;

  // This verifier is used to check tree status before committing a CL. If the
  // tree is closed, then the verifier will wait until it is reopened.
  optional TreeStatusLgtmVerifier tree_status = 2;

  // This verifier triggers a set of tryjobs that are to be run on builders on
  // Buildbot. It automatically retries failed try-jobs and only allows CL to
  // land if each builder has succeeded in the latest retry. If a given tryjob
  // result is too old (>1 day) it is ignored.
  optional TryJobVerifier try_job = 3;

  // This verifier is used to ensure that the author has signed Google's
  // Contributor License Agreement.
  optional SignCLAVerifier sign_cla = 4;

  message ReviewerLgtmVerifier {
    // Required. Name of the project, whose committer list to use. This allows
    // to reuse committer lists. Note that if you are adding a new list, then
    // currently you will need to make changes to the CQ code to add support for
    // retrieving such a list. We are working on removing the need to modify CQ
    // code.
    optional string committer_list = 1;

    // Number of seconds to wait for LGTM on CQ. Default value is 0.
    optional int32 max_wait_secs = 2;

    // Message to be posted to code review site when no LGTM is found. Default
    // value is "No LGTM from a valid reviewer yet. Only full committers are "
    // "accepted.\nEven if an LGTM may have been provided, it was from a "
    // "non-committer,\n_not_ a full super star committer.\nSee "
    // "http://www.chromium.org/getting-involved/become-a-committer\nNote that "
    // "this has nothing to do with OWNERS files."
    optional string no_lgtm_msg = 3;
  }

  message TreeStatusLgtmVerifier {
    // Required. URL of the project tree status app.
    optional string tree_status_url = 1;
  }

  message TryJobVerifier {
    message Builder {
      // Name of the builder.
      optional string name = 1;

      // When true, the builder is triggered by CQ. Otherwise, it is expected to
      // be triggered from another tryjob. Default value is true.
      optional bool triggered = 2;

      // When this field is present, it marks given builder as experimental. It
      // is only executed on a given percentage of the CLs and the outcome does
      // not affect the decicion whether a CL can land or not. This is typically
      // used to test new builders and estimate their capacity requirements.
      optional float experiment_percentage = 4;
    }

    message Bucket {
      // Name of the bucket. This is typically the same as a master name.
      optional string name = 1;

      // Builders on which tryjobs should be triggered.
      repeated Builder builders = 2;
    }

    // Buckets on which tryjobs are triggered/watched.
    repeated Bucket buckets = 1;
  }

  message SignCLAVerifier {}
}
