OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Runs all the buildbot steps for ChromeDriver except for update/compile.""" | 6 """Runs all the buildbot steps for ChromeDriver except for update/compile.""" |
7 | 7 |
8 import bisect | 8 import bisect |
9 import csv | 9 import csv |
10 import datetime | 10 import datetime |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 sys.path.append(SCRIPT_DIR) | 45 sys.path.append(SCRIPT_DIR) |
46 sys.path.append(SITE_CONFIG_DIR) | 46 sys.path.append(SITE_CONFIG_DIR) |
47 | 47 |
48 import archive | 48 import archive |
49 import chrome_paths | 49 import chrome_paths |
50 from slave import gsutil_download | 50 from slave import gsutil_download |
51 from slave import slave_utils | 51 from slave import slave_utils |
52 import util | 52 import util |
53 | 53 |
54 | 54 |
55 def _ArchivePrebuilts(revision): | 55 def _ArchivePrebuilts(commit_position): |
56 """Uploads the prebuilts to google storage.""" | 56 """Uploads the prebuilts to google storage.""" |
57 util.MarkBuildStepStart('archive prebuilts') | 57 util.MarkBuildStepStart('archive prebuilts') |
58 zip_path = util.Zip(os.path.join(chrome_paths.GetBuildDir(['chromedriver']), | 58 zip_path = util.Zip(os.path.join(chrome_paths.GetBuildDir(['chromedriver']), |
59 'chromedriver')) | 59 'chromedriver')) |
60 if slave_utils.GSUtilCopy( | 60 if slave_utils.GSUtilCopy( |
61 zip_path, | 61 zip_path, |
62 '%s/%s' % (GS_PREBUILTS_URL, 'r%s.zip' % revision)): | 62 '%s/%s' % (GS_PREBUILTS_URL, 'r%s.zip' % commit_position)): |
63 util.MarkBuildStepError() | 63 util.MarkBuildStepError() |
64 | 64 |
65 | 65 |
66 def _ArchiveServerLogs(): | 66 def _ArchiveServerLogs(): |
67 """Uploads chromedriver server logs to google storage.""" | 67 """Uploads chromedriver server logs to google storage.""" |
68 util.MarkBuildStepStart('archive chromedriver server logs') | 68 util.MarkBuildStepStart('archive chromedriver server logs') |
69 for server_log in glob.glob(os.path.join(tempfile.gettempdir(), | 69 for server_log in glob.glob(os.path.join(tempfile.gettempdir(), |
70 'chromedriver_*')): | 70 'chromedriver_*')): |
71 base_name = os.path.basename(server_log) | 71 base_name = os.path.basename(server_log) |
72 util.AddLink(base_name, '%s/%s' % (SERVER_LOGS_LINK, base_name)) | 72 util.AddLink(base_name, '%s/%s' % (SERVER_LOGS_LINK, base_name)) |
(...skipping 16 matching lines...) Expand all Loading... |
89 util.Unzip(zip_path, chrome_paths.GetBuildDir(['host_forwarder'])) | 89 util.Unzip(zip_path, chrome_paths.GetBuildDir(['host_forwarder'])) |
90 | 90 |
91 | 91 |
92 def _GetTestResultsLog(platform): | 92 def _GetTestResultsLog(platform): |
93 """Gets the test results log for the given platform. | 93 """Gets the test results log for the given platform. |
94 | 94 |
95 Args: | 95 Args: |
96 platform: The platform that the test results log is for. | 96 platform: The platform that the test results log is for. |
97 | 97 |
98 Returns: | 98 Returns: |
99 A dictionary where the keys are SVN revisions and the values are booleans | 99 A dictionary where the keys are commit positions and the values are booleans |
100 indicating whether the tests passed. | 100 indicating whether the tests passed. |
101 """ | 101 """ |
102 temp_log = tempfile.mkstemp()[1] | 102 temp_log = tempfile.mkstemp()[1] |
103 log_name = TEST_LOG_FORMAT % platform | 103 log_name = TEST_LOG_FORMAT % platform |
104 result = slave_utils.GSUtilDownloadFile( | 104 result = slave_utils.GSUtilDownloadFile( |
105 '%s/%s' % (GS_CHROMEDRIVER_DATA_BUCKET, log_name), temp_log) | 105 '%s/%s' % (GS_CHROMEDRIVER_DATA_BUCKET, log_name), temp_log) |
106 if result: | 106 if result: |
107 return {} | 107 return {} |
108 with open(temp_log, 'rb') as log_file: | 108 with open(temp_log, 'rb') as log_file: |
109 json_dict = json.load(log_file) | 109 json_dict = json.load(log_file) |
110 # Workaround for json encoding dictionary keys as strings. | 110 # Workaround for json encoding dictionary keys as strings. |
111 return dict([(int(v[0]), v[1]) for v in json_dict.items()]) | 111 return dict([(int(v[0]), v[1]) for v in json_dict.items()]) |
112 | 112 |
113 | 113 |
114 def _PutTestResultsLog(platform, test_results_log): | 114 def _PutTestResultsLog(platform, test_results_log): |
115 """Pushes the given test results log to google storage.""" | 115 """Pushes the given test results log to google storage.""" |
116 temp_dir = util.MakeTempDir() | 116 temp_dir = util.MakeTempDir() |
117 log_name = TEST_LOG_FORMAT % platform | 117 log_name = TEST_LOG_FORMAT % platform |
118 log_path = os.path.join(temp_dir, log_name) | 118 log_path = os.path.join(temp_dir, log_name) |
119 with open(log_path, 'wb') as log_file: | 119 with open(log_path, 'wb') as log_file: |
120 json.dump(test_results_log, log_file) | 120 json.dump(test_results_log, log_file) |
121 if slave_utils.GSUtilCopyFile(log_path, GS_CHROMEDRIVER_DATA_BUCKET): | 121 if slave_utils.GSUtilCopyFile(log_path, GS_CHROMEDRIVER_DATA_BUCKET): |
122 raise Exception('Failed to upload test results log to google storage') | 122 raise Exception('Failed to upload test results log to google storage') |
123 | 123 |
124 | 124 |
125 def _UpdateTestResultsLog(platform, revision, passed): | 125 def _UpdateTestResultsLog(platform, commit_position, passed): |
126 """Updates the test results log for the given platform. | 126 """Updates the test results log for the given platform. |
127 | 127 |
128 Args: | 128 Args: |
129 platform: The platform name. | 129 platform: The platform name. |
130 revision: The SVN revision number. | 130 commit_position: The commit position number. |
131 passed: Boolean indicating whether the tests passed at this revision. | 131 passed: Boolean indicating whether the tests passed at this commit position. |
132 """ | 132 """ |
133 assert isinstance(revision, int), 'The revision must be an integer' | 133 |
| 134 assert commit_position.isdigit(), 'The commit position must be a number' |
| 135 commit_position = int(commit_position) |
134 log = _GetTestResultsLog(platform) | 136 log = _GetTestResultsLog(platform) |
135 if len(log) > 500: | 137 if len(log) > 500: |
136 del log[min(log.keys())] | 138 del log[min(log.keys())] |
137 assert revision not in log, 'Results already exist for revision %s' % revision | 139 assert commit_position not in log, \ |
138 log[revision] = bool(passed) | 140 'Results already exist for commit position %s' % commit_position |
| 141 log[commit_position] = bool(passed) |
139 _PutTestResultsLog(platform, log) | 142 _PutTestResultsLog(platform, log) |
140 | 143 |
141 | 144 |
142 def _GetVersion(): | 145 def _GetVersion(): |
143 """Get the current chromedriver version.""" | 146 """Get the current chromedriver version.""" |
144 with open(os.path.join(_THIS_DIR, 'VERSION'), 'r') as f: | 147 with open(os.path.join(_THIS_DIR, 'VERSION'), 'r') as f: |
145 return f.read().strip() | 148 return f.read().strip() |
146 | 149 |
147 | 150 |
148 def _GetSupportedChromeVersions(): | 151 def _GetSupportedChromeVersions(): |
149 """Get the minimum and maximum supported Chrome versions. | 152 """Get the minimum and maximum supported Chrome versions. |
150 | 153 |
151 Returns: | 154 Returns: |
152 A tuple of the form (min_version, max_version). | 155 A tuple of the form (min_version, max_version). |
153 """ | 156 """ |
154 # Minimum supported Chrome version is embedded as: | 157 # Minimum supported Chrome version is embedded as: |
155 # const int kMinimumSupportedChromeVersion[] = {27, 0, 1453, 0}; | 158 # const int kMinimumSupportedChromeVersion[] = {27, 0, 1453, 0}; |
156 with open(os.path.join(_THIS_DIR, 'chrome', 'version.cc'), 'r') as f: | 159 with open(os.path.join(_THIS_DIR, 'chrome', 'version.cc'), 'r') as f: |
157 lines = f.readlines() | 160 lines = f.readlines() |
158 chrome_min_version_line = [ | 161 chrome_min_version_line = [ |
159 x for x in lines if 'kMinimumSupportedChromeVersion' in x] | 162 x for x in lines if 'kMinimumSupportedChromeVersion' in x] |
160 chrome_min_version = chrome_min_version_line[0].split('{')[1].split(',')[0] | 163 chrome_min_version = chrome_min_version_line[0].split('{')[1].split(',')[0] |
161 with open(os.path.join(chrome_paths.GetSrc(), 'chrome', 'VERSION'), 'r') as f: | 164 with open(os.path.join(chrome_paths.GetSrc(), 'chrome', 'VERSION'), 'r') as f: |
162 chrome_max_version = f.readlines()[0].split('=')[1].strip() | 165 chrome_max_version = f.readlines()[0].split('=')[1].strip() |
163 return (chrome_min_version, chrome_max_version) | 166 return (chrome_min_version, chrome_max_version) |
164 | 167 |
165 | 168 |
166 def _RevisionState(test_results_log, revision): | 169 def _CommitPositionState(test_results_log, commit_position): |
167 """Check the state of tests at a given SVN revision. | 170 """Check the state of tests at a given commit position. |
168 | 171 |
169 Considers tests as having passed at a revision if they passed at revisons both | 172 Considers tests as having passed at a commit position if they passed at |
170 before and after. | 173 revisons both before and after. |
171 | 174 |
172 Args: | 175 Args: |
173 test_results_log: A test results log dictionary from _GetTestResultsLog(). | 176 test_results_log: A test results log dictionary from _GetTestResultsLog(). |
174 revision: The revision to check at. | 177 commit_position: The commit position to check at. |
175 | 178 |
176 Returns: | 179 Returns: |
177 'passed', 'failed', or 'unknown' | 180 'passed', 'failed', or 'unknown' |
178 """ | 181 """ |
179 assert isinstance(revision, int), 'The revision must be an integer' | 182 assert isinstance(commit_position, int), 'The commit position must be an int' |
180 keys = sorted(test_results_log.keys()) | 183 keys = sorted(test_results_log.keys()) |
181 # Return passed if the exact revision passed on Android. | 184 # Return passed if the exact commit position passed on Android. |
182 if revision in test_results_log: | 185 if commit_position in test_results_log: |
183 return 'passed' if test_results_log[revision] else 'failed' | 186 return 'passed' if test_results_log[commit_position] else 'failed' |
184 # Tests were not run on this exact revision on Android. | 187 # Tests were not run on this exact commit position on Android. |
185 index = bisect.bisect_right(keys, revision) | 188 index = bisect.bisect_right(keys, commit_position) |
186 # Tests have not yet run on Android at or above this revision. | 189 # Tests have not yet run on Android at or above this commit position. |
187 if index == len(test_results_log): | 190 if index == len(test_results_log): |
188 return 'unknown' | 191 return 'unknown' |
189 # No log exists for any prior revision, assume it failed. | 192 # No log exists for any prior commit position, assume it failed. |
190 if index == 0: | 193 if index == 0: |
191 return 'failed' | 194 return 'failed' |
192 # Return passed if the revisions on both sides passed. | 195 # Return passed if the commit position on both sides passed. |
193 if test_results_log[keys[index]] and test_results_log[keys[index - 1]]: | 196 if test_results_log[keys[index]] and test_results_log[keys[index - 1]]: |
194 return 'passed' | 197 return 'passed' |
195 return 'failed' | 198 return 'failed' |
196 | 199 |
197 | 200 |
198 def _ArchiveGoodBuild(platform, revision): | 201 def _ArchiveGoodBuild(platform, commit_position): |
199 """Archive chromedriver binary if the build is green.""" | 202 """Archive chromedriver binary if the build is green.""" |
200 assert platform != 'android' | 203 assert platform != 'android' |
201 util.MarkBuildStepStart('archive build') | 204 util.MarkBuildStepStart('archive build') |
202 | 205 |
203 server_name = 'chromedriver' | 206 server_name = 'chromedriver' |
204 if util.IsWindows(): | 207 if util.IsWindows(): |
205 server_name += '.exe' | 208 server_name += '.exe' |
206 zip_path = util.Zip(os.path.join(chrome_paths.GetBuildDir([server_name]), | 209 zip_path = util.Zip(os.path.join(chrome_paths.GetBuildDir([server_name]), |
207 server_name)) | 210 server_name)) |
208 | 211 |
209 build_name = 'chromedriver_%s_%s.%s.zip' % ( | 212 build_name = 'chromedriver_%s_%s.%s.zip' % ( |
210 platform, _GetVersion(), revision) | 213 platform, _GetVersion(), commit_position) |
211 build_url = '%s/%s' % (GS_CONTINUOUS_URL, build_name) | 214 build_url = '%s/%s' % (GS_CONTINUOUS_URL, build_name) |
212 if slave_utils.GSUtilCopy(zip_path, build_url): | 215 if slave_utils.GSUtilCopy(zip_path, build_url): |
213 util.MarkBuildStepError() | 216 util.MarkBuildStepError() |
214 | 217 |
215 (latest_fd, latest_file) = tempfile.mkstemp() | 218 (latest_fd, latest_file) = tempfile.mkstemp() |
216 os.write(latest_fd, build_name) | 219 os.write(latest_fd, build_name) |
217 os.close(latest_fd) | 220 os.close(latest_fd) |
218 latest_url = '%s/latest_%s' % (GS_CONTINUOUS_URL, platform) | 221 latest_url = '%s/latest_%s' % (GS_CONTINUOUS_URL, platform) |
219 if slave_utils.GSUtilCopy(latest_file, latest_url, mimetype='text/plain'): | 222 if slave_utils.GSUtilCopy(latest_file, latest_url, mimetype='text/plain'): |
220 util.MarkBuildStepError() | 223 util.MarkBuildStepError() |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 result = candidate_pattern.match(line) | 258 result = candidate_pattern.match(line) |
256 if not result: | 259 if not result: |
257 print 'Ignored line "%s"' % line | 260 print 'Ignored line "%s"' % line |
258 continue | 261 continue |
259 candidates.append(int(result.group(1))) | 262 candidates.append(int(result.group(1))) |
260 | 263 |
261 # Release the latest candidate build that passed Android, if any. | 264 # Release the latest candidate build that passed Android, if any. |
262 # In this way, if a hot fix is needed, we can delete the release from | 265 # In this way, if a hot fix is needed, we can delete the release from |
263 # the chromedriver bucket instead of bumping up the release version number. | 266 # the chromedriver bucket instead of bumping up the release version number. |
264 candidates.sort(reverse=True) | 267 candidates.sort(reverse=True) |
265 for revision in candidates: | 268 for commit_position in candidates: |
266 android_result = _RevisionState(android_test_results, revision) | 269 android_result = _CommitPositionState(android_test_results, commit_position) |
267 if android_result == 'failed': | 270 if android_result == 'failed': |
268 print 'Android tests did not pass at revision', revision | 271 print 'Android tests did not pass at commit position', commit_position |
269 elif android_result == 'passed': | 272 elif android_result == 'passed': |
270 print 'Android tests passed at revision', revision | 273 print 'Android tests passed at commit position', commit_position |
271 candidate = 'chromedriver_%s_%s.%s.zip' % (platform, version, revision) | 274 candidate = 'chromedriver_%s_%s.%s.zip' % ( |
| 275 platform, version, commit_position) |
272 _Release('%s/%s' % (GS_CONTINUOUS_URL, candidate), version, platform) | 276 _Release('%s/%s' % (GS_CONTINUOUS_URL, candidate), version, platform) |
273 break | 277 break |
274 else: | 278 else: |
275 print 'Android tests have not run at a revision as recent as', revision | 279 print 'Android tests have not run at a commit position as recent as', \ |
| 280 commit_position |
276 | 281 |
277 | 282 |
278 def _Release(build, version, platform): | 283 def _Release(build, version, platform): |
279 """Releases the given candidate build.""" | 284 """Releases the given candidate build.""" |
280 release_name = 'chromedriver_%s.zip' % platform | 285 release_name = 'chromedriver_%s.zip' % platform |
281 util.MarkBuildStepStart('releasing %s' % release_name) | 286 util.MarkBuildStepStart('releasing %s' % release_name) |
282 temp_dir = util.MakeTempDir() | 287 temp_dir = util.MakeTempDir() |
283 slave_utils.GSUtilCopy(build, temp_dir) | 288 slave_utils.GSUtilCopy(build, temp_dir) |
284 zip_path = os.path.join(temp_dir, os.path.basename(build)) | 289 zip_path = os.path.join(temp_dir, os.path.basename(build)) |
285 | 290 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 util.PrintAndFlush('URL Error %s' % error.message) | 401 util.PrintAndFlush('URL Error %s' % error.message) |
397 return None | 402 return None |
398 data = json.loads(response.read()[4:]) | 403 data = json.loads(response.read()[4:]) |
399 if 'message' in data: | 404 if 'message' in data: |
400 message = data['message'].split('\n') | 405 message = data['message'].split('\n') |
401 message = [line for line in message if line.strip()] | 406 message = [line for line in message if line.strip()] |
402 search_pattern = re.compile(GS_SEARCH_PATTERN) | 407 search_pattern = re.compile(GS_SEARCH_PATTERN) |
403 result = search_pattern.search(message[len(message)-1]) | 408 result = search_pattern.search(message[len(message)-1]) |
404 if result: | 409 if result: |
405 return result.group(1) | 410 return result.group(1) |
406 util.PrintAndFlush('Failed to get svn revision number for %s' % | 411 util.PrintAndFlush('Failed to get commit position number for %s' % |
407 snapshot_hashcode) | 412 snapshot_hashcode) |
408 return None | 413 return None |
409 | 414 |
410 | 415 |
411 def _GetGitHashFromCommitPosition(commit_position): | 416 def _GetGitHashFromCommitPosition(commit_position): |
412 json_url = CR_REV_URL % commit_position | 417 json_url = CR_REV_URL % commit_position |
413 try: | 418 try: |
414 response = urllib2.urlopen(json_url) | 419 response = urllib2.urlopen(json_url) |
415 except urllib2.HTTPError as error: | 420 except urllib2.HTTPError as error: |
416 util.PrintAndFlush('HTTP Error %d' % error.getcode()) | 421 util.PrintAndFlush('HTTP Error %d' % error.getcode()) |
417 return None | 422 return None |
418 except urllib2.URLError as error: | 423 except urllib2.URLError as error: |
419 util.PrintAndFlush('URL Error %s' % error.message) | 424 util.PrintAndFlush('URL Error %s' % error.message) |
420 return None | 425 return None |
421 data = json.loads(response.read()) | 426 data = json.loads(response.read()) |
422 if 'git_sha' in data: | 427 if 'git_sha' in data: |
423 return data['git_sha'] | 428 return data['git_sha'] |
424 util.PrintAndFlush('Failed to get git hash for %s' % commit_position) | 429 util.PrintAndFlush('Failed to get git hash for %s' % commit_position) |
425 return None | 430 return None |
426 | 431 |
427 | 432 |
428 def _WaitForLatestSnapshot(revision): | 433 def _WaitForLatestSnapshot(commit_position): |
429 util.MarkBuildStepStart('wait_for_snapshot') | 434 util.MarkBuildStepStart('wait_for_snapshot') |
430 def _IsRevisionNumber(revision): | |
431 if isinstance(revision, int): | |
432 return True | |
433 else: | |
434 return revision.isdigit() | |
435 while True: | 435 while True: |
436 snapshot_revision = archive.GetLatestSnapshotVersion() | 436 snapshot_position = archive.GetLatestSnapshotVersion() |
437 if not _IsRevisionNumber(snapshot_revision): | 437 if commit_position is not None and snapshot_position is not None: |
438 snapshot_revision = _GetCommitPositionFromGitHash(snapshot_revision) | 438 if int(snapshot_position) >= int(commit_position): |
439 if revision is not None and snapshot_revision is not None: | |
440 if int(snapshot_revision) >= int(revision): | |
441 break | 439 break |
442 util.PrintAndFlush('Waiting for snapshot >= %s, found %s' % | 440 util.PrintAndFlush('Waiting for snapshot >= %s, found %s' % |
443 (revision, snapshot_revision)) | 441 (commit_position, snapshot_position)) |
444 time.sleep(60) | 442 time.sleep(60) |
445 util.PrintAndFlush('Got snapshot revision %s' % snapshot_revision) | 443 util.PrintAndFlush('Got snapshot commit position %s' % snapshot_position) |
446 | 444 |
447 | 445 |
448 def _AddToolsToPath(platform_name): | 446 def _AddToolsToPath(platform_name): |
449 """Add some tools like Ant and Java to PATH for testing steps to use.""" | 447 """Add some tools like Ant and Java to PATH for testing steps to use.""" |
450 paths = [] | 448 paths = [] |
451 error_message = '' | 449 error_message = '' |
452 if platform_name == 'win32': | 450 if platform_name == 'win32': |
453 paths = [ | 451 paths = [ |
454 # Path to Ant and Java, required for the java acceptance tests. | 452 # Path to Ant and Java, required for the java acceptance tests. |
455 'C:\\Program Files (x86)\\Java\\ant\\bin', | 453 'C:\\Program Files (x86)\\Java\\ant\\bin', |
(...skipping 18 matching lines...) Expand all Loading... |
474 os.environ['PATH'] += os.pathsep + os.pathsep.join(paths) | 472 os.environ['PATH'] += os.pathsep + os.pathsep.join(paths) |
475 | 473 |
476 | 474 |
477 def main(): | 475 def main(): |
478 parser = optparse.OptionParser() | 476 parser = optparse.OptionParser() |
479 parser.add_option( | 477 parser.add_option( |
480 '', '--android-packages', | 478 '', '--android-packages', |
481 help=('Comma separated list of application package names, ' | 479 help=('Comma separated list of application package names, ' |
482 'if running tests on Android.')) | 480 'if running tests on Android.')) |
483 parser.add_option( | 481 parser.add_option( |
484 '-r', '--revision', help='Chromium revision') | 482 '-r', '--revision', help='Chromium git revision hash') |
485 parser.add_option( | 483 parser.add_option( |
486 '', '--update-log', action='store_true', | 484 '', '--update-log', action='store_true', |
487 help='Update the test results log (only applicable to Android)') | 485 help='Update the test results log (only applicable to Android)') |
488 options, _ = parser.parse_args() | 486 options, _ = parser.parse_args() |
489 | 487 |
490 bitness = '32' | 488 bitness = '32' |
491 if util.IsLinux() and platform_module.architecture()[0] == '64bit': | 489 if util.IsLinux() and platform_module.architecture()[0] == '64bit': |
492 bitness = '64' | 490 bitness = '64' |
493 platform = '%s%s' % (util.GetPlatformName(), bitness) | 491 platform = '%s%s' % (util.GetPlatformName(), bitness) |
494 if options.android_packages: | 492 if options.android_packages: |
495 platform = 'android' | 493 platform = 'android' |
496 | 494 |
497 _CleanTmpDir() | 495 _CleanTmpDir() |
498 | 496 |
499 if not options.revision: | 497 if not options.revision: |
500 commit_position = None | 498 commit_position = None |
501 elif options.revision.isdigit(): | |
502 commit_position = options.revision | |
503 else: | 499 else: |
504 commit_position = _GetCommitPositionFromGitHash(options.revision) | 500 commit_position = _GetCommitPositionFromGitHash(options.revision) |
505 | 501 |
506 if platform == 'android': | 502 if platform == 'android': |
507 if not options.revision and options.update_log: | 503 if not options.revision and options.update_log: |
508 parser.error('Must supply a --revision with --update-log') | 504 parser.error('Must supply a --revision with --update-log') |
509 _DownloadPrebuilts() | 505 _DownloadPrebuilts() |
510 else: | 506 else: |
511 if not options.revision: | 507 if not options.revision: |
512 parser.error('Must supply a --revision') | 508 parser.error('Must supply a --revision') |
(...skipping 28 matching lines...) Expand all Loading... |
541 util.MarkBuildStepStart('run_all_tests.py') | 537 util.MarkBuildStepStart('run_all_tests.py') |
542 util.MarkBuildStepError() | 538 util.MarkBuildStepError() |
543 | 539 |
544 # Add a "cleanup" step so that errors from runtest.py or bb_device_steps.py | 540 # Add a "cleanup" step so that errors from runtest.py or bb_device_steps.py |
545 # (which invoke this script) are kept in thier own build step. | 541 # (which invoke this script) are kept in thier own build step. |
546 util.MarkBuildStepStart('cleanup') | 542 util.MarkBuildStepStart('cleanup') |
547 | 543 |
548 | 544 |
549 if __name__ == '__main__': | 545 if __name__ == '__main__': |
550 main() | 546 main() |
OLD | NEW |