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: