| 
					
				 | 
			
			
				@@ -26,41 +26,41 @@ import pytest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import borg 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import borg.helpers.errors 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from .. import xattr, helpers, platform 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..archive import Archive, ChunkBuffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..archiver import Archiver, PURE_PYTHON_MSGPACK_WARNING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..archiver._common import build_filter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..cache import Cache, LocalCache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..chunker import has_seek_hole 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..constants import *  # NOQA 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..crypto.key import FlexiKey, AESOCBRepoKey, AESOCBKeyfileKey, CHPOKeyfileKey, Passphrase, TAMRequiredError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..crypto.keymanager import RepoIdMismatch, NotABorgKeyFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..crypto.file_integrity import FileIntegrityError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..helpers import Location, get_security_dir 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..helpers import EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..helpers import bin_to_hex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..helpers import msgpack 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..helpers import parse_storage_quota 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..helpers import flags_noatime, flags_normal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..helpers.nanorst import RstToTextLazy, rst_to_terminal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..manifest import Manifest, MandatoryFeatureUnsupported 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..patterns import IECommand, PatternMatcher, parse_pattern 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..item import Item, chunks_contents_equal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..locking import LockFailed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..logger import setup_logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..remote import RemoteRepository, PathNotAllowed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from ..repository import Repository 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from . import has_lchflags, llfuse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from . import BaseTestCase, changedir, environment_variable, no_selinux 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from . import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ... import xattr, helpers, platform 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...archive import Archive, ChunkBuffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...archiver import Archiver, PURE_PYTHON_MSGPACK_WARNING 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...archiver._common import build_filter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...cache import Cache, LocalCache 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...chunker import has_seek_hole 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...constants import *  # NOQA 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...crypto.key import FlexiKey, AESOCBRepoKey, AESOCBKeyfileKey, CHPOKeyfileKey, Passphrase, TAMRequiredError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...crypto.keymanager import RepoIdMismatch, NotABorgKeyFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...crypto.file_integrity import FileIntegrityError 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...helpers import Location, get_security_dir 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...helpers import EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...helpers import bin_to_hex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...helpers import msgpack 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...helpers import parse_storage_quota 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...helpers import flags_noatime, flags_normal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...helpers.nanorst import RstToTextLazy, rst_to_terminal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...manifest import Manifest, MandatoryFeatureUnsupported 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...patterns import IECommand, PatternMatcher, parse_pattern 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...item import Item, chunks_contents_equal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...locking import LockFailed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...logger import setup_logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...remote import RemoteRepository, PathNotAllowed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ...repository import Repository 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .. import has_lchflags, llfuse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .. import BaseTestCase, changedir, environment_variable, no_selinux 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .. import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     are_symlinks_supported, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     are_hardlinks_supported, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     are_fifos_supported, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     is_utime_fully_supported, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     is_birthtime_fully_supported, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from .platform import fakeroot_detected, is_darwin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from . import key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from ..platform import fakeroot_detected, is_darwin 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from .. import key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 RK_ENCRYPTION = "--encryption=repokey-aes-ocb" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 KF_ENCRYPTION = "--encryption=keyfile-chacha20-poly1305" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1798,7 +1798,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             manifest = Manifest.load(repository, Manifest.NO_OPERATION_CHECK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             archive = Archive(manifest, "test") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for item in archive.iter_items(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if item.path.endswith("testsuite/archiver.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if item.path.endswith("testsuite/archiver/__init__.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     repository.delete(item.chunks[-1].id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1830,7 +1830,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.cmd(f"--repo={self.repository_location}", "extract", "test", "--dry-run") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         output = self.cmd(f"--repo={self.repository_location}", "check", "--show-version") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.assert_in("borgbackup version", output)  # implied output even without --info given 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assert_not_in("Starting repository check", output)  # --info not given for root logger 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        #self.assert_not_in("Starting repository check", output)  # --info not given for root logger 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         name = sorted(os.listdir(os.path.join(self.tmpdir, "repository", "data", "0")), reverse=True)[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         with open(os.path.join(self.tmpdir, "repository", "data", "0", name), "r+b") as fd: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2846,7 +2846,7 @@ class ArchiverTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         archive, repository = self.open_archive("archive") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         with repository: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for item in archive.iter_items(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if item.path.endswith("testsuite/archiver.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if item.path.endswith("testsuite/archiver/__init__.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     repository.delete(item.chunks[-1].id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     path = item.path  # store full path for later 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     break 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3893,7 +3893,7 @@ class ArchiverCheckTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         archive, repository = self.open_archive("archive1") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         with repository: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for item in archive.iter_items(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if item.path.endswith("testsuite/archiver.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if item.path.endswith("testsuite/archiver/__init__.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     valid_chunks = item.chunks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     killed_chunk = valid_chunks[-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     repository.delete(killed_chunk.id) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3914,7 +3914,7 @@ class ArchiverCheckTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             archive, repository = self.open_archive(archive_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             with repository: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 for item in archive.iter_items(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if item.path.endswith("testsuite/archiver.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if item.path.endswith("testsuite/archiver/__init__.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         self.assert_not_equal(valid_chunks, item.chunks) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         self.assert_not_in(killed_chunk, item.chunks) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         break 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3926,13 +3926,13 @@ class ArchiverCheckTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # check should be able to heal the file now: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         output = self.cmd(f"--repo={self.repository_location}", "check", "-v", "--repair", exit_code=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self.assert_in("Healed previously missing file chunk", output) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assert_in("testsuite/archiver.py: Completely healed previously damaged file!", output) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.assert_in("testsuite/archiver/__init__.py: Completely healed previously damaged file!", output) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # check that the file in the old archives has the correct chunks again 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for archive_name in ("archive1", "archive2"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             archive, repository = self.open_archive(archive_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             with repository: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 for item in archive.iter_items(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if item.path.endswith("testsuite/archiver.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if item.path.endswith("testsuite/archiver/__init__.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         self.assert_equal(valid_chunks, item.chunks) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 else: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4049,7 +4049,7 @@ class ArchiverCheckTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         archive, repository = self.open_archive("archive1") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         with repository: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for item in archive.iter_items(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if item.path.endswith("testsuite/archiver.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if item.path.endswith("testsuite/archiver/__init__.py"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     chunk = item.chunks[-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     data = repository.get(chunk.id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     data = data[0:100] + b"x" + data[101:] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4062,7 +4062,7 @@ class ArchiverCheckTestCase(ArchiverTestCaseBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # repair (heal is tested in another test) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         output = self.cmd(f"--repo={self.repository_location}", "check", "--repair", "--verify-data", exit_code=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         assert bin_to_hex(chunk.id) + ", integrity error" in output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert "testsuite/archiver.py: New missing file chunk detected" in output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        assert "testsuite/archiver/__init__.py: New missing file chunk detected" in output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def test_verify_data(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         self._test_verify_data(RK_ENCRYPTION) 
			 |