aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/generate_mf.py
blob: 76997020cc468e20ff48392ab10273fe910995c4 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import json 
import logging 
import optparse 
import os 
import sys 
import io
 
import process_command_files as pcf
 
class BadMfError(Exception): 
    pass 
 
 
class GplNotAllowed(Exception): 
    pass 
 
 
def process_quotes(s):
    for quote_char in '\'"':
        if s.startswith(quote_char) and s.endswith(quote_char):
            return s[1:-1]
    return s


def parse_args(): 
    args = pcf.get_args(sys.argv[1:])
    lics, peers, free_args, credits = [], [], [], []
    current_list = free_args 
    for a in args: 
        if a == '-Ya,lics': 
            current_list = lics 
        elif a == '-Ya,peers': 
            current_list = peers 
        elif a == '-Ya,credits':
            current_list = credits
        elif a and a.startswith('-'): 
            current_list = free_args 
            current_list.append(a) 
        else: 
            current_list.append(a) 
 
    parser = optparse.OptionParser() 
    parser.add_option('--build-root') 
    parser.add_option('--module-name') 
    parser.add_option('-o', '--output') 
    parser.add_option('-c', '--credits-output')
    parser.add_option('-t', '--type') 
    opts, _ = parser.parse_args(free_args) 
    return lics, peers, credits, opts,
 
 
def generate_header(meta):
    return '-' * 20 + meta.get('path', 'Unknown module') + '-' * 20


def generate_mf(): 
    lics, peers, credits, options = parse_args()
 
    meta = {
        'module_name': options.module_name,
        'path': os.path.dirname(options.output),
        'licenses': lics,
        'dependencies': [],
        'license_texts': ''
    }
 
    build_root = options.build_root 
    file_name = os.path.join(build_root, options.output) 
 
    if options.type != 'LIBRARY':
        for rel_filename in peers:
            with open(os.path.join(build_root, rel_filename + '.mf')) as peer_file:
                peer_meta = json.load(peer_file)
                meta['dependencies'].append(peer_meta)
 
    if credits:
        union_texts = []
        for texts_file in credits:
            with open(process_quotes(texts_file)) as f:
                union_texts.append(f.read())
        meta['license_texts'] = '\n\n'.join(union_texts)

    if options.credits_output:
        final_credits = []
        if meta['license_texts']:
            final_credits.append(generate_header(meta) + '\n' + meta['license_texts'])
        for peer in peers:
            candidate = os.path.join(build_root, peer + '.mf')
            with open(candidate) as src:
                data = json.loads(src.read())
                texts = data.get('license_texts')
                if texts:
                    candidate_text = generate_header(data) + '\n' + texts
                    if isinstance(candidate_text, unicode):
                        candidate_text = candidate_text.encode('utf-8')
                    final_credits.append(candidate_text)

        with io.open(options.credits_output, 'w', encoding='utf-8') as f:
            data = '\n\n'.join(final_credits)
            if isinstance(data, str):
                data = data.decode('utf-8')
            f.write(data)

    with open(file_name, 'w') as mf_file: 
        json.dump(meta, mf_file, indent=4) 
 
 
if __name__ == '__main__': 
    try:
        generate_mf()
    except Exception as e:
        sys.stderr.write(str(e) + '\n')
        sys.exit(1)