| OLD | NEW |
| 1 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2010 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 """Generic presubmit checks that can be reused by other presubmit checks.""" | 5 """Generic presubmit checks that can be reused by other presubmit checks.""" |
| 6 | 6 |
| 7 ### Description checks | 7 ### Description checks |
| 8 | 8 |
| 9 def CheckChangeHasTestField(input_api, output_api): | 9 def CheckChangeHasTestField(input_api, output_api): |
| 10 """Requires that the changelist have a TEST= field.""" | 10 """Requires that the changelist have a TEST= field.""" |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 | 342 |
| 343 ### Other checks | 343 ### Other checks |
| 344 | 344 |
| 345 def CheckDoNotSubmit(input_api, output_api): | 345 def CheckDoNotSubmit(input_api, output_api): |
| 346 return ( | 346 return ( |
| 347 CheckDoNotSubmitInDescription(input_api, output_api) + | 347 CheckDoNotSubmitInDescription(input_api, output_api) + |
| 348 CheckDoNotSubmitInFiles(input_api, output_api) | 348 CheckDoNotSubmitInFiles(input_api, output_api) |
| 349 ) | 349 ) |
| 350 | 350 |
| 351 | 351 |
| 352 def CheckTreeIsOpen(input_api, output_api, url, closed): | 352 def CheckTreeIsOpen(input_api, output_api, |
| 353 """Checks that an url's content doesn't match a regexp that would mean that | 353 url=None, closed=None, json_url=None): |
| 354 the tree is closed.""" | 354 """Check whether to allow commit without prompt. |
| 355 |
| 356 Supports two styles: |
| 357 1. Checks that an url's content doesn't match a regexp that would mean that |
| 358 the tree is closed. (old) |
| 359 2. Check the json_url to decide whether to allow commit without prompt. |
| 360 Args: |
| 361 input_api: input related apis. |
| 362 output_api: output related apis. |
| 363 url: url to use for regex based tree status. |
| 364 closed: regex to match for closed status. |
| 365 json_url: url to download json style status. |
| 366 """ |
| 355 if not input_api.is_committing: | 367 if not input_api.is_committing: |
| 356 return [] | 368 return [] |
| 357 try: | 369 try: |
| 358 connection = input_api.urllib2.urlopen(url) | 370 if json_url: |
| 359 status = connection.read() | 371 connection = input_api.urllib2.urlopen(json_url) |
| 360 connection.close() | 372 status = input_api.json.loads(connection.read()) |
| 361 if input_api.re.match(closed, status, input_api.re.IGNORECASE): | 373 connection.close() |
| 362 long_text = status + '\n' + url | 374 if not status['can_commit_freely']: |
| 363 return [output_api.PresubmitError('The tree is closed dude!', | 375 short_text = 'Tree state is: ' + status['general_state'] |
| 364 long_text=long_text)] | 376 long_text = status['message'] + '\n' + json_url |
| 377 return [output_api.PresubmitError(short_text, long_text=long_text)] |
| 378 else: |
| 379 # TODO(bradnelson): drop this once all users are gone. |
| 380 connection = input_api.urllib2.urlopen(url) |
| 381 status = connection.read() |
| 382 connection.close() |
| 383 if input_api.re.match(closed, status): |
| 384 long_text = status + '\n' + url |
| 385 return [output_api.PresubmitError('The tree is closed.', |
| 386 long_text=long_text)] |
| 365 except IOError: | 387 except IOError: |
| 366 pass | 388 pass |
| 367 return [] | 389 return [] |
| 368 | 390 |
| 369 | 391 |
| 370 def RunPythonUnitTests(input_api, output_api, unit_tests): | 392 def RunPythonUnitTests(input_api, output_api, unit_tests): |
| 371 """Run the unit tests out of process, capture the output and use the result | 393 """Run the unit tests out of process, capture the output and use the result |
| 372 code to determine success. | 394 code to determine success. |
| 373 """ | 395 """ |
| 374 # We don't want to hinder users from uploading incomplete patches. | 396 # We don't want to hinder users from uploading incomplete patches. |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 pending_builds_len = len(builder.get('pending_builds', [])) | 518 pending_builds_len = len(builder.get('pending_builds', [])) |
| 497 if pending_builds_len > max_pendings: | 519 if pending_builds_len > max_pendings: |
| 498 out.append('%s has %d build(s) pending' % | 520 out.append('%s has %d build(s) pending' % |
| 499 (builder_name, pending_builds_len)) | 521 (builder_name, pending_builds_len)) |
| 500 if out: | 522 if out: |
| 501 return [output_api.PresubmitPromptWarning( | 523 return [output_api.PresubmitPromptWarning( |
| 502 'Build(s) pending. It is suggested to wait that no more than %d ' | 524 'Build(s) pending. It is suggested to wait that no more than %d ' |
| 503 'builds are pending.' % max_pendings, | 525 'builds are pending.' % max_pendings, |
| 504 long_text='\n'.join(out))] | 526 long_text='\n'.join(out))] |
| 505 return [] | 527 return [] |
| OLD | NEW |