Silence prune and snapshot removal status under --cron and --quiet (closes #294)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
PruneBlobs, CleanupLocalSnapshots, RemoveSnapshot, RemoveAllSnapshots and snapshot purge wrote their status lines straight to stdout, so `snapshot create --cron --prune` printed on every successful run and --quiet did not silence `prune`, `snapshot purge`, `snapshot remove` or `remote nuke`. Those lines now go through internal/ui, which drops them under --cron and --quiet; warnings, errors and --json documents still print. The confirmation prompts still write straight to stdout, as the `database delete` prompt does, together with what they ask to delete: the snapshot list before the purge prompt, and the blob count and size before the prune prompt. With --force those lines are status lines. The two purge test fixtures gained the UI writer production always sets. Model: opus-5-5
This commit was merged in pull request #369.
This commit is contained in:
1 parent
8d5e6f3399
commit
30285c7a8c
8 files changed
+337
-41
No files matched your search
@@ -574,7 +574,7 @@ func (v *Vaultik) PurgeSnapshotsWithOptions(opts *SnapshotPurgeOptions) error {
|
||||
|
||||
if len(toDelete) == 0 {
|
||||
if !opts.Quiet {
|
||||
v.printlnStdout("No snapshots to delete")
|
||||
v.UI.Infof("No snapshots to delete.")
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -631,19 +631,19 @@ func selectSnapshotsToPurge(
|
||||
func (v *Vaultik) confirmAndExecutePurge(
|
||||
toDelete []SnapshotInfo, force, quiet bool,
|
||||
) error {
|
||||
if !quiet {
|
||||
// Confirm unless --force is used. The list, the prompt and its answer
|
||||
// bypass the UI: they are an interactive exchange the operator must
|
||||
// see, so --quiet does not silence them.
|
||||
if !force {
|
||||
v.stdoutf("The following snapshots will be deleted:\n\n")
|
||||
|
||||
for _, snap := range toDelete {
|
||||
v.stdoutf(" %s (%s, %s)\n",
|
||||
snap.ID,
|
||||
snap.Timestamp.Format("2006-01-02 15:04:05"),
|
||||
snap.Timestamp.Format(time.DateTime),
|
||||
ubytes(snap.CompressedSize))
|
||||
}
|
||||
}
|
||||
|
||||
// Confirm unless --force is used
|
||||
if !force {
|
||||
v.stdoutf("\nDelete %d snapshot(s)? [y/N] ", len(toDelete))
|
||||
|
||||
var confirm string
|
||||
@@ -661,7 +661,16 @@ func (v *Vaultik) confirmAndExecutePurge(
|
||||
return nil
|
||||
}
|
||||
} else if !quiet {
|
||||
v.stdoutf("\nDeleting %d snapshot(s) (--force specified)\n", len(toDelete))
|
||||
v.UI.Infof("The following snapshots will be deleted:")
|
||||
|
||||
for _, snap := range toDelete {
|
||||
v.UI.Detailf("%s (%s, %s)",
|
||||
v.UI.Snapshot(snap.ID.String()),
|
||||
snap.Timestamp.Format(time.DateTime),
|
||||
ubytes(snap.CompressedSize))
|
||||
}
|
||||
|
||||
v.UI.Infof("Deleting %d snapshot(s) (--force specified).", len(toDelete))
|
||||
}
|
||||
|
||||
// Delete snapshots (both local and remote)
|
||||
@@ -694,9 +703,9 @@ func (v *Vaultik) confirmAndExecutePurge(
|
||||
}
|
||||
|
||||
if !quiet {
|
||||
v.stdoutf("Deleted %d snapshot(s)\n", len(toDelete))
|
||||
v.printlnStdout(
|
||||
"\nNote: Run 'vaultik prune' to clean up unreferenced remote blobs.")
|
||||
v.UI.Infof("Deleted %d snapshot(s).", len(toDelete))
|
||||
v.UI.Noticef("Run '%s' to clean up unreferenced remote blobs.",
|
||||
pruneCommandHint)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -1069,7 +1078,7 @@ func (v *Vaultik) CleanupLocalSnapshots(opts *PruneOptions) error {
|
||||
log.Info("Removing stale local snapshot record", "snapshot_id", id)
|
||||
|
||||
if !opts.JSON {
|
||||
v.stdoutf("Removing stale local record: %s\n", id)
|
||||
v.UI.Infof("Removing stale local record: %s.", v.UI.Snapshot(id))
|
||||
}
|
||||
|
||||
err = v.deleteSnapshotFromLocalDB(id)
|
||||
@@ -1092,9 +1101,9 @@ func (v *Vaultik) CleanupLocalSnapshots(opts *PruneOptions) error {
|
||||
}
|
||||
|
||||
if removed == 0 {
|
||||
v.printlnStdout("No stale local snapshots found.")
|
||||
v.UI.Infof("No stale local snapshots found.")
|
||||
} else {
|
||||
v.stdoutf("Removed %d stale local snapshot record(s).\n", removed)
|
||||
v.UI.Infof("Removed %d stale local snapshot record(s).", removed)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -1273,14 +1282,15 @@ func (v *Vaultik) RemoveSnapshot(
|
||||
}
|
||||
|
||||
if inLocalIndex {
|
||||
v.stdoutf("Removed snapshot '%s' from local database\n", snapshotID)
|
||||
v.UI.Infof("Removed snapshot '%s' from local database.",
|
||||
v.UI.Snapshot(snapshotID))
|
||||
}
|
||||
|
||||
if result.RemoteRemoved {
|
||||
v.printlnStdout("Removed snapshot metadata from remote storage")
|
||||
v.stdoutf("\nNote: The removed snapshot's blobs remain on the remote. "+
|
||||
v.UI.Infof("Removed snapshot metadata from remote storage.")
|
||||
v.UI.Noticef("The removed snapshot's blobs remain on the remote. "+
|
||||
"Run '%s' to delete any blobs no longer referenced by any "+
|
||||
"remaining remote snapshot.\n", pruneCommandHint)
|
||||
"remaining remote snapshot.", pruneCommandHint)
|
||||
}
|
||||
|
||||
return result, nil
|
||||
@@ -1336,21 +1346,23 @@ func (v *Vaultik) removeSnapshotDryRun(
|
||||
return result, v.outputRemoveJSON(result)
|
||||
}
|
||||
|
||||
v.stdoutf("Would remove snapshot: %s\n", snapshotID)
|
||||
v.UI.Infof("Would remove snapshot: %s.", v.UI.Snapshot(snapshotID))
|
||||
|
||||
if !opts.LocalOnly {
|
||||
v.printlnStdout("Would also remove snapshot metadata from " +
|
||||
"remote storage (blobs untouched)")
|
||||
v.UI.Infof("Would also remove snapshot metadata from " +
|
||||
"remote storage (blobs untouched).")
|
||||
}
|
||||
|
||||
v.printlnStdout("[Dry run - no changes made]")
|
||||
v.UI.Noticef("Dry run: no changes made.")
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// confirmRemoveSnapshot prompts for confirmation before removing a
|
||||
// snapshot. Returns false (treating EOF/read errors as "no") unless the
|
||||
// user answers "y".
|
||||
// user answers "y". The prompt and its answer bypass the UI: they are an
|
||||
// interactive exchange the operator must see, so --quiet does not
|
||||
// silence them.
|
||||
func (v *Vaultik) confirmRemoveSnapshot(snapshotID string, opts *RemoveOptions) bool {
|
||||
if opts.LocalOnly {
|
||||
v.stdoutf("Remove snapshot '%s' from local database "+
|
||||
@@ -1456,7 +1468,7 @@ func (v *Vaultik) RemoveAllSnapshots(opts *RemoveOptions) (*RemoveResult, error)
|
||||
|
||||
if len(localSnaps) == 0 && len(orphanRemoteKeys) == 0 {
|
||||
if !opts.JSON {
|
||||
v.printlnStdout("No snapshots found")
|
||||
v.UI.Infof("No snapshots found.")
|
||||
}
|
||||
|
||||
return &RemoveResult{}, nil
|
||||
@@ -1561,27 +1573,27 @@ func (v *Vaultik) handleRemoveAllDryRun(
|
||||
}
|
||||
|
||||
if !opts.JSON {
|
||||
v.stdoutf("Would remove %d local snapshot(s):\n", len(localSnaps))
|
||||
v.UI.Infof("Would remove %d local snapshot(s):", len(localSnaps))
|
||||
|
||||
for _, id := range localSnaps {
|
||||
v.stdoutf(" %s\n", id)
|
||||
v.UI.Detailf("%s", v.UI.Snapshot(id))
|
||||
}
|
||||
|
||||
if !opts.LocalOnly {
|
||||
if len(orphanRemoteKeys) > 0 {
|
||||
v.stdoutf("Would also remove %d orphan remote snapshot key(s):\n",
|
||||
v.UI.Infof("Would also remove %d orphan remote snapshot key(s):",
|
||||
len(orphanRemoteKeys))
|
||||
|
||||
for _, key := range orphanRemoteKeys {
|
||||
v.stdoutf(" %s\n", key)
|
||||
v.UI.Detailf("%s", key)
|
||||
}
|
||||
} else {
|
||||
v.printlnStdout("Would also remove snapshot metadata from " +
|
||||
"remote storage (blobs untouched)")
|
||||
v.UI.Infof("Would also remove snapshot metadata from " +
|
||||
"remote storage (blobs untouched).")
|
||||
}
|
||||
}
|
||||
|
||||
v.printlnStdout("[Dry run - no changes made]")
|
||||
v.UI.Noticef("Dry run: no changes made.")
|
||||
}
|
||||
|
||||
if opts.JSON {
|
||||
@@ -1630,10 +1642,10 @@ func (v *Vaultik) executeRemoveAll(
|
||||
return result, v.outputRemoveJSON(result)
|
||||
}
|
||||
|
||||
v.stdoutf("Removed %d snapshot(s)\n", len(result.SnapshotsRemoved))
|
||||
v.UI.Infof("Removed %d snapshot(s).", len(result.SnapshotsRemoved))
|
||||
|
||||
if !opts.LocalOnly && result.RemoteRemoved {
|
||||
v.printlnStdout("Removed snapshot metadata from remote storage")
|
||||
v.UI.Infof("Removed snapshot metadata from remote storage.")
|
||||
}
|
||||
|
||||
return result, nil
|
||||
|
||||
Reference in new issue
Block a user