Commit 970c522f authored by dpranke@chromium.org's avatar dpranke@chromium.org

Make git-cl work with OWNERS file hooks properly.

This version calls into presubmit_support directly to support the OWNERS hooks. We do not need both this patch and http://codereview.chromium.org/6646009/

This patch depends on http://codereview.chromium.org/6665018/ .

Review URL: http://codereview.chromium.org/6674014

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@77898 0039d316-1c4b-4281-b951-d872f2087c98
parent 627ea67f
This diff is collapsed.
#!/bin/bash
set -e
. ./test-lib.sh
setup_initsvn
setup_gitsvn
(
set -e
cd git-svn
git config rietveld.server localhost:8080
export EDITOR=$(which true)
git checkout -q -b work
echo "ben@chromium.org" > OWNERS
cat <<END > PRESUBMIT.py
def CheckChangeOnCommit(input_api, output_api):
return input_api.canned_checks.CheckOwners(input_api, output_api)
CheckChangeOnUpload = CheckChangeOnCommit
END
git add OWNERS PRESUBMIT.py ; git commit -q -m "add OWNERS"
test_expect_success "upload succeeds (needs a server running on localhost)" \
"$GIT_CL upload -m test master | grep -q 'Issue created'"
test_expect_success "git-cl status has a suggested reviewer" \
"$GIT_CL status | grep -q 'R=ben@chromium.org'"
test_expect_failure "git-cl dcommit fails w/ missing LGTM" \
"$GIT_CL dcommit"
test_expect_success "git-cl dcommit --tbr succeeds" \
"$GIT_CL dcommit --tbr -f | grep -q -- '--tbr was specified'"
)
SUCCESS=$?
cleanup
if [ $SUCCESS == 0 ]; then
echo PASS
fi
#!/bin/bash
set -e
. ./test-lib.sh
setup_initsvn
setup_gitsvn
(
set -e
cd git-svn
cat > .git/hooks/post-cl-dcommit << _EOF
#!/bin/bash
git branch -m COMMITTED
_EOF
chmod +x .git/hooks/post-cl-dcommit
git config rietveld.server localhost:1
git checkout -q --track -b work
echo "some work done" >> test
git add test; git commit -q -m "work"
test_expect_success "dcommitted code" \
"$GIT_CL dcommit -f --tbr --bypass-hooks -m 'dcommit'"
test_expect_success "post-cl-dcommit hook executed" \
"git symbolic-ref HEAD | grep -q COMMITTED"
)
SUCCESS=$?
cleanup
if [ $SUCCESS == 0 ]; then
echo PASS
fi
...@@ -626,10 +626,13 @@ def CheckBuildbotPendingBuilds(input_api, output_api, url, max_pendings, ...@@ -626,10 +626,13 @@ def CheckBuildbotPendingBuilds(input_api, output_api, url, max_pendings,
return [] return []
def CheckOwners(input_api, output_api, source_file_filter=None): def CheckOwners(input_api, output_api, email_regexp=None,
source_file_filter=None):
affected_files = set([f.LocalPath() for f in affected_files = set([f.LocalPath() for f in
input_api.change.AffectedFiles(source_file_filter)]) input_api.change.AffectedFiles(source_file_filter)])
owners_db = input_api.owners_db owners_db = input_api.owners_db
if email_regexp:
owners_db.email_regexp = input_api.re.compile(email_regexp)
if input_api.is_committing and input_api.tbr: if input_api.is_committing and input_api.tbr:
return [output_api.PresubmitNotifyResult( return [output_api.PresubmitNotifyResult(
......
...@@ -154,19 +154,12 @@ class OutputApi(object): ...@@ -154,19 +154,12 @@ class OutputApi(object):
"""Whether this presubmit result should result in a prompt warning.""" """Whether this presubmit result should result in a prompt warning."""
return False return False
def IsMessage(self):
"""Whether this result contains anything needing to be displayed."""
return True
class PresubmitAddText(PresubmitResult): class PresubmitAddText(PresubmitResult):
"""Propagates a line of text back to the caller.""" """Propagates a line of text back to the caller."""
def __init__(self, message, items=None, long_text=''): def __init__(self, message, items=None, long_text=''):
super(OutputApi.PresubmitAddText, self).__init__("ADD: " + message, super(OutputApi.PresubmitAddText, self).__init__("ADD: " + message,
items, long_text) items, long_text)
def IsMessage(self):
return False
class PresubmitError(PresubmitResult): class PresubmitError(PresubmitResult):
"""A hard presubmit error.""" """A hard presubmit error."""
def IsFatal(self): def IsFatal(self):
...@@ -229,14 +222,15 @@ class InputApi(object): ...@@ -229,14 +222,15 @@ class InputApi(object):
# TODO(dpranke): Update callers to pass in tbr, host_url, remove # TODO(dpranke): Update callers to pass in tbr, host_url, remove
# default arguments. # default arguments.
def __init__(self, change, presubmit_path, is_committing, tbr=False, def __init__(self, change, presubmit_path, is_committing, tbr, host_url=None):
host_url='http://codereview.chromium.org'):
"""Builds an InputApi object. """Builds an InputApi object.
Args: Args:
change: A presubmit.Change object. change: A presubmit.Change object.
presubmit_path: The path to the presubmit script being processed. presubmit_path: The path to the presubmit script being processed.
is_committing: True if the change is about to be committed. is_committing: True if the change is about to be committed.
tbr: True if '--tbr' was passed to skip any reviewer/owner checks
host_url: scheme, host, and path of rietveld instance
""" """
# Version number of the presubmit_support script. # Version number of the presubmit_support script.
self.version = [int(x) for x in __version__.split('.')] self.version = [int(x) for x in __version__.split('.')]
...@@ -244,6 +238,7 @@ class InputApi(object): ...@@ -244,6 +238,7 @@ class InputApi(object):
self.host_url = host_url self.host_url = host_url
self.is_committing = is_committing self.is_committing = is_committing
self.tbr = tbr self.tbr = tbr
self.host_url = host_url or 'http://codereview.chromium.org'
# We expose various modules and functions as attributes of the input_api # We expose various modules and functions as attributes of the input_api
# so that presubmit scripts don't have to import them. # so that presubmit scripts don't have to import them.
...@@ -935,14 +930,19 @@ def DoGetTrySlaves(changed_files, ...@@ -935,14 +930,19 @@ def DoGetTrySlaves(changed_files,
class PresubmitExecuter(object): class PresubmitExecuter(object):
def __init__(self, change, committing): def __init__(self, change, committing, tbr, host_url):
""" """
Args: Args:
change: The Change object. change: The Change object.
committing: True if 'gcl commit' is running, False if 'gcl upload' is. committing: True if 'gcl commit' is running, False if 'gcl upload' is.
tbr: True if '--tbr' was passed to skip any reviewer/owner checks
host_url: scheme, host, and path of rietveld instance
(or None for default)
""" """
self.change = change self.change = change
self.committing = committing self.committing = committing
self.tbr = tbr
self.host_url = host_url
def ExecPresubmitScript(self, script_text, presubmit_path): def ExecPresubmitScript(self, script_text, presubmit_path):
"""Executes a single presubmit script. """Executes a single presubmit script.
...@@ -961,7 +961,8 @@ class PresubmitExecuter(object): ...@@ -961,7 +961,8 @@ class PresubmitExecuter(object):
os.chdir(os.path.dirname(presubmit_path)) os.chdir(os.path.dirname(presubmit_path))
# Load the presubmit script into context. # Load the presubmit script into context.
input_api = InputApi(self.change, presubmit_path, self.committing) input_api = InputApi(self.change, presubmit_path, self.committing,
self.tbr, self.host_url)
context = {} context = {}
exec script_text in context exec script_text in context
...@@ -992,14 +993,16 @@ class PresubmitExecuter(object): ...@@ -992,14 +993,16 @@ class PresubmitExecuter(object):
os.chdir(main_path) os.chdir(main_path)
return result return result
# TODO(dpranke): make all callers pass in tbr, host_url?
def DoPresubmitChecks(change, def DoPresubmitChecks(change,
committing, committing,
verbose, verbose,
output_stream, output_stream,
input_stream, input_stream,
default_presubmit, default_presubmit,
may_prompt): may_prompt,
tbr=False,
host_url=None):
"""Runs all presubmit checks that apply to the files in the change. """Runs all presubmit checks that apply to the files in the change.
This finds all PRESUBMIT.py files in directories enclosing the files in the This finds all PRESUBMIT.py files in directories enclosing the files in the
...@@ -1017,6 +1020,9 @@ def DoPresubmitChecks(change, ...@@ -1017,6 +1020,9 @@ def DoPresubmitChecks(change,
input_stream: A stream to read input from the user. input_stream: A stream to read input from the user.
default_presubmit: A default presubmit script to execute in any case. default_presubmit: A default presubmit script to execute in any case.
may_prompt: Enable (y/n) questions on warning or error. may_prompt: Enable (y/n) questions on warning or error.
tbr: was --tbr specified to skip any reviewer/owner checks?
host_url: scheme, host, and port of host to use for rietveld-related
checks
Warning: Warning:
If may_prompt is true, output_stream SHOULD be sys.stdout and input_stream If may_prompt is true, output_stream SHOULD be sys.stdout and input_stream
...@@ -1032,7 +1038,7 @@ def DoPresubmitChecks(change, ...@@ -1032,7 +1038,7 @@ def DoPresubmitChecks(change,
if not presubmit_files and verbose: if not presubmit_files and verbose:
output_stream.write("Warning, no presubmit.py found.\n") output_stream.write("Warning, no presubmit.py found.\n")
results = [] results = []
executer = PresubmitExecuter(change, committing) executer = PresubmitExecuter(change, committing, tbr, host_url)
if default_presubmit: if default_presubmit:
if verbose: if verbose:
output_stream.write("Running default presubmit script.\n") output_stream.write("Running default presubmit script.\n")
...@@ -1064,9 +1070,6 @@ def DoPresubmitChecks(change, ...@@ -1064,9 +1070,6 @@ def DoPresubmitChecks(change,
if items: if items:
output_stream.write('** Presubmit %s **\n' % name) output_stream.write('** Presubmit %s **\n' % name)
for item in items: for item in items:
if not item.IsMessage():
continue
# Access to a protected member XXX of a client class # Access to a protected member XXX of a client class
# pylint: disable=W0212 # pylint: disable=W0212
if not item._Handle(output_stream, input_stream, if not item._Handle(output_stream, input_stream,
......
...@@ -342,7 +342,7 @@ class PresubmitUnittest(PresubmitTestsBase): ...@@ -342,7 +342,7 @@ class PresubmitUnittest(PresubmitTestsBase):
change = presubmit.Change('mychange', '\n'.join(description_lines), change = presubmit.Change('mychange', '\n'.join(description_lines),
self.fake_root_dir, files, 0, 0) self.fake_root_dir, files, 0, 0)
executer = presubmit.PresubmitExecuter(change, False) executer = presubmit.PresubmitExecuter(change, False, False, None)
self.failIf(executer.ExecPresubmitScript('', fake_presubmit)) self.failIf(executer.ExecPresubmitScript('', fake_presubmit))
# No error if no on-upload entry point # No error if no on-upload entry point
self.failIf(executer.ExecPresubmitScript( self.failIf(executer.ExecPresubmitScript(
...@@ -351,7 +351,7 @@ class PresubmitUnittest(PresubmitTestsBase): ...@@ -351,7 +351,7 @@ class PresubmitUnittest(PresubmitTestsBase):
fake_presubmit fake_presubmit
)) ))
executer = presubmit.PresubmitExecuter(change, True) executer = presubmit.PresubmitExecuter(change, True, False, None)
# No error if no on-commit entry point # No error if no on-commit entry point
self.failIf(executer.ExecPresubmitScript( self.failIf(executer.ExecPresubmitScript(
('def CheckChangeOnUpload(input_api, output_api):\n' ('def CheckChangeOnUpload(input_api, output_api):\n'
...@@ -706,7 +706,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -706,7 +706,8 @@ class InputApiUnittest(PresubmitTestsBase):
'version', 'version',
] ]
# If this test fails, you should add the relevant test. # If this test fails, you should add the relevant test.
self.compareMembers(presubmit.InputApi(self.fake_change, './.', False), self.compareMembers(presubmit.InputApi(self.fake_change, './.', False,
False, None),
members) members)
def testDepotToLocalPath(self): def testDepotToLocalPath(self):
...@@ -715,31 +716,32 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -715,31 +716,32 @@ class InputApiUnittest(PresubmitTestsBase):
presubmit.scm.SVN.CaptureInfo('svn:/foo/notfound/burp').AndReturn({}) presubmit.scm.SVN.CaptureInfo('svn:/foo/notfound/burp').AndReturn({})
self.mox.ReplayAll() self.mox.ReplayAll()
path = presubmit.InputApi(self.fake_change, './p', False).DepotToLocalPath( path = presubmit.InputApi(self.fake_change, './p', False, False,
'svn://foo/smurf') None).DepotToLocalPath('svn://foo/smurf')
self.failUnless(path == 'prout') self.failUnless(path == 'prout')
path = presubmit.InputApi(self.fake_change, './p', False).DepotToLocalPath( path = presubmit.InputApi(self.fake_change, './p', False, False,
'svn:/foo/notfound/burp') None).DepotToLocalPath('svn:/foo/notfound/burp')
self.failUnless(path == None) self.failUnless(path == None)
def testLocalToDepotPath(self): def testLocalToDepotPath(self):
presubmit.scm.SVN.CaptureInfo('smurf').AndReturn({'URL': 'svn://foo'}) presubmit.scm.SVN.CaptureInfo('smurf').AndReturn({'URL': 'svn://foo'})
presubmit.scm.SVN.CaptureInfo('notfound-food').AndReturn({}) presubmit.scm.SVN.CaptureInfo('notfound-food').AndReturn({})
self.mox.ReplayAll() self.mox.ReplayAll()
path = presubmit.InputApi(self.fake_change, './p', False).LocalToDepotPath( path = presubmit.InputApi(self.fake_change, './p', False, False,
'smurf') None).LocalToDepotPath('smurf')
self.assertEqual(path, 'svn://foo') self.assertEqual(path, 'svn://foo')
path = presubmit.InputApi(self.fake_change, './p', False).LocalToDepotPath( path = presubmit.InputApi(self.fake_change, './p', False, False,
'notfound-food') None).LocalToDepotPath('notfound-food')
self.failUnless(path == None) self.failUnless(path == None)
def testInputApiConstruction(self): def testInputApiConstruction(self):
self.mox.ReplayAll() self.mox.ReplayAll()
api = presubmit.InputApi(self.fake_change, api = presubmit.InputApi(self.fake_change,
presubmit_path='foo/path/PRESUBMIT.py', presubmit_path='foo/path/PRESUBMIT.py',
is_committing=False) is_committing=False, tbr=False, host_url=None)
self.assertEquals(api.PresubmitLocalPath(), 'foo/path') self.assertEquals(api.PresubmitLocalPath(), 'foo/path')
self.assertEquals(api.change, self.fake_change) self.assertEquals(api.change, self.fake_change)
self.assertEquals(api.host_url, 'http://codereview.chromium.org')
def testInputApiPresubmitScriptFiltering(self): def testInputApiPresubmitScriptFiltering(self):
join = presubmit.os.path.join join = presubmit.os.path.join
...@@ -795,7 +797,7 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -795,7 +797,7 @@ class InputApiUnittest(PresubmitTestsBase):
input_api = presubmit.InputApi(change, input_api = presubmit.InputApi(change,
join(self.fake_root_dir, 'foo', join(self.fake_root_dir, 'foo',
'PRESUBMIT.py'), 'PRESUBMIT.py'),
False) False, False, None)
# Doesn't filter much # Doesn't filter much
got_files = input_api.AffectedFiles() got_files = input_api.AffectedFiles()
self.assertEquals(len(got_files), 7) self.assertEquals(len(got_files), 7)
...@@ -880,7 +882,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -880,7 +882,8 @@ class InputApiUnittest(PresubmitTestsBase):
], ],
), ),
] ]
input_api = presubmit.InputApi(self.fake_change, './PRESUBMIT.py', False) input_api = presubmit.InputApi(self.fake_change, './PRESUBMIT.py', False,
False, None)
self.mox.ReplayAll() self.mox.ReplayAll()
self.assertEqual(len(input_api.DEFAULT_WHITE_LIST), 22) self.assertEqual(len(input_api.DEFAULT_WHITE_LIST), 22)
...@@ -911,7 +914,7 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -911,7 +914,7 @@ class InputApiUnittest(PresubmitTestsBase):
input_api = presubmit.InputApi(change, input_api = presubmit.InputApi(change,
presubmit.os.path.join(self.fake_root_dir, presubmit.os.path.join(self.fake_root_dir,
'PRESUBMIT.py'), 'PRESUBMIT.py'),
False) False, False, None)
got_files = input_api.AffectedSourceFiles(FilterSourceFile) got_files = input_api.AffectedSourceFiles(FilterSourceFile)
self.assertEquals(len(got_files), 2) self.assertEquals(len(got_files), 2)
self.assertEquals(got_files[0].LocalPath(), 'eeaee') self.assertEquals(got_files[0].LocalPath(), 'eeaee')
...@@ -930,7 +933,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -930,7 +933,8 @@ class InputApiUnittest(PresubmitTestsBase):
change = presubmit.SvnChange('mychange', '', self.fake_root_dir, files, 0, change = presubmit.SvnChange('mychange', '', self.fake_root_dir, files, 0,
0) 0)
input_api = presubmit.InputApi(change, './PRESUBMIT.py', False) input_api = presubmit.InputApi(change, './PRESUBMIT.py', False,
False, None)
# Sample usage of overiding the default white and black lists. # Sample usage of overiding the default white and black lists.
got_files = input_api.AffectedSourceFiles( got_files = input_api.AffectedSourceFiles(
lambda x: input_api.FilterSourceFile(x, white_list, black_list)) lambda x: input_api.FilterSourceFile(x, white_list, black_list))
...@@ -970,7 +974,7 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -970,7 +974,7 @@ class InputApiUnittest(PresubmitTestsBase):
presubmit_path = join(self.fake_root_dir, 'isdir', 'PRESUBMIT.py') presubmit_path = join(self.fake_root_dir, 'isdir', 'PRESUBMIT.py')
api = presubmit.InputApi(change=change, api = presubmit.InputApi(change=change,
presubmit_path=presubmit_path, presubmit_path=presubmit_path,
is_committing=True) is_committing=True, tbr=False, host_url=None)
paths_from_api = api.AbsoluteLocalPaths(include_dirs=True) paths_from_api = api.AbsoluteLocalPaths(include_dirs=True)
self.assertEqual(len(paths_from_api), 2) self.assertEqual(len(paths_from_api), 2)
for absolute_paths in [paths_from_change, paths_from_api]: for absolute_paths in [paths_from_change, paths_from_api]:
...@@ -986,7 +990,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -986,7 +990,8 @@ class InputApiUnittest(PresubmitTestsBase):
change = presubmit.Change('mychange', '', self.fake_root_dir, [], 0, 0) change = presubmit.Change('mychange', '', self.fake_root_dir, [], 0, 0)
api = presubmit.InputApi( api = presubmit.InputApi(
change, change,
presubmit.os.path.join(self.fake_root_dir, 'foo', 'PRESUBMIT.py'), True) presubmit.os.path.join(self.fake_root_dir, 'foo', 'PRESUBMIT.py'), True,
False, None)
api.AffectedTextFiles(include_deletes=False) api.AffectedTextFiles(include_deletes=False)
def testReadFileStringDenied(self): def testReadFileStringDenied(self):
...@@ -995,7 +1000,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -995,7 +1000,8 @@ class InputApiUnittest(PresubmitTestsBase):
change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')],
0, 0) 0, 0)
input_api = presubmit.InputApi( input_api = presubmit.InputApi(
change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) change, presubmit.os.path.join(self.fake_root_dir, '/p'), False,
False, None)
self.assertRaises(IOError, input_api.ReadFile, 'boo', 'x') self.assertRaises(IOError, input_api.ReadFile, 'boo', 'x')
def testReadFileStringAccepted(self): def testReadFileStringAccepted(self):
...@@ -1006,7 +1012,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -1006,7 +1012,8 @@ class InputApiUnittest(PresubmitTestsBase):
change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')],
0, 0) 0, 0)
input_api = presubmit.InputApi( input_api = presubmit.InputApi(
change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) change, presubmit.os.path.join(self.fake_root_dir, '/p'), False,
False, None)
input_api.ReadFile(path, 'x') input_api.ReadFile(path, 'x')
def testReadFileAffectedFileDenied(self): def testReadFileAffectedFileDenied(self):
...@@ -1016,7 +1023,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -1016,7 +1023,8 @@ class InputApiUnittest(PresubmitTestsBase):
change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')],
0, 0) 0, 0)
input_api = presubmit.InputApi( input_api = presubmit.InputApi(
change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) change, presubmit.os.path.join(self.fake_root_dir, '/p'), False,
False, None)
self.assertRaises(IOError, input_api.ReadFile, fileobj, 'x') self.assertRaises(IOError, input_api.ReadFile, fileobj, 'x')
def testReadFileAffectedFileAccepted(self): def testReadFileAffectedFileAccepted(self):
...@@ -1028,7 +1036,8 @@ class InputApiUnittest(PresubmitTestsBase): ...@@ -1028,7 +1036,8 @@ class InputApiUnittest(PresubmitTestsBase):
change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')], change = presubmit.Change('foo', 'foo', self.fake_root_dir, [('M', 'AA')],
0, 0) 0, 0)
input_api = presubmit.InputApi( input_api = presubmit.InputApi(
change, presubmit.os.path.join(self.fake_root_dir, '/p'), False) change, presubmit.os.path.join(self.fake_root_dir, '/p'), False,
False, None)
input_api.ReadFile(fileobj, 'x') input_api.ReadFile(fileobj, 'x')
...@@ -1046,23 +1055,17 @@ class OuputApiUnittest(PresubmitTestsBase): ...@@ -1046,23 +1055,17 @@ class OuputApiUnittest(PresubmitTestsBase):
def testOutputApiBasics(self): def testOutputApiBasics(self):
self.mox.ReplayAll() self.mox.ReplayAll()
self.failUnless(presubmit.OutputApi.PresubmitError('').IsFatal()) self.failUnless(presubmit.OutputApi.PresubmitError('').IsFatal())
self.failUnless(presubmit.OutputApi.PresubmitError('').IsMessage())
self.failIf(presubmit.OutputApi.PresubmitError('').ShouldPrompt()) self.failIf(presubmit.OutputApi.PresubmitError('').ShouldPrompt())
self.failIf(presubmit.OutputApi.PresubmitPromptWarning('').IsFatal()) self.failIf(presubmit.OutputApi.PresubmitPromptWarning('').IsFatal())
self.failUnless( self.failUnless(
presubmit.OutputApi.PresubmitPromptWarning('').ShouldPrompt()) presubmit.OutputApi.PresubmitPromptWarning('').ShouldPrompt())
self.failUnless(
presubmit.OutputApi.PresubmitPromptWarning('').IsMessage())
self.failIf(presubmit.OutputApi.PresubmitNotifyResult('').IsFatal()) self.failIf(presubmit.OutputApi.PresubmitNotifyResult('').IsFatal())
self.failIf(presubmit.OutputApi.PresubmitNotifyResult('').ShouldPrompt()) self.failIf(presubmit.OutputApi.PresubmitNotifyResult('').ShouldPrompt())
self.failUnless(
presubmit.OutputApi.PresubmitNotifyResult('foo').IsMessage())
self.failIf(presubmit.OutputApi.PresubmitAddText('foo').IsFatal()) self.failIf(presubmit.OutputApi.PresubmitAddText('foo').IsFatal())
self.failIf(presubmit.OutputApi.PresubmitAddText('foo').ShouldPrompt()) self.failIf(presubmit.OutputApi.PresubmitAddText('foo').ShouldPrompt())
self.failIf(presubmit.OutputApi.PresubmitAddText('foo').IsMessage())
# TODO(joi) Test MailTextResult once implemented. # TODO(joi) Test MailTextResult once implemented.
...@@ -1880,7 +1883,7 @@ mac|success|blew ...@@ -1880,7 +1883,7 @@ mac|success|blew
messages = list('{"sender": "' + a + '","text": "lgtm"}' for messages = list('{"sender": "' + a + '","text": "lgtm"}' for
a in approvers) a in approvers)
rietveld_response = ('{"owner": "john@example.com",' rietveld_response = ('{"owner": "john@example.com",'
'"messages": [' + ','.join(messages) + ']}') '"messages": [' + ','.join(messages) + ']}')
input_api.urllib2.urlopen( input_api.urllib2.urlopen(
input_api.host_url + '/api/1?messages=true').AndReturn( input_api.host_url + '/api/1?messages=true').AndReturn(
StringIO.StringIO(rietveld_response)) StringIO.StringIO(rietveld_response))
......
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