gen_java_codenav_entry.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import argparse
  2. import datetime
  3. import os
  4. import subprocess
  5. import sys
  6. import tarfile
  7. def extract_kindexes(kindexes):
  8. for kindex in kindexes:
  9. with tarfile.TarFile(kindex) as tf:
  10. for fname in [i for i in tf.getnames() if i.endswith('.kzip')]:
  11. tf.extract(fname)
  12. yield fname
  13. def just_do_it(java, kythe, kythe_to_proto, out_name, binding_only, kindexes):
  14. temp_out_name = out_name + '.temp'
  15. kindex_inputs = list(extract_kindexes(kindexes))
  16. open(temp_out_name, 'w').close()
  17. start = datetime.datetime.now()
  18. for kindex in kindex_inputs:
  19. print >> sys.stderr, '[INFO] Processing:', kindex
  20. indexer_start = datetime.datetime.now()
  21. p = subprocess.Popen([java, '-jar', os.path.join(kythe, 'indexers/java_indexer.jar'), kindex], stdout=subprocess.PIPE)
  22. indexer_out, _ = p.communicate()
  23. print >> sys.stderr, '[INFO] Indexer execution time:', (datetime.datetime.now() - indexer_start).total_seconds(), 'seconds'
  24. if p.returncode:
  25. raise Exception('java_indexer failed with exit code {}'.format(p.returncode))
  26. dedup_start = datetime.datetime.now()
  27. p = subprocess.Popen([os.path.join(kythe, 'tools/dedup_stream')], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
  28. dedup_out, _ = p.communicate(indexer_out)
  29. print >> sys.stderr, '[INFO] Dedup execution time:', (datetime.datetime.now() - dedup_start).total_seconds(), 'seconds'
  30. if p.returncode:
  31. raise Exception('dedup_stream failed with exit code {}'.format(p.returncode))
  32. entrystream_start = datetime.datetime.now()
  33. p = subprocess.Popen([os.path.join(kythe, 'tools/entrystream'), '--write_json'], stdin=subprocess.PIPE, stdout=open(temp_out_name, 'a'))
  34. p.communicate(dedup_out)
  35. if p.returncode:
  36. raise Exception('entrystream failed with exit code {}'.format(p.returncode))
  37. print >> sys.stderr, '[INFO] Entrystream execution time:', (datetime.datetime.now() - entrystream_start).total_seconds(), 'seconds'
  38. preprocess_start = datetime.datetime.now()
  39. subprocess.check_call([kythe_to_proto, '--preprocess-entry', '--entries', temp_out_name, '--out', out_name] + (['--only-binding-data'] if binding_only else []))
  40. print >> sys.stderr, '[INFO] Preprocessing execution time:', (datetime.datetime.now() - preprocess_start).total_seconds(), 'seconds'
  41. print >> sys.stderr, '[INFO] Total execution time:', (datetime.datetime.now() - start).total_seconds(), 'seconds'
  42. if __name__ == '__main__':
  43. parser = argparse.ArgumentParser()
  44. parser.add_argument("--java", help="java path")
  45. parser.add_argument("--kythe", help="kythe path")
  46. parser.add_argument("--kythe-to-proto", help="kythe_to_proto tool path")
  47. parser.add_argument("--out-name", help="entries json out name")
  48. parser.add_argument("--binding-only", action="store_true", default=False, help="filter only binding data")
  49. parser.add_argument("kindexes", nargs='*')
  50. args = parser.parse_args()
  51. just_do_it(args.java, args.kythe, args.kythe_to_proto, args.out_name, args.binding_only, args.kindexes)