root/scripts/gdalbb.py

Revision 67, 4.4 kB (checked in by mateu..@loskot.net, 2 years ago)

Added scripts module. Added gdalbb.py script.

Line 
1 #! /usr/bin/env python
2 """Request building GDAL on the remote Buildbot instance.
3
4 Usage: gdalbb.py [option]
5
6 Options:
7     -h           Print this message and exit.
8     -l           List builders available to run
9     -f           Run all 'full' builders in a batch
10     -q           Run all 'quick' builders in a batch
11     -b <builder> Run selected builder
12
13 Mateusz Loskot <mateusz@loskot.net>
14 """
15 ### BEGIN CONFIGURATION BLOCK ###
16 BBURL = 'http://buildbot.osgeo.org:8500/'
17 BBUSER = 'mloskot'
18 BBNOTE = 'Routine build'
19 #### END CONFIGURATION BLOCK ####
20 import sys
21 import getopt
22 import urllib
23 import urllib2
24 import xml.parsers.expat
25
26 def find(f, seq):
27     """Return first item in sequence where f(item) == True."""
28     for item in seq:
29         if f(item):
30             return item
31
32 class BuildersFinder:
33
34     pxml = None
35     found = False
36     quick = []
37     full = []
38     other = []
39
40     def __init__(self):
41         self.pxml = xml.parsers.expat.ParserCreate()
42         self.pxml.StartElementHandler = self.handleStartElement
43         self.pxml.EndElementHandler = self.handleEndElement
44         self.pxml.CharacterDataHandler = self.handleCharData
45         self.found = False
46
47     def handleStartElement(self, name, attrs):
48         if name == 'td':
49             a = find(lambda k: k == 'class', attrs.keys())
50             if a is not None:
51                 if attrs[a] == 'Builder':
52                     self.found = True
53
54         if self.found is True and name == 'a':
55             bldr = attrs['href']
56             type = bldr[-4:]
57             if type == 'uick':
58                 self.quick.append(bldr)
59             elif type == 'full':
60                 self.full.append(bldr)
61             else:
62                 self.other.append(bldr)
63             self.found = False;
64    
65     def handleEndElement(self, name):
66         pass
67
68     def handleCharData(self, data):
69         pass
70
71     def collect(self, html):
72         assert(self.pxml is not None)
73         self.pxml.Parse(html);
74
75 class Usage(Exception):
76     def __init__(self, msg):
77         self.msg = msg
78
79 def usage(code):
80     print >> sys.stderr, __doc__
81     return code
82
83 def list(builders, msg):
84     print msg,':'
85     i = 0
86     for b in builders:
87         i = i + 1
88         print '%d. %s' % (i, b)
89
90 def build(builders, data, msg):
91     print msg,':'
92     tmp = urllib.urlencode(data)
93     url = BBURL + '%s/force'
94     i  = 0
95     for b in builders:
96         i = i + 1
97         addr = url % b
98         print " %d. %s" % (i, b)
99         request = urllib2.Request(addr, tmp)
100         response = urllib2.urlopen(request)
101
102 def main(argv):
103
104     url = BBURL
105     values = { 'username' : BBUSER, 'comments' : BBNOTE }
106
107     try:
108         try:
109             opts, args = getopt.getopt(argv, 'hlfqb:', [])
110             if len(opts) == 0:
111                 sys.exit(usage(0))
112         except getopt.GetoptError, msg:
113             raise Usage(msg)
114
115         for opt, arg in opts:
116             if opt == '-h':
117                 usage(0)
118                 break
119             else:
120                 print "Connecting to GDAL Buildbot instance: %s" % BBURL
121                 response = urllib2.urlopen(url)
122                 html = response.read()
123                 finder = BuildersFinder()
124                 finder.collect(html)
125
126                 if opt == '-l' or opt == '-b':
127                     tmp = finder.quick
128                     tmp += finder.full
129
130                     if opt == '-l':
131                         list(tmp, 'List of available builders')
132                         break
133                    
134                     for b in tmp:
135                         if b == arg:
136                             build(tmp, values, 'Building GDAL on')
137                             break
138                     raise ValueError, 'Requested builder \'%s\' is unavailable' % arg
139                 elif opt == '-f':
140                     build(finder.full, values, 'Building GDAL on')
141                     break
142                 elif opt == '-q':
143                     build(finder.quick, values, 'Building GDAL on')
144                     break
145         return 0
146
147     except urllib2.HTTPError, err:
148         print >> sys.stderr, 'Error: HTTP', err.code, '-', err.msg
149     except urllib2.URLError, err:
150         print >> sys.stderr, 'Error: ', err.reason
151     except Usage, err:
152         print >> sys.stderr, 'Error: ', err.msg
153         print >> sys.stderr, 'Use -h to get usage options'
154     except Exception, err:
155         print >> sys.stderr, 'Error: ', err
156
157     return 2
158
159 # end of main()
160
161 if __name__ == "__main__":
162     sys.exit(main(sys.argv[1:]))
163
Note: See TracBrowser for help on using the browser.