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