49 lines
No EOL
1.6 KiB
Python
49 lines
No EOL
1.6 KiB
Python
from functools import partial
|
|
from data.database import BUILD_PHASE
|
|
|
|
class StatusHandler(object):
|
|
""" Context wrapper for writing status to build logs. """
|
|
|
|
def __init__(self, build_logs, repository_build):
|
|
self._current_phase = None
|
|
self._repository_build = repository_build
|
|
self._uuid = repository_build.uuid
|
|
self._build_logs = build_logs
|
|
|
|
self._status = {
|
|
'total_commands': None,
|
|
'current_command': None,
|
|
'push_completion': 0.0,
|
|
'pull_completion': 0.0,
|
|
}
|
|
|
|
# Write the initial status.
|
|
self.__exit__(None, None, None)
|
|
|
|
def _append_log_message(self, log_message, log_type=None, log_data=None):
|
|
self._build_logs.append_log_message(self._uuid, log_message, log_type, log_data)
|
|
|
|
def append_log(self, log_message, extra_data=None):
|
|
self._append_log_message(log_message, log_data=extra_data)
|
|
|
|
def set_command(self, command, extra_data=None):
|
|
self._append_log_message(command, self._build_logs.COMMAND, extra_data)
|
|
|
|
def set_error(self, error_message, extra_data=None):
|
|
self.set_phase(BUILD_PHASE.ERROR)
|
|
self._append_log_message(error_message, self._build_logs.ERROR, extra_data)
|
|
|
|
def set_phase(self, phase, extra_data=None):
|
|
if phase == self._current_phase:
|
|
return
|
|
|
|
self._current_phase = phase
|
|
self._append_log_message(phase, self._build_logs.PHASE, extra_data)
|
|
self._repository_build.phase = phase
|
|
self._repository_build.save()
|
|
|
|
def __enter__(self):
|
|
return self._status
|
|
|
|
def __exit__(self, exc_type, value, traceback):
|
|
self._build_logs.set_status(self._uuid, self._status) |