Gentoo Archives: gentoo-commits

From: Brian Dolbec <dolsen@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: pym/repoman/, pym/repoman/modules/scan/ebuild/
Date: Fri, 29 Apr 2016 17:25:15
Message-Id: 1461679721.695492024a9ca40fd14148a980a960a8551dab29.dolsen@gentoo
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'),