[build api] Add proto that represents the depgraph.
BUG=chromium:917174
TEST=unittests, run: `./api/build_api
chromite.api.DependencyService/GetBuildDependencyGraph --input-json=input.json --output-json=output.json`
Change-Id: Ic489343fac3ab673d5844d5f8295d7e624352fe6
Reviewed-on: https://chromium-review.googlesource.com/1478371
Commit-Ready: Ned Nguyen <nednguyen@google.com>
Tested-by: Ned Nguyen <nednguyen@google.com>
Reviewed-by: Ned Nguyen <nednguyen@google.com>
Reviewed-by: Alex Klein <saklein@chromium.org>
diff --git a/api/service/board_build_dependency.py b/api/service/board_build_dependency.py
index 8358dfe..93f35dc 100644
--- a/api/service/board_build_dependency.py
+++ b/api/service/board_build_dependency.py
@@ -11,10 +11,43 @@
from __future__ import print_function
-import json
-
+from chromite.api.gen import depgraph_pb2
from chromite.lib.api import dependency
+from chromite.lib import portage_util
+from google.protobuf import json_format
+
+
+def CreateDepGraphProtoFromJsonMap(json_map):
+ """Return the depgraph proto message from package deps json map.
+
+ Args:
+ json_map: the json object that stores the portage package. This is
+ generated from chromite.lib.api.dependency.GetBuildDependency()
+ """
+ graph = depgraph_pb2.DepGraph()
+ graph.build_target.name = json_map['target_board']
+
+ for data in json_map['package_deps'].itervalues():
+ package_dep_info = graph.package_deps.add()
+ package_info = package_dep_info.package_info
+ package_info.package_name = data['name']
+ package_info.category = data['category']
+ package_info.version = data['version']
+ for dep in data['deps']:
+ cpv = portage_util.SplitCPV(dep, strict=False)
+ dep_package = package_dep_info.dependency_packages.add()
+ dep_package.package_name = cpv.package
+ dep_package.category = cpv.category
+ if cpv.version:
+ dep_package.version = cpv.version
+
+ package_CP = '%s/%s' % (package_info.category, package_info.package_name)
+ for path in json_map['source_path_mapping'][package_CP]:
+ source_path = package_dep_info.dependency_source_paths.add()
+ source_path.path = path
+
+ return graph
def GetBuildDependencyGraph(input_proto, output_proto):
"""Create the build dependency graph.
@@ -29,8 +62,12 @@
assert board, 'Missing build target name'
assert output_path, 'Missing output file'
+
json_map = dependency.GetBuildDependency(board)
+ graph = CreateDepGraphProtoFromJsonMap(json_map)
+
with open(output_path, 'w') as f:
- json.dump(json_map, f, indent=2, sort_keys=True)
+ f.write(
+ json_format.MessageToJson(graph, including_default_value_fields=True))
output_proto.build_dependency_graph_file = output_path