blob: 1a935b56d8932d03ee5b58aaca241b9455c5e9c6 [file] [log] [blame]
Craig Tiller1b4e3302015-12-17 16:35:00 -08001#!/usr/bin/env python2.7
Jan Tattermusch7897ae92017-06-07 22:57:36 +02002# Copyright 2015 gRPC authors.
Craig Tiller1b4e3302015-12-17 16:35:00 -08003#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02004# 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
Craig Tiller1b4e3302015-12-17 16:35:00 -08007#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02008# http://www.apache.org/licenses/LICENSE-2.0
Craig Tiller1b4e3302015-12-17 16:35:00 -08009#
Jan Tattermusch7897ae92017-06-07 22:57:36 +020010# 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.
Craig Tiller1b4e3302015-12-17 16:35:00 -080015
16
17"""Generates the appropriate build.json data for all the proto files."""
18import yaml
19import collections
20import os
21import re
22import sys
23
murgatroid990d4b13c2016-04-05 09:35:41 -070024def update_deps(key, proto_filename, deps, deps_external, is_trans, visited):
Sree Kuchibhotlac819e502016-01-14 11:16:10 -080025 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)
murgatroid990d4b13c2016-04-05 09:35:41 -070032 # 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
Sree Kuchibhotlac819e502016-01-14 11:16:10 -080039 if key not in deps: deps[key] = []
40 deps[key].append(imp_proto[:-6])
41 if is_trans:
murgatroid990d4b13c2016-04-05 09:35:41 -070042 update_deps(key, imp_proto, deps, deps_external, is_trans, visited)
Sree Kuchibhotlac819e502016-01-14 11:16:10 -080043
Craig Tiller1b4e3302015-12-17 16:35:00 -080044def main():
Sree Kuchibhotlac819e502016-01-14 11:16:10 -080045 proto_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
46 os.chdir(os.path.join(proto_dir, '../..'))
47
Craig Tiller1b4e3302015-12-17 16:35:00 -080048 deps = {}
Sree Kuchibhotlac819e502016-01-14 11:16:10 -080049 deps_trans = {}
murgatroid990d4b13c2016-04-05 09:35:41 -070050 deps_external = {}
51 deps_external_trans = {}
Sree Kuchibhotla80b6a472016-01-14 11:26:54 -080052 for root, dirs, files in os.walk('src/proto'):
Craig Tiller1b4e3302015-12-17 16:35:00 -080053 for f in files:
54 if f[-6:] != '.proto': continue
55 look_at = os.path.join(root, f)
Sree Kuchibhotlac819e502016-01-14 11:16:10 -080056 deps_for = look_at[:-6]
murgatroid990d4b13c2016-04-05 09:35:41 -070057 # 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, [])
Craig Tiller1b4e3302015-12-17 16:35:00 -080061
62 json = {
Sree Kuchibhotlac819e502016-01-14 11:16:10 -080063 'proto_deps': deps,
murgatroid990d4b13c2016-04-05 09:35:41 -070064 'proto_transitive_deps': deps_trans,
65 'proto_external_deps': deps_external,
66 'proto_transitive_external_deps': deps_external_trans
Craig Tiller1b4e3302015-12-17 16:35:00 -080067 }
68
69 print yaml.dump(json)
70
71if __name__ == '__main__':
72 main()