src/proto/gen_build_yaml.py
Go to the documentation of this file.
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 """Generates the appropriate build.json data for all the proto files."""
16 
17 import yaml
18 import collections
19 import os
20 import re
21 import sys
22 
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:
31  continue
32  imp_proto = imp.group(1)
33  # This indicates an external dependency, which we should handle
34  # differently and not traverse recursively
35  if imp_proto.startswith('google/'):
36  if key not in deps_external:
37  deps_external[key] = []
38  deps_external[key].append(imp_proto[:-6])
39  continue
40  # In case that the path is changed by copybara,
41  # revert the change to avoid file error.
42  if imp_proto.startswith('third_party/grpc'):
43  imp_proto = imp_proto[17:]
44  if key not in deps:
45  deps[key] = []
46  deps[key].append(imp_proto[:-6])
47  if is_trans:
48  update_deps(key, imp_proto, deps, deps_external, is_trans,
49  visited)
50 
51 
52 def main():
53  proto_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
54  os.chdir(os.path.join(proto_dir, '../..'))
55 
56  deps = {}
57  deps_trans = {}
58  deps_external = {}
59  deps_external_trans = {}
60  for root, dirs, files in os.walk('src/proto'):
61  for f in files:
62  if f[-6:] != '.proto':
63  continue
64  look_at = os.path.join(root, f)
65  deps_for = look_at[:-6]
66  # First level deps
67  update_deps(deps_for, look_at, deps, deps_external, False, [])
68  # Transitive deps
69  update_deps(deps_for, look_at, deps_trans, deps_external_trans,
70  True, [])
71 
72  json = {
73  'proto_deps': deps,
74  'proto_transitive_deps': deps_trans,
75  'proto_external_deps': deps_external,
76  'proto_transitive_external_deps': deps_external_trans
77  }
78 
79  print(yaml.dump(json))
80 
81 
82 if __name__ == '__main__':
83  main()
gen_build_yaml.update_deps
def update_deps(key, proto_filename, deps, deps_external, is_trans, visited)
Definition: src/proto/gen_build_yaml.py:24
gen_build_yaml.main
def main()
Definition: src/proto/gen_build_yaml.py:52
main
Definition: main.py:1
open
#define open
Definition: test-fs.c:46


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:25