// 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 recipes.pigweed.target_to_cipd;

import "recipe_modules/pigweed/build/options.proto";
import "recipe_modules/pigweed/checkout/options.proto";
import "recipe_modules/pigweed/environment/options.proto";
import "recipe_modules/pigweed/pw_presubmit/options.proto";

message PathReplacement {
  // Text to replace with new. Required.
  string old = 1;

  // Text to replace old with. Required.
  string new = 2;
}

message InputProperties {
  // Globs of build artifacts to upload, relative to build directory. Should
  // resolve to files not directories. Supports "**". Required unless using
  // pw_presubmit steps, in which case the pw_presubmit export_dir_name is used.
  repeated string artifacts = 3;

  // Adjustments to paths as they're moved to the CIPD package. Optional.
  // Ignored if using pw_presubmit steps.
  repeated PathReplacement replacements = 4;

  // CIPD destination path.
  string cipd_path = 5;

  // Add platform (i.e., "linux-amd64") to package path.
  bool add_cipd_platform = 6;

  // Name of roller to trigger after uploading to CIPD. Optional.
  string roller_name = 7;

  // Don't do anything that has external effects.
  bool dry_run = 8;

  // Build module options.
  recipe_modules.pigweed.build.Options build_options = 9;

  // Environment module options.
  recipe_modules.pigweed.environment.Options environment_options = 10;

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

  // Pw Presubmit module options.
  recipe_modules.pigweed.pw_presubmit.Options pw_presubmit_options = 12;
}
