From 853ceb3bec856c1ac6bee000073750364974add3 Mon Sep 17 00:00:00 2001 From: Michael Eischer Date: Fri, 27 May 2022 19:27:14 +0200 Subject: [PATCH] get rid of tomb package --- cmd/restic/cmd_backup.go | 40 ++++++++++++++++++++++++---------------- go.mod | 1 - go.sum | 2 -- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/cmd/restic/cmd_backup.go b/cmd/restic/cmd_backup.go index bf1e17a47..5e9476984 100644 --- a/cmd/restic/cmd_backup.go +++ b/cmd/restic/cmd_backup.go @@ -12,10 +12,11 @@ import ( "path/filepath" "runtime" "strings" + "sync" "time" "github.com/spf13/cobra" - tomb "gopkg.in/tomb.v2" + "golang.org/x/sync/errgroup" "github.com/restic/restic/internal/archiver" "github.com/restic/restic/internal/debug" @@ -55,16 +56,22 @@ Exit status is 3 if some source data could not be read (incomplete snapshot crea }, DisableAutoGenTag: true, RunE: func(cmd *cobra.Command, args []string) error { - var t tomb.Tomb - term := termstatus.New(globalOptions.stdout, globalOptions.stderr, globalOptions.Quiet) - t.Go(func() error { term.Run(t.Context(globalOptions.ctx)); return nil }) + var wg sync.WaitGroup + cancelCtx, cancel := context.WithCancel(globalOptions.ctx) + defer func() { + // shutdown termstatus + cancel() + wg.Wait() + }() - err := runBackup(backupOptions, globalOptions, term, args) - t.Kill(nil) - if werr := t.Wait(); werr != nil { - panic(fmt.Sprintf("term.Run() returned err: %v", err)) - } - return err + term := termstatus.New(globalOptions.stdout, globalOptions.stderr, globalOptions.Quiet) + wg.Add(1) + go func() { + defer wg.Done() + term.Run(cancelCtx) + }() + + return runBackup(backupOptions, globalOptions, term, args) }, } @@ -534,8 +541,6 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina } } - var t tomb.Tomb - if gopts.verbosity >= 2 && !gopts.JSON { Verbosef("open repository\n") } @@ -567,7 +572,10 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina progressReporter.SetMinUpdatePause(calculateProgressInterval(!gopts.Quiet, gopts.JSON)) - t.Go(func() error { return progressReporter.Run(t.Context(gopts.ctx)) }) + wg, wgCtx := errgroup.WithContext(gopts.ctx) + cancelCtx, cancel := context.WithCancel(wgCtx) + defer cancel() + wg.Go(func() error { return progressReporter.Run(cancelCtx) }) if !gopts.JSON { progressPrinter.V("lock repository") @@ -675,7 +683,7 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina if !gopts.JSON { progressPrinter.V("start scan on %v", targets) } - t.Go(func() error { return sc.Scan(t.Context(gopts.ctx), targets) }) + wg.Go(func() error { return sc.Scan(cancelCtx, targets) }) arch := archiver.New(repo, targetFS, archiver.Options{}) arch.SelectByName = selectByNameFilter @@ -717,10 +725,10 @@ func runBackup(opts BackupOptions, gopts GlobalOptions, term *termstatus.Termina _, id, err := arch.Snapshot(gopts.ctx, targets, snapshotOpts) // cleanly shutdown all running goroutines - t.Kill(nil) + cancel() // let's see if one returned an error - werr := t.Wait() + werr := wg.Wait() // return original error if err != nil { diff --git a/go.mod b/go.mod index 2813190ce..81d35692f 100644 --- a/go.mod +++ b/go.mod @@ -46,7 +46,6 @@ require ( google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/ini.v1 v1.66.4 // indirect - gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 gopkg.in/yaml.v3 v3.0.0 // indirect ) diff --git a/go.sum b/go.sum index a176f11be..4f1ff9309 100644 --- a/go.sum +++ b/go.sum @@ -750,8 +750,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV4fzYhNBql77zY0ykqs= -gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=