| Index: presubmit_canned_checks.py
|
| diff --git a/presubmit_canned_checks.py b/presubmit_canned_checks.py
|
| index 285077d9b70e838f077e8fab718c205ab2981e8a..cd3dc23b4316ec4bf559bb7280d7f80f1187c738 100644
|
| --- a/presubmit_canned_checks.py
|
| +++ b/presubmit_canned_checks.py
|
| @@ -483,8 +483,7 @@ def CheckTreeIsOpen(input_api, output_api,
|
| long_text=str(e))]
|
| return []
|
|
|
| -
|
| -def RunUnitTestsInDirectory(
|
| +def GetUnitTestsInDirectory(
|
| input_api, output_api, directory, whitelist=None, blacklist=None):
|
| """Lists all files in a directory and runs them. Doesn't recurse.
|
|
|
| @@ -517,10 +516,10 @@ def RunUnitTestsInDirectory(
|
| 'Out of %d files, found none that matched w=%r, b=%r in directory %s'
|
| % (found, whitelist, blacklist, directory))
|
| ]
|
| - return RunUnitTests(input_api, output_api, unit_tests)
|
| + return GetUnitTests(input_api, output_api, unit_tests)
|
|
|
|
|
| -def RunUnitTests(input_api, output_api, unit_tests):
|
| +def GetUnitTests(input_api, output_api, unit_tests):
|
| """Runs all unit tests in a directory.
|
|
|
| On Windows, sys.executable is used for unit tests ending with ".py".
|
| @@ -541,20 +540,14 @@ def RunUnitTests(input_api, output_api, unit_tests):
|
| if input_api.verbose:
|
| print('Running %s' % unit_test)
|
| cmd.append('--verbose')
|
| - try:
|
| - if input_api.verbose:
|
| - input_api.subprocess.check_call(cmd, cwd=input_api.PresubmitLocalPath())
|
| - else:
|
| - input_api.subprocess.check_output(
|
| - cmd,
|
| - stderr=input_api.subprocess.STDOUT,
|
| - cwd=input_api.PresubmitLocalPath())
|
| - except (OSError, input_api.subprocess.CalledProcessError), e:
|
| - results.append(message_type('%s failed!\n%s' % (unit_test, e)))
|
| + results.append(input_api.Command(
|
| + name=unit_test,
|
| + cmd=cmd,
|
| + kwargs={'cwd': input_api.PresubmitLocalPath()},
|
| + message=message_type))
|
| return results
|
|
|
| -
|
| -def RunPythonUnitTests(input_api, output_api, unit_tests):
|
| +def GetPythonUnitTests(input_api, output_api, unit_tests):
|
| """Run the unit tests out of process, capture the output and use the result
|
| code to determine success.
|
|
|
| @@ -590,14 +583,42 @@ def RunPythonUnitTests(input_api, output_api, unit_tests):
|
| backpath.append(env.get('PYTHONPATH'))
|
| env['PYTHONPATH'] = input_api.os_path.pathsep.join((backpath))
|
| cmd = [input_api.python_executable, '-m', '%s' % unit_test]
|
| - try:
|
| - input_api.subprocess.check_output(
|
| - cmd, stderr=input_api.subprocess.STDOUT, cwd=cwd, env=env)
|
| - except (OSError, input_api.subprocess.CalledProcessError), e:
|
| - results.append(message_type('%s failed!\n%s' % (unit_test_name, e)))
|
| + results.append(input_api.Command(
|
| + name=unit_test_name,
|
| + cmd=cmd,
|
| + kwargs={'env': env, 'cwd': cwd},
|
| + message=message_type))
|
| return results
|
|
|
|
|
| +def RunUnitTestsInDirectory(input_api, *args, **kwargs):
|
| + """Run tests in a directory serially.
|
| +
|
| + For better performance, use GetUnitTestsInDirectory and then
|
| + pass to input_api.RunTests.
|
| + """
|
| + return input_api.RunTests(
|
| + GetUnitTestsInDirectory(input_api, *args, **kwargs), False)
|
| +
|
| +
|
| +def RunUnitTests(input_api, *args, **kwargs):
|
| + """Run tests serially.
|
| +
|
| + For better performance, use GetUnitTests and then pass to
|
| + input_api.RunTests.
|
| + """
|
| + return input_api.RunTests(GetUnitTests(input_api, *args, **kwargs), False)
|
| +
|
| +
|
| +def RunPythonUnitTests(input_api, *args, **kwargs):
|
| + """Run python tests in a directory serially.
|
| +
|
| + DEPRECATED
|
| + """
|
| + return input_api.RunTests(
|
| + GetPythonUnitTests(input_api, *args, **kwargs), False)
|
| +
|
| +
|
| def _FetchAllFiles(input_api, white_list, black_list):
|
| """Hack to fetch all files."""
|
| # We cannot use AffectedFiles here because we want to test every python
|
| @@ -626,7 +647,7 @@ def _FetchAllFiles(input_api, white_list, black_list):
|
| return files
|
|
|
|
|
| -def RunPylint(input_api, output_api, white_list=None, black_list=None,
|
| +def GetPylint(input_api, output_api, white_list=None, black_list=None,
|
| disabled_warnings=None, extra_paths_list=None):
|
| """Run pylint on python files.
|
|
|
| @@ -669,6 +690,7 @@ def RunPylint(input_api, output_api, white_list=None, black_list=None,
|
| files = _FetchAllFiles(input_api, white_list, black_list)
|
| if not files:
|
| return []
|
| + files.sort()
|
|
|
| input_api.logging.info('Running pylint on %d files', len(files))
|
| input_api.logging.debug('Running pylint on: %s', files)
|
| @@ -679,31 +701,23 @@ def RunPylint(input_api, output_api, white_list=None, black_list=None,
|
| env['PYTHONPATH'] = input_api.os_path.pathsep.join(
|
| extra_paths_list + sys.path).encode('utf8')
|
|
|
| - def run_lint(files):
|
| - # We can't import pylint directly due to licensing issues, so we run
|
| - # it in another process. Windows needs help running python files so we
|
| - # explicitly specify the interpreter to use. It also has limitations on
|
| - # the size of the command-line, so we pass arguments via a pipe.
|
| - command = [input_api.python_executable,
|
| - input_api.os_path.join(_HERE, 'third_party', 'pylint.py'),
|
| - '--args-on-stdin']
|
| - try:
|
| - child = input_api.subprocess.Popen(command, env=env,
|
| - stdin=input_api.subprocess.PIPE)
|
| -
|
| - # Dump the arguments to the child process via a pipe.
|
| - for filename in files:
|
| - child.stdin.write(filename + '\n')
|
| - for arg in extra_args:
|
| - child.stdin.write(arg + '\n')
|
| - child.stdin.close()
|
| -
|
| - child.communicate()
|
| - return child.returncode
|
| - except OSError:
|
| - return 'Pylint failed!'
|
| -
|
| - result = None
|
| + def GetPylintCmd(files):
|
| + # Windows needs help running python files so we explicitly specify
|
| + # the interpreter to use. It also has limitations on the size of
|
| + # the command-line, so we pass arguments via a pipe.
|
| + if len(files) == 1:
|
| + description = files[0]
|
| + else:
|
| + description = '%s files' % len(files)
|
| +
|
| + return input_api.Command(
|
| + name='Pylint (%s)' % description,
|
| + cmd=[input_api.python_executable,
|
| + input_api.os_path.join(_HERE, 'third_party', 'pylint.py'),
|
| + '--args-on-stdin'],
|
| + kwargs={'env': env, 'stdin': '\n'.join(files + extra_args)},
|
| + message=error_type)
|
| +
|
| # Always run pylint and pass it all the py files at once.
|
| # Passing py files one at time is slower and can produce
|
| # different results. input_api.verbose used to be used
|
| @@ -713,17 +727,18 @@ def RunPylint(input_api, output_api, white_list=None, black_list=None,
|
| # a quick local edit to diagnose pylint issues more
|
| # easily.
|
| if True:
|
| - print('Running pylint on %d files.' % len(files))
|
| - result = run_lint(sorted(files))
|
| + return [GetPylintCmd(files)]
|
| else:
|
| - for filename in sorted(files):
|
| - print('Running pylint on %s' % filename)
|
| - result = run_lint([filename]) or result
|
| - if isinstance(result, basestring):
|
| - return [error_type(result)]
|
| - elif result:
|
| - return [error_type('Fix pylint errors first.')]
|
| - return []
|
| + return map(GetPylintCmd, files)
|
| +
|
| +
|
| +def RunPylint(input_api, *args, **kwargs):
|
| + """Legacy presubmit function.
|
| +
|
| + For better performance, get all tests and then pass to
|
| + input_api.RunTests.
|
| + """
|
| + return input_api.RunTests(GetPylint(input_api, *args, **kwargs), False)
|
|
|
|
|
| # TODO(dpranke): Get the host_url from the input_api instead
|
|
|