4 Commits

Author SHA1 Message Date
914307ac8f ci: add golangci-lint config and fix formatting
- Add .golangci.yml with minimal linters (govet, ineffassign)
- Run gofmt -s and goimports on all files to fix formatting
- Disable fieldalignment and copylocks checks in govet
2025-12-11 17:53:28 +01:00
b18e9e9ec9 feat: Step 6 - Implement RestoreIncremental() for PostgreSQL
Implemented full incremental backup restoration:

internal/backup/incremental_postgres.go:
- RestoreIncremental() - main entry point
- Validates incremental backup metadata (.meta.json)
- Verifies base backup exists and is full backup
- Verifies checksums match (BaseBackupID == base SHA256)
- Extracts base backup to target directory first
- Applies incremental on top (overwrites changed files)
- Context cancellation support
- Comprehensive error handling:
  - Missing base backup
  - Wrong backup type (not incremental)
  - Checksum mismatch
  - Missing metadata

internal/backup/incremental_extract.go:
- extractTarGz() - extracts tar.gz archives
- Handles regular files, directories, symlinks
- Preserves file permissions and timestamps
- Progress logging every 100 files
- Context-aware (cancellable)

Restore Logic:
1. Load incremental metadata from .meta.json
2. Verify base backup exists and checksums match
3. Extract base backup (full restore)
4. Extract incremental backup (apply changed files)
5. Log completion with file counts

Features:
 Validates backup chain integrity
 Checksum verification for safety
 Handles base backup path mismatch (warning)
 Creates target directory if missing
 Preserves file attributes (perms, mtime)
 Detailed logging at each step

Status: READY FOR TESTING
Next: Write integration test (Step 7)
2025-11-26 07:04:34 +00:00
2f9d2ba339 feat: Step 5 - Implement CreateIncrementalBackup() for PostgreSQL
Implemented full incremental backup creation:

internal/backup/incremental_postgres.go:
- CreateIncrementalBackup() - main entry point
- Validates base backup exists and is full backup
- Loads base backup metadata (.meta.json)
- Uses FindChangedFiles() to detect modifications
- Creates tar.gz with ONLY changed files
- Generates incremental metadata with:
  - Base backup ID (SHA-256)
  - Backup chain (base -> incr1 -> incr2...)
  - Changed file count and total size
- Saves .meta.json with full incremental metadata
- Calculates SHA-256 checksum of archive

internal/backup/incremental_tar.go:
- createTarGz() - creates compressed archive
- addFileToTar() - adds individual files to tar
- Handles context cancellation
- Progress logging for each file
- Preserves file permissions and timestamps

Helper Functions:
- loadBackupInfo() - loads BackupMetadata from .meta.json
- buildBackupChain() - constructs restore chain
- CalculateFileChecksum() - SHA-256 for archive

Features:
 Creates tar.gz with ONLY changed files
 Much smaller than full backup
 Links to base backup via SHA-256
 Tracks complete restore chain
 Full metadata for restore validation
 Context-aware (cancellable)

Status: READY FOR TESTING
Next: Wire into backup engine, test with real PostgreSQL data
2025-11-26 06:51:32 +00:00
1d4aa24817 feat: Phase 3A - Incremental backup scaffolding (types, interfaces, metadata)
Added foundational types for PostgreSQL incremental backups:

Types & Interfaces (internal/backup/incremental.go):
- BackupType enum: full vs incremental
- IncrementalMetadata struct with base backup reference
- ChangedFile struct for tracking modifications
- BackupChainResolver interface for restore chain logic
- IncrementalBackupEngine interface

PostgreSQL Implementation (internal/backup/incremental_postgres.go):
- PostgresIncrementalEngine for file-level incrementals
- FindChangedFiles() - mtime-based change detection
- shouldSkipFile() - exclude temp/lock/socket files
- loadBackupInfo() - read base backup metadata
- Stubs for CreateIncrementalBackup() and RestoreIncremental()

Metadata Extension (internal/metadata/metadata.go):
- Added IncrementalMetadata to BackupMetadata
- Fields: base_backup_id, backup_chain, incremental_files
- Tracks parent backup and restore dependencies

Next Steps:
- Add --backup-type incremental flag to CLI
- Implement backup chain resolution
- Write integration tests

Status: SCAFFOLDING ONLY - not functional yet
2025-11-26 06:22:54 +00:00