diff --git a/buildstream/_frontend/widget.py b/buildstream/_frontend/widget.py index c5353bc432cffb8485be331cb4761f2d61e607b7..cc459c1a86b9ba821bab0800938d50a4b38193d8 100644 --- a/buildstream/_frontend/widget.py +++ b/buildstream/_frontend/widget.py @@ -8,7 +8,7 @@ # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public @@ -17,6 +17,7 @@ # Authors: # Tristan Van Berkom <tristan.vanberkom@codethink.co.uk> import datetime +import base64 import os from collections import defaultdict, OrderedDict from contextlib import ExitStack @@ -94,12 +95,24 @@ class FixedText(Widget): # Used to add the wallclock time this message was created at class WallclockTime(Widget): + def __init__(self, context, content_profile, format_profile, output_format=False): + self._output_format = output_format + super(WallclockTime, self).__init__(context, content_profile, format_profile) + def render(self, message): + fields = [self.content_profile.fmt("{:02d}".format(x)) for x in [message.creation_time.hour, message.creation_time.minute, - message.creation_time.second]] - return self.format_profile.fmt(":").join(fields) + message.creation_time.second, + ] + ] + text = self.format_profile.fmt(":").join(fields) + + if self._output_format == 'us': + text += self.format_profile.fmt(".{:06d}".format(message.creation_time.microsecond)) + + return text # A widget for rendering the debugging column @@ -326,6 +339,8 @@ class LogLine(Widget): "elapsed": TimeCode(context, content_profile, format_profile, microseconds=False), "elapsed-us": TimeCode(context, content_profile, format_profile, microseconds=True), "wallclock": WallclockTime(context, content_profile, format_profile), + "wallclock-us": WallclockTime(context, content_profile, format_profile, output_format='us'), + "wallclock-base64": WallclockTime(context, content_profile, format_profile, output_format='base64'), "key": CacheKey(context, content_profile, format_profile, err_profile), "element": ElementName(context, content_profile, format_profile), "action": TypeName(context, content_profile, format_profile), diff --git a/tests/frontend/logging.py b/tests/frontend/logging.py index 3243e74bc2f3fc178f5f6cdd3cf540d34756c68b..ddaadfa266dc7855a504df91b80a9b2dff14ed27 100644 --- a/tests/frontend/logging.py +++ b/tests/frontend/logging.py @@ -52,7 +52,8 @@ def test_custom_logging(cli, tmpdir, datafiles): element_path = os.path.join(project, 'elements') element_name = 'fetch-test-git.bst' - custom_log_format = '%{elapsed},%{elapsed-us},%{wallclock},%{key},%{element},%{action},%{message}' + custom_log_format = ('%{elapsed},%{elapsed-us},%{wallclock},%{wallclock-us},' + '%{key},%{element},%{action},%{message}') user_config = {'logging': {'message-format': custom_log_format}} cli.configure(user_config) @@ -77,7 +78,8 @@ def test_custom_logging(cli, tmpdir, datafiles): result = cli.run(project=project, args=['source', 'fetch', element_name]) result.assert_success() - m = re.search(r"\d\d:\d\d:\d\d,\d\d:\d\d:\d\d.\d{6},\d\d:\d\d:\d\d,\s*,.*,SUCCESS,Checking sources", result.stderr) + m = re.search(r"\d\d:\d\d:\d\d,\d\d:\d\d:\d\d.\d{6},\d\d:\d\d:\d\d,\d\d:\d\d:\d\d.\d{6}\s*,.*" + r",SUCCESS,Checking sources", result.stderr) assert(m is not None)