mirror of
https://github.com/borgbackup/borg.git
synced 2025-02-22 06:01:54 +00:00
change RPC API, fix remote repo tests
This commit is contained in:
parent
1e739fd52d
commit
64dcbbfdd0
3 changed files with 18 additions and 17 deletions
|
@ -68,8 +68,8 @@ def wrapper(self, args, **kwargs):
|
|||
if argument(args, fake):
|
||||
return method(self, args, repository=None, **kwargs)
|
||||
elif location.proto == 'ssh':
|
||||
repository = RemoteRepository(location, create=create, lock_wait=self.lock_wait, lock=lock,
|
||||
append_only=append_only, args=args)
|
||||
repository = RemoteRepository(location, create=create, exclusive=argument(args, exclusive),
|
||||
lock_wait=self.lock_wait, lock=lock, append_only=append_only, args=args)
|
||||
else:
|
||||
repository = Repository(location.path, create=create, exclusive=argument(args, exclusive),
|
||||
lock_wait=self.lock_wait, lock=lock,
|
||||
|
|
|
@ -114,7 +114,7 @@ def serve(self):
|
|||
def negotiate(self, versions):
|
||||
return RPC_PROTOCOL_VERSION
|
||||
|
||||
def open(self, path, create=False, lock_wait=None, lock=True, append_only=False):
|
||||
def open(self, path, create=False, lock_wait=None, lock=True, exclusive=False, append_only=False):
|
||||
path = os.fsdecode(path)
|
||||
if path.startswith('/~'):
|
||||
path = path[1:]
|
||||
|
@ -125,7 +125,9 @@ def open(self, path, create=False, lock_wait=None, lock=True, append_only=False)
|
|||
break
|
||||
else:
|
||||
raise PathNotAllowed(path)
|
||||
self.repository = Repository(path, create, lock_wait=lock_wait, lock=lock, append_only=self.append_only or append_only)
|
||||
self.repository = Repository(path, create, lock_wait=lock_wait, lock=lock,
|
||||
append_only=self.append_only or append_only,
|
||||
exclusive=exclusive)
|
||||
self.repository.__enter__() # clean exit handled by serve() method
|
||||
return self.repository.id
|
||||
|
||||
|
@ -141,7 +143,7 @@ def __init__(self, name, remote_type):
|
|||
class NoAppendOnlyOnServer(Error):
|
||||
"""Server does not support --append-only."""
|
||||
|
||||
def __init__(self, location, create=False, lock_wait=None, lock=True, append_only=False, args=None):
|
||||
def __init__(self, location, create=False, exclusive=False, lock_wait=None, lock=True, append_only=False, args=None):
|
||||
self.location = self._location = location
|
||||
self.preload_ids = []
|
||||
self.msgid = 0
|
||||
|
@ -178,16 +180,13 @@ def __init__(self, location, create=False, lock_wait=None, lock=True, append_onl
|
|||
raise ConnectionClosedWithHint('Is borg working on the server?') from None
|
||||
if version != RPC_PROTOCOL_VERSION:
|
||||
raise Exception('Server insisted on using unsupported protocol version %d' % version)
|
||||
# Because of protocol versions, only send append_only if necessary
|
||||
if append_only:
|
||||
try:
|
||||
self.id = self.call('open', self.location.path, create, lock_wait, lock, append_only)
|
||||
except self.RPCError as err:
|
||||
if err.remote_type == 'TypeError':
|
||||
raise self.NoAppendOnlyOnServer() from err
|
||||
else:
|
||||
raise
|
||||
else:
|
||||
try:
|
||||
self.id = self.call('open', self.location.path, create, lock_wait, lock, exclusive, append_only)
|
||||
except self.RPCError as err:
|
||||
if err.remote_type != 'TypeError':
|
||||
raise
|
||||
if append_only:
|
||||
raise self.NoAppendOnlyOnServer()
|
||||
self.id = self.call('open', self.location.path, create, lock_wait, lock)
|
||||
except Exception:
|
||||
self.close()
|
||||
|
|
|
@ -386,7 +386,8 @@ def test_crash_before_compact(self):
|
|||
class RemoteRepositoryTestCase(RepositoryTestCase):
|
||||
|
||||
def open(self, create=False):
|
||||
return RemoteRepository(Location('__testsuite__:' + os.path.join(self.tmppath, 'repository')), create=create)
|
||||
return RemoteRepository(Location('__testsuite__:' + os.path.join(self.tmppath, 'repository')),
|
||||
exclusive=True, create=create)
|
||||
|
||||
def test_invalid_rpc(self):
|
||||
self.assert_raises(InvalidRPCMethod, lambda: self.repository.call('__init__', None))
|
||||
|
@ -415,7 +416,8 @@ class MockArgs:
|
|||
class RemoteRepositoryCheckTestCase(RepositoryCheckTestCase):
|
||||
|
||||
def open(self, create=False):
|
||||
return RemoteRepository(Location('__testsuite__:' + os.path.join(self.tmppath, 'repository')), create=create)
|
||||
return RemoteRepository(Location('__testsuite__:' + os.path.join(self.tmppath, 'repository')),
|
||||
exclusive=True, create=create)
|
||||
|
||||
def test_crash_before_compact(self):
|
||||
# skip this test, we can't mock-patch a Repository class in another process!
|
||||
|
|
Loading…
Reference in a new issue