commit:     52bce5a348c68a5af0def40f399943d3b1d4f509
Author:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue May  3 09:01:29 2016 +0000
Commit:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Tue May  3 09:13:56 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=52bce5a3

repoman: Migrate from XmlLint to etree.XMLSchema for validation

This change based on work by Dirkjan Ochtman <djc <AT> gentoo.org>
Updated the change from XML.DTD to XMLSchema.
Additionally:
    Move the metadata.xsd path determination code to metadata.py.
    Add the DISTDIR backup location and fetching of the file if missing or 
stale.

 pym/repoman/metadata.py                          | 21 +++++++++++++++++++++
 pym/repoman/modules/scan/metadata/pkgmetadata.py |  9 +++------
 pym/repoman/scanner.py                           | 10 ++--------
 3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/pym/repoman/metadata.py b/pym/repoman/metadata.py
index 7c64c8e..a9ad3e8 100644
--- a/pym/repoman/metadata.py
+++ b/pym/repoman/metadata.py
@@ -99,3 +99,24 @@ def fetch_metadata_xsd(metadata_xsd, repoman_settings):
                                pass
 
        return True
+
+
+def get_metadata_xsd(repo_settings):
+       '''Locate and or fetch the metadata.xsd file
+
+       @param repo_settings: RepoSettings instance
+       @returns: path to the metadata.xsd file
+       '''
+       metadata_xsd = None
+       for path in reversed(repo_settings.repo_config.eclass_db.porttrees):
+               path = os.path.join(path, 'metadata/xml-schema/metadata.xsd')
+               if os.path.exists(path):
+                       metadata_xsd = path
+                       break
+       if metadata_xsd is None:
+               metadata_xsd = os.path.join(
+                       repo_settings.repoman_settings["DISTDIR"], 
'metadata.xsd'
+                       )
+
+               fetch_metadata_xsd(metadata_xsd, repo_settings.repoman_settings)
+       return metadata_xsd

diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py 
b/pym/repoman/modules/scan/metadata/pkgmetadata.py
index c744c13..b231370 100644
--- a/pym/repoman/modules/scan/metadata/pkgmetadata.py
+++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py
@@ -24,7 +24,6 @@ except (ImportError, SystemError, RuntimeError, Exception):
 # import our initialized portage instance
 from repoman._portage import portage
 from repoman.metadata import metadata_dtd_uri
-from repoman._xml import XmlLint
 from repoman.modules.scan.scanbase import ScanBase
 
 from portage.exception import InvalidAtom
@@ -104,13 +103,11 @@ class PkgMetadata(ScanBase, USEFlagChecks):
                repo_settings = kwargs.get('repo_settings')
                self.qatracker = kwargs.get('qatracker')
                self.options = kwargs.get('options')
-               metadata_xsd = kwargs.get('metadata_xsd')
+               self.metadata_xsd = kwargs.get('metadata_xsd')
                self.globalUseFlags = kwargs.get('uselist')
                self.repoman_settings = repo_settings.repoman_settings
                self.musedict = {}
                self.muselist = set()
-               self.xmllint = XmlLint(self.options, self.repoman_settings,
-                       metadata_xsd=metadata_xsd)
 
        def check(self, **kwargs):
                '''Performs the checks on the metadata.xml for the package
@@ -123,7 +120,6 @@ class PkgMetadata(ScanBase, USEFlagChecks):
                xpkg = kwargs.get('xpkg')
                checkdir = kwargs.get('checkdir')
                checkdirlist = kwargs.get('checkdirlist').get()
-               repolevel = kwargs.get('repolevel')
 
                self.musedict = {}
                if self.options.mode in ['manifest']:
@@ -205,7 +201,8 @@ class PkgMetadata(ScanBase, USEFlagChecks):
 
                # Only carry out if in package directory or check forced
                if not metadata_bad:
-                       if not self.xmllint.check(checkdir, repolevel):
+                       validator = etree.XMLSchema(file=self.metadata_xsd)
+                       if not validator.validate(_metadata_xml):
                                self.qatracker.add_error("metadata.bad", xpkg + 
"/metadata.xml")
                del metadata_bad
                self.muselist = frozenset(self.musedict)

diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py
index fd07209..48d9001 100644
--- a/pym/repoman/scanner.py
+++ b/pym/repoman/scanner.py
@@ -10,6 +10,7 @@ from portage import normalize_path
 from portage import os
 from portage.output import green
 from portage.util.futures.extendedfutures import ExtendedFuture
+from repoman.metadata import get_metadata_xsd
 from repoman.modules.commit import repochecks
 from repoman.profile import check_profiles, dev_profile_keywords, setup_profile
 from repoman.repos import repo_metadata
@@ -56,13 +57,6 @@ class Scanner(object):
                        portage.util.stack_lists([self.categories], 
incremental=1))
                self.categories = self.repo_settings.repoman_settings.categories
 
-               metadata_xsd = None
-               for path in 
reversed(self.repo_settings.repo_config.eclass_db.porttrees):
-                       path = os.path.join(path, 
'metadata/xml-schema/metadata.xsd')
-                       if os.path.exists(path):
-                               metadata_xsd = path
-                               break
-
                self.portdb = repo_settings.portdb
                self.portdb.settings = self.repo_settings.repoman_settings
                # We really only need to cache the metadata that's necessary 
for visibility
@@ -187,7 +181,7 @@ class Scanner(object):
                        "qatracker": self.qatracker,
                        "vcs_settings": self.vcs_settings,
                        "options": self.options,
-                       "metadata_xsd": metadata_xsd,
+                       "metadata_xsd": get_metadata_xsd(self.repo_settings),
                        "uselist": uselist,
                        "checks": checks,
                        "repo_metadata": self.repo_metadata,

Reply via email to