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