dependency: Get a list of relevant packages based on src_paths.

For a given board, get a list of all package dependencies based on the
given paths.

BUG=chromium:1111319
TEST=./run_pytest

Cq-Depend: 2347449
Change-Id: I6f5a9b89da3e1fc5134a8aacd4ec8386f22ec3fa
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2347393
Commit-Queue: Navil Perez <navil@google.com>
Tested-by: Navil Perez <navil@google.com>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/api/controller/dependency.py b/api/controller/dependency.py
index fd3a434..fcf9750 100644
--- a/api/controller/dependency.py
+++ b/api/controller/dependency.py
@@ -13,9 +13,11 @@
 
 import sys
 
+from chromite.api import api_config
 from chromite.api import faux
 from chromite.api import validate
 from chromite.api.controller import controller_util
+from chromite.api.gen.chromite.api import depgraph_pb2
 # TODO(crbug/1081828): stop using build_target and drop it from the proto.
 from chromite.lib import cros_build_lib
 from chromite.lib import portage_util
@@ -92,6 +94,45 @@
   AugmentDepGraphProtoFromJsonMap(sdk_json_map, output_proto.sdk_dep_graph)
 
 
+def _ListResponse(_input_proto, output_proto, _config):
+  """Add fake dependency data to a successful response."""
+  package_dep = output_proto.package_deps.add()
+  package_dep.category = 'category'
+  package_dep.package_name = 'name'
+
+
+@faux.success(_ListResponse)
+@faux.empty_error
+@validate.require('sysroot.build_target.name')
+@validate.exists('sysroot.path')
+@validate.validation_complete
+def List(input_proto: depgraph_pb2.ListRequest,
+         output_proto: depgraph_pb2.ListResponse,
+         _config: api_config.ApiConfig):
+  """Get a list of package dependencies.
+
+  Args:
+    input_proto: The input arguments message.
+    output_proto: The empty output message.
+    _config: The API call config.
+  """
+  build_target = controller_util.ParseBuildTarget(
+      input_proto.sysroot.build_target)
+  sysroot_path = input_proto.sysroot.path
+  src_paths = [src_path.path for src_path in input_proto.src_paths]
+  packages = [controller_util.PackageInfoToCPV(x) for x in input_proto.packages]
+
+  package_deps = dependency.GetDependencies(
+      sysroot_path,
+      build_target=build_target,
+      src_paths=src_paths,
+      packages=packages)
+  for package in package_deps:
+    package_info = output_proto.package_deps.add()
+    cpv = portage_util.SplitCPV(package, strict=False)
+    controller_util.CPVToPackageInfo(cpv, package_info)
+
+
 def _DummyGetToolchainPathsResponse(_input_proto, output_proto, _config):
   """Create a fake successful response for GetToolchainPaths."""
   dummy_entry = output_proto.paths.add()