1 |
commit: 041f770675b288ef3f6a04670b9c4e399e4e26f0 |
2 |
Author: André Erdmann <dywi <AT> mailerd <DOT> de> |
3 |
AuthorDate: Thu Aug 2 15:10:56 2012 +0000 |
4 |
Commit: André Erdmann <dywi <AT> mailerd <DOT> de> |
5 |
CommitDate: Thu Aug 2 15:10:56 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=041f7706 |
7 |
|
8 |
overlay: comments, string formatting and strutil |
9 |
|
10 |
also readded RERAISE to category.py's threaded overlay writing |
11 |
|
12 |
--- |
13 |
roverlay/overlay/category.py | 10 +++++--- |
14 |
roverlay/overlay/creator.py | 13 +---------- |
15 |
roverlay/overlay/metadata/abstractnodes.py | 30 +++++++++++++-------------- |
16 |
roverlay/overlay/metadata/nodes.py | 3 +- |
17 |
roverlay/overlay/package.py | 28 +++++++++++-------------- |
18 |
roverlay/overlay/root.py | 23 +++++++++++++-------- |
19 |
6 files changed, 49 insertions(+), 58 deletions(-) |
20 |
|
21 |
diff --git a/roverlay/overlay/category.py b/roverlay/overlay/category.py |
22 |
index 3551b81..7bf93c8 100644 |
23 |
--- a/roverlay/overlay/category.py |
24 |
+++ b/roverlay/overlay/category.py |
25 |
@@ -158,10 +158,9 @@ class Category ( object ): |
26 |
pkg.write ( write_manifest=False, **write_kw ) |
27 |
except queue.Empty: |
28 |
break |
29 |
- #except ( Exception, KeyboardInterrupt ) as e: |
30 |
except Exception as e: |
31 |
- # FIXME: reintroduce RERAISE |
32 |
- self.logger.exception ( e ) |
33 |
+ #self.logger.exception ( e ) |
34 |
+ self.RERAISE = e |
35 |
# --- end of run_write_queue (...) --- |
36 |
|
37 |
if len ( self._subdirs ) == 0: return |
38 |
@@ -177,7 +176,7 @@ class Category ( object ): |
39 |
|
40 |
max_jobs = self.__class__.WRITE_JOBCOUNT |
41 |
|
42 |
- # FIXME/TODO: what's an reasonable number of min package dirs to |
43 |
+ # What's an reasonable number of min package dirs to |
44 |
# start threaded writing? |
45 |
# Ignoring it for now (and expecting enough pkg dirs) |
46 |
if max_jobs > 1: |
47 |
@@ -201,6 +200,9 @@ class Category ( object ): |
48 |
for w in workers: w.start() |
49 |
for w in workers: w.join() |
50 |
|
51 |
+ if hasattr ( self, 'RERAISE' ) and self.RERAISE is not None: |
52 |
+ raise self.RERAISE |
53 |
+ |
54 |
self.remove_empty() |
55 |
|
56 |
# write manifest files |
57 |
|
58 |
diff --git a/roverlay/overlay/creator.py b/roverlay/overlay/creator.py |
59 |
index 5f346fe..6b42867 100644 |
60 |
--- a/roverlay/overlay/creator.py |
61 |
+++ b/roverlay/overlay/creator.py |
62 |
@@ -196,7 +196,7 @@ class OverlayCreator ( object ): |
63 |
delta = _stop - start |
64 |
|
65 |
self.logger.debug ( |
66 |
- "timestamp: %s (after %f seconds)" % ( description, delta ) |
67 |
+ "timestamp: {} (after {} seconds)".format ( description, delta ) |
68 |
) |
69 |
return _stop |
70 |
# --- end of _timestamp (...) --- |
71 |
@@ -214,10 +214,7 @@ class OverlayCreator ( object ): |
72 |
# --- end of add_package (...) --- |
73 |
|
74 |
def write_overlay ( self ): |
75 |
- """Writes the overlay. |
76 |
- |
77 |
- arguments: |
78 |
- """ |
79 |
+ """Writes the overlay.""" |
80 |
if self.overlay.writeable(): |
81 |
start = time.time() |
82 |
self.overlay.write() |
83 |
@@ -306,7 +303,6 @@ class OverlayCreator ( object ): |
84 |
|
85 |
if do_close: |
86 |
self._err_queue.push ( context=-1, error=None ) |
87 |
- # fixme: remove enabled? |
88 |
for w in self._workers: w.enabled = False |
89 |
else: |
90 |
for w in self._workers: w.stop_when_empty() |
91 |
@@ -373,11 +369,6 @@ class OverlayCreator ( object ): |
92 |
arguments: |
93 |
* package_info -- |
94 |
""" |
95 |
- # ... TODO |
96 |
- # * increase the number of successful/failed packages, |
97 |
- # * request an incremental write to save memory etc. |
98 |
- |
99 |
- # if <>: |
100 |
if package_info ['ebuild'] is not None: |
101 |
self.create_success.inc() |
102 |
if package_info.overlay_package_ref.new_ebuild(): |
103 |
|
104 |
diff --git a/roverlay/overlay/metadata/abstractnodes.py b/roverlay/overlay/metadata/abstractnodes.py |
105 |
index 284ea20..060d369 100644 |
106 |
--- a/roverlay/overlay/metadata/abstractnodes.py |
107 |
+++ b/roverlay/overlay/metadata/abstractnodes.py |
108 |
@@ -2,6 +2,7 @@ |
109 |
# Copyright 2006-2012 Gentoo Foundation |
110 |
# Distributed under the terms of the GNU General Public License v2 |
111 |
|
112 |
+from roverlay import strutil |
113 |
import re |
114 |
import textwrap |
115 |
|
116 |
@@ -16,7 +17,6 @@ class _MetadataBasicNode ( object ): |
117 |
""" |
118 |
|
119 |
# these chars lead to metadata.bad: invalid token |
120 |
- # TODO/FIXME: look into repoman's / portage's source to get _all_ chars |
121 |
INVALID_CHARS = "&<>" |
122 |
|
123 |
def __init__ ( self, name, flags ): |
124 |
@@ -92,7 +92,6 @@ class _MetadataBasicNode ( object ): |
125 |
Does nothing if self._verify is not implemented, else dies on error. |
126 |
""" |
127 |
if hasattr ( self, '_verify' ) and not self._verify(): |
128 |
- # todo, verify could return ( Status, ErrorMessages ) etc. |
129 |
raise Exception ( "verification failed for a metadata node." ) |
130 |
# --- end of _do_verify (...) --- |
131 |
|
132 |
@@ -197,10 +196,14 @@ class MetadataLeaf ( _MetadataBasicNode ): |
133 |
if not self._text_wrapper is None: |
134 |
self._text_wrapper.subsequent_indent = self.text_indent |
135 |
|
136 |
- def _value_str ( self ): |
137 |
+ def _default_value_str ( self ): |
138 |
"""Returns the value string. Derived classes may override this.""" |
139 |
#if self.value_format == ?: format value ~ |
140 |
- return str ( self.value ) |
141 |
+ return re.sub ( |
142 |
+ "[" + self.__class__.INVALID_CHARS + "]", |
143 |
+ '', |
144 |
+ strutil.ascii_filter ( str ( self.value ) ) |
145 |
+ ) |
146 |
# --- end of _value_str (...) --- |
147 |
|
148 |
def _pretty_value_str ( self ): |
149 |
@@ -208,7 +211,6 @@ class MetadataLeaf ( _MetadataBasicNode ): |
150 |
Not used here, but subclasses can use it by simply writing |
151 |
'_value_str = MetadataLeaf._pretty_value_str' in the class body. |
152 |
""" |
153 |
- # FIXME/TODO: could move this func to util |
154 |
if not self.value: return "" |
155 |
|
156 |
if self._text_wrapper is None: |
157 |
@@ -218,13 +220,8 @@ class MetadataLeaf ( _MetadataBasicNode ): |
158 |
width=self.linewidth if hasattr ( self, 'linewidth' ) else 50 |
159 |
) |
160 |
|
161 |
- val_lines = self._text_wrapper.wrap ( |
162 |
- re.sub ( |
163 |
- "[{}]".format ( self.__class__.INVALID_CHARS ), |
164 |
- '', |
165 |
- self.value |
166 |
- ) |
167 |
- ) |
168 |
+ val_lines = self._text_wrapper.wrap ( self._default_value_str() ) |
169 |
+ |
170 |
if len ( val_lines ) < 1: |
171 |
# why? |
172 |
return "" |
173 |
@@ -242,10 +239,11 @@ class MetadataLeaf ( _MetadataBasicNode ): |
174 |
self._do_verify() |
175 |
if self.print_node_name: |
176 |
return "{indent}<{name}{flags}>{value}</{name}>".format ( |
177 |
- indent=self.indent, |
178 |
- name=self.name, |
179 |
- flags=self._flagstr(), |
180 |
- value=self._value_str(), |
181 |
+ indent = self.indent, |
182 |
+ name = self.name, |
183 |
+ flags = self._flagstr(), |
184 |
+ value = self._value_str() \ |
185 |
+ if hasattr ( self, '_value_str' ) else self._default_value_str() |
186 |
) |
187 |
else: |
188 |
# not very useful, but allows to insert strings as nodes |
189 |
|
190 |
diff --git a/roverlay/overlay/metadata/nodes.py b/roverlay/overlay/metadata/nodes.py |
191 |
index 0002267..5f97181 100644 |
192 |
--- a/roverlay/overlay/metadata/nodes.py |
193 |
+++ b/roverlay/overlay/metadata/nodes.py |
194 |
@@ -2,7 +2,6 @@ |
195 |
# Copyright 2006-2012 Gentoo Foundation |
196 |
# Distributed under the terms of the GNU General Public License v2 |
197 |
|
198 |
-from roverlay import util |
199 |
# import abstract nodes |
200 |
from roverlay.overlay.metadata.abstractnodes import \ |
201 |
MetadataNode, MetadataNodeNamedAccess, MetadataLeaf |
202 |
@@ -71,7 +70,7 @@ class MetadataRoot ( MetadataNodeNamedAccess ): |
203 |
if not self.empty(): |
204 |
fh.write ( MetadataRoot.HEADER ) |
205 |
fh.write ( '\n' ) |
206 |
- fh.write ( util.ascii_filter ( self.to_str() ) ) |
207 |
+ fh.write ( self.to_str() ) |
208 |
fh.write ( '\n' ) |
209 |
return True |
210 |
else: |
211 |
|
212 |
diff --git a/roverlay/overlay/package.py b/roverlay/overlay/package.py |
213 |
index 434b1b1..722be8b 100644 |
214 |
--- a/roverlay/overlay/package.py |
215 |
+++ b/roverlay/overlay/package.py |
216 |
@@ -122,8 +122,6 @@ class PackageDir ( object ): |
217 |
if added: |
218 |
# add a link to this PackageDir into the package info, |
219 |
# !! package_info <-> self (double-linked) |
220 |
- # FIXME: remove physical_only flag from PackageInfo if |
221 |
- # overlay_package_ref can be used for that |
222 |
package_info.overlay_package_ref = self |
223 |
return True |
224 |
else: |
225 |
@@ -267,8 +265,17 @@ class PackageDir ( object ): |
226 |
"Kept {kept}/{total} ebuilds.".format ( kept=kept, total=ecount ) |
227 |
) |
228 |
|
229 |
- # FIXME: Manifest is now invalid and dir could be "empty" (no ebuilds) |
230 |
- # FIXME: force metadata regeneration |
231 |
+ if self._need_metadata: |
232 |
+ self.generate_metadata ( skip_if_existent=False ) |
233 |
+ |
234 |
+ # Manifest is now invalid, |
235 |
+ # need_manifest is set to True in purge_package() |
236 |
+ # |
237 |
+ # metadata will be re-written when calling write() |
238 |
+ # |
239 |
+ # dir could be "empty" (no ebuilds), |
240 |
+ # which is solved when calling fs_cleanup(), |
241 |
+ # implicitly called by write() |
242 |
# --- end of keep_nth_latest (...) --- |
243 |
|
244 |
def list_versions ( self ): |
245 |
@@ -296,6 +303,7 @@ class PackageDir ( object ): |
246 |
p = self._packages [pvr] |
247 |
del self._packages [pvr] |
248 |
self._remove_ebuild_file ( p ) |
249 |
+ self._need_metadata = True |
250 |
return p |
251 |
except Exception as e: |
252 |
self.logger.exception ( e ) |
253 |
@@ -450,7 +458,6 @@ class PackageDir ( object ): |
254 |
self.virtual_cleanup() |
255 |
self.fs_cleanup() |
256 |
|
257 |
- # FIXME / TODO call fs_cleanup |
258 |
# -- lock |
259 |
return success |
260 |
# --- end of write (...) --- |
261 |
@@ -483,10 +490,6 @@ class PackageDir ( object ): |
262 |
fh.write ( str ( ebuild ) ) |
263 |
fh.write ( '\n' ) |
264 |
|
265 |
- # adjust owner/perm? TODO |
266 |
- #if shared_fh is None: |
267 |
- # chmod 0644 or 0444 |
268 |
- # chown 250.250 |
269 |
_success = True |
270 |
except IOError as e: |
271 |
self.logger.exception ( e ) |
272 |
@@ -574,13 +577,6 @@ class PackageDir ( object ): |
273 |
elif ignore_empty: |
274 |
return True |
275 |
else: |
276 |
- # FIXME: debug statements |
277 |
- # FIXME: remove excpetion, maybe delete Manifest in this case,.. |
278 |
- for pvr, p in self._packages.items(): |
279 |
- print ( "{} {} ebuild={} efile={} has={}".format ( |
280 |
- pvr, p, p.has ('ebuild'), p ['ebuild_file'], self.has_ebuilds() |
281 |
- ) ) |
282 |
- |
283 |
raise Exception ( |
284 |
'In {mydir}: No ebuild written so far! ' |
285 |
'I really don\'t know what do to!'.format ( |
286 |
|
287 |
diff --git a/roverlay/overlay/root.py b/roverlay/overlay/root.py |
288 |
index 3efdf66..5cbcef3 100644 |
289 |
--- a/roverlay/overlay/root.py |
290 |
+++ b/roverlay/overlay/root.py |
291 |
@@ -31,7 +31,7 @@ class Overlay ( object ): |
292 |
write_allowed, |
293 |
incremental, |
294 |
skip_manifest, |
295 |
- runtime_incremental=True |
296 |
+ runtime_incremental=False |
297 |
): |
298 |
"""Initializes an overlay. |
299 |
|
300 |
@@ -52,7 +52,7 @@ class Overlay ( object ): |
301 |
!!! The created overlay cannot be used with |
302 |
emerge/portage |
303 |
* runtime_incremental -- see package.py:PackageDir.__init__ (...), |
304 |
- Defaults to ?FIXME? |
305 |
+ Defaults to False (saves memory but costs time) |
306 |
|
307 |
""" |
308 |
self.name = name |
309 |
@@ -73,7 +73,7 @@ class Overlay ( object ): |
310 |
|
311 |
self.skip_manifest = skip_manifest |
312 |
|
313 |
- # fixme or ignore: calculating eclass names twice, |
314 |
+ # calculating eclass names twice, |
315 |
# once here and another time when calling _init_overlay |
316 |
self._header.set_eclasses ( frozenset ( |
317 |
self._get_eclass_import_info ( only_eclass_names=True ) |
318 |
@@ -279,7 +279,6 @@ class Overlay ( object ): |
319 |
def scan ( self, **kw ): |
320 |
def scan_categories(): |
321 |
for x in os.listdir ( self.physical_location ): |
322 |
- # FIXME could use a better check here |
323 |
if '-' in x and self.has_dir ( x ): |
324 |
yield self._get_category ( x ) |
325 |
# --- end of scan_categories (...) --- |
326 |
@@ -322,8 +321,8 @@ class Overlay ( object ): |
327 |
|
328 |
raises: IOError |
329 |
|
330 |
- ! TODO/FIXME/DOC: This is not thread-safe, it's expected to be called |
331 |
- when ebuild creation is done. |
332 |
+ Note: This is not thread-safe, it's expected to be called when |
333 |
+ ebuild creation is done. |
334 |
""" |
335 |
if self._writeable: |
336 |
self._init_overlay ( reimport_eclass=True ) |
337 |
@@ -354,9 +353,15 @@ class Overlay ( object ): |
338 |
returns: None (implicit) |
339 |
""" |
340 |
if self._writeable and not self.skip_manifest: |
341 |
- # FIXME: it would be good to ensure that profiles/categories exist |
342 |
- for cat in self._categories.values(): |
343 |
- cat.write_manifest ( **manifest_kw ) |
344 |
+ # profiles/categories is required for successful Manifest |
345 |
+ # creation |
346 |
+ if os.path.isfile ( self._profiles_dir + os.sep + 'categories' ): |
347 |
+ for cat in self._categories.values(): |
348 |
+ cat.write_manifest ( **manifest_kw ) |
349 |
+ else: |
350 |
+ raise Exception ( |
351 |
+ 'profiles/categories is missing - cannot write Manifest files!' |
352 |
+ ) |
353 |
elif not self.skip_manifest: |
354 |
# FIXME debug print |
355 |
print ( |