Skip to content

Commit deb4860

Browse files
authoredNov 6, 2023
Merge pull request #730 from LandonTClipp/issue_726
Fix config bug where mockery crashes when package map is nil
2 parents 726d76c + b648c23 commit deb4860

File tree

7 files changed

+239
-64
lines changed

7 files changed

+239
-64
lines changed
 

‎Taskfile.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ tasks:
5252

5353
test:
5454
cmds:
55-
- go test -v -coverprofile=coverage.txt ./...
55+
- go run gotest.tools/gotestsum --format testname -- -v -coverprofile=coverage.txt ./...
5656
desc: run unit tests
5757
sources:
5858
- "**/*.go"

‎cmd/showconfig.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ func showConfig(
3737
if err != nil {
3838
return stackerr.NewStackErrf(err, "failed to unmarshal config")
3939
}
40+
log, err := logging.GetLogger(config.LogLevel)
41+
if err != nil {
42+
return fmt.Errorf("getting logger: %w", err)
43+
}
44+
ctx = log.WithContext(ctx)
4045
if err := config.Initialize(ctx); err != nil {
4146
return err
4247
}
@@ -48,10 +53,7 @@ func showConfig(
4853
if err != nil {
4954
return stackerr.NewStackErrf(err, "failed to marshal yaml")
5055
}
51-
log, err := logging.GetLogger(config.LogLevel)
52-
if err != nil {
53-
panic(err)
54-
}
56+
5557
log.Info().Msgf("Using config: %s", config.Config)
5658

5759
fmt.Fprintf(outputter, "%s", string(out))

‎pkg/config/config.go

+114-37
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,14 @@ func (c *Config) GetPackages(ctx context.Context) ([]string, error) {
195195
return packageList, nil
196196
}
197197

198+
// getPackageConfigMap returns the map for the particular package, which includes
199+
// (but is not limited to) both the `configs` section and the `interfaces` section.
200+
// Note this does NOT return the `configs` section for the package. It returns the
201+
// entire mapping for the package.
198202
func (c *Config) getPackageConfigMap(ctx context.Context, packageName string) (map[string]any, error) {
203+
log := zerolog.Ctx(ctx)
204+
log.Trace().Msg("getting package config map")
205+
199206
cfgMap, err := c.CfgAsMap(ctx)
200207
if err != nil {
201208
return nil, err
@@ -207,13 +214,27 @@ func (c *Config) getPackageConfigMap(ctx context.Context, packageName string) (m
207214
}
208215
configAsMap, isMap := configUnmerged.(map[string]any)
209216
if isMap {
217+
log.Trace().Msg("package's value is a map, returning")
210218
return configAsMap, nil
211219
}
212-
return map[string]any{}, nil
220+
log.Trace().Msg("package's value is not a map")
221+
222+
// Package is something other than map, so set its value to an
223+
// empty map.
224+
emptyMap := map[string]any{}
225+
packageSection[packageName] = emptyMap
226+
return emptyMap, nil
213227

214228
}
229+
230+
// GetPackageConfig returns a struct representation of the package's config
231+
// as provided in yaml. If the package did not specify a config section,
232+
// this method will inject the top-level config into the package's config.
233+
// This is especially useful as it allows us to lazily evaluate a package's
234+
// config. If the package does specify config, this method takes care to merge
235+
// the top-level config with the values specified for this package.
215236
func (c *Config) GetPackageConfig(ctx context.Context, packageName string) (*Config, error) {
216-
log := zerolog.Ctx(ctx)
237+
log := zerolog.Ctx(ctx).With().Str("package-path", packageName).Logger()
217238

218239
if c.pkgConfigCache == nil {
219240
log.Debug().Msg("package cache is nil")
@@ -223,11 +244,10 @@ func (c *Config) GetPackageConfig(ctx context.Context, packageName string) (*Con
223244
return pkgConf, nil
224245
}
225246

226-
pkgConfig := reflect.New(reflect.ValueOf(c).Elem().Type()).Interface()
247+
pkgConfig := &Config{}
227248
if err := copier.Copy(pkgConfig, c); err != nil {
228249
return nil, fmt.Errorf("failed to copy config: %w", err)
229250
}
230-
pkgConfigTyped := pkgConfig.(*Config)
231251

232252
configMap, err := c.getPackageConfigMap(ctx, packageName)
233253
if err != nil {
@@ -237,18 +257,24 @@ func (c *Config) GetPackageConfig(ctx context.Context, packageName string) (*Con
237257
configSection, ok := configMap["config"]
238258
if !ok {
239259
log.Debug().Msg("config section not provided for package")
240-
return pkgConfigTyped, nil
260+
configMap["config"] = map[string]any{}
261+
c.pkgConfigCache[packageName] = pkgConfig
262+
return pkgConfig, nil
241263
}
242264

243-
decoder, err := c.getDecoder(pkgConfigTyped)
265+
// We know that the package specified config that is overriding the top-level
266+
// config. We use a mapstructure decoder to decode the values in the yaml
267+
// into the pkgConfig struct. This has the effect of merging top-level
268+
// config with package-level config.
269+
decoder, err := c.getDecoder(pkgConfig)
244270
if err != nil {
245271
return nil, stackerr.NewStackErrf(err, "failed to get decoder")
246272
}
247273
if err := decoder.Decode(configSection); err != nil {
248274
return nil, err
249275
}
250-
c.pkgConfigCache[packageName] = pkgConfigTyped
251-
return pkgConfigTyped, nil
276+
c.pkgConfigCache[packageName] = pkgConfig
277+
return pkgConfig, nil
252278
}
253279

254280
func (c *Config) ExcludePath(path string) bool {
@@ -347,16 +373,15 @@ func (c *Config) GetInterfaceConfig(ctx context.Context, packageName string, int
347373
}
348374

349375
// Copy the package-level config to our interface-level config
350-
pkgConfigCopy := reflect.New(reflect.ValueOf(pkgConfig).Elem().Type()).Interface()
376+
pkgConfigCopy := &Config{}
351377
if err := copier.Copy(pkgConfigCopy, pkgConfig); err != nil {
352378
return nil, stackerr.NewStackErrf(err, "failed to create a copy of package config")
353379
}
354-
baseConfigTyped := pkgConfigCopy.(*Config)
355380

356381
interfaceSection, ok := interfacesSection[interfaceName]
357382
if !ok {
358383
log.Debug().Msg("interface not defined in package configuration")
359-
return []*Config{baseConfigTyped}, nil
384+
return []*Config{pkgConfigCopy}, nil
360385
}
361386

362387
interfaceSectionTyped, ok := interfaceSection.(map[string]any)
@@ -365,7 +390,7 @@ func (c *Config) GetInterfaceConfig(ctx context.Context, packageName string, int
365390
// the interface but not provide any additional config beyond what
366391
// is provided at the package level
367392
if reflect.ValueOf(&interfaceSection).Elem().IsZero() {
368-
return []*Config{baseConfigTyped}, nil
393+
return []*Config{pkgConfigCopy}, nil
369394
}
370395
msgString := "bad type provided for interface config"
371396
log.Error().Msgf(msgString)
@@ -376,11 +401,11 @@ func (c *Config) GetInterfaceConfig(ctx context.Context, packageName string, int
376401
if ok {
377402
log.Debug().Msg("config section exists for interface")
378403
// if `config` is provided, we'll overwrite the values in our
379-
// baseConfigTyped struct to act as the "new" base config.
404+
// pkgConfigCopy struct to act as the "new" base config.
380405
// This will allow us to set the default values for the interface
381406
// but override them further for each mock defined in the
382407
// `configs` section.
383-
decoder, err := c.getDecoder(baseConfigTyped)
408+
decoder, err := c.getDecoder(pkgConfigCopy)
384409
if err != nil {
385410
return nil, stackerr.NewStackErrf(err, "unable to create mapstructure decoder")
386411
}
@@ -397,8 +422,8 @@ func (c *Config) GetInterfaceConfig(ctx context.Context, packageName string, int
397422
configsSectionTyped := configsSection.([]any)
398423
for _, configMap := range configsSectionTyped {
399424
// Create a copy of the package-level config
400-
currentInterfaceConfig := reflect.New(reflect.ValueOf(baseConfigTyped).Elem().Type()).Interface()
401-
if err := copier.Copy(currentInterfaceConfig, baseConfigTyped); err != nil {
425+
currentInterfaceConfig := reflect.New(reflect.ValueOf(pkgConfigCopy).Elem().Type()).Interface()
426+
if err := copier.Copy(currentInterfaceConfig, pkgConfigCopy); err != nil {
402427
return nil, stackerr.NewStackErrf(err, "failed to copy package config")
403428
}
404429

@@ -418,7 +443,7 @@ func (c *Config) GetInterfaceConfig(ctx context.Context, packageName string, int
418443
log.Debug().Msg("configs section doesn't exist for interface")
419444

420445
if len(configs) == 0 {
421-
configs = append(configs, baseConfigTyped)
446+
configs = append(configs, pkgConfigCopy)
422447
}
423448
return configs, nil
424449
}
@@ -429,31 +454,33 @@ func (c *Config) addSubPkgConfig(ctx context.Context, subPkgPath string, parentP
429454
log := zerolog.Ctx(ctx).With().
430455
Str("parent-package", parentPkgPath).
431456
Str("sub-package", subPkgPath).Logger()
457+
ctx = log.WithContext(ctx)
432458

433-
log.Trace().Msg("adding sub-package to config map")
459+
log.Debug().Msg("adding sub-package to config map")
434460
parentPkgConfig, err := c.getPackageConfigMap(ctx, parentPkgPath)
435461
if err != nil {
436462
log.Err(err).
437463
Msg("failed to get package config for parent package")
438464
return fmt.Errorf("failed to get package config: %w", err)
439465
}
440466

441-
log.Trace().Msg("getting config")
442-
cfg, err := c.CfgAsMap(ctx)
467+
log.Debug().Msg("getting config")
468+
topLevelConfig, err := c.CfgAsMap(ctx)
443469
if err != nil {
444470
return fmt.Errorf("failed to get configuration map: %w", err)
445471
}
446472

447-
log.Trace().Msg("getting packages section")
448-
packagesSection := cfg["packages"].(map[string]any)
473+
log.Debug().Msg("getting packages section")
474+
packagesSection := topLevelConfig["packages"].(map[string]any)
449475

450-
// Don't overwrite any config that already exists
451476
_, pkgExists := packagesSection[subPkgPath]
452477
if !pkgExists {
453478
log.Trace().Msg("sub-package doesn't exist in config")
479+
480+
// Copy the parent package directly into the subpackage config section
454481
packagesSection[subPkgPath] = map[string]any{}
455482
newPkgSection := packagesSection[subPkgPath].(map[string]any)
456-
newPkgSection["config"] = parentPkgConfig["config"]
483+
newPkgSection["config"] = deepCopyConfigMap(parentPkgConfig["config"].(map[string]any))
457484
} else {
458485
log.Trace().Msg("sub-package exists in config")
459486
// The sub-package exists in config. Check if it has its
@@ -465,10 +492,15 @@ func (c *Config) addSubPkgConfig(ctx context.Context, subPkgPath string, parentP
465492
log.Err(err).Msg("could not get child package config")
466493
return fmt.Errorf("failed to get sub-package config: %w", err)
467494
}
468-
469-
for key, val := range parentPkgConfig {
470-
if _, keyInSubPkg := subPkgConfig[key]; !keyInSubPkg {
471-
subPkgConfig[key] = val
495+
log.Trace().Msgf("sub-package config: %v", subPkgConfig)
496+
log.Trace().Msgf("parent-package config: %v", parentPkgConfig)
497+
498+
// Merge the parent config with the sub-package config.
499+
parentConfigSection := parentPkgConfig["config"].(map[string]any)
500+
subPkgConfigSection := subPkgConfig["config"].(map[string]any)
501+
for key, val := range parentConfigSection {
502+
if _, keyInSubPkg := subPkgConfigSection[key]; !keyInSubPkg {
503+
subPkgConfigSection[key] = val
472504
}
473505

474506
}
@@ -595,18 +627,24 @@ func (c *Config) subPackages(
595627
// recursive and recurses the file tree to find all sub-packages.
596628
func (c *Config) discoverRecursivePackages(ctx context.Context) error {
597629
log := zerolog.Ctx(ctx)
630+
log.Trace().Msg("discovering recursive packages")
598631
recursivePackages := map[string]*Config{}
599632
packageList, err := c.GetPackages(ctx)
600633
if err != nil {
601634
return fmt.Errorf("failed to get packages: %w", err)
602635
}
603636
for _, pkg := range packageList {
604637
pkgConfig, err := c.GetPackageConfig(ctx, pkg)
638+
pkgLog := log.With().Str("package", pkg).Logger()
639+
pkgLog.Trace().Msg("iterating over package")
605640
if err != nil {
606641
return fmt.Errorf("failed to get package config: %w", err)
607642
}
608643
if pkgConfig.Recursive {
644+
pkgLog.Trace().Msg("package marked as recursive")
609645
recursivePackages[pkg] = pkgConfig
646+
} else {
647+
pkgLog.Trace().Msg("package not marked as recursive")
610648
}
611649
}
612650
if len(recursivePackages) == 0 {
@@ -658,6 +696,17 @@ func contains[T comparable](slice []T, elem T) bool {
658696
return false
659697
}
660698

699+
func deepCopyConfigMap(src map[string]any) map[string]any {
700+
newMap := map[string]any{}
701+
for key, val := range src {
702+
if contains([]string{"packages", "config", "interfaces"}, key) {
703+
continue
704+
}
705+
newMap[key] = val
706+
}
707+
return newMap
708+
}
709+
661710
// mergeInConfig takes care of merging inheritable configuration
662711
// in the config map. For example, it merges default config, then
663712
// package-level config, then interface-level config.
@@ -677,34 +726,62 @@ func (c *Config) mergeInConfig(ctx context.Context) error {
677726
}
678727
for _, pkgPath := range pkgs {
679728
pkgLog := log.With().Str("package-path", pkgPath).Logger()
729+
pkgCtx := pkgLog.WithContext(ctx)
730+
680731
pkgLog.Trace().Msg("merging for package")
681-
packageConfig, err := c.getPackageConfigMap(ctx, pkgPath)
732+
packageConfig, err := c.getPackageConfigMap(pkgCtx, pkgPath)
682733
if err != nil {
683734
pkgLog.Err(err).Msg("failed to get package config")
684735
return fmt.Errorf("failed to get package config: %w", err)
685736
}
737+
pkgLog.Trace().Msgf("got package config map: %v", packageConfig)
738+
686739
configSectionUntyped, configExists := packageConfig["config"]
687740
if !configExists {
688-
packageConfig["config"] = defaultCfg
689-
continue
741+
// The reason why this should never happen is because getPackageConfigMap
742+
// should be populating the config section with the top-level config if it
743+
// wasn't defined in the yaml.
744+
msg := "config section does not exist for package, this should never happen"
745+
pkgLog.Error().Msg(msg)
746+
return fmt.Errorf(msg)
747+
}
748+
749+
pkgLog.Trace().Msg("got config section for package")
750+
// Sometimes the config section may be provided, but it's nil.
751+
// We need to account for this fact.
752+
if configSectionUntyped == nil {
753+
pkgLog.Trace().Msg("config section is nil, converting to empty map")
754+
emptyMap := map[string]any{}
755+
756+
// We need to add this to the "global" config mapping so the change
757+
// gets persisted, and also into configSectionUntyped for the logic
758+
// further down.
759+
packageConfig["config"] = emptyMap
760+
configSectionUntyped = emptyMap
761+
} else {
762+
pkgLog.Trace().Msg("config section is not nil")
690763
}
691-
packageConfigSection := configSectionUntyped.(map[string]any)
764+
765+
configSectionTyped := configSectionUntyped.(map[string]any)
692766

693767
for key, value := range defaultCfg {
694768
if contains([]string{"packages", "config"}, key) {
695769
continue
696770
}
697-
_, keyExists := packageConfigSection[key]
771+
keyValLog := pkgLog.With().Str("key", key).Str("value", fmt.Sprintf("%v", value)).Logger()
772+
773+
_, keyExists := configSectionTyped[key]
698774
if !keyExists {
699-
packageConfigSection[key] = value
775+
keyValLog.Trace().Msg("setting key to value")
776+
configSectionTyped[key] = value
700777
}
701778
}
702-
interfaces, err := c.getInterfacesForPackage(ctx, pkgPath)
779+
interfaces, err := c.getInterfacesForPackage(pkgCtx, pkgPath)
703780
if err != nil {
704781
return fmt.Errorf("failed to get interfaces for package: %w", err)
705782
}
706783
for _, interfaceName := range interfaces {
707-
interfacesSection, err := c.getInterfacesSection(ctx, pkgPath)
784+
interfacesSection, err := c.getInterfacesSection(pkgCtx, pkgPath)
708785
if err != nil {
709786
return err
710787
}
@@ -728,7 +805,7 @@ func (c *Config) mergeInConfig(ctx context.Context) error {
728805
// Assume this interface's value in the map is nil. Just skip it.
729806
continue
730807
}
731-
for key, value := range packageConfigSection {
808+
for key, value := range configSectionTyped {
732809
if key == "packages" {
733810
continue
734811
}

‎pkg/config/config_test.go

+72-5
Original file line numberDiff line numberDiff line change
@@ -1172,26 +1172,93 @@ packages:
11721172
recursive: true
11731173
with-expecter: true
11741174
with-expecter: false
1175+
`,
1176+
},
1177+
{
1178+
name: "empty map for recursive package",
1179+
cfgYaml: `
1180+
with-expecter: False
1181+
dir: foobar
1182+
recursive: True
1183+
all: True
1184+
packages:
1185+
github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_subpkgs/subpkg2:
1186+
`,
1187+
wantCfgMap: `all: true
1188+
dir: foobar
1189+
packages:
1190+
github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_subpkgs/subpkg2:
1191+
config:
1192+
all: true
1193+
dir: foobar
1194+
recursive: true
1195+
with-expecter: false
1196+
github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_subpkgs/subpkg2/subpkg3:
1197+
config:
1198+
all: true
1199+
dir: foobar
1200+
recursive: true
1201+
with-expecter: false
1202+
recursive: true
1203+
with-expecter: false
1204+
`,
1205+
},
1206+
{
1207+
name: "empty map for subpackage of recursive package",
1208+
cfgYaml: `
1209+
with-expecter: False
1210+
dir: foobar
1211+
packages:
1212+
github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_subpkgs/subpkg2:
1213+
config:
1214+
recursive: True
1215+
with-expecter: True
1216+
all: True
1217+
github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_subpkgs/subpkg2/subpkg3: {}
1218+
`,
1219+
wantCfgMap: `dir: foobar
1220+
packages:
1221+
github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_subpkgs/subpkg2:
1222+
config:
1223+
all: true
1224+
dir: foobar
1225+
recursive: true
1226+
with-expecter: true
1227+
github.com/vektra/mockery/v2/pkg/fixtures/example_project/pkg_with_subpkgs/subpkg2/subpkg3:
1228+
config:
1229+
all: true
1230+
dir: foobar
1231+
recursive: true
1232+
with-expecter: true
1233+
with-expecter: false
11751234
`,
11761235
},
11771236
}
11781237
for _, tt := range tests {
11791238
t.Run(tt.name, func(t *testing.T) {
1239+
1240+
ctx := context.Background()
11801241
tmpdir := pathlib.NewPath(t.TempDir())
11811242
cfg := tmpdir.Join("config.yaml")
11821243
require.NoError(t, cfg.WriteFile([]byte(tt.cfgYaml)))
11831244

1184-
c := &Config{
1185-
Config: cfg.String(),
1186-
}
1245+
viperObj := viper.New()
1246+
viperObj.SetConfigFile(cfg.String())
1247+
require.NoError(t, viperObj.ReadInConfig())
1248+
c, err := NewConfigFromViper(viperObj)
1249+
require.NoError(t, err)
1250+
11871251
log, err := logging.GetLogger("TRACE")
11881252
require.NoError(t, err)
11891253

1190-
if err := c.Initialize(log.WithContext(context.Background())); !errors.Is(err, tt.wantErr) {
1254+
if err := c.Initialize(log.WithContext(ctx)); !errors.Is(err, tt.wantErr) {
11911255
t.Errorf("Config.Initialize() error = %v, wantErr %v", err, tt.wantErr)
11921256
}
11931257

1194-
cfgAsStr, err := yaml.Marshal(c._cfgAsMap)
1258+
cfgAsMap, err := c.CfgAsMap(ctx)
1259+
require.NoError(t, err)
1260+
1261+
cfgAsStr, err := yaml.Marshal(cfgAsMap)
11951262
require.NoError(t, err)
11961263

11971264
if tt.wantCfgMap != "" && !reflect.DeepEqual(string(cfgAsStr), tt.wantCfgMap) {

‎tools/go.mod

+11-7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.19
55
require (
66
github.com/go-task/task/v3 v3.24.0
77
github.com/golangci/golangci-lint v1.52.2
8+
gotest.tools/gotestsum v1.11.0
89
)
910

1011
require (
@@ -24,6 +25,7 @@ require (
2425
github.com/ashanbrown/forbidigo v1.5.1 // indirect
2526
github.com/ashanbrown/makezero v1.1.1 // indirect
2627
github.com/beorn7/perks v1.0.1 // indirect
28+
github.com/bitfield/gotestdox v0.2.1 // indirect
2729
github.com/bkielbasa/cyclop v1.2.0 // indirect
2830
github.com/blizzy78/varnamelen v0.8.0 // indirect
2931
github.com/bombsimon/wsl/v3 v3.4.0 // indirect
@@ -37,6 +39,7 @@ require (
3739
github.com/daixiang0/gci v0.10.1 // indirect
3840
github.com/davecgh/go-spew v1.1.1 // indirect
3941
github.com/denis-tingaikin/go-header v0.4.3 // indirect
42+
github.com/dnephin/pflag v1.0.7 // indirect
4043
github.com/esimonov/ifshort v1.0.4 // indirect
4144
github.com/ettle/strcase v0.1.1 // indirect
4245
github.com/fatih/color v1.15.0 // indirect
@@ -67,6 +70,7 @@ require (
6770
github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 // indirect
6871
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect
6972
github.com/google/go-cmp v0.5.9 // indirect
73+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
7074
github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 // indirect
7175
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
7276
github.com/gostaticanalysis/comment v1.4.2 // indirect
@@ -99,7 +103,7 @@ require (
99103
github.com/maratori/testpackage v1.1.1 // indirect
100104
github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect
101105
github.com/mattn/go-colorable v0.1.13 // indirect
102-
github.com/mattn/go-isatty v0.0.17 // indirect
106+
github.com/mattn/go-isatty v0.0.19 // indirect
103107
github.com/mattn/go-runewidth v0.0.9 // indirect
104108
github.com/mattn/go-zglob v0.0.4 // indirect
105109
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
@@ -171,12 +175,12 @@ require (
171175
go.uber.org/zap v1.24.0 // indirect
172176
golang.org/x/exp v0.0.0-20230212135524-a684f29349b6 // indirect
173177
golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 // indirect
174-
golang.org/x/mod v0.9.0 // indirect
175-
golang.org/x/sync v0.1.0 // indirect
176-
golang.org/x/sys v0.6.0 // indirect
177-
golang.org/x/term v0.5.0 // indirect
178-
golang.org/x/text v0.7.0 // indirect
179-
golang.org/x/tools v0.7.0 // indirect
178+
golang.org/x/mod v0.12.0 // indirect
179+
golang.org/x/sync v0.3.0 // indirect
180+
golang.org/x/sys v0.10.0 // indirect
181+
golang.org/x/term v0.10.0 // indirect
182+
golang.org/x/text v0.11.0 // indirect
183+
golang.org/x/tools v0.11.0 // indirect
180184
google.golang.org/protobuf v1.28.0 // indirect
181185
gopkg.in/ini.v1 v1.67.0 // indirect
182186
gopkg.in/yaml.v2 v2.4.0 // indirect

‎tools/go.sum

+34-10
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
7878
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
7979
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
8080
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
81+
github.com/bitfield/gotestdox v0.2.1 h1:Zj8IMLAO5/oiAKoMmtN96eyFiPZraJRTH2p0zDgtxc0=
82+
github.com/bitfield/gotestdox v0.2.1/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY=
8183
github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A=
8284
github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI=
8385
github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M=
@@ -116,6 +118,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
116118
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
117119
github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU=
118120
github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c=
121+
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
122+
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
119123
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
120124
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
121125
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -257,6 +261,8 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
257261
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
258262
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
259263
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
264+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
265+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
260266
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
261267
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
262268
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
@@ -354,8 +360,9 @@ github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwM
354360
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
355361
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
356362
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
357-
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
358363
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
364+
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
365+
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
359366
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
360367
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
361368
github.com/mattn/go-zglob v0.0.4 h1:LQi2iOm0/fGgu80AioIJ/1j9w9Oh+9DZ39J4VAGzHQM=
@@ -448,7 +455,8 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8
448455
github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE=
449456
github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg=
450457
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
451-
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
458+
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
459+
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
452460
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
453461
github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw=
454462
github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50=
@@ -491,6 +499,7 @@ github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
491499
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
492500
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
493501
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
502+
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
494503
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
495504
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
496505
github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=
@@ -576,6 +585,7 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm
576585
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
577586
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
578587
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
588+
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
579589
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
580590
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
581591
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -622,8 +632,9 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91
622632
golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
623633
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
624634
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
625-
golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
626635
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
636+
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
637+
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
627638
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
628639
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
629640
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -666,7 +677,9 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
666677
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
667678
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
668679
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
669-
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
680+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
681+
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
682+
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
670683
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
671684
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
672685
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -689,8 +702,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
689702
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
690703
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
691704
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
692-
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
693705
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
706+
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
707+
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
694708
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
695709
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
696710
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -750,16 +764,20 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
750764
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
751765
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
752766
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
753-
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
754767
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
768+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
769+
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
770+
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
755771
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
756772
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
757773
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
758774
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
759775
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
760776
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
761-
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
762777
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
778+
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
779+
golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
780+
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
763781
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
764782
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
765783
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -771,8 +789,10 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
771789
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
772790
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
773791
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
774-
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
775792
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
793+
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
794+
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
795+
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
776796
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
777797
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
778798
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -846,8 +866,8 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
846866
golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
847867
golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
848868
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
849-
golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
850-
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
869+
golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8=
870+
golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
851871
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
852872
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
853873
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -962,6 +982,10 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
962982
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
963983
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
964984
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
985+
gotest.tools/gotestsum v1.11.0 h1:A88/QWw7acMjZH1dMe6KZFhw32odUOIjCiAU/Q4n3mI=
986+
gotest.tools/gotestsum v1.11.0/go.mod h1:cUOKgFEvWAP0twchmiOvdzX0SBZX0UI58bGRpRIu4xs=
987+
gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo=
988+
gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A=
965989
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
966990
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
967991
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

‎tools/tools.go

+1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ package tools
55
import (
66
_ "github.com/go-task/task/v3/cmd/task"
77
_ "github.com/golangci/golangci-lint/cmd/golangci-lint"
8+
_ "gotest.tools/gotestsum"
89
)

0 commit comments

Comments
 (0)
Please sign in to comment.