summaryrefslogtreecommitdiff
path: root/scripts/merge-patterns.py
blob: d49940493a0d8be355606f1d323881bad3638e55 (plain)
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
#!/usr/bin/python

import yaml
import sys, os
import optparse
from lxml import etree


def create_patterns(arch='i586', split=False, patterns_dir='patterns', output="."):

    rpm_ns="http://linux.duke.edu/metadata/rpm"
    pattern_ns="http://novell.com/package/metadata/suse/pattern"
    PATTERN = "{%s}" % pattern_ns
    if not split:	
        xmlroot = etree.Element("patterns")
        NSMAP = {None : pattern_ns, "rpm": rpm_ns, "patterns": pattern_ns}
    else:
        NSMAP = {None : pattern_ns, "rpm": rpm_ns}

    count = 0
    for f in sorted(os.listdir(patterns_dir)):
        if not f.endswith('.yaml'):
            continue
        count = count + 1
        stream = file("%s/%s" %(patterns_dir,f), 'r')
        y = yaml.load(stream)
        if y.has_key('Arch') and y['Arch'] != arch:
            print "Skipping pattern '%s' because architecture doesn't match ('%s' vs '%s')." % (y['Name'], y['Arch'], arch)
            continue
        if split:
            proot = etree.Element("pattern", nsmap=NSMAP)
        else:
            proot = etree.SubElement(xmlroot, "pattern",  nsmap=NSMAP)

        etree.SubElement(proot, "name").text = y['Name']
        etree.SubElement(proot, "summary").text = y['Summary']
        etree.SubElement(proot, "description").text = y['Description']
        etree.SubElement(proot, "uservisible")
        cat = etree.SubElement(proot, "category")
        cat.text = "Base Group"
        cat.set("lang", "en")
        req = etree.SubElement(proot, "{%s}requires" %rpm_ns)
        if y.has_key('Patterns'):
            collect = []
            for pat in y['Patterns']:
                if os.path.exists("%s/%s.yaml" %(patterns_dir, pat)):
                    pf = file("%s/%s.yaml" %(patterns_dir, pat), 'r')
                    pfy = yaml.load(pf)
                    if pfy.has_key('Packages'):
                        collect += pfy['Packages']
        elif y.has_key('Packages'):
            collect = y['Packages']

        for p in collect:
            if type(p).__name__=='dict':
                a = p.values()[0]
                if a == arch:
                    entry = etree.SubElement(req, "{%s}entry" %rpm_ns)
                    entry.set("name", p.keys()[0])
                    entry.set("arch", arch)
            else:
                entry = etree.SubElement(req, "{%s}entry" %rpm_ns)
                entry.set("name", p)
        if split:
            tree = etree.ElementTree(proot)
            tree.write("%s.xml" %y['Name'], pretty_print=True)

    if not split:
        xmlroot.set('count', "%d" %count)
        tree = etree.ElementTree(xmlroot)
        tree.write("%s/patterns.xml" %(output))


if __name__ == '__main__':
    parser = optparse.OptionParser()

    parser.add_option("-a", "--arch", type="string", dest="arch", default="i586", help="architecture")
    parser.add_option("-s", "--split", action="store_true", dest="split", default=False,
                    help="split patterns into single files")
    parser.add_option("-p", "--pattern-dir", type="string", dest="patterns", default="patterns",
                    help="Directory where patterns reside.")
    parser.add_option("-o", "--output-dir", type="string", dest="output", default=".",
                    help="Directory where to put patterns file.")
        
    (options, args) = parser.parse_args()

    if options.arch and options.arch in ['i586', 'arm']:
        create_patterns(arch=options.arch, split=options.split, patterns_dir=options.patterns, output=options.output)
    else:
        sys.stderr.write("Unsupported architecture\n")
        sys.exit(1)