6941522224bc65e4e5c8b5824280320090e8a318
[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 "grp" not in addlargs:
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 "grp/use" in addlargs:
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 "AUTORESUME" in self.settings \
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 "BINDIST" in self.settings:
67                         if "use" in self.settings:
68                                 self.settings["use"].append("bindist")
69                         else:
70                                 self.settings["use"]=["bindist"]
71
72         def set_mounts(self):
73             self.mounts.append("/tmp/grp")
74             self.mountmap["/tmp/grp"]=self.settings["target_path"]
75
76         def generate_digests(self):
77                 for pkgset in self.settings["grp"]:
78                         if self.settings["grp/"+pkgset+"/type"] == "pkgset":
79                                 destdir=normpath(self.settings["target_path"]+"/"+pkgset+"/All")
80                                 print "Digesting files in the pkgset....."
81                                 digests=glob.glob(destdir+'/*.DIGESTS')
82                                 for i in digests:
83                                         if os.path.exists(i):
84                                                 os.remove(i)
85
86                                 files=os.listdir(destdir)
87                                 #ignore files starting with '.' using list comprehension
88                                 files=[filename for filename in files if filename[0] != '.']
89                                 for i in files:
90                                         if os.path.isfile(normpath(destdir+"/"+i)):
91                                                 self.gen_contents_file(normpath(destdir+"/"+i))
92                                                 self.gen_digest_file(normpath(destdir+"/"+i))
93                         else:
94                                 destdir=normpath(self.settings["target_path"]+"/"+pkgset)
95                                 print "Digesting files in the srcset....."
96
97                                 digests=glob.glob(destdir+'/*.DIGESTS')
98                                 for i in digests:
99                                         if os.path.exists(i):
100                                                 os.remove(i)
101
102                                 files=os.listdir(destdir)
103                                 #ignore files starting with '.' using list comprehension
104                                 files=[filename for filename in files if filename[0] != '.']
105                                 for i in files:
106                                         if os.path.isfile(normpath(destdir+"/"+i)):
107                                                 #self.gen_contents_file(normpath(destdir+"/"+i))
108                                                 self.gen_digest_file(normpath(destdir+"/"+i))
109
110         def set_action_sequence(self):
111             self.settings["action_sequence"]=["unpack","unpack_snapshot",\
112                                         "config_profile_link","setup_confdir","portage_overlay","bind","chroot_setup",\
113                                         "setup_environment","run_local","unbind",\
114                                         "generate_digests","clear_autoresume"]
115
116 def register(foo):
117         foo.update({"grp":grp_target})
118         return foo