Commit 08108e54 authored by Akihiro Ota's avatar Akihiro Ota Committed by Commit Bot

Presubmit: Check the commit description for AX-Relnotes field

In addition to checking the commit footer, we should also check the
commit description for the AX-Relnotes field.

Bug: N/A

Change-Id: Ie9839bbf02b84d97ace0c60e8b972d048bbe7eb6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2198931
Commit-Queue: Akihiro Ota <akihiroota@chromium.org>
Reviewed-by: default avatarDirk Pranke <dpranke@chromium.org>
Reviewed-by: default avatarChris Hall <chrishall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#770600}
parent 4d28a072
...@@ -4310,8 +4310,16 @@ def _CheckAccessibilityRelnotesField(input_api, output_api): ...@@ -4310,8 +4310,16 @@ def _CheckAccessibilityRelnotesField(input_api, output_api):
if not any(input_api.AffectedFiles(file_filter=FileFilter)): if not any(input_api.AffectedFiles(file_filter=FileFilter)):
return [] return []
relnotes = input_api.change.GitFootersFromDescription().get('AX-Relnotes', []) # AX-Relnotes can appear in either the description or the footer.
if relnotes: # When searching the description, require 'AX-Relnotes:' to appear at the
# beginning of a line.
ax_regex = input_api.re.compile('ax-relnotes[:=]')
description_has_relnotes = any(ax_regex.match(line)
for line in input_api.change.DescriptionText().lower().splitlines())
footer_relnotes = input_api.change.GitFootersFromDescription().get(
'AX-Relnotes', [])
if description_has_relnotes or footer_relnotes:
return [] return []
# TODO(chrishall): link to Relnotes documentation in message. # TODO(chrishall): link to Relnotes documentation in message.
......
...@@ -1028,6 +1028,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase): ...@@ -1028,6 +1028,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase):
mock_output_api = MockOutputApi() mock_output_api = MockOutputApi()
mock_input_api.files = [MockAffectedFile('ui/accessibility/foo.bar', [''])] mock_input_api.files = [MockAffectedFile('ui/accessibility/foo.bar', [''])]
mock_input_api.change.DescriptionText = lambda : 'Commit description'
mock_input_api.change.footers['AX-Relnotes'] = [ mock_input_api.change.footers['AX-Relnotes'] = [
'Important user facing change'] 'Important user facing change']
...@@ -1046,6 +1047,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase): ...@@ -1046,6 +1047,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase):
MockAffectedFile('ui/accessibility/foo.bar', ['']), MockAffectedFile('ui/accessibility/foo.bar', ['']),
MockAffectedFile('some/other/file', ['']) MockAffectedFile('some/other/file', [''])
] ]
mock_input_api.change.DescriptionText = lambda : 'Commit description'
msgs = PRESUBMIT._CheckAccessibilityRelnotesField( msgs = PRESUBMIT._CheckAccessibilityRelnotesField(
mock_input_api, mock_output_api) mock_input_api, mock_output_api)
...@@ -1065,6 +1067,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase): ...@@ -1065,6 +1067,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase):
MockAffectedFile('some/file', ['']), MockAffectedFile('some/file', ['']),
MockAffectedFile('some/other/file', ['']) MockAffectedFile('some/other/file', [''])
] ]
mock_input_api.change.DescriptionText = lambda : 'Commit description'
msgs = PRESUBMIT._CheckAccessibilityRelnotesField( msgs = PRESUBMIT._CheckAccessibilityRelnotesField(
mock_input_api, mock_output_api) mock_input_api, mock_output_api)
...@@ -1097,6 +1100,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase): ...@@ -1097,6 +1100,7 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase):
mock_input_api.files = [ mock_input_api.files = [
MockAffectedFile(testFile, ['']) MockAffectedFile(testFile, [''])
] ]
mock_input_api.change.DescriptionText = lambda : 'Commit description'
msgs = PRESUBMIT._CheckAccessibilityRelnotesField( msgs = PRESUBMIT._CheckAccessibilityRelnotesField(
mock_input_api, mock_output_api) mock_input_api, mock_output_api)
...@@ -1107,6 +1111,58 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase): ...@@ -1107,6 +1111,58 @@ class AccessibilityRelnotesFieldTest(unittest.TestCase):
('Missing AX-Relnotes field message not found in errors ' ('Missing AX-Relnotes field message not found in errors '
' for file %s' % (testFile))) ' for file %s' % (testFile)))
# Test that AX-Relnotes field can appear in the commit description (as long
# as it appears at the beginning of a line).
def testRelnotesInCommitDescription(self):
mock_input_api = MockInputApi()
mock_output_api = MockOutputApi()
mock_input_api.files = [
MockAffectedFile('ui/accessibility/foo.bar', ['']),
]
mock_input_api.change.DescriptionText = lambda : ('Description:\n' +
'AX-Relnotes: solves all accessibility issues forever')
msgs = PRESUBMIT._CheckAccessibilityRelnotesField(
mock_input_api, mock_output_api)
self.assertEqual(0, len(msgs),
'Expected %d messages, found %d: %s'
% (0, len(msgs), msgs))
# Test that we don't match AX-Relnotes if it appears in the middle of a line.
def testRelnotesMustAppearAtBeginningOfLine(self):
mock_input_api = MockInputApi()
mock_output_api = MockOutputApi()
mock_input_api.files = [
MockAffectedFile('ui/accessibility/foo.bar', ['']),
]
mock_input_api.change.DescriptionText = lambda : ('Description:\n' +
'This change has no AX-Relnotes: we should print a warning')
msgs = PRESUBMIT._CheckAccessibilityRelnotesField(
mock_input_api, mock_output_api)
self.assertTrue("Missing 'AX-Relnotes:' field" in msgs[0].message,
'Missing AX-Relnotes field message not found in errors')
# Tests that the AX-Relnotes field can be lowercase and use a '=' in place
# of a ':'.
def testRelnotesLowercaseWithEqualSign(self):
mock_input_api = MockInputApi()
mock_output_api = MockOutputApi()
mock_input_api.files = [
MockAffectedFile('ui/accessibility/foo.bar', ['']),
]
mock_input_api.change.DescriptionText = lambda : ('Description:\n' +
'ax-relnotes= this is a valid format for accessibiliy relnotes')
msgs = PRESUBMIT._CheckAccessibilityRelnotesField(
mock_input_api, mock_output_api)
self.assertEqual(0, len(msgs),
'Expected %d messages, found %d: %s'
% (0, len(msgs), msgs))
class AndroidDeprecatedTestAnnotationTest(unittest.TestCase): class AndroidDeprecatedTestAnnotationTest(unittest.TestCase):
def testCheckAndroidTestAnnotationUsage(self): def testCheckAndroidTestAnnotationUsage(self):
mock_input_api = MockInputApi() mock_input_api = MockInputApi()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment