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 20:58:20
Message-Id: 1462301182.50de92c080ac8e5bc3f0d6cd2bc69fb919afc186.dolsen@gentoo
1 commit: 50de92c080ac8e5bc3f0d6cd2bc69fb919afc186
2 Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
3 AuthorDate: Tue May 3 18:46:22 2016 +0000
4 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
5 CommitDate: Tue May 3 18:46:22 2016 +0000
6 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=50de92c0
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 | 138 +++++++++++------------
13 1 file changed, 68 insertions(+), 70 deletions(-)
14
15 diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py b/pym/repoman/modules/scan/metadata/pkgmetadata.py
16 index 7390b5b..d6d8557 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,28 +126,23 @@ 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 @@ -233,6 +178,59 @@ class PkgMetadata(ScanBase, USEFlagChecks):
128 % (xpkg, myflag))
129 return False
130
131 + def _parse_metadata_use(self, xml_tree, xpkg, metadata_bad):
132 + """
133 + Records are wrapped in XML as per GLEP 56
134 + returns a dict with keys constisting of USE flag names and values
135 + containing their respective descriptions
136 + """
137 + uselist = {}
138 +
139 + usetags = xml_tree.findall("use")
140 + if not usetags:
141 + return uselist, metadata_bad
142 +
143 + # It's possible to have multiple 'use' elements.
144 + for usetag in usetags:
145 + flags = usetag.findall("flag")
146 + if not flags:
147 + # DTD allows use elements containing no flag elements.
148 + continue
149 +
150 + for flag in flags:
151 + pkg_flag = flag.get("name")
152 + if pkg_flag is None:
153 + metadata_bad = True
154 + self.qatracker.add_error(
155 + "metadata.bad",
156 + "%s/metadata.xml: line: %s, '%s', missing attribute: name"
157 + % (xpkg, flag.sourceline, flag.text))
158 + continue
159 + flag_restrict = flag.get("restrict")
160 +
161 + # emulate the Element.itertext() method from python-2.7
162 + inner_text = []
163 + stack = []
164 + stack.append(flag)
165 + while stack:
166 + obj = stack.pop()
167 + if isinstance(obj, basestring):
168 + inner_text.append(obj)
169 + continue
170 + if isinstance(obj.text, basestring):
171 + inner_text.append(obj.text)
172 + if isinstance(obj.tail, basestring):
173 + stack.append(obj.tail)
174 + stack.extend(reversed(obj))
175 +
176 + if pkg_flag not in uselist:
177 + uselist[pkg_flag] = {}
178 +
179 + # (flag_restrict can be None)
180 + uselist[pkg_flag][flag_restrict] = " ".join("".join(inner_text).split())
181 +
182 + return uselist, metadata_bad
183 +
184 @property
185 def runInPkgs(self):
186 '''Package level scans'''