From 6bd85d24126dff5779985af654fddfbc09a21279 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Sun, 14 Sep 2025 14:52:02 +0200 Subject: [PATCH] reduce usages of globalOptions variable --- cmd/restic/cmd_backup.go | 2 +- cmd/restic/cmd_backup_integration_test.go | 23 ++++++++----------- cmd/restic/cmd_cache.go | 2 +- cmd/restic/cmd_check_integration_test.go | 19 ++++++++------- cmd/restic/cmd_debug.go | 10 ++++---- cmd/restic/cmd_diff.go | 4 ++-- cmd/restic/cmd_forget.go | 8 +++---- cmd/restic/cmd_generate.go | 12 +++++----- cmd/restic/cmd_init.go | 2 +- cmd/restic/cmd_key_list.go | 4 ++-- cmd/restic/cmd_ls.go | 4 ++-- .../cmd_repair_index_integration_test.go | 4 ++-- cmd/restic/cmd_restore_integration_test.go | 2 +- cmd/restic/cmd_snapshots.go | 6 ++--- cmd/restic/cmd_stats.go | 2 +- cmd/restic/global.go | 2 +- internal/fs/fs_reader_command.go | 4 ++-- internal/fs/fs_reader_command_test.go | 10 ++++---- 18 files changed, 58 insertions(+), 62 deletions(-) diff --git a/cmd/restic/cmd_backup.go b/cmd/restic/cmd_backup.go index 997e702e8..fe3ace448 100644 --- a/cmd/restic/cmd_backup.go +++ b/cmd/restic/cmd_backup.go @@ -586,7 +586,7 @@ func runBackup(ctx context.Context, opts BackupOptions, gopts GlobalOptions, ter filename := path.Join("/", opts.StdinFilename) var source io.ReadCloser = os.Stdin if opts.StdinCommand { - source, err = fs.NewCommandReader(ctx, args, globalOptions.stderr) + source, err = fs.NewCommandReader(ctx, args, msg.E) if err != nil { return err } diff --git a/cmd/restic/cmd_backup_integration_test.go b/cmd/restic/cmd_backup_integration_test.go index 74a979024..ee9c495c1 100644 --- a/cmd/restic/cmd_backup_integration_test.go +++ b/cmd/restic/cmd_backup_integration_test.go @@ -262,22 +262,19 @@ func TestBackupNonExistingFile(t *testing.T) { testSetupBackupData(t, env) - _ = withRestoreGlobalOptions(func() error { - globalOptions.stderr = io.Discard + env.gopts.stderr = io.Discard - p := filepath.Join(env.testdata, "0", "0", "9") - dirs := []string{ - filepath.Join(p, "0"), - filepath.Join(p, "1"), - filepath.Join(p, "nonexisting"), - filepath.Join(p, "5"), - } + p := filepath.Join(env.testdata, "0", "0", "9") + dirs := []string{ + filepath.Join(p, "0"), + filepath.Join(p, "1"), + filepath.Join(p, "nonexisting"), + filepath.Join(p, "5"), + } - opts := BackupOptions{} + opts := BackupOptions{} - testRunBackup(t, "", dirs, opts, env.gopts) - return nil - }) + testRunBackup(t, "", dirs, opts, env.gopts) } func TestBackupSelfHealing(t *testing.T) { diff --git a/cmd/restic/cmd_cache.go b/cmd/restic/cmd_cache.go index f94c23747..f3f82954d 100644 --- a/cmd/restic/cmd_cache.go +++ b/cmd/restic/cmd_cache.go @@ -163,7 +163,7 @@ func runCache(opts CacheOptions, gopts GlobalOptions, args []string, term ui.Ter }) } - _ = tab.Write(globalOptions.stdout) + _ = tab.Write(gopts.stdout) printer.S("%d cache dirs in %s", len(dirs), cachedir) return nil diff --git a/cmd/restic/cmd_check_integration_test.go b/cmd/restic/cmd_check_integration_test.go index 59a0f7498..004f54b6b 100644 --- a/cmd/restic/cmd_check_integration_test.go +++ b/cmd/restic/cmd_check_integration_test.go @@ -1,7 +1,6 @@ package main import ( - "bytes" "context" "testing" @@ -25,15 +24,15 @@ func testRunCheckMustFail(t testing.TB, gopts GlobalOptions) { } func testRunCheckOutput(gopts GlobalOptions, checkUnused bool) (string, error) { - buf := bytes.NewBuffer(nil) - gopts.stdout = buf - err := withTermStatus(gopts, func(ctx context.Context, term ui.Terminal) error { - opts := CheckOptions{ - ReadData: true, - CheckUnused: checkUnused, - } - _, err := runCheck(context.TODO(), opts, gopts, nil, term) - return err + buf, err := withCaptureStdout(gopts, func(gopts GlobalOptions) error { + return withTermStatus(gopts, func(ctx context.Context, term ui.Terminal) error { + opts := CheckOptions{ + ReadData: true, + CheckUnused: checkUnused, + } + _, err := runCheck(context.TODO(), opts, gopts, nil, term) + return err + }) }) return buf.String(), err } diff --git a/cmd/restic/cmd_debug.go b/cmd/restic/cmd_debug.go index 8dcc3cc8d..a41a0d087 100644 --- a/cmd/restic/cmd_debug.go +++ b/cmd/restic/cmd_debug.go @@ -204,20 +204,20 @@ func runDebugDump(ctx context.Context, gopts GlobalOptions, args []string, term switch tpe { case "indexes": - return dumpIndexes(ctx, repo, globalOptions.stdout, printer) + return dumpIndexes(ctx, repo, gopts.stdout, printer) case "snapshots": - return debugPrintSnapshots(ctx, repo, globalOptions.stdout) + return debugPrintSnapshots(ctx, repo, gopts.stdout) case "packs": - return printPacks(ctx, repo, globalOptions.stdout, printer) + return printPacks(ctx, repo, gopts.stdout, printer) case "all": printer.S("snapshots:") - err := debugPrintSnapshots(ctx, repo, globalOptions.stdout) + err := debugPrintSnapshots(ctx, repo, gopts.stdout) if err != nil { return err } printer.S("indexes:") - err = dumpIndexes(ctx, repo, globalOptions.stdout, printer) + err = dumpIndexes(ctx, repo, gopts.stdout, printer) if err != nil { return err } diff --git a/cmd/restic/cmd_diff.go b/cmd/restic/cmd_diff.go index 2aa328773..7650a225f 100644 --- a/cmd/restic/cmd_diff.go +++ b/cmd/restic/cmd_diff.go @@ -426,7 +426,7 @@ func runDiff(ctx context.Context, opts DiffOptions, gopts GlobalOptions, args [] } if gopts.JSON { - enc := json.NewEncoder(globalOptions.stdout) + enc := json.NewEncoder(gopts.stdout) c.printChange = func(change *Change) { err := enc.Encode(change) if err != nil { @@ -460,7 +460,7 @@ func runDiff(ctx context.Context, opts DiffOptions, gopts GlobalOptions, args [] updateBlobs(repo, stats.BlobsAfter.Sub(both).Sub(stats.BlobsCommon), &stats.Added, printer.E) if gopts.JSON { - err := json.NewEncoder(globalOptions.stdout).Encode(stats) + err := json.NewEncoder(gopts.stdout).Encode(stats) if err != nil { printer.E("JSON encode failed: %v", err) } diff --git a/cmd/restic/cmd_forget.go b/cmd/restic/cmd_forget.go index 8523b3b2d..42739cdf0 100644 --- a/cmd/restic/cmd_forget.go +++ b/cmd/restic/cmd_forget.go @@ -253,7 +253,7 @@ func runForget(ctx context.Context, opts ForgetOptions, pruneOptions PruneOption } if gopts.Verbose >= 1 && !gopts.JSON { - err = PrintSnapshotGroupHeader(globalOptions.stdout, k) + err = PrintSnapshotGroupHeader(gopts.stdout, k) if err != nil { return err } @@ -276,7 +276,7 @@ func runForget(ctx context.Context, opts ForgetOptions, pruneOptions PruneOption } if len(keep) != 0 && !gopts.Quiet && !gopts.JSON { printer.P("keep %d snapshots:\n", len(keep)) - if err := PrintSnapshots(globalOptions.stdout, keep, reasons, opts.Compact); err != nil { + if err := PrintSnapshots(gopts.stdout, keep, reasons, opts.Compact); err != nil { return err } printer.P("\n") @@ -285,7 +285,7 @@ func runForget(ctx context.Context, opts ForgetOptions, pruneOptions PruneOption if len(remove) != 0 && !gopts.Quiet && !gopts.JSON { printer.P("remove %d snapshots:\n", len(remove)) - if err := PrintSnapshots(globalOptions.stdout, remove, nil, opts.Compact); err != nil { + if err := PrintSnapshots(gopts.stdout, remove, nil, opts.Compact); err != nil { return err } printer.P("\n") @@ -330,7 +330,7 @@ func runForget(ctx context.Context, opts ForgetOptions, pruneOptions PruneOption } if gopts.JSON && len(jsonGroups) > 0 { - err = printJSONForget(globalOptions.stdout, jsonGroups) + err = printJSONForget(gopts.stdout, jsonGroups) if err != nil { return err } diff --git a/cmd/restic/cmd_generate.go b/cmd/restic/cmd_generate.go index cf7b3c1ea..328b937ad 100644 --- a/cmd/restic/cmd_generate.go +++ b/cmd/restic/cmd_generate.go @@ -75,7 +75,7 @@ func writeManpages(root *cobra.Command, dir string, printer progress.Printer) er return doc.GenManTree(root, header, dir) } -func writeCompletion(filename string, shell string, generate func(w io.Writer) error, printer progress.Printer) (err error) { +func writeCompletion(filename string, shell string, generate func(w io.Writer) error, printer progress.Printer, gopts GlobalOptions) (err error) { if terminal.StdoutIsTerminal() { printer.P("writing %s completion file to %v", shell, filename) } @@ -89,7 +89,7 @@ func writeCompletion(filename string, shell string, generate func(w io.Writer) e defer func() { err = outFile.Close() }() outWriter = outFile } else { - outWriter = globalOptions.stdout + outWriter = gopts.stdout } err = generate(outWriter) @@ -136,28 +136,28 @@ func runGenerate(opts generateOptions, gopts GlobalOptions, args []string, term } if opts.BashCompletionFile != "" { - err := writeCompletion(opts.BashCompletionFile, "bash", cmdRoot.GenBashCompletion, printer) + err := writeCompletion(opts.BashCompletionFile, "bash", cmdRoot.GenBashCompletion, printer, gopts) if err != nil { return err } } if opts.FishCompletionFile != "" { - err := writeCompletion(opts.FishCompletionFile, "fish", func(w io.Writer) error { return cmdRoot.GenFishCompletion(w, true) }, printer) + err := writeCompletion(opts.FishCompletionFile, "fish", func(w io.Writer) error { return cmdRoot.GenFishCompletion(w, true) }, printer, gopts) if err != nil { return err } } if opts.ZSHCompletionFile != "" { - err := writeCompletion(opts.ZSHCompletionFile, "zsh", cmdRoot.GenZshCompletion, printer) + err := writeCompletion(opts.ZSHCompletionFile, "zsh", cmdRoot.GenZshCompletion, printer, gopts) if err != nil { return err } } if opts.PowerShellCompletionFile != "" { - err := writeCompletion(opts.PowerShellCompletionFile, "powershell", cmdRoot.GenPowerShellCompletion, printer) + err := writeCompletion(opts.PowerShellCompletionFile, "powershell", cmdRoot.GenPowerShellCompletion, printer, gopts) if err != nil { return err } diff --git a/cmd/restic/cmd_init.go b/cmd/restic/cmd_init.go index b1bfc637e..8e8488355 100644 --- a/cmd/restic/cmd_init.go +++ b/cmd/restic/cmd_init.go @@ -134,7 +134,7 @@ func runInit(ctx context.Context, opts InitOptions, gopts GlobalOptions, args [] ID: s.Config().ID, Repository: location.StripPassword(gopts.backends, gopts.Repo), } - return json.NewEncoder(globalOptions.stdout).Encode(status) + return json.NewEncoder(gopts.stdout).Encode(status) } return nil diff --git a/cmd/restic/cmd_key_list.go b/cmd/restic/cmd_key_list.go index 897601675..bdc0a7f82 100644 --- a/cmd/restic/cmd_key_list.go +++ b/cmd/restic/cmd_key_list.go @@ -97,7 +97,7 @@ func listKeys(ctx context.Context, s *repository.Repository, gopts GlobalOptions } if gopts.JSON { - return json.NewEncoder(globalOptions.stdout).Encode(keys) + return json.NewEncoder(gopts.stdout).Encode(keys) } tab := table.New() @@ -110,5 +110,5 @@ func listKeys(ctx context.Context, s *repository.Repository, gopts GlobalOptions tab.AddRow(key) } - return tab.Write(globalOptions.stdout) + return tab.Write(gopts.stdout) } diff --git a/cmd/restic/cmd_ls.go b/cmd/restic/cmd_ls.go index 532d2f4dd..b56f0b6e3 100644 --- a/cmd/restic/cmd_ls.go +++ b/cmd/restic/cmd_ls.go @@ -384,11 +384,11 @@ func runLs(ctx context.Context, opts LsOptions, gopts GlobalOptions, args []stri if gopts.JSON { printer = &jsonLsPrinter{ - enc: json.NewEncoder(globalOptions.stdout), + enc: json.NewEncoder(gopts.stdout), } } else if opts.Ncdu { printer = &ncduLsPrinter{ - out: globalOptions.stdout, + out: gopts.stdout, } } else { printer = &textLsPrinter{ diff --git a/cmd/restic/cmd_repair_index_integration_test.go b/cmd/restic/cmd_repair_index_integration_test.go index 6d1e81eee..c03c8f3d0 100644 --- a/cmd/restic/cmd_repair_index_integration_test.go +++ b/cmd/restic/cmd_repair_index_integration_test.go @@ -19,7 +19,7 @@ import ( func testRunRebuildIndex(t testing.TB, gopts GlobalOptions) { rtest.OK(t, withRestoreGlobalOptions(func() error { return withTermStatus(gopts, func(ctx context.Context, term ui.Terminal) error { - globalOptions.stdout = io.Discard + gopts.stdout = io.Discard return runRebuildIndex(context.TODO(), RepairIndexOptions{}, gopts, term) }) })) @@ -133,7 +133,7 @@ func TestRebuildIndexFailsOnAppendOnly(t *testing.T) { return &appendOnlyBackend{r}, nil } return withTermStatus(env.gopts, func(ctx context.Context, term ui.Terminal) error { - globalOptions.stdout = io.Discard + env.gopts.stdout = io.Discard return runRebuildIndex(context.TODO(), RepairIndexOptions{}, env.gopts, term) }) }) diff --git a/cmd/restic/cmd_restore_integration_test.go b/cmd/restic/cmd_restore_integration_test.go index 0f02ec385..0b6443529 100644 --- a/cmd/restic/cmd_restore_integration_test.go +++ b/cmd/restic/cmd_restore_integration_test.go @@ -338,7 +338,7 @@ func TestRestoreWithPermissionFailure(t *testing.T) { snapshots := testListSnapshots(t, env.gopts, 1) _ = withRestoreGlobalOptions(func() error { - globalOptions.stderr = io.Discard + env.gopts.stderr = io.Discard testRunRestore(t, env.gopts, filepath.Join(env.base, "restore"), snapshots[0].String()) return nil }) diff --git a/cmd/restic/cmd_snapshots.go b/cmd/restic/cmd_snapshots.go index 5ce82c996..8d921194e 100644 --- a/cmd/restic/cmd_snapshots.go +++ b/cmd/restic/cmd_snapshots.go @@ -105,7 +105,7 @@ func runSnapshots(ctx context.Context, opts SnapshotOptions, gopts GlobalOptions } if gopts.JSON { - err := printSnapshotGroupJSON(globalOptions.stdout, snapshotGroups, grouped) + err := printSnapshotGroupJSON(gopts.stdout, snapshotGroups, grouped) if err != nil { printer.E("error printing snapshots: %v", err) } @@ -118,12 +118,12 @@ func runSnapshots(ctx context.Context, opts SnapshotOptions, gopts GlobalOptions } if grouped { - err := PrintSnapshotGroupHeader(globalOptions.stdout, k) + err := PrintSnapshotGroupHeader(gopts.stdout, k) if err != nil { return err } } - err := PrintSnapshots(globalOptions.stdout, list, nil, opts.Compact) + err := PrintSnapshots(gopts.stdout, list, nil, opts.Compact) if err != nil { return err } diff --git a/cmd/restic/cmd_stats.go b/cmd/restic/cmd_stats.go index 00f885ffa..f25ed39bb 100644 --- a/cmd/restic/cmd_stats.go +++ b/cmd/restic/cmd_stats.go @@ -171,7 +171,7 @@ func runStats(ctx context.Context, opts StatsOptions, gopts GlobalOptions, args } if gopts.JSON { - err = json.NewEncoder(globalOptions.stdout).Encode(stats) + err = json.NewEncoder(gopts.stdout).Encode(stats) if err != nil { return fmt.Errorf("encoding output: %v", err) } diff --git a/cmd/restic/global.go b/cmd/restic/global.go index 6838b1227..b218eacde 100644 --- a/cmd/restic/global.go +++ b/cmd/restic/global.go @@ -476,7 +476,7 @@ func innerOpen(ctx context.Context, s string, gopts GlobalOptions, opts options. return nil, err } - rt, err := backend.Transport(globalOptions.TransportOptions) + rt, err := backend.Transport(gopts.TransportOptions) if err != nil { return nil, errors.Fatalf("%s", err) } diff --git a/internal/fs/fs_reader_command.go b/internal/fs/fs_reader_command.go index 9e6674e8f..a1371fd1e 100644 --- a/internal/fs/fs_reader_command.go +++ b/internal/fs/fs_reader_command.go @@ -28,7 +28,7 @@ type CommandReader struct { alreadyClosedReadErr error } -func NewCommandReader(ctx context.Context, args []string, logOutput io.Writer) (*CommandReader, error) { +func NewCommandReader(ctx context.Context, args []string, errorOutput func(msg string, args ...interface{})) (*CommandReader, error) { if len(args) == 0 { return nil, fmt.Errorf("no command was specified as argument") } @@ -48,7 +48,7 @@ func NewCommandReader(ctx context.Context, args []string, logOutput io.Writer) ( go func() { sc := bufio.NewScanner(stderr) for sc.Scan() { - _, _ = fmt.Fprintf(logOutput, "subprocess %v: %v\n", command.Args[0], sc.Text()) + errorOutput("subprocess %v: %v", command.Args[0], sc.Text()) } }() diff --git a/internal/fs/fs_reader_command_test.go b/internal/fs/fs_reader_command_test.go index 8f0d17b1e..5f27e9590 100644 --- a/internal/fs/fs_reader_command_test.go +++ b/internal/fs/fs_reader_command_test.go @@ -12,7 +12,7 @@ import ( ) func TestCommandReaderSuccess(t *testing.T) { - reader, err := fs.NewCommandReader(context.TODO(), []string{"true"}, io.Discard) + reader, err := fs.NewCommandReader(context.TODO(), []string{"true"}, func(msg string, args ...interface{}) {}) test.OK(t, err) _, err = io.Copy(io.Discard, reader) @@ -22,7 +22,7 @@ func TestCommandReaderSuccess(t *testing.T) { } func TestCommandReaderFail(t *testing.T) { - reader, err := fs.NewCommandReader(context.TODO(), []string{"false"}, io.Discard) + reader, err := fs.NewCommandReader(context.TODO(), []string{"false"}, func(msg string, args ...interface{}) {}) test.OK(t, err) _, err = io.Copy(io.Discard, reader) @@ -30,17 +30,17 @@ func TestCommandReaderFail(t *testing.T) { } func TestCommandReaderInvalid(t *testing.T) { - _, err := fs.NewCommandReader(context.TODO(), []string{"w54fy098hj7fy5twijouytfrj098y645wr"}, io.Discard) + _, err := fs.NewCommandReader(context.TODO(), []string{"w54fy098hj7fy5twijouytfrj098y645wr"}, func(msg string, args ...interface{}) {}) test.Assert(t, err != nil, "missing error") } func TestCommandReaderEmptyArgs(t *testing.T) { - _, err := fs.NewCommandReader(context.TODO(), []string{}, io.Discard) + _, err := fs.NewCommandReader(context.TODO(), []string{}, func(msg string, args ...interface{}) {}) test.Assert(t, err != nil, "missing error") } func TestCommandReaderOutput(t *testing.T) { - reader, err := fs.NewCommandReader(context.TODO(), []string{"echo", "hello world"}, io.Discard) + reader, err := fs.NewCommandReader(context.TODO(), []string{"echo", "hello world"}, func(msg string, args ...interface{}) {}) test.OK(t, err) var buf bytes.Buffer