| #!/usr/bin/env python2.7 |
| # Copyright 2015 gRPC authors. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| """Generates the appropriate build.json data for all the proto files.""" |
| import yaml |
| import collections |
| import os |
| import re |
| import sys |
| |
| def update_deps(key, proto_filename, deps, deps_external, is_trans, visited): |
| if not proto_filename in visited: |
| visited.append(proto_filename) |
| with open(proto_filename) as inp: |
| for line in inp: |
| imp = re.search(r'import "([^"]*)"', line) |
| if not imp: continue |
| imp_proto = imp.group(1) |
| # This indicates an external dependency, which we should handle |
| # differently and not traverse recursively |
| if imp_proto.startswith('google/'): |
| if key not in deps_external: |
| deps_external[key] = [] |
| deps_external[key].append(imp_proto[:-6]) |
| continue |
| if key not in deps: deps[key] = [] |
| deps[key].append(imp_proto[:-6]) |
| if is_trans: |
| update_deps(key, imp_proto, deps, deps_external, is_trans, visited) |
| |
| def main(): |
| proto_dir = os.path.abspath(os.path.dirname(sys.argv[0])) |
| os.chdir(os.path.join(proto_dir, '../..')) |
| |
| deps = {} |
| deps_trans = {} |
| deps_external = {} |
| deps_external_trans = {} |
| for root, dirs, files in os.walk('src/proto'): |
| for f in files: |
| if f[-6:] != '.proto': continue |
| look_at = os.path.join(root, f) |
| deps_for = look_at[:-6] |
| # First level deps |
| update_deps(deps_for, look_at, deps, deps_external, False, []) |
| # Transitive deps |
| update_deps(deps_for, look_at, deps_trans, deps_external_trans, True, []) |
| |
| json = { |
| 'proto_deps': deps, |
| 'proto_transitive_deps': deps_trans, |
| 'proto_external_deps': deps_external, |
| 'proto_transitive_external_deps': deps_external_trans |
| } |
| |
| print yaml.dump(json) |
| |
| if __name__ == '__main__': |
| main() |