Chromium Code Reviews| Index: presubmit_support.py |
| diff --git a/presubmit_support.py b/presubmit_support.py |
| index 345c78eb6b8ec7caa676e7d6c0d624e737eafa70..cd66e460ebbc4c9000d35072e376e118ee9fd25e 100755 |
| --- a/presubmit_support.py |
| +++ b/presubmit_support.py |
| @@ -15,7 +15,6 @@ __version__ = '1.7.0' |
| import cpplint |
| import cPickle # Exposed through the API. |
| import cStringIO # Exposed through the API. |
| -import collections |
| import contextlib |
| import fnmatch |
| import glob |
| @@ -56,8 +55,14 @@ class PresubmitFailure(Exception): |
| pass |
| -CommandData = collections.namedtuple('CommandData', |
| - ['name', 'cmd', 'kwargs', 'message']) |
| +class CommandData(object): |
| + def __init__(self, name, cmd, kwargs, message): |
| + self.name = name |
| + self.cmd = cmd |
| + self.kwargs = kwargs |
| + self.message = message |
| + self.info = None |
| + |
| def normpath(path): |
| '''Version of os.path.normpath that also changes backward slashes to |
| @@ -468,8 +473,7 @@ class InputApi(object): |
| """Returns if a change is TBR'ed.""" |
| return 'TBR' in self.change.tags |
| - @staticmethod |
| - def RunTests(tests_mix, parallel=True): |
| + def RunTests(self, tests_mix, parallel=True): |
| tests = [] |
| msgs = [] |
| for t in tests_mix: |
| @@ -478,6 +482,8 @@ class InputApi(object): |
| else: |
| assert issubclass(t.message, _PresubmitResult) |
| tests.append(t) |
| + if self.verbose: |
| + t.info = _PresubmitNotifyResult |
| if len(tests) > 1 and parallel: |
| pool = multiprocessing.Pool() |
| # async recipe works around multiprocessing bug handling Ctrl-C |
| @@ -1352,17 +1358,28 @@ def canned_check_filter(method_names): |
| for name, method in filtered.iteritems(): |
| setattr(presubmit_canned_checks, name, method) |
| + |
| def CallCommand(cmd_data): |
| - # multiprocessing needs a top level function with a single argument. |
| + """Runs an external program, potentially from a child process created by the |
| + multiprocessing module. |
| + |
| + multiprocessing needs a top level function with a single argument. |
| + """ |
| cmd_data.kwargs['stdout'] = subprocess.PIPE |
| cmd_data.kwargs['stderr'] = subprocess.STDOUT |
| try: |
| + start = time.time() |
| (out, _), code = subprocess.communicate(cmd_data.cmd, **cmd_data.kwargs) |
| - if code != 0: |
| - return cmd_data.message('%s failed\n%s' % (cmd_data.name, out)) |
| + duration = time.time() - start |
| except OSError as e: |
| + duration = time.time() - start |
|
iannucci
2013/12/02 19:36:38
finally?
M-A Ruel
2013/12/02 21:23:24
You cannot do try/finally/except in python, only t
|
| + return cmd_data.message( |
| + '%s exec failure (%4.2fs)\n %s' % (cmd_data.name, duration, e)) |
| + if code != 0: |
| return cmd_data.message( |
| - '%s exec failure\n %s' % (cmd_data.name, e)) |
| + '%s (%4.2fs) failed\n%s' % (cmd_data.name, duration, out)) |
| + if cmd_data.info: |
| + return cmd_data.info('%s (%4.2fs)' % (cmd_data.name, duration)) |
| def Main(argv): |