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: continue 31 imp_proto = imp.group(1) 32 # This indicates an external dependency, which we should handle 33 # differently and not traverse recursively 34 if imp_proto.startswith('google/'): 35 if key not in deps_external: 36 deps_external[key] = [] 37 deps_external[key].append(imp_proto[:-6]) 38 continue 39 # In case that the path is changed by copybara, 40 # revert the change to avoid file error. 41 if imp_proto.startswith('third_party/grpc'): 42 imp_proto = imp_proto[17:] 43 if key not in deps: deps[key] = [] 44 deps[key].append(imp_proto[:-6]) 45 if is_trans: 46 update_deps(key, imp_proto, deps, deps_external, is_trans, 47 visited) 48 49 50def main(): 51 proto_dir = os.path.abspath(os.path.dirname(sys.argv[0])) 52 os.chdir(os.path.join(proto_dir, '../..')) 53 54 deps = {} 55 deps_trans = {} 56 deps_external = {} 57 deps_external_trans = {} 58 for root, dirs, files in os.walk('src/proto'): 59 for f in files: 60 if f[-6:] != '.proto': continue 61 look_at = os.path.join(root, f) 62 deps_for = look_at[:-6] 63 # First level deps 64 update_deps(deps_for, look_at, deps, deps_external, False, []) 65 # Transitive deps 66 update_deps(deps_for, look_at, deps_trans, deps_external_trans, 67 True, []) 68 69 json = { 70 'proto_deps': deps, 71 'proto_transitive_deps': deps_trans, 72 'proto_external_deps': deps_external, 73 'proto_transitive_external_deps': deps_external_trans 74 } 75 76 print(yaml.dump(json)) 77 78 79if __name__ == '__main__': 80 main() 81