1#!/usr/bin/env python2.7 2# Copyright 2015 gRPC authors. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15"""Generates the appropriate build.json data for all the proto files.""" 16 17import yaml 18import collections 19import os 20import re 21import sys 22 23 24def update_deps(key, proto_filename, deps, deps_external, is_trans, visited): 25 if not proto_filename in visited: 26 visited.append(proto_filename) 27 with open(proto_filename) as inp: 28 for line in inp: 29 imp = re.search(r'import "([^"]*)"', line) 30 if not imp: 31 continue 32 imp_proto = imp.group(1) 33 # This indicates an external dependency, which we should handle 34 # differently and not traverse recursively 35 if imp_proto.startswith("google/"): 36 if key not in deps_external: 37 deps_external[key] = [] 38 deps_external[key].append(imp_proto[:-6]) 39 continue 40 # In case that the path is changed by copybara, 41 # revert the change to avoid file error. 42 if imp_proto.startswith("third_party/grpc"): 43 imp_proto = imp_proto[17:] 44 if key not in deps: 45 deps[key] = [] 46 deps[key].append(imp_proto[:-6]) 47 if is_trans: 48 update_deps( 49 key, imp_proto, deps, deps_external, is_trans, visited 50 ) 51 52 53def main(): 54 proto_dir = os.path.abspath(os.path.dirname(sys.argv[0])) 55 os.chdir(os.path.join(proto_dir, "../..")) 56 57 deps = {} 58 deps_trans = {} 59 deps_external = {} 60 deps_external_trans = {} 61 for root, dirs, files in os.walk("src/proto"): 62 for f in files: 63 if f[-6:] != ".proto": 64 continue 65 look_at = os.path.join(root, f) 66 deps_for = look_at[:-6] 67 # First level deps 68 update_deps(deps_for, look_at, deps, deps_external, False, []) 69 # Transitive deps 70 update_deps( 71 deps_for, look_at, deps_trans, deps_external_trans, True, [] 72 ) 73 74 json = { 75 "proto_deps": deps, 76 "proto_transitive_deps": deps_trans, 77 "proto_external_deps": deps_external, 78 "proto_transitive_external_deps": deps_external_trans, 79 } 80 81 print(yaml.dump(json)) 82 83 84if __name__ == "__main__": 85 main() 86