Merge pull request #5472 from milkey-mouse/timestamp-aware-placeholders

Use --timestamp in placeholders if given
This commit is contained in:
TW 2020-11-03 22:29:07 +01:00 committed by GitHub
commit dea3f01a40
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 5 deletions

View file

@ -4496,6 +4496,8 @@ class Archiver:
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):

View file

@ -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 @@ class Location:
':{}'.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):

View file

@ -189,6 +189,10 @@ class TestLocationWithoutEnv:
assert repr(Location('ssh://host/path::2016-12-31@23:59:59')) == \
"Location(proto='ssh', user=None, host='host', port=None, path='/path', archive='2016-12-31@23:59:59')"
def test_with_timestamp(self):
assert repr(Location('path::archive-{utcnow}').with_timestamp(datetime(2002, 9, 19))) == \
"Location(proto='file', user=None, host=None, port=None, path='path', archive='archive-2002-09-19T00:00:00')"
def test_underspecified(self, monkeypatch):
monkeypatch.delenv('BORG_REPO', raising=False)
with pytest.raises(ValueError):
@ -935,6 +939,10 @@ def test_replace_placeholders():
assert int(replace_placeholders('{now:%Y}')) == now.year
def test_override_placeholders():
assert replace_placeholders('{uuid4}', overrides={'uuid4': "overridden"}) == "overridden"
def working_swidth():
return platform.swidth('') == 2