From 65fc4d8a8e0e841e7888893b3f020c4caeb84ecc Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Mon, 25 Jan 2016 20:40:29 +0100 Subject: repoman: Move parse_metadata_use function to the pkgmetadata.py Add missing basestring compat code --- pym/repoman/metadata.py | 50 --------------------- pym/repoman/modules/scan/metadata/pkgmetadata.py | 56 +++++++++++++++++++++++- 2 files changed, 55 insertions(+), 51 deletions(-) diff --git a/pym/repoman/metadata.py b/pym/repoman/metadata.py index a98018448..7c64c8e04 100644 --- a/pym/repoman/metadata.py +++ b/pym/repoman/metadata.py @@ -17,7 +17,6 @@ except ImportError: # import our initialized portage instance from repoman._portage import portage -from portage import exception from portage import os from portage import shutil from portage.output import green @@ -34,55 +33,6 @@ metadata_xsd_uri = 'http://www.gentoo.org/xml-schema/metadata.xsd' metadata_xsd_ctime_interval = 60 * 60 * 24 * 7 # 7 days -def parse_metadata_use(xml_tree): - """ - Records are wrapped in XML as per GLEP 56 - returns a dict with keys constisting of USE flag names and values - containing their respective descriptions - """ - uselist = {} - - usetags = xml_tree.findall("use") - if not usetags: - return uselist - - # It's possible to have multiple 'use' elements. - for usetag in usetags: - flags = usetag.findall("flag") - if not flags: - # DTD allows use elements containing no flag elements. - continue - - for flag in flags: - pkg_flag = flag.get("name") - if pkg_flag is None: - raise exception.ParseError("missing 'name' attribute for 'flag' tag") - 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 - - def fetch_metadata_xsd(metadata_xsd, repoman_settings): """ Fetch metadata.xsd if it doesn't exist or the ctime is older than diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py b/pym/repoman/modules/scan/metadata/pkgmetadata.py index a7150a96f..af53f4b93 100644 --- a/pym/repoman/modules/scan/metadata/pkgmetadata.py +++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py @@ -23,7 +23,7 @@ except (ImportError, SystemError, RuntimeError, Exception): # import our initialized portage instance from repoman._portage import portage -from repoman.metadata import metadata_dtd_uri, parse_metadata_use +from repoman.metadata import metadata_dtd_uri from repoman.checks.herds.herdbase import get_herd_base from repoman.checks.herds.metadata import check_metadata, UnknownHerdsError from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint @@ -32,16 +32,70 @@ from repoman.modules.scan.scanbase import ScanBase from portage.exception import InvalidAtom from portage import os from portage import _encodings, _unicode_encode +from portage import exception from portage.dep import Atom from .use_flags import USEFlagChecks +if sys.hexversion >= 0x3000000: + # pylint: disable=W0622 + basestring = str + metadata_xml_encoding = 'UTF-8' metadata_xml_declaration = '' \ % (metadata_xml_encoding,) metadata_doctype_name = 'pkgmetadata' +def parse_metadata_use(xml_tree): + """ + Records are wrapped in XML as per GLEP 56 + returns a dict with keys constisting of USE flag names and values + containing their respective descriptions + """ + uselist = {} + + usetags = xml_tree.findall("use") + if not usetags: + return uselist + + # It's possible to have multiple 'use' elements. + for usetag in usetags: + flags = usetag.findall("flag") + if not flags: + # DTD allows use elements containing no flag elements. + continue + + for flag in flags: + pkg_flag = flag.get("name") + if pkg_flag is None: + raise exception.ParseError("missing 'name' attribute for 'flag' tag") + 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 + + class PkgMetadata(ScanBase, USEFlagChecks): '''Package metadata.xml checks''' -- cgit v1.2.3-65-gdbad