Index: presubmit_canned_checks.py |
diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py |
index af88a39b1e8b35099655b3ac1688edfb33c6171e..e6384fa0c47624bc75f7dec4de6aca9b28a5ce97 100644 |
--- a/presubmit_canned_checks.py |
+++ b/presubmit_canned_checks.py |
@@ -791,17 +791,40 @@ def CheckOwners(input_api, output_api, source_file_filter=None): |
return [] |
+def _GetRietveldIssueProps(input_api, messages): |
+ """Gets the issue properties from rietveld.""" |
+ issue = input_api.change.issue |
+ if issue and input_api.rietveld: |
+ return input_api.rietveld.get_issue_properties( |
+ issue=int(issue), messages=messages) |
+ |
+ |
+def CheckIssueNotClosed(input_api, output_api): |
+ """Verifies issue is not closed. |
+ |
+ We should not be working with a closed review. CQ and dcommit set this bit, |
+ so it is a pretty good indicator of whether an issue has been committed. |
+ """ |
+ issue_props = _GetRietveldIssueProps(input_api=input_api, messages=False) |
+ if issue_props and issue_props['closed']: |
+ return [output_api.PresubmitError( |
+ 'Issue %s is closed. If this issue was already used for a commit,\n' |
+ 'please reset the issue number associated with this branch with:\n' |
+ 'git cl issue 0\n' % issue_props['issue'] |
+ )] |
+ return [] |
+ |
+ |
def _RietveldOwnerAndReviewers(input_api, email_regexp, approval_needed=False): |
"""Return the owner and reviewers of a change, if any. |
If approval_needed is True, only reviewers who have approved the change |
will be returned. |
""" |
- if not input_api.change.issue: |
+ issue_props = _GetRietveldIssueProps(input_api, True) |
+ if not issue_props: |
return None, None |
- issue_props = input_api.rietveld.get_issue_properties( |
- int(input_api.change.issue), True) |
if not approval_needed: |
return issue_props['owner_email'], set(issue_props['reviewers']) |
@@ -940,6 +963,10 @@ def PanProjectChecks(input_api, output_api, |
results.extend(input_api.canned_checks.CheckOwners( |
input_api, output_api, source_file_filter=None)) |
+ snapshot("checking review not closed") |
+ results.extend(input_api.canned_checks.CheckIssueNotClosed( |
+ input_api, output_api)) |
+ |
snapshot("checking long lines") |
results.extend(input_api.canned_checks.CheckLongLines( |
input_api, output_api, source_file_filter=sources)) |