62258621036e9f3852d590adc4eca7be9370e46e
[infrastructure.git] / scripts / all-builds.py
1 #!/usr/bin/python
2 subversion_id = "$Id$"
3
4 from optparse import OptionParser
5
6 ##############################
7 MAIN="/root/bin/vbuild-nightly.sh"
8 URL='http://svn.planet-lab.org/svn/'
9 MAILTO="-m build@onelab.eu"
10
11 CURRENT_TRUNK='4.3'
12 DEFAULT_BRANCH='4.3'
13
14 MAJOR_HASH = {
15     '4.2' : { 'latest':'rc27',
16               'fcdistros' : ['f8'],
17               'pldistros' : ['planetlab','onelab'],
18               'tags': '-t %(pldistro)s-tags-4.2.mk',
19               },
20     '4.3' : { 'latest': None,
21               'fcdistros' : ['centos5','f10','f8'],
22               'pldistros' : ['planetlab','onelab'],
23 #              'tags': '-t %(pldistro)s-tags.mk',
24               'tags': '',
25               },
26 }
27     
28 ##############################
29 def shortname (name):
30     if name == 'onelab':      return '1l'
31     if name == '1l':          return '1l'
32     if name == 'planetlab':   return 'pl'
33     if name == 'pl':          return 'pl'
34     if name == 'centos5':     return 'c5'
35     if name == 'c5':          return 'c5'
36     if name=='gnuradio':      return name
37     if name[0] == 'f':        return name
38     return 'xx'
39
40 def longname (name):
41     if name == 'onelab':      return 'onelab'
42     if name == '1l':          return 'onelab'
43     if name == 'planetlab':   return 'planetlab'
44     if name == 'pl':          return 'planetlab'
45     if name == 'centos5':     return 'centos5'
46     if name == 'c5':          return 'centos5'
47     if name=='gnuradio':      return name
48     if name[0] == 'f':        return name
49     return 'xx'
50
51 def latest_tag (branch):
52     try:
53         return MAJOR_HASH[branch]['latest']
54     except:
55         print 'WARNING: unknown branch',branch
56         return None
57     
58 def default_fcdistros (branch):
59     try:
60         return MAJOR_HASH[branch]['fcdistros']
61     except:
62         print 'WARNING: unknown branch',branch
63         raise
64
65 def default_pldistros (branch):
66     try:
67         return MAJOR_HASH[branch]['pldistros']
68     except:
69         print 'WARNING: unknown branch',branch
70         raise
71
72 # return (branch,tag)
73 def parse_branch (major):
74     try:
75         [branch,tag]=major.split('-')
76         ## latest tag: use -b 4.2- or -b 4.2-latest
77         if not tag or tag[0]=='l':
78             tag=latest_tag(branch)
79         return (branch,tag)
80     except:
81         try:
82             [branch]=major.split('-')
83             return (branch,None)
84         except:
85             print 'could not parse major',major
86             raise
87
88 def build_build_option (branch,tag):
89     if tag:
90         return ' -s ' + URL + "build/tags/%(branch)s-%(tag)s"%locals()
91     if branch == CURRENT_TRUNK:
92 #        return ' -s ' + URL + "build/trunk"%locals()
93         return ''
94     else:
95         return ' -s ' + URL + "build/branches/%(branch)s"%locals()
96
97 def build_tags_option (branch,locals_dict):
98     try:
99         return MAJOR_HASH[branch]['tags']%locals_dict
100     except:
101         return '---------- could not set up tags option ----------'
102
103 ####################
104 def optparse_list (option, opt, value, parser):
105     try:
106         setattr(parser.values,option.dest,getattr(parser.values,option.dest)+value.split())
107     except:
108         setattr(parser.values,option.dest,value.split())
109
110 def main ():
111     usage="""Usage: %prog build-spec [ .. build-spec]
112   print out a list of nightly build commands to run
113 Examples:
114 %prog 4.3-rc01  -- to build 4.3-rc01
115 %prog 4.3-l     -- or
116 %prog 4.3-      -- to build latest known rc for 4.3
117 %prog 4.3       -- to build off the corresponding branch (or trunk)
118 """
119     parser=OptionParser(usage=usage,version=subversion_id)    
120
121     parser.add_option("-f","--fcdistros",action="callback",callback=optparse_list, dest="fcdistros",
122                       default=[], nargs=1,type="string",
123                       help="""specify target fcdistros -- can be set multiple times, or use quotes""")
124     parser.add_option("-d","--distros",action="callback",callback=optparse_list, dest="pldistros",
125                       default=[], nargs=1,type="string",
126                       help="""specify target pldistros -- can be set multiple times, or use quotes""")
127     parser.add_option("-i","--bits",action="callback",callback=optparse_list, dest="bits",
128                       default=[], nargs=1,type="string",
129                       help="""specify target bits -- can be set multiple times, or use quotes""")
130
131     parser.add_option("-b","--base", action="store", dest="base", default="@DATE@",
132                       help="specify alternate base (default is @DATE@ on trunk)")
133     parser.add_option("-o","--overwrite",action="store_true",dest="overwrite",default=False,
134                       help="pass -o rather than -b (from 4.3)")
135
136     (options, args) = parser.parse_args()
137
138     if not options.bits: options.bits=["32","64"]
139     base_option = '-b'
140     if options.overwrite: base_option='-o'
141
142     if len(args) == 0:
143         parser.print_help()
144         sys.exit(1)        
145
146     for build in args:
147         (branch,tag) = parse_branch (build)
148         build_option=build_build_option(branch,tag)
149
150         print '#################### build',build,
151         if tag: print 'tag',tag
152         else: print 'trunk (or branch)'
153
154         if options.fcdistros:
155             fcdistros=options.fcdistros
156         else:
157             fcdistros=default_fcdistros(branch)
158
159         if options.pldistros:
160             pldistros=options.pldistros
161         else:
162             pldistros=default_pldistros(branch)
163
164         base=options.base
165
166         for pldistro in pldistros:
167             tags_option = build_tags_option(branch,locals())
168             for fcdistro in fcdistros:
169                 for bit in options.bits:
170                     p="linux"+bit
171                     f=shortname(fcdistro)
172                     d=shortname(pldistro)
173
174                     # trunk-like builds
175                     if not tag:
176                         if branch == CURRENT_TRUNK:
177                             buildname="%(base)s--%(d)s-%(f)s-%(bit)s"%locals()
178                         else:
179                             buildname="%(base)s--%(branch)s--%(d)s-%(f)s-%(bit)s"%locals()
180                     # tagged builds
181                     else:
182                         buildname="%(pldistro)s--%(branch)s-%(tag)s-%(f)s-%(bit)s"%locals()
183
184                     print MAIN,MAILTO,build_option,tags_option,'-d',pldistro,'-f',fcdistro,'-p',p,base_option,buildname
185                     
186 main()