diff --git a/presubmit_support.py b/presubmit_support.py index 3239d7b2e..814d3fc37 100755 --- a/presubmit_support.py +++ b/presubmit_support.py @@ -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) diff --git a/tests/presubmit_unittest.py b/tests/presubmit_unittest.py index 13145493e..87ba8e531 100755 --- a/tests/presubmit_unittest.py +++ b/tests/presubmit_unittest.py @@ -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'),