summary refs log tree commit diff
path: root/pkgs/build-support/vm/windows/cygwin-iso/mkclosure.py
blob: 4c0d67c43bacc6db349a584a7e523411d0c460bd (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
# Ugliest Python code I've ever written. -- aszlig
import sys

def get_plist(path):
    in_pack = False
    in_str = False
    current_key = None
    buf = ""
    packages = {}
    package_name = None
    package_attrs = {}
    with open(path, 'r') as setup:
        for line in setup:
            if in_str and line.rstrip().endswith('"'):
                package_attrs[current_key] = buf + line.rstrip()[:-1]
                in_str = False
                continue
            elif in_str:
                buf += line
                continue

            if line.startswith('@'):
                in_pack = True
                package_name = line[1:].strip()
                package_attrs = {}
            elif in_pack and ':' in line:
                key, value = line.split(':', 1)
                if value.lstrip().startswith('"'):
                    if value.lstrip()[1:].rstrip().endswith('"'):
                        value = value.strip().strip('"')
                    else:
                        in_str = True
                        current_key = key.strip().lower()
                        buf = value.lstrip()[1:]
                        continue
                package_attrs[key.strip().lower()] = value.strip()
            elif in_pack:
                in_pack = False
                packages[package_name] = package_attrs
    return packages

def main():
    packages = get_plist(sys.argv[1])
    to_include = set()

    def traverse(package):
        to_include.add(package)
        attrs = packages.get(package, {})
        deps = attrs.get('requires', '').split()
        for new_dep in set(deps) - to_include:
            traverse(new_dep)

    map(traverse, sys.argv[2:])

    sys.stdout.write('[\n')
    for package, attrs in packages.iteritems():
        if package not in to_include:
            cats = [c.lower() for c in attrs.get('category', '').split()]
            if 'base' not in cats:
                continue

        install_line = attrs.get('install')
        if install_line is None:
            continue

        url, size, hash = install_line.split(' ', 2)

        pack = [
            '  {',
            '    url = "{0}";'.format(url),
            '    hash = "{0}";'.format(hash),
            '  }',
        ];
        sys.stdout.write('\n'.join(pack) + '\n')
    sys.stdout.write(']\n')

if __name__ == '__main__':
    main()