Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(348)

Side by Side Diff: third_party/WebKit/Tools/Scripts/webkitpy/common/net/rietveld.py

Issue 2149453002: When fetching try jobs for a CL, include only the latest for each builder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Tools/Scripts/webkitpy/common/net/rietveld_unittest.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Utility functions to communicate with Rietveld.""" 5 """Utility functions to communicate with Rietveld."""
6 6
7 import collections 7 import collections
8 import json 8 import json
9 import logging 9 import logging
10 import urllib2 10 import urllib2
11 11
12 12
13 _log = logging.getLogger(__name__) 13 _log = logging.getLogger(__name__)
14 14
15 BASE_CODEREVIEW_URL = 'https://codereview.chromium.org/api' 15 BASE_CODEREVIEW_URL = 'https://codereview.chromium.org/api'
16 16
17 TryJob = collections.namedtuple('TryJob', ('builder_name', 'build_number')) 17 TryJob = collections.namedtuple('TryJob', ('builder_name', 'build_number'))
18 18
19 def latest_try_jobs(issue_number, builder_names, web, patchset_number=None): 19 def latest_try_jobs(issue_number, builder_names, web, patchset_number=None):
20 """Returns a list of TryJob objects for jobs on the latest patchset. 20 """Returns a list of TryJob objects for jobs on the latest patchset.
21 21
22 Args: 22 Args:
23 issue_number: A Rietveld issue number. 23 issue_number: A Rietveld issue number.
24 builder_names: Builders that we're interested in; try jobs for only 24 builder_names: Builders that we're interested in; try jobs for only
25 these builders will be listed. 25 these builders will be listed.
26 web: webkitpy.common.net.web.Web object (which can be mocked out). 26 web: webkitpy.common.net.web.Web object (which can be mocked out).
27 patchset_number: Use a specific patchset instead of the latest one. 27 patchset_number: Use a specific patchset instead of the latest one.
28 28
29 Returns: 29 Returns:
30 A list of TryJob objects; empty list if none were found. 30 A list of TryJob objects for the latest job for each builder, on the
31 latest patchset. If none were found, an empty list is returned.
31 """ 32 """
32 try: 33 try:
33 if patchset_number: 34 if patchset_number:
34 url = _patchset_url(issue_number, patchset_number) 35 url = _patchset_url(issue_number, patchset_number)
35 else: 36 else:
36 url = _latest_patchset_url(issue_number, web) 37 url = _latest_patchset_url(issue_number, web)
37 patchset_data = _get_json(url, web) 38 patchset_data = _get_json(url, web)
38 except (urllib2.URLError, ValueError): 39 except (urllib2.URLError, ValueError):
39 return [] 40 return []
40 jobs = [] 41 jobs = []
41 for job in patchset_data['try_job_results']: 42 for job in patchset_data['try_job_results']:
42 if job['builder'] not in builder_names: 43 if job['builder'] not in builder_names:
43 continue 44 continue
44 jobs.append(TryJob( 45 jobs.append(TryJob(
45 builder_name=job['builder'], 46 builder_name=job['builder'],
46 build_number=job['buildnumber'])) 47 build_number=job['buildnumber']))
47 return jobs 48 return filter_latest_jobs(jobs)
48 49
49 50
50 def _latest_patchset_url(issue_number, web): 51 def _latest_patchset_url(issue_number, web):
51 issue_data = _get_json(_issue_url(issue_number), web) 52 issue_data = _get_json(_issue_url(issue_number), web)
52 latest_patchset_number = issue_data["patchsets"][-1] 53 latest_patchset_number = issue_data["patchsets"][-1]
53 return _patchset_url(issue_number, latest_patchset_number) 54 return _patchset_url(issue_number, latest_patchset_number)
54 55
55 56
56 def _get_json(url, web): 57 def _get_json(url, web):
57 """Fetches JSON from a URL, and logs errors if the request was unsuccessful. 58 """Fetches JSON from a URL, and logs errors if the request was unsuccessful.
(...skipping 15 matching lines...) Expand all
73 74
74 75
75 def _issue_url(issue_number): 76 def _issue_url(issue_number):
76 return '%s/%s' % (BASE_CODEREVIEW_URL, issue_number) 77 return '%s/%s' % (BASE_CODEREVIEW_URL, issue_number)
77 78
78 79
79 def _patchset_url(issue_number, patchset_number): 80 def _patchset_url(issue_number, patchset_number):
80 return '%s/%s' % (_issue_url(issue_number), patchset_number) 81 return '%s/%s' % (_issue_url(issue_number), patchset_number)
81 82
82 83
84 def filter_latest_jobs(jobs):
85 """Filters out the list of jobs to include only the latest for each builder.
86
87 Args:
88 jobs: A list of TryJob objects.
89
90 Returns:
91 A list of TryJob objects such that only the latest job for each builder
92 is kept.
93 """
94 builder_to_highest_number = {}
95 for j in jobs:
96 if j.build_number > builder_to_highest_number.get(j.builder_name, 0):
97 builder_to_highest_number[j.builder_name] = j.build_number
98 return [j for j in jobs if builder_to_highest_number[j.builder_name] == j.bu ild_number]
99
100
83 def get_latest_try_job_results(issue_number, web): 101 def get_latest_try_job_results(issue_number, web):
84 url = _latest_patchset_url(issue_number, web) 102 url = _latest_patchset_url(issue_number, web)
85 patchset_data = _get_json(url, web) 103 patchset_data = _get_json(url, web)
86 results = {} 104 results = {}
87 for job in patchset_data['try_job_results']: 105 for job in patchset_data['try_job_results']:
88 results[job['builder']] = job['result'] 106 results[job['builder']] = job['result']
89 return results 107 return results
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Tools/Scripts/webkitpy/common/net/rietveld_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698