| OLD | NEW |
| 1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2013 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 | 5 |
| 6 """Top-level presubmit script for Skia. | 6 """Top-level presubmit script for Skia. |
| 7 | 7 |
| 8 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts | 8 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts |
| 9 for more details about the presubmit API built into gcl. | 9 for more details about the presubmit API built into gcl. |
| 10 """ | 10 """ |
| (...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 output_api.PresubmitNotifyResult( | 430 output_api.PresubmitNotifyResult( |
| 431 'Trybots do not yet work for non-master branches. ' | 431 'Trybots do not yet work for non-master branches. ' |
| 432 'Automatically added \'NOTRY=true\' to the CL\'s description')) | 432 'Automatically added \'NOTRY=true\' to the CL\'s description')) |
| 433 if not re.search( | 433 if not re.search( |
| 434 r'^NOPRESUBMIT=true$', new_description, re.M | re.I): | 434 r'^NOPRESUBMIT=true$', new_description, re.M | re.I): |
| 435 new_description += "\nNOPRESUBMIT=true" | 435 new_description += "\nNOPRESUBMIT=true" |
| 436 results.append( | 436 results.append( |
| 437 output_api.PresubmitNotifyResult( | 437 output_api.PresubmitNotifyResult( |
| 438 'Branch changes do not run the presubmit checks.')) | 438 'Branch changes do not run the presubmit checks.')) |
| 439 | 439 |
| 440 # Automatically set CQ_EXTRA_TRYBOTS if any of the changed files here begin | 440 # Automatically set CQ_INCLUDE_TRYBOTS if any of the changed files here |
| 441 # with the paths of interest. | 441 # begin with the paths of interest. |
| 442 cq_master_to_trybots = collections.defaultdict(set) | 442 cq_master_to_trybots = collections.defaultdict(set) |
| 443 for affected_file in change.AffectedFiles(): | 443 for affected_file in change.AffectedFiles(): |
| 444 affected_file_path = affected_file.LocalPath() | 444 affected_file_path = affected_file.LocalPath() |
| 445 for path_prefix, extra_bots in PATH_PREFIX_TO_EXTRA_TRYBOTS.iteritems(): | 445 for path_prefix, extra_bots in PATH_PREFIX_TO_EXTRA_TRYBOTS.iteritems(): |
| 446 if affected_file_path.startswith(path_prefix): | 446 if affected_file_path.startswith(path_prefix): |
| 447 results.append( | 447 results.append( |
| 448 output_api.PresubmitNotifyResult( | 448 output_api.PresubmitNotifyResult( |
| 449 'Your CL modifies the path %s.\nAutomatically adding %s to ' | 449 'Your CL modifies the path %s.\nAutomatically adding %s to ' |
| 450 'the CL description.' % (affected_file_path, extra_bots))) | 450 'the CL description.' % (affected_file_path, extra_bots))) |
| 451 _MergeCQExtraTrybotsMaps( | 451 _MergeCQExtraTrybotsMaps( |
| 452 cq_master_to_trybots, _GetCQExtraTrybotsMap(extra_bots)) | 452 cq_master_to_trybots, _GetCQExtraTrybotsMap(extra_bots)) |
| 453 if cq_master_to_trybots: | 453 if cq_master_to_trybots: |
| 454 new_description = _AddCQExtraTrybotsToDesc( | 454 new_description = _AddCQExtraTrybotsToDesc( |
| 455 cq_master_to_trybots, new_description) | 455 cq_master_to_trybots, new_description) |
| 456 | 456 |
| 457 # If the description has changed update it. | 457 # If the description has changed update it. |
| 458 if new_description != original_description: | 458 if new_description != original_description: |
| 459 rietveld_obj.update_description(issue, new_description) | 459 rietveld_obj.update_description(issue, new_description) |
| 460 | 460 |
| 461 return results | 461 return results |
| 462 | 462 |
| 463 | 463 |
| 464 def _AddCQExtraTrybotsToDesc(cq_master_to_trybots, description): | 464 def _AddCQExtraTrybotsToDesc(cq_master_to_trybots, description): |
| 465 """Adds the specified master and trybots to the CQ_EXTRA_TRYBOTS keyword. | 465 """Adds the specified master and trybots to the CQ_INCLUDE_TRYBOTS keyword. |
| 466 | 466 |
| 467 If the keyword already exists in the description then it appends to it only | 467 If the keyword already exists in the description then it appends to it only |
| 468 if the specified values do not already exist. | 468 if the specified values do not already exist. |
| 469 If the keyword does not exist then it creates a new section in the | 469 If the keyword does not exist then it creates a new section in the |
| 470 description. | 470 description. |
| 471 """ | 471 """ |
| 472 match = re.search(r'^CQ_EXTRA_TRYBOTS=(.*)$', description, re.M | re.I) | 472 match = re.search(r'^CQ_INCLUDE_TRYBOTS=(.*)$', description, re.M | re.I) |
| 473 if match: | 473 if match: |
| 474 original_trybots_map = _GetCQExtraTrybotsMap(match.group(1)) | 474 original_trybots_map = _GetCQExtraTrybotsMap(match.group(1)) |
| 475 _MergeCQExtraTrybotsMaps(cq_master_to_trybots, original_trybots_map) | 475 _MergeCQExtraTrybotsMaps(cq_master_to_trybots, original_trybots_map) |
| 476 new_description = description.replace( | 476 new_description = description.replace( |
| 477 match.group(0), _GetCQExtraTrybotsStr(cq_master_to_trybots)) | 477 match.group(0), _GetCQExtraTrybotsStr(cq_master_to_trybots)) |
| 478 else: | 478 else: |
| 479 new_description = description + "\n%s" % ( | 479 new_description = description + "\n%s" % ( |
| 480 _GetCQExtraTrybotsStr(cq_master_to_trybots)) | 480 _GetCQExtraTrybotsStr(cq_master_to_trybots)) |
| 481 return new_description | 481 return new_description |
| 482 | 482 |
| 483 | 483 |
| 484 def _MergeCQExtraTrybotsMaps(dest_map, map_to_be_consumed): | 484 def _MergeCQExtraTrybotsMaps(dest_map, map_to_be_consumed): |
| 485 """Merges two maps of masters to trybots into one.""" | 485 """Merges two maps of masters to trybots into one.""" |
| 486 for master, trybots in map_to_be_consumed.iteritems(): | 486 for master, trybots in map_to_be_consumed.iteritems(): |
| 487 dest_map[master].update(trybots) | 487 dest_map[master].update(trybots) |
| 488 return dest_map | 488 return dest_map |
| 489 | 489 |
| 490 | 490 |
| 491 def _GetCQExtraTrybotsMap(cq_extra_trybots_str): | 491 def _GetCQExtraTrybotsMap(cq_extra_trybots_str): |
| 492 """Parses the CQ_EXTRA_TRYBOTS str and returns a map of masters to trybots.""" | 492 """Parses CQ_INCLUDE_TRYBOTS str and returns a map of masters to trybots.""" |
| 493 cq_master_to_trybots = collections.defaultdict(set) | 493 cq_master_to_trybots = collections.defaultdict(set) |
| 494 for section in cq_extra_trybots_str.split(';'): | 494 for section in cq_extra_trybots_str.split(';'): |
| 495 if section: | 495 if section: |
| 496 master, bots = section.split(':') | 496 master, bots = section.split(':') |
| 497 cq_master_to_trybots[master].update(bots.split(',')) | 497 cq_master_to_trybots[master].update(bots.split(',')) |
| 498 return cq_master_to_trybots | 498 return cq_master_to_trybots |
| 499 | 499 |
| 500 | 500 |
| 501 def _GetCQExtraTrybotsStr(cq_master_to_trybots): | 501 def _GetCQExtraTrybotsStr(cq_master_to_trybots): |
| 502 """Constructs the CQ_EXTRA_TRYBOTS str from a map of masters to trybots.""" | 502 """Constructs the CQ_INCLUDE_TRYBOTS str from a map of masters to trybots.""" |
| 503 sections = [] | 503 sections = [] |
| 504 for master, trybots in cq_master_to_trybots.iteritems(): | 504 for master, trybots in cq_master_to_trybots.iteritems(): |
| 505 sections.append('%s:%s' % (master, ','.join(trybots))) | 505 sections.append('%s:%s' % (master, ','.join(trybots))) |
| 506 return 'CQ_EXTRA_TRYBOTS=%s' % ';'.join(sections) | 506 return 'CQ_INCLUDE_TRYBOTS=%s' % ';'.join(sections) |
| 507 | 507 |
| 508 | 508 |
| 509 def CheckChangeOnCommit(input_api, output_api): | 509 def CheckChangeOnCommit(input_api, output_api): |
| 510 """Presubmit checks for the change on commit. | 510 """Presubmit checks for the change on commit. |
| 511 | 511 |
| 512 The following are the presubmit checks: | 512 The following are the presubmit checks: |
| 513 * Check change has one and only one EOL. | 513 * Check change has one and only one EOL. |
| 514 * Ensures that the Skia tree is open in | 514 * Ensures that the Skia tree is open in |
| 515 http://skia-tree-status.appspot.com/. Shows a warning if it is in 'Caution' | 515 http://skia-tree-status.appspot.com/. Shows a warning if it is in 'Caution' |
| 516 state and an error if it is in 'Closed' state. | 516 state and an error if it is in 'Closed' state. |
| 517 """ | 517 """ |
| 518 results = [] | 518 results = [] |
| 519 results.extend(_CommonChecks(input_api, output_api)) | 519 results.extend(_CommonChecks(input_api, output_api)) |
| 520 results.extend( | 520 results.extend( |
| 521 _CheckTreeStatus(input_api, output_api, json_url=( | 521 _CheckTreeStatus(input_api, output_api, json_url=( |
| 522 SKIA_TREE_STATUS_URL + '/banner-status?format=json'))) | 522 SKIA_TREE_STATUS_URL + '/banner-status?format=json'))) |
| 523 results.extend(_CheckLGTMsForPublicAPI(input_api, output_api)) | 523 results.extend(_CheckLGTMsForPublicAPI(input_api, output_api)) |
| 524 results.extend(_CheckOwnerIsInAuthorsFile(input_api, output_api)) | 524 results.extend(_CheckOwnerIsInAuthorsFile(input_api, output_api)) |
| 525 return results | 525 return results |
| OLD | NEW |