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 16 17"""Generates the appropriate build.json data for all the proto files.""" 18import yaml 19import collections 20import os 21import re 22import sys 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 if key not in deps: deps[key] = [] 40 deps[key].append(imp_proto[:-6]) 41 if is_trans: 42 update_deps(key, imp_proto, deps, deps_external, is_trans, visited) 43 44def main(): 45 proto_dir = os.path.abspath(os.path.dirname(sys.argv[0])) 46 os.chdir(os.path.join(proto_dir, '../..')) 47 48 deps = {} 49 deps_trans = {} 50 deps_external = {} 51 deps_external_trans = {} 52 for root, dirs, files in os.walk('src/proto'): 53 for f in files: 54 if f[-6:] != '.proto': continue 55 look_at = os.path.join(root, f) 56 deps_for = look_at[:-6] 57 # First level deps 58 update_deps(deps_for, look_at, deps, deps_external, False, []) 59 # Transitive deps 60 update_deps(deps_for, look_at, deps_trans, deps_external_trans, True, []) 61 62 json = { 63 'proto_deps': deps, 64 'proto_transitive_deps': deps_trans, 65 'proto_external_deps': deps_external, 66 'proto_transitive_external_deps': deps_external_trans 67 } 68 69 print yaml.dump(json) 70 71if __name__ == '__main__': 72 main() 73