Gentoo Archives: gentoo-commits

From: Brian Dolbec <dolsen@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:repoman commit in: pym/repoman/modules/scan/metadata/
Date: Tue, 03 May 2016 17:43:45
Message-Id: 1462297342.235235c69343e95793525ee2104a82977a5a6729.dolsen@gentoo
1 commit: 235235c69343e95793525ee2104a82977a5a6729
2 Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
3 AuthorDate: Tue May 3 17:42:22 2016 +0000
4 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
5 CommitDate: Tue May 3 17:42:22 2016 +0000
6 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=235235c6
7
8 repoman/modules/.../pkgmetadata.py: Move parse_metadata_use into the PkgMetadata class
9
10 This allows for a complete Q/A processing of all the use flags defined in the xml.
11
12 pym/repoman/modules/scan/metadata/pkgmetadata.py | 139 +++++++++++------------
13 1 file changed, 68 insertions(+), 71 deletions(-)
14
15 diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py b/pym/repoman/modules/scan/metadata/pkgmetadata.py
16 index 7390b5b..ef57a5d 100644
17 --- a/pym/repoman/modules/scan/metadata/pkgmetadata.py
18 +++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py
19 @@ -28,7 +28,6 @@ from repoman.modules.scan.scanbase import ScanBase
20
21 from portage.exception import InvalidAtom
22 from portage import os
23 -from portage import exception
24 from portage.dep import Atom
25
26 from .use_flags import USEFlagChecks
27 @@ -39,55 +38,6 @@ metadata_xml_declaration = '<?xml version="1.0" encoding="%s"?>' \
28 metadata_doctype_name = 'pkgmetadata'
29
30
31 -def parse_metadata_use(xml_tree):
32 - """
33 - Records are wrapped in XML as per GLEP 56
34 - returns a dict with keys constisting of USE flag names and values
35 - containing their respective descriptions
36 - """
37 - uselist = {}
38 -
39 - usetags = xml_tree.findall("use")
40 - if not usetags:
41 - return uselist
42 -
43 - # It's possible to have multiple 'use' elements.
44 - for usetag in usetags:
45 - flags = usetag.findall("flag")
46 - if not flags:
47 - # DTD allows use elements containing no flag elements.
48 - continue
49 -
50 - for flag in flags:
51 - pkg_flag = flag.get("name")
52 - if pkg_flag is None:
53 - raise exception.ParseError("missing 'name' attribute for 'flag' tag")
54 - flag_restrict = flag.get("restrict")
55 -
56 - # emulate the Element.itertext() method from python-2.7
57 - inner_text = []
58 - stack = []
59 - stack.append(flag)
60 - while stack:
61 - obj = stack.pop()
62 - if isinstance(obj, basestring):
63 - inner_text.append(obj)
64 - continue
65 - if isinstance(obj.text, basestring):
66 - inner_text.append(obj.text)
67 - if isinstance(obj.tail, basestring):
68 - stack.append(obj.tail)
69 - stack.extend(reversed(obj))
70 -
71 - if pkg_flag not in uselist:
72 - uselist[pkg_flag] = {}
73 -
74 - # (flag_restrict can be None)
75 - uselist[pkg_flag][flag_restrict] = " ".join("".join(inner_text).split())
76 -
77 - return uselist
78 -
79 -
80 class PkgMetadata(ScanBase, USEFlagChecks):
81 '''Package metadata.xml checks'''
82
83 @@ -176,32 +126,26 @@ class PkgMetadata(ScanBase, USEFlagChecks):
84 (xpkg, metadata_doctype_name, doctype_name))
85
86 # load USE flags from metadata.xml
87 - try:
88 - self.musedict = parse_metadata_use(_metadata_xml)
89 - except portage.exception.ParseError as e:
90 - metadata_bad = True
91 - self.qatracker.add_error(
92 - "metadata.bad", "%s/metadata.xml: %s" % (xpkg, e))
93 - else:
94 - for atom in chain(*self.musedict.values()):
95 - if atom is None:
96 - continue
97 - try:
98 - atom = Atom(atom)
99 - except InvalidAtom as e:
100 + self.musedict, metadata_bad = self._parse_metadata_use(
101 + _metadata_xml, xpkg, metadata_bad)
102 + for atom in chain(*self.musedict.values()):
103 + if atom is None:
104 + continue
105 + try:
106 + atom = Atom(atom)
107 + except InvalidAtom as e:
108 + self.qatracker.add_error(
109 + "metadata.bad",
110 + "%s/metadata.xml: Invalid atom: %s" % (xpkg, e))
111 + else:
112 + if atom.cp != xpkg:
113 self.qatracker.add_error(
114 "metadata.bad",
115 - "%s/metadata.xml: Invalid atom: %s" % (xpkg, e))
116 - else:
117 - if atom.cp != xpkg:
118 - self.qatracker.add_error(
119 - "metadata.bad",
120 - "%s/metadata.xml: Atom contains "
121 - "unexpected cat/pn: %s" % (xpkg, atom))
122 + "%s/metadata.xml: Atom contains "
123 + "unexpected cat/pn: %s" % (xpkg, atom))
124
125 # Only carry out if in package directory or check forced
126 if not metadata_bad:
127 - validator = etree.XMLSchema(file=self.metadata_xsd)
128 try:
129 validator.assertValid(_metadata_xml)
130 except etree.DocumentInvalid as error:
131 @@ -233,6 +177,59 @@ class PkgMetadata(ScanBase, USEFlagChecks):
132 % (xpkg, myflag))
133 return False
134
135 + def _parse_metadata_use(self, xml_tree, xpkg, metadata_bad):
136 + """
137 + Records are wrapped in XML as per GLEP 56
138 + returns a dict with keys constisting of USE flag names and values
139 + containing their respective descriptions
140 + """
141 + uselist = {}
142 +
143 + usetags = xml_tree.findall("use")
144 + if not usetags:
145 + return uselist, metadata_bad
146 +
147 + # It's possible to have multiple 'use' elements.
148 + for usetag in usetags:
149 + flags = usetag.findall("flag")
150 + if not flags:
151 + # DTD allows use elements containing no flag elements.
152 + continue
153 +
154 + for flag in flags:
155 + pkg_flag = flag.get("name")
156 + if pkg_flag is None:
157 + metadata_bad = True
158 + self.qatracker.add_error(
159 + "metadata.bad",
160 + "%s/metadata.xml: line: %s, '%s', missing attribute: name"
161 + % (xpkg, flag.sourceline, flag.text))
162 + continue
163 + flag_restrict = flag.get("restrict")
164 +
165 + # emulate the Element.itertext() method from python-2.7
166 + inner_text = []
167 + stack = []
168 + stack.append(flag)
169 + while stack:
170 + obj = stack.pop()
171 + if isinstance(obj, basestring):
172 + inner_text.append(obj)
173 + continue
174 + if isinstance(obj.text, basestring):
175 + inner_text.append(obj.text)
176 + if isinstance(obj.tail, basestring):
177 + stack.append(obj.tail)
178 + stack.extend(reversed(obj))
179 +
180 + if pkg_flag not in uselist:
181 + uselist[pkg_flag] = {}
182 +
183 + # (flag_restrict can be None)
184 + uselist[pkg_flag][flag_restrict] = " ".join("".join(inner_text).split())
185 +
186 + return uselist, metadata_bad
187 +
188 @property
189 def runInPkgs(self):
190 '''Package level scans'''