Enforce that all java protos explicitly specify java_package

Also:
- updates build/protoc_java.py to use argparse instead of optparse.
- removes deprecated references to proto nano

Bug: 1114836
Change-Id: I184e6e262159ecb79cdf980a8c48e9d7f28c7d12
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2434908
Auto-Submit: Mohamed Heikal <[email protected]>
Reviewed-by: Peter Wen <[email protected]>
Commit-Queue: Mohamed Heikal <[email protected]>
Cr-Commit-Position: refs/heads/master@{#811662}
diff --git a/build/protoc_java.py b/build/protoc_java.py
index e6147d8b..fe602a9 100755
--- a/build/protoc_java.py
+++ b/build/protoc_java.py
@@ -5,7 +5,7 @@
 
 """Generate java source files from protobuf files.
 
-This is a helper file for the genproto_java action in protoc_java.gypi.
+This is the action script for the proto_java_library template.
 
 It performs the following steps:
 1. Deletes all old sources (ensures deleted classes are not part of new jars).
@@ -17,51 +17,63 @@
 
 from __future__ import print_function
 
+import argparse
 import os
-import optparse
 import shutil
 import subprocess
 import sys
 
-sys.path.append(os.path.join(os.path.dirname(__file__), "android", "gyp"))
+sys.path.append(os.path.join(os.path.dirname(__file__), 'android', 'gyp'))
 from util import build_utils
 
+
+def _HasJavaPackage(proto_lines):
+  return any(line.strip().startswith('option java_package')
+             for line in proto_lines)
+
+
+def _EnforceJavaPackage(proto_srcs):
+  for proto_path in proto_srcs:
+    with open(proto_path) as in_proto:
+      if not _HasJavaPackage(in_proto.readlines()):
+        raise Exception('Proto files for java must contain a "java_package" '
+                        'line: {}'.format(proto_path))
+
+
 def main(argv):
-  parser = optparse.OptionParser()
+  parser = argparse.ArgumentParser()
   build_utils.AddDepfileOption(parser)
-  parser.add_option("--protoc", help="Path to protoc binary.")
-  parser.add_option("--proto-path", help="Path to proto directory.")
-  parser.add_option("--java-out-dir",
-      help="Path to output directory for java files.")
-  parser.add_option("--srcjar", help="Path to output srcjar.")
-  parser.add_option("--stamp", help="File to touch on success.")
-  parser.add_option("--nano",
-      help="Use to generate nano protos.", action='store_true')
-  parser.add_option("--import-dir", action="append", default=[],
-                    help="Extra import directory for protos, can be repeated.")
-  options, args = parser.parse_args(argv)
+  parser.add_argument('--protoc', required=True, help='Path to protoc binary.')
+  parser.add_argument('--proto-path',
+                      required=True,
+                      help='Path to proto directory.')
+  parser.add_argument('--java-out-dir',
+                      help='Path to output directory for java files.')
+  parser.add_argument('--srcjar', help='Path to output srcjar.')
+  parser.add_argument('--stamp', help='File to touch on success.')
+  parser.add_argument(
+      '--import-dir',
+      action='append',
+      default=[],
+      help='Extra import directory for protos, can be repeated.')
+  parser.add_argument('protos', nargs='+', help='proto source files')
+  options = parser.parse_args(argv)
 
-  build_utils.CheckOptions(options, parser, ['protoc', 'proto_path'])
   if not options.java_out_dir and not options.srcjar:
-    print('One of --java-out-dir or --srcjar must be specified.')
-    return 1
+    raise Exception('One of --java-out-dir or --srcjar must be specified.')
 
-  proto_path_args = ['--proto_path', options.proto_path]
-  for path in options.import_dir:
-    proto_path_args += ["--proto_path", path]
+  _EnforceJavaPackage(options.protos)
 
   with build_utils.TempDir() as temp_dir:
-    if options.nano:
-      # Specify arguments to the generator.
-      generator_args = ['optional_field_style=reftypes',
-                        'store_unknown_fields=true']
-      out_arg = '--javanano_out=' + ','.join(generator_args) + ':' + temp_dir
-    else:
-      out_arg = '--java_out=lite:' + temp_dir
+    out_arg = '--java_out=lite:' + temp_dir
+
+    proto_path_args = ['--proto_path', options.proto_path]
+    for path in options.import_dir:
+      proto_path_args += ["--proto_path", path]
 
     # Generate Java files using protoc.
     build_utils.CheckOutput(
-        [options.protoc] + proto_path_args + [out_arg] + args,
+        [options.protoc] + proto_path_args + [out_arg] + options.protos,
         # protoc generates superfluous warnings about LITE_RUNTIME deprecation
         # even though we are using the new non-deprecated method.
         stderr_filter=lambda output: build_utils.FilterLines(
@@ -76,7 +88,7 @@
 
   if options.depfile:
     assert options.srcjar
-    deps = args + [options.protoc]
+    deps = options.protos + [options.protoc]
     build_utils.WriteDepfile(options.depfile, options.srcjar, deps)
 
   if options.stamp: