Cleaning up the entry point into nightly builds. With this change, a single spec...
[build.git] / run_nightlies.py
1 #!/usr/bin/python
2 # Script to read build configs in /etc/build_conf.py, turn the configuration into command lines and execute it
3
4 import pdb
5
6 # Assemble a list of builds from a single build spec
7 def interpret_build(build, param_names, current_concrete_build={}, concrete_build_list=[]):
8         if (param_names==[]):
9                 concrete_build_list.extend([current_concrete_build])
10         else:
11                 (cur_param_name,remaining_param_names)=(param_names[0],param_names[1:])
12                 cur_param = build[cur_param_name]
13
14                 # If it's a list, produce a concrete build for each element of the list
15                 if (type(cur_param)==type([])):
16                         for value in cur_param:
17                                 new_concrete_build = current_concrete_build.copy()
18                                 new_concrete_build[cur_param_name] = value
19                                 concrete_build_list = interpret_build(build, remaining_param_names, new_concrete_build, concrete_build_list)
20
21                 # If not, just tack on the value and move on
22                 else:
23                         current_concrete_build[cur_param_name] = cur_param
24                         concrete_build_list = interpret_build(build, remaining_param_names, current_concrete_build,concrete_build_list)
25
26         return concrete_build_list
27                         
28
29 # Fill in parameters that are not defined in __default_build__
30 def complete_build_spec_with_defaults (build, default_build):
31         for default_param in default_build.keys():
32                 if (not build.has_key(default_param)):
33                         build[default_param]=default_build[default_param]
34         return build
35         
36
37 # Turn build parameter dicts into commandlines and execute them
38 def process_builds (builds, build_names, default_build):
39         pdb.set_trace()
40         for build_name in build_names:
41                 build = complete_build_spec_with_defaults (builds[build_name], default_build)
42                 concrete_builds = interpret_build (build, build.keys())
43                 for concrete_build in concrete_builds:
44                         build_commandline = concrete_build_to_commandline(concrete_build)
45                         print build_commandline
46         
47 def main():
48         config_file = '/etc/build_conf.py'
49         builds = {}
50         try:
51                 execfile(config_file, builds)
52         except IOError, e:
53                 raise IOError, "Could not open %s\n" % config_file
54
55
56         config_file_attributes = builds.keys()
57         build_names = [e for e in config_file_attributes if not e.startswith('__')]     
58
59         try:
60                 default_build = builds['__default_build__']
61         except KeyError:
62                 raise KeyError, "Please define the default build config in %s\n" % config_file
63         
64         process_builds(builds, build_names, default_build)
65
66
67 if __name__ == "__main__":
68         main()
69