#!/usr/bin/env python2.7 # Copyright 2015 gRPC 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 # # http://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. """Generates the appropriate build.json data for all the proto files.""" import yaml import collections import os import re import sys def update_deps(key, proto_filename, deps, deps_external, is_trans, visited): if not proto_filename in visited: visited.append(proto_filename) with open(proto_filename) as inp: for line in inp: imp = re.search(r'import "([^"]*)"', line) if not imp: continue imp_proto = imp.group(1) # This indicates an external dependency, which we should handle # differently and not traverse recursively if imp_proto.startswith('google/'): if key not in deps_external: deps_external[key] = [] deps_external[key].append(imp_proto[:-6]) continue # In case that the path is changed by copybara, # revert the change to avoid file error. if imp_proto.startswith('third_party/grpc'): imp_proto = imp_proto[17:] if key not in deps: deps[key] = [] deps[key].append(imp_proto[:-6]) if is_trans: update_deps(key, imp_proto, deps, deps_external, is_trans, visited) def main(): proto_dir = os.path.abspath(os.path.dirname(sys.argv[0])) os.chdir(os.path.join(proto_dir, '../..')) deps = {} deps_trans = {} deps_external = {} deps_external_trans = {} for root, dirs, files in os.walk('src/proto'): for f in files: if f[-6:] != '.proto': continue look_at = os.path.join(root, f) deps_for = look_at[:-6] # First level deps update_deps(deps_for, look_at, deps, deps_external, False, []) # Transitive deps update_deps(deps_for, look_at, deps_trans, deps_external_trans, True, []) json = { 'proto_deps': deps, 'proto_transitive_deps': deps_trans, 'proto_external_deps': deps_external, 'proto_transitive_external_deps': deps_external_trans } print(yaml.dump(json)) if __name__ == '__main__': main()