1 |
commit: c925718100adf9048b36e99d0a5816fcb87012c6 |
2 |
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org> |
3 |
AuthorDate: Tue Jun 3 11:15:10 2014 +0000 |
4 |
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com> |
5 |
CommitDate: Wed Oct 1 22:58:13 2014 +0000 |
6 |
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=c9257181 |
7 |
|
8 |
repoman/main.py: Split USE flag checks to checks/ebuilds/use_flags.py |
9 |
|
10 |
--- |
11 |
pym/repoman/checks/ebuilds/misc.py | 2 +- |
12 |
pym/repoman/checks/ebuilds/use_flags.py | 85 +++++++++++++++++++++++++++++++++ |
13 |
pym/repoman/main.py | 52 ++++---------------- |
14 |
3 files changed, 95 insertions(+), 44 deletions(-) |
15 |
|
16 |
diff --git a/pym/repoman/checks/ebuilds/misc.py b/pym/repoman/checks/ebuilds/misc.py |
17 |
index 3bf61f0..744784a 100644 |
18 |
--- a/pym/repoman/checks/ebuilds/misc.py |
19 |
+++ b/pym/repoman/checks/ebuilds/misc.py |
20 |
@@ -39,7 +39,7 @@ def bad_split_check(xpkg, y_ebuild, pkgdir, qatracker): |
21 |
return False |
22 |
|
23 |
|
24 |
-def pkg_invalid(pkg, qatracker): |
25 |
+def pkg_invalid(pkg, qatracker, ebuild): |
26 |
'''Checks for invalid packages |
27 |
|
28 |
@param pkg: _emerge.Package instance |
29 |
|
30 |
diff --git a/pym/repoman/checks/ebuilds/use_flags.py b/pym/repoman/checks/ebuilds/use_flags.py |
31 |
new file mode 100644 |
32 |
index 0000000..bc09ed7 |
33 |
--- /dev/null |
34 |
+++ b/pym/repoman/checks/ebuilds/use_flags.py |
35 |
@@ -0,0 +1,85 @@ |
36 |
+ |
37 |
+'''use_flags.py |
38 |
+Performs USE flag related checks |
39 |
+''' |
40 |
+ |
41 |
+# import our centrally initialized portage instance |
42 |
+from repoman._portage import portage |
43 |
+ |
44 |
+from portage import eapi |
45 |
+from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use |
46 |
+ |
47 |
+ |
48 |
+class USEFlagChecks(object): |
49 |
+ '''Performs checks on USE flags listed in the ebuilds and metadata.xml''' |
50 |
+ |
51 |
+ def __init__(self, qatracker, globalUseFlags): |
52 |
+ ''' |
53 |
+ @param qatracker: QATracker instance |
54 |
+ @param globalUseFlags: Global USE flags |
55 |
+ ''' |
56 |
+ self.qatracker = qatracker |
57 |
+ self.useFlags = [] |
58 |
+ self.defaultUseFlags = [] |
59 |
+ self.usedUseFlags = set() |
60 |
+ self.globalUseFlags = globalUseFlags |
61 |
+ |
62 |
+ def check(self, pkg, package, ebuild, y_ebuild, localUseFlags): |
63 |
+ '''Perform the check. |
64 |
+ |
65 |
+ @param pkg: Package in which we check (object). |
66 |
+ @param package: Package in which we check (string). |
67 |
+ @param ebuild: Ebuild which we check (object). |
68 |
+ @param y_ebuild: Ebuild which we check (string). |
69 |
+ @param localUseFlags: Local USE flags of the package |
70 |
+ ''' |
71 |
+ self._checkGlobal(pkg) |
72 |
+ self._checkMetadata(package, ebuild, y_ebuild, localUseFlags) |
73 |
+ self._checkRequiredUSE(pkg, ebuild) |
74 |
+ |
75 |
+ def getUsedUseFlags(self): |
76 |
+ '''Get the USE flags that this check has seen''' |
77 |
+ return self.usedUseFlags |
78 |
+ |
79 |
+ def _checkGlobal(self, pkg): |
80 |
+ for myflag in pkg._metadata["IUSE"].split(): |
81 |
+ flag_name = myflag.lstrip("+-") |
82 |
+ self.usedUseFlags.add(flag_name) |
83 |
+ if myflag != flag_name: |
84 |
+ self.defaultUseFlags.append(myflag) |
85 |
+ if flag_name not in self.globalUseFlags: |
86 |
+ self.useFlags.append(flag_name) |
87 |
+ |
88 |
+ def _checkMetadata(self, package, ebuild, y_ebuild, localUseFlags): |
89 |
+ for mypos in range(len(self.useFlags) - 1, -1, -1): |
90 |
+ if self.useFlags[mypos] and (self.useFlags[mypos] in localUseFlags): |
91 |
+ del self.useFlags[mypos] |
92 |
+ |
93 |
+ if self.defaultUseFlags and not eapi_has_iuse_defaults(eapi): |
94 |
+ for myflag in self.defaultUseFlags: |
95 |
+ self.qatracker.add_error( |
96 |
+ 'EAPI.incompatible', "%s: IUSE defaults" |
97 |
+ " not supported with EAPI='%s': '%s'" % ( |
98 |
+ ebuild.relative_path, eapi, myflag)) |
99 |
+ |
100 |
+ for mypos in range(len(self.useFlags)): |
101 |
+ self.qatracker.add_error( |
102 |
+ "IUSE.invalid", |
103 |
+ "%s/%s.ebuild: %s" % (package, y_ebuild, self.useFlags[mypos])) |
104 |
+ |
105 |
+ def _checkRequiredUSE(self, pkg, ebuild): |
106 |
+ required_use = pkg._metadata["REQUIRED_USE"] |
107 |
+ if required_use: |
108 |
+ if not eapi_has_required_use(eapi): |
109 |
+ self.qatracker.add_error( |
110 |
+ 'EAPI.incompatible', "%s: REQUIRED_USE" |
111 |
+ " not supported with EAPI='%s'" |
112 |
+ % (ebuild.relative_path, eapi,)) |
113 |
+ try: |
114 |
+ portage.dep.check_required_use( |
115 |
+ required_use, (), pkg.iuse.is_valid_flag, eapi=eapi) |
116 |
+ except portage.exception.InvalidDependString as e: |
117 |
+ self.qatracker.add_error( |
118 |
+ "REQUIRED_USE.syntax", |
119 |
+ "%s: REQUIRED_USE: %s" % (ebuild.relative_path, e)) |
120 |
+ del e |
121 |
|
122 |
diff --git a/pym/repoman/main.py b/pym/repoman/main.py |
123 |
index fcd4c19..5f21e7a 100755 |
124 |
--- a/pym/repoman/main.py |
125 |
+++ b/pym/repoman/main.py |
126 |
@@ -44,7 +44,6 @@ from portage.output import ( |
127 |
from portage.output import ConsoleStyleFile, StyleWriter |
128 |
from portage.util import writemsg_level |
129 |
from portage.package.ebuild.digestgen import digestgen |
130 |
-from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use |
131 |
|
132 |
from repoman.argparser import parse_args |
133 |
from repoman.checks.directories.files import FileChecks |
134 |
@@ -55,6 +54,7 @@ from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors |
135 |
from repoman.checks.ebuilds.manifests import Manifests |
136 |
from repoman.checks.ebuilds.misc import bad_split_check, pkg_invalid |
137 |
from repoman.checks.ebuilds.pkgmetadata import PkgMetadata |
138 |
+from repoman.checks.ebuilds.use_flags import USEFlagChecks |
139 |
from repoman.ebuild import Ebuild |
140 |
from repoman.errors import err |
141 |
from repoman.modules.commit import repochecks |
142 |
@@ -367,7 +367,7 @@ for xpkg in effective_scanlist: |
143 |
continue |
144 |
################### |
145 |
pkg = pkgs[y_ebuild] |
146 |
- if pkg_invalid(pkg, qatracker): |
147 |
+ if pkg_invalid(pkg, qatracker, ebuild): |
148 |
allvalid = False |
149 |
continue |
150 |
|
151 |
@@ -626,32 +626,13 @@ for xpkg in effective_scanlist: |
152 |
badlicsyntax = badlicsyntax > 0 |
153 |
badprovsyntax = badprovsyntax > 0 |
154 |
|
155 |
- # uselist checks - global |
156 |
- myuse = [] |
157 |
- default_use = [] |
158 |
- for myflag in myaux["IUSE"].split(): |
159 |
- flag_name = myflag.lstrip("+-") |
160 |
- used_useflags.add(flag_name) |
161 |
- if myflag != flag_name: |
162 |
- default_use.append(myflag) |
163 |
- if flag_name not in uselist: |
164 |
- myuse.append(flag_name) |
165 |
- |
166 |
- # uselist checks - metadata |
167 |
- for mypos in range(len(myuse) - 1, -1, -1): |
168 |
- if myuse[mypos] and (myuse[mypos] in muselist): |
169 |
- del myuse[mypos] |
170 |
- |
171 |
- if default_use and not eapi_has_iuse_defaults(eapi): |
172 |
- for myflag in default_use: |
173 |
- qatracker.add_error('EAPI.incompatible', |
174 |
- "%s: IUSE defaults" |
175 |
- " not supported with EAPI='%s': '%s'" % |
176 |
- (ebuild.relative_path, eapi, myflag)) |
177 |
- |
178 |
- for mypos in range(len(myuse)): |
179 |
- qatracker.add_error("IUSE.invalid", |
180 |
- xpkg + "/" + y_ebuild + ".ebuild: %s" % myuse[mypos]) |
181 |
+ ################# |
182 |
+ use_flag_checks = USEFlagChecks(qatracker, uselist) |
183 |
+ use_flag_checks.check(pkg, xpkg, ebuild, y_ebuild, muselist) |
184 |
+ |
185 |
+ ebuild_used_useflags = use_flag_checks.getUsedUseFlags() |
186 |
+ used_useflags = used_useflags.union(ebuild_used_useflags) |
187 |
+ ################# |
188 |
|
189 |
# Check for outdated RUBY targets |
190 |
old_ruby_eclasses = ["ruby-ng", "ruby-fakegem", "ruby"] |
191 |
@@ -715,21 +696,6 @@ for xpkg in effective_scanlist: |
192 |
for mybad in mybadrestrict: |
193 |
qatracker.add_error("RESTRICT.invalid", |
194 |
xpkg + "/" + y_ebuild + ".ebuild: %s" % mybad) |
195 |
- # REQUIRED_USE check |
196 |
- required_use = myaux["REQUIRED_USE"] |
197 |
- if required_use: |
198 |
- if not eapi_has_required_use(eapi): |
199 |
- qatracker.add_error('EAPI.incompatible', |
200 |
- "%s: REQUIRED_USE" |
201 |
- " not supported with EAPI='%s'" |
202 |
- % (ebuild.relative_path, eapi,)) |
203 |
- try: |
204 |
- portage.dep.check_required_use( |
205 |
- required_use, (), pkg.iuse.is_valid_flag, eapi=eapi) |
206 |
- except portage.exception.InvalidDependString as e: |
207 |
- qatracker.add_error("REQUIRED_USE.syntax", |
208 |
- "%s: REQUIRED_USE: %s" % (ebuild.relative_path, e)) |
209 |
- del e |
210 |
|
211 |
# Syntax Checks |