From a56dc44e1f7b76b98a2ba7508fd8a9604edac0df Mon Sep 17 00:00:00 2001 From: Johann Bauer Date: Thu, 22 Sep 2016 10:36:04 +0200 Subject: [PATCH] Change {utcnow} and {now} to ISO-8601 format --- src/borg/archiver.py | 6 ++++-- src/borg/helpers.py | 14 ++++++++++++-- src/borg/testsuite/helpers.py | 8 +++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/borg/archiver.py b/src/borg/archiver.py index a63513de1..d32acc9ec 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1233,11 +1233,13 @@ class Archiver: {now} - The current local date and time. + The current local date and time, by default in ISO-8601 format. + You can also supply your own `format string `_, e.g. {now:%Y-%m-%d_%H:%M:%S} {utcnow} - The current UTC date and time. + The current UTC date and time, by default in ISO-8601 format. + You can also supply your own `format string `_, e.g. {utcnow:%Y-%m-%d_%H:%M:%S} {user} diff --git a/src/borg/helpers.py b/src/borg/helpers.py index e6c805bc6..e44569533 100644 --- a/src/borg/helpers.py +++ b/src/borg/helpers.py @@ -622,6 +622,16 @@ def partial_format(format, mapping): return format +class DatetimeWrapper: + def __init__(self, dt): + self.dt = dt + + def __format__(self, format_spec): + if format_spec == '': + format_spec = '%Y-%m-%dT%H:%M:%S' + return self.dt.__format__(format_spec) + + def format_line(format, data): try: return format.format(**data) @@ -636,8 +646,8 @@ def replace_placeholders(text): 'pid': os.getpid(), 'fqdn': socket.getfqdn(), 'hostname': socket.gethostname(), - 'now': current_time.now(), - 'utcnow': current_time.utcnow(), + 'now': DatetimeWrapper(current_time.now()), + 'utcnow': DatetimeWrapper(current_time.utcnow()), 'user': uid2user(os.getuid(), os.getuid()), 'uuid4': str(uuid.uuid4()), 'borgversion': borg_version, diff --git a/src/borg/testsuite/helpers.py b/src/borg/testsuite/helpers.py index 6583b4ead..d1c7c95bb 100644 --- a/src/borg/testsuite/helpers.py +++ b/src/borg/testsuite/helpers.py @@ -11,7 +11,7 @@ import msgpack.fallback from ..helpers import Location from ..helpers import Buffer -from ..helpers import partial_format, format_file_size, parse_file_size, format_timedelta, format_line, PlaceholderError +from ..helpers import partial_format, format_file_size, parse_file_size, format_timedelta, format_line, PlaceholderError, replace_placeholders from ..helpers import make_path_safe, clean_lines from ..helpers import prune_within, prune_split from ..helpers import get_cache_dir, get_keys_dir, get_nonces_dir @@ -1035,3 +1035,9 @@ def test_format_line_erroneous(): assert format_line('{invalid}', data) with pytest.raises(PlaceholderError): assert format_line('{}', data) + + +def test_replace_placeholders(): + now = datetime.now() + assert " " not in replace_placeholders('{now}') + assert int(replace_placeholders('{now:%Y}')) == now.year