Home | History | Annotate | Download | only in proto
      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