diff options
Diffstat (limited to 'pre-upload.py')
-rwxr-xr-x | pre-upload.py | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/pre-upload.py b/pre-upload.py index d9b1b1e..0e032f4 100755 --- a/pre-upload.py +++ b/pre-upload.py @@ -62,6 +62,9 @@ class Output(object): FAILED = COLOR.color(COLOR.RED, 'FAILED') WARNING = COLOR.color(COLOR.YELLOW, 'WARNING') + # How long a hook is allowed to run before we warn that it is "too slow". + _SLOW_HOOK_DURATION = datetime.timedelta(seconds=30) + def __init__(self, project_name): """Create a new Output object for a specified project. @@ -73,6 +76,8 @@ class Output(object): self.hook_index = 0 self.success = True self.start_time = datetime.datetime.now() + self.hook_start_time = None + self._curr_hook_name = None def set_num_hooks(self, num_hooks): """Keep track of how many hooks we'll be running. @@ -99,28 +104,38 @@ class Output(object): Args: hook_name: name of the hook. """ + self._curr_hook_name = hook_name + self.hook_start_time = datetime.datetime.now() status_line = '[%s %d/%d] %s' % (self.RUNNING, self.hook_index, self.num_hooks, hook_name) self.hook_index += 1 rh.terminal.print_status_line(status_line) - def hook_error(self, hook_name, error): + def hook_finish(self): + """Finish processing any per-hook state.""" + duration = datetime.datetime.now() - self.hook_start_time + if duration >= self._SLOW_HOOK_DURATION: + self.hook_warning( + 'This hook took %s to finish which is fairly slow for ' + 'developers.\nPlease consider moving the check to the ' + 'server/CI system instead.' % + (rh.utils.timedelta_str(duration),)) + + def hook_error(self, error): """Print an error for a single hook. Args: - hook_name: name of the hook. error: error string. """ - self.error(hook_name, error) + self.error(self._curr_hook_name, error) - def hook_warning(self, hook_name, warning): + def hook_warning(self, warning): """Print a warning for a single hook. Args: - hook_name: name of the hook. warning: warning string. """ - status_line = '[%s] %s' % (self.WARNING, hook_name) + status_line = '[%s] %s' % (self.WARNING, self._curr_hook_name) rh.terminal.print_status_line(status_line, print_newline=True) print(warning, file=sys.stderr) @@ -303,13 +318,14 @@ def _run_project_hooks_in_cwd(project_name, proj_dir, output, commit_list=None): if rel_proj_dir in exclusion_scope: break hook_results = hook(project, commit, desc, diff) + output.hook_finish() (error, warning) = _process_hook_results(hook_results) if error is not None or warning is not None: if warning is not None: - output.hook_warning(name, warning) + output.hook_warning(warning) if error is not None: ret = False - output.hook_error(name, error) + output.hook_error(error) for result in hook_results: if result.fixup_func: fixup_func_list.append((name, commit, |