summaryrefslogtreecommitdiff
path: root/scripts/merge-patterns.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/merge-patterns.py')
-rwxr-xr-xscripts/merge-patterns.py91
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)