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 | 7 |
8 ### Description checks | 8 ### Description checks |
9 | 9 |
10 def CheckChangeHasTestField(input_api, output_api): | 10 def CheckChangeHasTestField(input_api, output_api): |
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
734 return [output_api.PresubmitError( | 734 return [output_api.PresubmitError( |
735 "OWNERS check failed: this change has no Rietveld issue number, so " | 735 "OWNERS check failed: this change has no Rietveld issue number, so " |
736 "we can't check it for approvals.")] | 736 "we can't check it for approvals.")] |
737 | 737 |
738 affected_files = set([f.LocalPath() for f in | 738 affected_files = set([f.LocalPath() for f in |
739 input_api.change.AffectedFiles(file_filter=source_file_filter)]) | 739 input_api.change.AffectedFiles(file_filter=source_file_filter)]) |
740 | 740 |
741 owners_db = input_api.owners_db | 741 owners_db = input_api.owners_db |
742 owner_email, approvers = _RietveldOwnerAndApprovers(input_api, | 742 owner_email, approvers = _RietveldOwnerAndApprovers(input_api, |
743 owners_db.email_regexp) | 743 owners_db.email_regexp) |
| 744 if not owner_email: |
| 745 return [output_api.PresubmitWarning( |
| 746 'The issue was not uploaded so you have no OWNER approval.')] |
| 747 |
744 approvers_plus_owner = approvers.union(set([owner_email])) | 748 approvers_plus_owner = approvers.union(set([owner_email])) |
745 | 749 |
746 missing_files = owners_db.files_not_covered_by(affected_files, | 750 missing_files = owners_db.files_not_covered_by(affected_files, |
747 approvers_plus_owner) | 751 approvers_plus_owner) |
748 if missing_files: | 752 if missing_files: |
749 return [output_api.PresubmitError('Missing LGTM from an OWNER for: %s' % | 753 return [output_api.PresubmitError('Missing LGTM from an OWNER for: %s' % |
750 ','.join(missing_files))] | 754 ','.join(missing_files))] |
751 | 755 |
752 if not approvers: | 756 if not approvers: |
753 return [output_api.PresubmitError('Missing LGTM from someone other than %s' | 757 return [output_api.PresubmitError('Missing LGTM from someone other than %s' |
754 % owner_email)] | 758 % owner_email)] |
755 return [] | 759 return [] |
756 | 760 |
757 | 761 |
758 def _RietveldOwnerAndApprovers(input_api, email_regexp): | 762 def _RietveldOwnerAndApprovers(input_api, email_regexp): |
759 """Return the owner and approvers of a change, if any.""" | 763 """Return the owner and approvers of a change, if any.""" |
760 # TODO(dpranke): Should figure out if input_api.host_url is supposed to | 764 if not input_api.change.issue: |
761 # be a host or a scheme+host and normalize it there. | 765 return None, None |
762 host = input_api.host_url | 766 |
763 if not host.startswith('http://') and not host.startswith('https://'): | 767 issue_props = input_api.rietveld.get_issue_properties( |
764 host = 'http://' + host | 768 int(input_api.change.issue), True) |
765 url = '%s/api/%s?messages=true' % (host, input_api.change.issue) | |
766 issue_props = input_api.json.load(input_api.urllib2.urlopen(url)) | |
767 owner_email = issue_props['owner_email'] | 769 owner_email = issue_props['owner_email'] |
768 | 770 |
769 def match_reviewer(r): | 771 def match_reviewer(r): |
770 return email_regexp.match(r) and r != owner_email | 772 return email_regexp.match(r) and r != owner_email |
771 | 773 |
772 messages = issue_props.get('messages', []) | 774 messages = issue_props.get('messages', []) |
773 approvers = set( | 775 approvers = set( |
774 m['sender'] for m in messages | 776 m['sender'] for m in messages |
775 if m.get('approval') and match_reviewer(m['sender'])) | 777 if m.get('approval') and match_reviewer(m['sender'])) |
776 | 778 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 results.extend(input_api.canned_checks.CheckChangeSvnEolStyle( | 912 results.extend(input_api.canned_checks.CheckChangeSvnEolStyle( |
911 input_api, output_api, source_file_filter=text_files)) | 913 input_api, output_api, source_file_filter=text_files)) |
912 snapshot("checking svn mime types") | 914 snapshot("checking svn mime types") |
913 results.extend(input_api.canned_checks.CheckSvnForCommonMimeTypes( | 915 results.extend(input_api.canned_checks.CheckSvnForCommonMimeTypes( |
914 input_api, output_api)) | 916 input_api, output_api)) |
915 snapshot("checking license") | 917 snapshot("checking license") |
916 results.extend(input_api.canned_checks.CheckLicense( | 918 results.extend(input_api.canned_checks.CheckLicense( |
917 input_api, output_api, license_header, source_file_filter=sources)) | 919 input_api, output_api, license_header, source_file_filter=sources)) |
918 snapshot("done") | 920 snapshot("done") |
919 return results | 921 return results |
OLD | NEW |