diff options
Diffstat (limited to 'scripts/merge-patterns.py')
-rwxr-xr-x | scripts/merge-patterns.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/scripts/merge-patterns.py b/scripts/merge-patterns.py new file mode 100755 index 0000000..f6b9068 --- /dev/null +++ b/scripts/merge-patterns.py @@ -0,0 +1,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 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) |