diff --git a/internal/vaultik/snapshot.go b/internal/vaultik/snapshot.go index 3b66c57..8fe30bc 100644 --- a/internal/vaultik/snapshot.go +++ b/internal/vaultik/snapshot.go @@ -89,6 +89,24 @@ func (v *Vaultik) CreateSnapshot(opts *SnapshotCreateOptions) error { v.printfStdout("\nAll %d snapshots completed in %s\n", len(snapshotNames), time.Since(overallStartTime).Round(time.Second)) } + // Prune old snapshots and unreferenced blobs if --prune was specified + if opts.Prune { + log.Info("Pruning enabled - deleting old snapshots and unreferenced blobs") + v.printlnStdout("\nPruning old snapshots (keeping latest)...") + + if err := v.PurgeSnapshots(true, "", true); err != nil { + return fmt.Errorf("prune: purging old snapshots: %w", err) + } + + v.printlnStdout("Pruning unreferenced blobs...") + + if err := v.PruneBlobs(&PruneOptions{Force: true}); err != nil { + return fmt.Errorf("prune: removing unreferenced blobs: %w", err) + } + + log.Info("Pruning complete") + } + return nil } @@ -305,11 +323,6 @@ func (v *Vaultik) createNamedSnapshot(opts *SnapshotCreateOptions, hostname, sna } v.printfStdout("Duration: %s\n", formatDuration(snapshotDuration)) - if opts.Prune { - log.Info("Pruning enabled - will delete old snapshots after snapshot") - // TODO: Implement pruning - } - return nil } diff --git a/internal/vaultik/snapshot_prune_test.go b/internal/vaultik/snapshot_prune_test.go new file mode 100644 index 0000000..dbff412 --- /dev/null +++ b/internal/vaultik/snapshot_prune_test.go @@ -0,0 +1,23 @@ +package vaultik + +import ( + "testing" +) + +// TestSnapshotCreateOptions_PruneFlag verifies the Prune field exists on +// SnapshotCreateOptions and can be set. +func TestSnapshotCreateOptions_PruneFlag(t *testing.T) { + opts := &SnapshotCreateOptions{ + Prune: true, + } + if !opts.Prune { + t.Error("Expected Prune to be true") + } + + opts2 := &SnapshotCreateOptions{ + Prune: false, + } + if opts2.Prune { + t.Error("Expected Prune to be false") + } +}