commit:     bf7dc3159db2c15ff7aa61c2c72b143bbd420be0
Author:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue May  3 20:54:33 2016 +0000
Commit:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Tue May  3 20:54:33 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=bf7dc315

repoman/modules/.../pkgmetadata.py:  Have xml validation log all qatracker 
errors

Remove the use flag qatracker additions.
Add all logged XMLSchema errors to the qatracker .
This makes it a one run check to add all possible errors via the XMLSchema.

 pym/repoman/modules/scan/metadata/pkgmetadata.py | 80 +++++++++++-------------
 1 file changed, 36 insertions(+), 44 deletions(-)

diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py 
b/pym/repoman/modules/scan/metadata/pkgmetadata.py
index d6d8557..44b5edd 100644
--- a/pym/repoman/modules/scan/metadata/pkgmetadata.py
+++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py
@@ -126,8 +126,7 @@ class PkgMetadata(ScanBase, USEFlagChecks):
                                        (xpkg, metadata_doctype_name, 
doctype_name))
 
                # load USE flags from metadata.xml
-               self.musedict, metadata_bad = self._parse_metadata_use(
-                       _metadata_xml, xpkg, metadata_bad)
+               self.musedict = self._parse_metadata_use(_metadata_xml, xpkg)
                for atom in chain(*self.musedict.values()):
                        if atom is None:
                                continue
@@ -147,15 +146,8 @@ class PkgMetadata(ScanBase, USEFlagChecks):
                # Only carry out if in package directory or check forced
                if not metadata_bad:
                        validator = etree.XMLSchema(file=self.metadata_xsd)
-                       try:
-                               validator.assertValid(_metadata_xml)
-                       except etree.DocumentInvalid as error:
-                               self.qatracker.add_error(
-                                       "metadata.bad",
-                                       xpkg + "/metadata.xml: %s"
-                                       % (str(error))
-                                       )
-               del metadata_bad
+                       if not validator.validate(_metadata_xml):
+                               self._add_validate_errors(xpkg, 
validator.error_log)
                self.muselist = frozenset(self.musedict)
                return False
 
@@ -178,7 +170,7 @@ class PkgMetadata(ScanBase, USEFlagChecks):
                                        % (xpkg, myflag))
                return False
 
-       def _parse_metadata_use(self, xml_tree, xpkg, metadata_bad):
+       def _parse_metadata_use(self, xml_tree, xpkg):
                """
                Records are wrapped in XML as per GLEP 56
                returns a dict with keys constisting of USE flag names and 
values
@@ -188,7 +180,7 @@ class PkgMetadata(ScanBase, USEFlagChecks):
 
                usetags = xml_tree.findall("use")
                if not usetags:
-                       return uselist, metadata_bad
+                       return uselist
 
                # It's possible to have multiple 'use' elements.
                for usetag in usetags:
@@ -199,37 +191,37 @@ class PkgMetadata(ScanBase, USEFlagChecks):
 
                        for flag in flags:
                                pkg_flag = flag.get("name")
-                               if pkg_flag is None:
-                                       metadata_bad = True
-                                       self.qatracker.add_error(
-                                               "metadata.bad",
-                                               "%s/metadata.xml: line: %s, 
'%s', missing attribute: name"
-                                               % (xpkg, flag.sourceline, 
flag.text))
-                                       continue
-                               flag_restrict = flag.get("restrict")
-
-                               # emulate the Element.itertext() method from 
python-2.7
-                               inner_text = []
-                               stack = []
-                               stack.append(flag)
-                               while stack:
-                                       obj = stack.pop()
-                                       if isinstance(obj, basestring):
-                                               inner_text.append(obj)
-                                               continue
-                                       if isinstance(obj.text, basestring):
-                                               inner_text.append(obj.text)
-                                       if isinstance(obj.tail, basestring):
-                                               stack.append(obj.tail)
-                                       stack.extend(reversed(obj))
-
-                               if pkg_flag not in uselist:
-                                       uselist[pkg_flag] = {}
-
-                               # (flag_restrict can be None)
-                               uselist[pkg_flag][flag_restrict] = " 
".join("".join(inner_text).split())
-
-               return uselist, metadata_bad
+                               if pkg_flag is not None:
+                                       flag_restrict = flag.get("restrict")
+
+                                       # emulate the Element.itertext() method 
from python-2.7
+                                       inner_text = []
+                                       stack = []
+                                       stack.append(flag)
+                                       while stack:
+                                               obj = stack.pop()
+                                               if isinstance(obj, basestring):
+                                                       inner_text.append(obj)
+                                                       continue
+                                               if isinstance(obj.text, 
basestring):
+                                                       
inner_text.append(obj.text)
+                                               if isinstance(obj.tail, 
basestring):
+                                                       stack.append(obj.tail)
+                                               stack.extend(reversed(obj))
+
+                                       if flag.get("name") not in uselist:
+                                               uselist[flag.get("name")] = {}
+
+                                       # (flag_restrict can be None)
+                                       
uselist[flag.get("name")][flag_restrict] = " ".join("".join(inner_text).split())
+               return uselist
+
+       def _add_validate_errors(self, xpkg, log):
+               for error in log:
+                       self.qatracker.add_error(
+                               "metadata.bad",
+                               "%s/metadata.xml: line: %s, %s"
+                               % (xpkg, error.line, error.message))
 
        @property
        def runInPkgs(self):

Reply via email to