commit:     801f9a8a4d50baee38c8c06eaf4183e76c018e58
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Wed Dec 16 06:44:53 2015 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Wed Dec 16 16:18:34 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=801f9a8a

repoman: use metadata.dtd from rsync tree if available (bug 567746)

Search for metadata.dtd in current repository and masters, and if that
fails then fetch it as usual.

X-Gentoo-Bug: 567746
X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=567746
Acked-by: Alexander Berntsen <bernalex <AT> gentoo.org>

 pym/repoman/_xml.py                       | 10 ++++++----
 pym/repoman/checks/ebuilds/pkgmetadata.py |  6 ++++--
 pym/repoman/scanner.py                    | 10 +++++++++-
 3 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index 0acda28..43fc930 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -51,11 +51,12 @@ class 
_MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
 
 class XmlLint(object):
 
-       def __init__(self, options, repoman_settings):
-               self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 
'metadata.dtd')
+       def __init__(self, options, repoman_settings, metadata_dtd=None):
+               self.metadata_dtd = (metadata_dtd or
+                       os.path.join(repoman_settings["DISTDIR"], 
'metadata.dtd'))
                self.options = options
                self.repoman_settings = repoman_settings
-               self._is_capable = False
+               self._is_capable = metadata_dtd is not None
                self.binary = None
                self._check_capable()
 
@@ -65,7 +66,8 @@ class XmlLint(object):
                self.binary = find_binary('xmllint')
                if not self.binary:
                        print(red("!!! xmllint not found. Can't check 
metadata.xml.\n"))
-               else:
+                       self._is_capable = False
+               elif not self._is_capable:
                        if not fetch_metadata_dtd(self.metadata_dtd, 
self.repoman_settings):
                                sys.exit(1)
                        # this can be problematic if xmllint changes their 
output

diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py 
b/pym/repoman/checks/ebuilds/pkgmetadata.py
index f22ef19..74fec69 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -40,18 +40,20 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, 
XmlLint
 class PkgMetadata(object):
        '''Package metadata.xml checks'''
 
-       def __init__(self, options, qatracker, repoman_settings):
+       def __init__(self, options, qatracker, repoman_settings, 
metadata_dtd=None):
                '''PkgMetadata init function
 
                @param options: ArgumentParser.parse_known_args(argv[1:]) 
options
                @param qatracker: QATracker instance
                @param repoman_settings: settings instance
+               @param metadata_dtd: path of metadata.dtd
                '''
                self.options = options
                self.qatracker = qatracker
                self.repoman_settings = repoman_settings
                self.musedict = {}
-               self.xmllint = XmlLint(self.options, self.repoman_settings)
+               self.xmllint = XmlLint(self.options, self.repoman_settings,
+                       metadata_dtd=metadata_dtd)
 
        def check(self, xpkg, checkdir, checkdirlist, repolevel):
                '''Performs the checks on the metadata.xml for the package

diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py
index 9e5a313..9a87f65 100644
--- a/pym/repoman/scanner.py
+++ b/pym/repoman/scanner.py
@@ -82,6 +82,13 @@ class Scanner(object):
                        portage.util.stack_lists([self.categories], 
incremental=1))
                self.categories = self.repo_settings.repoman_settings.categories
 
+               metadata_dtd = None
+               for path in 
reversed(self.repo_settings.repo_config.eclass_db.porttrees):
+                       path = os.path.join(path, 'metadata/dtd/metadata.dtd')
+                       if os.path.exists(path):
+                               metadata_dtd = 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
@@ -201,7 +208,8 @@ class Scanner(object):
                self.status_check = VCSStatus(self.vcs_settings, self.qatracker)
                self.fetchcheck = FetchChecks(
                        self.qatracker, self.repo_settings, self.portdb, 
self.vcs_settings)
-               self.pkgmeta = PkgMetadata(self.options, self.qatracker, 
self.repo_settings.repoman_settings)
+               self.pkgmeta = PkgMetadata(self.options, self.qatracker,
+                       self.repo_settings.repoman_settings, 
metadata_dtd=metadata_dtd)
                self.thirdparty = 
ThirdPartyMirrors(self.repo_settings.repoman_settings, self.qatracker)
                self.use_flag_checks = USEFlagChecks(self.qatracker, uselist)
                self.keywordcheck = KeywordChecks(self.qatracker, self.options)

Reply via email to