| #!/usr/bin/env python |
| # Copyright (C) 2011 Google Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: |
| # |
| # * Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # * Redistributions in binary form must reproduce the above |
| # copyright notice, this list of conditions and the following disclaimer |
| # in the documentation and/or other materials provided with the |
| # distribution. |
| # * Neither the name of Google Inc. nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| import json |
| import logging |
| import optparse |
| import os |
| import urllib2 |
| |
| # FIXME: See if Tools/Scripts/webkitpy/layout_tests/port/builders.py should also read |
| # the output json file here as its data source. |
| |
| |
| def master_json_url(master_url): |
| return master_url + '/json/builders' |
| |
| |
| def builder_json_url(master_url, builder): |
| return master_json_url(master_url) + '/' + urllib2.quote(builder) |
| |
| |
| def cached_build_json_url(master_url, builder, build_number): |
| return builder_json_url(master_url, builder) + '/builds/' + str(build_number) |
| |
| |
| def fetch_json(url): |
| logging.debug('Fetching %s' % url) |
| return json.load(urllib2.urlopen(url)) |
| |
| |
| def insert_builder_and_test_data(masters): |
| for master in masters: |
| master_url = master['url'] |
| tests_object = {} |
| master['tests'] = tests_object |
| |
| for builder in fetch_json(master_json_url(master_url)): |
| build_data = fetch_json(builder_json_url(master_url, builder)) |
| cached_builds = build_data['cachedBuilds'] |
| current_builds = build_data['currentBuilds'] |
| |
| latest_cached_build = cached_builds.pop() |
| while latest_cached_build in current_builds and len(cached_builds): |
| latest_cached_build = cached_builds.pop() |
| |
| for step in fetch_json(cached_build_json_url(master_url, builder, latest_cached_build))['steps']: |
| step_name = step['name'] |
| if step_name != 'layout-test': |
| continue |
| |
| # Adjust for backwards compatibility |
| step_name = 'layout-tests' |
| |
| if step_name not in tests_object: |
| tests_object[step_name] = {'builders': []} |
| tests_object[step_name]['builders'].append(builder) |
| |
| for step_name in tests_object: |
| tests_object[step_name]['builders'].sort() |
| |
| |
| def main(): |
| option_parser = optparse.OptionParser() |
| option_parser.add_option('-v', '--verbose', action='store_true', default=False, help='Print debug logging') |
| options, args = option_parser.parse_args() |
| |
| logging.getLogger().setLevel(logging.DEBUG if options.verbose else logging.INFO) |
| |
| masters = [ |
| {'name': 'webkit.org', 'url': 'https://build.webkit.org'}, |
| ] |
| |
| insert_builder_and_test_data(masters) |
| |
| json_file_prefix = ('// This file is auto-generated by Tools/TestResultServer/generate_builders_json.py. It should not be manually modified.\n' |
| '// It uses jsonp instead of proper json because we want to be able to load it from a file URL for local testing.\n' |
| 'LOAD_BUILDBOT_DATA(') |
| json_file_suffix = ');\n'; |
| |
| json_file = open(os.path.join('static-dashboards', 'builders.jsonp'), 'w') |
| json_file.write(json_file_prefix + json.dumps(masters, separators=(', ', ': '), indent=4, sort_keys=True) + json_file_suffix) |
| |
| |
| if __name__ == "__main__": |
| main() |