stats: convert to termstatus

This commit is contained in:
Michael Eischer
2025-09-13 23:28:30 +02:00
parent e63aee2ec6
commit 8510f09225

View File

@@ -14,7 +14,9 @@ import (
"github.com/restic/restic/internal/restic" "github.com/restic/restic/internal/restic"
"github.com/restic/restic/internal/restorer" "github.com/restic/restic/internal/restorer"
"github.com/restic/restic/internal/ui" "github.com/restic/restic/internal/ui"
"github.com/restic/restic/internal/ui/progress"
"github.com/restic/restic/internal/ui/table" "github.com/restic/restic/internal/ui/table"
"github.com/restic/restic/internal/ui/termstatus"
"github.com/restic/restic/internal/walker" "github.com/restic/restic/internal/walker"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@@ -62,7 +64,9 @@ Exit status is 12 if the password is incorrect.
GroupID: cmdGroupDefault, GroupID: cmdGroupDefault,
DisableAutoGenTag: true, DisableAutoGenTag: true,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
return runStats(cmd.Context(), opts, globalOptions, args) term, cancel := setupTermstatus()
defer cancel()
return runStats(cmd.Context(), opts, globalOptions, args, term)
}, },
} }
@@ -92,12 +96,14 @@ func must(err error) {
} }
} }
func runStats(ctx context.Context, opts StatsOptions, gopts GlobalOptions, args []string) error { func runStats(ctx context.Context, opts StatsOptions, gopts GlobalOptions, args []string, term *termstatus.Terminal) error {
err := verifyStatsInput(opts) err := verifyStatsInput(opts)
if err != nil { if err != nil {
return err return err
} }
printer := newTerminalProgressPrinter(gopts.JSON, gopts.verbosity, term)
ctx, repo, unlock, err := openWithReadLock(ctx, gopts, gopts.NoLock) ctx, repo, unlock, err := openWithReadLock(ctx, gopts, gopts.NoLock)
if err != nil { if err != nil {
return err return err
@@ -108,17 +114,17 @@ func runStats(ctx context.Context, opts StatsOptions, gopts GlobalOptions, args
if err != nil { if err != nil {
return err return err
} }
bar := newIndexProgress(gopts.Quiet, gopts.JSON) bar := newIndexTerminalProgress(printer)
if err = repo.LoadIndex(ctx, bar); err != nil { if err = repo.LoadIndex(ctx, bar); err != nil {
return err return err
} }
if opts.countMode == countModeDebug { if opts.countMode == countModeDebug {
return statsDebug(ctx, repo) return statsDebug(ctx, repo, printer)
} }
if !gopts.JSON { if !gopts.JSON {
Printf("scanning...\n") printer.S("scanning...")
} }
// create a container for the stats (and other needed state) // create a container for the stats (and other needed state)
@@ -173,26 +179,26 @@ func runStats(ctx context.Context, opts StatsOptions, gopts GlobalOptions, args
return nil return nil
} }
Printf("Stats in %s mode:\n", opts.countMode) printer.S("Stats in %s mode:", opts.countMode)
Printf(" Snapshots processed: %d\n", stats.SnapshotsCount) printer.S(" Snapshots processed: %d", stats.SnapshotsCount)
if stats.TotalBlobCount > 0 { if stats.TotalBlobCount > 0 {
Printf(" Total Blob Count: %d\n", stats.TotalBlobCount) printer.S(" Total Blob Count: %d", stats.TotalBlobCount)
} }
if stats.TotalFileCount > 0 { if stats.TotalFileCount > 0 {
Printf(" Total File Count: %d\n", stats.TotalFileCount) printer.S(" Total File Count: %d", stats.TotalFileCount)
} }
if stats.TotalUncompressedSize > 0 { if stats.TotalUncompressedSize > 0 {
Printf(" Total Uncompressed Size: %-5s\n", ui.FormatBytes(stats.TotalUncompressedSize)) printer.S(" Total Uncompressed Size: %-5s", ui.FormatBytes(stats.TotalUncompressedSize))
} }
Printf(" Total Size: %-5s\n", ui.FormatBytes(stats.TotalSize)) printer.S(" Total Size: %-5s", ui.FormatBytes(stats.TotalSize))
if stats.CompressionProgress > 0 { if stats.CompressionProgress > 0 {
Printf(" Compression Progress: %.2f%%\n", stats.CompressionProgress) printer.S(" Compression Progress: %.2f%%", stats.CompressionProgress)
} }
if stats.CompressionRatio > 0 { if stats.CompressionRatio > 0 {
Printf(" Compression Ratio: %.2fx\n", stats.CompressionRatio) printer.S(" Compression Ratio: %.2fx", stats.CompressionRatio)
} }
if stats.CompressionSpaceSaving > 0 { if stats.CompressionSpaceSaving > 0 {
Printf("Compression Space Saving: %.2f%%\n", stats.CompressionSpaceSaving) printer.S("Compression Space Saving: %.2f%%", stats.CompressionSpaceSaving)
} }
return nil return nil
@@ -359,14 +365,14 @@ const (
countModeDebug = "debug" countModeDebug = "debug"
) )
func statsDebug(ctx context.Context, repo restic.Repository) error { func statsDebug(ctx context.Context, repo restic.Repository, printer progress.Printer) error {
Warnf("Collecting size statistics\n\n") printer.E("Collecting size statistics\n\n")
for _, t := range []restic.FileType{restic.KeyFile, restic.LockFile, restic.IndexFile, restic.PackFile} { for _, t := range []restic.FileType{restic.KeyFile, restic.LockFile, restic.IndexFile, restic.PackFile} {
hist, err := statsDebugFileType(ctx, repo, t) hist, err := statsDebugFileType(ctx, repo, t)
if err != nil { if err != nil {
return err return err
} }
Warnf("File Type: %v\n%v\n", t, hist) printer.E("File Type: %v\n%v", t, hist)
} }
hist, err := statsDebugBlobs(ctx, repo) hist, err := statsDebugBlobs(ctx, repo)
@@ -374,7 +380,7 @@ func statsDebug(ctx context.Context, repo restic.Repository) error {
return err return err
} }
for _, t := range []restic.BlobType{restic.DataBlob, restic.TreeBlob} { for _, t := range []restic.BlobType{restic.DataBlob, restic.TreeBlob} {
Warnf("Blob Type: %v\n%v\n\n", t, hist[t]) printer.E("Blob Type: %v\n%v\n\n", t, hist[t])
} }
return nil return nil