Browse Source

Merge pull request #6969 from ThomasWaldmann/refactor-master

refactor, move stuff around
TW 2 years ago
parent
commit
fe6cd9e008
44 changed files with 83 additions and 91 deletions
  1. 2 2
      setup.cfg
  2. 3 3
      src/borg/archive.py
  3. 2 2
      src/borg/archiver/common.py
  4. 1 1
      src/borg/archiver/compact.py
  5. 1 1
      src/borg/archiver/config.py
  6. 1 1
      src/borg/archiver/create.py
  7. 1 1
      src/borg/archiver/debug.py
  8. 2 2
      src/borg/archiver/delete.py
  9. 1 1
      src/borg/archiver/diff.py
  10. 1 1
      src/borg/archiver/extract.py
  11. 1 1
      src/borg/archiver/help.py
  12. 1 1
      src/borg/archiver/info.py
  13. 1 1
      src/borg/archiver/keys.py
  14. 1 1
      src/borg/archiver/list_cmd.py
  15. 1 1
      src/borg/archiver/locks.py
  16. 1 1
      src/borg/archiver/mount.py
  17. 2 5
      src/borg/archiver/prune.py
  18. 1 1
      src/borg/archiver/rcreate.py
  19. 1 2
      src/borg/archiver/rdelete.py
  20. 1 1
      src/borg/archiver/recreate.py
  21. 1 1
      src/borg/archiver/rename.py
  22. 1 1
      src/borg/archiver/rinfo.py
  23. 1 1
      src/borg/archiver/rlist.py
  24. 19 2
      src/borg/archiver/tar.py
  25. 1 1
      src/borg/archiver/transfer.py
  26. 1 1
      src/borg/cache.py
  27. 2 2
      src/borg/crypto/key.py
  28. 2 1
      src/borg/crypto/keymanager.py
  29. 1 1
      src/borg/fuse.py
  30. 1 2
      src/borg/helpers/__init__.py
  31. 0 0
      src/borg/helpers/lrucache.py
  32. 0 18
      src/borg/helpers/misc.py
  33. 1 1
      src/borg/helpers/nanorst.py
  34. 2 3
      src/borg/helpers/parseformat.py
  35. 0 0
      src/borg/helpers/shellpattern.py
  36. 11 12
      src/borg/manifest.py
  37. 1 2
      src/borg/patterns.py
  38. 3 3
      src/borg/repository.py
  39. 1 1
      src/borg/testsuite/archive.py
  40. 4 4
      src/borg/testsuite/archiver.py
  41. 1 1
      src/borg/testsuite/cache.py
  42. 1 1
      src/borg/testsuite/lrucache.py
  43. 1 1
      src/borg/testsuite/nanorst.py
  44. 1 1
      src/borg/testsuite/shellpattern.py

+ 2 - 2
setup.cfg

@@ -135,9 +135,9 @@ per_file_ignores =
     src/borg/fuse.py:E402,E501,E722,W504
     src/borg/fuse_impl.py:F811
     src/borg/locking.py:E128,E501,E722
+    src/borg/manifest.py:E128,E402,E501,F405
     src/borg/remote.py:E128,E501,F405
     src/borg/repository.py:E126,E128,E501,F401,F405,W504
-    src/borg/shellpattern.py:E501
     src/borg/upgrader.py:E501
     src/borg/xattr.py:E402
     src/borg/crypto/key.py:E125,E128,E402,E501,F401,F405,W504
@@ -147,12 +147,12 @@ per_file_ignores =
     src/borg/helpers/checks.py:F401
     src/borg/helpers/errors.py:F405
     src/borg/helpers/fs.py:F405
-    src/borg/helpers/manifest.py:E128,E402,E501,F405
     src/borg/helpers/misc.py:E402,E722,F401,F405
     src/borg/helpers/msgpack.py:E127,F405
     src/borg/helpers/parseformat.py:E402,E501,E741,F401,F405
     src/borg/helpers/process.py:E402,F401,W504
     src/borg/helpers/progress.py:E402
+    src/borg/helpers/shellpattern.py:E501
     src/borg/platform/__init__.py:F401,F811
     src/borg/platform/base.py:E402
     src/borg/testsuite/__init__.py:E501,F401

+ 3 - 3
src/borg/archive.py

@@ -13,7 +13,7 @@ from io import BytesIO
 from itertools import groupby, zip_longest
 from shutil import get_terminal_size
 
-from .platformflags import is_win32, is_linux, is_freebsd, is_darwin
+from .platformflags import is_win32
 from .logger import create_logger
 
 logger = create_logger()
@@ -26,7 +26,6 @@ from .compress import Compressor, CompressionSpec
 from .constants import *  # NOQA
 from .crypto.low_level import IntegrityError as IntegrityErrorBase
 from .hashindex import ChunkIndex, ChunkIndexEntry, CacheSynchronizer
-from .helpers import Manifest
 from .helpers import HardLinkManager
 from .helpers import ChunkIteratorFileWrapper, open_item
 from .helpers import Error, IntegrityError, set_ec
@@ -42,7 +41,8 @@ from .helpers import os_open, flags_normal, flags_dir
 from .helpers import os_stat
 from .helpers import msgpack
 from .helpers import sig_int
-from .lrucache import LRUCache
+from .helpers.lrucache import LRUCache
+from .manifest import Manifest
 from .patterns import PathPrefixPattern, FnmatchPattern, IECommand
 from .item import Item, ArchiveItem, ItemDiff
 from .platform import acl_get, acl_set, set_flags, get_flags, swidth, hostname

+ 2 - 2
src/borg/archiver/common.py

@@ -8,12 +8,12 @@ from ..archive import Archive
 from ..constants import *  # NOQA
 from ..cache import Cache, assert_secure
 from ..helpers import Error
-from ..helpers import Manifest, AI_HUMAN_SORT_KEYS
 from ..helpers import GlobSpec, SortBySpec, positive_int_validator, location_validator, Location
+from ..helpers.nanorst import rst_to_terminal
+from ..manifest import Manifest, AI_HUMAN_SORT_KEYS
 from ..patterns import PatternMatcher
 from ..remote import RemoteRepository
 from ..repository import Repository
-from ..nanorst import rst_to_terminal
 from ..patterns import (
     ArgparsePatternAction,
     ArgparseExcludeFileAction,

+ 1 - 1
src/borg/archiver/compact.py

@@ -3,7 +3,7 @@ import argparse
 from .common import with_repository
 from ..constants import *  # NOQA
 from ..helpers import EXIT_SUCCESS
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/config.py

@@ -10,7 +10,7 @@ from ..helpers import EXIT_SUCCESS, EXIT_WARNING
 from ..helpers import Error
 from ..helpers import Location
 from ..helpers import parse_file_size
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/create.py

@@ -21,13 +21,13 @@ from ..helpers import NameSpec, CommentSpec, FilesCacheMode
 from ..helpers import eval_escapes
 from ..helpers import timestamp
 from ..helpers import get_cache_dir, os_stat
-from ..helpers import Manifest
 from ..helpers import dir_is_tagged
 from ..helpers import log_multi
 from ..helpers import basic_json_data, json_print
 from ..helpers import flags_root, flags_dir, flags_special_follow, flags_special
 from ..helpers import sig_int, ignore_sigint
 from ..helpers import iter_separated
+from ..manifest import Manifest
 from ..patterns import PatternMatcher
 from ..platform import get_flags
 from ..platform import uid2user, gid2group

+ 1 - 1
src/borg/archiver/debug.py

@@ -10,10 +10,10 @@ from ..constants import *  # NOQA
 from ..helpers import msgpack
 from ..helpers import sysinfo
 from ..helpers import bin_to_hex, prepare_dump_dict
-from ..helpers import Manifest
 from ..helpers import dash_open
 from ..helpers import StableDict
 from ..helpers import positive_int_validator, NameSpec
+from ..manifest import Manifest
 from ..platform import get_process_id
 from ..repository import Repository, LIST_SCAN_LIMIT, TAG_PUT, TAG_DELETE, TAG_COMMIT
 

+ 2 - 2
src/borg/archiver/delete.py

@@ -5,8 +5,8 @@ from .common import with_repository
 from ..archive import Archive, Statistics
 from ..cache import Cache
 from ..constants import *  # NOQA
-from ..helpers import Manifest, sig_int
-from ..helpers import log_multi, format_archive
+from ..helpers import log_multi, format_archive, sig_int
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/diff.py

@@ -5,7 +5,7 @@ from .common import with_repository, with_archive, build_matcher
 from ..archive import Archive
 from ..constants import *  # NOQA
 from ..helpers import archivename_validator
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/extract.py

@@ -10,9 +10,9 @@ from ..archive import BackupError, BackupOSError
 from ..constants import *  # NOQA
 from ..helpers import NameSpec
 from ..helpers import remove_surrogates
-from ..helpers import Manifest
 from ..helpers import HardLinkManager
 from ..helpers import ProgressIndicatorPercent
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/help.py

@@ -3,7 +3,7 @@ import functools
 import textwrap
 
 from ..constants import *  # NOQA
-from ..nanorst import rst_to_terminal
+from ..helpers.nanorst import rst_to_terminal
 
 
 class HelpMixIn:

+ 1 - 1
src/borg/archiver/info.py

@@ -6,8 +6,8 @@ from datetime import timedelta
 from .common import with_repository
 from ..archive import Archive
 from ..constants import *  # NOQA
-from ..helpers import Manifest
 from ..helpers import remove_surrogates, format_timedelta, json_print, basic_json_data
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/keys.py

@@ -6,7 +6,7 @@ from ..constants import *  # NOQA
 from ..crypto.key import AESOCBRepoKey, CHPORepoKey, Blake2AESOCBRepoKey, Blake2CHPORepoKey
 from ..crypto.key import AESOCBKeyfileKey, CHPOKeyfileKey, Blake2AESOCBKeyfileKey, Blake2CHPOKeyfileKey
 from ..crypto.keymanager import KeyManager
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from .common import with_repository
 

+ 1 - 1
src/borg/archiver/list_cmd.py

@@ -6,8 +6,8 @@ from .common import with_repository, build_matcher
 from ..archive import Archive
 from ..cache import Cache
 from ..constants import *  # NOQA
-from ..helpers import Manifest
 from ..helpers import ItemFormatter, BaseFormatter, NameSpec
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/locks.py

@@ -4,8 +4,8 @@ import subprocess
 from .common import with_repository
 from ..cache import Cache
 from ..constants import *  # NOQA
-from ..helpers import Manifest
 from ..helpers import prepare_subprocess_env
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/mount.py

@@ -4,8 +4,8 @@ import os
 from .common import with_repository, Highlander
 from ..constants import *  # NOQA
 from ..helpers import EXIT_ERROR
-from ..helpers import Manifest
 from ..helpers import umount
+from ..manifest import Manifest
 from ..remote import cache_if_remote
 
 from ..logger import create_logger

+ 2 - 5
src/borg/archiver/prune.py

@@ -9,11 +9,8 @@ from .common import with_repository
 from ..archive import Archive, Statistics
 from ..cache import Cache
 from ..constants import *  # NOQA
-from ..helpers import format_archive
-from ..helpers import interval
-from ..helpers import Manifest, sig_int
-from ..helpers import log_multi
-from ..helpers import ProgressIndicatorPercent
+from ..helpers import format_archive, interval, sig_int, log_multi, ProgressIndicatorPercent
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/rcreate.py

@@ -7,7 +7,7 @@ from ..crypto.key import key_creator, key_argument_names, tam_required_file
 from ..helpers import EXIT_WARNING
 from ..helpers import location_validator, Location
 from ..helpers import parse_storage_quota
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 2
src/borg/archiver/rdelete.py

@@ -4,11 +4,10 @@ from .common import with_repository
 from ..cache import Cache, SecurityManager
 from ..constants import *  # NOQA
 from ..helpers import EXIT_ERROR
-from ..helpers import NoManifestError
 from ..helpers import format_archive
 from ..helpers import bin_to_hex
-from ..helpers import Manifest
 from ..helpers import yes
+from ..manifest import Manifest, NoManifestError
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/recreate.py

@@ -8,7 +8,7 @@ from ..compress import CompressionSpec
 from ..helpers import archivename_validator, ChunkerParams
 from ..helpers import CommentSpec
 from ..helpers import timestamp
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/rename.py

@@ -3,7 +3,7 @@ import argparse
 from .common import with_repository, with_archive
 from ..constants import *  # NOQA
 from ..helpers import archivename_validator
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/rinfo.py

@@ -3,8 +3,8 @@ import textwrap
 
 from .common import with_repository
 from ..constants import *  # NOQA
-from ..helpers import Manifest
 from ..helpers import bin_to_hex, json_print, basic_json_data
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/archiver/rlist.py

@@ -4,8 +4,8 @@ import sys
 
 from .common import with_repository
 from ..constants import *  # NOQA
-from ..helpers import Manifest
 from ..helpers import BaseFormatter, ArchiveFormatter, json_print, basic_json_data
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 19 - 2
src/borg/archiver/tar.py

@@ -10,10 +10,8 @@ import time
 from ..archive import Archive, TarfileObjectProcessors, ChunksProcessor
 from ..compress import CompressionSpec
 from ..constants import *  # NOQA
-from ..helpers import Manifest
 from ..helpers import HardLinkManager
 from ..helpers import ProgressIndicatorPercent
-from ..helpers import get_tar_filter
 from ..helpers import dash_open
 from ..helpers import msgpack
 from ..helpers import create_filter_process
@@ -24,6 +22,7 @@ from ..helpers import remove_surrogates
 from ..helpers import timestamp
 from ..helpers import basic_json_data, json_print
 from ..helpers import log_multi
+from ..manifest import Manifest
 
 from .common import with_repository, with_archive, Highlander, define_exclusion_group
 from .common import build_matcher, build_filter
@@ -33,6 +32,24 @@ from ..logger import create_logger
 logger = create_logger(__name__)
 
 
+def get_tar_filter(fname, decompress):
+    # Note that filter is None if fname is '-'.
+    if fname.endswith((".tar.gz", ".tgz")):
+        filter = "gzip -d" if decompress else "gzip"
+    elif fname.endswith((".tar.bz2", ".tbz")):
+        filter = "bzip2 -d" if decompress else "bzip2"
+    elif fname.endswith((".tar.xz", ".txz")):
+        filter = "xz -d" if decompress else "xz"
+    elif fname.endswith((".tar.lz4",)):
+        filter = "lz4 -d" if decompress else "lz4"
+    elif fname.endswith((".tar.zstd",)):
+        filter = "zstd -d" if decompress else "zstd"
+    else:
+        filter = None
+    logger.debug("Automatically determined tar filter: %s", filter)
+    return filter
+
+
 class TarMixIn:
     @with_repository(compatibility=(Manifest.Operation.READ,))
     @with_archive

+ 1 - 1
src/borg/archiver/transfer.py

@@ -7,7 +7,7 @@ from ..crypto.key import uses_same_id_hash, uses_same_chunker_secret
 from ..helpers import EXIT_SUCCESS, EXIT_ERROR
 from ..helpers import location_validator, Location
 from ..helpers import format_file_size
-from ..helpers import Manifest
+from ..manifest import Manifest
 
 from ..logger import create_logger
 

+ 1 - 1
src/borg/cache.py

@@ -16,7 +16,6 @@ from .constants import CACHE_README, FILES_CACHE_MODE_DISABLED
 from .hashindex import ChunkIndex, ChunkIndexEntry, CacheSynchronizer
 from .helpers import Location
 from .helpers import Error
-from .helpers import Manifest
 from .helpers import get_cache_dir, get_security_dir
 from .helpers import bin_to_hex, parse_stringified_list
 from .helpers import format_file_size
@@ -32,6 +31,7 @@ from .item import ArchiveItem, ChunkListEntry
 from .crypto.key import PlaintextKey
 from .crypto.file_integrity import IntegrityCheckedFile, DetachedIntegrityCheckedFile, FileIntegrityError
 from .locking import Lock
+from .manifest import Manifest
 from .platform import SaveFile
 from .remote import cache_if_remote
 from .repository import LIST_SCAN_LIMIT

+ 2 - 2
src/borg/crypto/key.py

@@ -3,7 +3,7 @@ import os
 import textwrap
 from binascii import a2b_base64, b2a_base64, hexlify
 from hashlib import sha256, pbkdf2_hmac
-from typing import Literal, Callable, Sequence
+from typing import Literal, Callable
 
 from ..logger import create_logger
 
@@ -20,8 +20,8 @@ from ..helpers import get_limited_unpacker
 from ..helpers import bin_to_hex
 from ..helpers.passphrase import Passphrase, PasswordRetriesExceeded, PassphraseWrong
 from ..helpers import msgpack
-from ..helpers.manifest import Manifest
 from ..item import Key, EncryptedKey, want_bytes
+from ..manifest import Manifest
 from ..platform import SaveFile
 
 from .nonces import NonceManager

+ 2 - 1
src/borg/crypto/keymanager.py

@@ -4,7 +4,8 @@ import textwrap
 from binascii import unhexlify, a2b_base64, b2a_base64
 from hashlib import sha256
 
-from ..helpers import Manifest, NoManifestError, Error, yes, bin_to_hex, dash_open
+from ..helpers import Error, yes, bin_to_hex, dash_open
+from ..manifest import Manifest, NoManifestError
 from ..repository import Repository
 
 from .key import CHPOKeyfileKey, RepoKeyNotFoundError, KeyBlobStorage, identify_key

+ 1 - 1
src/borg/fuse.py

@@ -41,8 +41,8 @@ from .hashindex import FuseVersionsIndex
 from .helpers import daemonize, daemonizing, signal_handler, format_file_size
 from .helpers import HardLinkManager
 from .helpers import msgpack
+from .helpers.lrucache import LRUCache
 from .item import Item
-from .lrucache import LRUCache
 from .platform import uid2user, gid2group
 from .remote import RemoteRepository
 

+ 1 - 2
src/borg/helpers/__init__.py

@@ -16,8 +16,7 @@ from .fs import dir_is_tagged, dir_is_cachedir, make_path_safe, scandir_inorder
 from .fs import secure_erase, safe_unlink, dash_open, os_open, os_stat, umount
 from .fs import O_, flags_root, flags_dir, flags_special_follow, flags_special, flags_base, flags_normal, flags_noatime
 from .fs import HardLinkManager
-from .manifest import Manifest, NoManifestError, MandatoryFeatureUnsupported, AI_HUMAN_SORT_KEYS
-from .misc import sysinfo, log_multi, consume, get_tar_filter
+from .misc import sysinfo, log_multi, consume
 from .misc import ChunkIteratorFileWrapper, open_item, chunkit, iter_separated, ErrorIgnoringTextIOWrapper
 from .parseformat import bin_to_hex, safe_encode, safe_decode
 from .parseformat import remove_surrogates, eval_escapes, decode_dict, positive_int_validator, interval

+ 0 - 0
src/borg/lrucache.py → src/borg/helpers/lrucache.py


+ 0 - 18
src/borg/helpers/misc.py

@@ -189,21 +189,3 @@ def iter_separated(fd, sep=None, read_size=4096):
     # or if there was no data before EOF
     if len(part) > 0:  # type: ignore[arg-type]
         yield part
-
-
-def get_tar_filter(fname, decompress):
-    # Note that filter is None if fname is '-'.
-    if fname.endswith((".tar.gz", ".tgz")):
-        filter = "gzip -d" if decompress else "gzip"
-    elif fname.endswith((".tar.bz2", ".tbz")):
-        filter = "bzip2 -d" if decompress else "bzip2"
-    elif fname.endswith((".tar.xz", ".txz")):
-        filter = "xz -d" if decompress else "xz"
-    elif fname.endswith((".tar.lz4",)):
-        filter = "lz4 -d" if decompress else "lz4"
-    elif fname.endswith((".tar.zstd",)):
-        filter = "zstd -d" if decompress else "zstd"
-    else:
-        filter = None
-    logger.debug("Automatically determined tar filter: %s", filter)
-    return filter

+ 1 - 1
src/borg/nanorst.py → src/borg/helpers/nanorst.py

@@ -1,7 +1,7 @@
 import io
 import sys
 
-from .helpers import is_terminal
+from . import is_terminal
 
 
 class TextPecker:

+ 2 - 3
src/borg/helpers/parseformat.py

@@ -5,7 +5,6 @@ import os
 import os.path
 import re
 import shlex
-import socket
 import stat
 import uuid
 from binascii import hexlify
@@ -219,7 +218,7 @@ CommentSpec = replace_placeholders
 
 
 def SortBySpec(text):
-    from .manifest import AI_HUMAN_SORT_KEYS
+    from ..manifest import AI_HUMAN_SORT_KEYS
 
     for token in text.split(","):
         if token not in AI_HUMAN_SORT_KEYS:
@@ -591,7 +590,7 @@ class ArchiveFormatter(BaseFormatter):
 
     @classmethod
     def available_keys(cls):
-        from .manifest import ArchiveInfo
+        from ..manifest import ArchiveInfo
 
         fake_archive_info = ArchiveInfo("archivename", b"\1" * 32, datetime(1970, 1, 1, tzinfo=timezone.utc))
         formatter = cls("", None, None, None)

+ 0 - 0
src/borg/shellpattern.py → src/borg/helpers/shellpattern.py


+ 11 - 12
src/borg/helpers/manifest.py → src/borg/manifest.py

@@ -7,17 +7,16 @@ from datetime import datetime, timedelta, timezone
 from operator import attrgetter
 from typing import Sequence, FrozenSet
 
-from .errors import Error
-
-from ..logger import create_logger
+from .logger import create_logger
 
 logger = create_logger()
 
-from .datastruct import StableDict
-from .parseformat import bin_to_hex
-from .time import parse_timestamp
-from .. import shellpattern
-from ..constants import *  # NOQA
+from .helpers import shellpattern
+from .constants import *  # NOQA
+from .helpers.datastruct import StableDict
+from .helpers.parseformat import bin_to_hex
+from .helpers.time import parse_timestamp
+from .helpers.errors import Error
 
 
 class NoManifestError(Error):
@@ -184,9 +183,9 @@ class Manifest:
 
     @classmethod
     def load(cls, repository, operations, key=None, force_tam_not_required=False):
-        from ..item import ManifestItem
-        from ..crypto.key import key_factory, tam_required_file, tam_required
-        from ..repository import Repository
+        from .item import ManifestItem
+        from .crypto.key import key_factory, tam_required_file, tam_required
+        from .repository import Repository
 
         try:
             cdata = repository.get(cls.MANIFEST_ID)
@@ -248,7 +247,7 @@ class Manifest:
         return result
 
     def write(self):
-        from ..item import ManifestItem
+        from .item import ManifestItem
 
         if self.key.tam_required:
             self.config["tam_required"] = True

+ 1 - 2
src/borg/patterns.py

@@ -7,8 +7,7 @@ import unicodedata
 from collections import namedtuple
 from enum import Enum
 
-from . import shellpattern
-from .helpers import clean_lines
+from .helpers import clean_lines, shellpattern
 from .helpers.errors import Error
 
 

+ 3 - 3
src/borg/repository.py

@@ -5,7 +5,7 @@ import shutil
 import stat
 import struct
 import time
-from binascii import hexlify, unhexlify
+from binascii import unhexlify
 from collections import defaultdict
 from configparser import ConfigParser
 from datetime import datetime, timezone
@@ -19,11 +19,11 @@ from .helpers import Location
 from .helpers import ProgressIndicatorPercent
 from .helpers import bin_to_hex
 from .helpers import secure_erase, safe_unlink
-from .helpers import Manifest
 from .helpers import msgpack
+from .helpers.lrucache import LRUCache
 from .locking import Lock, LockError, LockErrorT
 from .logger import create_logger
-from .lrucache import LRUCache
+from .manifest import Manifest
 from .platform import SaveFile, SyncFile, sync_dir, safe_fadvise
 from .checksums import crc32, StreamingXXH64
 from .crypto.file_integrity import IntegrityCheckedFile, FileIntegrityError

+ 1 - 1
src/borg/testsuite/archive.py

@@ -10,9 +10,9 @@ from . import BaseTestCase
 from ..crypto.key import PlaintextKey
 from ..archive import Archive, CacheChunkBuffer, RobustUnpacker, valid_msgpacked_dict, ITEM_KEYS, Statistics
 from ..archive import BackupOSError, backup_io, backup_io_iter, get_item_uid_gid
-from ..helpers import Manifest
 from ..helpers import msgpack
 from ..item import Item, ArchiveItem
+from ..manifest import Manifest
 from ..platform import uid2user, gid2group
 
 

+ 4 - 4
src/borg/testsuite/archiver.py

@@ -29,7 +29,7 @@ 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, build_matcher
+from ..archiver.common import build_filter
 from ..cache import Cache, LocalCache
 from ..chunker import has_seek_hole
 from ..constants import *  # NOQA
@@ -37,15 +37,15 @@ from ..crypto.key import FlexiKey, AESOCBRepoKey, AESOCBKeyfileKey, CHPOKeyfileK
 from ..crypto.keymanager import RepoIdMismatch, NotABorgKeyFile
 from ..crypto.file_integrity import FileIntegrityError
 from ..helpers import Location, get_security_dir
-from ..helpers import Manifest, MandatoryFeatureUnsupported
 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 ..nanorst import RstToTextLazy, rst_to_terminal
+from ..helpers.nanorst import RstToTextLazy, rst_to_terminal
+from ..manifest import Manifest, MandatoryFeatureUnsupported
 from ..patterns import IECommand, PatternMatcher, parse_pattern
-from ..item import Item, ItemDiff, chunks_contents_equal
+from ..item import Item, chunks_contents_equal
 from ..locking import LockFailed
 from ..logger import setup_logging
 from ..remote import RemoteRepository, PathNotAllowed

+ 1 - 1
src/borg/testsuite/cache.py

@@ -12,7 +12,7 @@ from ..cache import AdHocCache
 from ..compress import CompressionSpec
 from ..crypto.key import AESOCBRepoKey
 from ..hashindex import ChunkIndex, CacheSynchronizer
-from ..helpers import Manifest
+from ..manifest import Manifest
 from ..repository import Repository
 
 

+ 1 - 1
src/borg/testsuite/lrucache.py

@@ -2,7 +2,7 @@ from tempfile import TemporaryFile
 
 import pytest
 
-from ..lrucache import LRUCache
+from ..helpers.lrucache import LRUCache
 
 
 class TestLRUCache:

+ 1 - 1
src/borg/testsuite/nanorst.py

@@ -1,6 +1,6 @@
 import pytest
 
-from ..nanorst import rst_to_text
+from ..helpers.nanorst import rst_to_text
 
 
 def test_inline():

+ 1 - 1
src/borg/testsuite/shellpattern.py

@@ -2,7 +2,7 @@ import re
 
 import pytest
 
-from .. import shellpattern
+from ..helpers import shellpattern
 
 
 def check(path, pattern):