[elbe-devel] [PATCH 1/1] Validation should preprocess the XML files

dion at linutronix.de dion at linutronix.de
Tue Jul 30 15:20:59 CEST 2019


From: Olivier Dion <dion at linutronix.de>

See <https://github.com/Linutronix/elbe/issues/229>.

Note that error_log_to_strings was moved to xmlpreprocess to avoid
circular dependency.

The XML preprocessor would need some good refactoring ..

Signed-off-by: Olivier Dion <dion at linutronix.de>
---
 elbepack/validate.py      | 44 ++++++++++++++------------------------------
 elbepack/xmlpreprocess.py | 27 ++++++++++++++++++++++++---
 2 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/elbepack/validate.py b/elbepack/validate.py
index c1e5c771..d2c60c40 100644
--- a/elbepack/validate.py
+++ b/elbepack/validate.py
@@ -11,28 +11,9 @@ import sys
 from lxml import etree
 from lxml.etree import XMLParser, parse
 
+from elbepack.shellhelper import CommandError
+from elbepack.xmlpreprocess import PreprocessWrapper, error_log_to_strings
 
-def error_log_to_strings(error_log):
-    errors = []
-    uses_xinclude = False
-    uses_norecommend = False
-
-    for err in error_log:
-        errors.append("%s:%d error %s" % (err.filename, err.line, err.message))
-        if "http://www.w3.org/2003/XInclude" in err.message:
-            uses_xinclude = True
-        if "norecommend" in err.message:
-            uses_norecommend = True
-
-    if uses_xinclude:
-        errors.append("\nThere are XIncludes in the XML file. "
-                      "Run 'elbe preprocess' first!\n")
-    if uses_norecommend:
-        errors.append("\nThe XML file uses <norecommend />. "
-                      "This function was broken all the time and did the "
-                      "opposite. If you want to retain the original "
-                      "behaviour, please specify <install-recommends /> !\n")
-    return errors
 
 def validate_xml(fname):
     if os.path.getsize(fname) > (1 << 30):
@@ -45,15 +26,18 @@ def validate_xml(fname):
     schema = etree.XMLSchema(schema_tree)
 
     try:
-        xml = parse(fname, parser=parser)
-
-        if schema.validate(xml):
-            return validate_xml_content(xml)
-    except etree.XMLSyntaxError:
-        return ["XML Parse error\n" + str(sys.exc_info()[1])]
-    except BaseException:
-        return ["Unknown Exception during validation\n" +
-                str(sys.exc_info()[1])]
+        with PreprocessWrapper(fname) as xml_p:
+            xml = parse(xml_p.preproc, parser=parser)
+            try:
+                if schema.validate(xml):
+                    return validate_xml_content(xml)
+            except etree.XMLSyntaxError:
+                return ["XML Parse error\n" + str(sys.exc_info()[1])]
+            except BaseException:
+                return ["Unknown Exception during validation\n" +
+                        str(sys.exc_info()[1])]
+    except CommandError as E:
+        return ["Fail preprocessor\n%r" % E]
 
     # We have errors, return them in string form...
     return error_log_to_strings(schema.error_log)
diff --git a/elbepack/xmlpreprocess.py b/elbepack/xmlpreprocess.py
index 304b1b37..64186945 100644
--- a/elbepack/xmlpreprocess.py
+++ b/elbepack/xmlpreprocess.py
@@ -19,7 +19,6 @@ from lxml.etree import XMLParser, parse
 from elbepack.archivedir import ArchivedirError, combinearchivedir
 from elbepack.directories import elbe_exe
 from elbepack.shellhelper import command_out_stderr, CommandError
-from elbepack.validate import error_log_to_strings
 
 # list of sections that are allowed to exists multiple times before
 # preprocess and that childrens are merge into one section during preprocess
@@ -137,12 +136,12 @@ def xmlpreprocess(fname, output, variants=None):
 
 
 class PreprocessWrapper(object):    # pylint: disable=too-few-public-methods
-    def __init__(self, xmlfile, opt):
+    def __init__(self, xmlfile, opt=None):
         self.xmlfile = xmlfile
         self.outxml = None
         self.options = ""
 
-        if opt.variant:
+        if opt and opt.variant:
             self.options += ' --variants "%s"' % opt.variant
 
     def __enter__(self):
@@ -178,3 +177,25 @@ class PreprocessWrapper(object):    # pylint: disable=too-few-public-methods
     @property
     def preproc(self):
         return self.outxml.name
+
+def error_log_to_strings(error_log):
+    errors = []
+    uses_xinclude = False
+    uses_norecommend = False
+
+    for err in error_log:
+        errors.append("%s:%d error %s" % (err.filename, err.line, err.message))
+        if "http://www.w3.org/2003/XInclude" in err.message:
+            uses_xinclude = True
+        if "norecommend" in err.message:
+            uses_norecommend = True
+
+    if uses_xinclude:
+        errors.append("\nThere are XIncludes in the XML file. "
+                      "Run 'elbe preprocess' first!\n")
+    if uses_norecommend:
+        errors.append("\nThe XML file uses <norecommend />. "
+                      "This function was broken all the time and did the "
+                      "opposite. If you want to retain the original "
+                      "behaviour, please specify <install-recommends /> !\n")
+    return errors
-- 
2.11.0




More information about the elbe-devel mailing list