aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/go_proto_wrapper.py
diff options
context:
space:
mode:
authormialinx <mialinx@yandex-team.com>2023-06-23 16:19:33 +0300
committermialinx <mialinx@yandex-team.com>2023-06-23 16:19:33 +0300
commitb5b172e661d423983bd94fd2d50cfa9c173771bd (patch)
tree736b78059081a12be45f102a392e41f1faa11e45 /build/scripts/go_proto_wrapper.py
parent5e46f0301456285f1a47076638fcd7679cccafa4 (diff)
downloadydb-b5b172e661d423983bd94fd2d50cfa9c173771bd.tar.gz
Support for new progotobuf/grpc Go generators
Какие проблему решаем: 1) Текущий генератор (https://github.com/golang/protobuf/) - устаревший, и его рекомендуют заменить на новый (https://pkg.go.dev/google.golang.org/protobuf/cmd/protoc-gen-go) 2) Новый генератор использует интерфейсы в сгенерированных stubах ``` func RegisterTestAgentServiceServer(s grpc.ServiceRegistrar, srv TestAgentServiceServer) { // grpc.ServiceRegistrar - интерфейс ``` Вместо ``` func RegisterTestAgentServiceServer(s *grpc.Server, srv TestAgentServiceServer) { // *grpc.Server - конкретный тип ``` что необходимо нам для https://st.yandex-team.ru/ 3) чтобы не было попыток писать вот такое https://a.yandex-team.ru/arcadia/taxi/graph/fleet-tracking-system/grpc-gateway/go_lib/ya.make?rev=11743497#L25
Diffstat (limited to 'build/scripts/go_proto_wrapper.py')
-rw-r--r--build/scripts/go_proto_wrapper.py56
1 files changed, 38 insertions, 18 deletions
diff --git a/build/scripts/go_proto_wrapper.py b/build/scripts/go_proto_wrapper.py
index 159bd42c93..2f0d8ad5f3 100644
--- a/build/scripts/go_proto_wrapper.py
+++ b/build/scripts/go_proto_wrapper.py
@@ -1,4 +1,6 @@
from __future__ import absolute_import, unicode_literals
+
+import argparse
import os
import re
import shutil
@@ -10,6 +12,18 @@ import tempfile
OUT_DIR_FLAG_PATTERN = re.compile(r'^(--go(([-_]\w+))*_out=)')
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--arcadia-prefix', required=True)
+ parser.add_argument('--check', nargs='?', default=None)
+ parser.add_argument('--contrib-prefix', required=True)
+ parser.add_argument('--namespace', required=True)
+ parser.add_argument('--proto', required=True)
+ parser.add_argument('args', nargs='+')
+
+ return parser.parse_args()
+
+
def move_tree(src_root, dst_root):
for root, _, files in os.walk(src_root):
rel_dir = os.path.relpath(root, src_root)
@@ -20,7 +34,16 @@ def move_tree(src_root, dst_root):
os.rename(os.path.join(root, file), os.path.join(dst_dir, file))
-def main(arcadia_prefix, contrib_prefix, proto_namespace, args):
+def main(args):
+ arcadia_prefix = args.arcadia_prefix
+ contrib_prefoix = args.contrib_prefix
+ proto_namespace = args.namespace
+ check_output = args.check
+ proto_file = args.proto
+ args = list(args.args)
+
+ args.append(proto_file)
+
out_dir_orig = None
out_dir_temp = None
for i in range(len(args)):
@@ -54,28 +77,25 @@ def main(arcadia_prefix, contrib_prefix, proto_namespace, args):
out_dir_src = out_dir_temp
out_dir_dst = os.path.join(out_dir_orig, contrib_prefix)
- if not os.path.exists(out_dir_src) or is_from_contrib:
- protos = [x for x in args if x.endswith('.proto')]
- if not is_from_contrib or not all(x.startswith(contrib_prefix) for x in protos):
- proto_list = []
- option_re = re.compile(r'^\s*option\s+go_package\s*=\s*')
- for arg in protos:
- with open(arg, 'r') as f:
- if not any([re.match(option_re, line) for line in f]):
- proto_list.append(arg)
- if proto_list:
- sys.stderr.write(
- '\nError: Option go_package is not specified in the following proto files: {}\n'
- '\nNOTE! You can find detailed description of how to properly set go_package '
- 'option here https://wiki.yandex-team.ru/devrules/Go/#protobufigrpc'.format(', '.join(proto_list)))
- return 1
-
move_tree(out_dir_src, out_dir_dst)
+ if check_output and not os.path.exists(check_output):
+ package_name = None
+ option_re = re.compile(r'^\s*option\s+go_package\s*=\s*"([^"]+)"')
+ with open(proto_file, 'r') as f:
+ for line in f:
+ m = re.match(option_re, line)
+ if m:
+ package_name = m.group(1).split(';')[-1].split('/')[-1]
+ break
+ with open(check_output, 'w') as fout:
+ fout.write('// Code generated by go_proto_wrapper.py script. DO NOT EDIT.\n\npackage {}\n'.format(package_name))
+
shutil.rmtree(out_dir_temp)
return 0
if __name__ == '__main__':
- sys.exit(main(os.path.normpath(sys.argv[1]), os.path.normpath(sys.argv[2]), os.path.normpath(sys.argv[3]), sys.argv[4:]))
+ args = parse_args()
+ sys.exit(main(args))