Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarthik Nayak <knayak@gitlab.com>2023-11-29 20:03:28 +0300
committerKarthik Nayak <knayak@gitlab.com>2023-11-30 18:15:59 +0300
commit96c37cba249a36d5979d78ff6d2e686fb1a0328b (patch)
treeab7d8c7e554ecc95f899d72da229e0ed09f24d7b
parent232812c92f18f03372f73284c079d90e3c532923 (diff)
errors: Use `errors.As()` for type assertion
Currently for type assertion of errors, we use the `err.(<Interface>)` form. This works, but is not compatible with wrapped errors. So let's use `errors.As()` instead.
-rw-r--r--cmd/gitaly/main_test.go6
-rw-r--r--internal/backup/sink_test.go5
-rw-r--r--internal/cli/praefect/subcmd_track_repositories.go6
-rw-r--r--internal/git/gittest/command.go8
-rw-r--r--internal/git/objectpool/disconnect_test.go8
-rw-r--r--internal/gitaly/service/cleanup/apply_bfg_object_map_stream.go4
-rw-r--r--internal/grpc/dnsresolver/resolver.go4
-rw-r--r--internal/streamcache/cache_test.go17
-rw-r--r--internal/structerr/error.go3
-rw-r--r--internal/testhelper/leakage.go7
-rw-r--r--internal/testhelper/testhelper.go7
11 files changed, 48 insertions, 27 deletions
diff --git a/cmd/gitaly/main_test.go b/cmd/gitaly/main_test.go
index b649c10aa..339d7cbd6 100644
--- a/cmd/gitaly/main_test.go
+++ b/cmd/gitaly/main_test.go
@@ -2,6 +2,7 @@ package main
import (
"bytes"
+ "errors"
"os/exec"
"testing"
@@ -63,8 +64,9 @@ func TestGitalyCLI(t *testing.T) {
err := cmd.Run()
exitCode := 0
- if err != nil {
- exitCode = err.(*exec.ExitError).ExitCode()
+ var exitErr *exec.ExitError
+ if errors.As(err, &exitErr) {
+ exitCode = exitErr.ExitCode()
}
assert.Equal(t, tc.exitCode, exitCode)
diff --git a/internal/backup/sink_test.go b/internal/backup/sink_test.go
index 9ff6f3f8a..5eb337147 100644
--- a/internal/backup/sink_test.go
+++ b/internal/backup/sink_test.go
@@ -2,6 +2,7 @@ package backup
import (
"bytes"
+ "errors"
"fmt"
"io"
"os"
@@ -24,8 +25,8 @@ func TestResolveSink(t *testing.T) {
sssink, ok := sink.(*StorageServiceSink)
require.True(t, ok)
_, err := sssink.bucket.List(nil).Next(ctx)
- ierr, ok := err.(interface{ Unwrap() error })
- require.True(t, ok)
+ var ierr interface{ Unwrap() error }
+ require.True(t, errors.As(err, &ierr))
terr := ierr.Unwrap()
require.Contains(t, terr.Error(), expErrMsg)
}
diff --git a/internal/cli/praefect/subcmd_track_repositories.go b/internal/cli/praefect/subcmd_track_repositories.go
index 9de4ddfbf..bde162108 100644
--- a/internal/cli/praefect/subcmd_track_repositories.go
+++ b/internal/cli/praefect/subcmd_track_repositories.go
@@ -4,6 +4,7 @@ import (
"bufio"
"context"
"encoding/json"
+ "errors"
"fmt"
"io"
"os"
@@ -215,10 +216,11 @@ func printInvalidRequests(w io.Writer, repoErrs []invalidRequest, pathLines map[
for _, l := range repoErrs {
fmt.Fprintf(w, " line %v, relative_path: %q, replica_path: %q\n", l.line, l.relativePath, l.replicaPath)
for _, err := range l.errs {
- if dup, ok := err.(*dupPathError); ok {
+ var dupPathErr *dupPathError
+ if errors.As(err, &dupPathErr) {
// The complete set of duplicate reqNums won't be known until input is
// fully processed, fetch them now.
- err = &dupPathError{path: dup.path, reqNums: pathLines[dup.path]}
+ err = &dupPathError{path: dupPathErr.path, reqNums: pathLines[dupPathErr.path]}
}
fmt.Fprintf(w, " %v\n", err)
}
diff --git a/internal/git/gittest/command.go b/internal/git/gittest/command.go
index 30d276961..c5eef143c 100644
--- a/internal/git/gittest/command.go
+++ b/internal/git/gittest/command.go
@@ -2,6 +2,7 @@ package gittest
import (
"context"
+ "errors"
"io"
"os"
"os/exec"
@@ -67,11 +68,12 @@ func ExecOpts(tb testing.TB, cfg config.Cfg, execCfg ExecConfig, args ...string)
func handleExecErr(tb testing.TB, cfg config.Cfg, execCfg ExecConfig, args []string, err error) {
var stderr []byte
- if ee, ok := err.(*exec.ExitError); ok {
- if execCfg.ExpectedExitCode == ee.ExitCode() {
+ var exitErr *exec.ExitError
+ if errors.As(err, &exitErr) {
+ if execCfg.ExpectedExitCode == exitErr.ExitCode() {
return
}
- stderr = ee.Stderr
+ stderr = exitErr.Stderr
}
tb.Log(cfg.Git.BinPath, args)
if len(stderr) > 0 {
diff --git a/internal/git/objectpool/disconnect_test.go b/internal/git/objectpool/disconnect_test.go
index ff1b0f0d0..6774c9dfc 100644
--- a/internal/git/objectpool/disconnect_test.go
+++ b/internal/git/objectpool/disconnect_test.go
@@ -431,9 +431,11 @@ func TestRemoveAlternatesIfOk(t *testing.T) {
altBackup := altPath + ".backup"
err = removeAlternatesIfOk(ctx, repo, altPath, altBackup, logger, nil)
require.Error(t, err, "removeAlternatesIfOk should fail")
- require.IsType(t, &connectivityError{}, err, "error must be because of connectivity check")
- connectivityErr := err.(*connectivityError)
- require.IsType(t, &exec.ExitError{}, connectivityErr.error, "error must be because of fsck")
+
+ var connectivityErr *connectivityError
+ require.True(t, errors.As(err, &connectivityErr), "error must be because of connectivity check")
+ var exitError *exec.ExitError
+ require.True(t, errors.As(connectivityErr.error, &exitError), "error must be because of fsck")
// We expect objects/info/alternates to have been restored when
// removeAlternatesIfOk returned.
diff --git a/internal/gitaly/service/cleanup/apply_bfg_object_map_stream.go b/internal/gitaly/service/cleanup/apply_bfg_object_map_stream.go
index 5ecf4967f..0c13d57eb 100644
--- a/internal/gitaly/service/cleanup/apply_bfg_object_map_stream.go
+++ b/internal/gitaly/service/cleanup/apply_bfg_object_map_stream.go
@@ -1,6 +1,7 @@
package cleanup
import (
+ "errors"
"io"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/storage"
@@ -52,7 +53,8 @@ func (s *server) ApplyBfgObjectMapStream(server gitalypb.CleanupService_ApplyBfg
}
if err := cleaner.applyObjectMap(ctx, reader.streamReader()); err != nil {
- if invalidErr, ok := err.(errInvalidObjectMap); ok {
+ var invalidErr errInvalidObjectMap
+ if errors.As(err, &invalidErr) {
return structerr.NewInvalidArgument("%w", invalidErr)
}
diff --git a/internal/grpc/dnsresolver/resolver.go b/internal/grpc/dnsresolver/resolver.go
index 28396582b..df21fb198 100644
--- a/internal/grpc/dnsresolver/resolver.go
+++ b/internal/grpc/dnsresolver/resolver.go
@@ -2,6 +2,7 @@ package dnsresolver
import (
"context"
+ "errors"
"net"
"sync"
"time"
@@ -131,7 +132,8 @@ func (d *dnsResolver) resolve() (*resolver.State, error) {
// Backoff).
// - Other errors should be suppressed (they may represent the absence of a TXT record).
func handleDNSError(err error) error {
- if dnsErr, ok := err.(*net.DNSError); ok && !dnsErr.IsTimeout && !dnsErr.IsTemporary {
+ var dnsErr *net.DNSError
+ if errors.As(err, &dnsErr) && !dnsErr.IsTimeout && !dnsErr.IsTemporary {
return nil
}
diff --git a/internal/streamcache/cache_test.go b/internal/streamcache/cache_test.go
index f3a1bd57b..c8fdc82a6 100644
--- a/internal/streamcache/cache_test.go
+++ b/internal/streamcache/cache_test.go
@@ -365,8 +365,10 @@ func TestCache_unWriteableFile(t *testing.T) {
_, err := io.WriteString(w, "hello")
return err
})
- require.IsType(t, &os.PathError{}, err)
- require.Equal(t, "write", err.(*os.PathError).Op)
+
+ var pathErr *os.PathError
+ require.True(t, errors.As(err, &pathErr))
+ require.Equal(t, "write", pathErr.Op)
}
func TestCache_unCloseableFile(t *testing.T) {
@@ -385,8 +387,10 @@ func TestCache_unCloseableFile(t *testing.T) {
}
_, _, err := c.Fetch(ctx, "key", io.Discard, func(w io.Writer) error { return nil })
- require.IsType(t, &os.PathError{}, err)
- require.Equal(t, "close", err.(*os.PathError).Op)
+
+ var pathErr *os.PathError
+ require.True(t, errors.As(err, &pathErr))
+ require.Equal(t, "close", pathErr.Op)
}
func TestCache_cannotOpenFileForReading(t *testing.T) {
@@ -406,8 +410,9 @@ func TestCache_cannotOpenFileForReading(t *testing.T) {
_, _, err := c.Fetch(ctx, "key", io.Discard, func(w io.Writer) error { return nil })
err = errors.Unwrap(err)
- require.IsType(t, &os.PathError{}, err)
- require.Equal(t, "open", err.(*os.PathError).Op)
+ var pathErr *os.PathError
+ require.True(t, errors.As(err, &pathErr))
+ require.Equal(t, "open", pathErr.Op)
}
func TestWaiter(t *testing.T) {
diff --git a/internal/structerr/error.go b/internal/structerr/error.go
index e0c5dd0c7..70cc9a58e 100644
--- a/internal/structerr/error.go
+++ b/internal/structerr/error.go
@@ -262,7 +262,8 @@ func (e Error) GRPCStatus() *status.Status {
func (e Error) errorChain() []Error {
var result []Error
for err := error(e); err != nil; err = errors.Unwrap(err) {
- if structErr, ok := err.(Error); ok {
+ var structErr Error
+ if errors.As(err, &structErr) {
result = append(result, structErr)
}
}
diff --git a/internal/testhelper/leakage.go b/internal/testhelper/leakage.go
index 7a9c4006a..5aef11923 100644
--- a/internal/testhelper/leakage.go
+++ b/internal/testhelper/leakage.go
@@ -1,6 +1,7 @@
package testhelper
import (
+ "errors"
"fmt"
"os"
"os/exec"
@@ -81,13 +82,13 @@ func mustFindNoRunningChildProcess() error {
return fmt.Errorf("found running child processes %s:\n%s", pidsComma, psOut)
}
- exitError, ok := err.(*exec.ExitError)
- if !ok {
+ var exitErr *exec.ExitError
+ if !errors.As(err, &exitErr) {
//nolint:gitaly-linters
return fmt.Errorf("expected ExitError, got %T", err)
}
- if exitError.ExitCode() == 1 {
+ if exitErr.ExitCode() == 1 {
return nil
}
diff --git a/internal/testhelper/testhelper.go b/internal/testhelper/testhelper.go
index 6de813fb6..67905f67e 100644
--- a/internal/testhelper/testhelper.go
+++ b/internal/testhelper/testhelper.go
@@ -129,9 +129,10 @@ func MustRunCommand(tb testing.TB, stdin io.Reader, name string, args ...string)
}
output, err := cmd.Output()
- if err != nil {
- stderr := err.(*exec.ExitError).Stderr
- require.NoError(tb, err, "%s %s: %s", name, args, stderr)
+
+ var exitErr *exec.ExitError
+ if errors.As(err, &exitErr) {
+ require.NoError(tb, err, "%s %s: %s", name, args, exitErr.Stderr)
}
return output