1 |
commit: 695492024a9ca40fd14148a980a960a8551dab29 |
2 |
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
3 |
AuthorDate: Tue Apr 26 14:08:41 2016 +0000 |
4 |
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
5 |
CommitDate: Tue Apr 26 14:08:41 2016 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=69549202 |
7 |
|
8 |
Repoman: Merge IsEbuild class into ebuild |
9 |
|
10 |
This reduces the need to import the pkgs data, it is now an internal class instance variable. |
11 |
'pkgs' is still needed, but only to assign it the new pkgs dictionary which the scanner |
12 |
requires for the ebuild loop. |
13 |
|
14 |
pym/repoman/modules/scan/ebuild/__init__.py | 27 ++------ |
15 |
pym/repoman/modules/scan/ebuild/ebuild.py | 84 ++++++++++++++++++++++-- |
16 |
pym/repoman/modules/scan/ebuild/isebuild.py | 99 ----------------------------- |
17 |
pym/repoman/scanner.py | 4 +- |
18 |
4 files changed, 88 insertions(+), 126 deletions(-) |
19 |
|
20 |
diff --git a/pym/repoman/modules/scan/ebuild/__init__.py b/pym/repoman/modules/scan/ebuild/__init__.py |
21 |
index b243314..8666e78 100644 |
22 |
--- a/pym/repoman/modules/scan/ebuild/__init__.py |
23 |
+++ b/pym/repoman/modules/scan/ebuild/__init__.py |
24 |
@@ -10,25 +10,6 @@ module_spec = { |
25 |
'name': 'ebuild', |
26 |
'description': doc, |
27 |
'provides':{ |
28 |
- 'isebuild-module': { |
29 |
- 'name': "isebuild", |
30 |
- 'sourcefile': "isebuild", |
31 |
- 'class': "IsEbuild", |
32 |
- 'description': doc, |
33 |
- 'functions': ['check'], |
34 |
- 'func_desc': { |
35 |
- }, |
36 |
- 'mod_kwargs': ['portdb', 'qatracker', 'repo_settings' |
37 |
- ], |
38 |
- 'func_kwargs': { |
39 |
- 'can_force': (None, None), |
40 |
- 'checkdir': (None, None), |
41 |
- 'checkdirlist': (None, None), |
42 |
- 'pkgs': ('Future', 'dict'), |
43 |
- 'validity_future': ('Future', True), |
44 |
- 'xpkg': (None, None), |
45 |
- }, |
46 |
- }, |
47 |
'ebuild-module': { |
48 |
'name': "ebuild", |
49 |
'sourcefile': "ebuild", |
50 |
@@ -37,16 +18,20 @@ module_spec = { |
51 |
'functions': ['check'], |
52 |
'func_desc': { |
53 |
}, |
54 |
- 'mod_kwargs': ['qatracker', 'repo_settings', 'vcs_settings', 'checks', |
55 |
+ 'mod_kwargs': ['qatracker', 'repo_settings', 'vcs_settings', |
56 |
+ 'checks', 'portdb' |
57 |
], |
58 |
'func_kwargs': { |
59 |
+ 'can_force': (None, None), |
60 |
'catdir': (None, None), |
61 |
'changed': (None, None), |
62 |
'changelog_modified': (None, None), |
63 |
+ 'checkdir': (None, None), |
64 |
+ 'checkdirlist': (None, None), |
65 |
'ebuild': ('Future', 'UNSET'), |
66 |
'pkg': ('Future', 'UNSET'), |
67 |
'pkgdir': (None, None), |
68 |
- 'pkgs': (None, None), |
69 |
+ 'pkgs': ('Future', 'dict'), |
70 |
'repolevel': (None, None), |
71 |
'validity_future': (None, None), |
72 |
'xpkg': (None, None), |
73 |
|
74 |
diff --git a/pym/repoman/modules/scan/ebuild/ebuild.py b/pym/repoman/modules/scan/ebuild/ebuild.py |
75 |
index 92b1ea4..c247a7f 100644 |
76 |
--- a/pym/repoman/modules/scan/ebuild/ebuild.py |
77 |
+++ b/pym/repoman/modules/scan/ebuild/ebuild.py |
78 |
@@ -3,8 +3,13 @@ |
79 |
from __future__ import print_function, unicode_literals |
80 |
|
81 |
import re |
82 |
+import stat |
83 |
+ |
84 |
+from _emerge.Package import Package |
85 |
+from _emerge.RootConfig import RootConfig |
86 |
|
87 |
from repoman.modules.scan.scanbase import ScanBase |
88 |
+from repoman.qa_data import no_exec, allvars |
89 |
# import our initialized portage instance |
90 |
from repoman._portage import portage |
91 |
from portage import os |
92 |
@@ -19,16 +24,19 @@ class Ebuild(ScanBase): |
93 |
'''Class init |
94 |
|
95 |
@param qatracker: QATracker instance |
96 |
+ @param portdb: portdb instance |
97 |
@param repo_settings: repository settings instance |
98 |
@param vcs_settings: VCSSettings instance |
99 |
- @param changed: changes dictionary |
100 |
@param checks: checks dictionary |
101 |
''' |
102 |
super(Ebuild, self).__init__(**kwargs) |
103 |
self.qatracker = kwargs.get('qatracker') |
104 |
+ self.portdb = kwargs.get('portdb') |
105 |
self.repo_settings = kwargs.get('repo_settings') |
106 |
self.vcs_settings = kwargs.get('vcs_settings') |
107 |
self.checks = kwargs.get('checks') |
108 |
+ self.root_config = RootConfig(self.repo_settings.repoman_settings, |
109 |
+ self.repo_settings.trees[self.repo_settings.root], None) |
110 |
self.changed = None |
111 |
self.xpkg = None |
112 |
self.y_ebuild = None |
113 |
@@ -37,6 +45,7 @@ class Ebuild(ScanBase): |
114 |
self.eapi = None |
115 |
self.inherited = None |
116 |
self.keywords = None |
117 |
+ self.pkgs = {} |
118 |
|
119 |
def _set_paths(self, **kwargs): |
120 |
repolevel = kwargs.get('repolevel') |
121 |
@@ -93,11 +102,9 @@ class Ebuild(ScanBase): |
122 |
def set_pkg_data(self, **kwargs): |
123 |
'''Sets some classwide data needed for some of the checks |
124 |
|
125 |
- @param pkgs: the dynamic list of ebuilds |
126 |
@returns: dictionary |
127 |
''' |
128 |
- pkgs = kwargs.get('pkgs').get() |
129 |
- self.pkg = pkgs[self.y_ebuild] |
130 |
+ self.pkg = self.pkgs[self.y_ebuild] |
131 |
self.metadata = self.pkg._metadata |
132 |
self.eapi = self.metadata["EAPI"] |
133 |
self.inherited = self.pkg.inherited |
134 |
@@ -148,6 +155,75 @@ class Ebuild(ScanBase): |
135 |
dyn_pkg.set(self.pkg) |
136 |
return False |
137 |
|
138 |
+ def check_isebuild(self, **kwargs): |
139 |
+ '''Test the file for qualifications that is is an ebuild |
140 |
+ |
141 |
+ @param checkdirlist: list of files in the current package directory |
142 |
+ @param checkdir: current package directory path |
143 |
+ @param xpkg: current package directory being checked |
144 |
+ @param validity_future: Future instance |
145 |
+ @returns: dictionary, including {pkgs, can_force} |
146 |
+ ''' |
147 |
+ checkdirlist = kwargs.get('checkdirlist').get() |
148 |
+ checkdir = kwargs.get('checkdir') |
149 |
+ xpkg = kwargs.get('xpkg') |
150 |
+ fuse = kwargs.get('validity_future') |
151 |
+ can_force = kwargs.get('can_force') |
152 |
+ self.continue_ = False |
153 |
+ ebuildlist = [] |
154 |
+ pkgs = {} |
155 |
+ for y in checkdirlist: |
156 |
+ file_is_ebuild = y.endswith(".ebuild") |
157 |
+ file_should_be_non_executable = y in no_exec or file_is_ebuild |
158 |
+ |
159 |
+ if file_should_be_non_executable: |
160 |
+ file_is_executable = stat.S_IMODE( |
161 |
+ os.stat(os.path.join(checkdir, y)).st_mode) & 0o111 |
162 |
+ |
163 |
+ if file_is_executable: |
164 |
+ self.qatracker.add_error("file.executable", os.path.join(checkdir, y)) |
165 |
+ if file_is_ebuild: |
166 |
+ pf = y[:-7] |
167 |
+ ebuildlist.append(pf) |
168 |
+ catdir = xpkg.split("/")[0] |
169 |
+ cpv = "%s/%s" % (catdir, pf) |
170 |
+ try: |
171 |
+ myaux = dict(zip(allvars, self.portdb.aux_get(cpv, allvars))) |
172 |
+ except KeyError: |
173 |
+ fuse.set(False, ignore_InvalidState=True) |
174 |
+ self.qatracker.add_error("ebuild.syntax", os.path.join(xpkg, y)) |
175 |
+ continue |
176 |
+ except IOError: |
177 |
+ fuse.set(False, ignore_InvalidState=True) |
178 |
+ self.qatracker.add_error("ebuild.output", os.path.join(xpkg, y)) |
179 |
+ continue |
180 |
+ if not portage.eapi_is_supported(myaux["EAPI"]): |
181 |
+ fuse.set(False, ignore_InvalidState=True) |
182 |
+ self.qatracker.add_error("EAPI.unsupported", os.path.join(xpkg, y)) |
183 |
+ continue |
184 |
+ pkgs[pf] = Package( |
185 |
+ cpv=cpv, metadata=myaux, root_config=self.root_config, |
186 |
+ type_name="ebuild") |
187 |
+ |
188 |
+ if len(pkgs) != len(ebuildlist): |
189 |
+ # If we can't access all the metadata then it's totally unsafe to |
190 |
+ # commit since there's no way to generate a correct Manifest. |
191 |
+ # Do not try to do any more QA checks on this package since missing |
192 |
+ # metadata leads to false positives for several checks, and false |
193 |
+ # positives confuse users. |
194 |
+ self.continue_ = True |
195 |
+ can_force.set(False, ignore_InvalidState=True) |
196 |
+ self.pkgs = pkgs |
197 |
+ # set our updated data |
198 |
+ dyn_pkgs = kwargs.get('pkgs') |
199 |
+ dyn_pkgs.set(pkgs) |
200 |
+ return self.continue_ |
201 |
+ |
202 |
+ @property |
203 |
+ def runInPkgs(self): |
204 |
+ '''Package level scans''' |
205 |
+ return (True, [self.check_isebuild]) |
206 |
+ |
207 |
@property |
208 |
def runInEbuilds(self): |
209 |
'''Ebuild level scans''' |
210 |
|
211 |
diff --git a/pym/repoman/modules/scan/ebuild/isebuild.py b/pym/repoman/modules/scan/ebuild/isebuild.py |
212 |
deleted file mode 100644 |
213 |
index 7277ad0..0000000 |
214 |
--- a/pym/repoman/modules/scan/ebuild/isebuild.py |
215 |
+++ /dev/null |
216 |
@@ -1,99 +0,0 @@ |
217 |
-# -*- coding:utf-8 -*- |
218 |
- |
219 |
-import stat |
220 |
- |
221 |
-from _emerge.Package import Package |
222 |
-from _emerge.RootConfig import RootConfig |
223 |
- |
224 |
-# import our initialized portage instance |
225 |
-from repoman._portage import portage |
226 |
- |
227 |
-from portage import os |
228 |
- |
229 |
-from repoman.qa_data import no_exec, allvars |
230 |
-from repoman.modules.scan.scanbase import ScanBase |
231 |
- |
232 |
- |
233 |
-class IsEbuild(ScanBase): |
234 |
- '''Performs basic tests to confirm it is an ebuild''' |
235 |
- |
236 |
- def __init__(self, **kwargs): |
237 |
- ''' |
238 |
- @param portdb: portdb instance |
239 |
- @param qatracker: QATracker instance |
240 |
- @param repo_settings: repository settings instance |
241 |
- ''' |
242 |
- super(IsEbuild, self).__init__(**kwargs) |
243 |
- self.portdb = kwargs.get('portdb') |
244 |
- self.qatracker = kwargs.get('qatracker') |
245 |
- repo_settings = kwargs.get('repo_settings') |
246 |
- self.root_config = RootConfig(repo_settings.repoman_settings, |
247 |
- repo_settings.trees[repo_settings.root], None) |
248 |
- |
249 |
- def check(self, **kwargs): |
250 |
- '''Test the file for qualifications that is is an ebuild |
251 |
- |
252 |
- @param checkdirlist: list of files in the current package directory |
253 |
- @param checkdir: current package directory path |
254 |
- @param xpkg: current package directory being checked |
255 |
- @param validity_future: Future instance |
256 |
- @returns: dictionary, including {pkgs, can_force} |
257 |
- ''' |
258 |
- checkdirlist = kwargs.get('checkdirlist').get() |
259 |
- checkdir = kwargs.get('checkdir') |
260 |
- xpkg = kwargs.get('xpkg') |
261 |
- fuse = kwargs.get('validity_future') |
262 |
- can_force = kwargs.get('can_force') |
263 |
- self.continue_ = False |
264 |
- ebuildlist = [] |
265 |
- pkgs = {} |
266 |
- for y in checkdirlist: |
267 |
- file_is_ebuild = y.endswith(".ebuild") |
268 |
- file_should_be_non_executable = y in no_exec or file_is_ebuild |
269 |
- |
270 |
- if file_should_be_non_executable: |
271 |
- file_is_executable = stat.S_IMODE( |
272 |
- os.stat(os.path.join(checkdir, y)).st_mode) & 0o111 |
273 |
- |
274 |
- if file_is_executable: |
275 |
- self.qatracker.add_error("file.executable", os.path.join(checkdir, y)) |
276 |
- if file_is_ebuild: |
277 |
- pf = y[:-7] |
278 |
- ebuildlist.append(pf) |
279 |
- catdir = xpkg.split("/")[0] |
280 |
- cpv = "%s/%s" % (catdir, pf) |
281 |
- try: |
282 |
- myaux = dict(zip(allvars, self.portdb.aux_get(cpv, allvars))) |
283 |
- except KeyError: |
284 |
- fuse.set(False, ignore_InvalidState=True) |
285 |
- self.qatracker.add_error("ebuild.syntax", os.path.join(xpkg, y)) |
286 |
- continue |
287 |
- except IOError: |
288 |
- fuse.set(False, ignore_InvalidState=True) |
289 |
- self.qatracker.add_error("ebuild.output", os.path.join(xpkg, y)) |
290 |
- continue |
291 |
- if not portage.eapi_is_supported(myaux["EAPI"]): |
292 |
- fuse.set(False, ignore_InvalidState=True) |
293 |
- self.qatracker.add_error("EAPI.unsupported", os.path.join(xpkg, y)) |
294 |
- continue |
295 |
- pkgs[pf] = Package( |
296 |
- cpv=cpv, metadata=myaux, root_config=self.root_config, |
297 |
- type_name="ebuild") |
298 |
- |
299 |
- if len(pkgs) != len(ebuildlist): |
300 |
- # If we can't access all the metadata then it's totally unsafe to |
301 |
- # commit since there's no way to generate a correct Manifest. |
302 |
- # Do not try to do any more QA checks on this package since missing |
303 |
- # metadata leads to false positives for several checks, and false |
304 |
- # positives confuse users. |
305 |
- self.continue_ = True |
306 |
- can_force.set(False, ignore_InvalidState=True) |
307 |
- # set our updated data |
308 |
- dyn_pkgs = kwargs.get('pkgs') |
309 |
- dyn_pkgs.set(pkgs) |
310 |
- return self.continue_ |
311 |
- |
312 |
- @property |
313 |
- def runInPkgs(self): |
314 |
- '''Package level scans''' |
315 |
- return (True, [self.check]) |
316 |
|
317 |
diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py |
318 |
index 1fd5b77..23d666d 100644 |
319 |
--- a/pym/repoman/scanner.py |
320 |
+++ b/pym/repoman/scanner.py |
321 |
@@ -299,6 +299,7 @@ class Scanner(object): |
322 |
self.vcs_settings.status.check(checkdir, checkdir_relative, xpkg) |
323 |
|
324 |
dynamic_data = { |
325 |
+ 'changelog_modified': False, |
326 |
'checkdirlist': ExtendedFuture(checkdirlist), |
327 |
'checkdir': checkdir, |
328 |
'xpkg': xpkg, |
329 |
@@ -308,7 +309,6 @@ class Scanner(object): |
330 |
'repolevel': self.repolevel, |
331 |
'catdir': catdir, |
332 |
'pkgdir': pkgdir, |
333 |
- 'pkgs': ExtendedFuture({}), |
334 |
'validity_future': ExtendedFuture(True), |
335 |
'y_ebuild': None, |
336 |
# this needs to be reset at the pkg level only, |
337 |
@@ -324,7 +324,7 @@ class Scanner(object): |
338 |
'validity_future', |
339 |
] |
340 |
# need to set it up for ==> self.modules or some other ordered list |
341 |
- for mod in [('manifests', 'Manifests'), ('isebuild', 'IsEbuild'), |
342 |
+ for mod in [('manifests', 'Manifests'), ('ebuild', 'Ebuild'), |
343 |
('keywords', 'KeywordChecks'), ('files', 'FileChecks'), |
344 |
('fetches', 'FetchChecks'), |
345 |
('pkgmetadata', 'PkgMetadata'), |