[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