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

Side by Side Diff: tools/findit/chromium_deps.py

Issue 538383002: [Findit] Make Findit more robust. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Workaround python bug. Created 6 years, 3 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
OLDNEW
1 # Copyright (c) 2014 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2014 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 import base64 5 import base64
6 import json 6 import json
7 import os 7 import os
8 import re 8 import re
9 import time 9 import time
10 import urllib2 10 import urllib2
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 name = path.split('/')[0].lower() 61 name = path.split('/')[0].lower()
62 if name in components_renamed: 62 if name in components_renamed:
63 return components_renamed[name].lower() 63 return components_renamed[name].lower()
64 else: 64 else:
65 return name.lower() 65 return name.lower()
66 66
67 # Unknown path, return the whole path as component name. 67 # Unknown path, return the whole path as component name.
68 return '_'.join(path.split('/')) 68 return '_'.join(path.split('/'))
69 69
70 70
71 def _GetContentOfDEPS(revision, retries=5, sleep_time=0.1): 71 def _GetContentOfDEPS(revision):
72 chromium_git_file_url_template = CONFIG['chromium_git_file_url'] 72 chromium_git_file_url_template = CONFIG['chromium_git_file_url']
73 73
74 deps_file_name = '.DEPS.git' 74 # Try .DEPS.git first, because before migration from SVN to GIT, the .DEPS.git
75 count = 0 75 # has the dependency in GIT repo while DEPS has dependency in SVN repo.
76 while True: 76 url = chromium_git_file_url_template % (revision, '.DEPS.git')
77 count += 1 77 http_status_code, content = utils.GetHttpClient().Get(
78 url, retries=5, retry_if_not=404)
78 79
79 url = chromium_git_file_url_template % (revision, deps_file_name) 80 # If .DEPS.git is not found, use DEPS, assuming it is a commit after migration
80 http_status_code, content = utils.GetHttpClient().Get(url, timeout=60) 81 # from SVN to GIT.
82 if http_status_code == 404:
83 url = chromium_git_file_url_template % (revision, 'DEPS')
84 http_status_code, content = utils.GetHttpClient().Get(url, retries=5)
81 85
82 if http_status_code == 404 and deps_file_name != 'DEPS': 86 if http_status_code == 200:
83 deps_file_name = 'DEPS' 87 return base64.b64decode(content)
84 count = 0 88 else:
85 continue 89 return ''
86 elif http_status_code == 200:
87 # Googlesource git returns text file encoded in base64, so decode it.
88 return base64.b64decode(content)
89
90 if count < retries:
91 time.sleep(sleep_time)
92 else:
93 break
94
95 return ''
96 90
97 91
98 def GetChromiumComponents(chromium_revision, 92 def GetChromiumComponents(chromium_revision,
99 os_platform='unix', 93 os_platform='unix',
100 deps_file_downloader=_GetContentOfDEPS): 94 deps_file_downloader=_GetContentOfDEPS):
101 """Return a list of components used by Chrome of the given revision. 95 """Return a list of components used by Chrome of the given revision.
102 96
103 Args: 97 Args:
104 chromium_revision: Revision of the Chrome build: svn revision, or git hash. 98 chromium_revision: Revision of the Chrome build: svn revision, or git hash.
105 os_platform: The target platform of the Chrome build, eg. win, mac, etc. 99 os_platform: The target platform of the Chrome build, eg. win, mac, etc.
106 deps_file_downloader: A function that takes the chromium_revision as input, 100 deps_file_downloader: A function that takes the chromium_revision as input,
107 and returns the content of the DEPS file. The returned 101 and returns the content of the DEPS file. The returned
108 content is assumed to be trusted input and will be 102 content is assumed to be trusted input and will be
109 evaluated as python code. 103 evaluated as python code.
110 104
111 Returns: 105 Returns:
112 A map from component path to parsed component name, repository URL, 106 A map from component path to parsed component name, repository URL,
113 repository type and revision. 107 repository type and revision.
108 Return None if an error occurs.
114 """ 109 """
115 if os_platform.lower() == 'linux': 110 if os_platform.lower() == 'linux':
116 os_platform = 'unix' 111 os_platform = 'unix'
117 112
118 chromium_git_base_url = CONFIG['chromium_git_base_url'] 113 chromium_git_base_url = CONFIG['chromium_git_base_url']
119 114
120 if not utils.IsGitHash(chromium_revision): 115 if not utils.IsGitHash(chromium_revision):
121 # Convert svn revision or commit position to Git hash. 116 # Convert svn revision or commit position to Git hash.
122 cr_rev_url_template = CONFIG['cr_rev_url'] 117 cr_rev_url_template = CONFIG['cr_rev_url']
123 url = cr_rev_url_template % chromium_revision 118 url = cr_rev_url_template % chromium_revision
124 # TODO(stgao): Add retry in HttpClient. 119 status_code, content = utils.GetHttpClient().Get(
125 _, content = utils.GetHttpClient().Get(url, timeout=60) 120 url, timeout=60, retries=5, retry_if_not=404)
121 if status_code != 200 or not content:
122 if status_code == 404:
123 print 'Chromium commit position %s is not found.' % chromium_revision
124 return None
125
126 cr_rev_data = json.loads(content) 126 cr_rev_data = json.loads(content)
127 if 'git_sha' not in cr_rev_data: 127 if 'git_sha' not in cr_rev_data:
128 raise Exception('Failed to convert svn revision to git hash') 128 return None
129 chromium_revision = cr_rev_data['git_sha'] 129
130 if 'repo' not in cr_rev_data or cr_rev_data['repo'] != 'chromium/src':
131 print ('%s seems like a commit position of "%s", but not "chromium/src".'
132 % (chromium_revision, cr_rev_data['repo']))
133 return None
134
135 chromium_revision = cr_rev_data.get('git_sha')
136 if not chromium_revision:
137 return None
130 138
131 # Download the content of DEPS file in chromium. 139 # Download the content of DEPS file in chromium.
132 deps_content = deps_file_downloader(chromium_revision) 140 deps_content = deps_file_downloader(chromium_revision)
141 if not deps_content:
142 return None
133 143
134 all_deps = {} 144 all_deps = {}
135 145
136 # Parse the content of DEPS file. 146 # Parse the content of DEPS file.
137 deps, deps_os = _ParseDEPS(deps_content) 147 deps, deps_os = _ParseDEPS(deps_content)
138 all_deps.update(deps) 148 all_deps.update(deps)
139 if os_platform is not None: 149 if os_platform is not None:
140 all_deps.update(deps_os.get(os_platform, {})) 150 all_deps.update(deps_os.get(os_platform, {}))
141 151
142 # Figure out components based on the dependencies. 152 # Figure out components based on the dependencies.
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 old_revision: The old revision of a Chrome build. 199 old_revision: The old revision of a Chrome build.
190 new_revision: The new revision of a Chrome build. 200 new_revision: The new revision of a Chrome build.
191 os_platform: The target platform of the Chrome build, eg. win, mac, etc. 201 os_platform: The target platform of the Chrome build, eg. win, mac, etc.
192 deps_file_downloader: A function that takes the chromium_revision as input, 202 deps_file_downloader: A function that takes the chromium_revision as input,
193 and returns the content of the DEPS file. The returned 203 and returns the content of the DEPS file. The returned
194 content is assumed to be trusted input and will be 204 content is assumed to be trusted input and will be
195 evaluated as python code. 205 evaluated as python code.
196 206
197 Returns: 207 Returns:
198 A map from component path to its parsed regression and other information. 208 A map from component path to its parsed regression and other information.
209 Return None if an error occurs.
199 """ 210 """
200 # Assume first revision is the old revision.
201 old_components = GetChromiumComponents(old_revision, os_platform, 211 old_components = GetChromiumComponents(old_revision, os_platform,
202 deps_file_downloader) 212 deps_file_downloader)
213 if not old_components:
214 return None
215
203 new_components = GetChromiumComponents(new_revision, os_platform, 216 new_components = GetChromiumComponents(new_revision, os_platform,
204 deps_file_downloader) 217 deps_file_downloader)
218 if not new_components:
219 return None
205 220
206 components = {} 221 components = {}
207 for path in new_components: 222 for path in new_components:
208 new_component = new_components[path] 223 new_component = new_components[path]
209 old_revision = None 224 old_revision = None
210 225
211 if path in old_components: 226 if path in old_components:
212 old_component = old_components[path] 227 old_component = old_components[path]
213 old_revision = old_component['revision'] 228 old_revision = old_component['revision']
214 229
215 components[path] = { 230 components[path] = {
216 'path': path, 231 'path': path,
217 'rolled': new_component['revision'] != old_revision, 232 'rolled': new_component['revision'] != old_revision,
218 'name': new_component['name'], 233 'name': new_component['name'],
219 'old_revision': old_revision, 234 'old_revision': old_revision,
220 'new_revision': new_component['revision'], 235 'new_revision': new_component['revision'],
221 'repository': new_component['repository'], 236 'repository': new_component['repository'],
222 'repository_type': new_component['repository_type'] 237 'repository_type': new_component['repository_type']
223 } 238 }
224 239
225 return components 240 return components
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698