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

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

Loading…
Cancel
Save