mirror of
https://github.com/sourcegraph/sourcegraph.git
synced 2026-02-06 19:21:50 +00:00
lib/errors: new MultiError error type and utilities (#31466)
Wholesale migration away from go-multierror into a custom multierror implementation that is fully compatible with cockroachdb/errors, prints all errors, can be introspected with Is, As, and friends, and more. The new MultiError type is only available as an interface. Co-authored-by: Camden Cheek <camden@ccheek.com>
This commit is contained in:
parent
eb45d57126
commit
fe428b20e2
@ -73,7 +73,6 @@ run:
|
||||
# whenever we reference a file here it's relative to its containing workspace.
|
||||
# These values are under the ./lib module.
|
||||
- errors/cockroach.go
|
||||
- errors/multierror.go
|
||||
|
||||
# These are all projects with distinct go.mod files that can't import lib
|
||||
# due to not knowing an absolute path to the user's sourcegraph directory
|
||||
|
||||
@ -85,7 +85,7 @@ type Logger struct {
|
||||
|
||||
replacer *strings.Replacer
|
||||
|
||||
errs *errors.MultiError
|
||||
errs error
|
||||
errsMu sync.Mutex
|
||||
}
|
||||
|
||||
@ -112,7 +112,7 @@ func NewLogger(store ExecutionLogEntryStore, job executor.Job, recordID int, rep
|
||||
done: make(chan struct{}),
|
||||
handles: make(chan *entryHandle, logEntryBufsize),
|
||||
replacer: strings.NewReplacer(oldnew...),
|
||||
errs: &errors.MultiError{},
|
||||
errs: nil,
|
||||
}
|
||||
|
||||
go l.writeEntries()
|
||||
@ -130,7 +130,7 @@ func (l *Logger) Flush() error {
|
||||
l.errsMu.Lock()
|
||||
defer l.errsMu.Unlock()
|
||||
|
||||
return l.errs.ErrorOrNil()
|
||||
return l.errs
|
||||
}
|
||||
|
||||
// Log redacts secrets from the given log entry and stores it.
|
||||
|
||||
@ -412,7 +412,7 @@ type publicationStateMap map[string]batches.PublishedValue
|
||||
func newPublicationStateMap(in *[]graphqlbackend.ChangesetSpecPublicationStateInput) (publicationStateMap, error) {
|
||||
out := publicationStateMap{}
|
||||
if in != nil {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for _, ps := range *in {
|
||||
id, err := unmarshalChangesetSpecID(ps.ChangesetSpec)
|
||||
if err != nil {
|
||||
@ -426,8 +426,8 @@ func newPublicationStateMap(in *[]graphqlbackend.ChangesetSpecPublicationStateIn
|
||||
}
|
||||
out[id] = ps.PublicationState
|
||||
}
|
||||
if err := errs.ErrorOrNil(); err != nil {
|
||||
return nil, err
|
||||
if errs != nil {
|
||||
return nil, errs
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -443,7 +443,7 @@ func (r *Resolver) ApplyBatchChange(ctx context.Context, args *graphqlbackend.Ap
|
||||
}
|
||||
|
||||
func addPublicationStatesToOptions(in *[]graphqlbackend.ChangesetSpecPublicationStateInput, opts *service.UiPublicationStates) error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
|
||||
if in != nil && *in != nil {
|
||||
for _, state := range *in {
|
||||
@ -459,7 +459,7 @@ func addPublicationStatesToOptions(in *[]graphqlbackend.ChangesetSpecPublication
|
||||
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
func (r *Resolver) applyOrCreateBatchChange(ctx context.Context, args *graphqlbackend.ApplyBatchChangeArgs, opts service.ApplyBatchChangeOpts) (*btypes.BatchChange, error) {
|
||||
|
||||
@ -51,7 +51,7 @@ func (h *BitbucketServerWebhook) ServeHTTP(w http.ResponseWriter, r *http.Reques
|
||||
|
||||
prs, ev := h.convertEvent(e)
|
||||
|
||||
m := new(errors.MultiError)
|
||||
var m error
|
||||
for _, pr := range prs {
|
||||
if pr == (PR{}) {
|
||||
log15.Warn("Dropping Bitbucket Server webhook event", "type", fmt.Sprintf("%T", e))
|
||||
@ -63,7 +63,7 @@ func (h *BitbucketServerWebhook) ServeHTTP(w http.ResponseWriter, r *http.Reques
|
||||
m = errors.Append(m, err)
|
||||
}
|
||||
}
|
||||
if m.ErrorOrNil() != nil {
|
||||
if m != nil {
|
||||
respond(w, http.StatusInternalServerError, m)
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ func (h *GitHubWebhook) Register(router *webhooks.GitHubWebhook) {
|
||||
// handleGithubWebhook is the entry point for webhooks from the webhook router, see the events
|
||||
// it's registered to handle in GitHubWebhook.Register
|
||||
func (h *GitHubWebhook) handleGitHubWebhook(ctx context.Context, extSvc *types.ExternalService, payload interface{}) error {
|
||||
m := new(errors.MultiError)
|
||||
var m error
|
||||
externalServiceID, err := extractExternalServiceID(extSvc)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -72,7 +72,7 @@ func (h *GitHubWebhook) handleGitHubWebhook(ctx context.Context, extSvc *types.E
|
||||
m = errors.Append(m, err)
|
||||
}
|
||||
}
|
||||
return m.ErrorOrNil()
|
||||
return m
|
||||
}
|
||||
|
||||
func (h *GitHubWebhook) convertEvent(ctx context.Context, externalServiceID string, theirs interface{}) (prs []PR, ours keyer) {
|
||||
|
||||
@ -27,9 +27,9 @@ func (c *Config) Load() {
|
||||
}
|
||||
|
||||
func (c *Config) Validate() error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
errs = errors.Append(errs, c.BaseConfig.Validate())
|
||||
errs = errors.Append(errs, c.LSIFUploadStoreConfig.Validate())
|
||||
errs = errors.Append(errs, c.AutoIndexEnqueuerConfig.Validate())
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -27,8 +27,8 @@ func (c *Config) Load() {
|
||||
}
|
||||
|
||||
func (c *Config) Validate() error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
errs = errors.Append(errs, c.BaseConfig.Validate())
|
||||
errs = errors.Append(errs, c.LSIFUploadStoreConfig.Validate())
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -20,8 +20,8 @@ func (c *janitorConfig) Load() {
|
||||
}
|
||||
|
||||
func (c *janitorConfig) Validate() error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
errs = errors.Append(errs, c.BaseConfig.Validate())
|
||||
errs = errors.Append(errs, c.MetricsConfig.Validate())
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -36,8 +36,8 @@ func (c *indexingConfig) Load() {
|
||||
}
|
||||
|
||||
func (c *indexingConfig) Validate() error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
errs = errors.Append(errs, c.BaseConfig.Validate())
|
||||
errs = errors.Append(errs, c.AutoIndexEnqueuerConfig.Validate())
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -57,8 +57,8 @@ func (c *janitorConfig) Load() {
|
||||
}
|
||||
|
||||
func (c *janitorConfig) Validate() error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
errs = errors.Append(errs, c.BaseConfig.Validate())
|
||||
errs = errors.Append(errs, c.MetricsConfig.Validate())
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -360,7 +360,7 @@ func TestAuthzProvidersFromConfig(t *testing.T) {
|
||||
},
|
||||
},
|
||||
expAuthzAllowAccessByDefault: false,
|
||||
expSeriousProblems: []string{"1 error occurred:\n\t* authorization.oauth.signingKey: illegal base64 data at input byte 7\n\n"},
|
||||
expSeriousProblems: []string{"authorization.oauth.signingKey: illegal base64 data at input byte 7"},
|
||||
},
|
||||
{
|
||||
description: "Bitbucket Server exact username matching",
|
||||
|
||||
@ -43,12 +43,12 @@ func newAuthzProvider(
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
errs := new(errors.MultiError)
|
||||
var errs error
|
||||
|
||||
cli, err := bitbucketserver.NewClient(c.BitbucketServerConnection, nil)
|
||||
if err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
return nil, errs.ErrorOrNil()
|
||||
return nil, errs
|
||||
}
|
||||
|
||||
var p authz.Provider
|
||||
@ -59,7 +59,7 @@ func newAuthzProvider(
|
||||
errs = errors.Append(errs, errors.Errorf("No identityProvider was specified"))
|
||||
}
|
||||
|
||||
return p, errs.ErrorOrNil()
|
||||
return p, errs
|
||||
}
|
||||
|
||||
// ValidateAuthz validates the authorization fields of the given BitbucketServer external
|
||||
|
||||
@ -21,7 +21,7 @@ func ParseTextSearch(search string) ([]TextSearchTerm, error) {
|
||||
return nil, errors.Wrap(err, "parsing search string")
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
terms := []TextSearchTerm{}
|
||||
for _, expr := range tree {
|
||||
if expr.Field != "" {
|
||||
@ -58,5 +58,5 @@ func ParseTextSearch(search string) ([]TextSearchTerm, error) {
|
||||
}
|
||||
}
|
||||
|
||||
return terms, errs.ErrorOrNil()
|
||||
return terms, errs
|
||||
}
|
||||
|
||||
@ -30,10 +30,10 @@ func TestChangesetSearch(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs errors.MultiError
|
||||
if !errors.As(err, &errs) {
|
||||
t.Errorf("unexpected error of type %T: %+v", err, err)
|
||||
} else if diff := cmp.Diff(expected, errs.Errors); diff != "" {
|
||||
} else if diff := cmp.Diff(expected, errs.Errors()); diff != "" {
|
||||
t.Errorf("unexpected error (-want +have):\n%s", diff)
|
||||
}
|
||||
})
|
||||
@ -51,10 +51,10 @@ func TestChangesetSearch(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs errors.MultiError
|
||||
if !errors.As(err, &errs) {
|
||||
t.Errorf("unexpected error of type %T: %+v", err, err)
|
||||
} else if diff := cmp.Diff(expected, errs.Errors); diff != "" {
|
||||
} else if diff := cmp.Diff(expected, errs.Errors()); diff != "" {
|
||||
t.Errorf("unexpected error (-want +have):\n%s", diff)
|
||||
}
|
||||
})
|
||||
@ -76,10 +76,10 @@ func TestChangesetSearch(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs errors.MultiError
|
||||
if !errors.As(err, &errs) {
|
||||
t.Errorf("unexpected error of type %T: %+v", err, err)
|
||||
} else if diff := cmp.Diff(expected, errs.Errors); diff != "" {
|
||||
} else if diff := cmp.Diff(expected, errs.Errors()); diff != "" {
|
||||
t.Errorf("unexpected error (-want +have):\n%s", diff)
|
||||
}
|
||||
})
|
||||
|
||||
@ -1185,7 +1185,7 @@ func (s *Service) ValidateChangesetSpecs(ctx context.Context, batchSpecID int64)
|
||||
return nonValidationErr
|
||||
}
|
||||
|
||||
errs := &errors.MultiError{ErrorFormat: formatChangesetSpecHeadRefConflicts}
|
||||
var errs changesetSpecHeadRefConflictErrs
|
||||
for _, c := range conflicts {
|
||||
conflictErr := &changesetSpecHeadRefConflict{count: c.Count, headRef: c.HeadRef}
|
||||
|
||||
@ -1193,10 +1193,9 @@ func (s *Service) ValidateChangesetSpecs(ctx context.Context, batchSpecID int64)
|
||||
if repo, ok := accessibleReposByID[c.RepoID]; ok {
|
||||
conflictErr.repo = repo
|
||||
}
|
||||
errs = errors.Append(errs, conflictErr)
|
||||
errs = append(errs, conflictErr)
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
type changesetSpecHeadRefConflict struct {
|
||||
@ -1212,7 +1211,11 @@ func (c changesetSpecHeadRefConflict) Error() string {
|
||||
return fmt.Sprintf("%d changeset specs in the same repository use the same branch: %s", c.count, c.headRef)
|
||||
}
|
||||
|
||||
func formatChangesetSpecHeadRefConflicts(es []error) string {
|
||||
// changesetSpecHeadRefConflictErrs represents a set of changesetSpecHeadRefConflict and
|
||||
// implements `Error` to render the errors nicely.
|
||||
type changesetSpecHeadRefConflictErrs []*changesetSpecHeadRefConflict
|
||||
|
||||
func (es changesetSpecHeadRefConflictErrs) Error() string {
|
||||
if len(es) == 1 {
|
||||
return fmt.Sprintf("Validating changeset specs resulted in an error:\n* %s\n", es[0])
|
||||
}
|
||||
@ -1319,7 +1322,7 @@ func (s *Service) RetryBatchSpecWorkspaces(ctx context.Context, workspaceIDs []i
|
||||
return errors.Wrap(err, "loading batch spec workspace execution jobs")
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
jobIDs := make([]int64, len(jobs))
|
||||
|
||||
for i, j := range jobs {
|
||||
@ -1329,7 +1332,7 @@ func (s *Service) RetryBatchSpecWorkspaces(ctx context.Context, workspaceIDs []i
|
||||
jobIDs[i] = j.ID
|
||||
}
|
||||
|
||||
if err := errs.ErrorOrNil(); err != nil {
|
||||
if err := errs; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
@ -607,7 +607,7 @@ func TestService(t *testing.T) {
|
||||
}
|
||||
|
||||
haveErr := fmt.Sprintf("%v", err)
|
||||
wantErr := "4 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* baseRepository is required\n\t* externalID is required\n\t* Additional property externalComputer is not allowed\n\n"
|
||||
wantErr := "4 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* baseRepository is required\n\t* externalID is required\n\t* Additional property externalComputer is not allowed"
|
||||
if diff := cmp.Diff(wantErr, haveErr); diff != "" {
|
||||
t.Fatalf("unexpected error (-want +got):\n%s", diff)
|
||||
}
|
||||
|
||||
@ -63,7 +63,7 @@ func (ps *UiPublicationStates) prepareAndValidate(mappings btypes.RewirerMapping
|
||||
// Handle the specs. We'll drain ps.rand while we add entries to ps.id,
|
||||
// which means we can ensure that all the given changeset spec IDs mapped to
|
||||
// a changeset spec.
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
ps.id = map[int64]*btypes.ChangesetUiPublicationState{}
|
||||
for rid, pv := range ps.rand {
|
||||
if spec, ok := specs[rid]; ok {
|
||||
@ -84,5 +84,5 @@ func (ps *UiPublicationStates) prepareAndValidate(mappings btypes.RewirerMapping
|
||||
errs = errors.Append(errs, errors.Newf("changeset spec %q not found", rid))
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -131,7 +131,7 @@ func (wr *workspaceResolver) ResolveWorkspacesForBatchSpec(ctx context.Context,
|
||||
func (wr *workspaceResolver) determineRepositories(ctx context.Context, batchSpec *batcheslib.BatchSpec) ([]*RepoRevision, error) {
|
||||
agg := onlib.NewRepoRevisionAggregator()
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
// TODO: this could be trivially parallelised in the future.
|
||||
for _, on := range batchSpec.On {
|
||||
revs, ruleType, err := wr.resolveRepositoriesOn(ctx, &on)
|
||||
@ -155,7 +155,7 @@ func (wr *workspaceResolver) determineRepositories(ctx context.Context, batchSpe
|
||||
for _, rev := range agg.Revisions() {
|
||||
repoRevs = append(repoRevs, rev.(*RepoRevision))
|
||||
}
|
||||
return repoRevs, errs.ErrorOrNil()
|
||||
return repoRevs, errs
|
||||
}
|
||||
|
||||
func findIgnoredRepositories(ctx context.Context, repos []*RepoRevision) (map[*types.Repo]struct{}, error) {
|
||||
@ -195,7 +195,7 @@ func findIgnoredRepositories(ctx context.Context, repos []*RepoRevision) (map[*t
|
||||
close(results)
|
||||
}(&wg)
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for result := range results {
|
||||
if result.err != nil {
|
||||
errs = errors.Append(errs, result.err)
|
||||
@ -207,7 +207,7 @@ func findIgnoredRepositories(ctx context.Context, repos []*RepoRevision) (map[*t
|
||||
}
|
||||
}
|
||||
|
||||
return ignored, errs.ErrorOrNil()
|
||||
return ignored, errs
|
||||
}
|
||||
|
||||
var ErrMalformedOnQueryOrRepository = batcheslib.NewValidationError(errors.New("malformed 'on' field; missing either a repository name or a query"))
|
||||
@ -565,7 +565,7 @@ func findWorkspaces(
|
||||
) ([]*RepoWorkspace, error) {
|
||||
// Pre-compile all globs.
|
||||
workspaceMatchers := make(map[batcheslib.WorkspaceConfiguration]glob.Glob)
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for _, conf := range spec.Workspaces {
|
||||
in := conf.In
|
||||
// Empty `in` should fall back to matching all, instead of nothing.
|
||||
@ -578,8 +578,8 @@ func findWorkspaces(
|
||||
}
|
||||
workspaceMatchers[conf] = g
|
||||
}
|
||||
if err := errs.ErrorOrNil(); err != nil {
|
||||
return nil, err
|
||||
if errs != nil {
|
||||
return nil, errs
|
||||
}
|
||||
|
||||
root := []*RepoRevision{}
|
||||
|
||||
@ -232,7 +232,7 @@ func parseConfiguration(raw *[]*schema.BatchChangeRolloutWindow) ([]Window, erro
|
||||
return windows, nil
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for i, rawWindow := range *raw {
|
||||
if window, err := parseWindow(rawWindow); err != nil {
|
||||
errs = errors.Append(errs, errors.Wrapf(err, "window %d", i))
|
||||
@ -241,5 +241,5 @@ func parseConfiguration(raw *[]*schema.BatchChangeRolloutWindow) ([]Window, erro
|
||||
}
|
||||
}
|
||||
|
||||
return windows, errs.ErrorOrNil()
|
||||
return windows, errs
|
||||
}
|
||||
|
||||
@ -366,9 +366,9 @@ func TestParseConfiguration(t *testing.T) {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
_, err := parseConfiguration(tc.in)
|
||||
|
||||
var e *errors.MultiError
|
||||
if !errors.As(err, &e) || len(e.Errors) != tc.want {
|
||||
t.Errorf("unexpected number of errors: have=%d want=%d", len(e.Errors), tc.want)
|
||||
var e errors.MultiError
|
||||
if !errors.As(err, &e) || len(e.Errors()) != tc.want {
|
||||
t.Errorf("unexpected number of errors: have=%d want=%d", len(e.Errors()), tc.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@ -122,7 +122,7 @@ func parseWeekday(raw string) (time.Weekday, error) {
|
||||
|
||||
func parseWindow(raw *schema.BatchChangeRolloutWindow) (Window, error) {
|
||||
w := Window{}
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
|
||||
if raw == nil {
|
||||
return w, errors.New("raw window cannot be nil")
|
||||
@ -157,5 +157,5 @@ func parseWindow(raw *schema.BatchChangeRolloutWindow) (Window, error) {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
|
||||
return w, errs.ErrorOrNil()
|
||||
return w, errs
|
||||
}
|
||||
|
||||
@ -1307,9 +1307,9 @@ func TestExternalServices_ValidateConfig(t *testing.T) {
|
||||
if err == nil {
|
||||
have = append(have, "<nil>")
|
||||
} else {
|
||||
var errs *errors.MultiError
|
||||
var errs errors.MultiError
|
||||
if errors.As(err, &errs) {
|
||||
for _, err := range errs.Errors {
|
||||
for _, err := range errs.Errors() {
|
||||
have = append(have, err.Error())
|
||||
}
|
||||
} else {
|
||||
|
||||
6
go.mod
6
go.mod
@ -28,8 +28,7 @@ require (
|
||||
github.com/cespare/xxhash v1.1.0
|
||||
github.com/cespare/xxhash/v2 v2.1.2
|
||||
github.com/charmbracelet/glamour v0.5.0
|
||||
github.com/cockroachdb/errors v1.8.6
|
||||
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2
|
||||
github.com/cockroachdb/errors v1.8.9
|
||||
github.com/coreos/go-oidc v2.2.1+incompatible
|
||||
github.com/coreos/go-semver v0.3.0
|
||||
github.com/crewjam/saml v0.4.6
|
||||
@ -50,6 +49,7 @@ require (
|
||||
github.com/fsnotify/fsnotify v1.5.1
|
||||
github.com/gen2brain/beeep v0.0.0-20210529141713-5586760f0cc1
|
||||
github.com/getsentry/raven-go v0.2.0
|
||||
github.com/getsentry/sentry-go v0.12.0
|
||||
github.com/ghodss/yaml v1.0.0
|
||||
github.com/gitchander/permutation v0.0.0-20210517125447-a5d73722e1b1
|
||||
github.com/go-enry/go-enry/v2 v2.8.0
|
||||
@ -164,7 +164,7 @@ require (
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11
|
||||
golang.org/x/tools v0.1.9
|
||||
google.golang.org/api v0.66.0
|
||||
|
||||
44
go.sum
44
go.sum
@ -146,7 +146,9 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw=
|
||||
github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno=
|
||||
github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w=
|
||||
github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo=
|
||||
github.com/DataDog/zstd v1.5.0 h1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo=
|
||||
github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||
github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
|
||||
@ -421,17 +423,17 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH
|
||||
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
|
||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4=
|
||||
github.com/cockroachdb/datadriven v1.0.1-0.20211007161720-b558070c3be0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4=
|
||||
github.com/cockroachdb/datadriven v1.0.1-0.20220214170620-9913f5bc19b7/go.mod h1:hi0MtSY3AYDQNDi83kDkMH5/yqM/CsIrsOITkSoH7KI=
|
||||
github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM=
|
||||
github.com/cockroachdb/errors v1.8.6 h1:Am9evxl/po3RzpokemQvq7S7Cd0mxv24xy0B/trlQF4=
|
||||
github.com/cockroachdb/errors v1.8.6/go.mod h1:hOm5fabihW+xEyY1kuypGwqT+Vt7rafg04ytBtIpeIQ=
|
||||
github.com/cockroachdb/errors v1.8.8/go.mod h1:z6VnEL3hZ/2ONZEvG7S5Ym0bU2AqPcEKnIiA1wbsSu0=
|
||||
github.com/cockroachdb/errors v1.8.9 h1:eqUxTOUOduHP4D3f3wJ0kiyoNjDf6wLCso/4n7rBA4U=
|
||||
github.com/cockroachdb/errors v1.8.9/go.mod h1:vaNcEYYqbIqB5JhKBhFV9CneUqeuEbB2OYJBK4GBNYQ=
|
||||
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
||||
github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f h1:6jduT9Hfc0njg5jJ1DdKCFPdMBrp/mdZfCpa5h+WM74=
|
||||
github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
|
||||
github.com/cockroachdb/redact v1.1.1/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=
|
||||
github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM=
|
||||
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
@ -718,6 +720,8 @@ github.com/gen2brain/beeep v0.0.0-20210529141713-5586760f0cc1/go.mod h1:ElSskYZe
|
||||
github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
|
||||
github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs=
|
||||
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
||||
github.com/getsentry/sentry-go v0.12.0 h1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk=
|
||||
github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c=
|
||||
github.com/gfleury/go-bitbucket-v1 v0.0.0-20200312180434-e5170e3280fb/go.mod h1:lWZ30Bdbuo1+PsOOyFfRJhgWWAkp9CxMa2D3dUO0458=
|
||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
@ -978,6 +982,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
||||
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU=
|
||||
@ -1187,6 +1193,7 @@ github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7Fsg
|
||||
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
|
||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gosimple/slug v1.1.1/go.mod h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0=
|
||||
@ -1307,6 +1314,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
|
||||
github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI=
|
||||
github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0=
|
||||
github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI=
|
||||
github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk=
|
||||
github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g=
|
||||
github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
|
||||
github.com/ishidawataru/sctp v0.0.0-20191218070446-00ab2ac2db07/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
|
||||
github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg=
|
||||
@ -1428,9 +1437,14 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh
|
||||
github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
|
||||
github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
|
||||
github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk=
|
||||
github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8=
|
||||
github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U=
|
||||
github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE=
|
||||
github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw=
|
||||
github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE=
|
||||
github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0=
|
||||
github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro=
|
||||
github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8=
|
||||
github.com/keegancsmith/rpc v1.1.0/go.mod h1:Xow74TKX34OPPiPCdz6x1o9c0SCxRqGxDuKGk7ZOo8s=
|
||||
github.com/keegancsmith/rpc v1.3.0 h1:wGWOpjcNrZaY8GDYZJfvyxmlLljm3YQWF+p918DXtDk=
|
||||
github.com/keegancsmith/rpc v1.3.0/go.mod h1:6O2xnOGjPyvIPbvp0MdrOe5r6cu1GZ4JoTzpzDhWeo0=
|
||||
@ -1451,6 +1465,7 @@ github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0
|
||||
github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||
@ -1484,6 +1499,7 @@ github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LE
|
||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
|
||||
github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y=
|
||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
@ -1529,7 +1545,9 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc=
|
||||
@ -1570,6 +1588,7 @@ github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 h1:YocNLcTBdEd
|
||||
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo=
|
||||
github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg=
|
||||
github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ=
|
||||
github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
|
||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||
github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc=
|
||||
github.com/microcosm-cc/bluemonday v1.0.17 h1:Z1a//hgsQ4yjC+8zEkV8IWySkXnsxmdSY642CTFQb5Y=
|
||||
@ -1665,8 +1684,11 @@ github.com/mwitkow/go-proto-validators v0.3.2/go.mod h1:ej0Qp0qMgHN/KtDyUt+Q1/tA
|
||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus=
|
||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
||||
github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c=
|
||||
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
|
||||
github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM=
|
||||
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
|
||||
github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4=
|
||||
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
|
||||
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
|
||||
@ -1897,6 +1919,7 @@ github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFo
|
||||
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||
github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g=
|
||||
github.com/schollz/progressbar/v3 v3.8.5 h1:VcmmNRO+eFN3B0m5dta6FXYXY+MEJmXdWoIS+jjssQM=
|
||||
github.com/schollz/progressbar/v3 v3.8.5/go.mod h1:ewO25kD7ZlaJFTvMeOItkOZa8kXu1UvFs379htE8HMQ=
|
||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||
@ -2132,6 +2155,7 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC
|
||||
github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
|
||||
github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
||||
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||
github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4=
|
||||
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
|
||||
github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c=
|
||||
@ -2309,6 +2333,7 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3
|
||||
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
@ -2322,6 +2347,7 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm
|
||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE=
|
||||
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
@ -2442,6 +2468,7 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx
|
||||
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210907225631-ff17edfbf26d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
@ -2603,8 +2630,8 @@ golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
@ -2628,6 +2655,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M=
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@ -2982,6 +3010,7 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:a
|
||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.54.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
@ -3014,6 +3043,7 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
||||
@ -416,7 +416,7 @@ func (e *externalServiceStore) ValidateConfig(ctx context.Context, opt ValidateE
|
||||
return nil, errors.Wrap(err, "unable to validate config against schema")
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for _, err := range res.Errors() {
|
||||
e := err.String()
|
||||
// Remove `(root): ` from error formatting since these errors are
|
||||
@ -470,7 +470,7 @@ func (e *externalServiceStore) ValidateConfig(ctx context.Context, opt ValidateE
|
||||
err = validateOtherExternalServiceConnection(&c)
|
||||
}
|
||||
|
||||
return normalized, errors.Append(errs, err).ErrorOrNil()
|
||||
return normalized, errors.Append(errs, err)
|
||||
}
|
||||
|
||||
// Neither our JSON schema library nor the Monaco editor we use supports
|
||||
@ -503,7 +503,7 @@ func validateOtherExternalServiceConnection(c *schema.OtherExternalServiceConnec
|
||||
}
|
||||
|
||||
func (e *externalServiceStore) validateGitHubConnection(ctx context.Context, id int64, c *schema.GitHubConnection) error {
|
||||
err := new(errors.MultiError)
|
||||
var err error
|
||||
for _, validate := range e.gitHubValidators {
|
||||
err = errors.Append(err, validate(c))
|
||||
}
|
||||
@ -517,22 +517,22 @@ func (e *externalServiceStore) validateGitHubConnection(ctx context.Context, id
|
||||
|
||||
err = errors.Append(err, e.validateDuplicateRateLimits(ctx, id, extsvc.KindGitHub, c))
|
||||
|
||||
return err.ErrorOrNil()
|
||||
return err
|
||||
}
|
||||
|
||||
func (e *externalServiceStore) validateGitLabConnection(ctx context.Context, id int64, c *schema.GitLabConnection, ps []schema.AuthProviders) error {
|
||||
err := new(errors.MultiError)
|
||||
var err error
|
||||
for _, validate := range e.gitLabValidators {
|
||||
err = errors.Append(err, validate(c, ps))
|
||||
}
|
||||
|
||||
err = errors.Append(err, e.validateDuplicateRateLimits(ctx, id, extsvc.KindGitLab, c))
|
||||
|
||||
return err.ErrorOrNil()
|
||||
return err
|
||||
}
|
||||
|
||||
func (e *externalServiceStore) validateBitbucketServerConnection(ctx context.Context, id int64, c *schema.BitbucketServerConnection) error {
|
||||
err := new(errors.MultiError)
|
||||
var err error
|
||||
for _, validate := range e.bitbucketServerValidators {
|
||||
err = errors.Append(err, validate(c))
|
||||
}
|
||||
@ -543,7 +543,7 @@ func (e *externalServiceStore) validateBitbucketServerConnection(ctx context.Con
|
||||
|
||||
err = errors.Append(err, e.validateDuplicateRateLimits(ctx, id, extsvc.KindBitbucketServer, c))
|
||||
|
||||
return err.ErrorOrNil()
|
||||
return err
|
||||
}
|
||||
|
||||
func (e *externalServiceStore) validateBitbucketCloudConnection(ctx context.Context, id int64, c *schema.BitbucketCloudConnection) error {
|
||||
@ -551,7 +551,7 @@ func (e *externalServiceStore) validateBitbucketCloudConnection(ctx context.Cont
|
||||
}
|
||||
|
||||
func (e *externalServiceStore) validatePerforceConnection(ctx context.Context, id int64, c *schema.PerforceConnection) error {
|
||||
err := new(errors.MultiError)
|
||||
var err error
|
||||
for _, validate := range e.perforceValidators {
|
||||
err = errors.Append(err, validate(c))
|
||||
}
|
||||
@ -562,7 +562,7 @@ func (e *externalServiceStore) validatePerforceConnection(ctx context.Context, i
|
||||
|
||||
err = errors.Append(err, e.validateDuplicateRateLimits(ctx, id, extsvc.KindPerforce, c))
|
||||
|
||||
return err.ErrorOrNil()
|
||||
return err
|
||||
}
|
||||
|
||||
// validateDuplicateRateLimits returns an error if given config has duplicated non-default rate limit
|
||||
|
||||
@ -158,13 +158,13 @@ func TestExternalServicesStore_ValidateConfig(t *testing.T) {
|
||||
name: "1 error",
|
||||
kind: extsvc.KindGitHub,
|
||||
config: `{"repositoryQuery": ["none"], "token": "fake"}`,
|
||||
wantErr: "1 error occurred:\n\t* url is required\n\n",
|
||||
wantErr: "url is required",
|
||||
},
|
||||
{
|
||||
name: "2 errors",
|
||||
kind: extsvc.KindGitHub,
|
||||
config: `{"url": "https://github.com", "repositoryQuery": ["none"], "token": ""}`,
|
||||
wantErr: "2 errors occurred:\n\t* token: String length must be greater than or equal to 1\n\t* at least one of token or githubAppInstallationID must be set\n\n",
|
||||
wantErr: "2 errors occurred:\n\t* token: String length must be greater than or equal to 1\n\t* at least one of token or githubAppInstallationID must be set",
|
||||
},
|
||||
{
|
||||
name: "no conflicting rate limit",
|
||||
@ -199,7 +199,7 @@ func TestExternalServicesStore_ValidateConfig(t *testing.T) {
|
||||
}, nil
|
||||
}
|
||||
},
|
||||
wantErr: "1 error occurred:\n\t* existing external service, \"GITHUB 1\", already has a rate limit set\n\n",
|
||||
wantErr: "existing external service, \"GITHUB 1\", already has a rate limit set",
|
||||
},
|
||||
{
|
||||
name: "prevent code hosts that are not allowed",
|
||||
|
||||
@ -97,14 +97,14 @@ func (r *Runner) forEachSchema(ctx context.Context, schemaNames []string, visito
|
||||
wg.Wait()
|
||||
close(errorCh)
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for err := range errorCh {
|
||||
if err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
func (r *Runner) prepareSchemas(schemaNames []string) (map[string]*schemas.Schema, error) {
|
||||
|
||||
@ -906,7 +906,7 @@ func (c *ClientImplementor) RepoCloneProgress(ctx context.Context, repos ...api.
|
||||
}(op{req: req})
|
||||
}
|
||||
|
||||
err := new(errors.MultiError)
|
||||
var err error
|
||||
res := protocol.RepoCloneProgressResponse{
|
||||
Results: make(map[api.RepoName]*protocol.RepoCloneProgress),
|
||||
}
|
||||
@ -924,7 +924,7 @@ func (c *ClientImplementor) RepoCloneProgress(ctx context.Context, repos ...api.
|
||||
}
|
||||
}
|
||||
|
||||
return &res, err.ErrorOrNil()
|
||||
return &res, err
|
||||
}
|
||||
|
||||
func (c *ClientImplementor) RepoInfo(ctx context.Context, repos ...api.RepoName) (*protocol.RepoInfoResponse, error) {
|
||||
@ -976,7 +976,7 @@ func (c *ClientImplementor) RepoInfo(ctx context.Context, repos ...api.RepoName)
|
||||
}(op{req: req})
|
||||
}
|
||||
|
||||
err := new(errors.MultiError)
|
||||
var err error
|
||||
res := protocol.RepoInfoResponse{
|
||||
Results: make(map[api.RepoName]*protocol.RepoInfo),
|
||||
}
|
||||
@ -994,7 +994,7 @@ func (c *ClientImplementor) RepoInfo(ctx context.Context, repos ...api.RepoName)
|
||||
}
|
||||
}
|
||||
|
||||
return &res, err.ErrorOrNil()
|
||||
return &res, err
|
||||
}
|
||||
|
||||
func (c *ClientImplementor) ReposStats(ctx context.Context) (map[string]*protocol.ReposStats, error) {
|
||||
|
||||
@ -152,7 +152,7 @@ func (cs *CommitSearcher) feedBatches(ctx context.Context, jobs chan job, result
|
||||
defer func() {
|
||||
// Always call cmd.Wait to avoid leaving zombie processes around.
|
||||
if e := cmd.Wait(); e != nil {
|
||||
err = errors.Append(err, tryInterpretErrorWithStderr(ctx, err, stderrBuf.String())).ErrorOrNil()
|
||||
err = errors.Append(err, tryInterpretErrorWithStderr(ctx, err, stderrBuf.String()))
|
||||
}
|
||||
}()
|
||||
|
||||
@ -238,11 +238,11 @@ func (cs *CommitSearcher) runJobs(ctx context.Context, jobs chan job) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for j := range jobs {
|
||||
errs = errors.Append(errs, runJob(j))
|
||||
}
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
func revsToGitArgs(revs []protocol.RevisionSpecifier) []string {
|
||||
|
||||
@ -32,13 +32,13 @@ func TestRunWorkersN(t *testing.T) {
|
||||
return nil
|
||||
}))
|
||||
|
||||
var e *errors.MultiError
|
||||
var e errors.MultiError
|
||||
if err == nil || !errors.As(err, &e) {
|
||||
t.Errorf("unexpected error wrapper: %v", err)
|
||||
}
|
||||
|
||||
var errStrings []string
|
||||
for _, err := range e.WrappedErrors() {
|
||||
for _, err := range e.Errors() {
|
||||
errStrings = append(errStrings, err.Error())
|
||||
}
|
||||
sort.Strings(errStrings)
|
||||
|
||||
@ -299,7 +299,7 @@ func (c *Client) GraphQL(token, query string, variables map[string]interface{},
|
||||
return errors.Wrap(err, "unmarshal response body to errors")
|
||||
}
|
||||
if len(errResp.Errors) > 0 {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for _, err := range errResp.Errors {
|
||||
errs = errors.Append(errs, errors.New(err.Message))
|
||||
}
|
||||
|
||||
@ -185,13 +185,13 @@ func (f Factory) Client(base ...Opt) (*http.Client, error) {
|
||||
opts = append(opts, f.common...)
|
||||
|
||||
var cli http.Client
|
||||
var err *errors.MultiError
|
||||
var err error
|
||||
|
||||
for _, opt := range opts {
|
||||
err = errors.Append(err, opt(&cli))
|
||||
}
|
||||
|
||||
return &cli, err.ErrorOrNil()
|
||||
return &cli, err
|
||||
}
|
||||
|
||||
// NewFactory returns a Factory that applies the given common
|
||||
|
||||
@ -202,21 +202,24 @@ func (f FinishFunc) OnCancel(ctx context.Context, count float64, args Args) {
|
||||
|
||||
// ErrCollector represents multiple errors and additional log fields that arose from those errors.
|
||||
type ErrCollector struct {
|
||||
multi *errors.MultiError
|
||||
errs error
|
||||
extraFields []log.Field
|
||||
}
|
||||
|
||||
func NewErrorCollector() *ErrCollector { return &ErrCollector{multi: &errors.MultiError{}} }
|
||||
func NewErrorCollector() *ErrCollector { return &ErrCollector{errs: nil} }
|
||||
|
||||
func (e *ErrCollector) Collect(err *error, fields ...log.Field) {
|
||||
if err != nil && *err != nil {
|
||||
e.multi.Errors = append(e.multi.Errors, *err)
|
||||
e.errs = errors.Append(e.errs, *err)
|
||||
e.extraFields = append(e.extraFields, fields...)
|
||||
}
|
||||
}
|
||||
|
||||
func (e *ErrCollector) Error() string {
|
||||
return e.multi.Error()
|
||||
if e.errs == nil {
|
||||
return ""
|
||||
}
|
||||
return e.errs.Error()
|
||||
}
|
||||
|
||||
// Args configures the observation behavior of an invocation of an operation.
|
||||
@ -273,7 +276,7 @@ func (op *Operation) WithErrorsAndLogger(ctx context.Context, root *error, args
|
||||
if root != nil {
|
||||
endFunc = func(count float64, args Args) {
|
||||
if *root != nil {
|
||||
errTracer.multi.Errors = append(errTracer.multi.Errors, *root)
|
||||
errTracer.errs = errors.Append(errTracer.errs, *root)
|
||||
}
|
||||
endObservation(count, args)
|
||||
}
|
||||
@ -329,7 +332,7 @@ func (op *Operation) WithAndLogger(ctx context.Context, err *error, args Args) (
|
||||
metricLabels := mergeLabels(op.metricLabels, args.MetricLabelValues, finishArgs.MetricLabelValues)
|
||||
|
||||
if multi := new(ErrCollector); err != nil && errors.As(*err, &multi) {
|
||||
if len(multi.multi.Errors) == 0 {
|
||||
if multi.errs == nil {
|
||||
err = nil
|
||||
}
|
||||
logFields = append(logFields, multi.extraFields...)
|
||||
|
||||
@ -104,7 +104,7 @@ func (o *observedSource) ListRepos(ctx context.Context, results chan SourceResul
|
||||
close(uncounted)
|
||||
}()
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for res := range uncounted {
|
||||
results <- res
|
||||
if res.Err != nil {
|
||||
@ -113,7 +113,7 @@ func (o *observedSource) ListRepos(ctx context.Context, results chan SourceResul
|
||||
count++
|
||||
}
|
||||
if errs != nil {
|
||||
err = errs.ErrorOrNil()
|
||||
err = errs
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -159,14 +159,11 @@ type SourceError struct {
|
||||
}
|
||||
|
||||
func (s *SourceError) Error() string {
|
||||
var e *errors.MultiError
|
||||
var e errors.MultiError
|
||||
if errors.As(s.Err, &e) {
|
||||
// Create new Error with custom formatter. Do not mutate otherwise can
|
||||
// race with other callers of Error.
|
||||
return (&errors.MultiError{
|
||||
Errors: e.Errors,
|
||||
ErrorFormat: sourceErrorFormatFunc,
|
||||
}).Error()
|
||||
return sourceErrorFormatFunc(e.Errors())
|
||||
}
|
||||
return s.Err.Error()
|
||||
}
|
||||
@ -204,7 +201,7 @@ func listAll(ctx context.Context, src Source) ([]*types.Repo, error) {
|
||||
|
||||
var (
|
||||
repos []*types.Repo
|
||||
errs *errors.MultiError
|
||||
errs error
|
||||
)
|
||||
|
||||
for res := range results {
|
||||
@ -217,5 +214,5 @@ func listAll(ctx context.Context, src Source) ([]*types.Repo, error) {
|
||||
repos = append(repos, res.Repo)
|
||||
}
|
||||
|
||||
return repos, errs.ErrorOrNil()
|
||||
return repos, errs
|
||||
}
|
||||
|
||||
@ -212,16 +212,16 @@ func (s *Store) DeleteExternalServiceReposNotIn(ctx context.Context, svc *types.
|
||||
return nil, errors.Wrap(err, "failed to list external service repo ids")
|
||||
}
|
||||
|
||||
var errs errors.MultiError
|
||||
var errs error
|
||||
for _, id := range toDelete {
|
||||
if err = s.DeleteExternalServiceRepo(ctx, svc, api.RepoID(id)); err != nil {
|
||||
errors.Append(&errs, errors.Wrapf(err, "failed to delete external service repo (%d, %d)", svc.ID, id))
|
||||
errs = errors.Append(errs, errors.Wrapf(err, "failed to delete external service repo (%d, %d)", svc.ID, id))
|
||||
} else {
|
||||
deleted = append(deleted, api.RepoID(id))
|
||||
}
|
||||
}
|
||||
|
||||
return deleted, errs.ErrorOrNil()
|
||||
return deleted, errs
|
||||
}
|
||||
|
||||
const listExternalServiceReposNotInQuery = `
|
||||
|
||||
@ -506,7 +506,7 @@ func (s *Syncer) SyncExternalService(
|
||||
|
||||
modified := false
|
||||
seen := make(map[api.RepoID]struct{})
|
||||
errs := new(errors.MultiError)
|
||||
var errs error
|
||||
fatal := func(err error) bool {
|
||||
return errcode.IsUnauthorized(err) ||
|
||||
errcode.IsForbidden(err) ||
|
||||
@ -520,7 +520,7 @@ func (s *Syncer) SyncExternalService(
|
||||
s.log().Error("syncer: error from codehost",
|
||||
"svc", svc.DisplayName, "id", svc.ID, "seen", len(seen), "error", err)
|
||||
|
||||
errors.Append(errs, errors.Wrapf(err, "fetching from code host %s", svc.DisplayName))
|
||||
errs = errors.Append(errs, errors.Wrapf(err, "fetching from code host %s", svc.DisplayName))
|
||||
|
||||
if fatal(err) {
|
||||
// Delete all external service repos of this external service
|
||||
@ -539,7 +539,7 @@ func (s *Syncer) SyncExternalService(
|
||||
var diff Diff
|
||||
if diff, err = s.sync(ctx, svc, sourced); err != nil {
|
||||
s.log().Error("failed to sync, skipping", "repo", sourced.Name, "err", err)
|
||||
errors.Append(errs, err)
|
||||
errs = errors.Append(errs, err)
|
||||
|
||||
// Stop syncing this external service as soon as we know repository limits for user or
|
||||
// site level has been exceeded. We want to avoid generating spurious errors here
|
||||
@ -567,7 +567,7 @@ func (s *Syncer) SyncExternalService(
|
||||
// Site-level external services can own lots of repos and are managed by site admins.
|
||||
// It's preferable to have them fix any invalidated token manually rather than deleting the repos automatically.
|
||||
deleted := 0
|
||||
if err = errs.ErrorOrNil(); err == nil || (!svc.IsSiteOwned() && fatal(err)) {
|
||||
if errs == nil || (!svc.IsSiteOwned() && fatal(errs)) {
|
||||
// Remove associations and any repos that are no longer associated with any
|
||||
// external service.
|
||||
//
|
||||
@ -581,7 +581,7 @@ func (s *Syncer) SyncExternalService(
|
||||
s.log().Warn("syncer: failed to delete some repos",
|
||||
"svc", svc.DisplayName, "id", svc.ID, "seen", len(seen), "error", deletedErr, "deleted", deleted)
|
||||
|
||||
errors.Append(errs, errors.Wrap(deletedErr, "some repos couldn't be deleted"))
|
||||
errs = errors.Append(errs, errors.Wrap(deletedErr, "some repos couldn't be deleted"))
|
||||
}
|
||||
|
||||
if deleted > 0 {
|
||||
@ -592,7 +592,7 @@ func (s *Syncer) SyncExternalService(
|
||||
|
||||
now := s.Now()
|
||||
modified = modified || deleted > 0
|
||||
interval := calcSyncInterval(now, svc.LastSyncAt, minSyncInterval, modified, errs.ErrorOrNil())
|
||||
interval := calcSyncInterval(now, svc.LastSyncAt, minSyncInterval, modified, errs)
|
||||
|
||||
s.log().Debug("Synced external service", "id", externalServiceID, "backoff duration", interval)
|
||||
svc.NextSyncAt = now.Add(interval)
|
||||
@ -600,10 +600,10 @@ func (s *Syncer) SyncExternalService(
|
||||
|
||||
err = s.Store.ExternalServiceStore.Upsert(ctx, svc)
|
||||
if err != nil {
|
||||
errors.Append(errs, errors.Wrap(err, "upserting external service"))
|
||||
errs = errors.Append(errs, errors.Wrap(err, "upserting external service"))
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
func (s *Syncer) userReposMaxPerSite() uint64 {
|
||||
|
||||
@ -1870,11 +1870,11 @@ func testAbortSyncWhenThereIsRepoLimitError(store *repos.Store) func(*testing.T)
|
||||
}
|
||||
|
||||
if err := syncer.SyncExternalService(ctx, svc.ID, 10*time.Second); err != nil {
|
||||
me, ok := err.(*errors.MultiError)
|
||||
if !ok {
|
||||
var me errors.MultiError
|
||||
if !errors.As(err, &me) {
|
||||
t.Fatalf("Expected error.MultiError, got: %T", err)
|
||||
}
|
||||
actualErr := me.Errors[0]
|
||||
actualErr := me.Errors()[0]
|
||||
|
||||
var r *repos.RepoLimitError
|
||||
|
||||
|
||||
@ -159,8 +159,8 @@ func (o *Observer) alertForNoResolvedRepos(ctx context.Context, q query.Q) *sear
|
||||
// multierrorToAlert converts an error.MultiError into the highest priority alert
|
||||
// for the errors contained in it, and a new error with all the errors that could
|
||||
// not be converted to alerts.
|
||||
func (o *Observer) multierrorToAlert(ctx context.Context, me *errors.MultiError) (resAlert *search.Alert, resErr error) {
|
||||
for _, err := range me.Errors {
|
||||
func (o *Observer) multierrorToAlert(ctx context.Context, me errors.MultiError) (resAlert *search.Alert, resErr error) {
|
||||
for _, err := range me.Errors() {
|
||||
alert, err := o.errorToAlert(ctx, err)
|
||||
resAlert = maxAlertByPriority(resAlert, alert)
|
||||
resErr = errors.Append(resErr, err)
|
||||
@ -218,7 +218,7 @@ func (o *Observer) errorToAlert(ctx context.Context, err error) (*search.Alert,
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var e *errors.MultiError
|
||||
var e errors.MultiError
|
||||
if errors.As(err, &e) {
|
||||
return o.multierrorToAlert(ctx, e)
|
||||
}
|
||||
|
||||
@ -19,22 +19,22 @@ import (
|
||||
func TestAlertForDiffCommitSearchLimits(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
multiErr *errors.MultiError
|
||||
multiErr error
|
||||
wantAlertDescription string
|
||||
}{
|
||||
{
|
||||
name: "diff_search_warns_on_repos_greater_than_search_limit",
|
||||
multiErr: errors.Append(&errors.MultiError{}, &commit.RepoLimitError{ResultType: "diff", Max: 50}),
|
||||
multiErr: errors.Append(nil, &commit.RepoLimitError{ResultType: "diff", Max: 50}),
|
||||
wantAlertDescription: `Diff search can currently only handle searching across 50 repositories at a time. Try using the "repo:" filter to narrow down which repositories to search, or using 'after:"1 week ago"'.`,
|
||||
},
|
||||
{
|
||||
name: "commit_search_warns_on_repos_greater_than_search_limit",
|
||||
multiErr: errors.Append(&errors.MultiError{}, &commit.RepoLimitError{ResultType: "commit", Max: 50}),
|
||||
multiErr: errors.Append(nil, &commit.RepoLimitError{ResultType: "commit", Max: 50}),
|
||||
wantAlertDescription: `Commit search can currently only handle searching across 50 repositories at a time. Try using the "repo:" filter to narrow down which repositories to search, or using 'after:"1 week ago"'.`,
|
||||
},
|
||||
{
|
||||
name: "commit_search_warns_on_repos_greater_than_search_limit_with_time_filter",
|
||||
multiErr: errors.Append(&errors.MultiError{}, &commit.TimeLimitError{ResultType: "commit", Max: 10000}),
|
||||
multiErr: errors.Append(nil, &commit.TimeLimitError{ResultType: "commit", Max: 10000}),
|
||||
wantAlertDescription: `Commit search can currently only handle searching across 10000 repositories at a time. Try using the "repo:" filter to narrow down which repositories to search.`,
|
||||
},
|
||||
}
|
||||
@ -70,10 +70,7 @@ func TestErrorToAlertStructuralSearch(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, test := range cases {
|
||||
multiErr := &errors.MultiError{
|
||||
Errors: test.errors,
|
||||
ErrorFormat: errors.ListFormatFunc,
|
||||
}
|
||||
multiErr := errors.Append(nil, test.errors...)
|
||||
haveAlert, _ := (&Observer{}).errorToAlert(context.Background(), multiErr)
|
||||
|
||||
if haveAlert != nil && haveAlert.Title != test.wantAlertTitle {
|
||||
|
||||
@ -116,11 +116,10 @@ func (s *HorizontalSearcher) StreamSearch(ctx context.Context, q query.Q, opts *
|
||||
|
||||
var errs errors.MultiError
|
||||
for i := 0; i < cap(ch); i++ {
|
||||
errors.Append(&errs, <-ch)
|
||||
errs = errors.Append(errs, <-ch)
|
||||
}
|
||||
|
||||
if err := errs.ErrorOrNil(); err != nil {
|
||||
return err
|
||||
if errs != nil {
|
||||
return errs
|
||||
}
|
||||
|
||||
resultQueue.FlushAll(streamer)
|
||||
|
||||
@ -65,7 +65,7 @@ func (r *PriorityJob) Run(ctx context.Context, db database.DB, s streaming.Sende
|
||||
return err
|
||||
})
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
if err := requiredGroup.Wait(); err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
@ -82,7 +82,7 @@ func (r *PriorityJob) Run(ctx context.Context, db database.DB, s streaming.Sende
|
||||
}
|
||||
tr.LazyPrintf("optional group completed")
|
||||
|
||||
return maxAlerter.Alert, errs.ErrorOrNil()
|
||||
return maxAlerter.Alert, errs
|
||||
}
|
||||
|
||||
// NewParallelJob will create a job that runs all its child jobs in separate
|
||||
@ -129,7 +129,7 @@ func (p *ParallelJob) Run(ctx context.Context, db database.DB, s streaming.Sende
|
||||
return err
|
||||
})
|
||||
}
|
||||
return maxAlerter.Alert, g.Wait().ErrorOrNil()
|
||||
return maxAlerter.Alert, g.Wait()
|
||||
}
|
||||
|
||||
// NewTimeoutJob creates a new job that is canceled after the
|
||||
|
||||
@ -71,12 +71,12 @@ func (a *AndJob) Run(ctx context.Context, db database.DB, stream streaming.Sende
|
||||
})
|
||||
}
|
||||
|
||||
err = g.Wait().ErrorOrNil()
|
||||
err = g.Wait()
|
||||
|
||||
if !sentResults.Load() && limitHit.Load() {
|
||||
maxAlerter.Add(search.AlertForCappedAndExpression())
|
||||
}
|
||||
return maxAlerter.Alert, g.Wait().ErrorOrNil()
|
||||
return maxAlerter.Alert, g.Wait()
|
||||
}
|
||||
|
||||
func (a *AndJob) Name() string {
|
||||
@ -161,7 +161,7 @@ func (j *OrJob) Run(ctx context.Context, db database.DB, stream streaming.Sender
|
||||
})
|
||||
}
|
||||
|
||||
err = g.Wait().ErrorOrNil()
|
||||
err = g.Wait()
|
||||
if err = errors.Ignore(err, errors.IsContextCanceled); err != nil {
|
||||
return maxAlerter.Alert, err
|
||||
}
|
||||
|
||||
@ -31,7 +31,7 @@ func (s *subRepoPermsFilterJob) Run(ctx context.Context, db database.DB, stream
|
||||
|
||||
var (
|
||||
mu sync.Mutex
|
||||
errs = &errors.MultiError{}
|
||||
errs error
|
||||
)
|
||||
|
||||
filteredStream := streaming.StreamFunc(func(event streaming.SearchEvent) {
|
||||
@ -49,7 +49,7 @@ func (s *subRepoPermsFilterJob) Run(ctx context.Context, db database.DB, stream
|
||||
if err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
return alert, errs.ErrorOrNil()
|
||||
return alert, errs
|
||||
}
|
||||
|
||||
func (s *subRepoPermsFilterJob) Name() string {
|
||||
@ -64,7 +64,7 @@ func applySubRepoFiltering(ctx context.Context, checker authz.SubRepoPermissionC
|
||||
}
|
||||
|
||||
a := actor.FromContext(ctx)
|
||||
errs := &errors.MultiError{}
|
||||
var errs error
|
||||
|
||||
// Filter matches in place
|
||||
filtered := matches[:0]
|
||||
@ -104,7 +104,7 @@ func applySubRepoFiltering(ctx context.Context, checker authz.SubRepoPermissionC
|
||||
|
||||
}
|
||||
|
||||
if errs.Len() == 0 {
|
||||
if errs == nil {
|
||||
return filtered, nil
|
||||
}
|
||||
|
||||
|
||||
@ -59,7 +59,7 @@ func With(enabled bool, step step) step {
|
||||
// `contextValue`.
|
||||
func SubstituteSearchContexts(lookupQueryString func(contextValue string) (string, error)) step {
|
||||
return func(nodes []Node) ([]Node, error) {
|
||||
errs := new(errors.MultiError)
|
||||
var errs error
|
||||
substitutedContext := MapField(nodes, FieldContext, func(value string, negated bool, ann Annotation) Node {
|
||||
queryString, err := lookupQueryString(value)
|
||||
if err != nil {
|
||||
@ -84,7 +84,7 @@ func SubstituteSearchContexts(lookupQueryString func(contextValue string) (strin
|
||||
return Operator{Kind: And, Operands: query}
|
||||
})
|
||||
|
||||
return substitutedContext, errs.ErrorOrNil()
|
||||
return substitutedContext, errs
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -77,7 +77,7 @@ func (r *Resolver) Paginate(ctx context.Context, op *search.RepoOptions, handle
|
||||
opts.Limit = 500
|
||||
}
|
||||
|
||||
errs := new(errors.MultiError)
|
||||
var errs error
|
||||
|
||||
for {
|
||||
page, err := r.Resolve(ctx, opts)
|
||||
@ -101,7 +101,7 @@ func (r *Resolver) Paginate(ctx context.Context, op *search.RepoOptions, handle
|
||||
opts.Cursors = page.Next
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
func (r *Resolver) Resolve(ctx context.Context, op search.RepoOptions) (Resolved, error) {
|
||||
@ -335,7 +335,7 @@ func (r *Resolver) Resolve(ctx context.Context, op search.RepoOptions) (Resolved
|
||||
if hasCommitAfter, err := git.HasCommitAfter(ctx, repoRev.Repo.Name, op.CommitAfter, string(commitID), authz.DefaultSubRepoPermsChecker); err != nil {
|
||||
if !errors.HasType(err, &gitdomain.RevisionNotFoundError{}) && !gitdomain.IsRepoNotExist(err) {
|
||||
res.Lock()
|
||||
errors.Append(&res.MultiError, err)
|
||||
res.MultiError = errors.Append(res.MultiError, err)
|
||||
res.Unlock()
|
||||
}
|
||||
continue
|
||||
@ -372,7 +372,7 @@ func (r *Resolver) Resolve(ctx context.Context, op search.RepoOptions) (Resolved
|
||||
|
||||
tr.LazyPrintf("Associate/validate revs - done")
|
||||
|
||||
err = res.ErrorOrNil()
|
||||
err = res.MultiError
|
||||
if len(res.MissingRepoRevs) > 0 {
|
||||
err = errors.Append(err, &MissingRepoRevsError{Missing: res.MissingRepoRevs})
|
||||
}
|
||||
|
||||
@ -202,7 +202,7 @@ func validateSearchContextQuery(contextQuery string) error {
|
||||
}
|
||||
|
||||
q := plan.ToParseTree()
|
||||
errs := new(errors.MultiError)
|
||||
var errs error
|
||||
|
||||
query.VisitParameter(q, func(field, value string, negated bool, a query.Annotation) {
|
||||
switch field {
|
||||
@ -250,7 +250,7 @@ func validateSearchContextQuery(contextQuery string) error {
|
||||
}
|
||||
})
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
func validateSearchContextDoesNotExist(ctx context.Context, db dbutil.DB, searchContext *types.SearchContext) error {
|
||||
|
||||
@ -4,7 +4,7 @@ import (
|
||||
"net/http"
|
||||
"runtime/debug"
|
||||
|
||||
"github.com/cockroachdb/sentry-go"
|
||||
"github.com/getsentry/sentry-go"
|
||||
"github.com/inconshreveable/log15"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/internal/conf/conftypes"
|
||||
|
||||
@ -8,7 +8,7 @@ import (
|
||||
"strconv"
|
||||
|
||||
"github.com/cockroachdb/redact"
|
||||
"github.com/cockroachdb/sentry-go"
|
||||
"github.com/getsentry/sentry-go"
|
||||
"github.com/inconshreveable/log15"
|
||||
|
||||
"github.com/sourcegraph/sourcegraph/internal/conf/conftypes"
|
||||
|
||||
@ -141,11 +141,11 @@ func ParseBatchSpec(data []byte, opts ParseBatchSpecOptions) (*BatchSpec, error)
|
||||
func parseBatchSpec(schema string, data []byte, opts ParseBatchSpecOptions) (*BatchSpec, error) {
|
||||
var spec BatchSpec
|
||||
if err := yaml.UnmarshalValidate(schema, data, &spec); err != nil {
|
||||
var multiErr *errors.MultiError
|
||||
var multiErr errors.MultiError
|
||||
if errors.As(err, &multiErr) {
|
||||
var newMultiError *errors.MultiError
|
||||
var newMultiError error
|
||||
|
||||
for _, e := range multiErr.Errors {
|
||||
for _, e := range multiErr.Errors() {
|
||||
// In case of `name` we try to make the error message more user-friendly.
|
||||
if strings.Contains(e.Error(), "name: Does not match pattern") {
|
||||
newMultiError = errors.Append(newMultiError, NewValidationError(errors.Newf("The batch change name can only contain word characters, dots and dashes. No whitespace or newlines allowed.")))
|
||||
@ -154,13 +154,13 @@ func parseBatchSpec(schema string, data []byte, opts ParseBatchSpecOptions) (*Ba
|
||||
}
|
||||
}
|
||||
|
||||
return nil, newMultiError.ErrorOrNil()
|
||||
return nil, newMultiError
|
||||
}
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
|
||||
if !opts.AllowArrayEnvironments {
|
||||
for i, step := range spec.Steps {
|
||||
@ -193,7 +193,7 @@ func parseBatchSpec(schema string, data []byte, opts ParseBatchSpecOptions) (*Ba
|
||||
}
|
||||
}
|
||||
|
||||
return &spec, errs.ErrorOrNil()
|
||||
return &spec, errs
|
||||
}
|
||||
|
||||
func (on *OnQueryOrRepository) String() string {
|
||||
|
||||
@ -50,10 +50,7 @@ steps:
|
||||
t.Fatal("no error returned")
|
||||
}
|
||||
|
||||
wantErr := `1 error occurred:
|
||||
* batch spec includes steps but no changesetTemplate
|
||||
|
||||
`
|
||||
wantErr := `batch spec includes steps but no changesetTemplate`
|
||||
haveErr := err.Error()
|
||||
if haveErr != wantErr {
|
||||
t.Fatalf("wrong error. want=%q, have=%q", wantErr, haveErr)
|
||||
@ -85,10 +82,7 @@ changesetTemplate:
|
||||
|
||||
// We expect this error to be user-friendly, which is why we test for
|
||||
// it specifically here.
|
||||
wantErr := `1 error occurred:
|
||||
* The batch change name can only contain word characters, dots and dashes. No whitespace or newlines allowed.
|
||||
|
||||
`
|
||||
wantErr := `The batch change name can only contain word characters, dots and dashes. No whitespace or newlines allowed.`
|
||||
haveErr := err.Error()
|
||||
if haveErr != wantErr {
|
||||
t.Fatalf("wrong error. want=%q, have=%q", wantErr, haveErr)
|
||||
@ -120,10 +114,7 @@ changesetTemplate:
|
||||
t.Fatal("no error returned")
|
||||
}
|
||||
|
||||
wantErr := `1 error occurred:
|
||||
* step 1 in batch spec uses the 'if' attribute for conditional execution, which is not supported in this Sourcegraph version
|
||||
|
||||
`
|
||||
wantErr := `step 1 in batch spec uses the 'if' attribute for conditional execution, which is not supported in this Sourcegraph version`
|
||||
haveErr := err.Error()
|
||||
if haveErr != wantErr {
|
||||
t.Fatalf("wrong error. want=%q, have=%q", wantErr, haveErr)
|
||||
@ -202,9 +193,7 @@ changesetTemplate:
|
||||
wantErr := `3 errors occurred:
|
||||
* on.0: Must validate one and only one schema (oneOf)
|
||||
* on.0: Must validate at least one schema (anyOf)
|
||||
* on.0: Must validate one and only one schema (oneOf)
|
||||
|
||||
`
|
||||
* on.0: Must validate one and only one schema (oneOf)`
|
||||
haveErr := err.Error()
|
||||
if haveErr != wantErr {
|
||||
t.Fatalf("wrong error. want=%q, have=%q", wantErr, haveErr)
|
||||
|
||||
@ -54,14 +54,14 @@ func TestParseChangesetSpec(t *testing.T) {
|
||||
"authorEmail": "mary@example.com"
|
||||
}]
|
||||
}`,
|
||||
err: "4 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* baseRev is required\n\t* body is required\n\t* commits.0: message is required\n\n",
|
||||
err: "4 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* baseRev is required\n\t* body is required\n\t* commits.0: message is required",
|
||||
},
|
||||
{
|
||||
name: "missing fields in ExistingChangesetReference",
|
||||
rawSpec: `{
|
||||
"baseRepository": "graphql-id"
|
||||
}`,
|
||||
err: "2 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* externalID is required\n\n",
|
||||
err: "2 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* externalID is required",
|
||||
},
|
||||
{
|
||||
name: "headRepository in GitBranchChangesetDescription does not match baseRepository",
|
||||
@ -109,7 +109,7 @@ func TestParseChangesetSpec(t *testing.T) {
|
||||
}
|
||||
]
|
||||
}`,
|
||||
err: "2 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* commits: Array must have at most 1 items\n\n",
|
||||
err: "2 errors occurred:\n\t* Must validate one and only one schema (oneOf)\n\t* commits: Array must have at most 1 items",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -11,7 +11,7 @@ import (
|
||||
// If the validation is successful the validated input is unmarshalled into the
|
||||
// target.
|
||||
func UnmarshalValidate(schema string, input []byte, target interface{}) error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
if err := jsonschema.Validate(schema, input); err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
@ -20,5 +20,5 @@ func UnmarshalValidate(schema string, input []byte, target interface{}) error {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ func Validate(schema string, input []byte) error {
|
||||
return errors.Wrap(err, "failed to validate input against schema")
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
for _, err := range res.Errors() {
|
||||
e := err.String()
|
||||
// Remove `(root): ` from error formatting since these errors are
|
||||
@ -32,5 +32,5 @@ func Validate(schema string, input []byte) error {
|
||||
errs = errors.Append(errs, errors.New(e))
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@ func UnmarshalValidate(schema string, input []byte, target interface{}) error {
|
||||
return errors.Wrapf(err, "failed to normalize JSON")
|
||||
}
|
||||
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
if err := jsonschema.Validate(schema, normalized); err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
@ -29,5 +29,5 @@ func UnmarshalValidate(schema string, input []byte, target interface{}) error {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -1,6 +1,10 @@
|
||||
package errors
|
||||
|
||||
import "github.com/cockroachdb/errors"
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/cockroachdb/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
New = errors.New
|
||||
@ -19,7 +23,37 @@ var (
|
||||
BuildSentryReport = errors.BuildSentryReport
|
||||
Safe = errors.Safe
|
||||
IsAny = errors.IsAny
|
||||
|
||||
// TODO - unify with hashicorp/go-multierror
|
||||
CombineErrors = errors.CombineErrors
|
||||
)
|
||||
|
||||
// Extend multiError to work with cockroachdb errors. Implement here to keep imports in
|
||||
// one place.
|
||||
|
||||
var _ fmt.Formatter = (*multiError)(nil)
|
||||
|
||||
func (e *multiError) Format(s fmt.State, verb rune) { errors.FormatError(e, s, verb) }
|
||||
|
||||
var _ errors.Formatter = (*multiError)(nil)
|
||||
|
||||
func (e *multiError) FormatError(p errors.Printer) error {
|
||||
if len(e.errs) > 1 {
|
||||
p.Printf("%d errors occurred:", len(e.errs))
|
||||
}
|
||||
|
||||
// Simple output
|
||||
for _, err := range e.errs {
|
||||
if len(e.errs) > 1 {
|
||||
p.Print("\n\t* ")
|
||||
}
|
||||
p.Printf("%v", err)
|
||||
}
|
||||
|
||||
// Print additional details
|
||||
if p.Detail() {
|
||||
p.Print("-- details follow")
|
||||
for i, err := range e.errs {
|
||||
p.Printf("\n(%d) %+v", i+1, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
108
lib/errors/errors.go
Normal file
108
lib/errors/errors.go
Normal file
@ -0,0 +1,108 @@
|
||||
package errors
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// MultiError is a container for groups of errors.
|
||||
type MultiError interface {
|
||||
error
|
||||
// Errors returns all errors carried by this MultiError, or an empty slice otherwise.
|
||||
Errors() []error
|
||||
}
|
||||
|
||||
// multiError is our default underlying implementation for MultiError. It is compatible
|
||||
// with cockroachdb.Error's formatting, printing, etc. and supports introspecting via
|
||||
// As, Is, and friends.
|
||||
//
|
||||
// Implementation is based on https://github.com/knz/shakespeare/blob/master/pkg/cmd/errors.go
|
||||
type multiError struct {
|
||||
errs []error
|
||||
}
|
||||
|
||||
var _ error = (*multiError)(nil)
|
||||
var _ MultiError = (*multiError)(nil)
|
||||
|
||||
func combineNonNilErrors(err1 error, err2 error) MultiError {
|
||||
multi1, ok1 := err1.(MultiError)
|
||||
multi2, ok2 := err2.(MultiError)
|
||||
// flatten
|
||||
var errs []error
|
||||
if ok1 && ok2 {
|
||||
errs = append(multi1.Errors(), multi2.Errors()...)
|
||||
} else if ok1 {
|
||||
errs = append(multi1.Errors(), err2)
|
||||
} else if ok2 {
|
||||
errs = append([]error{err1}, multi2.Errors()...)
|
||||
} else {
|
||||
errs = []error{err1, err2}
|
||||
}
|
||||
return &multiError{errs: errs}
|
||||
}
|
||||
|
||||
// CombineErrors returns a MultiError from err1 and err2. If both are nil, nil is returned.
|
||||
func CombineErrors(err1, err2 error) MultiError {
|
||||
if err1 == nil && err2 == nil {
|
||||
return nil
|
||||
}
|
||||
if err1 == nil {
|
||||
if multi, ok := err2.(MultiError); ok {
|
||||
return multi
|
||||
}
|
||||
return &multiError{errs: []error{err2}}
|
||||
} else if err2 == nil {
|
||||
if multi, ok := err1.(MultiError); ok {
|
||||
return multi
|
||||
}
|
||||
return &multiError{errs: []error{err1}}
|
||||
}
|
||||
return combineNonNilErrors(err1, err2)
|
||||
}
|
||||
|
||||
// Append returns a MultiError created from all given errors, skipping errs that are nil.
|
||||
// If no non-nil errors are provided, nil is returned.
|
||||
func Append(err error, errs ...error) MultiError {
|
||||
multi := CombineErrors(err, nil)
|
||||
for _, e := range errs {
|
||||
if e != nil {
|
||||
multi = CombineErrors(multi, e)
|
||||
}
|
||||
}
|
||||
return multi
|
||||
}
|
||||
|
||||
func (e *multiError) Error() string { return fmt.Sprintf("%v", e) }
|
||||
func (e *multiError) Errors() []error {
|
||||
if e == nil || e.errs == nil {
|
||||
return nil
|
||||
}
|
||||
return e.errs
|
||||
}
|
||||
|
||||
func (e *multiError) Cause() error { return e.errs[len(e.errs)-1] }
|
||||
func (e *multiError) Unwrap() error { return e.errs[len(e.errs)-1] }
|
||||
|
||||
func (e *multiError) Is(refError error) bool {
|
||||
if e == refError {
|
||||
return true
|
||||
}
|
||||
for _, err := range e.errs {
|
||||
if Is(err, refError) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (e *multiError) As(target interface{}) bool {
|
||||
if m, ok := target.(*multiError); ok {
|
||||
*m = *e
|
||||
return true
|
||||
}
|
||||
for _, err := range e.errs {
|
||||
if As(err, target) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
187
lib/errors/errors_test.go
Normal file
187
lib/errors/errors_test.go
Normal file
@ -0,0 +1,187 @@
|
||||
package errors
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
type errBazType struct{}
|
||||
|
||||
func (e *errBazType) Error() string { return "baz" }
|
||||
|
||||
type errZooType struct{}
|
||||
|
||||
func (e *errZooType) Error() string { return "zoo" }
|
||||
|
||||
// Enforce some invariants with our error libraries.
|
||||
|
||||
func TestMultiError(t *testing.T) {
|
||||
errFoo := New("foo")
|
||||
errBar := New("bar")
|
||||
// Tests using errBaz also make a As test
|
||||
errBaz := &errBazType{}
|
||||
// Tests using errZoo also make a As test
|
||||
errZoo := &errZooType{}
|
||||
formattingDirectives := []string{"", "%s", "%v", "%+v"}
|
||||
tests := []struct {
|
||||
name string
|
||||
err error
|
||||
// Make sure all our ways of combining errors actually print them.
|
||||
wantStrings []string
|
||||
// Make sure all our ways of combining errors retains our ability to assert
|
||||
// against them.
|
||||
wantIs []error
|
||||
}{
|
||||
{
|
||||
name: "Append",
|
||||
err: Append(errFoo, errBar),
|
||||
wantStrings: []string{"foo", "bar"},
|
||||
wantIs: []error{errFoo, errBar},
|
||||
},
|
||||
{
|
||||
name: "CombineErrors",
|
||||
err: CombineErrors(errFoo, errZoo),
|
||||
wantStrings: []string{"foo", "zoo"},
|
||||
wantIs: []error{errFoo, errZoo},
|
||||
},
|
||||
{
|
||||
name: "Wrap(Append)",
|
||||
err: Wrap(Append(errFoo, errBar), "hello world"),
|
||||
wantStrings: []string{"hello world", "foo", "bar"},
|
||||
wantIs: []error{errFoo, errBar},
|
||||
},
|
||||
{
|
||||
name: "Wrap(Wrap(Append))",
|
||||
err: Wrap(Wrap(Append(errFoo, errZoo), "hello world"), "deep!"),
|
||||
wantStrings: []string{"deep", "hello world", "foo", "zoo"},
|
||||
wantIs: []error{errFoo, errZoo},
|
||||
},
|
||||
{
|
||||
name: "Append(Wrap(Append))",
|
||||
err: Append(Wrap(Append(errFoo, errBar), "hello world"), errZoo),
|
||||
wantStrings: []string{"hello world", "foo", "bar"},
|
||||
wantIs: []error{errFoo, errBar, errZoo},
|
||||
},
|
||||
{
|
||||
name: "Append(Append(Append(Append)))",
|
||||
err: Append(Append(Append(errFoo, errBar), errBaz), errZoo),
|
||||
wantStrings: []string{"zoo", "baz", "foo", "bar"},
|
||||
wantIs: []error{errFoo, errBar, errBaz, errZoo},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
for _, directive := range formattingDirectives {
|
||||
var str string
|
||||
if directive == "" {
|
||||
str = tt.err.Error()
|
||||
} else {
|
||||
str = fmt.Sprintf(directive, tt.err)
|
||||
}
|
||||
|
||||
if directive == "" || directive == "%+v" {
|
||||
// Run tests with -v to see what the error output looks like
|
||||
t.Log(str)
|
||||
}
|
||||
|
||||
for _, contains := range tt.wantStrings {
|
||||
assert.Contains(t, str, contains)
|
||||
}
|
||||
}
|
||||
for _, isErr := range tt.wantIs {
|
||||
assert.ErrorIs(t, tt.err, isErr)
|
||||
if isErr.Error() == "baz" {
|
||||
var errBaz *errBazType
|
||||
assert.ErrorAs(t, tt.err, &errBaz, "Want "+isErr.Error())
|
||||
}
|
||||
if isErr.Error() == "zoo" {
|
||||
var errZoo *errZooType
|
||||
assert.ErrorAs(t, tt.err, &errZoo, "Want "+isErr.Error())
|
||||
}
|
||||
}
|
||||
// We always want to be able to extract a MultiError from this error, because
|
||||
// all the test cases test appends. We don't assert against its contents, but
|
||||
// to see how we unwrap errors you can add:
|
||||
//
|
||||
// t.Log("Extracted multi-error:\n", multi.Error())
|
||||
//
|
||||
var multi MultiError
|
||||
assert.ErrorAs(t, tt.err, &multi)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCombineNil(t *testing.T) {
|
||||
assert.Nil(t, Append(nil, nil))
|
||||
assert.Nil(t, CombineErrors(nil, nil))
|
||||
}
|
||||
|
||||
func TestCombineSingle(t *testing.T) {
|
||||
errFoo := New("foo")
|
||||
|
||||
assert.ErrorIs(t, Append(errFoo, nil), errFoo)
|
||||
assert.ErrorIs(t, CombineErrors(errFoo, nil), errFoo)
|
||||
assert.ErrorIs(t, Append(nil, errFoo), errFoo)
|
||||
assert.ErrorIs(t, CombineErrors(nil, errFoo), errFoo)
|
||||
}
|
||||
|
||||
// TestRepeatedCombine tests the most common patterns of instantiate + append
|
||||
func TestRepeatedCombine(t *testing.T) {
|
||||
t.Run("mixed append with typed nil", func(t *testing.T) {
|
||||
var errs MultiError
|
||||
for i := 1; i < 10; i++ {
|
||||
if i%2 == 0 {
|
||||
errs = Append(errs, New(strconv.Itoa(i)))
|
||||
} else {
|
||||
errs = Append(errs, nil)
|
||||
}
|
||||
}
|
||||
assert.NotNil(t, errs)
|
||||
assert.Equal(t, 4, len(errs.Errors()))
|
||||
assert.Equal(t, `4 errors occurred:
|
||||
* 2
|
||||
* 4
|
||||
* 6
|
||||
* 8`, errs.Error())
|
||||
})
|
||||
t.Run("mixed append with untyped nil", func(t *testing.T) {
|
||||
var errs error
|
||||
for i := 1; i < 10; i++ {
|
||||
if i%2 == 0 {
|
||||
errs = Append(errs, New(strconv.Itoa(i)))
|
||||
} else {
|
||||
errs = Append(errs, nil)
|
||||
}
|
||||
}
|
||||
assert.NotNil(t, errs)
|
||||
assert.Equal(t, `4 errors occurred:
|
||||
* 2
|
||||
* 4
|
||||
* 6
|
||||
* 8`, errs.Error())
|
||||
// try casting
|
||||
var multi MultiError
|
||||
assert.True(t, As(errs, &multi))
|
||||
assert.Equal(t, 4, len(multi.Errors()))
|
||||
})
|
||||
t.Run("all nil append with typed nil", func(t *testing.T) {
|
||||
var errs MultiError
|
||||
for i := 1; i < 10; i++ {
|
||||
errs = Append(errs, nil)
|
||||
}
|
||||
assert.Nil(t, errs)
|
||||
})
|
||||
t.Run("all nil append with untyped nil", func(t *testing.T) {
|
||||
var errs error
|
||||
for i := 1; i < 10; i++ {
|
||||
errs = Append(errs, nil)
|
||||
}
|
||||
assert.Nil(t, errs)
|
||||
// try casting
|
||||
var multi MultiError
|
||||
assert.False(t, As(errs, &multi))
|
||||
})
|
||||
}
|
||||
@ -11,10 +11,10 @@ import (
|
||||
func Ignore(err error, pred ErrorPredicate) error {
|
||||
// If the error (or any wrapped error) is a multierror,
|
||||
// filter its children.
|
||||
var multi *MultiError
|
||||
var multi *multiError
|
||||
if As(err, &multi) {
|
||||
filtered := multi.Errors[:0]
|
||||
for _, childErr := range multi.Errors {
|
||||
filtered := multi.errs[:0]
|
||||
for _, childErr := range multi.errs {
|
||||
if ignored := Ignore(childErr, pred); ignored != nil {
|
||||
filtered = append(filtered, ignored)
|
||||
}
|
||||
@ -22,7 +22,7 @@ func Ignore(err error, pred ErrorPredicate) error {
|
||||
if len(filtered) == 0 {
|
||||
return nil
|
||||
}
|
||||
multi.Errors = filtered
|
||||
multi.errs = filtered
|
||||
return err
|
||||
}
|
||||
|
||||
|
||||
40
lib/errors/group.go
Normal file
40
lib/errors/group.go
Normal file
@ -0,0 +1,40 @@
|
||||
package errors
|
||||
|
||||
import "sync"
|
||||
|
||||
// Group is a collection of goroutines which return errors that need to be
|
||||
// coalesced.
|
||||
//
|
||||
// Implementation and tests are based on https://sourcegraph.com/github.com/hashicorp/go-multierror/-/blob/group.go
|
||||
type Group struct {
|
||||
mutex sync.Mutex
|
||||
err MultiError
|
||||
wg sync.WaitGroup
|
||||
}
|
||||
|
||||
// Go calls the given function in a new goroutine.
|
||||
//
|
||||
// If the function returns an error it is added to the group multierror which
|
||||
// is returned by Wait.
|
||||
func (g *Group) Go(f func() error) {
|
||||
g.wg.Add(1)
|
||||
|
||||
go func() {
|
||||
defer g.wg.Done()
|
||||
|
||||
if err := f(); err != nil {
|
||||
g.mutex.Lock()
|
||||
g.err = CombineErrors(g.err, err)
|
||||
g.mutex.Unlock()
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// Wait blocks until all function calls from the Go method have returned, then
|
||||
// returns the multierror.
|
||||
func (g *Group) Wait() MultiError {
|
||||
g.wg.Wait()
|
||||
g.mutex.Lock()
|
||||
defer g.mutex.Unlock()
|
||||
return g.err
|
||||
}
|
||||
43
lib/errors/group_test.go
Normal file
43
lib/errors/group_test.go
Normal file
@ -0,0 +1,43 @@
|
||||
package errors
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGroup(t *testing.T) {
|
||||
err1 := New("group_test: 1")
|
||||
err2 := New("group_test: 2")
|
||||
|
||||
cases := []struct {
|
||||
errs []error
|
||||
nilResult bool
|
||||
}{
|
||||
{errs: []error{}, nilResult: true},
|
||||
{errs: []error{nil}, nilResult: true},
|
||||
{errs: []error{err1}},
|
||||
{errs: []error{err1, nil}},
|
||||
{errs: []error{err1, nil, err2}},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
var g Group
|
||||
|
||||
for _, err := range tc.errs {
|
||||
err := err
|
||||
g.Go(func() error { return err })
|
||||
|
||||
}
|
||||
|
||||
gErr := g.Wait()
|
||||
if gErr != nil {
|
||||
for i := range tc.errs {
|
||||
if tc.errs[i] != nil && !strings.Contains(gErr.Error(), tc.errs[i].Error()) {
|
||||
t.Fatalf("expected error to contain %q, actual: %v", tc.errs[i].Error(), gErr)
|
||||
}
|
||||
}
|
||||
} else if !tc.nilResult {
|
||||
t.Fatalf("Group.Wait() should not have returned nil for errs: %v", tc.errs)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
package errors
|
||||
|
||||
import "github.com/hashicorp/go-multierror"
|
||||
|
||||
type (
|
||||
MultiError = multierror.Error
|
||||
Group = multierror.Group
|
||||
)
|
||||
|
||||
var (
|
||||
Append = multierror.Append
|
||||
ListFormatFunc = multierror.ListFormatFunc
|
||||
)
|
||||
@ -5,9 +5,7 @@ go 1.16
|
||||
require (
|
||||
github.com/alecthomas/kingpin v2.2.6+incompatible
|
||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
||||
github.com/cockroachdb/errors v1.8.6
|
||||
github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f // indirect
|
||||
github.com/cockroachdb/redact v1.1.3 // indirect
|
||||
github.com/cockroachdb/errors v1.8.9
|
||||
github.com/derision-test/go-mockgen v1.1.2
|
||||
github.com/fatih/color v1.13.0
|
||||
github.com/ghodss/yaml v1.0.0
|
||||
@ -15,8 +13,6 @@ require (
|
||||
github.com/gobwas/glob v0.2.3
|
||||
github.com/google/go-cmp v0.5.7
|
||||
github.com/grafana/regexp v0.0.0-20220202152701-6a046c4caf32
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1
|
||||
github.com/hexops/autogold v1.3.0
|
||||
github.com/hexops/gotextdiff v1.0.3
|
||||
github.com/hexops/valast v1.4.1 // indirect
|
||||
@ -36,7 +32,7 @@ require (
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||
github.com/xeipuuv/gojsonschema v1.2.0
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158
|
||||
golang.org/x/tools v0.1.9 // indirect
|
||||
google.golang.org/protobuf v1.27.1
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
|
||||
61
lib/go.sum
61
lib/go.sum
@ -4,7 +4,9 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl
|
||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw=
|
||||
github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno=
|
||||
github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w=
|
||||
github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo=
|
||||
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
|
||||
github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM=
|
||||
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
|
||||
@ -22,17 +24,17 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4=
|
||||
github.com/cockroachdb/datadriven v1.0.1-0.20211007161720-b558070c3be0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4=
|
||||
github.com/cockroachdb/datadriven v1.0.1-0.20220214170620-9913f5bc19b7/go.mod h1:hi0MtSY3AYDQNDi83kDkMH5/yqM/CsIrsOITkSoH7KI=
|
||||
github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM=
|
||||
github.com/cockroachdb/errors v1.8.6 h1:Am9evxl/po3RzpokemQvq7S7Cd0mxv24xy0B/trlQF4=
|
||||
github.com/cockroachdb/errors v1.8.6/go.mod h1:hOm5fabihW+xEyY1kuypGwqT+Vt7rafg04ytBtIpeIQ=
|
||||
github.com/cockroachdb/errors v1.8.8/go.mod h1:z6VnEL3hZ/2ONZEvG7S5Ym0bU2AqPcEKnIiA1wbsSu0=
|
||||
github.com/cockroachdb/errors v1.8.9 h1:eqUxTOUOduHP4D3f3wJ0kiyoNjDf6wLCso/4n7rBA4U=
|
||||
github.com/cockroachdb/errors v1.8.9/go.mod h1:vaNcEYYqbIqB5JhKBhFV9CneUqeuEbB2OYJBK4GBNYQ=
|
||||
github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
|
||||
github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f h1:6jduT9Hfc0njg5jJ1DdKCFPdMBrp/mdZfCpa5h+WM74=
|
||||
github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
|
||||
github.com/cockroachdb/redact v1.1.1/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=
|
||||
github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM=
|
||||
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ=
|
||||
github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
@ -71,6 +73,8 @@ github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc=
|
||||
github.com/getsentry/sentry-go v0.12.0 h1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk=
|
||||
github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c=
|
||||
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
|
||||
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
|
||||
github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
|
||||
@ -92,6 +96,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
@ -124,13 +129,9 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grafana/regexp v0.0.0-20220202152701-6a046c4caf32 h1:M3wP8Hwic62qJsiydSgXtev03d4f92uN1I52nVjRgw0=
|
||||
github.com/grafana/regexp v0.0.0-20220202152701-6a046c4caf32/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/hexops/autogold v0.8.1/go.mod h1:97HLDXyG23akzAoRYJh/2OBs3kd80eHyKPvZw0S5ZBY=
|
||||
@ -151,8 +152,11 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
|
||||
github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI=
|
||||
github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0=
|
||||
github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI=
|
||||
github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk=
|
||||
github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g=
|
||||
github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||
@ -161,21 +165,26 @@ github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVE
|
||||
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
|
||||
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
||||
github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk=
|
||||
github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8=
|
||||
github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U=
|
||||
github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE=
|
||||
github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw=
|
||||
github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE=
|
||||
github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0=
|
||||
github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro=
|
||||
github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8=
|
||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.14.2 h1:S0OHlFk/Gbon/yauFJ4FfJJF5V0fc5HbBTJazi28pRw=
|
||||
github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE=
|
||||
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
@ -183,10 +192,13 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
|
||||
github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y=
|
||||
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
@ -200,6 +212,7 @@ github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh
|
||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
|
||||
github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg=
|
||||
github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ=
|
||||
github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
|
||||
github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc=
|
||||
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
|
||||
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
||||
@ -214,18 +227,23 @@ github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6U
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
|
||||
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
|
||||
github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM=
|
||||
github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
|
||||
github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4=
|
||||
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/nightlyone/lockfile v1.0.0 h1:RHep2cFKK4PonZJDdEl4GmkabuhbsRMgk/k3uAmxBiA=
|
||||
github.com/nightlyone/lockfile v1.0.0/go.mod h1:rywoIealpdNse2r832aiD9jRk8ErCatROs6LzC841CI=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
|
||||
github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
|
||||
@ -251,7 +269,9 @@ github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XF
|
||||
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g=
|
||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
|
||||
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
|
||||
@ -282,11 +302,14 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||
github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
||||
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
|
||||
@ -308,7 +331,10 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
@ -333,12 +359,15 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@ -370,18 +399,21 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210218084038-e8e29180ff58/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210611083646-a4fc73990273/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211102192858-4dd72447c267/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
@ -389,6 +421,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
@ -452,6 +485,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
|
||||
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
|
||||
gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
@ -459,6 +493,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
||||
@ -10,7 +10,7 @@ import (
|
||||
|
||||
func init() {
|
||||
newOutputPlatformQuirks = func(o *Output) error {
|
||||
var errs *errors.MultiError
|
||||
var errs error
|
||||
|
||||
if err := setConsoleMode(windows.Stdout, windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil {
|
||||
errs = errors.Append(errs, err)
|
||||
@ -19,7 +19,7 @@ func init() {
|
||||
errs = errors.Append(errs, err)
|
||||
}
|
||||
|
||||
return errs.ErrorOrNil()
|
||||
return errs
|
||||
}
|
||||
|
||||
// Windows doesn't have a particularly good way of notifying console
|
||||
|
||||
Loading…
Reference in New Issue
Block a user