[elbe-devel] [PATCH v2 2/3] preprocess: extend variant management functionality
Manuel Traut
manut at linutronix.de
Thu Dec 21 19:09:46 CET 2017
It is not possible to use multiple sections with variant attributes like this:
<pkg-list variant='audio>
<pkg>alsa</pkg>
<pkg>pavucontrol</pkg>
</pkg-list>
<pkg-list variant='video>
<pkg>totem</pkg>
<pkg>ffmpeg</pkg>
</pkg-list>
It will work, if just --variant=audio OR --variant=video is used, but if
--variant=audio,video is specified it results in two <pkg-list> sections
and that's not allowed by dbsfed.xsd.
Allow defining mergeable sections (hardcoded in elbepack/xmlpreprocess.py) and
if one of these sections occure multiple times the contents are merged
into a single section.
Signed-off-by: Manuel Traut <manut at linutronix.de>
---
elbepack/xmlpreprocess.py | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/elbepack/xmlpreprocess.py b/elbepack/xmlpreprocess.py
index 8e4c190e..208f2da8 100644
--- a/elbepack/xmlpreprocess.py
+++ b/elbepack/xmlpreprocess.py
@@ -8,6 +8,11 @@ from lxml import etree
from lxml.etree import XMLParser, parse
from numpy import intersect1d
+# dictionary of sections that are allowed to exists multiple times before
+# preprocess and that childrens are merge into one section during finetuning
+mergetags = {'finetuning': [],
+ 'pkg-list': []}
+
class XMLPreprocessError(Exception):
def __init__(self, message):
@@ -42,11 +47,30 @@ def xmlpreprocess(fname, output, variants=[]):
# specified remove the tag
else:
rmlist.append(tag)
+ # remember mergeable sections, sections that are deleted soon don't
+ # need to be remembered
+ if tag.tag in mergetags.keys() and tag not in rmlist:
+ mergetags[tag.tag].append(tag)
# postponed tag deletion
for tag in rmlist:
tag.getparent().remove(tag)
+ # if there are multiple sections because of sth like '<finetuning
+ # variant='A'> ... and <finetuning variant='B'> and running preprocess
+ # with --variant=A,B the two sections need to be merged
+ for mergetag in mergetags.keys():
+ # if there is just one section of a type nothing needs to be done
+ if len(mergetags[mergetag]) < 2:
+ continue
+ # append all childrens of section[1..n] to section[0] and delete
+ # section[1..n]
+ for section in mergetags[mergetag]:
+ if section != mergetags[mergetag][0]:
+ for child in section.getchildren():
+ mergetags[mergetag][0].append(child)
+ section.getparent().remove(section)
+
if schema.validate(xml):
xml.write(
output,
--
2.15.1
More information about the elbe-devel
mailing list