1 |
commit: a05acb46919638ef60a4303c2bc6d92e9e6c0771 |
2 |
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Apr 24 01:34:37 2016 +0000 |
4 |
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Apr 25 15:28:53 2016 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=a05acb46 |
7 |
|
8 |
More new data structure change fixes |
9 |
|
10 |
Fix arches not being cleared every ebuild. |
11 |
|
12 |
pym/repoman/modules/scan/arches/arches.py | 1 + |
13 |
pym/repoman/modules/scan/depend/depend.py | 1 + |
14 |
pym/repoman/modules/scan/ebuild/__init__.py | 2 +- |
15 |
pym/repoman/modules/scan/ebuild/ebuild.py | 2 +- |
16 |
pym/repoman/modules/scan/ebuild/isebuild.py | 11 ++++-- |
17 |
pym/repoman/modules/scan/eclasses/live.py | 5 ++- |
18 |
pym/repoman/modules/scan/keywords/__init__.py | 4 +- |
19 |
pym/repoman/modules/scan/metadata/__init__.py | 2 +- |
20 |
pym/repoman/modules/scan/metadata/unused.py | 2 +- |
21 |
pym/repoman/modules/scan/use/use_flags.py | 13 +++--- |
22 |
pym/repoman/scanner.py | 57 +++++++++++++++++---------- |
23 |
11 files changed, 62 insertions(+), 38 deletions(-) |
24 |
|
25 |
diff --git a/pym/repoman/modules/scan/arches/arches.py b/pym/repoman/modules/scan/arches/arches.py |
26 |
index 8bc7a24..4df25a8 100644 |
27 |
--- a/pym/repoman/modules/scan/arches/arches.py |
28 |
+++ b/pym/repoman/modules/scan/arches/arches.py |
29 |
@@ -69,6 +69,7 @@ class ArchChecks(ScanBase): |
30 |
arches.add(('**', '**', ('**',))) |
31 |
# update the dynamic data |
32 |
dyn_arches = kwargs.get('arches') |
33 |
+ #dyn_arches.clear() |
34 |
dyn_arches.update(arches) |
35 |
return False |
36 |
|
37 |
|
38 |
diff --git a/pym/repoman/modules/scan/depend/depend.py b/pym/repoman/modules/scan/depend/depend.py |
39 |
index a5f91d3..cd1fb33 100644 |
40 |
--- a/pym/repoman/modules/scan/depend/depend.py |
41 |
+++ b/pym/repoman/modules/scan/depend/depend.py |
42 |
@@ -145,6 +145,7 @@ class DependChecks(ScanBase): |
43 |
|
44 |
# update the dynamic data |
45 |
dyn_unknown = kwargs.get('unknown_pkgs') |
46 |
+ dyn_unknown.clear() |
47 |
dyn_unknown.update(unknown_pkgs) |
48 |
self.set_result_pass([ |
49 |
(kwargs.get('badlicsyntax'), badlicsyntax), |
50 |
|
51 |
diff --git a/pym/repoman/modules/scan/ebuild/__init__.py b/pym/repoman/modules/scan/ebuild/__init__.py |
52 |
index ea21ece..efb2feb 100644 |
53 |
--- a/pym/repoman/modules/scan/ebuild/__init__.py |
54 |
+++ b/pym/repoman/modules/scan/ebuild/__init__.py |
55 |
@@ -21,7 +21,7 @@ module_spec = { |
56 |
'mod_kwargs': ['portdb', 'qatracker', 'repo_settings' |
57 |
], |
58 |
'func_kwargs': {'checkdirlist': 'list', 'checkdir': None, 'xpkg': None, |
59 |
- 'validity_fuse': None, 'can_force': None, 'pkgs': 'dict', |
60 |
+ 'validity_future': 'Future', 'can_force': None, 'pkgs': 'dict', |
61 |
}, |
62 |
}, |
63 |
'ebuild-module': { |
64 |
|
65 |
diff --git a/pym/repoman/modules/scan/ebuild/ebuild.py b/pym/repoman/modules/scan/ebuild/ebuild.py |
66 |
index b015985..b02cdcd 100644 |
67 |
--- a/pym/repoman/modules/scan/ebuild/ebuild.py |
68 |
+++ b/pym/repoman/modules/scan/ebuild/ebuild.py |
69 |
@@ -86,7 +86,7 @@ class Ebuild(ScanBase): |
70 |
self.qatracker.add_error( |
71 |
"ebuild.notadded", self.xpkg + "/" + self.y_ebuild + ".ebuild") |
72 |
# update the dynamic data |
73 |
- self.set_result_raise([('ebuild', self)]) |
74 |
+ self.set_result_raise([(kwargs.get('ebuild'), self)]) |
75 |
return False |
76 |
|
77 |
def set_pkg_data(self, **kwargs): |
78 |
|
79 |
diff --git a/pym/repoman/modules/scan/ebuild/isebuild.py b/pym/repoman/modules/scan/ebuild/isebuild.py |
80 |
index 3e288a3..24680e2 100644 |
81 |
--- a/pym/repoman/modules/scan/ebuild/isebuild.py |
82 |
+++ b/pym/repoman/modules/scan/ebuild/isebuild.py |
83 |
@@ -13,6 +13,7 @@ from portage import os |
84 |
from repoman.qa_data import no_exec, allvars |
85 |
from repoman.modules.scan.scanbase import ScanBase |
86 |
|
87 |
+ |
88 |
class IsEbuild(ScanBase): |
89 |
'''Performs basic tests to confirm it is an ebuild''' |
90 |
|
91 |
@@ -88,9 +89,13 @@ class IsEbuild(ScanBase): |
92 |
self.continue_ = True |
93 |
self.set_result_pass([(can_force, False)]) |
94 |
# set our updated data |
95 |
- self.set_result_raise([ |
96 |
- (kwargs.get('pkgs'), pkgs), |
97 |
- ]) |
98 |
+ dyn_pkgs = kwargs.get('pkgs') |
99 |
+ # clear() sets it to None, |
100 |
+ # we don't want to kill the pointer reference |
101 |
+ # just set it back to an empty dict() |
102 |
+ for key in list(dyn_pkgs): |
103 |
+ dyn_pkgs.pop(key) |
104 |
+ dyn_pkgs.update(pkgs) |
105 |
return self.continue_ |
106 |
|
107 |
@property |
108 |
|
109 |
diff --git a/pym/repoman/modules/scan/eclasses/live.py b/pym/repoman/modules/scan/eclasses/live.py |
110 |
index e5bb7dc..85e829c 100644 |
111 |
--- a/pym/repoman/modules/scan/eclasses/live.py |
112 |
+++ b/pym/repoman/modules/scan/eclasses/live.py |
113 |
@@ -25,10 +25,11 @@ class LiveEclassChecks(ScanBase): |
114 |
|
115 |
@returns: dictionary, including {live_ebuild} |
116 |
''' |
117 |
+ ebuild = kwargs.get('ebuild').result() |
118 |
# update the dynamic data |
119 |
dyn_live = kwargs.get('live_ebuild') |
120 |
- dyn_live.update(LIVE_ECLASSES.intersection( |
121 |
- kwargs.get('ebuild').inherited)) |
122 |
+ #dyn_live.clear() |
123 |
+ dyn_live.update(LIVE_ECLASSES.intersection(ebuild.inherited)) |
124 |
return False |
125 |
|
126 |
def check(self, **kwargs): |
127 |
|
128 |
diff --git a/pym/repoman/modules/scan/keywords/__init__.py b/pym/repoman/modules/scan/keywords/__init__.py |
129 |
index 2d92dba..2b3f6ca 100644 |
130 |
--- a/pym/repoman/modules/scan/keywords/__init__.py |
131 |
+++ b/pym/repoman/modules/scan/keywords/__init__.py |
132 |
@@ -20,8 +20,8 @@ module_spec = { |
133 |
}, |
134 |
'mod_kwargs': ['qatracker', 'options', 'repo_metadata', 'profiles', |
135 |
], |
136 |
- 'func_kwargs': {'pkg': None, 'xpkg': None, 'ebuild': None, |
137 |
- 'y_ebuild': None, 'changed': None, 'live_ebuild': None, |
138 |
+ 'func_kwargs': {'pkg': 'Future', 'xpkg': None, 'ebuild': 'Future', |
139 |
+ 'y_ebuild': None, 'changed': None, 'live_ebuild': 'set', |
140 |
}, |
141 |
}, |
142 |
} |
143 |
|
144 |
diff --git a/pym/repoman/modules/scan/metadata/__init__.py b/pym/repoman/modules/scan/metadata/__init__.py |
145 |
index af9771b..9ccf377 100644 |
146 |
--- a/pym/repoman/modules/scan/metadata/__init__.py |
147 |
+++ b/pym/repoman/modules/scan/metadata/__init__.py |
148 |
@@ -48,7 +48,7 @@ module_spec = { |
149 |
}, |
150 |
'mod_kwargs': ['qatracker', |
151 |
], |
152 |
- 'func_kwargs': {'ebuild': None, 'pkg': None, |
153 |
+ 'func_kwargs': {'ebuild': None, 'pkg': 'Future', |
154 |
}, |
155 |
}, |
156 |
'license-metadata': { |
157 |
|
158 |
diff --git a/pym/repoman/modules/scan/metadata/unused.py b/pym/repoman/modules/scan/metadata/unused.py |
159 |
index 0184d78..fdca418 100644 |
160 |
--- a/pym/repoman/modules/scan/metadata/unused.py |
161 |
+++ b/pym/repoman/modules/scan/metadata/unused.py |
162 |
@@ -23,7 +23,7 @@ class UnusedCheck(ScanBase): |
163 |
@param validity_future: Future instance |
164 |
''' |
165 |
xpkg = kwargs.get('xpkg') |
166 |
- muselist = kwargs.get('muselist').result() |
167 |
+ muselist = self.get_result(kwargs.get('muselist'), set()) |
168 |
used_useflags = kwargs.get('used_useflags') |
169 |
valid_state = self.get_result(kwargs['validity_future'], True) |
170 |
# check if there are unused local USE-descriptions in metadata.xml |
171 |
|
172 |
diff --git a/pym/repoman/modules/scan/use/use_flags.py b/pym/repoman/modules/scan/use/use_flags.py |
173 |
index 70f7583..b2b1cc0 100644 |
174 |
--- a/pym/repoman/modules/scan/use/use_flags.py |
175 |
+++ b/pym/repoman/modules/scan/use/use_flags.py |
176 |
@@ -42,20 +42,21 @@ class USEFlagChecks(ScanBase): |
177 |
package = kwargs.get('xpkg') |
178 |
ebuild = kwargs.get('ebuild').result() |
179 |
y_ebuild = kwargs.get('y_ebuild') |
180 |
- localUseFlags = kwargs.get('muselist').result() |
181 |
+ localUseFlags = self.get_result(kwargs.get('muselist'), set()) |
182 |
+ dyn_ebuild_used = kwargs.get('ebuild_UsedUseFlags') |
183 |
+ dyn_used = kwargs.get('used_useflags') |
184 |
# reset state variables for the run |
185 |
self.useFlags = [] |
186 |
self.defaultUseFlags = [] |
187 |
self.usedUseFlags = set() |
188 |
+ dyn_ebuild_used.clear() |
189 |
+ # perform the checks |
190 |
self._checkGlobal(pkg) |
191 |
self._checkMetadata(package, ebuild, y_ebuild, localUseFlags) |
192 |
self._checkRequiredUSE(pkg, ebuild) |
193 |
# update the dynamic data |
194 |
- used_useflags = kwargs.get('used_useflags').union(self.usedUseFlags) |
195 |
- dyn_ebuild_used = kwargs.get('ebuild_UsedUseFlags') |
196 |
- dyn_ebuild_used.update(self.usedUseFlags) |
197 |
- dyn_used = kwargs.get('used_useflags') |
198 |
- dyn_used.update(used_useflags) |
199 |
+ dyn_ebuild_used.union(self.usedUseFlags) |
200 |
+ dyn_used.update(self.usedUseFlags) |
201 |
return False |
202 |
|
203 |
|
204 |
|
205 |
diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py |
206 |
index 3d2c69c..eaf023b 100644 |
207 |
--- a/pym/repoman/scanner.py |
208 |
+++ b/pym/repoman/scanner.py |
209 |
@@ -203,11 +203,6 @@ class Scanner(object): |
210 |
} |
211 |
# initialize the plugin checks here |
212 |
self.modules = {} |
213 |
- for mod in ['manifests', 'isebuild', 'keywords', 'files', 'vcsstatus', |
214 |
- 'fetches', 'pkgmetadata']: |
215 |
- mod_class = MODULE_CONTROLLER.get_class(mod) |
216 |
- logging.debug("Initializing class name: %s", mod_class.__name__) |
217 |
- self.modules[mod_class.__name__] = mod_class(**self.set_kwargs(mod)) |
218 |
|
219 |
def set_kwargs(self, mod): |
220 |
'''Creates a limited set of kwargs to pass to the module's __init__() |
221 |
@@ -231,17 +226,25 @@ class Scanner(object): |
222 |
''' |
223 |
func_kwargs = MODULE_CONTROLLER.modules[mod]['func_kwargs'] |
224 |
# determine new keys |
225 |
- required = set(func_kwargs.viewkeys()) |
226 |
- exist = set(dynamic_data.viewkeys()) |
227 |
- new = exist.difference(required) |
228 |
+ required = set(list(func_kwargs)) |
229 |
+ exist = set(list(dynamic_data)) |
230 |
+ new = required.difference(exist) |
231 |
# update dynamic_data with initialized entries |
232 |
for key in new: |
233 |
- dynamic_data[key] = DATA_TYPES[func_kwargs['key']]() |
234 |
+ logging.debug("set_func_kwargs(); adding: %s, %s", |
235 |
+ key, func_kwargs[key]) |
236 |
+ dynamic_data[key] = DATA_TYPES[func_kwargs[key]]() |
237 |
kwargs = {} |
238 |
for key in required: |
239 |
kwargs[key] = dynamic_data[key] |
240 |
return kwargs |
241 |
|
242 |
+ def reset_futures(self, dynamic_data): |
243 |
+ for key in list(dynamic_data): |
244 |
+ #if key in ['ebuild', 'pkg']: # and isinstance(dynamic_data[key], Future): |
245 |
+ if isinstance(dynamic_data[key], Future) and key not in ['muselist']: |
246 |
+ dynamic_data[key] = Future() |
247 |
+ |
248 |
def scan_pkgs(self, can_force): |
249 |
for xpkg in self.effective_scanlist: |
250 |
xpkg_continue = False |
251 |
@@ -270,16 +273,26 @@ class Scanner(object): |
252 |
'repolevel': self.repolevel, |
253 |
'catdir': catdir, |
254 |
'pkgdir': pkgdir, |
255 |
- 'validity_future': Future() |
256 |
+ 'validity_future': Future(), |
257 |
+ 'y_ebuild': None, |
258 |
+ # this needs to be reset at the pkg level only, |
259 |
+ # easiest is to just initialize it here |
260 |
+ 'muselist': Future(), |
261 |
} |
262 |
# need to set it up for ==> self.modules or some other ordered list |
263 |
- for mod in ['Manifests', 'IsEbuild', 'KeywordChecks', 'FileChecks', |
264 |
- 'VCSStatus', 'FetchChecks', 'PkgMetadata']: |
265 |
- logging.debug("scan_pkgs; module: %s", mod) |
266 |
- do_it, functions = self.modules[mod].runInPkgs |
267 |
+ for mod in [('manifests', 'Manifests'), ('isebuild', 'IsEbuild'), |
268 |
+ ('keywords', 'KeywordChecks'), ('files', 'FileChecks'), |
269 |
+ ('vcsstatus', 'VCSStatus'), ('fetches', 'FetchChecks'), |
270 |
+ ('pkgmetadata', 'PkgMetadata'), |
271 |
+ ]: |
272 |
+ mod_class = MODULE_CONTROLLER.get_class(mod[0]) |
273 |
+ logging.debug("Initializing class name: %s", mod_class.__name__) |
274 |
+ self.modules[mod_class.__name__] = mod_class(**self.set_kwargs(mod[0])) |
275 |
+ logging.debug("scan_pkgs; module: %s", mod[1]) |
276 |
+ do_it, functions = self.modules[mod[1]].runInPkgs |
277 |
if do_it: |
278 |
for func in functions: |
279 |
- _continue = func(**self.set_func_kwargs(mod, dynamic_data)) |
280 |
+ _continue = func(**self.set_func_kwargs(mod[0], dynamic_data)) |
281 |
if _continue: |
282 |
# If we can't access all the metadata then it's totally unsafe to |
283 |
# commit since there's no way to generate a correct Manifest. |
284 |
@@ -312,6 +325,7 @@ class Scanner(object): |
285 |
dynamic_data['used_useflags'] = set() |
286 |
|
287 |
for y_ebuild in ebuildlist: |
288 |
+ self.reset_futures(dynamic_data) |
289 |
dynamic_data['y_ebuild'] = y_ebuild |
290 |
y_ebuild_continue = False |
291 |
|
292 |
@@ -320,7 +334,8 @@ class Scanner(object): |
293 |
for mod in [('ebuild', 'Ebuild'), ('live', 'LiveEclassChecks'), |
294 |
('eapi', 'EAPIChecks'), ('ebuild_metadata', 'EbuildMetadata'), |
295 |
('thirdpartymirrors', 'ThirdPartyMirrors'), |
296 |
- ('description', 'DescriptionChecks'), (None, 'KeywordChecks'), |
297 |
+ ('description', 'DescriptionChecks'), |
298 |
+ ('keywords', 'KeywordChecks'), |
299 |
('arches', 'ArchChecks'), ('depend', 'DependChecks'), |
300 |
('use_flags', 'USEFlagChecks'), ('ruby', 'RubyEclassChecks'), |
301 |
('license', 'LicenseChecks'), ('restrict', 'RestrictChecks'), |
302 |
@@ -329,17 +344,17 @@ class Scanner(object): |
303 |
('options', 'Options'), ('profile', 'ProfileDependsChecks'), |
304 |
('unknown', 'DependUnknown'), |
305 |
]: |
306 |
- if mod[0]: |
307 |
+ if mod[0] and mod[1] not in self.modules: |
308 |
mod_class = MODULE_CONTROLLER.get_class(mod[0]) |
309 |
logging.debug("Initializing class name: %s", mod_class.__name__) |
310 |
- self.modules[mod[1]] = mod_class(**self.set_kwargs(mod)) |
311 |
+ self.modules[mod[1]] = mod_class(**self.set_kwargs(mod[0])) |
312 |
logging.debug("scan_ebuilds: module: %s", mod[1]) |
313 |
do_it, functions = self.modules[mod[1]].runInEbuilds |
314 |
logging.debug("do_it: %s, functions: %s", do_it, [x.__name__ for x in functions]) |
315 |
if do_it: |
316 |
for func in functions: |
317 |
logging.debug("\tRunning function: %s", func) |
318 |
- _continue = func(**self.set_func_kwargs(mod, dynamic_data)) |
319 |
+ _continue = func(**self.set_func_kwargs(mod[0], dynamic_data)) |
320 |
if _continue: |
321 |
# If we can't access all the metadata then it's totally unsafe to |
322 |
# commit since there's no way to generate a correct Manifest. |
323 |
@@ -363,14 +378,14 @@ class Scanner(object): |
324 |
if mod[0]: |
325 |
mod_class = MODULE_CONTROLLER.get_class(mod[0]) |
326 |
logging.debug("Initializing class name: %s", mod_class.__name__) |
327 |
- self.modules[mod[1]] = mod_class(**self.set_kwargs(mod)) |
328 |
+ self.modules[mod[1]] = mod_class(**self.set_kwargs(mod[0])) |
329 |
logging.debug("scan_ebuilds final checks: module: %s", mod[1]) |
330 |
do_it, functions = self.modules[mod[1]].runInFinal |
331 |
logging.debug("do_it: %s, functions: %s", do_it, [x.__name__ for x in functions]) |
332 |
if do_it: |
333 |
for func in functions: |
334 |
logging.debug("\tRunning function: %s", func) |
335 |
- _continue = func(**self.set_func_kwargs(mod, dynamic_data)) |
336 |
+ _continue = func(**self.set_func_kwargs(mod[0], dynamic_data)) |
337 |
if _continue: |
338 |
xpkg_complete = True |
339 |
# logging.debug("\t>>> Continuing") |