Skip to content

Commit 15bec44

Browse files
committed
legacy: extract RepoObj1, update all imports, drop re-export stubs
1 parent 4db927c commit 15bec44

13 files changed

Lines changed: 129 additions & 112 deletions

File tree

src/borg/archiver/_common.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313
from ..helpers.nanorst import rst_to_terminal
1414
from ..manifest import Manifest, AI_HUMAN_SORT_KEYS
1515
from ..patterns import PatternMatcher
16-
from ..legacyremote import LegacyRemoteRepository
16+
from ..legacy.remote import LegacyRemoteRepository
1717
from ..remote import RemoteRepository
18-
from ..legacyrepository import LegacyRepository
18+
from ..legacy.repository import LegacyRepository
1919
from ..repository import Repository
20-
from ..repoobj import RepoObj, RepoObj1
20+
from ..repoobj import RepoObj
21+
from ..legacy.repoobj import RepoObj1
2122
from ..patterns import (
2223
ArgparsePatternAction,
2324
ArgparseExcludeFileAction,

src/borg/archiver/transfer_cmd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ..helpers.argparsing import ArgumentParser, ArgumentTypeError
1111
from ..item import ChunkListEntry
1212
from ..manifest import Manifest
13-
from ..legacyrepository import LegacyRepository
13+
from ..legacy.repository import LegacyRepository
1414
from ..repository import Repository
1515

1616
from ..logger import create_logger

src/borg/helpers/fs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ def safe_unlink(path):
487487
Use this when deleting potentially large files when recovering
488488
from a VFS error such as ENOSPC. It can help a full file system
489489
recover. Refer to the "File system interaction" section
490-
in legacyrepository.py for further explanations.
490+
in legacy/repository.py for further explanations.
491491
"""
492492
path_obj = Path(path)
493493
try:

src/borg/helpers/parseformat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,9 +1335,9 @@ def ellipsis_truncate(msg, space):
13351335

13361336
class BorgJsonEncoder(json.JSONEncoder):
13371337
def default(self, o):
1338-
from ..legacyrepository import LegacyRepository
1338+
from ..legacy.repository import LegacyRepository
13391339
from ..repository import Repository
1340-
from ..legacyremote import LegacyRemoteRepository
1340+
from ..legacy.remote import LegacyRemoteRepository
13411341
from ..remote import RemoteRepository
13421342
from ..archive import Archive
13431343
from ..cache import AdHocWithFilesCache

src/borg/legacy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Borg Legacy Package \u2014 Borg 1.x compatibility layer.
2+
Borg Legacy Package Borg 1.x compatibility layer.
33
44
This package contains all code specific to reading/writing Borg 1.x repositories.
55
It is required for ``borg transfer --from-borg1`` and ``borg serve`` (serving v1 clients).

src/borg/legacy/remote.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,24 @@
1616

1717
from xxhash import xxh64
1818

19-
from . import __version__
20-
from .compress import Compressor
21-
from .constants import * # NOQA
22-
from .helpers import Error, ErrorWithTraceback, IntegrityError
23-
from .helpers import bin_to_hex
24-
from .helpers import get_limited_unpacker
25-
from .helpers import replace_placeholders
26-
from .helpers import format_file_size
27-
from .helpers import safe_unlink
28-
from .helpers import prepare_subprocess_env, ignore_sigint
29-
from .helpers import get_socket_filename
30-
from .fslocking import LockTimeout, NotLocked, NotMyLock, LockFailed
31-
from .logger import create_logger
32-
from .helpers import msgpack
33-
from .legacyrepository import LegacyRepository
34-
from .version import parse_version, format_version
35-
from .helpers.datastruct import EfficientCollectionQueue
36-
from .platform import is_win32
19+
from .. import __version__
20+
from ..compress import Compressor
21+
from ..constants import * # NOQA
22+
from ..helpers import Error, ErrorWithTraceback, IntegrityError
23+
from ..helpers import bin_to_hex
24+
from ..helpers import get_limited_unpacker
25+
from ..helpers import replace_placeholders
26+
from ..helpers import format_file_size
27+
from ..helpers import safe_unlink
28+
from ..helpers import prepare_subprocess_env, ignore_sigint
29+
from ..helpers import get_socket_filename
30+
from ..fslocking import LockTimeout, NotLocked, NotMyLock, LockFailed
31+
from ..logger import create_logger
32+
from ..helpers import msgpack
33+
from .repository import LegacyRepository
34+
from ..version import parse_version, format_version
35+
from ..helpers.datastruct import EfficientCollectionQueue
36+
from ..platform import is_win32
3737

3838
logger = create_logger(__name__)
3939

src/borg/legacy/repoobj.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
"""Legacy RepoObj1 — Borg 1.x repository object format.
2+
3+
Moved from borg.repoobj as part of the legacy code separation.
4+
"""
5+
6+
from ..constants import * # NOQA
7+
from ..helpers import workarounds
8+
from ..compress import Compressor, get_compressor
9+
10+
# Workaround for lost passphrase or key in "authenticated" or "authenticated-blake2" mode
11+
AUTHENTICATED_NO_KEY = "authenticated_no_key" in workarounds
12+
13+
14+
class RepoObj1: # legacy
15+
@classmethod
16+
def extract_crypted_data(cls, data: bytes) -> bytes:
17+
# used for crypto type detection
18+
return data
19+
20+
def __init__(self, key):
21+
self.key = key
22+
self.compressor = get_compressor("lz4", legacy_mode=True)
23+
24+
def id_hash(self, data: bytes) -> bytes:
25+
return self.key.id_hash(data)
26+
27+
def format(
28+
self,
29+
id: bytes,
30+
meta: dict,
31+
data: bytes,
32+
compress: bool = True,
33+
size: int = None,
34+
ctype: int = None,
35+
clevel: int = None,
36+
ro_type: str = None,
37+
) -> bytes:
38+
assert isinstance(id, bytes)
39+
assert meta == {}
40+
assert isinstance(data, (bytes, memoryview))
41+
assert ro_type is not None
42+
assert compress or size is not None and ctype is not None and clevel is not None
43+
if compress:
44+
assert size is None or size == len(data)
45+
meta, data_compressed = self.compressor.compress(meta, data)
46+
else:
47+
assert isinstance(size, int)
48+
data_compressed = data # is already compressed, must include type/level bytes
49+
data_encrypted = self.key.encrypt(id, data_compressed)
50+
return data_encrypted
51+
52+
def parse_meta(self, id: bytes, cdata: bytes) -> dict:
53+
raise NotImplementedError("parse_meta is not available for RepoObj1")
54+
55+
def parse(
56+
self, id: bytes, cdata: bytes, decompress: bool = True, want_compressed: bool = False, ro_type: str = None
57+
) -> tuple[dict, bytes]:
58+
assert not (not decompress and not want_compressed), "invalid parameter combination!"
59+
assert isinstance(id, bytes)
60+
assert isinstance(cdata, bytes)
61+
assert ro_type is not None
62+
data_compressed = self.key.decrypt(id, cdata)
63+
compressor_cls, compression_level = Compressor.detect(data_compressed[:2])
64+
compressor = compressor_cls(level=compression_level, legacy_mode=True)
65+
meta_compressed = {}
66+
meta_compressed["ctype"] = compressor.ID
67+
meta_compressed["clevel"] = compressor.level
68+
meta_compressed["csize"] = len(data_compressed)
69+
if decompress:
70+
meta, data = compressor.decompress(None, data_compressed)
71+
if not AUTHENTICATED_NO_KEY:
72+
self.key.assert_id(id, data)
73+
else:
74+
meta, data = None, None
75+
return meta_compressed if want_compressed else meta, data_compressed if want_compressed else data

src/borg/legacy/repository.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,22 @@
1414

1515
import xxhash
1616

17-
from .constants import * # NOQA
18-
from .hashindex import NSIndex1Entry, NSIndex1
19-
from .helpers import Error, ErrorWithTraceback, IntegrityError, format_file_size, parse_file_size
20-
from .helpers import Location
21-
from .helpers import ProgressIndicatorPercent
22-
from .helpers import bin_to_hex, hex_to_bin
23-
from .helpers import secure_erase, safe_unlink
24-
from .helpers import msgpack
25-
from .helpers.lrucache import LRUCache
26-
from .fslocking import Lock, LockError, LockErrorT
27-
from .logger import create_logger
28-
from .manifest import Manifest, NoManifestError
29-
from .platform import SaveFile, SyncFile, sync_dir, safe_fadvise
30-
from .repoobj import RepoObj
31-
from .checksums import crc32
32-
from .crypto.file_integrity import IntegrityCheckedFile, FileIntegrityError
17+
from ..constants import * # NOQA
18+
from ..hashindex import NSIndex1Entry, NSIndex1
19+
from ..helpers import Error, ErrorWithTraceback, IntegrityError, format_file_size, parse_file_size
20+
from ..helpers import Location
21+
from ..helpers import ProgressIndicatorPercent
22+
from ..helpers import bin_to_hex, hex_to_bin
23+
from ..helpers import secure_erase, safe_unlink
24+
from ..helpers import msgpack
25+
from ..helpers.lrucache import LRUCache
26+
from ..fslocking import Lock, LockError, LockErrorT
27+
from ..logger import create_logger
28+
from ..manifest import Manifest, NoManifestError
29+
from ..platform import SaveFile, SyncFile, sync_dir, safe_fadvise
30+
from ..repoobj import RepoObj
31+
from ..checksums import crc32
32+
from ..crypto.file_integrity import IntegrityCheckedFile, FileIntegrityError
3333

3434
logger = create_logger(__name__)
3535

src/borg/manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def ids(self, *, deleted=False):
117117

118118
def _get_archive_meta(self, id: bytes) -> dict:
119119
# get all metadata directly from the ArchiveItem in the repo.
120-
from .legacyrepository import LegacyRepository
120+
from .legacy.repository import LegacyRepository
121121
from .repository import Repository
122122

123123
try:

src/borg/remote.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from .logger import create_logger, borg_serve_log_queue
3737
from .manifest import NoManifestError
3838
from .helpers import msgpack
39-
from .legacyrepository import LegacyRepository
39+
from .legacy.repository import LegacyRepository
4040
from .repository import Repository, StoreObjectNotFound
4141
from .version import parse_version, format_version
4242
from .helpers.datastruct import EfficientCollectionQueue

0 commit comments

Comments
 (0)