diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 5a17929f1..a5bc3bff9 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -4496,6 +4496,8 @@ def parse_args(self, args=None): self.do_list, self.do_mount, self.do_umount} if func not in bypass_allowed: raise Error('Not allowed to bypass locking mechanism for chosen command') + if getattr(args, 'timestamp', None): + args.location = args.location.with_timestamp(args.timestamp) return args def prerun_checks(self, logger, is_serve): diff --git a/src/borg/helpers/parseformat.py b/src/borg/helpers/parseformat.py index 7331fc998..6acb2a038 100644 --- a/src/borg/helpers/parseformat.py +++ b/src/borg/helpers/parseformat.py @@ -203,7 +203,7 @@ def format_line(format, data): raise PlaceholderError(format, data, e.__class__.__name__, str(e)) -def replace_placeholders(text): +def replace_placeholders(text, overrides={}): """Replace placeholders in text with their values.""" from ..platform import fqdn, hostname, getosusername current_time = datetime.now(timezone.utc) @@ -220,6 +220,7 @@ def replace_placeholders(text): 'borgmajor': '%d' % borg_version_tuple[:1], 'borgminor': '%d.%d' % borg_version_tuple[:2], 'borgpatch': '%d.%d.%d' % borg_version_tuple[:3], + **overrides, } return format_line(text, data) @@ -387,13 +388,13 @@ class Location: ) """ + optional_archive_re, re.VERBOSE) # archive name (optional, may be empty) - def __init__(self, text=''): - if not self.parse(text): + def __init__(self, text='', overrides={}): + if not self.parse(text, overrides): raise ValueError('Invalid location format: "%s"' % self.orig) - def parse(self, text): + def parse(self, text, overrides={}): self.orig = text - text = replace_placeholders(text) + text = replace_placeholders(text, overrides) valid = self._parse(text) if valid: return True @@ -497,6 +498,12 @@ def canonical_path(self): ':{}'.format(self.port) if self.port else '', path) + def with_timestamp(self, timestamp): + return Location(self.orig, overrides={ + 'now': DatetimeWrapper(timestamp.astimezone(None)), + 'utcnow': DatetimeWrapper(timestamp), + }) + def location_validator(archive=None, proto=None): def validator(text):