syntax = "proto3";

package chromite.api;

option go_package = "go.chromium.org/chromiumos/infra/proto/go/chromite/api";

import "chromite/api/build_api.proto";
import "chromite/api/sysroot.proto";
import "chromiumos/common.proto";


// Depgraph messages and service.

// Message contains data about the portage dependency graph and the packages'
// dependency source paths.
message DepGraph {
  // TODO(crbug/1081828): drop when no longer used.  Use sysroot instead.
  // The board whose dependency graph this is.
  chromiumos.BuildTarget build_target = 1;
  // List of packages in the dependency graph and their infos, which include
  // dependency packages and the source paths.
  repeated PackageDepInfo package_deps = 2;

  // The sysroot whose dependency graph is being created.  If no sysroot is
  // being used, may be unspecified.
  Sysroot sysroot = 3;
}

// Message describing a package and its dependencies.
message PackageDepInfo {
  // The package itself.
  chromiumos.PackageInfo package_info = 1;

  // List of packages this package depends on.
  repeated chromiumos.PackageInfo dependency_packages = 2;

  // List of source paths the package depends on.
  repeated SourcePath dependency_source_paths = 3;
}

// Message describes a source path.
message SourcePath {
  string path = 1;
}

// Message for creating dependency graph json map.
// Example Json:
// {"build_target":{"name":"board"},"output_file":"/tmp/depgraph.json"}
message GetBuildDependencyGraphRequest {
  // The sysroot whose dependency graph is being created.  If no sysroot is
  // being used, may be unspecified.
  Sysroot sysroot = 4;
  // TODO(crbug/1081828): drop when all supported release branches are no longer
  // using this.
  // DEPRECATED: Use sysroot instead.
  // The board whose dependency graph is being created.  If both sysroot and
  // build_target are given, sysroot is used.
  chromiumos.BuildTarget build_target = 1;
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 2;
  // List of packages for which to create the dependency graph. If none are
  // specified the standard list of packages is used.
  repeated chromiumos.PackageInfo packages = 3;
}

// Response from creating dependency graph json map.
message GetBuildDependencyGraphResponse {
  DepGraph dep_graph = 1;
  DepGraph sdk_dep_graph = 2;
}

message GetToolchainPathsRequest {
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 1;
}

message GetToolchainPathsResponse {
  // List of paths considered relevant to toolchain packages.
  repeated SourcePath paths = 1;
}

// Message for getting a list of a board's package dependencies.
message ListRequest {
  // The sysroot for the board whose packages dependencies are being calculated.
  Sysroot sysroot = 1;
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 2;
  // List of paths to consider when retrieving the board's package dependencies.
  // If empty / None returns all package dependencies.
  repeated SourcePath src_paths = 3;
  // List of packages for which to get dependencies. If none are specified the
  // standard list of packages is used.
  repeated chromiumos.PackageInfo packages = 4;
}

// Response for getting a list of package dependencies.
message ListResponse {
  repeated chromiumos.PackageInfo package_deps = 1;
}

// Service to create a variety of package dependency graphs.
service DependencyService {
  // The module implementing the service.
  option (service_options) = {
    module: "dependency",
    service_chroot_assert: INSIDE,
  };

  // Get the build dependency graph.
  rpc GetBuildDependencyGraph(GetBuildDependencyGraphRequest)
    returns (GetBuildDependencyGraphResponse);

  // Get the list of source paths that are relevant to the toolchain
  rpc GetToolchainPaths(GetToolchainPathsRequest)
    returns (GetToolchainPathsResponse);

  // Get the list of package dependencies.
  rpc List(ListRequest) returns (ListResponse);
}
