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 no longer used.
  // 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);
}
