diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7b315ec --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelog + +## 1.0.0 - 2026-05-21 + +Initial stable release of the Django-first pobsync control panel. + +### Added + +- Django control panel for hosts, global settings, schedules, SSH credentials, snapshots, runs, self-checks, and logs. +- Native systemd installer and updater for production backup servers. +- SQLite by default, with optional MariaDB support. +- Scheduler and worker services for queued manual backups and scheduled backups. +- Manual backup, dry-run, cancellation, verbose rsync logging, and run detail views. +- Snapshot discovery for existing backup directories and SQL-backed snapshot records. +- SQL retention planning and apply flow with base snapshot protection and incomplete snapshot visibility. +- Dashboard and host pages with backup health, latest run/snapshot, next run, and storage/stat summaries. +- Restore guidance on snapshot detail pages. + +### Changed + +- Django and the database are now the source of truth for configuration. +- Docker Compose is documented as development and disposable test tooling rather than the primary production path. +- The `pobsync` console entrypoint is now a maintainer layer around Django management commands. + +### Removed + +- Legacy YAML config import/export workflow. +- Public short aliases for configuration commands. +- Obsolete global config storage fields. diff --git a/pyproject.toml b/pyproject.toml index 10efdfe..a7b13da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pobsync" -version = "0.1.0" +version = "1.0.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 4e3a74d..db084d0 100644 --- a/src/pobsync/__init__.py +++ b/src/pobsync/__init__.py @@ -1,3 +1,2 @@ __all__ = ["__version__"] -__version__ = "0.1.0" - +__version__ = "1.0.0" diff --git a/src/pobsync/cli.py b/src/pobsync/cli.py index 46a7c8f..bf5d05b 100644 --- a/src/pobsync/cli.py +++ b/src/pobsync/cli.py @@ -6,6 +6,8 @@ from typing import Sequence from django.core.management import execute_from_command_line +from pobsync import __version__ + COMMAND_ALIASES = { "backup": "run_pobsync_backup", @@ -34,6 +36,9 @@ Configuration is managed from the Django control panel. Use def main(argv: Sequence[str] | None = None) -> int: args = list(sys.argv[1:] if argv is None else argv) + if args and args[0] in {"--version", "version"}: + print(f"pobsync {__version__}") + return 0 if not args or args[0] in {"-h", "--help", "help"}: print(_usage()) return 0 diff --git a/src/pobsync_backend/tests/test_console_entrypoint.py b/src/pobsync_backend/tests/test_console_entrypoint.py index 8baa148..b5ce58a 100644 --- a/src/pobsync_backend/tests/test_console_entrypoint.py +++ b/src/pobsync_backend/tests/test_console_entrypoint.py @@ -9,6 +9,14 @@ from pobsync.cli import main class ConsoleEntrypointTests(SimpleTestCase): + def test_version_prints_package_version(self) -> None: + stdout = StringIO() + with patch("sys.stdout", stdout): + exit_code = main(["--version"]) + + self.assertEqual(exit_code, 0) + self.assertEqual(stdout.getvalue().strip(), "pobsync 1.0.0") + def test_maps_backup_alias_to_django_command(self) -> None: with patch("pobsync.cli.execute_from_command_line") as execute: exit_code = main(["backup", "web-01", "--dry-run"])