|
@@ -130,6 +130,7 @@ class Repository:
|
|
|
self.store = Store(url, levels=levels_config)
|
|
|
except StoreBackendError as e:
|
|
|
raise Error(str(e))
|
|
|
+ self.store_opened = False
|
|
|
self.version = None
|
|
|
# long-running repository methods which emit log or progress output are responsible for calling
|
|
|
# the ._send_log method periodically to get log and progress output transferred to the borg client
|
|
@@ -156,7 +157,11 @@ class Repository:
|
|
|
self.do_create = False
|
|
|
self.create()
|
|
|
self.created = True
|
|
|
- self.open(exclusive=bool(self.exclusive), lock_wait=self.lock_wait, lock=self.do_lock)
|
|
|
+ try:
|
|
|
+ self.open(exclusive=bool(self.exclusive), lock_wait=self.lock_wait, lock=self.do_lock)
|
|
|
+ except Exception:
|
|
|
+ self.close()
|
|
|
+ raise
|
|
|
return self
|
|
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
@@ -170,11 +175,13 @@ class Repository:
|
|
|
"""Create a new empty repository"""
|
|
|
self.store.create()
|
|
|
self.store.open()
|
|
|
- self.store.store("config/readme", REPOSITORY_README.encode())
|
|
|
- self.version = 3
|
|
|
- self.store.store("config/version", str(self.version).encode())
|
|
|
- self.store.store("config/id", bin_to_hex(os.urandom(32)).encode())
|
|
|
- self.store.close()
|
|
|
+ try:
|
|
|
+ self.store.store("config/readme", REPOSITORY_README.encode())
|
|
|
+ self.version = 3
|
|
|
+ self.store.store("config/version", str(self.version).encode())
|
|
|
+ self.store.store("config/id", bin_to_hex(os.urandom(32)).encode())
|
|
|
+ finally:
|
|
|
+ self.store.close()
|
|
|
|
|
|
def _set_id(self, id):
|
|
|
# for testing: change the id of an existing repository
|
|
@@ -207,6 +214,8 @@ class Repository:
|
|
|
self.store.open()
|
|
|
except StoreBackendDoesNotExist:
|
|
|
raise self.DoesNotExist(str(self._location)) from None
|
|
|
+ else:
|
|
|
+ self.store_opened = True
|
|
|
if lock:
|
|
|
self.lock = Lock(self.store, exclusive, timeout=lock_wait).acquire()
|
|
|
else:
|
|
@@ -224,12 +233,13 @@ class Repository:
|
|
|
self.opened = True
|
|
|
|
|
|
def close(self):
|
|
|
- if self.opened:
|
|
|
- if self.lock:
|
|
|
- self.lock.release()
|
|
|
- self.lock = None
|
|
|
+ if self.lock:
|
|
|
+ self.lock.release()
|
|
|
+ self.lock = None
|
|
|
+ if self.store_opened:
|
|
|
self.store.close()
|
|
|
- self.opened = False
|
|
|
+ self.store_opened = False
|
|
|
+ self.opened = False
|
|
|
|
|
|
def info(self):
|
|
|
"""return some infos about the repo (must be opened first)"""
|