1 |
commit: d4bc8e3c5ba7bca5656ea597e3ad013a4e61c8b5 |
2 |
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Jan 20 08:10:03 2013 +0000 |
4 |
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
5 |
CommitDate: Thu Jan 1 05:58:05 2015 +0000 |
6 |
URL: http://sources.gentoo.org/gitweb/?p=proj/catalyst.git;a=commit;h=d4bc8e3c |
7 |
|
8 |
Begin splitting up generic_stage_target into smaller code blocks. |
9 |
|
10 |
This so snapshot_target does not need to import it since most of it was |
11 |
not used or initialized properly. |
12 |
|
13 |
--- |
14 |
catalyst/defaults.py | 2 +- |
15 |
catalyst/targets/clearbase.py | 115 ++++++++++++++ |
16 |
catalyst/targets/genbase.py | 58 +++++++ |
17 |
catalyst/targets/generic_stage_target.py | 167 +++------------------ |
18 |
catalyst/targets/snapshot_target.py | 16 +- |
19 |
.../targets/{generic_target.py => targetbase.py} | 6 +- |
20 |
6 files changed, 208 insertions(+), 156 deletions(-) |
21 |
|
22 |
diff --git a/catalyst/defaults.py b/catalyst/defaults.py |
23 |
index b36eff7..f6b2163 100644 |
24 |
--- a/catalyst/defaults.py |
25 |
+++ b/catalyst/defaults.py |
26 |
@@ -1,7 +1,7 @@ |
27 |
|
28 |
|
29 |
# these should never be touched |
30 |
-required_build_targets = ["generic_target", "generic_stage_target"] |
31 |
+required_build_targets = ["targetbase", "generic_stage_target"] |
32 |
|
33 |
# new build types should be added here |
34 |
valid_build_targets = ["stage1_target", "stage2_target", "stage3_target", |
35 |
|
36 |
diff --git a/catalyst/targets/clearbase.py b/catalyst/targets/clearbase.py |
37 |
new file mode 100644 |
38 |
index 0000000..8519acc |
39 |
--- /dev/null |
40 |
+++ b/catalyst/targets/clearbase.py |
41 |
@@ -0,0 +1,115 @@ |
42 |
+ |
43 |
+import os |
44 |
+import shutil |
45 |
+from stat import ST_UID, ST_GID, ST_MODE |
46 |
+ |
47 |
+ |
48 |
+from catalyst.support import cmd, countdown |
49 |
+ |
50 |
+ |
51 |
+class ClearBase(object): |
52 |
+ """ |
53 |
+ This class does all of clearing after task completion |
54 |
+ """ |
55 |
+ def __init__(self, myspec): |
56 |
+ self.settings = myspec |
57 |
+ |
58 |
+ |
59 |
+ |
60 |
+ def clear_autoresume(self): |
61 |
+ """ Clean resume points since they are no longer needed """ |
62 |
+ if "autoresume" in self.settings["options"]: |
63 |
+ print "Removing AutoResume Points: ..." |
64 |
+ myemp=self.settings["autoresume_path"] |
65 |
+ if os.path.isdir(myemp): |
66 |
+ if "autoresume" in self.settings["options"]: |
67 |
+ print "Emptying directory",myemp |
68 |
+ """ |
69 |
+ stat the dir, delete the dir, recreate the dir and set |
70 |
+ the proper perms and ownership |
71 |
+ """ |
72 |
+ mystat=os.stat(myemp) |
73 |
+ if os.uname()[0] == "FreeBSD": |
74 |
+ cmd("chflags -R noschg "+myemp,\ |
75 |
+ "Could not remove immutable flag for file "\ |
76 |
+ +myemp) |
77 |
+ #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env-self.env) |
78 |
+ shutil.rmtree(myemp) |
79 |
+ os.makedirs(myemp,0755) |
80 |
+ os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
81 |
+ os.chmod(myemp,mystat[ST_MODE]) |
82 |
+ |
83 |
+ |
84 |
+ def clear_chroot(self): |
85 |
+ myemp=self.settings["chroot_path"] |
86 |
+ if os.path.isdir(myemp): |
87 |
+ print "Emptying directory",myemp |
88 |
+ """ |
89 |
+ stat the dir, delete the dir, recreate the dir and set |
90 |
+ the proper perms and ownership |
91 |
+ """ |
92 |
+ mystat=os.stat(myemp) |
93 |
+ #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env=self.env) |
94 |
+ """ There's no easy way to change flags recursively in python """ |
95 |
+ if os.uname()[0] == "FreeBSD": |
96 |
+ os.system("chflags -R noschg "+myemp) |
97 |
+ shutil.rmtree(myemp) |
98 |
+ os.makedirs(myemp,0755) |
99 |
+ os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
100 |
+ os.chmod(myemp,mystat[ST_MODE]) |
101 |
+ |
102 |
+ |
103 |
+ def clear_packages(self): |
104 |
+ if "pkgcache" in self.settings["options"]: |
105 |
+ print "purging the pkgcache ..." |
106 |
+ |
107 |
+ myemp=self.settings["pkgcache_path"] |
108 |
+ if os.path.isdir(myemp): |
109 |
+ print "Emptying directory",myemp |
110 |
+ """ |
111 |
+ stat the dir, delete the dir, recreate the dir and set |
112 |
+ the proper perms and ownership |
113 |
+ """ |
114 |
+ mystat=os.stat(myemp) |
115 |
+ #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env=self.env) |
116 |
+ shutil.rmtree(myemp) |
117 |
+ os.makedirs(myemp,0755) |
118 |
+ os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
119 |
+ os.chmod(myemp,mystat[ST_MODE]) |
120 |
+ |
121 |
+ |
122 |
+ def clear_kerncache(self): |
123 |
+ if "kerncache" in self.settings["options"]: |
124 |
+ print "purging the kerncache ..." |
125 |
+ |
126 |
+ myemp=self.settings["kerncache_path"] |
127 |
+ if os.path.isdir(myemp): |
128 |
+ print "Emptying directory",myemp |
129 |
+ """ |
130 |
+ stat the dir, delete the dir, recreate the dir and set |
131 |
+ the proper perms and ownership |
132 |
+ """ |
133 |
+ mystat=os.stat(myemp) |
134 |
+ #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env=self.env) |
135 |
+ shutil.rmtree(myemp) |
136 |
+ os.makedirs(myemp,0755) |
137 |
+ os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
138 |
+ os.chmod(myemp,mystat[ST_MODE]) |
139 |
+ |
140 |
+ |
141 |
+ def purge(self): |
142 |
+ countdown(10,"Purging Caches ...") |
143 |
+ if any(k in self.settings["options"] for k in ("purge","purgeonly","purgetmponly")): |
144 |
+ print "clearing autoresume ..." |
145 |
+ self.clear_autoresume() |
146 |
+ |
147 |
+ print "clearing chroot ..." |
148 |
+ self.clear_chroot() |
149 |
+ |
150 |
+ if "PURGETMPONLY" not in self.settings: |
151 |
+ print "clearing package cache ..." |
152 |
+ self.clear_packages() |
153 |
+ |
154 |
+ print "clearing kerncache ..." |
155 |
+ self.clear_kerncache() |
156 |
+ |
157 |
|
158 |
diff --git a/catalyst/targets/genbase.py b/catalyst/targets/genbase.py |
159 |
new file mode 100644 |
160 |
index 0000000..e818781 |
161 |
--- /dev/null |
162 |
+++ b/catalyst/targets/genbase.py |
163 |
@@ -0,0 +1,58 @@ |
164 |
+ |
165 |
+ |
166 |
+import os |
167 |
+ |
168 |
+ |
169 |
+class GenBase(object): |
170 |
+ """ |
171 |
+ This class does generation of the contents and digests files. |
172 |
+ """ |
173 |
+ def __init__(self,myspec): |
174 |
+ self.settings = myspec |
175 |
+ |
176 |
+ |
177 |
+ def gen_contents_file(self,file): |
178 |
+ if os.path.exists(file+".CONTENTS"): |
179 |
+ os.remove(file+".CONTENTS") |
180 |
+ if "contents" in self.settings: |
181 |
+ contents_map = self.settings["contents_map"] |
182 |
+ if os.path.exists(file): |
183 |
+ myf=open(file+".CONTENTS","w") |
184 |
+ keys={} |
185 |
+ for i in self.settings["contents"].split(): |
186 |
+ keys[i]=1 |
187 |
+ array=keys.keys() |
188 |
+ array.sort() |
189 |
+ for j in array: |
190 |
+ contents = contents_map.generate_contents(file, j, |
191 |
+ verbose="VERBOSE" in self.settings) |
192 |
+ if contents: |
193 |
+ myf.write(contents) |
194 |
+ myf.close() |
195 |
+ |
196 |
+ def gen_digest_file(self,file): |
197 |
+ if os.path.exists(file+".DIGESTS"): |
198 |
+ os.remove(file+".DIGESTS") |
199 |
+ if "digests" in self.settings: |
200 |
+ hash_map = self.settings["hash_map"] |
201 |
+ if os.path.exists(file): |
202 |
+ myf=open(file+".DIGESTS","w") |
203 |
+ keys={} |
204 |
+ for i in self.settings["digests"].split(): |
205 |
+ keys[i]=1 |
206 |
+ array=keys.keys() |
207 |
+ array.sort() |
208 |
+ for f in [file, file+'.CONTENTS']: |
209 |
+ if os.path.exists(f): |
210 |
+ if "all" in array: |
211 |
+ for k in list(hash_map.hash_map): |
212 |
+ hash = hash_map.generate_hash(f,hash_=k, |
213 |
+ verbose = "VERBOSE" in self.settings) |
214 |
+ myf.write(hash) |
215 |
+ else: |
216 |
+ for j in array: |
217 |
+ hash = hash_map.generate_hash(f,hash_=j, |
218 |
+ verbose = "VERBOSE" in self.settings) |
219 |
+ myf.write(hash) |
220 |
+ myf.close() |
221 |
+ |
222 |
|
223 |
diff --git a/catalyst/targets/generic_stage_target.py b/catalyst/targets/generic_stage_target.py |
224 |
index 0b506e2..c6b8dcc 100644 |
225 |
--- a/catalyst/targets/generic_stage_target.py |
226 |
+++ b/catalyst/targets/generic_stage_target.py |
227 |
@@ -1,17 +1,26 @@ |
228 |
-import os,string,imp,types,shutil |
229 |
-from catalyst.support import * |
230 |
-from generic_target import * |
231 |
-from stat import * |
232 |
-from catalyst.lock import LockDir |
233 |
|
234 |
-from catalyst.defaults import (SOURCE_MOUNT_DEFAULTS, TARGET_MOUNT_DEFAULTS, |
235 |
- PORT_LOGDIR_CLEAN) |
236 |
+import os |
237 |
+import string |
238 |
+import imp |
239 |
+import types |
240 |
+import shutil |
241 |
+import sys |
242 |
+from stat import ST_UID, ST_GID, ST_MODE |
243 |
|
244 |
# for convienience |
245 |
pjoin = os.path.join |
246 |
|
247 |
+from catalyst.defaults import (SOURCE_MOUNT_DEFAULTS, TARGET_MOUNT_DEFAULTS, |
248 |
+ PORT_LOGDIR_CLEAN) |
249 |
+from catalyst.support import (CatalystError, msg, file_locate, normpath, |
250 |
+ touch, cmd, warn, list_bashify, read_makeconf, read_from_clst, ismount) |
251 |
+from catalyst.targets.targetbase import TargetBase |
252 |
+from catalyst.targets.clearbase import ClearBase |
253 |
+from catalyst.targets.genbase import GenBase |
254 |
+from catalyst.lock import LockDir |
255 |
+ |
256 |
|
257 |
-class generic_stage_target(generic_target): |
258 |
+class generic_stage_target(TargetBase, ClearBase, GenBase): |
259 |
""" |
260 |
This class does all of the chroot setup, copying of files, etc. It is |
261 |
the driver class for pretty much everything that Catalyst does. |
262 |
@@ -26,7 +35,9 @@ class generic_stage_target(generic_target): |
263 |
"distcc_hosts","makeopts","pkgcache_path","kerncache_path"]) |
264 |
|
265 |
self.set_valid_build_kernel_vars(addlargs) |
266 |
- generic_target.__init__(self,myspec,addlargs) |
267 |
+ TargetBase.__init__(self, myspec, addlargs) |
268 |
+ GenBase.__init__(self, myspec) |
269 |
+ ClearBase.__init__(self, myspec) |
270 |
|
271 |
""" |
272 |
The semantics of subarchmap and machinemap changed a bit in 2.0.3 to |
273 |
@@ -1616,142 +1627,4 @@ class generic_stage_target(generic_target): |
274 |
self.unbind() |
275 |
raise CatalystError,"build aborting due to livecd_update error." |
276 |
|
277 |
- def clear_chroot(self): |
278 |
- myemp=self.settings["chroot_path"] |
279 |
- if os.path.isdir(myemp): |
280 |
- print "Emptying directory",myemp |
281 |
- """ |
282 |
- stat the dir, delete the dir, recreate the dir and set |
283 |
- the proper perms and ownership |
284 |
- """ |
285 |
- mystat=os.stat(myemp) |
286 |
- #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env=self.env) |
287 |
- """ There's no easy way to change flags recursively in python """ |
288 |
- if os.uname()[0] == "FreeBSD": |
289 |
- os.system("chflags -R noschg "+myemp) |
290 |
- shutil.rmtree(myemp) |
291 |
- os.makedirs(myemp,0755) |
292 |
- os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
293 |
- os.chmod(myemp,mystat[ST_MODE]) |
294 |
- |
295 |
- def clear_packages(self): |
296 |
- if "pkgcache" in self.settings["options"]: |
297 |
- print "purging the pkgcache ..." |
298 |
- |
299 |
- myemp=self.settings["pkgcache_path"] |
300 |
- if os.path.isdir(myemp): |
301 |
- print "Emptying directory",myemp |
302 |
- """ |
303 |
- stat the dir, delete the dir, recreate the dir and set |
304 |
- the proper perms and ownership |
305 |
- """ |
306 |
- mystat=os.stat(myemp) |
307 |
- #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env=self.env) |
308 |
- shutil.rmtree(myemp) |
309 |
- os.makedirs(myemp,0755) |
310 |
- os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
311 |
- os.chmod(myemp,mystat[ST_MODE]) |
312 |
- |
313 |
- def clear_kerncache(self): |
314 |
- if "kerncache" in self.settings["options"]: |
315 |
- print "purging the kerncache ..." |
316 |
- |
317 |
- myemp=self.settings["kerncache_path"] |
318 |
- if os.path.isdir(myemp): |
319 |
- print "Emptying directory",myemp |
320 |
- """ |
321 |
- stat the dir, delete the dir, recreate the dir and set |
322 |
- the proper perms and ownership |
323 |
- """ |
324 |
- mystat=os.stat(myemp) |
325 |
- #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env=self.env) |
326 |
- shutil.rmtree(myemp) |
327 |
- os.makedirs(myemp,0755) |
328 |
- os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
329 |
- os.chmod(myemp,mystat[ST_MODE]) |
330 |
- |
331 |
- def clear_autoresume(self): |
332 |
- """ Clean resume points since they are no longer needed """ |
333 |
- if "autoresume" in self.settings["options"]: |
334 |
- print "Removing AutoResume Points: ..." |
335 |
- myemp=self.settings["autoresume_path"] |
336 |
- if os.path.isdir(myemp): |
337 |
- if "autoresume" in self.settings["options"]: |
338 |
- print "Emptying directory",myemp |
339 |
- """ |
340 |
- stat the dir, delete the dir, recreate the dir and set |
341 |
- the proper perms and ownership |
342 |
- """ |
343 |
- mystat=os.stat(myemp) |
344 |
- if os.uname()[0] == "FreeBSD": |
345 |
- cmd("chflags -R noschg "+myemp,\ |
346 |
- "Could not remove immutable flag for file "\ |
347 |
- +myemp) |
348 |
- #cmd("rm -rf "+myemp, "Could not remove existing file: "+myemp,env-self.env) |
349 |
- shutil.rmtree(myemp) |
350 |
- os.makedirs(myemp,0755) |
351 |
- os.chown(myemp,mystat[ST_UID],mystat[ST_GID]) |
352 |
- os.chmod(myemp,mystat[ST_MODE]) |
353 |
- |
354 |
- def gen_contents_file(self,file): |
355 |
- if os.path.exists(file+".CONTENTS"): |
356 |
- os.remove(file+".CONTENTS") |
357 |
- if "contents" in self.settings: |
358 |
- contents_map = self.settings["contents_map"] |
359 |
- if os.path.exists(file): |
360 |
- myf=open(file+".CONTENTS","w") |
361 |
- keys={} |
362 |
- for i in self.settings["contents"].split(): |
363 |
- keys[i]=1 |
364 |
- array=keys.keys() |
365 |
- array.sort() |
366 |
- for j in array: |
367 |
- contents = contents_map.generate_contents(file, j, |
368 |
- verbose="VERBOSE" in self.settings) |
369 |
- if contents: |
370 |
- myf.write(contents) |
371 |
- myf.close() |
372 |
- |
373 |
- def gen_digest_file(self,file): |
374 |
- if os.path.exists(file+".DIGESTS"): |
375 |
- os.remove(file+".DIGESTS") |
376 |
- if "digests" in self.settings: |
377 |
- hash_map = self.settings["hash_map"] |
378 |
- if os.path.exists(file): |
379 |
- myf=open(file+".DIGESTS","w") |
380 |
- keys={} |
381 |
- for i in self.settings["digests"].split(): |
382 |
- keys[i]=1 |
383 |
- array=keys.keys() |
384 |
- array.sort() |
385 |
- for f in [file, file+'.CONTENTS']: |
386 |
- if os.path.exists(f): |
387 |
- if "all" in array: |
388 |
- for k in list(hash_map.hash_map): |
389 |
- hash = hash_map.generate_hash(f, hash_ = k, |
390 |
- verbose = "VERBOSE" in self.settings) |
391 |
- myf.write(hash) |
392 |
- else: |
393 |
- for j in array: |
394 |
- hash = hash_map.generate_hash(f, hash_ = j, |
395 |
- verbose = "VERBOSE" in self.settings) |
396 |
- myf.write(hash) |
397 |
- myf.close() |
398 |
- |
399 |
- def purge(self): |
400 |
- countdown(10,"Purging Caches ...") |
401 |
- if any(k in self.settings["options"] for k in ("purge","purgeonly","purgetmponly")): |
402 |
- print "clearing autoresume ..." |
403 |
- self.clear_autoresume() |
404 |
- |
405 |
- print "clearing chroot ..." |
406 |
- self.clear_chroot() |
407 |
- |
408 |
- if "PURGETMPONLY" not in self.settings: |
409 |
- print "clearing package cache ..." |
410 |
- self.clear_packages() |
411 |
- |
412 |
- print "clearing kerncache ..." |
413 |
- self.clear_kerncache() |
414 |
- |
415 |
# vim: ts=4 sw=4 sta et sts=4 ai |
416 |
|
417 |
diff --git a/catalyst/targets/snapshot_target.py b/catalyst/targets/snapshot_target.py |
418 |
index 50133ec..3289bbd 100644 |
419 |
--- a/catalyst/targets/snapshot_target.py |
420 |
+++ b/catalyst/targets/snapshot_target.py |
421 |
@@ -3,10 +3,15 @@ Snapshot target |
422 |
""" |
423 |
|
424 |
import os |
425 |
-from catalyst.support import * |
426 |
-from generic_stage_target import * |
427 |
+import shutil |
428 |
+from stat import ST_UID, ST_GID, ST_MODE |
429 |
|
430 |
-class snapshot_target(generic_stage_target): |
431 |
+ |
432 |
+from catalyst.support import normpath, cmd |
433 |
+from catalyst.targets.targetbase import TargetBase |
434 |
+from catalyst.targets.genbase import GenBase |
435 |
+ |
436 |
+class snapshot_target(TargetBase, GenBase): |
437 |
""" |
438 |
Builder class for snapshots. |
439 |
""" |
440 |
@@ -14,8 +19,9 @@ class snapshot_target(generic_stage_target): |
441 |
self.required_values=["version_stamp","target"] |
442 |
self.valid_values=["version_stamp","target"] |
443 |
|
444 |
- generic_target.__init__(self,myspec,addlargs) |
445 |
- self.settings=myspec |
446 |
+ TargetBase.__init__(self, myspec, addlargs) |
447 |
+ GenBase.__init__(self,myspec) |
448 |
+ #self.settings=myspec |
449 |
self.settings["target_subpath"]="portage" |
450 |
st=self.settings["storedir"] |
451 |
self.settings["snapshot_path"] = normpath(st + "/snapshots/" |
452 |
|
453 |
diff --git a/catalyst/targets/generic_target.py b/catalyst/targets/targetbase.py |
454 |
similarity index 64% |
455 |
rename from catalyst/targets/generic_target.py |
456 |
rename to catalyst/targets/targetbase.py |
457 |
index 382f1c7..e0c03df 100644 |
458 |
--- a/catalyst/targets/generic_target.py |
459 |
+++ b/catalyst/targets/targetbase.py |
460 |
@@ -2,11 +2,11 @@ import os |
461 |
|
462 |
from catalyst.support import * |
463 |
|
464 |
-class generic_target: |
465 |
+class TargetBase(object): |
466 |
""" |
467 |
- The toplevel class for generic_stage_target. This is about as generic as we get. |
468 |
+ The toplevel class for all targets. This is about as generic as we get. |
469 |
""" |
470 |
- def __init__(self,myspec,addlargs): |
471 |
+ def __init__(self, myspec, addlargs): |
472 |
addl_arg_parse(myspec,addlargs,self.required_values,self.valid_values) |
473 |
self.settings=myspec |
474 |
self.env = { |