aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/gen_py_protos.py
blob: 1bfbc52cdddff09c24d50d2b1cb5062313be44cf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import os 
from os import path 
import shutil 
import subprocess 
import sys 
import tempfile 
import argparse
import re
 
 
OUT_DIR_ARG = '--python_out=' 
 
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--suffixes", nargs="*", default=[])
    parser.add_argument("protoc_args", nargs=argparse.REMAINDER)
    script_args = parser.parse_args()

    args = script_args.protoc_args

    if args[0] == "--":
        args = args[1:]

    out_dir_orig = None 
    out_dir_temp = None 
    plugin_out_dirs_orig = {}
    for i in range(len(args)): 
        if args[i].startswith(OUT_DIR_ARG): 
            assert not out_dir_orig, 'Duplicate "{0}" param'.format(OUT_DIR_ARG) 
            out_dir_orig = args[i][len(OUT_DIR_ARG):] 
            out_dir_temp = tempfile.mkdtemp(dir=out_dir_orig) 
            args[i] = OUT_DIR_ARG + out_dir_temp 
            continue

        match = re.match(r"^(--(\w+)_out=).*", args[i])
        if match:
            plugin_out_dir_arg = match.group(1)
            plugin = match.group(2)
            assert plugin not in plugin_out_dirs_orig, 'Duplicate "{0}" param'.format(plugin_out_dir_arg)
            plugin_out_dirs_orig[plugin] = args[i][len(plugin_out_dir_arg):]
            assert plugin_out_dirs_orig[plugin] == out_dir_orig, 'Params "{0}" and "{1}" expected to have the same value'.format(OUT_DIR_ARG, plugin_out_dir_arg)
            args[i] = plugin_out_dir_arg + out_dir_temp

    assert out_dir_temp, 'Param "{0}" not found'.format(OUT_DIR_ARG) 
 
    retcode = subprocess.call(args) 
    assert not retcode, 'Protoc failed for command {}'.format(' '.join(args))
 
    for root_temp, dirs, files in os.walk(out_dir_temp): 
        sub_dir = path.relpath(root_temp, out_dir_temp) 
        root_orig = path.join(out_dir_orig, sub_dir) 
        for d in dirs: 
            d_orig = path.join(root_orig, d) 
            if not path.exists(d_orig): 
                os.mkdir(d_orig) 
        for f in files: 
            f_orig = f 
            for suf in script_args.suffixes:
                if f.endswith(suf):
                    f_orig = f[:-len(suf)] + "__int__" + suf
                    break 
            os.rename(path.join(root_temp, f), path.join(root_orig, f_orig)) 
    shutil.rmtree(out_dir_temp) 
 
 
if __name__ == '__main__': 
    main()