Gentoo Archives: gentoo-commits

From: "André Erdmann" <dywi@×××××××.de>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/overlay/metadata/, roverlay/overlay/
Date: Thu, 02 Aug 2012 15:15:16
Message-Id: 1343920256.041f770675b288ef3f6a04670b9c4e399e4e26f0.dywi@gentoo
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 (