feat: Snapshot retention, extended snapshots, graceful remote degradation (#63, #57, #66) #89

Merged
jmiller merged 4 commits from feat/batch-63-57-66 into main 2026-06-22 00:33:51 +00:00
Owner

Summary

Replaces closed #88. Three features + review fix. Closes #63, closes #57, closes #66.

#63: Snapshot retention & auto-cleanup

  • Config fields: snapshot_retention_count (default 20), snapshot_retention_days (default 30)
  • System plugin: cleanupOldSnapshots() alongside existing backup cleanup

#57: Extended snapshots with custom fields and tags

Captures #__tags, #__fields, #__fields_values, #__fields_categories when articles are included.

#66: Graceful remote upload degradation

Upload failure no longer marks backup as failed. Local archive stays complete.

Review fix

#__fields_values dump and restore scoped to com_content.article via subquery — previously deleted ALL field values across all extensions.

Test Plan

  • Snapshot retention deletes oldest when count exceeded
  • Extended snapshot JSON contains tags + fields tables
  • Replace-mode restore only deletes com_content field values, not contacts/users
  • Backup with invalid remote creds: status = complete, warning logged
## Summary Replaces closed #88. Three features + review fix. Closes #63, closes #57, closes #66. ### #63: Snapshot retention & auto-cleanup - Config fields: `snapshot_retention_count` (default 20), `snapshot_retention_days` (default 30) - System plugin: `cleanupOldSnapshots()` alongside existing backup cleanup ### #57: Extended snapshots with custom fields and tags Captures `#__tags`, `#__fields`, `#__fields_values`, `#__fields_categories` when articles are included. ### #66: Graceful remote upload degradation Upload failure no longer marks backup as failed. Local archive stays `complete`. ### Review fix `#__fields_values` dump and restore scoped to `com_content.article` via subquery — previously deleted ALL field values across all extensions. ## Test Plan - [ ] Snapshot retention deletes oldest when count exceeded - [ ] Extended snapshot JSON contains tags + fields tables - [ ] Replace-mode restore only deletes com_content field values, not contacts/users - [ ] Backup with invalid remote creds: status = complete, warning logged
jmiller added the component: enginecomponent: scheduler labels 2026-06-22 00:33:23 +00:00
jmiller added 4 commits 2026-06-22 00:33:23 +00:00
Add retention settings for content snapshots (max count, max age days)
in component options. System plugin runs cleanupOldSnapshots() alongside
existing backup cleanup, deleting JSON files and DB records.

Closes #63
When articles are included in a snapshot, now also captures:
- #__tags (tag definitions)
- #__fields (custom field definitions for com_content.article)
- #__fields_values (custom field values)
- #__fields_categories (field-to-category mappings)

Restore correctly scopes deletes to avoid touching non-content fields.

Closes #57
fix: graceful degradation when remote upload fails (#66)
Universal: PR Check / Branch Policy (pull_request) Failing after 2s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 5s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: PR Check / Validate PR (pull_request) Failing after 9s
Universal: PR Check / Secret Scan (pull_request) Successful in 11s
Branch Cleanup / Delete merged branch (pull_request) Has been skipped
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Has been skipped
Universal: Auto Version Bump / Version Bump (push) Successful in 11s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 44s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 47s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 17s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been cancelled
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been cancelled
Joomla: Extension CI / Build RC Pre-Release (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report Issues (pull_request) Has been cancelled
8b6e260b28
Remote upload failure (S3/FTP/GDrive) no longer marks the entire
backup as failed. The local archive is preserved with status
'complete' and the upload failure is logged as a warning. Applies
to both BackupEngine and SteppedBackupEngine.

Closes #66
fix: scope #__fields_values dump and restore to com_content.article
Universal: PR Check / Branch Policy (pull_request) Failing after 1s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 4s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Generic: Repo Health / Access control (pull_request) Successful in 2s
Universal: PR Check / Validate PR (pull_request) Failing after 5s
Universal: PR Check / Secret Scan (pull_request) Successful in 7s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 11s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 28s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Successful in 17s
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Failing after 2m55s
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been cancelled
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been cancelled
Joomla: Extension CI / Build RC Pre-Release (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report Issues (pull_request) Has been cancelled
ad1c0cf349
The fields_values table is shared across all Joomla extensions.
Previously, dump captured ALL field values and restore deleted ALL
field values, destroying data for contacts, users, and other
extensions. Now scoped via subquery on field_id WHERE context =
'com_content.article'.
jmiller merged commit 5815a65a39 into main 2026-06-22 00:33:51 +00:00
jmiller deleted branch feat/batch-63-57-66 2026-06-22 00:33:52 +00:00
Sign in to join this conversation.
No Reviewers
Priority -
Type -
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MokoConsulting/MokoSuiteBackup#89