diff options
Diffstat (limited to 'tools/findbuildbotwarnings.py')
-rwxr-xr-x | tools/findbuildbotwarnings.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/tools/findbuildbotwarnings.py b/tools/findbuildbotwarnings.py new file mode 100755 index 0000000000..a172dd6d71 --- /dev/null +++ b/tools/findbuildbotwarnings.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# +# Copyright (C) 2017 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Outputs the warnings that are common to all builders. + +Suppressed tests that are nonetheless passing are output as warnings +by vogar. Any tests that generate warnings in every builder are good +candidates for no longer being suppressed, since they're passing on +a regular basis.""" + +import collections +import json +import requests + +# The number of recent builds to check for each builder +NUM_BUILDS = 5 +# The buildbot step to check for warnings +BUILDBOT_STEP = 'test libcore' + + +def main(): + # Dict from builder+build_num combination to the list of warnings + # in that build + warnings = collections.defaultdict(list) + r = requests.get('https://build.chromium.org/p/client.art/json/builders') + if r.status_code != 200: + print r.text + return + builders = json.loads(r.text) + for builder_name in sorted(builders): + # Build -1 is the currently-running build (if there is one), so we + # start with -2, which should be the most or second-most + # recently-completed build. + for build_num in range(-2, -2 - NUM_BUILDS, -1): + print ('Loading data for %s, build %d...' + % (builder_name, build_num)) + r = requests.get( + 'https://build.chromium.org/p/client.art' + '/json/builders/%s/builds/%d' % ( + builder_name, build_num)) + if r.status_code != 200: + print r.text + return + builder = json.loads(r.text) + libcore_steps = [x for x in builder['steps'] + if x['name'] == BUILDBOT_STEP] + for ls in libcore_steps: + stdio_logs = [x for x in ls['logs'] if x[0] == 'stdio'] + for sl in stdio_logs: + # The default link is HTML, so append /text to get the + # text version + r = requests.get(sl[1] + '/text') + if r.status_code != 200: + print r.text + return + stdio = r.text.splitlines() + + # Walk from the back of the list to find the start of the + # warnings summary + i = -1 + try: + while not stdio[i].startswith('Warnings summary:'): + i -= 1 + i += 1 # Ignore the "Warnings summary:" line + while i < -1: + warnings['%s:%d' % (builder_name, build_num)].append(stdio[i]) + i += 1 + except IndexError: + # Some builds don't have any + print ' No warnings section found.' + # sharedwarnings will build up the intersection of all the lists of + # warnings. We seed it with an arbitrary starting point (which is fine + # since intersection is commutative). + sharedwarnings = set(warnings.popitem()[1]) + for warning_list in warnings.itervalues(): + sharedwarnings = sharedwarnings & set(warning_list) + print 'Warnings shared across all builders:' + for warning in sorted(list(sharedwarnings)): + print warning + + +if __name__ == '__main__': + main() |