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(key, imp_proto, deps, deps_external, is_trans, 49 visited) 50 51 52def main(): 53 proto_dir = os.path.abspath(os.path.dirname(sys.argv[0])) 54 os.chdir(os.path.join(proto_dir, '../..')) 55 56 deps = {} 57 deps_trans = {} 58 deps_external = {} 59 deps_external_trans = {} 60 for root, dirs, files in os.walk('src/proto'): 61 for f in files: 62 if f[-6:] != '.proto': 63 continue 64 look_at = os.path.join(root, f) 65 deps_for = look_at[:-6] 66 # First level deps 67 update_deps(deps_for, look_at, deps, deps_external, False, []) 68 # Transitive deps 69 update_deps(deps_for, look_at, deps_trans, deps_external_trans, 70 True, []) 71 72 json = { 73 'proto_deps': deps, 74 'proto_transitive_deps': deps_trans, 75 'proto_external_deps': deps_external, 76 'proto_transitive_external_deps': deps_external_trans 77 } 78 79 print(yaml.dump(json)) 80 81 82if __name__ == '__main__': 83 main() 84