diff --git a/borg/testsuite/convert.py b/borg/testsuite/convert.py index 5ef88893b..44b0a3f39 100644 --- a/borg/testsuite/convert.py +++ b/borg/testsuite/convert.py @@ -1,4 +1,4 @@ -import binascii +from binascii import hexlify import os import pytest import shutil @@ -20,6 +20,37 @@ class AtticKeyfileKey(KeyfileKey): '''backwards compatible Attick key file parser''' FILE_ID = 'ATTIC KEY' + # verbatim copy from attic + @staticmethod + def get_keys_dir(): + """Determine where to repository keys and cache""" + return os.environ.get('ATTIC_KEYS_DIR', + os.path.join(os.path.expanduser('~'), '.attic', 'keys')) + + @classmethod + def find_key_file(cls, repository): + '''copy of attic's `find_key_file`_ + + this has two small modifications: + + 1. it uses the above `get_keys_dir`_ instead of the global one, + assumed to be borg's + + 2. it uses `repository.path`_ instead of + `repository._location.canonical_path`_ because we can't + assume the repository has been opened by the archiver yet + ''' + get_keys_dir = cls.get_keys_dir + id = hexlify(repository.id).decode('ascii') + keys_dir = get_keys_dir() + for name in os.listdir(keys_dir): + filename = os.path.join(keys_dir, name) + with open(filename, 'r') as fd: + line = fd.readline().strip() + if line and line.startswith(cls.FILE_ID) and line[10:] == id: + return filename + raise KeyfileNotFoundError(repository.path, get_keys_dir()) + class ConversionTestCase(BaseTestCase): class MockArgs: @@ -116,11 +147,10 @@ class ConversionTestCase(BaseTestCase): no key is found. whether that exception is from Borg or Attic is unclear. - this is split in a separate function in case we want to - reimplement the attic code here. - ''' - self.repository._location = attic.helpers.Location(self.tmppath) - return attic.key.KeyfileKey().find_key_file(self.repository) + this is split in a separate function in case we want to use + the attic code here directly, instead of our local + implementation.''' + return AtticKeyfileKey.find_key_file(self.repository) def convert_keyfiles(self, keyfile):