Add PresubmitPromptOrNotify helper.

PresubmitPromptOrNotify prints the message and prompts the user only
if the presubmit is on upload, not commit.

This is useful to provide upload-time sanity checks without blocking
the CL from being landed via the commit-queue.


Review URL: https://chromiumcodereview.appspot.com/12676031

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@190711 0039d316-1c4b-4281-b951-d872f2087c98
experimental/szager/collated-output
wez@chromium.org 13 years ago
parent 43e34f0ba8
commit a6d011e8dc

@ -104,9 +104,12 @@ class PresubmitOutput(object):
class OutputApi(object):
"""This class (more like a module) gets passed to presubmit scripts so that
they can specify various types of results.
"""An instance of OutputApi gets passed to presubmit scripts so that they
can output various types of results.
"""
def __init__(self, is_committing):
self.is_committing = is_committing
class PresubmitResult(object):
"""Base class for result objects."""
fatal = False
@ -163,6 +166,12 @@ class OutputApi(object):
"""Just print something to the screen -- but it's not even a warning."""
pass
def PresubmitPromptOrNotify(self, *args, **kwargs):
"""Warn the user when uploading, but only notify if committing."""
if self.is_committing:
return self.PresubmitNotifyResult(*args, **kwargs)
return self.PresubmitPromptWarning(*args, **kwargs)
class MailTextResult(PresubmitResult):
"""A warning that should be included in the review request email."""
def __init__(self, *args, **kwargs):
@ -1020,7 +1029,7 @@ class PresubmitExecuter(object):
else:
function_name = 'CheckChangeOnUpload'
if function_name in context:
context['__args'] = (input_api, OutputApi())
context['__args'] = (input_api, OutputApi(self.committing))
logging.debug('Running %s in %s' % (function_name, presubmit_path))
result = eval(function_name + '(*__args)', context)
logging.debug('Running %s done.' % function_name)

@ -1275,16 +1275,18 @@ class InputApiUnittest(PresubmitTestsBase):
input_api.ReadFile(fileobj, 'x')
class OuputApiUnittest(PresubmitTestsBase):
class OutputApiUnittest(PresubmitTestsBase):
"""Tests presubmit.OutputApi."""
def testMembersChanged(self):
self.mox.ReplayAll()
members = [
'MailTextResult', 'PresubmitAddReviewers', 'PresubmitError',
'PresubmitNotifyResult', 'PresubmitPromptWarning', 'PresubmitResult',
'PresubmitNotifyResult', 'PresubmitPromptWarning',
'PresubmitPromptOrNotify', 'PresubmitResult', 'is_committing',
]
# If this test fails, you should add the relevant test.
self.compareMembers(presubmit.OutputApi(), members)
self.compareMembers(presubmit.OutputApi(False), members)
def testOutputApiBasics(self):
self.mox.ReplayAll()
@ -1330,19 +1332,32 @@ class OuputApiUnittest(PresubmitTestsBase):
self.failUnless(output.should_continue())
self.failUnless(output.getvalue().count('???'))
output = presubmit.PresubmitOutput(input_stream=StringIO.StringIO('y'))
output = presubmit.PresubmitOutput(input_stream=StringIO.StringIO('\n'))
presubmit.OutputApi.PresubmitPromptWarning('???').handle(output)
output.prompt_yes_no('prompt: ')
self.failIf(output.should_continue())
self.failUnless(output.getvalue().count('???'))
output_api = presubmit.OutputApi(True)
output = presubmit.PresubmitOutput(input_stream=StringIO.StringIO('y'))
output_api.PresubmitPromptOrNotify('???').handle(output)
output.prompt_yes_no('prompt: ')
self.failUnless(output.should_continue())
self.failUnless(output.getvalue().count('???'))
output_api = presubmit.OutputApi(False)
output = presubmit.PresubmitOutput(input_stream=StringIO.StringIO('y'))
output_api.PresubmitPromptOrNotify('???').handle(output)
self.failUnless(output.should_continue())
self.failUnless(output.getvalue().count('???'))
output_api = presubmit.OutputApi(True)
output = presubmit.PresubmitOutput(input_stream=StringIO.StringIO('\n'))
presubmit.OutputApi.PresubmitPromptWarning('???').handle(output)
output_api.PresubmitPromptOrNotify('???').handle(output)
output.prompt_yes_no('prompt: ')
self.failIf(output.should_continue())
self.failUnless(output.getvalue().count('???'))
class AffectedFileUnittest(PresubmitTestsBase):
def testMembersChanged(self):
self.mox.ReplayAll()
@ -2003,7 +2018,7 @@ class CannedChecksUnittest(PresubmitTestsBase):
def testCheckSvnForCommonMimeTypes(self):
self.mox.StubOutWithMock(presubmit_canned_checks, 'CheckSvnProperty')
input_api = self.MockInputApi(None, False)
output_api = presubmit.OutputApi()
output_api = presubmit.OutputApi(False)
A = lambda x: presubmit.AffectedFile(x, 'M', self.fake_root_dir)
files = [
A('a.pdf'), A('b.bmp'), A('c.gif'), A('d.png'), A('e.jpg'), A('f.jpe'),

Loading…
Cancel
Save