This patch adds in support for automatically detecting and decompressing
[catalyst.git] / modules / grp_target.py
1 """
2 Gentoo Reference Platform (GRP) target
3 """
4 # NOTE: That^^ docstring has influence catalyst-spec(5) man page generation.
5
6 import os,types,glob
7 from catalyst_support import *
8 from generic_stage_target import *
9
10 class grp_target(generic_stage_target):
11         """
12         The builder class for GRP (Gentoo Reference Platform) builds.
13         """
14         def __init__(self,spec,addlargs):
15                 self.required_values=["version_stamp","target","subarch",\
16                         "rel_type","profile","snapshot","source_subpath"]
17                 
18                 self.valid_values=self.required_values[:]
19                 self.valid_values.extend(["grp/use"])
20                 if not addlargs.has_key("grp"):
21                         raise CatalystError,"Required value \"grp\" not specified in spec."
22                 
23                 self.required_values.extend(["grp"])
24                 if type(addlargs["grp"])==types.StringType:
25                         addlargs["grp"]=[addlargs["grp"]]
26                 
27                 if addlargs.has_key("grp/use"):
28                     if type(addlargs["grp/use"])==types.StringType:
29                             addlargs["grp/use"]=[addlargs["grp/use"]]
30                         
31                 for x in addlargs["grp"]:
32                         self.required_values.append("grp/"+x+"/packages")
33                         self.required_values.append("grp/"+x+"/type")
34                         
35                 generic_stage_target.__init__(self,spec,addlargs)
36
37         def set_target_path(self):
38                 self.settings["target_path"]=normpath(self.settings["storedir"]+"/builds/"+self.settings["target_subpath"]+"/")
39                 if self.settings.has_key("AUTORESUME") \
40                         and os.path.exists(self.settings["autoresume_path"]+"setup_target_path"):
41                         print "Resume point detected, skipping target path setup operation..."
42                 else:
43                         # first clean up any existing target stuff
44                         #if os.path.isdir(self.settings["target_path"]):
45                                 #cmd("rm -rf "+self.settings["target_path"],
46                                 #"Could not remove existing directory: "+self.settings["target_path"],env=self.env)
47                         if not os.path.exists(self.settings["target_path"]):
48                                 os.makedirs(self.settings["target_path"])
49
50                         touch(self.settings["autoresume_path"]+"setup_target_path")
51
52         def run_local(self):
53                 for pkgset in self.settings["grp"]:
54                         # example call: "grp.sh run pkgset cd1 xmms vim sys-apps/gleep"
55                         mypackages=list_bashify(self.settings["grp/"+pkgset+"/packages"])
56                         try:
57                                 cmd("/bin/bash "+self.settings["controller_file"]+" run "+self.settings["grp/"+pkgset+"/type"]\
58                                         +" "+pkgset+" "+mypackages,env=self.env)
59                         
60                         except CatalystError:
61                                 self.unbind()
62                                 raise CatalystError,"GRP build aborting due to error."
63
64         def set_use(self):
65             generic_stage_target.set_use(self)
66             if self.settings.has_key("use"):
67                 self.settings["use"].append("bindist")
68             else:
69                 self.settings["use"]=["bindist"]
70
71         def set_mounts(self):
72             self.mounts.append("/tmp/grp")
73             self.mountmap["/tmp/grp"]=self.settings["target_path"]
74         
75         def generate_digests(self):
76                 for pkgset in self.settings["grp"]:
77                         if self.settings["grp/"+pkgset+"/type"] == "pkgset":
78                                 destdir=normpath(self.settings["target_path"]+"/"+pkgset+"/All")
79                                 print "Digesting files in the pkgset....."                      
80                                 digests=glob.glob(destdir+'/*.DIGESTS')
81                                 for i in digests:
82                                         if os.path.exists(i):
83                                                 os.remove(i)
84
85                                 files=os.listdir(destdir)
86                                 #ignore files starting with '.' using list comprehension
87                                 files=[filename for filename in files if filename[0] != '.']
88                                 for i in files:
89                                         if os.path.isfile(normpath(destdir+"/"+i)):
90                                                 self.gen_contents_file(normpath(destdir+"/"+i))
91                                                 self.gen_digest_file(normpath(destdir+"/"+i))
92                         else:
93                                 destdir=normpath(self.settings["target_path"]+"/"+pkgset)
94                                 print "Digesting files in the srcset....."                      
95                         
96                                 digests=glob.glob(destdir+'/*.DIGESTS')
97                                 for i in digests:
98                                         if os.path.exists(i):
99                                                 os.remove(i)
100
101                                 files=os.listdir(destdir)
102                                 #ignore files starting with '.' using list comprehension
103                                 files=[filename for filename in files if filename[0] != '.']
104                                 for i in files:
105                                         if os.path.isfile(normpath(destdir+"/"+i)):
106                                                 #self.gen_contents_file(normpath(destdir+"/"+i))
107                                                 self.gen_digest_file(normpath(destdir+"/"+i))
108
109         def set_action_sequence(self):
110             self.settings["action_sequence"]=["unpack","unpack_snapshot",\
111                                             "config_profile_link","setup_confdir","portage_overlay","bind","chroot_setup",\
112                                             "setup_environment","run_local","unbind",\
113                                             "generate_digests","clear_autoresume"]
114
115 def register(foo):
116         foo.update({"grp":grp_target})
117         return foo