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.""" 18 import yaml 19 import collections 20 import os 21 import re 22 import sys 23 24 def 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 44 def 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 71 if __name__ == '__main__': 72 main() 73