瀏覽代碼

Merge pull request #857 from enkore/issue/850

init: clean up partial repo if passphrase input is aborted
TW 9 年之前
父節點
當前提交
104e871262
共有 2 個文件被更改,包括 18 次插入1 次删除
  1. 5 1
      borg/archiver.py
  2. 13 0
      borg/testsuite/archiver.py

+ 5 - 1
borg/archiver.py

@@ -161,7 +161,11 @@ class Archiver:
     def do_init(self, args, repository):
         """Initialize an empty repository"""
         logger.info('Initializing repository at "%s"' % args.location.canonical_path())
-        key = key_creator(repository, args)
+        try:
+            key = key_creator(repository, args)
+        except (EOFError, KeyboardInterrupt):
+            repository.destroy()
+            return EXIT_WARNING
         manifest = Manifest(key, repository)
         manifest.key = key
         manifest.write()

+ 13 - 0
borg/testsuite/archiver.py

@@ -22,6 +22,7 @@ from ..archiver import Archiver
 from ..cache import Cache
 from ..crypto import bytes_to_long, num_aes_blocks
 from ..helpers import Manifest, EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR
+from ..key import KeyfileKeyBase
 from ..remote import RemoteRepository, PathNotAllowed
 from ..repository import Repository
 from . import BaseTestCase, changedir, environment_variable
@@ -1127,12 +1128,24 @@ class ArchiverTestCase(ArchiverTestCaseBase):
         output = self.cmd('debug-delete-obj', self.repository_location, 'invalid')
         assert "is invalid" in output
 
+    def test_init_interrupt(self):
+        def raise_eof(*args):
+            raise EOFError
+
+        with patch.object(KeyfileKeyBase, 'create', raise_eof):
+            self.cmd('init', self.repository_location, exit_code=1)
+        assert not os.path.exists(self.repository_location)
+
 
 @unittest.skipUnless('binary' in BORG_EXES, 'no borg.exe available')
 class ArchiverTestCaseBinary(ArchiverTestCase):
     EXE = 'borg.exe'
     FORK_DEFAULT = True
 
+    @unittest.skip('patches objects')
+    def test_init_interrupt(self):
+        pass
+
 
 class ArchiverCheckTestCase(ArchiverTestCaseBase):