commit: 75c50245b8bf0d3e50ce217c52f5f12307f62867
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue May 27 05:03:10 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Tue May 27 06:04:40 2014 +0000
URL:
http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=75c50245
repoman/main.py: Create a new XmlLint class
Create the new class in _xml.py.
Consolodate all the xmllint code in this one class.
---
pym/repoman/_xml.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++
pym/repoman/main.py | 40 +++++++++++--------------------------
2 files changed, 68 insertions(+), 29 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index e59f357..1b98ede 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -1,6 +1,15 @@
+import sys
import xml
+import portage
+from portage import os
+from portage.output import red
+from portage.process import find_binary
+
+from repoman.metadata import fetch_metadata_dtd
+from repoman._subprocess import repoman_getstatusoutput
+
class _XMLParser(xml.etree.ElementTree.XMLParser):
def __init__(self, data, **kwargs):
@@ -34,3 +43,51 @@ class
_MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
"""
def doctype(self, name, pubid, system):
pass
+
+
+class XmlLint(object):
+
+ def __init__(self, metadata_dtd, options, repolevel, repoman_settings):
+ self.metadata_dtd = metadata_dtd
+ self._is_capable = False
+ self.binary = None
+ self._check_capable(options, repolevel, repoman_settings)
+
+
+ def _check_capable(self, options, repolevel, repoman_settings):
+ if options.mode == "manifest":
+ return
+ self.binary = find_binary('xmllint')
+ if not self.binary:
+ print(red("!!! xmllint not found. Can't check
metadata.xml.\n"))
+ if options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n"
% red("!!!"))
+ sys.exit(1)
+ else:
+ if not fetch_metadata_dtd(self.metadata_dtd,
repoman_settings):
+ sys.exit(1)
+ # this can be problematic if xmllint changes their
output
+ self._is_capable = True
+
+
+ @property
+ def capable(self):
+ return self._is_capable
+
+
+ def check(self, checkdir):
+ if not self.capable:
+ return true
+ # xmlint can produce garbage output even on success, so only
dump
+ # the ouput when it fails.
+ st, out = repoman_getstatusoutput(
+ self.binary + " --nonet --noout --dtdvalid %s %s" % (
+ portage._shell_quote(self.metadata_dtd),
+ portage._shell_quote(
+ os.path.join(checkdir,
"metadata.xml"))))
+ if st != os.EX_OK:
+ print(red("!!!") + " metadata.xml is invalid:")
+ for z in out.splitlines():
+ print(red("!!! ") + z)
+ return False
+ return True
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 836ca1e..e03788f 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -66,9 +66,9 @@ from portage.eapi import eapi_has_iuse_defaults,
eapi_has_required_use
from repoman.argparser import parse_args
from repoman.checks.ebuilds.checks import run_checks, checks_init
from repoman.checks.herds.herdbase import make_herd_base
-from repoman.metadata import (fetch_metadata_dtd, metadata_xml_encoding,
- metadata_doctype_name, metadata_dtd_uri, metadata_xml_declaration)
from repoman.errors import err
+from repoman.metadata import (metadata_xml_encoding, metadata_doctype_name,
+ metadata_dtd_uri, metadata_xml_declaration)
from repoman.modules import commit
from repoman.profile import check_profiles, dev_keywords, setup_profile
from repoman.qa_data import (format_qa_output, format_qa_output_column, qahelp,
@@ -80,7 +80,7 @@ from repoman._subprocess import repoman_popen,
repoman_getstatusoutput
from repoman import utilities
from repoman.vcs.vcs import (git_supports_gpg_sign, vcs_files_to_cps,
vcs_new_changed, VCSSettings)
-from repoman._xml import _XMLParser, _MetadataTreeBuilder
+from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
if sys.hexversion >= 0x3000000:
@@ -261,22 +261,12 @@ for x in qacats:
stats[x] = 0
fails[x] = []
-xmllint_capable = False
-metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+####################
-if options.mode == "manifest":
- pass
-elif not find_binary('xmllint'):
- print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
-else:
- if not fetch_metadata_dtd(metadata_dtd, repoman_settings):
- sys.exit(1)
- # this can be problematic if xmllint changes their output
- xmllint_capable = True
+metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+xmllint = XmlLint(metadata_dtd, options, repolevel, repoman_settings)
+#####################
if options.mode == "manifest":
pass
@@ -884,22 +874,14 @@ for x in effective_scanlist:
fails["metadata.bad"].append("%s/metadata.xml:
%s" % (x, e))
del e
+#################
# Only carry out if in package directory or check forced
- if xmllint_capable and not metadata_bad:
- # xmlint can produce garbage output even on success, so
only dump
- # the ouput when it fails.
- st, out = repoman_getstatusoutput(
- "xmllint --nonet --noout --dtdvalid %s %s" % (
- portage._shell_quote(metadata_dtd),
- portage._shell_quote(
- os.path.join(checkdir,
"metadata.xml"))))
- if st != os.EX_OK:
- print(red("!!!") + " metadata.xml is invalid:")
- for z in out.splitlines():
- print(red("!!! ") + z)
+ if not metadata_bad:
+ if not xmllint.check(checkdir):
stats["metadata.bad"] += 1
fails["metadata.bad"].append(x +
"/metadata.xml")
+#################
del metadata_bad
muselist = frozenset(musedict)