f6b9068a9ad7159ae179be09e73406b6b73d25f2
[platform/upstream/pattern-tools.git] / scripts / merge-patterns.py
1 #!/usr/bin/python
2
3 import yaml
4 import sys, os
5 import optparse
6 from lxml import etree
7
8
9 def create_patterns(arch='i586', split=False, patterns_dir='patterns', output="."):
10
11     rpm_ns="http://linux.duke.edu/metadata/rpm"
12     pattern_ns="http://novell.com/package/metadata/suse/pattern"
13     PATTERN = "{%s}" % pattern_ns
14     if not split:       
15         xmlroot = etree.Element("patterns")
16         NSMAP = {None : pattern_ns, "rpm": rpm_ns, "patterns": pattern_ns}
17     else:
18         NSMAP = {None : pattern_ns, "rpm": rpm_ns}
19
20     count = 0
21     for f in os.listdir(patterns_dir):
22         if not f.endswith('.yaml'):
23             continue
24         count = count + 1
25         stream = file("%s/%s" %(patterns_dir,f), 'r')
26         y = yaml.load(stream)
27         if y.has_key('Arch') and y['Arch'] != arch:
28             print "Skipping pattern '%s' because architecture doesn't match ('%s' vs '%s')." % (y['Name'], y['Arch'], arch)
29             continue
30         if split:
31             proot = etree.Element("pattern", nsmap=NSMAP)
32         else:
33             proot = etree.SubElement(xmlroot, "pattern",  nsmap=NSMAP)
34
35         etree.SubElement(proot, "name").text = y['Name']
36         etree.SubElement(proot, "summary").text = y['Summary']
37         etree.SubElement(proot, "description").text = y['Description']
38         etree.SubElement(proot, "uservisible")
39         cat = etree.SubElement(proot, "category")
40         cat.text = "Base Group"
41         cat.set("lang", "en")
42         req = etree.SubElement(proot, "{%s}requires" %rpm_ns)
43         if y.has_key('Patterns'):
44             collect = []
45             for pat in y['Patterns']:
46                 if os.path.exists("%s/%s.yaml" %(patterns_dir, pat)):
47                     pf = file("%s/%s.yaml" %(patterns_dir, pat), 'r')
48                     pfy = yaml.load(pf)
49                     if pfy.has_key('Packages'):
50                         collect += pfy['Packages']
51         elif y.has_key('Packages'):
52             collect = y['Packages']
53
54         for p in collect:
55             if type(p).__name__=='dict':
56                 a = p.values()[0]
57                 if a == arch:
58                     entry = etree.SubElement(req, "{%s}entry" %rpm_ns)
59                     entry.set("name", p.keys()[0])
60                     entry.set("arch", arch)
61             else:
62                 entry = etree.SubElement(req, "{%s}entry" %rpm_ns)
63                 entry.set("name", p)
64         if split:
65             tree = etree.ElementTree(proot)
66             tree.write("%s.xml" %y['Name'], pretty_print=True)
67
68     if not split:
69         xmlroot.set('count', "%d" %count)
70         tree = etree.ElementTree(xmlroot)
71         tree.write("%s/patterns.xml" %(output))
72
73
74 if __name__ == '__main__':
75     parser = optparse.OptionParser()
76
77     parser.add_option("-a", "--arch", type="string", dest="arch", default="i586", help="architecture")
78     parser.add_option("-s", "--split", action="store_true", dest="split", default=False,
79                     help="split patterns into single files")
80     parser.add_option("-p", "--pattern-dir", type="string", dest="patterns", default="patterns",
81                     help="Directory where patterns reside.")
82     parser.add_option("-o", "--output-dir", type="string", dest="output", default=".",
83                     help="Directory where to put patterns file.")
84         
85     (options, args) = parser.parse_args()
86
87     if options.arch and options.arch in ['i586', 'arm']:
88         create_patterns(arch=options.arch, split=options.split, patterns_dir=options.patterns, output=options.output)
89     else:
90         sys.stderr.write("Unsupported architecture\n")
91         sys.exit(1)