From b0931120630bdd8e5d836dceb986306843f0450b Mon Sep 17 00:00:00 2001 From: adlerhurst <27845747+adlerhurst@users.noreply.github.com> Date: Tue, 4 Mar 2025 20:00:09 +0100 Subject: [PATCH] some ideas --- backend/cmd/configure/bla/update_config4.go | 4 + backend/cmd/configure/bla2/update_config5.go | 70 +++++++++++++++ backend/cmd/prepare/001/step_001.go | 2 +- backend/cmd/prepare/config.go | 58 +++--------- backend/cmd/prepare/prepare.go | 10 +-- backend/cmd/test.yaml | 4 +- backend/storage/database/dialect/config.go | 90 +++++++++---------- .../database/dialect/postgres/config.go | 27 +++++- go.mod | 9 +- go.sum | 13 ++- 10 files changed, 165 insertions(+), 122 deletions(-) create mode 100644 backend/cmd/configure/bla2/update_config5.go diff --git a/backend/cmd/configure/bla/update_config4.go b/backend/cmd/configure/bla/update_config4.go index 0837b9b249..794e339a6f 100644 --- a/backend/cmd/configure/bla/update_config4.go +++ b/backend/cmd/configure/bla/update_config4.go @@ -114,6 +114,10 @@ func handleField(v *viper.Viper, field reflect.StructField, value reflect.Value) value = reflect.Indirect(value) + if value.IsZero() { + value = reflect.New(value.Type()).Elem() + } + // Check if potential non pointer value implements [OneOfField] if value.Type().Implements(reflect.TypeFor[OneOfField]()) { return handleOneOf(v, field, value, fieldConfig) diff --git a/backend/cmd/configure/bla2/update_config5.go b/backend/cmd/configure/bla2/update_config5.go new file mode 100644 index 0000000000..2b6c97c068 --- /dev/null +++ b/backend/cmd/configure/bla2/update_config5.go @@ -0,0 +1,70 @@ +package bla2 + +import ( + "github.com/manifoldco/promptui" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +type TestConfig struct { + API APIConfig `configure:""` + Database DatabaseOneOf `configure:"type=oneof"` +} + +type APIConfig struct { + Host string `configure:""` + Port uint16 `configure:""` +} + +type DatabaseOneOf struct { + ConnectionString *string `configure:""` + Config *DatabaseConfig `configure:""` +} + +type DatabaseConfig struct { + Host string `configure:""` + Port uint16 `configure:""` + SSLMode string `configure:""` +} + +type Config interface { + Hooks() []viper.DecoderConfigOption +} + +func Update(v *viper.Viper, config any) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + // promptui.Select + // err := handleStruct(v, reflect.ValueOf(config), configuration{}) + // if err != nil { + // fmt.Println(err) + // os.Exit(1) + // } + // err = v.WriteConfig() + // if err != nil { + // fmt.Println(err) + // os.Exit(1) + // } + } +} + +const ( + tagName = "configure" + defaultKey = "default" + oneOfKey = "oneof" +) + +type Field struct { + Name string + DefaultValue any + Prompt prompt +} + +type prompt interface { + Run() +} + +var ( + _ prompt = (*promptui.Select)(nil) + _ prompt = (*promptui.SelectWithAdd)(nil) + _ prompt = (*promptui.Prompt)(nil) +) diff --git a/backend/cmd/prepare/001/step_001.go b/backend/cmd/prepare/001/step_001.go index a2e7c416ec..ba9d077c97 100644 --- a/backend/cmd/prepare/001/step_001.go +++ b/backend/cmd/prepare/001/step_001.go @@ -17,7 +17,7 @@ var ( ) type Step001 struct { - Database database.Pool `mapstructure:"-"` + Database database.Pool `mapstructure:"-" configure:"-"` DatabaseName string `configure:"default=zitadel"` Username string `configure:"default=zitadel"` diff --git a/backend/cmd/prepare/config.go b/backend/cmd/prepare/config.go index a9289e3846..7be5cc9e72 100644 --- a/backend/cmd/prepare/config.go +++ b/backend/cmd/prepare/config.go @@ -1,12 +1,12 @@ package prepare import ( - "github.com/Masterminds/semver/v3" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/zitadel/zitadel/backend/cmd/config" "github.com/zitadel/zitadel/backend/cmd/configure" + "github.com/zitadel/zitadel/backend/cmd/configure/bla" step001 "github.com/zitadel/zitadel/backend/cmd/prepare/001" "github.com/zitadel/zitadel/backend/storage/database" "github.com/zitadel/zitadel/backend/storage/database/dialect" @@ -36,62 +36,24 @@ var ( // panic(err) // } // }, - Run: configure.Update( - "prepare", - "Writes the configuration for the prepare command", - configuration.Fields(), - ), + // Run: configure.Update( + // "prepare", + // "Writes the configuration for the prepare command", + // configuration.Fields(), + // ), + Run: bla.Update(viper.GetViper(), &configuration), PreRun: configure.ReadConfigPreRun(viper.GetViper(), &configuration), } ) type Config struct { - config.Config `mapstructure:",squash"` + config.Config `mapstructure:",squash" configure:"-"` - Database dialect.Config + Database dialect.Config // `configure:"-"` Step001 step001.Step001 // runtime config - Client database.Pool `mapstructure:"-"` -} - -// Describe implements configure.StructUpdater. -func (c *Config) Describe() string { - return "Configuration for the prepare command" -} - -// Name implements configure.StructUpdater. -func (c *Config) Name() string { - return "prepare" -} - -// ShouldUpdate implements configure.StructUpdater. -func (c *Config) ShouldUpdate(version *semver.Version) bool { - if version == nil { - return true - } - for _, field := range c.Fields() { - if field.ShouldUpdate(version) { - return true - } - } - return false -} - -// Fields implements configure.UpdateConfig. -func (c Config) Fields() []configure.Updater { - return []configure.Updater{ - &configure.Struct{ - FieldName: "step001", - Description: "The configuration for the first step of the prepare command", - SubFields: c.Step001.Fields(), - }, - &configure.Struct{ - FieldName: "database", - Description: "The configuration for the database connection", - SubFields: c.Database.Fields(), - }, - } + Client database.Pool `mapstructure:"-" configure:"-"` } func (c *Config) Hooks() (decoders []viper.DecoderConfigOption) { diff --git a/backend/cmd/prepare/prepare.go b/backend/cmd/prepare/prepare.go index 2240177d5c..7e71f1f5a1 100644 --- a/backend/cmd/prepare/prepare.go +++ b/backend/cmd/prepare/prepare.go @@ -18,11 +18,11 @@ var ( // This application is a tool to generate the needed files // to quickly create a Cobra application.`, Run: func(cmd *cobra.Command, args []string) { - var err error - configuration.Client, err = configuration.Database.Connect(cmd.Context()) - if err != nil { - panic(err) - } + // var err error + // configuration.Client, err = configuration.Database.Connect(cmd.Context()) + // if err != nil { + // panic(err) + // } defer configuration.Client.Close(cmd.Context()) if err := (&step001.Step001{Database: configuration.Client}).Migrate(cmd.Context()); err != nil { panic(err) diff --git a/backend/cmd/test.yaml b/backend/cmd/test.yaml index d590fbd39c..77e75d0ef4 100644 --- a/backend/cmd/test.yaml +++ b/backend/cmd/test.yaml @@ -2,5 +2,5 @@ configuredversion: 2025.2.23 database: postgres: host=local step001: - databasename: zita - username: adel + databasename: asdf + username: asdf diff --git a/backend/storage/database/dialect/config.go b/backend/storage/database/dialect/config.go index e95ab63819..26a40bfe83 100644 --- a/backend/storage/database/dialect/config.go +++ b/backend/storage/database/dialect/config.go @@ -3,7 +3,6 @@ package dialect import ( "context" "errors" - "fmt" "reflect" "github.com/mitchellh/mapstructure" @@ -11,70 +10,43 @@ import ( "github.com/zitadel/zitadel/backend/cmd/config" "github.com/zitadel/zitadel/backend/cmd/configure" + "github.com/zitadel/zitadel/backend/cmd/configure/bla" "github.com/zitadel/zitadel/backend/storage/database" "github.com/zitadel/zitadel/backend/storage/database/dialect/gosql" "github.com/zitadel/zitadel/backend/storage/database/dialect/postgres" ) type Hook struct { - Match func(string) bool - Decode func(name string, config any) (database.Connector, error) - Name string - Field configure.Updater + Match func(string) bool + Decode func(name string, config any) (database.Connector, error) + Name string + Field configure.Updater + Constructor func() any } -var hooks = make([]Hook, 0) - -func init() { - hooks = append(hooks, - Hook{ - Match: postgres.NameMatcher, - Decode: postgres.DecodeConfig, - Name: postgres.Name, - Field: postgres.Field, - }, - Hook{ - Match: gosql.NameMatcher, - Decode: gosql.DecodeConfig, - Name: gosql.Name, - Field: gosql.Field, - }, - ) +var hooks = []Hook{ + { + Match: postgres.NameMatcher, + Decode: postgres.DecodeConfig, + Name: postgres.Name, + Field: postgres.Field, + Constructor: func() any { return new(postgres.Config) }, + }, + { + Match: gosql.NameMatcher, + Decode: gosql.DecodeConfig, + Name: gosql.Name, + Field: gosql.Field, + Constructor: func() any { return new(gosql.Config) }, + }, } type Config struct { - Dialects map[string]any `mapstructure:",remain"` + Dialects dialects `mapstructure:",remain"` connector database.Connector } -// Fields implements [configure.StructUpdater]. -func (c *Config) Fields() []configure.Updater { - dialects := configure.OneOf{ - Description: "The database dialect Zitadel connects to", - SubFields: []configure.Updater{}, - } - for _, hook := range hooks { - if hook.Field == nil { - panic("hook must configure its config fields") - } - dialects.SubFields = append(dialects.SubFields, &configure.Struct{ - FieldName: hook.Name, - Description: fmt.Sprintf("Configuration for %s", hook.Name), - SubFields: []configure.Updater{hook.Field}, - }) - } - - return []configure.Updater{ - dialects, - } -} - -// Name implements [configure.StructUpdater]. -func (c *Config) Name() string { - return "database" -} - func (c Config) Connect(ctx context.Context) (database.Pool, error) { if len(c.Dialects) != 1 { return nil, errors.New("Exactly one dialect must be configured") @@ -131,3 +103,21 @@ func decodeHook(from, to reflect.Value) (_ interface{}, err error) { return config, nil } + +type dialects map[string]any + +// ConfigForIndex implements [bla.OneOfField]. +func (d dialects) ConfigForIndex(i int) any { + return hooks[i].Constructor() +} + +// Possibilities implements [bla.OneOfField]. +func (d dialects) Possibilities() []string { + possibilities := make([]string, len(hooks)) + for i, hook := range hooks { + possibilities[i] = hook.Name + } + return possibilities +} + +var _ bla.OneOfField = (dialects)(nil) diff --git a/backend/storage/database/dialect/postgres/config.go b/backend/storage/database/dialect/postgres/config.go index 5cf60ed5d3..30d3b7580e 100644 --- a/backend/storage/database/dialect/postgres/config.go +++ b/backend/storage/database/dialect/postgres/config.go @@ -10,6 +10,7 @@ import ( "github.com/jackc/pgx/v5/pgxpool" "github.com/zitadel/zitadel/backend/cmd/configure" + "github.com/zitadel/zitadel/backend/cmd/configure/bla" "github.com/zitadel/zitadel/backend/storage/database" ) @@ -93,11 +94,29 @@ var ( } ) -type Config struct{ *pgxpool.Config } +type Config struct{ pgxpool.Config } + +// ConfigForIndex implements bla.OneOfField. +func (c Config) ConfigForIndex(i int) any { + switch i { + case 0: + return new(string) + case 1: + return &c.Config + } + return nil +} + +// Possibilities implements bla.OneOfField. +func (c Config) Possibilities() []string { + return []string{"connection string", "fields"} +} + +var _ bla.OneOfField = (*Config)(nil) // Connect implements [database.Connector]. func (c *Config) Connect(ctx context.Context) (database.Pool, error) { - pool, err := pgxpool.NewWithConfig(ctx, c.Config) + pool, err := pgxpool.NewWithConfig(ctx, &c.Config) if err != nil { return nil, err } @@ -118,10 +137,10 @@ func DecodeConfig(_ string, config any) (database.Connector, error) { if err != nil { return nil, err } - return &Config{config}, nil + return &Config{Config: *config}, nil case map[string]any: return &Config{ - Config: &pgxpool.Config{}, + Config: pgxpool.Config{}, }, nil } return nil, errors.New("invalid configuration") diff --git a/go.mod b/go.mod index 71ab06daf1..0887e83c47 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/BurntSushi/toml v1.4.0 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.24.0 + github.com/Masterminds/semver/v3 v3.3.1 github.com/Masterminds/squirrel v1.5.4 github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b github.com/alecthomas/participle/v2 v2.1.1 @@ -47,6 +48,7 @@ require ( github.com/jinzhu/gorm v1.9.16 github.com/k3a/html2text v1.2.1 github.com/lucasb-eyer/go-colorful v1.2.0 + github.com/manifoldco/promptui v0.9.0 github.com/minio/minio-go/v7 v7.0.73 github.com/mitchellh/mapstructure v1.5.0 github.com/muesli/gamut v0.3.1 @@ -57,6 +59,8 @@ require ( github.com/pquerna/otp v1.4.0 github.com/rakyll/statik v0.1.7 github.com/redis/go-redis/v9 v9.7.0 + github.com/riverqueue/river v0.16.0 + github.com/riverqueue/river/riverdriver v0.16.0 github.com/rs/cors v1.11.1 github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/sony/gobreaker/v2 v2.0.0 @@ -100,7 +104,6 @@ require ( cloud.google.com/go/auth v0.6.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.0 // indirect - github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -120,15 +123,12 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/lib/pq v1.10.9 // indirect - github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/riverqueue/river v0.16.0 // indirect - github.com/riverqueue/river/riverdriver v0.16.0 // indirect github.com/riverqueue/river/rivershared v0.16.0 // indirect github.com/riverqueue/river/rivertype v0.16.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -140,7 +140,6 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/gopher-lua v1.1.1 // indirect github.com/zenazn/goji v1.0.1 // indirect - go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect diff --git a/go.sum b/go.sum index 2eeb66441e..eadfe58741 100644 --- a/go.sum +++ b/go.sum @@ -113,11 +113,13 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -425,16 +427,14 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa h1:s+4MhCQ6YrzisK6hFJUX53drDT4UsSW3DEhKn0ifuHw= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.0 h1:FG6VLIdzvAPhnYqP14sQ2xhFLkiUQHCs6ySqO91kF4g= -github.com/jackc/pgx/v5 v5.7.0/go.mod h1:awP1KNnjylvpxHuHP63gzjhnGkI1iw+PMoIwvoleN/8= github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jarcoal/jpath v0.0.0-20140328210829-f76b8b2dbf52 h1:jny9eqYPwkG8IVy7foUoRjQmFLcArCSz+uPsL6KS0HQ= @@ -659,6 +659,8 @@ github.com/riverqueue/river v0.16.0 h1:YyQrs0kGgjuABwgat02DPUYS0TMyG2ZFlzvf6+fSF github.com/riverqueue/river v0.16.0/go.mod h1:pEZ8Gc15XyFjVY89nJeL256ub5z18XF7ukYn8ktqQrs= github.com/riverqueue/river/riverdriver v0.16.0 h1:y4Df4e1Xk3Id0nnu1VxHJn9118OzmRHcmvOxM/i1Q30= github.com/riverqueue/river/riverdriver v0.16.0/go.mod h1:7Kdf5HQDrLyLUUqPqXobaK+7zbcMctWeAl7yhg4nHes= +github.com/riverqueue/river/riverdriver/riverdatabasesql v0.16.0 h1:T/DcMmZXiJAyLN3CSyAoNcf3U4oAD9Ht/8Vd5SXv5YU= +github.com/riverqueue/river/riverdriver/riverdatabasesql v0.16.0/go.mod h1:a9EUhD2yGsAeM9eWo+QrGGbL8LVWoGj2m8KEzm0xUxE= github.com/riverqueue/river/riverdriver/riverpgxv5 v0.16.0 h1:6HP296OPN+3ORL9qG1f561pldB5eovkLzfkNIQmaTXI= github.com/riverqueue/river/riverdriver/riverpgxv5 v0.16.0/go.mod h1:MAeBNoTQ+CD3nRvV9mF6iCBfsGJTxYHZeZSP4MYoeUE= github.com/riverqueue/river/rivershared v0.16.0 h1:L1lQ3gMwdIsxA6yF0/PwAdsFP0T82yBD1V03q2GuJDU= @@ -738,7 +740,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -935,8 +936,6 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=