Re: [gentoo-portage-dev] [PATCH] repoman: use metadata.dtd from rsync tree if available (bug 567746)

2015-12-16 Thread Alexander Berntsen
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA512

LGTM.
- -- 
Alexander
berna...@gentoo.org
https://secure.plaimi.net/~alexander
-BEGIN PGP SIGNATURE-
Version: GnuPG v2

iQIcBAEBCgAGBQJWcWrfAAoJENQqWdRUGk8BmAsQALl6yvoA9QJBn9TcmxENI8L4
DYWzX4FoZ6Gc69Dh7lejuDCkoziE5rZWckqgyLuDsDiYOQLFJAjpgj7lpUxrh0Wx
ZExjt1NL3svT1hGDh8j7NNM2oKy9PGBOU/oVe/35pRRTjy1rsPXjzT3AbxrwcQNA
S48qylxqou4EcCUSGT2rFleZhnUVIV+mOXeS8zAZOtdH3H9xNyn+rHcbkqogUh4p
gv5iwbDFpLkkAe8zx42kKYJTsBVy29l6dalxV3zn3nnCEJArIraTQ3zErNalvY0X
E2cXsNN4h633jRDyJCSAOBHkqBRsizGfyxwaDl5EPGQg1HinmleIwmpHuEH7gKcY
f9/zji9NCLpQ4uPLpfDnwez8eXmW5tx5nkwL5nNj2XiK90PV02aN3kgDwwh4hzJB
JFqLDS6jeVgAn+I6XmsaJOhnddD29XlmKvmamaqbvRllJsG0mDsCiPDUJXDlbkAw
dmYfkckItz3L/gtxrrZ0VfNmr7PN6aOTfoivTbHrjMaUnUjX5p55R/eamhzEhbQF
d9yQFYD9xhXMw3LqlcEqcQAgYyvTfQcxb/VgRxJK9BqawtSpDEUbl/ifnqdCMkSA
M5ZgIhvYvR2cm7cQC5OIEETfDlCu+AIsid+9bJETvUakCrwA+zPBiX33swT6oaV7
XdiFfzAXi+kPk67VxdoS
=juvW
-END PGP SIGNATURE-



[gentoo-portage-dev] [PATCH] repoman: use metadata.dtd from rsync tree if available (bug 567746)

2015-12-15 Thread Zac Medico
Search for metadata.dtd in current repository and masters, and if that
fails then fetch is as usual.

X-Gentoo-Bug: 567746
X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=567746
---
 pym/repoman/_xml.py   |  9 +
 pym/repoman/checks/ebuilds/pkgmetadata.py |  6 --
 pym/repoman/scanner.py| 10 +-
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index 0acda28..4ca6a0a 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,7 @@ class XmlLint(object):
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check 
metadata.xml.\n"))
-   else:
+   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)
-- 
2.4.10