errors: Ensure that errors.IsFatal(errors.Fatal("err")) == true

This fixes a few cases where restic output "Fatal: Fatal: [...]"
This commit is contained in:
Michael Eischer 2022-02-12 23:31:31 +01:00
parent a08b95c497
commit 2e1613d4c6
4 changed files with 26 additions and 2 deletions

View File

@ -102,7 +102,7 @@ func main() {
fmt.Fprintf(os.Stderr, "%v\nthe `unlock` command can be used to remove stale locks\n", err) fmt.Fprintf(os.Stderr, "%v\nthe `unlock` command can be used to remove stale locks\n", err)
case err == ErrInvalidSourceData: case err == ErrInvalidSourceData:
fmt.Fprintf(os.Stderr, "Warning: %v\n", err) fmt.Fprintf(os.Stderr, "Warning: %v\n", err)
case errors.IsFatal(errors.Cause(err)): case errors.IsFatal(err):
fmt.Fprintf(os.Stderr, "%v\n", err) fmt.Fprintf(os.Stderr, "%v\n", err)
case err != nil: case err != nil:
fmt.Fprintf(os.Stderr, "%+v\n", err) fmt.Fprintf(os.Stderr, "%+v\n", err)

View File

@ -23,6 +23,8 @@ type Fataler interface {
// IsFatal returns true if err is a fatal message that should be printed to the // IsFatal returns true if err is a fatal message that should be printed to the
// user. Then, the program should exit. // user. Then, the program should exit.
func IsFatal(err error) bool { func IsFatal(err error) bool {
// unwrap "Wrap" method
err = Cause(err)
e, ok := err.(Fataler) e, ok := err.(Fataler)
return ok && e.Fatal() return ok && e.Fatal()
} }

View File

@ -0,0 +1,22 @@
package errors_test
import (
"testing"
"github.com/restic/restic/internal/errors"
)
func TestFatal(t *testing.T) {
for _, v := range []struct {
err error
expected bool
}{
{errors.Fatal("broken"), true},
{errors.Fatalf("broken %d", 42), true},
{errors.New("error"), false},
} {
if errors.IsFatal(v.err) != v.expected {
t.Fatalf("IsFatal for %q, expected: %v, got: %v", v.err, v.expected, errors.IsFatal(v.err))
}
}
}

View File

@ -78,7 +78,7 @@ func LoadConfig(ctx context.Context, r JSONUnpackedLoader) (Config, error) {
} }
if cfg.Version != RepoVersion { if cfg.Version != RepoVersion {
return Config{}, errors.New("unsupported repository version") return Config{}, errors.Errorf("unsupported repository version %v", cfg.Version)
} }
if checkPolynomial { if checkPolynomial {