blob: 78b77f816ad06103a08a0883752783857c0d98cd [file]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Checks grouping for compile failures."""
from collections import defaultdict
from datetime import datetime
import json
import os
import sys
_REMOTE_API_DIR = os.path.join(
os.path.dirname(__file__), os.path.pardir, os.path.pardir)
sys.path.insert(1, _REMOTE_API_DIR)
from local_libs import remote_api
from common.waterfall import failure_type
from libs import analysis_status
from model.wf_analysis import WfAnalysis
from model.wf_try_job import WfTryJob
def _DisplayResults(groups_with_different_results, groups):
results = {
'groups_with_different_results': {
'count': len(groups_with_different_results),
'groups_with_different_results': groups_with_different_results
},
'groups': {
'count': len(groups),
'groups': groups
}
}
print json.dumps(results, indent=2)
def main():
# Set up the Remote API to use services on the live App Engine.
remote_api.EnableRemoteApi(app_id='findit-for-me')
start = datetime(2017, 12, 1, 0, 0, 0)
cursor = None
more = True
groups_with_different_results = defaultdict(list)
groups = defaultdict(list)
while more:
analyses, cursor, more = WfAnalysis.query(
WfAnalysis.build_start_time >= start).fetch_page(
100, start_cursor=cursor)
for analysis in analyses:
if (analysis.status != analysis_status.COMPLETED or
not analysis.failure_group_key or
analysis.failure_type != failure_type.COMPILE):
continue
group_key = '/'.join(str(x) for x in analysis.failure_group_key)
culprit = None
try_job = WfTryJob.Get(*analysis.key.pairs()[0][1].split('/'))
if try_job and try_job.compile_results:
culprit = try_job.compile_results[-1].get('culprit')
same_result = False
for item in groups[group_key]:
if (item['culprit'] != culprit or
item['suspects'] != analysis.suspected_cls):
continue
same_result = True
item['builds'].append(analysis.key.pairs()[0][1])
break
if same_result:
continue
new_result = {
'suspects': analysis.suspected_cls,
'culprit': culprit,
'builds': [analysis.key.pairs()[0][1]]
}
groups[group_key].append(new_result)
for key, item in groups.iteritems():
if len(item) > 1:
groups_with_different_results[key] = item
_DisplayResults(groups_with_different_results, groups)
if __name__ == '__main__':
main()