aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/link_asrc.py
blob: 42b7ef0641f9be71231262496df8ca70272ebcbf (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import argparse
import itertools
import os
import sys
import tarfile


DELIM_JAVA = '__DELIM_JAVA__'
DELIM_RES = '__DELIM_RES__'
DELIM_ASSETS = '__DELIM_ASSETS__'
DELIM_AIDL = '__DELIM_AIDL__'

DELIMS = (
    DELIM_JAVA,
    DELIM_RES,
    DELIM_ASSETS,
    DELIM_AIDL,
)

DESTS = {
    DELIM_JAVA: 'src',
    DELIM_RES: 'res',
    DELIM_ASSETS: 'assets',
    DELIM_AIDL: 'aidl',
}


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--asrcs', nargs='*')
    parser.add_argument('--input', nargs='*')
    parser.add_argument('--jsrcs', nargs='*')
    parser.add_argument('--output', required=True)
    parser.add_argument('--work', required=True)

    return parser.parse_args()


def main():
    args = parse_args()

    files = []
    parts = []

    if args.input and len(args.input) > 0:
        for x in args.input:
            if x in DELIMS:
                assert len(parts) == 0 or len(parts[-1]) > 1
                parts.append([x])
            else:
                assert len(parts) > 0
                parts[-1].append(x)
        assert len(parts[-1]) > 1

    if args.jsrcs and len(args.jsrcs):
        src_dir = os.path.join(args.work, DESTS[DELIM_JAVA])
        os.makedirs(src_dir)

        for jsrc in filter(lambda x: x.endswith('.jsrc'), args.jsrcs):
            with tarfile.open(jsrc, 'r') as tar:
                names = tar.getnames()
                if names and len(names) > 0:
                    parts.append([DELIM_JAVA, src_dir])
                    parts[-1].extend(itertools.imap(lambda x: os.path.join(src_dir, x), names))
                    if sys.version_info >= (3, 12):
                        tar.extractall(path=src_dir, filter='data')
                    else:
                        tar.extractall(path=src_dir)

    if args.asrcs and len(args.asrcs):
        for asrc in filter(lambda x: x.endswith('.asrc') and os.path.exists(x), args.asrcs):
            with tarfile.open(asrc, 'r') as tar:
                files.extend(tar.getnames())
                if sys.version_info >= (3, 12):
                    tar.extractall(path=args.work, filter='data')
                else:
                    tar.extractall(path=args.work)

    with tarfile.open(args.output, 'w') as out:
        for part in parts:
            dest = DESTS[part[0]]
            prefix = part[1]
            for f in part[2:]:
                out.add(f, arcname=os.path.join(dest, os.path.relpath(f, prefix)))

        for f in files:
            out.add(os.path.join(args.work, f), arcname=f)


if __name__ == '__main__':
    main()