From 02616eebbc9895c1c244197f48131e4038f08505 Mon Sep 17 00:00:00 2001 From: Peter van Arkel Date: Thu, 28 May 2026 22:19:03 +0200 Subject: [PATCH] (release) Prepare 1.2.0 Bump the package version to 1.2.0 and document the operations-focused release with updater, readonly access, notifications, bandwidth controls, live progress, and more robust retention cleanup. Make the CLI version test assert against the package version so future release bumps do not require changing a hardcoded expected value. --- CHANGELOG.md | 29 +++++++++++++++++++ pyproject.toml | 2 +- src/pobsync/__init__.py | 2 +- .../tests/test_console_entrypoint.py | 3 +- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89a252f..ccf084d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,34 @@ # Changelog +## 1.2.0 - 2026-05-28 + +Operations-focused release for more reliable production backups and maintenance. + +### Added + +- Staff-only updater page for checking configured Gitea releases, inspecting the installed git checkout, fetching tags, pulling the current branch, and running the native systemd updater. +- Read-only control panel access level for authenticated non-staff users, with status pages visible and credentials, logs, configs, retention, and mutating actions kept staff-only. +- Run completion notifications for email and webhooks, including recorded delivery history per run and target. +- Dedicated hosts page with host cards, enabled/disabled filtering, and quick host/schedule/retention state controls. +- Per-host rsync bandwidth limit overrides with inherit, unlimited, and explicit limit semantics. +- Backup data totals by snapshot kind on dashboard and host detail pages, including unique/non-hardlinked data totals. + +### Changed + +- Real backup runs now default to verbose rsync progress output so the live run view behaves consistently with dry-runs. +- Run progress panels are shared between dry-runs and real runs for more consistent status, timing, cancellation, and log display. +- Incomplete snapshot cleanup now requires operator review before deletion. +- Incomplete snapshot size reporting now prefers on-disk measurement when metadata is stale or missing. +- Installer and environment examples now include optional updater configuration. + +### Fixed + +- Remote preflight shell commands are now quoted correctly, including roots such as `/`. +- Worker reconciliation now detects real rsync failures and stale/running process state more reliably. +- Retention pruning and incomplete cleanup can delete snapshots containing restrictive directory modes preserved by rsync archive mode. +- Snapshot data summaries no longer count incomplete metadata/log files as backup data when measuring from disk. +- Filesystem SSH credential tests use writable test state without changing production defaults. + ## 1.1.0 - 2026-05-21 UI-focused release for the Django control panel. diff --git a/pyproject.toml b/pyproject.toml index d6ad68d..bd25d87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pobsync" -version = "1.1.0" +version = "1.2.0" description = "Pull-based rsync backup tool with hardlinked snapshots" requires-python = ">=3.11" dependencies = [ diff --git a/src/pobsync/__init__.py b/src/pobsync/__init__.py index 52bb99a..1550176 100644 --- a/src/pobsync/__init__.py +++ b/src/pobsync/__init__.py @@ -1,2 +1,2 @@ __all__ = ["__version__"] -__version__ = "1.1.0" +__version__ = "1.2.0" diff --git a/src/pobsync_backend/tests/test_console_entrypoint.py b/src/pobsync_backend/tests/test_console_entrypoint.py index 57ffd08..7f939f4 100644 --- a/src/pobsync_backend/tests/test_console_entrypoint.py +++ b/src/pobsync_backend/tests/test_console_entrypoint.py @@ -5,6 +5,7 @@ from unittest.mock import patch from django.test import SimpleTestCase +from pobsync import __version__ from pobsync.cli import main @@ -15,7 +16,7 @@ class ConsoleEntrypointTests(SimpleTestCase): exit_code = main(["--version"]) self.assertEqual(exit_code, 0) - self.assertEqual(stdout.getvalue().strip(), "pobsync 1.1.0") + self.assertEqual(stdout.getvalue().strip(), f"pobsync {__version__}") def test_maps_backup_alias_to_django_command(self) -> None: with patch("pobsync.cli.execute_from_command_line") as execute: