From fb4cd4cd3ef8be9395bb1c86d929ff635fbac180 Mon Sep 17 00:00:00 2001 From: Alex Blank Date: Mon, 27 Jul 2026 21:22:54 +0200 Subject: [PATCH] fix(v2): support nested repository paths --- backend/src/backup_tool/repository.py | 8 +++++++- tests/integration/test_repository_safety.py | 11 ++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/backend/src/backup_tool/repository.py b/backend/src/backup_tool/repository.py index 29e0e8c..4936715 100644 --- a/backend/src/backup_tool/repository.py +++ b/backend/src/backup_tool/repository.py @@ -64,7 +64,13 @@ def _canonical_json(payload: dict[str, object]) -> str: def _assert_capacity(settings: Settings, root: Path) -> None: - usage = shutil.disk_usage(root) + capacity_root = root + while not capacity_root.exists(): + parent = capacity_root.parent + if parent == capacity_root: + raise RepositoryError("repository root is unreadable") + capacity_root = parent + usage = shutil.disk_usage(capacity_root) free_percent = usage.free * 100 / usage.total if usage.free < settings.min_free_bytes or free_percent < settings.min_free_percent: raise RepositoryError("repository root does not meet minimum free capacity") diff --git a/tests/integration/test_repository_safety.py b/tests/integration/test_repository_safety.py index d818ab3..cce9458 100644 --- a/tests/integration/test_repository_safety.py +++ b/tests/integration/test_repository_safety.py @@ -61,6 +61,13 @@ def test_initialization_rejects_symlinked_destination_component(tmp_path: Path) initialize(settings, "linked/child", "none", "none") +def test_initialization_supports_not_yet_created_nested_path(tmp_path: Path) -> None: + settings = settings_for(tmp_path) + result = initialize(settings, "nested/main", "none", "none") + assert result.root == settings.repository_roots[0] / "nested" / "main" + assert (result.root / "repository.json").is_file() + + @pytest.mark.parametrize( ("minimum", "usage"), [ @@ -79,7 +86,9 @@ def test_initialization_rejects_insufficient_capacity( initialize(settings, "main", "none", "none") -def test_initialization_emits_complete_repository_protocol_metadata(tmp_path: Path) -> None: +def test_initialization_emits_complete_repository_protocol_metadata( + tmp_path: Path, +) -> None: result = initialize(settings_for(tmp_path), "main", "none", "none") try: payload = json.loads((result.root / "repository.json").read_text(encoding="utf-8"))