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