mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
vendor: run make vendor-update
This commit is contained in:
parent
9661918bb4
commit
48b842d2ad
144 changed files with 6733 additions and 7666 deletions
83
go.mod
83
go.mod
|
@ -3,7 +3,7 @@ module github.com/VictoriaMetrics/VictoriaMetrics
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cloud.google.com/go/storage v1.33.0
|
cloud.google.com/go/storage v1.34.0
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0
|
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0
|
||||||
github.com/VictoriaMetrics/fastcache v1.12.1
|
github.com/VictoriaMetrics/fastcache v1.12.1
|
||||||
|
@ -13,18 +13,18 @@ require (
|
||||||
github.com/VictoriaMetrics/fasthttp v1.2.0
|
github.com/VictoriaMetrics/fasthttp v1.2.0
|
||||||
github.com/VictoriaMetrics/metrics v1.24.0
|
github.com/VictoriaMetrics/metrics v1.24.0
|
||||||
github.com/VictoriaMetrics/metricsql v0.68.0
|
github.com/VictoriaMetrics/metricsql v0.68.0
|
||||||
github.com/aws/aws-sdk-go-v2 v1.21.2
|
github.com/aws/aws-sdk-go-v2 v1.22.0
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.18.45
|
github.com/aws/aws-sdk-go-v2/config v1.20.0
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.90
|
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.12.0
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.40.2
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.41.0
|
||||||
github.com/bmatcuk/doublestar/v4 v4.6.0
|
github.com/bmatcuk/doublestar/v4 v4.6.1
|
||||||
github.com/cespare/xxhash/v2 v2.2.0
|
github.com/cespare/xxhash/v2 v2.2.0
|
||||||
github.com/cheggaaa/pb/v3 v3.1.4
|
github.com/cheggaaa/pb/v3 v3.1.4
|
||||||
github.com/gogo/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.2
|
||||||
github.com/golang/snappy v0.0.4
|
github.com/golang/snappy v0.0.4
|
||||||
github.com/googleapis/gax-go/v2 v2.12.0
|
github.com/googleapis/gax-go/v2 v2.12.0
|
||||||
github.com/influxdata/influxdb v1.11.2
|
github.com/influxdata/influxdb v1.11.2
|
||||||
github.com/klauspost/compress v1.17.1
|
github.com/klauspost/compress v1.17.2
|
||||||
github.com/prometheus/prometheus v0.47.2
|
github.com/prometheus/prometheus v0.47.2
|
||||||
github.com/urfave/cli/v2 v2.25.7
|
github.com/urfave/cli/v2 v2.25.7
|
||||||
github.com/valyala/fastjson v1.6.4
|
github.com/valyala/fastjson v1.6.4
|
||||||
|
@ -36,36 +36,36 @@ require (
|
||||||
golang.org/x/net v0.17.0
|
golang.org/x/net v0.17.0
|
||||||
golang.org/x/oauth2 v0.13.0
|
golang.org/x/oauth2 v0.13.0
|
||||||
golang.org/x/sys v0.13.0
|
golang.org/x/sys v0.13.0
|
||||||
google.golang.org/api v0.147.0
|
google.golang.org/api v0.149.0
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cloud.google.com/go v0.110.8 // indirect
|
cloud.google.com/go v0.110.9 // indirect
|
||||||
cloud.google.com/go/compute v1.23.1 // indirect
|
cloud.google.com/go/compute v1.23.2 // indirect
|
||||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||||
cloud.google.com/go/iam v1.1.3 // indirect
|
cloud.google.com/go/iam v1.1.4 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.4.0 // indirect
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.0 // indirect
|
||||||
github.com/VividCortex/ewma v1.2.0 // indirect
|
github.com/VividCortex/ewma v1.2.0 // indirect
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
||||||
github.com/aws/aws-sdk-go v1.45.25 // indirect
|
github.com/aws/aws-sdk-go v1.47.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 // indirect
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.13.43 // indirect
|
github.com/aws/aws-sdk-go-v2/credentials v1.14.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 // indirect
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.6 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.38 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.6 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 // indirect
|
||||||
github.com/aws/smithy-go v1.15.0 // indirect
|
github.com/aws/smithy-go v1.16.0 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
|
@ -74,24 +74,23 @@ require (
|
||||||
github.com/felixge/httpsnoop v1.0.3 // indirect
|
github.com/felixge/httpsnoop v1.0.3 // indirect
|
||||||
github.com/go-kit/log v0.2.1 // indirect
|
github.com/go-kit/log v0.2.1 // indirect
|
||||||
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
||||||
github.com/go-logr/logr v1.2.4 // indirect
|
github.com/go-logr/logr v1.3.0 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/golang-jwt/jwt/v5 v5.0.0 // indirect
|
github.com/golang-jwt/jwt/v5 v5.0.0 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
|
||||||
github.com/google/s2a-go v0.1.7 // indirect
|
github.com/google/s2a-go v0.1.7 // indirect
|
||||||
github.com/google/uuid v1.3.1 // indirect
|
github.com/google/uuid v1.4.0 // indirect
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.3.1 // indirect
|
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
|
||||||
github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect
|
github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect
|
||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
github.com/jpillora/backoff v1.0.0 // indirect
|
github.com/jpillora/backoff v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.15 // indirect
|
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
|
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
|
||||||
|
@ -101,7 +100,7 @@ require (
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/prometheus/client_golang v1.17.0 // indirect
|
github.com/prometheus/client_golang v1.17.0 // indirect
|
||||||
github.com/prometheus/client_model v0.5.0 // indirect
|
github.com/prometheus/client_model v0.5.0 // indirect
|
||||||
github.com/prometheus/common v0.44.0 // indirect
|
github.com/prometheus/common v0.45.0 // indirect
|
||||||
github.com/prometheus/common/sigv4 v0.1.0 // indirect
|
github.com/prometheus/common/sigv4 v0.1.0 // indirect
|
||||||
github.com/prometheus/procfs v0.12.0 // indirect
|
github.com/prometheus/procfs v0.12.0 // indirect
|
||||||
github.com/rivo/uniseg v0.4.4 // indirect
|
github.com/rivo/uniseg v0.4.4 // indirect
|
||||||
|
@ -110,14 +109,14 @@ require (
|
||||||
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
github.com/valyala/bytebufferpool v1.0.0 // indirect
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
||||||
go.opencensus.io v0.24.0 // indirect
|
go.opencensus.io v0.24.0 // indirect
|
||||||
go.opentelemetry.io/collector/pdata v1.0.0-rcv0016 // indirect
|
go.opentelemetry.io/collector/pdata v1.0.0-rcv0017 // indirect
|
||||||
go.opentelemetry.io/collector/semconv v0.87.0 // indirect
|
go.opentelemetry.io/collector/semconv v0.88.0 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect
|
||||||
go.opentelemetry.io/otel v1.19.0 // indirect
|
go.opentelemetry.io/otel v1.19.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.19.0 // indirect
|
go.opentelemetry.io/otel/metric v1.19.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.19.0 // indirect
|
go.opentelemetry.io/otel/trace v1.19.0 // indirect
|
||||||
go.uber.org/atomic v1.11.0 // indirect
|
go.uber.org/atomic v1.11.0 // indirect
|
||||||
go.uber.org/goleak v1.2.1 // indirect
|
go.uber.org/goleak v1.3.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/crypto v0.14.0 // indirect
|
golang.org/x/crypto v0.14.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect
|
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect
|
||||||
|
@ -126,10 +125,10 @@ require (
|
||||||
golang.org/x/time v0.3.0 // indirect
|
golang.org/x/time v0.3.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
||||||
google.golang.org/appengine v1.6.8 // indirect
|
google.golang.org/appengine v1.6.8 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect
|
google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect
|
||||||
google.golang.org/grpc v1.58.3 // indirect
|
google.golang.org/grpc v1.59.0 // indirect
|
||||||
google.golang.org/protobuf v1.31.0 // indirect
|
google.golang.org/protobuf v1.31.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
170
go.sum
170
go.sum
|
@ -13,22 +13,22 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV
|
||||||
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||||
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||||
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||||
cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME=
|
cloud.google.com/go v0.110.9 h1:e7ITSqGFFk4rbz/JFIqZh3G4VEHguhAL4BQcFlWtU68=
|
||||||
cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk=
|
cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM=
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||||
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||||
cloud.google.com/go/compute v1.23.1 h1:V97tBoDaZHb6leicZ1G6DLK2BAaZLJ/7+9BB/En3hR0=
|
cloud.google.com/go/compute v1.23.2 h1:nWEMDhgbBkBJjfpVySqU4jgWdc22PLR0o4vEexZHers=
|
||||||
cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78=
|
cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns=
|
||||||
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
|
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
|
||||||
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
|
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
cloud.google.com/go/iam v1.1.3 h1:18tKG7DzydKWUnLjonWcJO6wjSCAtzh4GcRKlH/Hrzc=
|
cloud.google.com/go/iam v1.1.4 h1:K6n/GZHFTtEoKT5aUG3l9diPi0VduZNQ1PfdnpkkIFk=
|
||||||
cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE=
|
cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8=
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
|
@ -38,16 +38,16 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
||||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
cloud.google.com/go/storage v1.33.0 h1:PVrDOkIC8qQVa1P3SXGpQvfuJhN2LHOoyZvWs8D2X5M=
|
cloud.google.com/go/storage v1.34.0 h1:9KHBBTbaHPsNxO043SFmH3pMojjZiW+BFl9H41L7xjk=
|
||||||
cloud.google.com/go/storage v1.33.0/go.mod h1:Hhh/dogNRGca7IWv1RC2YqEn0c0G77ctA/OxflYkiD8=
|
cloud.google.com/go/storage v1.34.0/go.mod h1:Eji+S0CCQebjsiXxyIvPItC3BN3zWsdJjWfHfoLblgY=
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw=
|
github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw=
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI=
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs=
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.4.0 h1:TuEMD+E+1aTjjLICGQOW6vLe8UWES7kopac9mUXL56Y=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.4.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8=
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY=
|
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY=
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4=
|
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4=
|
||||||
|
@ -87,52 +87,52 @@ github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu
|
||||||
github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
||||||
github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
|
github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
|
||||||
github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||||
github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4=
|
github.com/aws/aws-sdk-go v1.47.0 h1:/JUg9V1+xh+qBn8A6ec/l15ETPaMaBqxkjz+gg63dNk=
|
||||||
github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
|
github.com/aws/aws-sdk-go v1.47.0/go.mod h1:DlEaEbWKZmsITVbqlSVvekPARM1HzeV9PMYg15ymSDA=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA=
|
github.com/aws/aws-sdk-go-v2 v1.22.0 h1:CpTS3XO3MWNel8ohoazkLZC6scvkYL2k+m0yzFJ17Hg=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM=
|
github.com/aws/aws-sdk-go-v2 v1.22.0/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14 h1:Sc82v7tDQ/vdU1WtuSyzZ1I7y/68j//HJ6uozND1IDs=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0 h1:hHgLiIrTRtddC0AKcJr5s7i/hLgcpTt+q/FKxf1Zayk=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.14/go.mod h1:9NCTOURS8OpxvoAVHq79LK81/zC78hfRWFn+aL0SPcY=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.0/go.mod h1:w4I/v3NOWgD+qvs1NPEwhd++1h3XPHFaVxasfY6HlYQ=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes=
|
github.com/aws/aws-sdk-go-v2/config v1.20.0 h1:q2+/mqFhY0J9m3Tb5RGFE3R4sdaUkIe4k2EuDfE3c08=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE=
|
github.com/aws/aws-sdk-go-v2/config v1.20.0/go.mod h1:7+1riCZXyT+sAGvneR5j+Zl1GyfbBUNQurpQTE6FP6k=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8=
|
github.com/aws/aws-sdk-go-v2/credentials v1.14.0 h1:LQquqPE7cL55RQmA/UBoBKehDlEtMnQKm3B0Q672ePE=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg=
|
github.com/aws/aws-sdk-go-v2/credentials v1.14.0/go.mod h1:q/3oaTPlamrQWHPwJe56Mjq9g1TYDgddvgTgWJtHTmE=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ=
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0 h1:lF/cVllNAPKgjDwN2RsQUX9g/f6hXer9f10ubLFSoug=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg=
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.0/go.mod h1:c28nJNzMVVb9TQpZ5q4tzZvwEJwf/7So7Ie2s90l1Fw=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.90 h1:mtJRt80k1oGw7QQPluAx8AZ6u16MyCA2di/lMhagZ7I=
|
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.12.0 h1:IJ1PN7TqW79Dmc0hSSd+clznCToXmN8gtWQO1hOxFbE=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.90/go.mod h1:lYwZTkeMQWPvNU+u7oYArdNhQ8EKiSGU76jVv0w2GH4=
|
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.12.0/go.mod h1:Y0Ksox8/7Bl2UTwxdxWQ0JfRQi4sMv48F8Iy4ueS/Dc=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0 h1:tN6dNNE4SzMuyMnVtQJXGVKX177/d5Zy4MuA1HA4KUc=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ=
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.0/go.mod h1:F6MXWETIeetAHwFHyoHEqrcB3NpijFv9nLP5h9CXtT0=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0 h1:bfdsbTARDjaC/dSYGMO+E0psxFU4hTvCLnqYAfZ3D38=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8=
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.0/go.mod h1:Jg8XVv5M2V2wiAMvBFx+O59jg6Yr8vhP0bgNF/IuquM=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4=
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0 h1:21tlTXq3ev10yLMAjXZzpkZbrl49h3ElSjmxD57tD/E=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE=
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.4.0/go.mod h1:d9YrBHJhyzDCv5UsEVRizHlFV6Q0sLemFq6uxuqWfUw=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.6 h1:wmGLw2i8ZTlHLw7a9ULGfQbuccw8uIiNr6sol5bFzc8=
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.0 h1:NpsAO1LaZyc72xMoQB/qgcOwI9Ag1d5FvaEp+omzFqg=
|
||||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.6/go.mod h1:Q0Hq2X/NuL7z8b1Dww8rmOFl+jzusKEcyvkKspwdpyc=
|
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.0/go.mod h1:6WVV80e6jigvvX0QqFDx3tjUME7qtNV9AJqGAZyc/R8=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15 h1:7R8uRYyXzdD71KWVCL78lJZltah6VVznXBazvKjfH58=
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0 h1:CJxo7ZBbaIzmXfV3hjcx36n9V87gJsIUPJflwqEHl3Q=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.15/go.mod h1:26SQUPcTNgV1Tapwdt4a1rOsYRsnBsJHLMPoxK2b0d8=
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.0/go.mod h1:yjVfjuY4nD1EW9i387Kau+I6V5cBA5YnC/mWNopjZrI=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.38 h1:skaFGzv+3kA+v2BPKhuekeb1Hbb105+44r8ASC+q5SE=
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.0 h1:Wnw0IZKxx/PlKWbrUssl3Z2FP7cJS30QAeN1MuDVh1Q=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.38/go.mod h1:epIZoRSSbRIwLPJU5F+OldHhwZPBdpDeQkRdCeY3+00=
|
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.0/go.mod h1:3ZHaPNnLwe0E+gAvdlA3Tl7M3SHohQloXL4hiDk1nec=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0 h1:dJnwy5Awv+uvfk73aRENVbv1cSQQ60ydCkPaun097KM=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck=
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.0/go.mod h1:RsPWWy7u/hwmFX57sQ7MLvrvJeYyNkiMm5BaavpoU18=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.6 h1:9ulSU5ClouoPIYhDQdg9tpl83d5Yb91PXTKK+17q+ow=
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.0 h1:Kcts/mLwm4LxbF8YULGzilm+IeI4cBoesFUJpSsCcx0=
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.6/go.mod h1:lnc2taBsR9nTlz9meD+lhFZZ9EWY712QHrRflWpTcOA=
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.0/go.mod h1:ca7+eyqTRByXctslWXXqhSwItEk+4y30azwLYJBBlsU=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.40.2 h1:Ll5/YVCOzRB+gxPqs2uD0R7/MyATC0w85626glSKmp4=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.41.0 h1:XJfQwEGLnoqdVQtf+faXr7DMm/Q65SkgnGZJKWxIkPc=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.40.2/go.mod h1:Zjfqt7KhQK+PO1bbOsFNzKgaq7TcxzmEoDWN8lM0qzQ=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.41.0/go.mod h1:DDsTwoAqmg5h2Up70/2XeCA4woeYdaD71PRucUwltFM=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.16.0 h1:ZIlR6Wr/EgYwBdEz1NWBqdUsTh0mV7A68pId3YZl6H0=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.16.0/go.mod h1:O7B5cpuhhJKefAKkM7onb0McmpHyKnsH4RrHJhOyq7M=
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk=
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0 h1:3BZyJei4k1SHdSAFhg9Qg15NnG3v5zosZyFWPm7df/A=
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg=
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.18.0/go.mod h1:Td8EvzggonY02wLaqSpwybI3GbmA0PWoprKGil2uwJg=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.24.0 h1:f/V5Y9OaHuNRrA9MntNQNAtMFXqhKj8HTEPnH81eXMI=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ=
|
github.com/aws/aws-sdk-go-v2/service/sts v1.24.0/go.mod h1:HnCUMNz2XqwnEEk5X6oeDYB2HgOLFpJ/LyfilN8WErs=
|
||||||
github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8=
|
github.com/aws/smithy-go v1.16.0 h1:gJZEH/Fqh+RsvlJ1Zt4tVAtV6bKkp3cC+R6FCZMNzik=
|
||||||
github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
|
github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bmatcuk/doublestar/v4 v4.6.0 h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc=
|
github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
|
||||||
github.com/bmatcuk/doublestar/v4 v4.6.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
||||||
|
@ -186,8 +186,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
|
||||||
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
|
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
|
||||||
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
|
||||||
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ=
|
github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ=
|
||||||
|
@ -250,9 +250,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
|
||||||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
|
@ -271,10 +269,10 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4
|
||||||
github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
|
github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
|
||||||
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
|
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
|
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
|
||||||
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.3.1 h1:SBWmZhjUDRorQxrN0nwzf+AHBxnbFjViHQS4P0yVpmQ=
|
github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.3.1/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
|
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=
|
github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas=
|
||||||
|
@ -323,8 +321,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
|
||||||
github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||||
github.com/klauspost/compress v1.17.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g=
|
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
|
||||||
github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||||
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00=
|
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
@ -341,13 +339,13 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0
|
||||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||||
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||||
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
|
||||||
github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||||
|
@ -392,8 +390,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
|
||||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||||
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
|
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
|
||||||
github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
|
github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
|
||||||
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
|
github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM=
|
||||||
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
|
github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY=
|
||||||
github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
|
github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
|
||||||
github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
|
github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
@ -463,10 +461,10 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||||
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
||||||
go.opentelemetry.io/collector/pdata v1.0.0-rcv0016 h1:qCPXSQCoD3qeWFb1RuIks8fw9Atxpk78bmtVdi15KhE=
|
go.opentelemetry.io/collector/pdata v1.0.0-rcv0017 h1:AgALhc2VenoA5l1DvTdg7mkzaBGqoTSuMkAtjsttBFo=
|
||||||
go.opentelemetry.io/collector/pdata v1.0.0-rcv0016/go.mod h1:OdN0alYOlYhHXu6BDlGehrZWgtBuiDsz/rlNeJeXiNg=
|
go.opentelemetry.io/collector/pdata v1.0.0-rcv0017/go.mod h1:Rv9fOclA5AtM/JGm0d4jBOIAo1+jBA13UT5Bx0ovXi4=
|
||||||
go.opentelemetry.io/collector/semconv v0.87.0 h1:BsG1jdLLRCBRlvUujk4QA86af7r/ZXnizczQpEs/gg8=
|
go.opentelemetry.io/collector/semconv v0.88.0 h1:8TVP4hYaUC87S6CCLKNoSxsUE0ChldE4vqotvNHHUnE=
|
||||||
go.opentelemetry.io/collector/semconv v0.87.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw=
|
go.opentelemetry.io/collector/semconv v0.88.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q=
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q=
|
||||||
go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
|
go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
|
||||||
|
@ -477,8 +475,8 @@ go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1
|
||||||
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
|
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
|
||||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
||||||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
||||||
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
@ -559,7 +557,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
|
||||||
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
|
|
||||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
@ -625,7 +622,6 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
@ -634,7 +630,6 @@ golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
|
||||||
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
|
golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
@ -644,7 +639,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/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/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||||
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|
||||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
@ -718,8 +712,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M
|
||||||
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||||
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||||
google.golang.org/api v0.147.0 h1:Can3FaQo9LlVqxJCodNmeZW/ib3/qKAY3rFeXiHo5gc=
|
google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY=
|
||||||
google.golang.org/api v0.147.0/go.mod h1:pQ/9j83DcmPd/5C9e2nFOdjjNkDZ1G+zkbK2uvdkJMs=
|
google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
@ -757,12 +751,12 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
|
||||||
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8=
|
google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U=
|
||||||
google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE=
|
google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a h1:myvhA4is3vrit1a6NZCWBIwN0kNEnX21DJOJX/NvIfI=
|
google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405 h1:HJMDndgxest5n2y77fnErkM62iUsptE/H8p0dC2Huo4=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww=
|
google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a h1:a2MQQVoTo96JC9PMGtGBymLp7+/RzpFc2yX/9WfFg1c=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
|
@ -776,8 +770,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji
|
||||||
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ=
|
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
|
||||||
google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
|
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
|
|
2
vendor/cloud.google.com/go/compute/internal/version.go
generated
vendored
2
vendor/cloud.google.com/go/compute/internal/version.go
generated
vendored
|
@ -15,4 +15,4 @@
|
||||||
package internal
|
package internal
|
||||||
|
|
||||||
// Version is the current tagged release of the library.
|
// Version is the current tagged release of the library.
|
||||||
const Version = "1.23.1"
|
const Version = "1.23.2"
|
||||||
|
|
7
vendor/cloud.google.com/go/iam/CHANGES.md
generated
vendored
7
vendor/cloud.google.com/go/iam/CHANGES.md
generated
vendored
|
@ -1,6 +1,13 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
|
||||||
|
## [1.1.4](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.3...iam/v1.1.4) (2023-10-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **iam:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7))
|
||||||
|
|
||||||
## [1.1.3](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.2...iam/v1.1.3) (2023-10-12)
|
## [1.1.3](https://github.com/googleapis/google-cloud-go/compare/iam/v1.1.2...iam/v1.1.3) (2023-10-12)
|
||||||
|
|
||||||
|
|
||||||
|
|
78
vendor/cloud.google.com/go/internal/.repo-metadata-full.json
generated
vendored
78
vendor/cloud.google.com/go/internal/.repo-metadata-full.json
generated
vendored
|
@ -89,6 +89,16 @@
|
||||||
"release_level": "preview",
|
"release_level": "preview",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/alloydb/connectors/apiv1": {
|
||||||
|
"api_shortname": "connectors",
|
||||||
|
"distribution_name": "cloud.google.com/go/alloydb/connectors/apiv1",
|
||||||
|
"description": "AlloyDB connectors",
|
||||||
|
"language": "go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1",
|
||||||
|
"release_level": "preview",
|
||||||
|
"library_type": "GAPIC_AUTO"
|
||||||
|
},
|
||||||
"cloud.google.com/go/alloydb/connectors/apiv1alpha": {
|
"cloud.google.com/go/alloydb/connectors/apiv1alpha": {
|
||||||
"api_shortname": "connectors",
|
"api_shortname": "connectors",
|
||||||
"distribution_name": "cloud.google.com/go/alloydb/connectors/apiv1alpha",
|
"distribution_name": "cloud.google.com/go/alloydb/connectors/apiv1alpha",
|
||||||
|
@ -99,6 +109,16 @@
|
||||||
"release_level": "preview",
|
"release_level": "preview",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/alloydb/connectors/apiv1beta": {
|
||||||
|
"api_shortname": "connectors",
|
||||||
|
"distribution_name": "cloud.google.com/go/alloydb/connectors/apiv1beta",
|
||||||
|
"description": "AlloyDB connectors",
|
||||||
|
"language": "go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/alloydb/latest/connectors/apiv1beta",
|
||||||
|
"release_level": "preview",
|
||||||
|
"library_type": "GAPIC_AUTO"
|
||||||
|
},
|
||||||
"cloud.google.com/go/analytics/admin/apiv1alpha": {
|
"cloud.google.com/go/analytics/admin/apiv1alpha": {
|
||||||
"api_shortname": "analyticsadmin",
|
"api_shortname": "analyticsadmin",
|
||||||
"distribution_name": "cloud.google.com/go/analytics/admin/apiv1alpha",
|
"distribution_name": "cloud.google.com/go/analytics/admin/apiv1alpha",
|
||||||
|
@ -136,7 +156,7 @@
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigeeregistry/latest/apiv1",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/apigeeregistry/latest/apiv1",
|
||||||
"release_level": "preview",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/apikeys/apiv2": {
|
"cloud.google.com/go/apikeys/apiv2": {
|
||||||
|
@ -356,7 +376,7 @@
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/biglake/apiv1",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/bigquery/latest/biglake/apiv1",
|
||||||
"release_level": "preview",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/bigquery/biglake/apiv1alpha1": {
|
"cloud.google.com/go/bigquery/biglake/apiv1alpha1": {
|
||||||
|
@ -715,7 +735,7 @@
|
||||||
"description": "Container Analysis API",
|
"description": "Container Analysis API",
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/containeranalysis/apiv1beta1",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/containeranalysis/latest/apiv1beta1",
|
||||||
"release_level": "preview",
|
"release_level": "preview",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
|
@ -1286,7 +1306,7 @@
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv2",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/language/latest/apiv2",
|
||||||
"release_level": "preview",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/lifesciences/apiv2beta": {
|
"cloud.google.com/go/lifesciences/apiv2beta": {
|
||||||
|
@ -1349,6 +1369,26 @@
|
||||||
"release_level": "stable",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/maps/fleetengine/apiv1": {
|
||||||
|
"api_shortname": "fleetengine",
|
||||||
|
"distribution_name": "cloud.google.com/go/maps/fleetengine/apiv1",
|
||||||
|
"description": "Local Rides and Deliveries API",
|
||||||
|
"language": "go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/fleetengine/apiv1",
|
||||||
|
"release_level": "stable",
|
||||||
|
"library_type": "GAPIC_AUTO"
|
||||||
|
},
|
||||||
|
"cloud.google.com/go/maps/fleetengine/delivery/apiv1": {
|
||||||
|
"api_shortname": "fleetengine",
|
||||||
|
"distribution_name": "cloud.google.com/go/maps/fleetengine/delivery/apiv1",
|
||||||
|
"description": "Last Mile Fleet Solution Delivery API",
|
||||||
|
"language": "go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/maps/latest/fleetengine/delivery/apiv1",
|
||||||
|
"release_level": "stable",
|
||||||
|
"library_type": "GAPIC_AUTO"
|
||||||
|
},
|
||||||
"cloud.google.com/go/maps/mapsplatformdatasets/apiv1alpha": {
|
"cloud.google.com/go/maps/mapsplatformdatasets/apiv1alpha": {
|
||||||
"api_shortname": "mapsplatformdatasets",
|
"api_shortname": "mapsplatformdatasets",
|
||||||
"distribution_name": "cloud.google.com/go/maps/mapsplatformdatasets/apiv1alpha",
|
"distribution_name": "cloud.google.com/go/maps/mapsplatformdatasets/apiv1alpha",
|
||||||
|
@ -1556,7 +1596,7 @@
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv2",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/notebooks/latest/apiv2",
|
||||||
"release_level": "preview",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/optimization/apiv1": {
|
"cloud.google.com/go/optimization/apiv1": {
|
||||||
|
@ -1676,7 +1716,7 @@
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/policysimulator/latest/apiv1",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/policysimulator/latest/apiv1",
|
||||||
"release_level": "preview",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/policytroubleshooter/apiv1": {
|
"cloud.google.com/go/policytroubleshooter/apiv1": {
|
||||||
|
@ -1696,7 +1736,7 @@
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/policytroubleshooter/latest/iam/apiv3",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/policytroubleshooter/latest/iam/apiv3",
|
||||||
"release_level": "preview",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/privatecatalog/apiv1beta1": {
|
"cloud.google.com/go/privatecatalog/apiv1beta1": {
|
||||||
|
@ -1949,6 +1989,16 @@
|
||||||
"release_level": "stable",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/securesourcemanager/apiv1": {
|
||||||
|
"api_shortname": "securesourcemanager",
|
||||||
|
"distribution_name": "cloud.google.com/go/securesourcemanager/apiv1",
|
||||||
|
"description": "Secure Source Manager API",
|
||||||
|
"language": "go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/securesourcemanager/latest/apiv1",
|
||||||
|
"release_level": "preview",
|
||||||
|
"library_type": "GAPIC_AUTO"
|
||||||
|
},
|
||||||
"cloud.google.com/go/security/privateca/apiv1": {
|
"cloud.google.com/go/security/privateca/apiv1": {
|
||||||
"api_shortname": "privateca",
|
"api_shortname": "privateca",
|
||||||
"distribution_name": "cloud.google.com/go/security/privateca/apiv1",
|
"distribution_name": "cloud.google.com/go/security/privateca/apiv1",
|
||||||
|
@ -2069,6 +2119,16 @@
|
||||||
"release_level": "stable",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
|
"cloud.google.com/go/shopping/merchant/inventories/apiv1beta": {
|
||||||
|
"api_shortname": "merchantapi",
|
||||||
|
"distribution_name": "cloud.google.com/go/shopping/merchant/inventories/apiv1beta",
|
||||||
|
"description": "Merchant API",
|
||||||
|
"language": "go",
|
||||||
|
"client_library_type": "generated",
|
||||||
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/shopping/latest/merchant/inventories/apiv1beta",
|
||||||
|
"release_level": "preview",
|
||||||
|
"library_type": "GAPIC_AUTO"
|
||||||
|
},
|
||||||
"cloud.google.com/go/spanner": {
|
"cloud.google.com/go/spanner": {
|
||||||
"api_shortname": "spanner",
|
"api_shortname": "spanner",
|
||||||
"distribution_name": "cloud.google.com/go/spanner",
|
"distribution_name": "cloud.google.com/go/spanner",
|
||||||
|
@ -2275,8 +2335,8 @@
|
||||||
"description": "Video Stitcher API",
|
"description": "Video Stitcher API",
|
||||||
"language": "go",
|
"language": "go",
|
||||||
"client_library_type": "generated",
|
"client_library_type": "generated",
|
||||||
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/latest/video/stitcher/apiv1",
|
"client_documentation": "https://cloud.google.com/go/docs/reference/cloud.google.com/go/video/latest/stitcher/apiv1",
|
||||||
"release_level": "preview",
|
"release_level": "stable",
|
||||||
"library_type": "GAPIC_AUTO"
|
"library_type": "GAPIC_AUTO"
|
||||||
},
|
},
|
||||||
"cloud.google.com/go/video/transcoder/apiv1": {
|
"cloud.google.com/go/video/transcoder/apiv1": {
|
||||||
|
|
19
vendor/cloud.google.com/go/storage/CHANGES.md
generated
vendored
19
vendor/cloud.google.com/go/storage/CHANGES.md
generated
vendored
|
@ -1,6 +1,25 @@
|
||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
|
||||||
|
## [1.34.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.33.0...storage/v1.34.0) (2023-10-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **storage/internal:** Add match_glob field to ListObjectsRequest ([#8618](https://github.com/googleapis/google-cloud-go/issues/8618)) ([e9ae601](https://github.com/googleapis/google-cloud-go/commit/e9ae6018983ae09781740e4ff939e6e365863dbb))
|
||||||
|
* **storage/internal:** Add terminal_storage_class fields to Autoclass message ([57fc1a6](https://github.com/googleapis/google-cloud-go/commit/57fc1a6de326456eb68ef25f7a305df6636ed386))
|
||||||
|
* **storage/internal:** Adds the RestoreObject operation ([56ce871](https://github.com/googleapis/google-cloud-go/commit/56ce87195320634b07ae0b012efcc5f2b3813fb0))
|
||||||
|
* **storage:** Support autoclass v2.1 ([#8721](https://github.com/googleapis/google-cloud-go/issues/8721)) ([fe1e195](https://github.com/googleapis/google-cloud-go/commit/fe1e19590a252c6adc6ca6c51a69b6e561e143b8))
|
||||||
|
* **storage:** Support MatchGlob for gRPC ([#8670](https://github.com/googleapis/google-cloud-go/issues/8670)) ([3df0287](https://github.com/googleapis/google-cloud-go/commit/3df0287f88d5e2c4526e9e6b8dc2a4ca54f88918)), refs [#7727](https://github.com/googleapis/google-cloud-go/issues/7727)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **storage:** Drop stream reference after closing it for gRPC writes ([#8872](https://github.com/googleapis/google-cloud-go/issues/8872)) ([525abde](https://github.com/googleapis/google-cloud-go/commit/525abdee433864d4d456f1f1fff5599017b557ff))
|
||||||
|
* **storage:** Update golang.org/x/net to v0.17.0 ([174da47](https://github.com/googleapis/google-cloud-go/commit/174da47254fefb12921bbfc65b7829a453af6f5d))
|
||||||
|
* **storage:** Update grpc-go to v1.56.3 ([343cea8](https://github.com/googleapis/google-cloud-go/commit/343cea8c43b1e31ae21ad50ad31d3b0b60143f8c))
|
||||||
|
* **storage:** Update grpc-go to v1.59.0 ([81a97b0](https://github.com/googleapis/google-cloud-go/commit/81a97b06cb28b25432e4ece595c55a9857e960b7))
|
||||||
|
|
||||||
## [1.33.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.32.0...storage/v1.33.0) (2023-09-07)
|
## [1.33.0](https://github.com/googleapis/google-cloud-go/compare/storage/v1.32.0...storage/v1.33.0) (2023-09-07)
|
||||||
|
|
||||||
|
|
||||||
|
|
51
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
51
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
|
@ -740,6 +740,13 @@ type Autoclass struct {
|
||||||
// If Autoclass is enabled when the bucket is created, the ToggleTime
|
// If Autoclass is enabled when the bucket is created, the ToggleTime
|
||||||
// is set to the bucket creation time. This field is read-only.
|
// is set to the bucket creation time. This field is read-only.
|
||||||
ToggleTime time.Time
|
ToggleTime time.Time
|
||||||
|
// TerminalStorageClass: The storage class that objects in the bucket
|
||||||
|
// eventually transition to if they are not read for a certain length of
|
||||||
|
// time. Valid values are NEARLINE and ARCHIVE.
|
||||||
|
TerminalStorageClass string
|
||||||
|
// TerminalStorageClassUpdateTime represents the time of the most recent
|
||||||
|
// update to "TerminalStorageClass".
|
||||||
|
TerminalStorageClassUpdateTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBucket(b *raw.Bucket) (*BucketAttrs, error) {
|
func newBucket(b *raw.Bucket) (*BucketAttrs, error) {
|
||||||
|
@ -1241,9 +1248,11 @@ func (ua *BucketAttrsToUpdate) toRawBucket() *raw.Bucket {
|
||||||
}
|
}
|
||||||
if ua.Autoclass != nil {
|
if ua.Autoclass != nil {
|
||||||
rb.Autoclass = &raw.BucketAutoclass{
|
rb.Autoclass = &raw.BucketAutoclass{
|
||||||
Enabled: ua.Autoclass.Enabled,
|
Enabled: ua.Autoclass.Enabled,
|
||||||
ForceSendFields: []string{"Enabled"},
|
TerminalStorageClass: ua.Autoclass.TerminalStorageClass,
|
||||||
|
ForceSendFields: []string{"Enabled"},
|
||||||
}
|
}
|
||||||
|
rb.ForceSendFields = append(rb.ForceSendFields, "Autoclass")
|
||||||
}
|
}
|
||||||
if ua.PredefinedACL != "" {
|
if ua.PredefinedACL != "" {
|
||||||
// Clear ACL or the call will fail.
|
// Clear ACL or the call will fail.
|
||||||
|
@ -1954,9 +1963,10 @@ func (a *Autoclass) toRawAutoclass() *raw.BucketAutoclass {
|
||||||
if a == nil {
|
if a == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Excluding read only field ToggleTime.
|
// Excluding read only fields ToggleTime and TerminalStorageClassUpdateTime.
|
||||||
return &raw.BucketAutoclass{
|
return &raw.BucketAutoclass{
|
||||||
Enabled: a.Enabled,
|
Enabled: a.Enabled,
|
||||||
|
TerminalStorageClass: a.TerminalStorageClass,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1964,27 +1974,34 @@ func (a *Autoclass) toProtoAutoclass() *storagepb.Bucket_Autoclass {
|
||||||
if a == nil {
|
if a == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Excluding read only field ToggleTime.
|
// Excluding read only fields ToggleTime and TerminalStorageClassUpdateTime.
|
||||||
return &storagepb.Bucket_Autoclass{
|
ba := &storagepb.Bucket_Autoclass{
|
||||||
Enabled: a.Enabled,
|
Enabled: a.Enabled,
|
||||||
}
|
}
|
||||||
|
if a.TerminalStorageClass != "" {
|
||||||
|
ba.TerminalStorageClass = &a.TerminalStorageClass
|
||||||
|
}
|
||||||
|
return ba
|
||||||
}
|
}
|
||||||
|
|
||||||
func toAutoclassFromRaw(a *raw.BucketAutoclass) *Autoclass {
|
func toAutoclassFromRaw(a *raw.BucketAutoclass) *Autoclass {
|
||||||
if a == nil || a.ToggleTime == "" {
|
if a == nil || a.ToggleTime == "" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// Return Autoclass.ToggleTime only if parsed with a valid value.
|
ac := &Autoclass{
|
||||||
|
Enabled: a.Enabled,
|
||||||
|
TerminalStorageClass: a.TerminalStorageClass,
|
||||||
|
}
|
||||||
|
// Return ToggleTime and TSCUpdateTime only if parsed with valid values.
|
||||||
t, err := time.Parse(time.RFC3339, a.ToggleTime)
|
t, err := time.Parse(time.RFC3339, a.ToggleTime)
|
||||||
if err != nil {
|
if err == nil {
|
||||||
return &Autoclass{
|
ac.ToggleTime = t
|
||||||
Enabled: a.Enabled,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return &Autoclass{
|
ut, err := time.Parse(time.RFC3339, a.TerminalStorageClassUpdateTime)
|
||||||
Enabled: a.Enabled,
|
if err == nil {
|
||||||
ToggleTime: t,
|
ac.TerminalStorageClassUpdateTime = ut
|
||||||
}
|
}
|
||||||
|
return ac
|
||||||
}
|
}
|
||||||
|
|
||||||
func toAutoclassFromProto(a *storagepb.Bucket_Autoclass) *Autoclass {
|
func toAutoclassFromProto(a *storagepb.Bucket_Autoclass) *Autoclass {
|
||||||
|
@ -1992,8 +2009,10 @@ func toAutoclassFromProto(a *storagepb.Bucket_Autoclass) *Autoclass {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &Autoclass{
|
return &Autoclass{
|
||||||
Enabled: a.GetEnabled(),
|
Enabled: a.GetEnabled(),
|
||||||
ToggleTime: a.GetToggleTime().AsTime(),
|
ToggleTime: a.GetToggleTime().AsTime(),
|
||||||
|
TerminalStorageClass: a.GetTerminalStorageClass(),
|
||||||
|
TerminalStorageClassUpdateTime: a.GetTerminalStorageClassUpdateTime().AsTime(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
150
vendor/cloud.google.com/go/storage/grpc_client.go
generated
vendored
150
vendor/cloud.google.com/go/storage/grpc_client.go
generated
vendored
|
@ -141,11 +141,11 @@ func (c *grpcStorageClient) GetServiceAccount(ctx context.Context, project strin
|
||||||
Project: toProjectResource(project),
|
Project: toProjectResource(project),
|
||||||
}
|
}
|
||||||
var resp *storagepb.ServiceAccount
|
var resp *storagepb.ServiceAccount
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
resp, err = c.raw.GetServiceAccount(ctx, req, s.gax...)
|
resp, err = c.raw.GetServiceAccount(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -173,13 +173,13 @@ func (c *grpcStorageClient) CreateBucket(ctx context.Context, project, bucket st
|
||||||
}
|
}
|
||||||
|
|
||||||
var battrs *BucketAttrs
|
var battrs *BucketAttrs
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
res, err := c.raw.CreateBucket(ctx, req, s.gax...)
|
res, err := c.raw.CreateBucket(ctx, req, s.gax...)
|
||||||
|
|
||||||
battrs = newBucketFromProto(res)
|
battrs = newBucketFromProto(res)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
|
|
||||||
return battrs, err
|
return battrs, err
|
||||||
}
|
}
|
||||||
|
@ -193,26 +193,26 @@ func (c *grpcStorageClient) ListBuckets(ctx context.Context, project string, opt
|
||||||
|
|
||||||
var gitr *gapic.BucketIterator
|
var gitr *gapic.BucketIterator
|
||||||
fetch := func(pageSize int, pageToken string) (token string, err error) {
|
fetch := func(pageSize int, pageToken string) (token string, err error) {
|
||||||
// Initialize GAPIC-based iterator when pageToken is empty, which
|
|
||||||
// indicates that this fetch call is attempting to get the first page.
|
|
||||||
//
|
|
||||||
// Note: Initializing the GAPIC-based iterator lazily is necessary to
|
|
||||||
// capture the BucketIterator.Prefix set by the user *after* the
|
|
||||||
// BucketIterator is returned to them from the veneer.
|
|
||||||
if pageToken == "" {
|
|
||||||
req := &storagepb.ListBucketsRequest{
|
|
||||||
Parent: toProjectResource(it.projectID),
|
|
||||||
Prefix: it.Prefix,
|
|
||||||
}
|
|
||||||
gitr = c.raw.ListBuckets(it.ctx, req, s.gax...)
|
|
||||||
}
|
|
||||||
|
|
||||||
var buckets []*storagepb.Bucket
|
var buckets []*storagepb.Bucket
|
||||||
var next string
|
var next string
|
||||||
err = run(it.ctx, func() error {
|
err = run(it.ctx, func(ctx context.Context) error {
|
||||||
|
// Initialize GAPIC-based iterator when pageToken is empty, which
|
||||||
|
// indicates that this fetch call is attempting to get the first page.
|
||||||
|
//
|
||||||
|
// Note: Initializing the GAPIC-based iterator lazily is necessary to
|
||||||
|
// capture the BucketIterator.Prefix set by the user *after* the
|
||||||
|
// BucketIterator is returned to them from the veneer.
|
||||||
|
if pageToken == "" {
|
||||||
|
req := &storagepb.ListBucketsRequest{
|
||||||
|
Parent: toProjectResource(it.projectID),
|
||||||
|
Prefix: it.Prefix,
|
||||||
|
}
|
||||||
|
gitr = c.raw.ListBuckets(ctx, req, s.gax...)
|
||||||
|
}
|
||||||
buckets, next, err = gitr.InternalFetch(pageSize, pageToken)
|
buckets, next, err = gitr.InternalFetch(pageSize, pageToken)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -246,9 +246,9 @@ func (c *grpcStorageClient) DeleteBucket(ctx context.Context, bucket string, con
|
||||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||||
}
|
}
|
||||||
|
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
return c.raw.DeleteBucket(ctx, req, s.gax...)
|
return c.raw.DeleteBucket(ctx, req, s.gax...)
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *grpcStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {
|
func (c *grpcStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {
|
||||||
|
@ -265,13 +265,13 @@ func (c *grpcStorageClient) GetBucket(ctx context.Context, bucket string, conds
|
||||||
}
|
}
|
||||||
|
|
||||||
var battrs *BucketAttrs
|
var battrs *BucketAttrs
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
res, err := c.raw.GetBucket(ctx, req, s.gax...)
|
res, err := c.raw.GetBucket(ctx, req, s.gax...)
|
||||||
|
|
||||||
battrs = newBucketFromProto(res)
|
battrs = newBucketFromProto(res)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
|
|
||||||
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
|
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
|
||||||
return nil, ErrBucketNotExist
|
return nil, ErrBucketNotExist
|
||||||
|
@ -369,11 +369,11 @@ func (c *grpcStorageClient) UpdateBucket(ctx context.Context, bucket string, uat
|
||||||
req.UpdateMask = fieldMask
|
req.UpdateMask = fieldMask
|
||||||
|
|
||||||
var battrs *BucketAttrs
|
var battrs *BucketAttrs
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
res, err := c.raw.UpdateBucket(ctx, req, s.gax...)
|
res, err := c.raw.UpdateBucket(ctx, req, s.gax...)
|
||||||
battrs = newBucketFromProto(res)
|
battrs = newBucketFromProto(res)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
|
|
||||||
return battrs, err
|
return battrs, err
|
||||||
}
|
}
|
||||||
|
@ -386,10 +386,10 @@ func (c *grpcStorageClient) LockBucketRetentionPolicy(ctx context.Context, bucke
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
_, err := c.raw.LockBucketRetentionPolicy(ctx, req, s.gax...)
|
_, err := c.raw.LockBucketRetentionPolicy(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
|
|
||||||
}
|
}
|
||||||
func (c *grpcStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator {
|
func (c *grpcStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator {
|
||||||
|
@ -408,23 +408,21 @@ func (c *grpcStorageClient) ListObjects(ctx context.Context, bucket string, q *Q
|
||||||
LexicographicStart: it.query.StartOffset,
|
LexicographicStart: it.query.StartOffset,
|
||||||
LexicographicEnd: it.query.EndOffset,
|
LexicographicEnd: it.query.EndOffset,
|
||||||
IncludeTrailingDelimiter: it.query.IncludeTrailingDelimiter,
|
IncludeTrailingDelimiter: it.query.IncludeTrailingDelimiter,
|
||||||
|
MatchGlob: it.query.MatchGlob,
|
||||||
ReadMask: q.toFieldMask(), // a nil Query still results in a "*" FieldMask
|
ReadMask: q.toFieldMask(), // a nil Query still results in a "*" FieldMask
|
||||||
}
|
}
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||||
}
|
}
|
||||||
gitr := c.raw.ListObjects(it.ctx, req, s.gax...)
|
|
||||||
fetch := func(pageSize int, pageToken string) (token string, err error) {
|
fetch := func(pageSize int, pageToken string) (token string, err error) {
|
||||||
// MatchGlob not yet supported for gRPC.
|
|
||||||
// TODO: add support when b/287306063 resolved.
|
|
||||||
if q != nil && q.MatchGlob != "" {
|
|
||||||
return "", status.Errorf(codes.Unimplemented, "MatchGlob is not supported for gRPC")
|
|
||||||
}
|
|
||||||
var objects []*storagepb.Object
|
var objects []*storagepb.Object
|
||||||
err = run(it.ctx, func() error {
|
var gitr *gapic.ObjectIterator
|
||||||
|
err = run(it.ctx, func(ctx context.Context) error {
|
||||||
|
gitr = c.raw.ListObjects(ctx, req, s.gax...)
|
||||||
|
it.ctx = ctx
|
||||||
objects, token, err = gitr.InternalFetch(pageSize, pageToken)
|
objects, token, err = gitr.InternalFetch(pageSize, pageToken)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if st, ok := status.FromError(err); ok && st.Code() == codes.NotFound {
|
if st, ok := status.FromError(err); ok && st.Code() == codes.NotFound {
|
||||||
err = ErrBucketNotExist
|
err = ErrBucketNotExist
|
||||||
|
@ -467,9 +465,9 @@ func (c *grpcStorageClient) DeleteObject(ctx context.Context, bucket, object str
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||||
}
|
}
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
return c.raw.DeleteObject(ctx, req, s.gax...)
|
return c.raw.DeleteObject(ctx, req, s.gax...)
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
|
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
|
||||||
return ErrObjectNotExist
|
return ErrObjectNotExist
|
||||||
}
|
}
|
||||||
|
@ -495,12 +493,12 @@ func (c *grpcStorageClient) GetObject(ctx context.Context, bucket, object string
|
||||||
}
|
}
|
||||||
|
|
||||||
var attrs *ObjectAttrs
|
var attrs *ObjectAttrs
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
res, err := c.raw.GetObject(ctx, req, s.gax...)
|
res, err := c.raw.GetObject(ctx, req, s.gax...)
|
||||||
attrs = newObjectFromProto(res)
|
attrs = newObjectFromProto(res)
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
|
|
||||||
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
|
if s, ok := status.FromError(err); ok && s.Code() == codes.NotFound {
|
||||||
return nil, ErrObjectNotExist
|
return nil, ErrObjectNotExist
|
||||||
|
@ -577,11 +575,11 @@ func (c *grpcStorageClient) UpdateObject(ctx context.Context, bucket, object str
|
||||||
req.UpdateMask = fieldMask
|
req.UpdateMask = fieldMask
|
||||||
|
|
||||||
var attrs *ObjectAttrs
|
var attrs *ObjectAttrs
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
res, err := c.raw.UpdateObject(ctx, req, s.gax...)
|
res, err := c.raw.UpdateObject(ctx, req, s.gax...)
|
||||||
attrs = newObjectFromProto(res)
|
attrs = newObjectFromProto(res)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if e, ok := status.FromError(err); ok && e.Code() == codes.NotFound {
|
if e, ok := status.FromError(err); ok && e.Code() == codes.NotFound {
|
||||||
return nil, ErrObjectNotExist
|
return nil, ErrObjectNotExist
|
||||||
}
|
}
|
||||||
|
@ -820,10 +818,10 @@ func (c *grpcStorageClient) ComposeObject(ctx context.Context, req *composeObjec
|
||||||
|
|
||||||
var obj *storagepb.Object
|
var obj *storagepb.Object
|
||||||
var err error
|
var err error
|
||||||
if err := run(ctx, func() error {
|
if err := run(ctx, func(ctx context.Context) error {
|
||||||
obj, err = c.raw.ComposeObject(ctx, rawReq, s.gax...)
|
obj, err = c.raw.ComposeObject(ctx, rawReq, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx)); err != nil {
|
}, s.retry, s.idempotent); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -870,9 +868,9 @@ func (c *grpcStorageClient) RewriteObject(ctx context.Context, req *rewriteObjec
|
||||||
var res *storagepb.RewriteResponse
|
var res *storagepb.RewriteResponse
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
retryCall := func() error { res, err = c.raw.RewriteObject(ctx, call, s.gax...); return err }
|
retryCall := func(ctx context.Context) error { res, err = c.raw.RewriteObject(ctx, call, s.gax...); return err }
|
||||||
|
|
||||||
if err := run(ctx, retryCall, s.retry, s.idempotent, setRetryHeaderGRPC(ctx)); err != nil {
|
if err := run(ctx, retryCall, s.retry, s.idempotent); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -936,7 +934,7 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
|
||||||
var msg *storagepb.ReadObjectResponse
|
var msg *storagepb.ReadObjectResponse
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
err = run(cc, func() error {
|
err = run(cc, func(ctx context.Context) error {
|
||||||
stream, err = c.raw.ReadObject(cc, req, s.gax...)
|
stream, err = c.raw.ReadObject(cc, req, s.gax...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -950,7 +948,7 @@ func (c *grpcStorageClient) NewRangeReader(ctx context.Context, params *newRange
|
||||||
}
|
}
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Close the stream context we just created to ensure we don't leak
|
// Close the stream context we just created to ensure we don't leak
|
||||||
// resources.
|
// resources.
|
||||||
|
@ -1112,11 +1110,11 @@ func (c *grpcStorageClient) GetIamPolicy(ctx context.Context, resource string, v
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
var rp *iampb.Policy
|
var rp *iampb.Policy
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
rp, err = c.raw.GetIamPolicy(ctx, req, s.gax...)
|
rp, err = c.raw.GetIamPolicy(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
|
|
||||||
return rp, err
|
return rp, err
|
||||||
}
|
}
|
||||||
|
@ -1130,10 +1128,10 @@ func (c *grpcStorageClient) SetIamPolicy(ctx context.Context, resource string, p
|
||||||
Policy: policy,
|
Policy: policy,
|
||||||
}
|
}
|
||||||
|
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
_, err := c.raw.SetIamPolicy(ctx, req, s.gax...)
|
_, err := c.raw.SetIamPolicy(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *grpcStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) {
|
func (c *grpcStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) {
|
||||||
|
@ -1144,11 +1142,11 @@ func (c *grpcStorageClient) TestIamPermissions(ctx context.Context, resource str
|
||||||
Permissions: permissions,
|
Permissions: permissions,
|
||||||
}
|
}
|
||||||
var res *iampb.TestIamPermissionsResponse
|
var res *iampb.TestIamPermissionsResponse
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
res, err = c.raw.TestIamPermissions(ctx, req, s.gax...)
|
res, err = c.raw.TestIamPermissions(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1167,11 +1165,11 @@ func (c *grpcStorageClient) GetHMACKey(ctx context.Context, project, accessID st
|
||||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||||
}
|
}
|
||||||
var metadata *storagepb.HmacKeyMetadata
|
var metadata *storagepb.HmacKeyMetadata
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
metadata, err = c.raw.GetHmacKey(ctx, req, s.gax...)
|
metadata, err = c.raw.GetHmacKey(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1193,13 +1191,13 @@ func (c *grpcStorageClient) ListHMACKeys(ctx context.Context, project, serviceAc
|
||||||
projectID: project,
|
projectID: project,
|
||||||
retry: s.retry,
|
retry: s.retry,
|
||||||
}
|
}
|
||||||
gitr := c.raw.ListHmacKeys(it.ctx, req, s.gax...)
|
|
||||||
fetch := func(pageSize int, pageToken string) (token string, err error) {
|
fetch := func(pageSize int, pageToken string) (token string, err error) {
|
||||||
var hmacKeys []*storagepb.HmacKeyMetadata
|
var hmacKeys []*storagepb.HmacKeyMetadata
|
||||||
err = run(it.ctx, func() error {
|
err = run(it.ctx, func(ctx context.Context) error {
|
||||||
|
gitr := c.raw.ListHmacKeys(ctx, req, s.gax...)
|
||||||
hmacKeys, token, err = gitr.InternalFetch(pageSize, pageToken)
|
hmacKeys, token, err = gitr.InternalFetch(pageSize, pageToken)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -1246,11 +1244,11 @@ func (c *grpcStorageClient) UpdateHMACKey(ctx context.Context, project, serviceA
|
||||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||||
}
|
}
|
||||||
var metadata *storagepb.HmacKeyMetadata
|
var metadata *storagepb.HmacKeyMetadata
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
metadata, err = c.raw.UpdateHmacKey(ctx, req, s.gax...)
|
metadata, err = c.raw.UpdateHmacKey(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1267,11 +1265,11 @@ func (c *grpcStorageClient) CreateHMACKey(ctx context.Context, project, serviceA
|
||||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||||
}
|
}
|
||||||
var res *storagepb.CreateHmacKeyResponse
|
var res *storagepb.CreateHmacKeyResponse
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
res, err = c.raw.CreateHmacKey(ctx, req, s.gax...)
|
res, err = c.raw.CreateHmacKey(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1290,9 +1288,9 @@ func (c *grpcStorageClient) DeleteHMACKey(ctx context.Context, project string, a
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
ctx = setUserProjectMetadata(ctx, s.userProject)
|
ctx = setUserProjectMetadata(ctx, s.userProject)
|
||||||
}
|
}
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
return c.raw.DeleteHmacKey(ctx, req, s.gax...)
|
return c.raw.DeleteHmacKey(ctx, req, s.gax...)
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notification methods.
|
// Notification methods.
|
||||||
|
@ -1309,7 +1307,7 @@ func (c *grpcStorageClient) ListNotifications(ctx context.Context, bucket string
|
||||||
Parent: bucketResourceName(globalProjectAlias, bucket),
|
Parent: bucketResourceName(globalProjectAlias, bucket),
|
||||||
}
|
}
|
||||||
var notifications []*storagepb.NotificationConfig
|
var notifications []*storagepb.NotificationConfig
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
gitr := c.raw.ListNotificationConfigs(ctx, req, s.gax...)
|
gitr := c.raw.ListNotificationConfigs(ctx, req, s.gax...)
|
||||||
for {
|
for {
|
||||||
// PageSize is not set and fallbacks to the API default pageSize of 100.
|
// PageSize is not set and fallbacks to the API default pageSize of 100.
|
||||||
|
@ -1324,7 +1322,7 @@ func (c *grpcStorageClient) ListNotifications(ctx context.Context, bucket string
|
||||||
}
|
}
|
||||||
req.PageToken = nextPageToken
|
req.PageToken = nextPageToken
|
||||||
}
|
}
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1342,11 +1340,11 @@ func (c *grpcStorageClient) CreateNotification(ctx context.Context, bucket strin
|
||||||
NotificationConfig: toProtoNotification(n),
|
NotificationConfig: toProtoNotification(n),
|
||||||
}
|
}
|
||||||
var pbn *storagepb.NotificationConfig
|
var pbn *storagepb.NotificationConfig
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
pbn, err = c.raw.CreateNotificationConfig(ctx, req, s.gax...)
|
pbn, err = c.raw.CreateNotificationConfig(ctx, req, s.gax...)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1359,9 +1357,9 @@ func (c *grpcStorageClient) DeleteNotification(ctx context.Context, bucket strin
|
||||||
|
|
||||||
s := callSettings(c.settings, opts...)
|
s := callSettings(c.settings, opts...)
|
||||||
req := &storagepb.DeleteNotificationConfigRequest{Name: id}
|
req := &storagepb.DeleteNotificationConfigRequest{Name: id}
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
return c.raw.DeleteNotificationConfig(ctx, req, s.gax...)
|
return c.raw.DeleteNotificationConfig(ctx, req, s.gax...)
|
||||||
}, s.retry, s.idempotent, setRetryHeaderGRPC(ctx))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// setUserProjectMetadata appends a project ID to the outgoing Context metadata
|
// setUserProjectMetadata appends a project ID to the outgoing Context metadata
|
||||||
|
@ -1560,24 +1558,24 @@ func (w *gRPCWriter) startResumableUpload() error {
|
||||||
// the upload, but in the future, we must also support sending it
|
// the upload, but in the future, we must also support sending it
|
||||||
// on the *last* message of the stream.
|
// on the *last* message of the stream.
|
||||||
req.ObjectChecksums = toProtoChecksums(w.sendCRC32C, w.attrs)
|
req.ObjectChecksums = toProtoChecksums(w.sendCRC32C, w.attrs)
|
||||||
return run(w.ctx, func() error {
|
return run(w.ctx, func(ctx context.Context) error {
|
||||||
upres, err := w.c.raw.StartResumableWrite(w.ctx, req)
|
upres, err := w.c.raw.StartResumableWrite(w.ctx, req)
|
||||||
w.upid = upres.GetUploadId()
|
w.upid = upres.GetUploadId()
|
||||||
return err
|
return err
|
||||||
}, w.settings.retry, w.settings.idempotent, setRetryHeaderGRPC(w.ctx))
|
}, w.settings.retry, w.settings.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// queryProgress is a helper that queries the status of the resumable upload
|
// queryProgress is a helper that queries the status of the resumable upload
|
||||||
// associated with the given upload ID.
|
// associated with the given upload ID.
|
||||||
func (w *gRPCWriter) queryProgress() (int64, error) {
|
func (w *gRPCWriter) queryProgress() (int64, error) {
|
||||||
var persistedSize int64
|
var persistedSize int64
|
||||||
err := run(w.ctx, func() error {
|
err := run(w.ctx, func(ctx context.Context) error {
|
||||||
q, err := w.c.raw.QueryWriteStatus(w.ctx, &storagepb.QueryWriteStatusRequest{
|
q, err := w.c.raw.QueryWriteStatus(w.ctx, &storagepb.QueryWriteStatusRequest{
|
||||||
UploadId: w.upid,
|
UploadId: w.upid,
|
||||||
})
|
})
|
||||||
persistedSize = q.GetPersistedSize()
|
persistedSize = q.GetPersistedSize()
|
||||||
return err
|
return err
|
||||||
}, w.settings.retry, true, setRetryHeaderGRPC(w.ctx))
|
}, w.settings.retry, true)
|
||||||
|
|
||||||
// q.GetCommittedSize() will return 0 if q is nil.
|
// q.GetCommittedSize() will return 0 if q is nil.
|
||||||
return persistedSize, err
|
return persistedSize, err
|
||||||
|
@ -1662,6 +1660,10 @@ func (w *gRPCWriter) uploadBuffer(recvd int, start int64, doneReading bool) (*st
|
||||||
// status. Closing the stream receives the status as an error.
|
// status. Closing the stream receives the status as an error.
|
||||||
_, err = w.stream.CloseAndRecv()
|
_, err = w.stream.CloseAndRecv()
|
||||||
|
|
||||||
|
// Drop the stream reference as a new one will need to be created if
|
||||||
|
// we can retry the upload
|
||||||
|
w.stream = nil
|
||||||
|
|
||||||
// Retriable errors mean we should start over and attempt to
|
// Retriable errors mean we should start over and attempt to
|
||||||
// resend the entire buffer via a new stream.
|
// resend the entire buffer via a new stream.
|
||||||
// If not retriable, falling through will return the error received
|
// If not retriable, falling through will return the error received
|
||||||
|
|
5
vendor/cloud.google.com/go/storage/hmac.go
generated
vendored
5
vendor/cloud.google.com/go/storage/hmac.go
generated
vendored
|
@ -289,12 +289,11 @@ func (it *HMACKeysIterator) fetch(pageSize int, pageToken string) (token string,
|
||||||
call = call.MaxResults(int64(pageSize))
|
call = call.MaxResults(int64(pageSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := it.ctx
|
|
||||||
var resp *raw.HmacKeysMetadata
|
var resp *raw.HmacKeysMetadata
|
||||||
err = run(it.ctx, func() error {
|
err = run(it.ctx, func(ctx context.Context) error {
|
||||||
resp, err = call.Context(ctx).Do()
|
resp, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, it.retry, true, setRetryHeaderHTTP(call))
|
}, it.retry, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
164
vendor/cloud.google.com/go/storage/http_client.go
generated
vendored
164
vendor/cloud.google.com/go/storage/http_client.go
generated
vendored
|
@ -148,11 +148,11 @@ func (c *httpStorageClient) GetServiceAccount(ctx context.Context, project strin
|
||||||
s := callSettings(c.settings, opts...)
|
s := callSettings(c.settings, opts...)
|
||||||
call := c.raw.Projects.ServiceAccount.Get(project)
|
call := c.raw.Projects.ServiceAccount.Get(project)
|
||||||
var res *raw.ServiceAccount
|
var res *raw.ServiceAccount
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
res, err = call.Context(ctx).Do()
|
res, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -182,14 +182,14 @@ func (c *httpStorageClient) CreateBucket(ctx context.Context, project, bucket st
|
||||||
req.PredefinedDefaultObjectAcl(attrs.PredefinedDefaultObjectACL)
|
req.PredefinedDefaultObjectAcl(attrs.PredefinedDefaultObjectACL)
|
||||||
}
|
}
|
||||||
var battrs *BucketAttrs
|
var battrs *BucketAttrs
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
b, err := req.Context(ctx).Do()
|
b, err := req.Context(ctx).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
battrs, err = newBucket(b)
|
battrs, err = newBucket(b)
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
return battrs, err
|
return battrs, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,10 +210,10 @@ func (c *httpStorageClient) ListBuckets(ctx context.Context, project string, opt
|
||||||
req.MaxResults(int64(pageSize))
|
req.MaxResults(int64(pageSize))
|
||||||
}
|
}
|
||||||
var resp *raw.Buckets
|
var resp *raw.Buckets
|
||||||
err = run(it.ctx, func() error {
|
err = run(it.ctx, func(ctx context.Context) error {
|
||||||
resp, err = req.Context(it.ctx).Do()
|
resp, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -248,7 +248,7 @@ func (c *httpStorageClient) DeleteBucket(ctx context.Context, bucket string, con
|
||||||
req.UserProject(s.userProject)
|
req.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
|
|
||||||
return run(ctx, func() error { return req.Context(ctx).Do() }, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *httpStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {
|
func (c *httpStorageClient) GetBucket(ctx context.Context, bucket string, conds *BucketConditions, opts ...storageOption) (*BucketAttrs, error) {
|
||||||
|
@ -264,10 +264,10 @@ func (c *httpStorageClient) GetBucket(ctx context.Context, bucket string, conds
|
||||||
}
|
}
|
||||||
|
|
||||||
var resp *raw.Bucket
|
var resp *raw.Bucket
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
resp, err = req.Context(ctx).Do()
|
resp, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
|
|
||||||
var e *googleapi.Error
|
var e *googleapi.Error
|
||||||
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
||||||
|
@ -298,10 +298,10 @@ func (c *httpStorageClient) UpdateBucket(ctx context.Context, bucket string, uat
|
||||||
}
|
}
|
||||||
|
|
||||||
var rawBucket *raw.Bucket
|
var rawBucket *raw.Bucket
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
rawBucket, err = req.Context(ctx).Do()
|
rawBucket, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -317,10 +317,10 @@ func (c *httpStorageClient) LockBucketRetentionPolicy(ctx context.Context, bucke
|
||||||
}
|
}
|
||||||
req := c.raw.Buckets.LockRetentionPolicy(bucket, metageneration)
|
req := c.raw.Buckets.LockRetentionPolicy(bucket, metageneration)
|
||||||
|
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
_, err := req.Context(ctx).Do()
|
_, err := req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
func (c *httpStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator {
|
func (c *httpStorageClient) ListObjects(ctx context.Context, bucket string, q *Query, opts ...storageOption) *ObjectIterator {
|
||||||
s := callSettings(c.settings, opts...)
|
s := callSettings(c.settings, opts...)
|
||||||
|
@ -357,10 +357,10 @@ func (c *httpStorageClient) ListObjects(ctx context.Context, bucket string, q *Q
|
||||||
}
|
}
|
||||||
var resp *raw.Objects
|
var resp *raw.Objects
|
||||||
var err error
|
var err error
|
||||||
err = run(it.ctx, func() error {
|
err = run(it.ctx, func(ctx context.Context) error {
|
||||||
resp, err = req.Context(it.ctx).Do()
|
resp, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var e *googleapi.Error
|
var e *googleapi.Error
|
||||||
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
||||||
|
@ -395,7 +395,7 @@ func (c *httpStorageClient) DeleteObject(ctx context.Context, bucket, object str
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
req.UserProject(s.userProject)
|
req.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
err := run(ctx, func() error { return req.Context(ctx).Do() }, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
err := run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)
|
||||||
var e *googleapi.Error
|
var e *googleapi.Error
|
||||||
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
||||||
return ErrObjectNotExist
|
return ErrObjectNotExist
|
||||||
|
@ -417,10 +417,10 @@ func (c *httpStorageClient) GetObject(ctx context.Context, bucket, object string
|
||||||
}
|
}
|
||||||
var obj *raw.Object
|
var obj *raw.Object
|
||||||
var err error
|
var err error
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
obj, err = req.Context(ctx).Do()
|
obj, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
var e *googleapi.Error
|
var e *googleapi.Error
|
||||||
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
if ok := errors.As(err, &e); ok && e.Code == http.StatusNotFound {
|
||||||
return nil, ErrObjectNotExist
|
return nil, ErrObjectNotExist
|
||||||
|
@ -499,7 +499,7 @@ func (c *httpStorageClient) UpdateObject(ctx context.Context, bucket, object str
|
||||||
rawObj := attrs.toRawObject(bucket)
|
rawObj := attrs.toRawObject(bucket)
|
||||||
rawObj.ForceSendFields = forceSendFields
|
rawObj.ForceSendFields = forceSendFields
|
||||||
rawObj.NullFields = nullFields
|
rawObj.NullFields = nullFields
|
||||||
call := c.raw.Objects.Patch(bucket, object, rawObj).Projection("full").Context(ctx)
|
call := c.raw.Objects.Patch(bucket, object, rawObj).Projection("full")
|
||||||
if err := applyConds("Update", gen, conds, call); err != nil {
|
if err := applyConds("Update", gen, conds, call); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -514,7 +514,7 @@ func (c *httpStorageClient) UpdateObject(ctx context.Context, bucket, object str
|
||||||
}
|
}
|
||||||
var obj *raw.Object
|
var obj *raw.Object
|
||||||
var err error
|
var err error
|
||||||
err = run(ctx, func() error { obj, err = call.Do(); return err }, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
err = run(ctx, func(ctx context.Context) error { obj, err = call.Context(ctx).Do(); return err }, s.retry, s.idempotent)
|
||||||
var e *googleapi.Error
|
var e *googleapi.Error
|
||||||
if errors.As(err, &e) && e.Code == http.StatusNotFound {
|
if errors.As(err, &e) && e.Code == http.StatusNotFound {
|
||||||
return nil, ErrObjectNotExist
|
return nil, ErrObjectNotExist
|
||||||
|
@ -531,7 +531,7 @@ func (c *httpStorageClient) DeleteDefaultObjectACL(ctx context.Context, bucket s
|
||||||
s := callSettings(c.settings, opts...)
|
s := callSettings(c.settings, opts...)
|
||||||
req := c.raw.DefaultObjectAccessControls.Delete(bucket, string(entity))
|
req := c.raw.DefaultObjectAccessControls.Delete(bucket, string(entity))
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
return run(ctx, func() error { return req.Context(ctx).Do() }, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *httpStorageClient) ListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {
|
func (c *httpStorageClient) ListDefaultObjectACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {
|
||||||
|
@ -540,10 +540,10 @@ func (c *httpStorageClient) ListDefaultObjectACLs(ctx context.Context, bucket st
|
||||||
var err error
|
var err error
|
||||||
req := c.raw.DefaultObjectAccessControls.List(bucket)
|
req := c.raw.DefaultObjectAccessControls.List(bucket)
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
acls, err = req.Do()
|
acls, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, true, setRetryHeaderHTTP(req))
|
}, s.retry, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -560,14 +560,13 @@ func (c *httpStorageClient) UpdateDefaultObjectACL(ctx context.Context, bucket s
|
||||||
Entity: string(entity),
|
Entity: string(entity),
|
||||||
Role: string(role),
|
Role: string(role),
|
||||||
}
|
}
|
||||||
var req setRequest
|
|
||||||
var err error
|
var err error
|
||||||
req = c.raw.DefaultObjectAccessControls.Update(bucket, string(entity), acl)
|
req := c.raw.DefaultObjectAccessControls.Update(bucket, string(entity), acl)
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
_, err = req.Do()
|
_, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bucket ACL methods.
|
// Bucket ACL methods.
|
||||||
|
@ -576,7 +575,7 @@ func (c *httpStorageClient) DeleteBucketACL(ctx context.Context, bucket string,
|
||||||
s := callSettings(c.settings, opts...)
|
s := callSettings(c.settings, opts...)
|
||||||
req := c.raw.BucketAccessControls.Delete(bucket, string(entity))
|
req := c.raw.BucketAccessControls.Delete(bucket, string(entity))
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
return run(ctx, func() error { return req.Context(ctx).Do() }, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *httpStorageClient) ListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {
|
func (c *httpStorageClient) ListBucketACLs(ctx context.Context, bucket string, opts ...storageOption) ([]ACLRule, error) {
|
||||||
|
@ -585,10 +584,10 @@ func (c *httpStorageClient) ListBucketACLs(ctx context.Context, bucket string, o
|
||||||
var err error
|
var err error
|
||||||
req := c.raw.BucketAccessControls.List(bucket)
|
req := c.raw.BucketAccessControls.List(bucket)
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
acls, err = req.Do()
|
acls, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, true, setRetryHeaderHTTP(req))
|
}, s.retry, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -605,10 +604,10 @@ func (c *httpStorageClient) UpdateBucketACL(ctx context.Context, bucket string,
|
||||||
req := c.raw.BucketAccessControls.Update(bucket, string(entity), acl)
|
req := c.raw.BucketAccessControls.Update(bucket, string(entity), acl)
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
var err error
|
var err error
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
_, err = req.Do()
|
_, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// configureACLCall sets the context, user project and headers on the apiary library call.
|
// configureACLCall sets the context, user project and headers on the apiary library call.
|
||||||
|
@ -628,7 +627,7 @@ func (c *httpStorageClient) DeleteObjectACL(ctx context.Context, bucket, object
|
||||||
s := callSettings(c.settings, opts...)
|
s := callSettings(c.settings, opts...)
|
||||||
req := c.raw.ObjectAccessControls.Delete(bucket, object, string(entity))
|
req := c.raw.ObjectAccessControls.Delete(bucket, object, string(entity))
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
return run(ctx, func() error { return req.Context(ctx).Do() }, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
return run(ctx, func(ctx context.Context) error { return req.Context(ctx).Do() }, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListObjectACLs retrieves object ACL entries. By default, it operates on the latest generation of this object.
|
// ListObjectACLs retrieves object ACL entries. By default, it operates on the latest generation of this object.
|
||||||
|
@ -639,10 +638,10 @@ func (c *httpStorageClient) ListObjectACLs(ctx context.Context, bucket, object s
|
||||||
var err error
|
var err error
|
||||||
req := c.raw.ObjectAccessControls.List(bucket, object)
|
req := c.raw.ObjectAccessControls.List(bucket, object)
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
acls, err = req.Do()
|
acls, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -661,14 +660,13 @@ func (c *httpStorageClient) UpdateObjectACL(ctx context.Context, bucket, object
|
||||||
Entity: string(entity),
|
Entity: string(entity),
|
||||||
Role: string(role),
|
Role: string(role),
|
||||||
}
|
}
|
||||||
var req setRequest
|
|
||||||
var err error
|
var err error
|
||||||
req = c.raw.ObjectAccessControls.Update(bucket, object, string(entity), acl)
|
req := c.raw.ObjectAccessControls.Update(bucket, object, string(entity), acl)
|
||||||
configureACLCall(ctx, s.userProject, req)
|
configureACLCall(ctx, s.userProject, req)
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
_, err = req.Do()
|
_, err = req.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(req))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Media operations.
|
// Media operations.
|
||||||
|
@ -692,7 +690,7 @@ func (c *httpStorageClient) ComposeObject(ctx context.Context, req *composeObjec
|
||||||
rawReq.SourceObjects = append(rawReq.SourceObjects, srcObj)
|
rawReq.SourceObjects = append(rawReq.SourceObjects, srcObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
call := c.raw.Objects.Compose(req.dstBucket, req.dstObject.name, rawReq).Context(ctx)
|
call := c.raw.Objects.Compose(req.dstBucket, req.dstObject.name, rawReq)
|
||||||
if err := applyConds("ComposeFrom destination", defaultGen, req.dstObject.conds, call); err != nil {
|
if err := applyConds("ComposeFrom destination", defaultGen, req.dstObject.conds, call); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -709,9 +707,9 @@ func (c *httpStorageClient) ComposeObject(ctx context.Context, req *composeObjec
|
||||||
setClientHeader(call.Header())
|
setClientHeader(call.Header())
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
retryCall := func() error { obj, err = call.Do(); return err }
|
retryCall := func(ctx context.Context) error { obj, err = call.Context(ctx).Do(); return err }
|
||||||
|
|
||||||
if err := run(ctx, retryCall, s.retry, s.idempotent, setRetryHeaderHTTP(call)); err != nil {
|
if err := run(ctx, retryCall, s.retry, s.idempotent); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return newObject(obj), nil
|
return newObject(obj), nil
|
||||||
|
@ -721,7 +719,7 @@ func (c *httpStorageClient) RewriteObject(ctx context.Context, req *rewriteObjec
|
||||||
rawObject := req.dstObject.attrs.toRawObject("")
|
rawObject := req.dstObject.attrs.toRawObject("")
|
||||||
call := c.raw.Objects.Rewrite(req.srcObject.bucket, req.srcObject.name, req.dstObject.bucket, req.dstObject.name, rawObject)
|
call := c.raw.Objects.Rewrite(req.srcObject.bucket, req.srcObject.name, req.dstObject.bucket, req.dstObject.name, rawObject)
|
||||||
|
|
||||||
call.Context(ctx).Projection("full")
|
call.Projection("full")
|
||||||
if req.token != "" {
|
if req.token != "" {
|
||||||
call.RewriteToken(req.token)
|
call.RewriteToken(req.token)
|
||||||
}
|
}
|
||||||
|
@ -757,9 +755,9 @@ func (c *httpStorageClient) RewriteObject(ctx context.Context, req *rewriteObjec
|
||||||
var err error
|
var err error
|
||||||
setClientHeader(call.Header())
|
setClientHeader(call.Header())
|
||||||
|
|
||||||
retryCall := func() error { res, err = call.Do(); return err }
|
retryCall := func(ctx context.Context) error { res, err = call.Context(ctx).Do(); return err }
|
||||||
|
|
||||||
if err := run(ctx, retryCall, s.retry, s.idempotent, setRetryHeaderHTTP(call)); err != nil {
|
if err := run(ctx, retryCall, s.retry, s.idempotent); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -801,7 +799,6 @@ func (c *httpStorageClient) newRangeReaderXML(ctx context.Context, params *newRa
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
req = req.WithContext(ctx)
|
|
||||||
|
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
req.Header.Set("X-Goog-User-Project", s.userProject)
|
req.Header.Set("X-Goog-User-Project", s.userProject)
|
||||||
|
@ -821,7 +818,7 @@ func (c *httpStorageClient) newRangeReaderXML(ctx context.Context, params *newRa
|
||||||
}
|
}
|
||||||
|
|
||||||
reopen := readerReopen(ctx, req.Header, params, s,
|
reopen := readerReopen(ctx, req.Header, params, s,
|
||||||
func() (*http.Response, error) { return c.hc.Do(req) },
|
func(ctx context.Context) (*http.Response, error) { return c.hc.Do(req.WithContext(ctx)) },
|
||||||
func() error { return setConditionsHeaders(req.Header, params.conds) },
|
func() error { return setConditionsHeaders(req.Header, params.conds) },
|
||||||
func() { req.URL.RawQuery = fmt.Sprintf("generation=%d", params.gen) })
|
func() { req.URL.RawQuery = fmt.Sprintf("generation=%d", params.gen) })
|
||||||
|
|
||||||
|
@ -836,7 +833,6 @@ func (c *httpStorageClient) newRangeReaderJSON(ctx context.Context, params *newR
|
||||||
call := c.raw.Objects.Get(params.bucket, params.object)
|
call := c.raw.Objects.Get(params.bucket, params.object)
|
||||||
|
|
||||||
setClientHeader(call.Header())
|
setClientHeader(call.Header())
|
||||||
call.Context(ctx)
|
|
||||||
call.Projection("full")
|
call.Projection("full")
|
||||||
|
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
|
@ -847,7 +843,7 @@ func (c *httpStorageClient) newRangeReaderJSON(ctx context.Context, params *newR
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
reopen := readerReopen(ctx, call.Header(), params, s, func() (*http.Response, error) { return call.Download() },
|
reopen := readerReopen(ctx, call.Header(), params, s, func(ctx context.Context) (*http.Response, error) { return call.Context(ctx).Download() },
|
||||||
func() error { return applyConds("NewReader", params.gen, params.conds, call) },
|
func() error { return applyConds("NewReader", params.gen, params.conds, call) },
|
||||||
func() { call.Generation(params.gen) })
|
func() { call.Generation(params.gen) })
|
||||||
|
|
||||||
|
@ -957,11 +953,11 @@ func (c *httpStorageClient) GetIamPolicy(ctx context.Context, resource string, v
|
||||||
call.UserProject(s.userProject)
|
call.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
var rp *raw.Policy
|
var rp *raw.Policy
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
rp, err = call.Context(ctx).Do()
|
rp, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -978,10 +974,10 @@ func (c *httpStorageClient) SetIamPolicy(ctx context.Context, resource string, p
|
||||||
call.UserProject(s.userProject)
|
call.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
|
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
_, err := call.Context(ctx).Do()
|
_, err := call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *httpStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) {
|
func (c *httpStorageClient) TestIamPermissions(ctx context.Context, resource string, permissions []string, opts ...storageOption) ([]string, error) {
|
||||||
|
@ -992,11 +988,11 @@ func (c *httpStorageClient) TestIamPermissions(ctx context.Context, resource str
|
||||||
call.UserProject(s.userProject)
|
call.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
var res *raw.TestIamPermissionsResponse
|
var res *raw.TestIamPermissionsResponse
|
||||||
err := run(ctx, func() error {
|
err := run(ctx, func(ctx context.Context) error {
|
||||||
var err error
|
var err error
|
||||||
res, err = call.Context(ctx).Do()
|
res, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1014,10 +1010,10 @@ func (c *httpStorageClient) GetHMACKey(ctx context.Context, project, accessID st
|
||||||
|
|
||||||
var metadata *raw.HmacKeyMetadata
|
var metadata *raw.HmacKeyMetadata
|
||||||
var err error
|
var err error
|
||||||
if err := run(ctx, func() error {
|
if err := run(ctx, func(ctx context.Context) error {
|
||||||
metadata, err = call.Context(ctx).Do()
|
metadata, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call)); err != nil {
|
}, s.retry, s.idempotent); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
hk := &raw.HmacKey{
|
hk := &raw.HmacKey{
|
||||||
|
@ -1054,10 +1050,10 @@ func (c *httpStorageClient) ListHMACKeys(ctx context.Context, project, serviceAc
|
||||||
}
|
}
|
||||||
|
|
||||||
var resp *raw.HmacKeysMetadata
|
var resp *raw.HmacKeysMetadata
|
||||||
err = run(it.ctx, func() error {
|
err = run(it.ctx, func(ctx context.Context) error {
|
||||||
resp, err = call.Context(it.ctx).Do()
|
resp, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -1099,10 +1095,10 @@ func (c *httpStorageClient) UpdateHMACKey(ctx context.Context, project, serviceA
|
||||||
|
|
||||||
var metadata *raw.HmacKeyMetadata
|
var metadata *raw.HmacKeyMetadata
|
||||||
var err error
|
var err error
|
||||||
if err := run(ctx, func() error {
|
if err := run(ctx, func(ctx context.Context) error {
|
||||||
metadata, err = call.Context(ctx).Do()
|
metadata, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call)); err != nil {
|
}, s.retry, s.idempotent); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
hk := &raw.HmacKey{
|
hk := &raw.HmacKey{
|
||||||
|
@ -1119,11 +1115,11 @@ func (c *httpStorageClient) CreateHMACKey(ctx context.Context, project, serviceA
|
||||||
}
|
}
|
||||||
|
|
||||||
var hk *raw.HmacKey
|
var hk *raw.HmacKey
|
||||||
if err := run(ctx, func() error {
|
if err := run(ctx, func(ctx context.Context) error {
|
||||||
h, err := call.Context(ctx).Do()
|
h, err := call.Context(ctx).Do()
|
||||||
hk = h
|
hk = h
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call)); err != nil {
|
}, s.retry, s.idempotent); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return toHMACKeyFromRaw(hk, true)
|
return toHMACKeyFromRaw(hk, true)
|
||||||
|
@ -1135,9 +1131,9 @@ func (c *httpStorageClient) DeleteHMACKey(ctx context.Context, project string, a
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
call = call.UserProject(s.userProject)
|
call = call.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
return call.Context(ctx).Do()
|
return call.Context(ctx).Do()
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notification methods.
|
// Notification methods.
|
||||||
|
@ -1156,10 +1152,10 @@ func (c *httpStorageClient) ListNotifications(ctx context.Context, bucket string
|
||||||
call.UserProject(s.userProject)
|
call.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
var res *raw.Notifications
|
var res *raw.Notifications
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
res, err = call.Context(ctx).Do()
|
res, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, true, setRetryHeaderHTTP(call))
|
}, s.retry, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1176,10 +1172,10 @@ func (c *httpStorageClient) CreateNotification(ctx context.Context, bucket strin
|
||||||
call.UserProject(s.userProject)
|
call.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
var rn *raw.Notification
|
var rn *raw.Notification
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
rn, err = call.Context(ctx).Do()
|
rn, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -1195,9 +1191,9 @@ func (c *httpStorageClient) DeleteNotification(ctx context.Context, bucket strin
|
||||||
if s.userProject != "" {
|
if s.userProject != "" {
|
||||||
call.UserProject(s.userProject)
|
call.UserProject(s.userProject)
|
||||||
}
|
}
|
||||||
return run(ctx, func() error {
|
return run(ctx, func(ctx context.Context) error {
|
||||||
return call.Context(ctx).Do()
|
return call.Context(ctx).Do()
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(call))
|
}, s.retry, s.idempotent)
|
||||||
}
|
}
|
||||||
|
|
||||||
type httpReader struct {
|
type httpReader struct {
|
||||||
|
@ -1246,7 +1242,7 @@ func setRangeReaderHeaders(h http.Header, params *newRangeReaderParams) error {
|
||||||
// readerReopen initiates a Read with offset and length, assuming we
|
// readerReopen initiates a Read with offset and length, assuming we
|
||||||
// have already read seen bytes.
|
// have already read seen bytes.
|
||||||
func readerReopen(ctx context.Context, header http.Header, params *newRangeReaderParams, s *settings,
|
func readerReopen(ctx context.Context, header http.Header, params *newRangeReaderParams, s *settings,
|
||||||
doDownload func() (*http.Response, error), applyConditions func() error, setGeneration func()) func(int64) (*http.Response, error) {
|
doDownload func(context.Context) (*http.Response, error), applyConditions func() error, setGeneration func()) func(int64) (*http.Response, error) {
|
||||||
return func(seen int64) (*http.Response, error) {
|
return func(seen int64) (*http.Response, error) {
|
||||||
// If the context has already expired, return immediately without making a
|
// If the context has already expired, return immediately without making a
|
||||||
// call.
|
// call.
|
||||||
|
@ -1273,8 +1269,8 @@ func readerReopen(ctx context.Context, header http.Header, params *newRangeReade
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
var res *http.Response
|
var res *http.Response
|
||||||
err = run(ctx, func() error {
|
err = run(ctx, func(ctx context.Context) error {
|
||||||
res, err = doDownload()
|
res, err = doDownload(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var e *googleapi.Error
|
var e *googleapi.Error
|
||||||
if errors.As(err, &e) {
|
if errors.As(err, &e) {
|
||||||
|
@ -1328,7 +1324,7 @@ func readerReopen(ctx context.Context, header http.Header, params *newRangeReade
|
||||||
params.gen = gen64
|
params.gen = gen64
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}, s.retry, s.idempotent, setRetryHeaderHTTP(nil))
|
}, s.retry, s.idempotent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
12
vendor/cloud.google.com/go/storage/internal/apiv2/doc.go
generated
vendored
12
vendor/cloud.google.com/go/storage/internal/apiv2/doc.go
generated
vendored
|
@ -17,7 +17,17 @@
|
||||||
// Package storage is an auto-generated package for the
|
// Package storage is an auto-generated package for the
|
||||||
// Cloud Storage API.
|
// Cloud Storage API.
|
||||||
//
|
//
|
||||||
// Lets you store and retrieve potentially-large, immutable data objects.
|
// Stop. This folder is likely not what you are looking for. This folder
|
||||||
|
// contains protocol buffer definitions for an unreleased API for accessing
|
||||||
|
// Cloud Storage. Unless told otherwise by a Google Cloud representative, do
|
||||||
|
// not use any of the contents of this folder. If you would like to use Cloud
|
||||||
|
// Storage, please consult our official documentation (at
|
||||||
|
// https://cloud.google.com/storage/docs/apis) for details on our XML and
|
||||||
|
// JSON APIs, or else consider one of our client libraries (at
|
||||||
|
// https://cloud.google.com/storage/docs/reference/libraries). This API
|
||||||
|
// defined in this folder is unreleased and may shut off, break, or fail at
|
||||||
|
// any time for any users who are not registered as a part of a private
|
||||||
|
// preview program.
|
||||||
//
|
//
|
||||||
// # General documentation
|
// # General documentation
|
||||||
//
|
//
|
||||||
|
|
10
vendor/cloud.google.com/go/storage/internal/apiv2/gapic_metadata.json
generated
vendored
10
vendor/cloud.google.com/go/storage/internal/apiv2/gapic_metadata.json
generated
vendored
|
@ -10,6 +10,11 @@
|
||||||
"grpc": {
|
"grpc": {
|
||||||
"libraryClient": "Client",
|
"libraryClient": "Client",
|
||||||
"rpcs": {
|
"rpcs": {
|
||||||
|
"BidiWriteObject": {
|
||||||
|
"methods": [
|
||||||
|
"BidiWriteObject"
|
||||||
|
]
|
||||||
|
},
|
||||||
"CancelResumableWrite": {
|
"CancelResumableWrite": {
|
||||||
"methods": [
|
"methods": [
|
||||||
"CancelResumableWrite"
|
"CancelResumableWrite"
|
||||||
|
@ -120,6 +125,11 @@
|
||||||
"ReadObject"
|
"ReadObject"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"RestoreObject": {
|
||||||
|
"methods": [
|
||||||
|
"RestoreObject"
|
||||||
|
]
|
||||||
|
},
|
||||||
"RewriteObject": {
|
"RewriteObject": {
|
||||||
"methods": [
|
"methods": [
|
||||||
"RewriteObject"
|
"RewriteObject"
|
||||||
|
|
111
vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go
generated
vendored
111
vendor/cloud.google.com/go/storage/internal/apiv2/storage_client.go
generated
vendored
|
@ -56,11 +56,13 @@ type CallOptions struct {
|
||||||
ListNotificationConfigs []gax.CallOption
|
ListNotificationConfigs []gax.CallOption
|
||||||
ComposeObject []gax.CallOption
|
ComposeObject []gax.CallOption
|
||||||
DeleteObject []gax.CallOption
|
DeleteObject []gax.CallOption
|
||||||
|
RestoreObject []gax.CallOption
|
||||||
CancelResumableWrite []gax.CallOption
|
CancelResumableWrite []gax.CallOption
|
||||||
GetObject []gax.CallOption
|
GetObject []gax.CallOption
|
||||||
ReadObject []gax.CallOption
|
ReadObject []gax.CallOption
|
||||||
UpdateObject []gax.CallOption
|
UpdateObject []gax.CallOption
|
||||||
WriteObject []gax.CallOption
|
WriteObject []gax.CallOption
|
||||||
|
BidiWriteObject []gax.CallOption
|
||||||
ListObjects []gax.CallOption
|
ListObjects []gax.CallOption
|
||||||
RewriteObject []gax.CallOption
|
RewriteObject []gax.CallOption
|
||||||
StartResumableWrite []gax.CallOption
|
StartResumableWrite []gax.CallOption
|
||||||
|
@ -282,6 +284,19 @@ func defaultCallOptions() *CallOptions {
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
RestoreObject: []gax.CallOption{
|
||||||
|
gax.WithTimeout(60000 * time.Millisecond),
|
||||||
|
gax.WithRetry(func() gax.Retryer {
|
||||||
|
return gax.OnCodes([]codes.Code{
|
||||||
|
codes.DeadlineExceeded,
|
||||||
|
codes.Unavailable,
|
||||||
|
}, gax.Backoff{
|
||||||
|
Initial: 1000 * time.Millisecond,
|
||||||
|
Max: 60000 * time.Millisecond,
|
||||||
|
Multiplier: 2.00,
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
},
|
||||||
CancelResumableWrite: []gax.CallOption{
|
CancelResumableWrite: []gax.CallOption{
|
||||||
gax.WithTimeout(60000 * time.Millisecond),
|
gax.WithTimeout(60000 * time.Millisecond),
|
||||||
gax.WithRetry(func() gax.Retryer {
|
gax.WithRetry(func() gax.Retryer {
|
||||||
|
@ -345,6 +360,18 @@ func defaultCallOptions() *CallOptions {
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
BidiWriteObject: []gax.CallOption{
|
||||||
|
gax.WithRetry(func() gax.Retryer {
|
||||||
|
return gax.OnCodes([]codes.Code{
|
||||||
|
codes.DeadlineExceeded,
|
||||||
|
codes.Unavailable,
|
||||||
|
}, gax.Backoff{
|
||||||
|
Initial: 1000 * time.Millisecond,
|
||||||
|
Max: 60000 * time.Millisecond,
|
||||||
|
Multiplier: 2.00,
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
},
|
||||||
ListObjects: []gax.CallOption{
|
ListObjects: []gax.CallOption{
|
||||||
gax.WithTimeout(60000 * time.Millisecond),
|
gax.WithTimeout(60000 * time.Millisecond),
|
||||||
gax.WithRetry(func() gax.Retryer {
|
gax.WithRetry(func() gax.Retryer {
|
||||||
|
@ -498,11 +525,13 @@ type internalClient interface {
|
||||||
ListNotificationConfigs(context.Context, *storagepb.ListNotificationConfigsRequest, ...gax.CallOption) *NotificationConfigIterator
|
ListNotificationConfigs(context.Context, *storagepb.ListNotificationConfigsRequest, ...gax.CallOption) *NotificationConfigIterator
|
||||||
ComposeObject(context.Context, *storagepb.ComposeObjectRequest, ...gax.CallOption) (*storagepb.Object, error)
|
ComposeObject(context.Context, *storagepb.ComposeObjectRequest, ...gax.CallOption) (*storagepb.Object, error)
|
||||||
DeleteObject(context.Context, *storagepb.DeleteObjectRequest, ...gax.CallOption) error
|
DeleteObject(context.Context, *storagepb.DeleteObjectRequest, ...gax.CallOption) error
|
||||||
|
RestoreObject(context.Context, *storagepb.RestoreObjectRequest, ...gax.CallOption) (*storagepb.Object, error)
|
||||||
CancelResumableWrite(context.Context, *storagepb.CancelResumableWriteRequest, ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error)
|
CancelResumableWrite(context.Context, *storagepb.CancelResumableWriteRequest, ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error)
|
||||||
GetObject(context.Context, *storagepb.GetObjectRequest, ...gax.CallOption) (*storagepb.Object, error)
|
GetObject(context.Context, *storagepb.GetObjectRequest, ...gax.CallOption) (*storagepb.Object, error)
|
||||||
ReadObject(context.Context, *storagepb.ReadObjectRequest, ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error)
|
ReadObject(context.Context, *storagepb.ReadObjectRequest, ...gax.CallOption) (storagepb.Storage_ReadObjectClient, error)
|
||||||
UpdateObject(context.Context, *storagepb.UpdateObjectRequest, ...gax.CallOption) (*storagepb.Object, error)
|
UpdateObject(context.Context, *storagepb.UpdateObjectRequest, ...gax.CallOption) (*storagepb.Object, error)
|
||||||
WriteObject(context.Context, ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error)
|
WriteObject(context.Context, ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error)
|
||||||
|
BidiWriteObject(context.Context, ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error)
|
||||||
ListObjects(context.Context, *storagepb.ListObjectsRequest, ...gax.CallOption) *ObjectIterator
|
ListObjects(context.Context, *storagepb.ListObjectsRequest, ...gax.CallOption) *ObjectIterator
|
||||||
RewriteObject(context.Context, *storagepb.RewriteObjectRequest, ...gax.CallOption) (*storagepb.RewriteResponse, error)
|
RewriteObject(context.Context, *storagepb.RewriteObjectRequest, ...gax.CallOption) (*storagepb.RewriteResponse, error)
|
||||||
StartResumableWrite(context.Context, *storagepb.StartResumableWriteRequest, ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error)
|
StartResumableWrite(context.Context, *storagepb.StartResumableWriteRequest, ...gax.CallOption) (*storagepb.StartResumableWriteResponse, error)
|
||||||
|
@ -598,16 +627,16 @@ func (c *Client) LockBucketRetentionPolicy(ctx context.Context, req *storagepb.L
|
||||||
|
|
||||||
// GetIamPolicy gets the IAM policy for a specified bucket or object.
|
// GetIamPolicy gets the IAM policy for a specified bucket or object.
|
||||||
// The resource field in the request should be
|
// The resource field in the request should be
|
||||||
// projects//buckets/<bucket_name> for a bucket or
|
// projects/_/buckets/{bucket} for a bucket or
|
||||||
// projects//buckets/<bucket_name>/objects/<object_name> for an object.
|
// projects/_/buckets/{bucket}/objects/{object} for an object.
|
||||||
func (c *Client) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {
|
func (c *Client) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {
|
||||||
return c.internalClient.GetIamPolicy(ctx, req, opts...)
|
return c.internalClient.GetIamPolicy(ctx, req, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetIamPolicy updates an IAM policy for the specified bucket or object.
|
// SetIamPolicy updates an IAM policy for the specified bucket or object.
|
||||||
// The resource field in the request should be
|
// The resource field in the request should be
|
||||||
// projects//buckets/<bucket_name> for a bucket or
|
// projects/_/buckets/{bucket} for a bucket or
|
||||||
// projects//buckets/<bucket_name>/objects/<object_name> for an object.
|
// projects/_/buckets/{bucket}/objects/{object} for an object.
|
||||||
func (c *Client) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {
|
func (c *Client) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error) {
|
||||||
return c.internalClient.SetIamPolicy(ctx, req, opts...)
|
return c.internalClient.SetIamPolicy(ctx, req, opts...)
|
||||||
}
|
}
|
||||||
|
@ -615,8 +644,8 @@ func (c *Client) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyReques
|
||||||
// TestIamPermissions tests a set of permissions on the given bucket or object to see which, if
|
// TestIamPermissions tests a set of permissions on the given bucket or object to see which, if
|
||||||
// any, are held by the caller.
|
// any, are held by the caller.
|
||||||
// The resource field in the request should be
|
// The resource field in the request should be
|
||||||
// projects//buckets/<bucket_name> for a bucket or
|
// projects/_/buckets/{bucket} for a bucket or
|
||||||
// projects//buckets/<bucket_name>/objects/<object_name> for an object.
|
// projects/_/buckets/{bucket}/objects/{object} for an object.
|
||||||
func (c *Client) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) {
|
func (c *Client) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error) {
|
||||||
return c.internalClient.TestIamPermissions(ctx, req, opts...)
|
return c.internalClient.TestIamPermissions(ctx, req, opts...)
|
||||||
}
|
}
|
||||||
|
@ -665,6 +694,11 @@ func (c *Client) DeleteObject(ctx context.Context, req *storagepb.DeleteObjectRe
|
||||||
return c.internalClient.DeleteObject(ctx, req, opts...)
|
return c.internalClient.DeleteObject(ctx, req, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RestoreObject restores a soft-deleted object.
|
||||||
|
func (c *Client) RestoreObject(ctx context.Context, req *storagepb.RestoreObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {
|
||||||
|
return c.internalClient.RestoreObject(ctx, req, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
// CancelResumableWrite cancels an in-progress resumable upload.
|
// CancelResumableWrite cancels an in-progress resumable upload.
|
||||||
//
|
//
|
||||||
// Any attempts to write to the resumable upload after cancelling the upload
|
// Any attempts to write to the resumable upload after cancelling the upload
|
||||||
|
@ -752,10 +786,33 @@ func (c *Client) UpdateObject(ctx context.Context, req *storagepb.UpdateObjectRe
|
||||||
// Attempting to resume an already finalized object will result in an OK
|
// Attempting to resume an already finalized object will result in an OK
|
||||||
// status, with a WriteObjectResponse containing the finalized object’s
|
// status, with a WriteObjectResponse containing the finalized object’s
|
||||||
// metadata.
|
// metadata.
|
||||||
|
//
|
||||||
|
// Alternatively, the BidiWriteObject operation may be used to write an
|
||||||
|
// object with controls over flushing and the ability to fetch the ability to
|
||||||
|
// determine the current persisted size.
|
||||||
func (c *Client) WriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) {
|
func (c *Client) WriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_WriteObjectClient, error) {
|
||||||
return c.internalClient.WriteObject(ctx, opts...)
|
return c.internalClient.WriteObject(ctx, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BidiWriteObject stores a new object and metadata.
|
||||||
|
//
|
||||||
|
// This is similar to the WriteObject call with the added support for
|
||||||
|
// manual flushing of persisted state, and the ability to determine current
|
||||||
|
// persisted size without closing the stream.
|
||||||
|
//
|
||||||
|
// The client may specify one or both of the state_lookup and flush fields
|
||||||
|
// in each BidiWriteObjectRequest. If flush is specified, the data written
|
||||||
|
// so far will be persisted to storage. If state_lookup is specified, the
|
||||||
|
// service will respond with a BidiWriteObjectResponse that contains the
|
||||||
|
// persisted size. If both flush and state_lookup are specified, the flush
|
||||||
|
// will always occur before a state_lookup, so that both may be set in the
|
||||||
|
// same request and the returned state will be the state of the object
|
||||||
|
// post-flush. When the stream is closed, a BidiWriteObjectResponse will
|
||||||
|
// always be sent to the client, regardless of the value of state_lookup.
|
||||||
|
func (c *Client) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) {
|
||||||
|
return c.internalClient.BidiWriteObject(ctx, opts...)
|
||||||
|
}
|
||||||
|
|
||||||
// ListObjects retrieves a list of objects matching the criteria.
|
// ListObjects retrieves a list of objects matching the criteria.
|
||||||
func (c *Client) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator {
|
func (c *Client) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator {
|
||||||
return c.internalClient.ListObjects(ctx, req, opts...)
|
return c.internalClient.ListObjects(ctx, req, opts...)
|
||||||
|
@ -1375,6 +1432,33 @@ func (c *gRPCClient) DeleteObject(ctx context.Context, req *storagepb.DeleteObje
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *gRPCClient) RestoreObject(ctx context.Context, req *storagepb.RestoreObjectRequest, opts ...gax.CallOption) (*storagepb.Object, error) {
|
||||||
|
routingHeaders := ""
|
||||||
|
routingHeadersMap := make(map[string]string)
|
||||||
|
if reg := regexp.MustCompile("(?P<bucket>.*)"); reg.MatchString(req.GetBucket()) && len(url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])) > 0 {
|
||||||
|
routingHeadersMap["bucket"] = url.QueryEscape(reg.FindStringSubmatch(req.GetBucket())[1])
|
||||||
|
}
|
||||||
|
for headerName, headerValue := range routingHeadersMap {
|
||||||
|
routingHeaders = fmt.Sprintf("%s%s=%s&", routingHeaders, headerName, headerValue)
|
||||||
|
}
|
||||||
|
routingHeaders = strings.TrimSuffix(routingHeaders, "&")
|
||||||
|
hds := []string{"x-goog-request-params", routingHeaders}
|
||||||
|
|
||||||
|
hds = append(c.xGoogHeaders, hds...)
|
||||||
|
ctx = gax.InsertMetadataIntoOutgoingContext(ctx, hds...)
|
||||||
|
opts = append((*c.CallOptions).RestoreObject[0:len((*c.CallOptions).RestoreObject):len((*c.CallOptions).RestoreObject)], opts...)
|
||||||
|
var resp *storagepb.Object
|
||||||
|
err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
|
||||||
|
var err error
|
||||||
|
resp, err = c.client.RestoreObject(ctx, req, settings.GRPC...)
|
||||||
|
return err
|
||||||
|
}, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *gRPCClient) CancelResumableWrite(ctx context.Context, req *storagepb.CancelResumableWriteRequest, opts ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) {
|
func (c *gRPCClient) CancelResumableWrite(ctx context.Context, req *storagepb.CancelResumableWriteRequest, opts ...gax.CallOption) (*storagepb.CancelResumableWriteResponse, error) {
|
||||||
routingHeaders := ""
|
routingHeaders := ""
|
||||||
routingHeadersMap := make(map[string]string)
|
routingHeadersMap := make(map[string]string)
|
||||||
|
@ -1498,6 +1582,21 @@ func (c *gRPCClient) WriteObject(ctx context.Context, opts ...gax.CallOption) (s
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *gRPCClient) BidiWriteObject(ctx context.Context, opts ...gax.CallOption) (storagepb.Storage_BidiWriteObjectClient, error) {
|
||||||
|
ctx = gax.InsertMetadataIntoOutgoingContext(ctx, c.xGoogHeaders...)
|
||||||
|
var resp storagepb.Storage_BidiWriteObjectClient
|
||||||
|
opts = append((*c.CallOptions).BidiWriteObject[0:len((*c.CallOptions).BidiWriteObject):len((*c.CallOptions).BidiWriteObject)], opts...)
|
||||||
|
err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error {
|
||||||
|
var err error
|
||||||
|
resp, err = c.client.BidiWriteObject(ctx, settings.GRPC...)
|
||||||
|
return err
|
||||||
|
}, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *gRPCClient) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator {
|
func (c *gRPCClient) ListObjects(ctx context.Context, req *storagepb.ListObjectsRequest, opts ...gax.CallOption) *ObjectIterator {
|
||||||
routingHeaders := ""
|
routingHeaders := ""
|
||||||
routingHeadersMap := make(map[string]string)
|
routingHeadersMap := make(map[string]string)
|
||||||
|
|
4501
vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go
generated
vendored
4501
vendor/cloud.google.com/go/storage/internal/apiv2/storagepb/storage.pb.go
generated
vendored
File diff suppressed because it is too large
Load diff
2
vendor/cloud.google.com/go/storage/internal/version.go
generated
vendored
2
vendor/cloud.google.com/go/storage/internal/version.go
generated
vendored
|
@ -15,4 +15,4 @@
|
||||||
package internal
|
package internal
|
||||||
|
|
||||||
// Version is the current tagged release of the library.
|
// Version is the current tagged release of the library.
|
||||||
const Version = "1.33.0"
|
const Version = "1.34.0"
|
||||||
|
|
46
vendor/cloud.google.com/go/storage/invoke.go
generated
vendored
46
vendor/cloud.google.com/go/storage/invoke.go
generated
vendored
|
@ -20,7 +20,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -29,6 +28,7 @@ import (
|
||||||
sinternal "cloud.google.com/go/storage/internal"
|
sinternal "cloud.google.com/go/storage/internal"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
gax "github.com/googleapis/gax-go/v2"
|
gax "github.com/googleapis/gax-go/v2"
|
||||||
|
"github.com/googleapis/gax-go/v2/callctx"
|
||||||
"google.golang.org/api/googleapi"
|
"google.golang.org/api/googleapi"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
|
@ -37,10 +37,15 @@ import (
|
||||||
var defaultRetry *retryConfig = &retryConfig{}
|
var defaultRetry *retryConfig = &retryConfig{}
|
||||||
var xGoogDefaultHeader = fmt.Sprintf("gl-go/%s gccl/%s", version.Go(), sinternal.Version)
|
var xGoogDefaultHeader = fmt.Sprintf("gl-go/%s gccl/%s", version.Go(), sinternal.Version)
|
||||||
|
|
||||||
|
const (
|
||||||
|
xGoogHeaderKey = "x-goog-api-client"
|
||||||
|
idempotencyHeaderKey = "x-goog-gcs-idempotency-token"
|
||||||
|
)
|
||||||
|
|
||||||
// run determines whether a retry is necessary based on the config and
|
// run determines whether a retry is necessary based on the config and
|
||||||
// idempotency information. It then calls the function with or without retries
|
// idempotency information. It then calls the function with or without retries
|
||||||
// as appropriate, using the configured settings.
|
// as appropriate, using the configured settings.
|
||||||
func run(ctx context.Context, call func() error, retry *retryConfig, isIdempotent bool, setHeader func(string, int)) error {
|
func run(ctx context.Context, call func(ctx context.Context) error, retry *retryConfig, isIdempotent bool) error {
|
||||||
attempts := 1
|
attempts := 1
|
||||||
invocationID := uuid.New().String()
|
invocationID := uuid.New().String()
|
||||||
|
|
||||||
|
@ -48,8 +53,8 @@ func run(ctx context.Context, call func() error, retry *retryConfig, isIdempoten
|
||||||
retry = defaultRetry
|
retry = defaultRetry
|
||||||
}
|
}
|
||||||
if (retry.policy == RetryIdempotent && !isIdempotent) || retry.policy == RetryNever {
|
if (retry.policy == RetryIdempotent && !isIdempotent) || retry.policy == RetryNever {
|
||||||
setHeader(invocationID, attempts)
|
ctxWithHeaders := setInvocationHeaders(ctx, invocationID, attempts)
|
||||||
return call()
|
return call(ctxWithHeaders)
|
||||||
}
|
}
|
||||||
bo := gax.Backoff{}
|
bo := gax.Backoff{}
|
||||||
if retry.backoff != nil {
|
if retry.backoff != nil {
|
||||||
|
@ -63,35 +68,22 @@ func run(ctx context.Context, call func() error, retry *retryConfig, isIdempoten
|
||||||
}
|
}
|
||||||
|
|
||||||
return internal.Retry(ctx, bo, func() (stop bool, err error) {
|
return internal.Retry(ctx, bo, func() (stop bool, err error) {
|
||||||
setHeader(invocationID, attempts)
|
ctxWithHeaders := setInvocationHeaders(ctx, invocationID, attempts)
|
||||||
err = call()
|
err = call(ctxWithHeaders)
|
||||||
attempts++
|
attempts++
|
||||||
return !errorFunc(err), err
|
return !errorFunc(err), err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func setRetryHeaderHTTP(req interface{ Header() http.Header }) func(string, int) {
|
// Sets invocation ID headers on the context which will be propagated as
|
||||||
return func(invocationID string, attempts int) {
|
// headers in the call to the service (for both gRPC and HTTP).
|
||||||
if req == nil {
|
func setInvocationHeaders(ctx context.Context, invocationID string, attempts int) context.Context {
|
||||||
return
|
invocationHeader := fmt.Sprintf("gccl-invocation-id/%v gccl-attempt-count/%v", invocationID, attempts)
|
||||||
}
|
xGoogHeader := strings.Join([]string{invocationHeader, xGoogDefaultHeader}, " ")
|
||||||
header := req.Header()
|
|
||||||
// TODO(b/274504690): Consider dropping gccl-invocation-id key since it
|
|
||||||
// duplicates the X-Goog-Gcs-Idempotency-Token header (added in v1.31.0).
|
|
||||||
invocationHeader := fmt.Sprintf("gccl-invocation-id/%v gccl-attempt-count/%v", invocationID, attempts)
|
|
||||||
xGoogHeader := strings.Join([]string{invocationHeader, xGoogDefaultHeader}, " ")
|
|
||||||
header.Set("x-goog-api-client", xGoogHeader)
|
|
||||||
// Also use the invocationID for the idempotency token header, which will
|
|
||||||
// enable idempotent retries for more operations.
|
|
||||||
header.Set("x-goog-gcs-idempotency-token", invocationID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Implement method setting header via context for gRPC
|
ctx = callctx.SetHeaders(ctx, xGoogHeaderKey, xGoogHeader)
|
||||||
func setRetryHeaderGRPC(_ context.Context) func(string, int) {
|
ctx = callctx.SetHeaders(ctx, idempotencyHeaderKey, invocationID)
|
||||||
return func(_ string, _ int) {
|
return ctx
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShouldRetry returns true if an error is retryable, based on best practice
|
// ShouldRetry returns true if an error is retryable, based on best practice
|
||||||
|
|
10
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
10
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
|
@ -187,16 +187,6 @@ func setConditionsHeaders(headers http.Header, conds *Conditions) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wrap a request to look similar to an apiary library request, in order to
|
|
||||||
// be used by run().
|
|
||||||
type readerRequestWrapper struct {
|
|
||||||
req *http.Request
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *readerRequestWrapper) Header() http.Header {
|
|
||||||
return w.req.Header
|
|
||||||
}
|
|
||||||
|
|
||||||
var emptyBody = ioutil.NopCloser(strings.NewReader(""))
|
var emptyBody = ioutil.NopCloser(strings.NewReader(""))
|
||||||
|
|
||||||
// Reader reads a Cloud Storage object.
|
// Reader reads a Cloud Storage object.
|
||||||
|
|
234
vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md
generated
vendored
234
vendor/github.com/aws/aws-sdk-go-v2/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,237 @@
|
||||||
|
# Release (2023-10-31)
|
||||||
|
|
||||||
|
## General Highlights
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/amplify`: [v1.16.0](service/amplify/CHANGELOG.md#v1160-2023-10-31)
|
||||||
|
* **Feature**: Add backend field to CreateBranch and UpdateBranch requests. Add pagination support for ListApps, ListDomainAssociations, ListBranches, and ListJobs
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/applicationinsights`: [v1.20.0](service/applicationinsights/CHANGELOG.md#v1200-2023-10-31)
|
||||||
|
* **Feature**: Automate attaching managed policies
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.129.0](service/ec2/CHANGELOG.md#v11290-2023-10-31)
|
||||||
|
* **Feature**: Capacity Blocks for ML are a new EC2 purchasing option for reserving GPU instances on a future date to support short duration machine learning (ML) workloads. Capacity Blocks automatically place instances close together inside Amazon EC2 UltraClusters for low-latency, high-throughput networking.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/m2`: [v1.8.0](service/m2/CHANGELOG.md#v180-2023-10-31)
|
||||||
|
* **Feature**: Added name filter ability for ListDataSets API, added ForceUpdate for Updating environment and BatchJob submission using S3BatchJobIdentifier
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/neptunedata`: [v1.1.0](service/neptunedata/CHANGELOG.md#v110-2023-10-31)
|
||||||
|
* **Feature**: Minor change to not retry CancelledByUserException
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/translate`: [v1.20.0](service/translate/CHANGELOG.md#v1200-2023-10-31)
|
||||||
|
* **Feature**: Added support for Brevity translation settings feature.
|
||||||
|
|
||||||
|
# Release (2023-10-30)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.72.0](service/connect/CHANGELOG.md#v1720-2023-10-30)
|
||||||
|
* **Feature**: This release adds InstanceId field for phone number APIs.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/dataexchange`: [v1.22.0](service/dataexchange/CHANGELOG.md#v1220-2023-10-30)
|
||||||
|
* **Feature**: We added a new API action: SendDataSetNotification.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/datasync`: [v1.30.0](service/datasync/CHANGELOG.md#v1300-2023-10-30)
|
||||||
|
* **Feature**: Platform version changes to support AL1 deprecation initiative.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/finspace`: [v1.14.0](service/finspace/CHANGELOG.md#v1140-2023-10-30)
|
||||||
|
* **Feature**: Introducing new API UpdateKxClusterCodeConfiguration, introducing new cache types for clusters and introducing new deployment modes for updating clusters.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/mediapackagev2`: [v1.4.0](service/mediapackagev2/CHANGELOG.md#v140-2023-10-30)
|
||||||
|
* **Feature**: This feature allows customers to create a combination of manifest filtering, startover and time delay configuration that applies to all egress requests by default.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.59.0](service/rds/CHANGELOG.md#v1590-2023-10-30)
|
||||||
|
* **Feature**: This release launches the CreateIntegration, DeleteIntegration, and DescribeIntegrations APIs to manage zero-ETL Integrations.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.9.0](service/redshiftserverless/CHANGELOG.md#v190-2023-10-30)
|
||||||
|
* **Feature**: Added support for custom domain names for Amazon Redshift Serverless workgroups. This feature enables customers to create a custom domain name and use ACM to generate fully secure connections to it.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/resiliencehub`: [v1.14.0](service/resiliencehub/CHANGELOG.md#v1140-2023-10-30)
|
||||||
|
* **Feature**: Introduced the ability to filter applications by their last assessment date and time and have included metrics for the application's estimated workload Recovery Time Objective (RTO) and estimated workload Recovery Point Objective (RPO).
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/s3outposts`: [v1.19.0](service/s3outposts/CHANGELOG.md#v1190-2023-10-30)
|
||||||
|
* **Feature**: Updated ListOutpostsWithS3 API response to include S3OutpostArn for use with AWS RAM.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/wisdom`: [v1.16.1](service/wisdom/CHANGELOG.md#v1161-2023-10-30)
|
||||||
|
* **Documentation**: This release added necessary API documents on creating a Wisdom knowledge base to integrate with S3.
|
||||||
|
|
||||||
|
# Release (2023-10-27)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/emr`: [v1.30.0](service/emr/CHANGELOG.md#v1300-2023-10-27)
|
||||||
|
* **Feature**: Updated CreateCluster API request and DescribeCluster API responses to include EbsRootVolumeIops, and EbsRootVolumeThroughput attributes that specify the user configured root volume IOPS and throughput for Amazon EBS root device volume. This feature will be available from Amazon EMR releases 6.15.0
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/neptune`: [v1.24.0](service/neptune/CHANGELOG.md#v1240-2023-10-27)
|
||||||
|
* **Feature**: Update TdeCredentialPassword type to SensitiveString
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/pinpoint`: [v1.23.1](service/pinpoint/CHANGELOG.md#v1231-2023-10-27)
|
||||||
|
* **Documentation**: Updated documentation to describe the case insensitivity for EndpointIds.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/redshift`: [v1.33.0](service/redshift/CHANGELOG.md#v1330-2023-10-27)
|
||||||
|
* **Feature**: added support to create a dual stack cluster
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/wafv2`: [v1.40.1](service/wafv2/CHANGELOG.md#v1401-2023-10-27)
|
||||||
|
* **Documentation**: Updates the descriptions for the calls that manage web ACL associations, to provide information for customer-managed IAM policies.
|
||||||
|
|
||||||
|
# Release (2023-10-26)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/appstream`: [v1.26.0](service/appstream/CHANGELOG.md#v1260-2023-10-26)
|
||||||
|
* **Feature**: This release introduces multi-session fleets, allowing customers to provision more than one user session on a single fleet instance.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.128.0](service/ec2/CHANGELOG.md#v11280-2023-10-26)
|
||||||
|
* **Feature**: Launching GetSecurityGroupsForVpc API. This API gets security groups that can be associated by the AWS account making the request with network interfaces in the specified VPC.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/networkfirewall`: [v1.32.0](service/networkfirewall/CHANGELOG.md#v1320-2023-10-26)
|
||||||
|
* **Feature**: Network Firewall now supports inspection of outbound SSL/TLS traffic.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.23.0](service/opensearch/CHANGELOG.md#v1230-2023-10-26)
|
||||||
|
* **Feature**: You can specify ipv4 or dualstack IPAddressType for cluster endpoints. If you specify IPAddressType as dualstack, the new endpoint will be visible under the 'EndpointV2' parameter and will support IPv4 and IPv6 requests. Whereas, the 'Endpoint' will continue to serve IPv4 requests.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/redshift`: [v1.32.0](service/redshift/CHANGELOG.md#v1320-2023-10-26)
|
||||||
|
* **Feature**: Add Redshift APIs GetResourcePolicy, DeleteResourcePolicy, PutResourcePolicy and DescribeInboundIntegrations for the new Amazon Redshift Zero-ETL integration feature, which can be used to control data ingress into Redshift namespace, and view inbound integrations.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/sagemaker`: [v1.113.0](service/sagemaker/CHANGELOG.md#v11130-2023-10-26)
|
||||||
|
* **Feature**: Amazon Sagemaker Autopilot now supports Text Generation jobs.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/sns`: [v1.23.0](service/sns/CHANGELOG.md#v1230-2023-10-26)
|
||||||
|
* **Feature**: Message Archiving and Replay is now supported in Amazon SNS for FIFO topics.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/ssmsap`: [v1.6.0](service/ssmsap/CHANGELOG.md#v160-2023-10-26)
|
||||||
|
* **Feature**: AWS Systems Manager for SAP added support for registration and discovery of SAP ABAP applications
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.35.0](service/transfer/CHANGELOG.md#v1350-2023-10-26)
|
||||||
|
* **Feature**: No API changes from previous release. This release migrated the model to Smithy keeping all features unchanged.
|
||||||
|
|
||||||
|
# Release (2023-10-25)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/connectcases`: [v1.8.0](service/connectcases/CHANGELOG.md#v180-2023-10-25)
|
||||||
|
* **Feature**: Increase maximum length of CommentBody to 3000, and increase maximum length of StringValue to 1500
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/groundstation`: [v1.20.0](service/groundstation/CHANGELOG.md#v1200-2023-10-25)
|
||||||
|
* **Feature**: This release will allow KMS alias names to be used when creating Mission Profiles
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.24.0](service/iam/CHANGELOG.md#v1240-2023-10-25)
|
||||||
|
* **Feature**: Updates to GetAccessKeyLastUsed action to replace NoSuchEntity error with AccessDeniedException error.
|
||||||
|
|
||||||
|
# Release (2023-10-24)
|
||||||
|
|
||||||
|
## General Highlights
|
||||||
|
* **Feature**: **BREAKFIX**: Correct nullability and default value representation of various input fields across a large number of services. Calling code that references one or more of the affected fields will need to update usage accordingly. See [2162](https://github.com/aws/aws-sdk-go-v2/issues/2162).
|
||||||
|
* **Feature**: **BREAKFIX**: Correct nullability representation of APIGateway-based services.
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/codepipeline`: [v1.18.0](service/codepipeline/CHANGELOG.md#v1180-2023-10-24)
|
||||||
|
* **Feature**: Add ability to trigger pipelines from git tags, define variables at pipeline level and new pipeline type V2.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.127.0](service/ec2/CHANGELOG.md#v11270-2023-10-24)
|
||||||
|
* **Feature**: This release updates the documentation for InstanceInterruptionBehavior and HibernationOptionsRequest to more accurately describe the behavior of these two parameters when using Spot hibernation.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/eks`: [v1.30.0](service/eks/CHANGELOG.md#v1300-2023-10-24)
|
||||||
|
* **Feature**: Added support for Cluster Subnet and Security Group mutability.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/iam`: [v1.23.0](service/iam/CHANGELOG.md#v1230-2023-10-24)
|
||||||
|
* **Feature**: Add the partitional endpoint for IAM in iso-f.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/migrationhubconfig`: [v1.16.0](service/migrationhubconfig/CHANGELOG.md#v1160-2023-10-24)
|
||||||
|
* **Feature**: This release introduces DeleteHomeRegionControl API that customers can use to delete the Migration Hub Home Region configuration
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/migrationhubstrategy`: [v1.12.0](service/migrationhubstrategy/CHANGELOG.md#v1120-2023-10-24)
|
||||||
|
* **Feature**: This release introduces multi-data-source feature in Migration Hub Strategy Recommendations. This feature now supports vCenter as a data source to fetch inventory in addition to ADS and Import from file workflow that is currently supported with MHSR collector.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/opensearchserverless`: [v1.6.0](service/opensearchserverless/CHANGELOG.md#v160-2023-10-24)
|
||||||
|
* **Feature**: This release includes the following new APIs: CreateLifecyclePolicy, UpdateLifecyclePolicy, BatchGetLifecyclePolicy, DeleteLifecyclePolicy, ListLifecyclePolicies and BatchGetEffectiveLifecyclePolicy to support the data lifecycle management feature.
|
||||||
|
|
||||||
|
# Release (2023-10-23)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/marketplacecommerceanalytics`: [v1.15.0](service/marketplacecommerceanalytics/CHANGELOG.md#v1150-2023-10-23)
|
||||||
|
* **Feature**: The StartSupportDataExport operation has been deprecated as part of the Product Support Connection deprecation. As of December 2022, Product Support Connection is no longer supported.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/networkmanager`: [v1.20.0](service/networkmanager/CHANGELOG.md#v1200-2023-10-23)
|
||||||
|
* **Feature**: This release adds API support for Tunnel-less Connect (NoEncap Protocol) for AWS Cloud WAN
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.8.0](service/redshiftserverless/CHANGELOG.md#v180-2023-10-23)
|
||||||
|
* **Feature**: This release adds support for customers to see the patch version and workgroup version in Amazon Redshift Serverless.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/rekognition`: [v1.32.0](service/rekognition/CHANGELOG.md#v1320-2023-10-23)
|
||||||
|
* **Feature**: Amazon Rekognition introduces StartMediaAnalysisJob, GetMediaAnalysisJob, and ListMediaAnalysisJobs operations to run a bulk analysis of images with a Detect Moderation model.
|
||||||
|
|
||||||
|
# Release (2023-10-20)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/appconfig`: [v1.22.0](service/appconfig/CHANGELOG.md#v1220-2023-10-20)
|
||||||
|
* **Feature**: Update KmsKeyIdentifier constraints to support AWS KMS multi-Region keys.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/appintegrations`: [v1.19.0](service/appintegrations/CHANGELOG.md#v1190-2023-10-20)
|
||||||
|
* **Feature**: Updated ScheduleConfig to be an optional input to CreateDataIntegration to support event driven downloading of files from sources such as Amazon s3 using Amazon Connect AppIntegrations.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/applicationdiscoveryservice`: [v1.19.0](service/applicationdiscoveryservice/CHANGELOG.md#v1190-2023-10-20)
|
||||||
|
* **Feature**: This release introduces three new APIs: StartBatchDeleteConfigurationTask, DescribeBatchDeleteConfigurationTask, and BatchDeleteAgents.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/connect`: [v1.70.0](service/connect/CHANGELOG.md#v1700-2023-10-20)
|
||||||
|
* **Feature**: This release adds support for updating phone number metadata, such as phone number description.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/medicalimaging`: [v1.2.3](service/medicalimaging/CHANGELOG.md#v123-2023-10-20)
|
||||||
|
* **Documentation**: Updates on documentation links
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/ssm`: [v1.39.0](service/ssm/CHANGELOG.md#v1390-2023-10-20)
|
||||||
|
* **Feature**: This release introduces a new API: DeleteOpsItem. This allows deletion of an OpsItem.
|
||||||
|
|
||||||
|
# Release (2023-10-19)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/ec2`: [v1.126.0](service/ec2/CHANGELOG.md#v11260-2023-10-19)
|
||||||
|
* **Feature**: Amazon EC2 C7a instances, powered by 4th generation AMD EPYC processors, are ideal for high performance, compute-intensive workloads such as high performance computing. Amazon EC2 R7i instances are next-generation memory optimized and powered by custom 4th Generation Intel Xeon Scalable processors.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/managedblockchainquery`: [v1.3.0](service/managedblockchainquery/CHANGELOG.md#v130-2023-10-19)
|
||||||
|
* **Feature**: This release adds support for Ethereum Sepolia network
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/neptunedata`: [v1.0.4](service/neptunedata/CHANGELOG.md#v104-2023-10-19)
|
||||||
|
* **Documentation**: Doc changes to add IAM action mappings for the data actions.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/omics`: [v1.11.0](service/omics/CHANGELOG.md#v1110-2023-10-19)
|
||||||
|
* **Feature**: This change enables customers to retrieve failure reasons with detailed status messages for their failed runs
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.21.0](service/opensearch/CHANGELOG.md#v1210-2023-10-19)
|
||||||
|
* **Feature**: Added Cluster Administrative options for node restart, opensearch process restart and opensearch dashboard restart for Multi-AZ without standby domains
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/quicksight`: [v1.46.0](service/quicksight/CHANGELOG.md#v1460-2023-10-19)
|
||||||
|
* **Feature**: This release adds the following: 1) Trino and Starburst Database Connectors 2) Custom total for tables and pivot tables 3) Enable restricted folders 4) Add rolling dates for time equality filters 5) Refine DataPathValue and introduce DataPathType 6) Add SeriesType to ReferenceLineDataConfiguration
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/secretsmanager`: [v1.21.6](service/secretsmanager/CHANGELOG.md#v1216-2023-10-19)
|
||||||
|
* **Documentation**: Documentation updates for Secrets Manager
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/servicecatalog`: [v1.22.0](service/servicecatalog/CHANGELOG.md#v1220-2023-10-19)
|
||||||
|
* **Feature**: Introduce support for EXTERNAL product and provisioning artifact type in CreateProduct and CreateProvisioningArtifact APIs.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/verifiedpermissions`: [v1.3.0](service/verifiedpermissions/CHANGELOG.md#v130-2023-10-19)
|
||||||
|
* **Feature**: Improving Amazon Verified Permissions Create experience
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/workspaces`: [v1.31.3](service/workspaces/CHANGELOG.md#v1313-2023-10-19)
|
||||||
|
* **Documentation**: Documentation updates for WorkSpaces
|
||||||
|
|
||||||
|
# Release (2023-10-18)
|
||||||
|
|
||||||
|
## General Highlights
|
||||||
|
* **Feature**: Add handwritten paginators that were present in some services in the v1 SDK.
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/cloud9`: [v1.18.11](service/cloud9/CHANGELOG.md#v11811-2023-10-18)
|
||||||
|
* **Documentation**: Update to imageId parameter behavior and dates updated.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/dynamodb`: [v1.23.0](service/dynamodb/CHANGELOG.md#v1230-2023-10-18)
|
||||||
|
* **Documentation**: Updating descriptions for several APIs.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/kendra`: [v1.44.0](service/kendra/CHANGELOG.md#v1440-2023-10-18)
|
||||||
|
* **Feature**: Changes for a new feature in Amazon Kendra's Query API to Collapse/Expand query results
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/rds`: [v1.57.0](service/rds/CHANGELOG.md#v1570-2023-10-18)
|
||||||
|
* **Feature**: This release adds support for upgrading the storage file system configuration on the DB instance using a blue/green deployment or a read replica.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/wisdom`: [v1.16.0](service/wisdom/CHANGELOG.md#v1160-2023-10-18)
|
||||||
|
* **Feature**: This release adds an max limit of 25 recommendation ids for NotifyRecommendationsReceived API.
|
||||||
|
|
||||||
|
# Release (2023-10-17)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/applicationdiscoveryservice`: [v1.18.0](service/applicationdiscoveryservice/CHANGELOG.md#v1180-2023-10-17)
|
||||||
|
* **Feature**: This release introduces three new APIs: StartBatchDeleteConfigurationTask, DescribeBatchDeleteConfigurationTask, and BatchDeleteAgents.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/codepipeline`: [v1.17.0](service/codepipeline/CHANGELOG.md#v1170-2023-10-17)
|
||||||
|
* **Feature**: Add retryMode ALL_ACTIONS to RetryStageExecution API that retries a failed stage starting from first action in the stage
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/ecs`: [v1.30.4](service/ecs/CHANGELOG.md#v1304-2023-10-17)
|
||||||
|
* **Documentation**: Documentation only updates to address Amazon ECS tickets.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/guardduty`: [v1.29.0](service/guardduty/CHANGELOG.md#v1290-2023-10-17)
|
||||||
|
* **Feature**: Add domainWithSuffix finding field to dnsRequestAction
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/kafka`: [v1.23.0](service/kafka/CHANGELOG.md#v1230-2023-10-17)
|
||||||
|
* **Feature**: AWS Managed Streaming for Kafka is launching MSK Replicator, a new feature that enables customers to reliably replicate data across Amazon MSK clusters in same or different AWS regions. You can now use SDK to create, list, describe, delete, update, and manage tags of MSK Replicators.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/route53recoverycluster`: [v1.14.0](service/route53recoverycluster/CHANGELOG.md#v1140-2023-10-17)
|
||||||
|
* **Feature**: Adds Owner field to ListRoutingControls API.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/route53recoverycontrolconfig`: [v1.14.0](service/route53recoverycontrolconfig/CHANGELOG.md#v1140-2023-10-17)
|
||||||
|
* **Feature**: Adds permissions for GetResourcePolicy to support returning details about AWS Resource Access Manager resource policies for shared resources.
|
||||||
|
|
||||||
|
# Release (2023-10-16)
|
||||||
|
|
||||||
|
## General Highlights
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/config`: [v1.19.0](config/CHANGELOG.md#v1190-2023-10-16)
|
||||||
|
* **Feature**: Modify logic of retrieving user agent appID from env config
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign`: [v1.4.0](feature/cloudfront/sign/CHANGELOG.md#v140-2023-10-16)
|
||||||
|
* **Feature**: Add support for loading PKCS8-formatted private keys.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/cloudformation`: [v1.35.0](service/cloudformation/CHANGELOG.md#v1350-2023-10-16)
|
||||||
|
* **Feature**: SDK and documentation updates for UpdateReplacePolicy
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/drs`: [v1.17.0](service/drs/CHANGELOG.md#v1170-2023-10-16)
|
||||||
|
* **Feature**: Updated exsiting API to allow AWS Elastic Disaster Recovery support of launching recovery into existing EC2 instances.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/entityresolution`: [v1.3.0](service/entityresolution/CHANGELOG.md#v130-2023-10-16)
|
||||||
|
* **Feature**: This launch expands our matching techniques to include provider-based matching to help customer match, link, and enhance records with minimal data movement. With data service providers, we have removed the need for customers to build bespoke integrations,.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/managedblockchainquery`: [v1.2.0](service/managedblockchainquery/CHANGELOG.md#v120-2023-10-16)
|
||||||
|
* **Feature**: This release introduces two new APIs: GetAssetContract and ListAssetContracts. This release also adds support for Bitcoin Testnet.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/mediapackagev2`: [v1.3.0](service/mediapackagev2/CHANGELOG.md#v130-2023-10-16)
|
||||||
|
* **Feature**: This release allows customers to manage MediaPackage v2 resource using CloudFormation.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/opensearch`: [v1.20.0](service/opensearch/CHANGELOG.md#v1200-2023-10-16)
|
||||||
|
* **Feature**: This release allows customers to list and associate optional plugin packages with compatible Amazon OpenSearch Service clusters for enhanced functionality.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/redshift`: [v1.30.0](service/redshift/CHANGELOG.md#v1300-2023-10-16)
|
||||||
|
* **Feature**: Added support for managing credentials of provisioned cluster admin using AWS Secrets Manager.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/redshiftserverless`: [v1.7.0](service/redshiftserverless/CHANGELOG.md#v170-2023-10-16)
|
||||||
|
* **Feature**: Added support for managing credentials of serverless namespace admin using AWS Secrets Manager.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/sesv2`: [v1.21.0](service/sesv2/CHANGELOG.md#v1210-2023-10-16)
|
||||||
|
* **Feature**: This release provides enhanced visibility into your SES identity verification status. This will offer you more actionable insights, enabling you to promptly address any verification-related issues.
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/transfer`: [v1.34.2](service/transfer/CHANGELOG.md#v1342-2023-10-16)
|
||||||
|
* **Documentation**: Documentation updates for AWS Transfer Family
|
||||||
|
* `github.com/aws/aws-sdk-go-v2/service/xray`: [v1.19.0](service/xray/CHANGELOG.md#v1190-2023-10-16)
|
||||||
|
* **Feature**: This releases enhances GetTraceSummaries API to support new TimeRangeType Service to query trace summaries by segment end time.
|
||||||
|
|
||||||
# Release (2023-10-12)
|
# Release (2023-10-12)
|
||||||
|
|
||||||
## General Highlights
|
## General Highlights
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/Makefile
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/Makefile
generated
vendored
|
@ -10,7 +10,7 @@ BUILD_TAGS=-tags "example,codegen,integration,ec2env,perftest"
|
||||||
|
|
||||||
SMITHY_GO_SRC ?= $(shell pwd)/../smithy-go
|
SMITHY_GO_SRC ?= $(shell pwd)/../smithy-go
|
||||||
|
|
||||||
SDK_MIN_GO_VERSION ?= 1.15
|
SDK_MIN_GO_VERSION ?= 1.19
|
||||||
|
|
||||||
EACHMODULE_FAILFAST ?= true
|
EACHMODULE_FAILFAST ?= true
|
||||||
EACHMODULE_FAILFAST_FLAG=-fail-fast=${EACHMODULE_FAILFAST}
|
EACHMODULE_FAILFAST_FLAG=-fail-fast=${EACHMODULE_FAILFAST}
|
||||||
|
|
11
vendor/github.com/aws/aws-sdk-go-v2/README.md
generated
vendored
11
vendor/github.com/aws/aws-sdk-go-v2/README.md
generated
vendored
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
`aws-sdk-go-v2` is the v2 AWS SDK for the Go programming language.
|
`aws-sdk-go-v2` is the v2 AWS SDK for the Go programming language.
|
||||||
|
|
||||||
The v2 SDK requires a minimum version of `Go 1.15`.
|
The v2 SDK requires a minimum version of `Go 1.19`.
|
||||||
|
|
||||||
Check out the [release notes](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) for information about the latest bug
|
Check out the [release notes](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) for information about the latest bug
|
||||||
fixes, updates, and features added to the SDK.
|
fixes, updates, and features added to the SDK.
|
||||||
|
@ -23,6 +23,15 @@ following in the AWS SDKs and Tools Shared Configuration and Credentials Referen
|
||||||
* [AWS SDKs and Tools Maintenance Policy](https://docs.aws.amazon.com/credref/latest/refdocs/maint-policy.html)
|
* [AWS SDKs and Tools Maintenance Policy](https://docs.aws.amazon.com/credref/latest/refdocs/maint-policy.html)
|
||||||
* [AWS SDKs and Tools Version Support Matrix](https://docs.aws.amazon.com/credref/latest/refdocs/version-support-matrix.html)
|
* [AWS SDKs and Tools Version Support Matrix](https://docs.aws.amazon.com/credref/latest/refdocs/version-support-matrix.html)
|
||||||
|
|
||||||
|
### Go version support policy
|
||||||
|
|
||||||
|
The v2 SDK follows the upstream [release policy](https://go.dev/doc/devel/release#policy)
|
||||||
|
with an additional six months of support for the most recently deprecated
|
||||||
|
language version.
|
||||||
|
|
||||||
|
**AWS reserves the right to drop support for unsupported Go versions earlier to
|
||||||
|
address critical security issues.**
|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
To get started working with the SDK setup your project for Go modules, and retrieve the SDK dependencies with `go get`.
|
To get started working with the SDK setup your project for Go modules, and retrieve the SDK dependencies with `go get`.
|
||||||
This example shows how you can use the v2 SDK to make an API request using the SDK's [Amazon DynamoDB] client.
|
This example shows how you can use the v2 SDK to make an API request using the SDK's [Amazon DynamoDB] client.
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package aws
|
package aws
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.21.2"
|
const goModuleVersion = "1.22.0"
|
||||||
|
|
4
vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md
generated
vendored
4
vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,7 @@
|
||||||
|
# v1.5.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
|
||||||
# v1.4.14 (2023-10-06)
|
# v1.4.14 (2023-10-06)
|
||||||
|
|
||||||
* No change notes available for this release.
|
* No change notes available for this release.
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package eventstream
|
package eventstream
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.4.14"
|
const goModuleVersion = "1.5.0"
|
||||||
|
|
13
vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
generated
vendored
13
vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,16 @@
|
||||||
|
# v1.20.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.19.1 (2023-10-24)
|
||||||
|
|
||||||
|
* No change notes available for this release.
|
||||||
|
|
||||||
|
# v1.19.0 (2023-10-16)
|
||||||
|
|
||||||
|
* **Feature**: Modify logic of retrieving user agent appID from env config
|
||||||
|
|
||||||
# v1.18.45 (2023-10-12)
|
# v1.18.45 (2023-10-12)
|
||||||
|
|
||||||
* **Bug Fix**: Fail to load config if an explicitly provided profile doesn't exist.
|
* **Bug Fix**: Fail to load config if an explicitly provided profile doesn't exist.
|
||||||
|
|
10
vendor/github.com/aws/aws-sdk-go-v2/config/env_config.go
generated
vendored
10
vendor/github.com/aws/aws-sdk-go-v2/config/env_config.go
generated
vendored
|
@ -69,6 +69,7 @@ const (
|
||||||
|
|
||||||
awsRetryMaxAttempts = "AWS_MAX_ATTEMPTS"
|
awsRetryMaxAttempts = "AWS_MAX_ATTEMPTS"
|
||||||
awsRetryMode = "AWS_RETRY_MODE"
|
awsRetryMode = "AWS_RETRY_MODE"
|
||||||
|
awsSdkAppID = "AWS_SDK_UA_APP_ID"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -248,6 +249,9 @@ type EnvConfig struct {
|
||||||
//
|
//
|
||||||
// aws_retry_mode=standard
|
// aws_retry_mode=standard
|
||||||
RetryMode aws.RetryMode
|
RetryMode aws.RetryMode
|
||||||
|
|
||||||
|
// aws sdk app ID that can be added to user agent header string
|
||||||
|
AppID string
|
||||||
}
|
}
|
||||||
|
|
||||||
// loadEnvConfig reads configuration values from the OS's environment variables.
|
// loadEnvConfig reads configuration values from the OS's environment variables.
|
||||||
|
@ -288,6 +292,8 @@ func NewEnvConfig() (EnvConfig, error) {
|
||||||
cfg.RoleARN = os.Getenv(awsRoleARNEnvVar)
|
cfg.RoleARN = os.Getenv(awsRoleARNEnvVar)
|
||||||
cfg.RoleSessionName = os.Getenv(awsRoleSessionNameEnvVar)
|
cfg.RoleSessionName = os.Getenv(awsRoleSessionNameEnvVar)
|
||||||
|
|
||||||
|
cfg.AppID = os.Getenv(awsSdkAppID)
|
||||||
|
|
||||||
if err := setEndpointDiscoveryTypeFromEnvVal(&cfg.EnableEndpointDiscovery, []string{awsEnableEndpointDiscoveryEnvVar}); err != nil {
|
if err := setEndpointDiscoveryTypeFromEnvVal(&cfg.EnableEndpointDiscovery, []string{awsEnableEndpointDiscoveryEnvVar}); err != nil {
|
||||||
return cfg, err
|
return cfg, err
|
||||||
}
|
}
|
||||||
|
@ -335,6 +341,10 @@ func (c EnvConfig) getDefaultsMode(ctx context.Context) (aws.DefaultsMode, bool,
|
||||||
return c.DefaultsMode, true, nil
|
return c.DefaultsMode, true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c EnvConfig) getAppID(context.Context) (string, bool, error) {
|
||||||
|
return c.AppID, len(c.AppID) > 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetRetryMaxAttempts returns the value of AWS_MAX_ATTEMPTS if was specified,
|
// GetRetryMaxAttempts returns the value of AWS_MAX_ATTEMPTS if was specified,
|
||||||
// and not 0.
|
// and not 0.
|
||||||
func (c EnvConfig) GetRetryMaxAttempts(ctx context.Context) (int, bool, error) {
|
func (c EnvConfig) GetRetryMaxAttempts(ctx context.Context) (int, bool, error) {
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package config
|
package config
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.18.45"
|
const goModuleVersion = "1.20.0"
|
||||||
|
|
20
vendor/github.com/aws/aws-sdk-go-v2/config/provider.go
generated
vendored
20
vendor/github.com/aws/aws-sdk-go-v2/config/provider.go
generated
vendored
|
@ -122,6 +122,26 @@ func getRegion(ctx context.Context, configs configs) (value string, found bool,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IgnoreConfiguredEndpointsProvider is needed to search for all providers
|
||||||
|
// that provide a flag to disable configured endpoints.
|
||||||
|
type IgnoreConfiguredEndpointsProvider interface {
|
||||||
|
GetIgnoreConfiguredEndpoints(ctx context.Context) (bool, bool, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetIgnoreConfiguredEndpoints is used in knowing when to disable configured
|
||||||
|
// endpoints feature.
|
||||||
|
func GetIgnoreConfiguredEndpoints(ctx context.Context, configs []Config) (value bool, found bool, err error) {
|
||||||
|
for _, cfg := range configs {
|
||||||
|
if p, ok := cfg.(IgnoreConfiguredEndpointsProvider); ok {
|
||||||
|
value, found, err = p.GetIgnoreConfiguredEndpoints(ctx)
|
||||||
|
if err != nil || found {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// appIDProvider provides access to the sdk app ID value
|
// appIDProvider provides access to the sdk app ID value
|
||||||
type appIDProvider interface {
|
type appIDProvider interface {
|
||||||
getAppID(ctx context.Context) (string, bool, error)
|
getAppID(ctx context.Context) (string, bool, error)
|
||||||
|
|
4
vendor/github.com/aws/aws-sdk-go-v2/config/resolve.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go-v2/config/resolve.go
generated
vendored
|
@ -113,10 +113,6 @@ func resolveAppID(ctx context.Context, cfg *aws.Config, configs configs) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// if app ID is set in env var, it should precedence shared config value
|
|
||||||
if appID := os.Getenv(`AWS_SDK_UA_APP_ID`); len(appID) > 0 {
|
|
||||||
ID = appID
|
|
||||||
}
|
|
||||||
cfg.AppID = ID
|
cfg.AppID = ID
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.14.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.13.43 (2023-10-12)
|
# v1.13.43 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package credentials
|
package credentials
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.13.43"
|
const goModuleVersion = "1.14.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.14.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.13.13 (2023-10-12)
|
# v1.13.13 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package imds
|
package imds
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.13.13"
|
const goModuleVersion = "1.14.0"
|
||||||
|
|
13
vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md
generated
vendored
13
vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,16 @@
|
||||||
|
# v1.12.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.11.92 (2023-10-24)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
|
# v1.11.91 (2023-10-16)
|
||||||
|
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.11.90 (2023-10-12)
|
# v1.11.90 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/feature/s3/manager/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package manager
|
package manager
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.11.90"
|
const goModuleVersion = "1.12.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.2.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.1.43 (2023-10-12)
|
# v1.1.43 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package configsources
|
package configsources
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.1.43"
|
const goModuleVersion = "1.2.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v2.5.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v2.4.37 (2023-10-12)
|
# v2.4.37 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "2.4.37"
|
const goModuleVersion = "2.5.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.4.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.3.45 (2023-10-12)
|
# v1.3.45 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package ini
|
package ini
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.3.45"
|
const goModuleVersion = "1.4.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.2.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.1.6 (2023-10-12)
|
# v1.1.6 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/internal/v4a/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package v4a
|
package v4a
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.1.6"
|
const goModuleVersion = "1.2.0"
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/modman.toml
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/modman.toml
generated
vendored
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
"github.com/aws/aws-sdk-go" = "v1.44.28"
|
"github.com/aws/aws-sdk-go" = "v1.44.28"
|
||||||
"github.com/aws/smithy-go" = "v1.15.0"
|
"github.com/aws/smithy-go" = "v1.16.0"
|
||||||
"github.com/google/go-cmp" = "v0.5.8"
|
"github.com/google/go-cmp" = "v0.5.8"
|
||||||
"github.com/jmespath/go-jmespath" = "v0.4.0"
|
"github.com/jmespath/go-jmespath" = "v0.4.0"
|
||||||
"golang.org/x/net" = "v0.1.0"
|
"golang.org/x/net" = "v0.1.0"
|
||||||
|
|
4
vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
generated
vendored
4
vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,7 @@
|
||||||
|
# v1.10.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
|
||||||
# v1.9.15 (2023-10-06)
|
# v1.9.15 (2023-10-06)
|
||||||
|
|
||||||
* No change notes available for this release.
|
* No change notes available for this release.
|
||||||
|
|
|
@ -3,4 +3,4 @@
|
||||||
package acceptencoding
|
package acceptencoding
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.9.15"
|
const goModuleVersion = "1.10.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.2.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.1.38 (2023-10-12)
|
# v1.1.38 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/service/internal/checksum/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package checksum
|
package checksum
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.1.38"
|
const goModuleVersion = "1.2.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.10.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.9.37 (2023-10-12)
|
# v1.9.37 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
|
@ -3,4 +3,4 @@
|
||||||
package presignedurl
|
package presignedurl
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.9.37"
|
const goModuleVersion = "1.10.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.16.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.15.6 (2023-10-12)
|
# v1.15.6 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/service/internal/s3shared/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package s3shared
|
package s3shared
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.15.6"
|
const goModuleVersion = "1.16.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/service/s3/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.41.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.40.2 (2023-10-12)
|
# v1.40.2 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/service/s3/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package s3
|
package s3
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.40.2"
|
const goModuleVersion = "1.41.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.16.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.15.2 (2023-10-12)
|
# v1.15.2 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package sso
|
package sso
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.15.2"
|
const goModuleVersion = "1.16.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.18.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.17.3 (2023-10-12)
|
# v1.17.3 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package ssooidc
|
package ssooidc
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.17.3"
|
const goModuleVersion = "1.18.0"
|
||||||
|
|
5
vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
generated
vendored
5
vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,8 @@
|
||||||
|
# v1.24.0 (2023-10-31)
|
||||||
|
|
||||||
|
* **Feature**: **BREAKING CHANGE**: Bump minimum go version to 1.19 per the revised [go version support policy](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-aligns-with-go-release-policy-on-supported-runtimes/).
|
||||||
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
||||||
# v1.23.2 (2023-10-12)
|
# v1.23.2 (2023-10-12)
|
||||||
|
|
||||||
* **Dependency Update**: Updated to the latest SDK module versions
|
* **Dependency Update**: Updated to the latest SDK module versions
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package sts
|
package sts
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.23.2"
|
const goModuleVersion = "1.24.0"
|
||||||
|
|
266
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
266
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
|
@ -4492,6 +4492,14 @@ var awsPartition = partition{
|
||||||
Region: "ap-southeast-1",
|
Region: "ap-southeast-1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "bedrock-eu-central-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "bedrock.eu-central-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "eu-central-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "bedrock-fips-us-east-1",
|
Region: "bedrock-fips-us-east-1",
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
|
@ -4524,6 +4532,14 @@ var awsPartition = partition{
|
||||||
Region: "ap-southeast-1",
|
Region: "ap-southeast-1",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "bedrock-runtime-eu-central-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "bedrock-runtime.eu-central-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "eu-central-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "bedrock-runtime-fips-us-east-1",
|
Region: "bedrock-runtime-fips-us-east-1",
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
|
@ -4572,6 +4588,9 @@ var awsPartition = partition{
|
||||||
Region: "us-west-2",
|
Region: "us-west-2",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "eu-central-1",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-east-1",
|
Region: "us-east-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -11312,6 +11331,12 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-east-2",
|
Region: "us-east-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-east-2",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "elasticmapreduce.us-east-2.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-east-2",
|
Region: "us-east-2",
|
||||||
Variant: fipsVariant,
|
Variant: fipsVariant,
|
||||||
|
@ -11525,6 +11550,9 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-northeast-2",
|
Region: "ap-northeast-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-3",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-south-1",
|
Region: "ap-south-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -12321,12 +12349,27 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
"finspace": service{
|
"finspace": service{
|
||||||
Endpoints: serviceEndpoints{
|
Endpoints: serviceEndpoints{
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-1",
|
||||||
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-southeast-1",
|
||||||
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-southeast-2",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ca-central-1",
|
Region: "ca-central-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "eu-central-1",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "eu-west-1",
|
Region: "eu-west-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "eu-west-2",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-east-1",
|
Region: "us-east-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -13428,16 +13471,6 @@ var awsPartition = partition{
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"gamesparks": service{
|
|
||||||
Endpoints: serviceEndpoints{
|
|
||||||
endpointKey{
|
|
||||||
Region: "ap-northeast-1",
|
|
||||||
}: endpoint{},
|
|
||||||
endpointKey{
|
|
||||||
Region: "us-east-1",
|
|
||||||
}: endpoint{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"geo": service{
|
"geo": service{
|
||||||
Endpoints: serviceEndpoints{
|
Endpoints: serviceEndpoints{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
|
@ -15698,12 +15731,45 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
"iottwinmaker": service{
|
"iottwinmaker": service{
|
||||||
Endpoints: serviceEndpoints{
|
Endpoints: serviceEndpoints{
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-1",
|
||||||
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-2",
|
||||||
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-south-1",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-southeast-1",
|
Region: "ap-southeast-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-southeast-2",
|
Region: "ap-southeast-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "api-ap-northeast-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "api.iottwinmaker.ap-northeast-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "ap-northeast-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "api-ap-northeast-2",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "api.iottwinmaker.ap-northeast-2.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "ap-northeast-2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "api-ap-south-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "api.iottwinmaker.ap-south-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "ap-south-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "api-ap-southeast-1",
|
Region: "api-ap-southeast-1",
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
|
@ -15752,6 +15818,30 @@ var awsPartition = partition{
|
||||||
Region: "us-west-2",
|
Region: "us-west-2",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "data-ap-northeast-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "data.iottwinmaker.ap-northeast-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "ap-northeast-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "data-ap-northeast-2",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "data.iottwinmaker.ap-northeast-2.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "ap-northeast-2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "data-ap-south-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "data.iottwinmaker.ap-south-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "ap-south-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "data-ap-southeast-1",
|
Region: "data-ap-southeast-1",
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
|
@ -18118,6 +18208,9 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "il-central-1",
|
Region: "il-central-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "me-central-1",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "me-south-1",
|
Region: "me-south-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -19082,6 +19175,9 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-northeast-2",
|
Region: "ap-northeast-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-3",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-south-1",
|
Region: "ap-south-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -19134,6 +19230,9 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-northeast-2",
|
Region: "ap-northeast-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-3",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-south-1",
|
Region: "ap-south-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -19186,6 +19285,9 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-northeast-2",
|
Region: "ap-northeast-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-3",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-south-1",
|
Region: "ap-south-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -26012,6 +26114,9 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-northeast-2",
|
Region: "ap-northeast-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ap-northeast-3",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-south-1",
|
Region: "ap-south-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -26021,15 +26126,24 @@ var awsPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "ap-southeast-2",
|
Region: "ap-southeast-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "ca-central-1",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "eu-central-1",
|
Region: "eu-central-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "eu-north-1",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "eu-west-1",
|
Region: "eu-west-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "eu-west-2",
|
Region: "eu-west-2",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "eu-west-3",
|
||||||
|
}: endpoint{},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "sa-east-1",
|
Region: "sa-east-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
@ -33252,9 +33366,21 @@ var awscnPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "cn-north-1",
|
Region: "cn-north-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "cn-north-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "elasticmapreduce.cn-north-1.api.amazonwebservices.com.cn",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "cn-northwest-1",
|
Region: "cn-northwest-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "cn-northwest-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "elasticmapreduce.cn-northwest-1.api.amazonwebservices.com.cn",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"emr-containers": service{
|
"emr-containers": service{
|
||||||
|
@ -34287,9 +34413,21 @@ var awscnPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "cn-north-1",
|
Region: "cn-north-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "cn-north-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "states.cn-north-1.api.amazonwebservices.com.cn",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "cn-northwest-1",
|
Region: "cn-northwest-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "cn-northwest-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "states.cn-northwest-1.api.amazonwebservices.com.cn",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"storagegateway": service{
|
"storagegateway": service{
|
||||||
|
@ -36778,6 +36916,12 @@ var awsusgovPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-east-1",
|
Region: "us-gov-east-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "elasticmapreduce.us-gov-east-1.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-east-1",
|
Region: "us-gov-east-1",
|
||||||
Variant: fipsVariant,
|
Variant: fipsVariant,
|
||||||
|
@ -36789,6 +36933,13 @@ var awsusgovPartition = partition{
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
Protocols: []string{"https"},
|
Protocols: []string{"https"},
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "elasticmapreduce.us-gov-west-1.api.aws",
|
||||||
|
Protocols: []string{"https"},
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-west-1",
|
Region: "us-gov-west-1",
|
||||||
Variant: fipsVariant,
|
Variant: fipsVariant,
|
||||||
|
@ -37198,21 +37349,45 @@ var awsusgovPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-east-1",
|
Region: "us-gov-east-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "glue.us-gov-east-1.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-east-1",
|
Region: "us-gov-east-1",
|
||||||
Variant: fipsVariant,
|
Variant: fipsVariant,
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
Hostname: "glue-fips.us-gov-east-1.amazonaws.com",
|
Hostname: "glue-fips.us-gov-east-1.amazonaws.com",
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
Variant: fipsVariant | dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "glue-fips.us-gov-east-1.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-west-1",
|
Region: "us-gov-west-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "glue.us-gov-west-1.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-west-1",
|
Region: "us-gov-west-1",
|
||||||
Variant: fipsVariant,
|
Variant: fipsVariant,
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
Hostname: "glue-fips.us-gov-west-1.amazonaws.com",
|
Hostname: "glue-fips.us-gov-west-1.amazonaws.com",
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
Variant: fipsVariant | dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "glue-fips.us-gov-west-1.api.aws",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"greengrass": service{
|
"greengrass": service{
|
||||||
|
@ -38047,21 +38222,45 @@ var awsusgovPartition = partition{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-east-1",
|
Region: "us-gov-east-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "lakeformation.us-gov-east-1.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-east-1",
|
Region: "us-gov-east-1",
|
||||||
Variant: fipsVariant,
|
Variant: fipsVariant,
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
Hostname: "lakeformation-fips.us-gov-east-1.amazonaws.com",
|
Hostname: "lakeformation-fips.us-gov-east-1.amazonaws.com",
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
Variant: fipsVariant | dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "lakeformation-fips.us-gov-east-1.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-west-1",
|
Region: "us-gov-west-1",
|
||||||
}: endpoint{},
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
Variant: dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "lakeformation.us-gov-west-1.api.aws",
|
||||||
|
},
|
||||||
endpointKey{
|
endpointKey{
|
||||||
Region: "us-gov-west-1",
|
Region: "us-gov-west-1",
|
||||||
Variant: fipsVariant,
|
Variant: fipsVariant,
|
||||||
}: endpoint{
|
}: endpoint{
|
||||||
Hostname: "lakeformation-fips.us-gov-west-1.amazonaws.com",
|
Hostname: "lakeformation-fips.us-gov-west-1.amazonaws.com",
|
||||||
},
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
Variant: fipsVariant | dualStackVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "lakeformation-fips.us-gov-west-1.api.aws",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"lambda": service{
|
"lambda": service{
|
||||||
|
@ -39033,6 +39232,46 @@ var awsusgovPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"resiliencehub": service{
|
||||||
|
Endpoints: serviceEndpoints{
|
||||||
|
endpointKey{
|
||||||
|
Region: "fips-us-gov-east-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "resiliencehub-fips.us-gov-east-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
},
|
||||||
|
Deprecated: boxedTrue,
|
||||||
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "fips-us-gov-west-1",
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "resiliencehub-fips.us-gov-west-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
},
|
||||||
|
Deprecated: boxedTrue,
|
||||||
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-east-1",
|
||||||
|
Variant: fipsVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "resiliencehub-fips.us-gov-east-1.amazonaws.com",
|
||||||
|
},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
}: endpoint{},
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
Variant: fipsVariant,
|
||||||
|
}: endpoint{
|
||||||
|
Hostname: "resiliencehub-fips.us-gov-west-1.amazonaws.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
"resource-explorer-2": service{
|
"resource-explorer-2": service{
|
||||||
Defaults: endpointDefaults{
|
Defaults: endpointDefaults{
|
||||||
defaultKey{}: endpoint{
|
defaultKey{}: endpoint{
|
||||||
|
@ -41792,6 +42031,13 @@ var awsisobPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"api.sagemaker": service{
|
||||||
|
Endpoints: serviceEndpoints{
|
||||||
|
endpointKey{
|
||||||
|
Region: "us-isob-east-1",
|
||||||
|
}: endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"appconfig": service{
|
"appconfig": service{
|
||||||
Endpoints: serviceEndpoints{
|
Endpoints: serviceEndpoints{
|
||||||
endpointKey{
|
endpointKey{
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
|
@ -5,4 +5,4 @@ package aws
|
||||||
const SDKName = "aws-sdk-go"
|
const SDKName = "aws-sdk-go"
|
||||||
|
|
||||||
// SDKVersion is the version of this SDK
|
// SDKVersion is the version of this SDK
|
||||||
const SDKVersion = "1.45.25"
|
const SDKVersion = "1.47.0"
|
||||||
|
|
6
vendor/github.com/aws/smithy-go/CHANGELOG.md
generated
vendored
6
vendor/github.com/aws/smithy-go/CHANGELOG.md
generated
vendored
|
@ -1,3 +1,9 @@
|
||||||
|
# Release (2023-10-31)
|
||||||
|
|
||||||
|
## Module Highlights
|
||||||
|
* `github.com/aws/smithy-go`: v1.16.0
|
||||||
|
* **Feature**: **LANG**: Bump minimum go version to 1.19.
|
||||||
|
|
||||||
# Release (2023-10-06)
|
# Release (2023-10-06)
|
||||||
|
|
||||||
## Module Highlights
|
## Module Highlights
|
||||||
|
|
2
vendor/github.com/aws/smithy-go/go_module_metadata.go
generated
vendored
2
vendor/github.com/aws/smithy-go/go_module_metadata.go
generated
vendored
|
@ -3,4 +3,4 @@
|
||||||
package smithy
|
package smithy
|
||||||
|
|
||||||
// goModuleVersion is the tagged release for this module
|
// goModuleVersion is the tagged release for this module
|
||||||
const goModuleVersion = "1.15.0"
|
const goModuleVersion = "1.16.0"
|
||||||
|
|
2
vendor/github.com/bmatcuk/doublestar/v4/README.md
generated
vendored
2
vendor/github.com/bmatcuk/doublestar/v4/README.md
generated
vendored
|
@ -387,8 +387,6 @@ ever since. In that time, it has grown into one of the most popular globbing
|
||||||
libraries in the Go ecosystem. So, if **doublestar** is a useful library in
|
libraries in the Go ecosystem. So, if **doublestar** is a useful library in
|
||||||
your project, consider [sponsoring] my work! I'd really appreciate it!
|
your project, consider [sponsoring] my work! I'd really appreciate it!
|
||||||
|
|
||||||
[![reviewpad](../sponsors/reviewpad.png?raw=true)](https://reviewpad.com/)
|
|
||||||
|
|
||||||
Thanks for sponsoring me!
|
Thanks for sponsoring me!
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
11
vendor/github.com/bmatcuk/doublestar/v4/match.go
generated
vendored
11
vendor/github.com/bmatcuk/doublestar/v4/match.go
generated
vendored
|
@ -301,9 +301,14 @@ MATCH:
|
||||||
}
|
}
|
||||||
|
|
||||||
func isZeroLengthPattern(pattern string, separator rune) (ret bool, err error) {
|
func isZeroLengthPattern(pattern string, separator rune) (ret bool, err error) {
|
||||||
// `/**` is a special case - a pattern such as `path/to/a/**` *should* match
|
// `/**`, `**/`, and `/**/` are special cases - a pattern such as `path/to/a/**` or `path/to/a/**/`
|
||||||
// `path/to/a` because `a` might be a directory
|
// *should* match `path/to/a` because `a` might be a directory
|
||||||
if pattern == "" || pattern == "*" || pattern == "**" || pattern == string(separator)+"**" {
|
if pattern == "" ||
|
||||||
|
pattern == "*" ||
|
||||||
|
pattern == "**" ||
|
||||||
|
pattern == string(separator)+"**" ||
|
||||||
|
pattern == "**"+string(separator) ||
|
||||||
|
pattern == string(separator)+"**"+string(separator) {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
113
vendor/github.com/go-logr/logr/README.md
generated
vendored
113
vendor/github.com/go-logr/logr/README.md
generated
vendored
|
@ -1,6 +1,7 @@
|
||||||
# A minimal logging API for Go
|
# A minimal logging API for Go
|
||||||
|
|
||||||
[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr)
|
[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr)
|
||||||
|
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/go-logr/logr/badge)](https://securityscorecards.dev/viewer/?platform=github.com&org=go-logr&repo=logr)
|
||||||
|
|
||||||
logr offers an(other) opinion on how Go programs and libraries can do logging
|
logr offers an(other) opinion on how Go programs and libraries can do logging
|
||||||
without becoming coupled to a particular logging implementation. This is not
|
without becoming coupled to a particular logging implementation. This is not
|
||||||
|
@ -73,6 +74,29 @@ received:
|
||||||
If the Go standard library had defined an interface for logging, this project
|
If the Go standard library had defined an interface for logging, this project
|
||||||
probably would not be needed. Alas, here we are.
|
probably would not be needed. Alas, here we are.
|
||||||
|
|
||||||
|
When the Go developers started developing such an interface with
|
||||||
|
[slog](https://github.com/golang/go/issues/56345), they adopted some of the
|
||||||
|
logr design but also left out some parts and changed others:
|
||||||
|
|
||||||
|
| Feature | logr | slog |
|
||||||
|
|---------|------|------|
|
||||||
|
| High-level API | `Logger` (passed by value) | `Logger` (passed by [pointer](https://github.com/golang/go/issues/59126)) |
|
||||||
|
| Low-level API | `LogSink` | `Handler` |
|
||||||
|
| Stack unwinding | done by `LogSink` | done by `Logger` |
|
||||||
|
| Skipping helper functions | `WithCallDepth`, `WithCallStackHelper` | [not supported by Logger](https://github.com/golang/go/issues/59145) |
|
||||||
|
| Generating a value for logging on demand | `Marshaler` | `LogValuer` |
|
||||||
|
| Log levels | >= 0, higher meaning "less important" | positive and negative, with 0 for "info" and higher meaning "more important" |
|
||||||
|
| Error log entries | always logged, don't have a verbosity level | normal log entries with level >= `LevelError` |
|
||||||
|
| Passing logger via context | `NewContext`, `FromContext` | no API |
|
||||||
|
| Adding a name to a logger | `WithName` | no API |
|
||||||
|
| Modify verbosity of log entries in a call chain | `V` | no API |
|
||||||
|
| Grouping of key/value pairs | not supported | `WithGroup`, `GroupValue` |
|
||||||
|
|
||||||
|
The high-level slog API is explicitly meant to be one of many different APIs
|
||||||
|
that can be layered on top of a shared `slog.Handler`. logr is one such
|
||||||
|
alternative API, with [interoperability](#slog-interoperability) provided by the [`slogr`](slogr)
|
||||||
|
package.
|
||||||
|
|
||||||
### Inspiration
|
### Inspiration
|
||||||
|
|
||||||
Before you consider this package, please read [this blog post by the
|
Before you consider this package, please read [this blog post by the
|
||||||
|
@ -118,6 +142,91 @@ There are implementations for the following logging libraries:
|
||||||
- **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0)
|
- **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0)
|
||||||
- **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing)
|
- **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing)
|
||||||
|
|
||||||
|
## slog interoperability
|
||||||
|
|
||||||
|
Interoperability goes both ways, using the `logr.Logger` API with a `slog.Handler`
|
||||||
|
and using the `slog.Logger` API with a `logr.LogSink`. [slogr](./slogr) provides `NewLogr` and
|
||||||
|
`NewSlogHandler` API calls to convert between a `logr.Logger` and a `slog.Handler`.
|
||||||
|
As usual, `slog.New` can be used to wrap such a `slog.Handler` in the high-level
|
||||||
|
slog API. `slogr` itself leaves that to the caller.
|
||||||
|
|
||||||
|
## Using a `logr.Sink` as backend for slog
|
||||||
|
|
||||||
|
Ideally, a logr sink implementation should support both logr and slog by
|
||||||
|
implementing both the normal logr interface(s) and `slogr.SlogSink`. Because
|
||||||
|
of a conflict in the parameters of the common `Enabled` method, it is [not
|
||||||
|
possible to implement both slog.Handler and logr.Sink in the same
|
||||||
|
type](https://github.com/golang/go/issues/59110).
|
||||||
|
|
||||||
|
If both are supported, log calls can go from the high-level APIs to the backend
|
||||||
|
without the need to convert parameters. `NewLogr` and `NewSlogHandler` can
|
||||||
|
convert back and forth without adding additional wrappers, with one exception:
|
||||||
|
when `Logger.V` was used to adjust the verbosity for a `slog.Handler`, then
|
||||||
|
`NewSlogHandler` has to use a wrapper which adjusts the verbosity for future
|
||||||
|
log calls.
|
||||||
|
|
||||||
|
Such an implementation should also support values that implement specific
|
||||||
|
interfaces from both packages for logging (`logr.Marshaler`, `slog.LogValuer`,
|
||||||
|
`slog.GroupValue`). logr does not convert those.
|
||||||
|
|
||||||
|
Not supporting slog has several drawbacks:
|
||||||
|
- Recording source code locations works correctly if the handler gets called
|
||||||
|
through `slog.Logger`, but may be wrong in other cases. That's because a
|
||||||
|
`logr.Sink` does its own stack unwinding instead of using the program counter
|
||||||
|
provided by the high-level API.
|
||||||
|
- slog levels <= 0 can be mapped to logr levels by negating the level without a
|
||||||
|
loss of information. But all slog levels > 0 (e.g. `slog.LevelWarning` as
|
||||||
|
used by `slog.Logger.Warn`) must be mapped to 0 before calling the sink
|
||||||
|
because logr does not support "more important than info" levels.
|
||||||
|
- The slog group concept is supported by prefixing each key in a key/value
|
||||||
|
pair with the group names, separated by a dot. For structured output like
|
||||||
|
JSON it would be better to group the key/value pairs inside an object.
|
||||||
|
- Special slog values and interfaces don't work as expected.
|
||||||
|
- The overhead is likely to be higher.
|
||||||
|
|
||||||
|
These drawbacks are severe enough that applications using a mixture of slog and
|
||||||
|
logr should switch to a different backend.
|
||||||
|
|
||||||
|
## Using a `slog.Handler` as backend for logr
|
||||||
|
|
||||||
|
Using a plain `slog.Handler` without support for logr works better than the
|
||||||
|
other direction:
|
||||||
|
- All logr verbosity levels can be mapped 1:1 to their corresponding slog level
|
||||||
|
by negating them.
|
||||||
|
- Stack unwinding is done by the `slogr.SlogSink` and the resulting program
|
||||||
|
counter is passed to the `slog.Handler`.
|
||||||
|
- Names added via `Logger.WithName` are gathered and recorded in an additional
|
||||||
|
attribute with `logger` as key and the names separated by slash as value.
|
||||||
|
- `Logger.Error` is turned into a log record with `slog.LevelError` as level
|
||||||
|
and an additional attribute with `err` as key, if an error was provided.
|
||||||
|
|
||||||
|
The main drawback is that `logr.Marshaler` will not be supported. Types should
|
||||||
|
ideally support both `logr.Marshaler` and `slog.Valuer`. If compatibility
|
||||||
|
with logr implementations without slog support is not important, then
|
||||||
|
`slog.Valuer` is sufficient.
|
||||||
|
|
||||||
|
## Context support for slog
|
||||||
|
|
||||||
|
Storing a logger in a `context.Context` is not supported by
|
||||||
|
slog. `logr.NewContext` and `logr.FromContext` can be used with slog like this
|
||||||
|
to fill this gap:
|
||||||
|
|
||||||
|
func HandlerFromContext(ctx context.Context) slog.Handler {
|
||||||
|
logger, err := logr.FromContext(ctx)
|
||||||
|
if err == nil {
|
||||||
|
return slogr.NewSlogHandler(logger)
|
||||||
|
}
|
||||||
|
return slog.Default().Handler()
|
||||||
|
}
|
||||||
|
|
||||||
|
func ContextWithHandler(ctx context.Context, handler slog.Handler) context.Context {
|
||||||
|
return logr.NewContext(ctx, slogr.NewLogr(handler))
|
||||||
|
}
|
||||||
|
|
||||||
|
The downside is that storing and retrieving a `slog.Handler` needs more
|
||||||
|
allocations compared to using a `logr.Logger`. Therefore the recommendation is
|
||||||
|
to use the `logr.Logger` API in code which uses contextual logging.
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
### Conceptual
|
### Conceptual
|
||||||
|
@ -241,7 +350,9 @@ Otherwise, you can start out with `0` as "you always want to see this",
|
||||||
|
|
||||||
Then gradually choose levels in between as you need them, working your way
|
Then gradually choose levels in between as you need them, working your way
|
||||||
down from 10 (for debug and trace style logs) and up from 1 (for chattier
|
down from 10 (for debug and trace style logs) and up from 1 (for chattier
|
||||||
info-type logs.)
|
info-type logs). For reference, slog pre-defines -4 for debug logs
|
||||||
|
(corresponds to 4 in logr), which matches what is
|
||||||
|
[recommended for Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md#what-method-to-use).
|
||||||
|
|
||||||
#### How do I choose my keys?
|
#### How do I choose my keys?
|
||||||
|
|
||||||
|
|
18
vendor/github.com/go-logr/logr/SECURITY.md
generated
vendored
Normal file
18
vendor/github.com/go-logr/logr/SECURITY.md
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
If you have discovered a security vulnerability in this project, please report it
|
||||||
|
privately. **Do not disclose it as a public issue.** This gives us time to work with you
|
||||||
|
to fix the issue before public exposure, reducing the chance that the exploit will be
|
||||||
|
used before a patch is released.
|
||||||
|
|
||||||
|
You may submit the report in the following ways:
|
||||||
|
|
||||||
|
- send an email to go-logr-security@googlegroups.com
|
||||||
|
- send us a [private vulnerability report](https://github.com/go-logr/logr/security/advisories/new)
|
||||||
|
|
||||||
|
Please provide the following information in your report:
|
||||||
|
|
||||||
|
- A description of the vulnerability and its impact
|
||||||
|
- How to reproduce the issue
|
||||||
|
|
||||||
|
We ask that you give us 90 days to work on a fix before public exposure.
|
48
vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
48
vendor/github.com/go-logr/logr/funcr/funcr.go
generated
vendored
|
@ -116,17 +116,17 @@ type Options struct {
|
||||||
// Equivalent hooks are offered for key-value pairs saved via
|
// Equivalent hooks are offered for key-value pairs saved via
|
||||||
// logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and
|
// logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and
|
||||||
// for user-provided pairs (see RenderArgsHook).
|
// for user-provided pairs (see RenderArgsHook).
|
||||||
RenderBuiltinsHook func(kvList []interface{}) []interface{}
|
RenderBuiltinsHook func(kvList []any) []any
|
||||||
|
|
||||||
// RenderValuesHook is the same as RenderBuiltinsHook, except that it is
|
// RenderValuesHook is the same as RenderBuiltinsHook, except that it is
|
||||||
// only called for key-value pairs saved via logr.Logger.WithValues. See
|
// only called for key-value pairs saved via logr.Logger.WithValues. See
|
||||||
// RenderBuiltinsHook for more details.
|
// RenderBuiltinsHook for more details.
|
||||||
RenderValuesHook func(kvList []interface{}) []interface{}
|
RenderValuesHook func(kvList []any) []any
|
||||||
|
|
||||||
// RenderArgsHook is the same as RenderBuiltinsHook, except that it is only
|
// RenderArgsHook is the same as RenderBuiltinsHook, except that it is only
|
||||||
// called for key-value pairs passed directly to Info and Error. See
|
// called for key-value pairs passed directly to Info and Error. See
|
||||||
// RenderBuiltinsHook for more details.
|
// RenderBuiltinsHook for more details.
|
||||||
RenderArgsHook func(kvList []interface{}) []interface{}
|
RenderArgsHook func(kvList []any) []any
|
||||||
|
|
||||||
// MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct
|
// MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct
|
||||||
// that contains a struct, etc.) it may log. Every time it finds a struct,
|
// that contains a struct, etc.) it may log. Every time it finds a struct,
|
||||||
|
@ -163,7 +163,7 @@ func (l fnlogger) WithName(name string) logr.LogSink {
|
||||||
return &l
|
return &l
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l fnlogger) WithValues(kvList ...interface{}) logr.LogSink {
|
func (l fnlogger) WithValues(kvList ...any) logr.LogSink {
|
||||||
l.Formatter.AddValues(kvList)
|
l.Formatter.AddValues(kvList)
|
||||||
return &l
|
return &l
|
||||||
}
|
}
|
||||||
|
@ -173,12 +173,12 @@ func (l fnlogger) WithCallDepth(depth int) logr.LogSink {
|
||||||
return &l
|
return &l
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l fnlogger) Info(level int, msg string, kvList ...interface{}) {
|
func (l fnlogger) Info(level int, msg string, kvList ...any) {
|
||||||
prefix, args := l.FormatInfo(level, msg, kvList)
|
prefix, args := l.FormatInfo(level, msg, kvList)
|
||||||
l.write(prefix, args)
|
l.write(prefix, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l fnlogger) Error(err error, msg string, kvList ...interface{}) {
|
func (l fnlogger) Error(err error, msg string, kvList ...any) {
|
||||||
prefix, args := l.FormatError(err, msg, kvList)
|
prefix, args := l.FormatError(err, msg, kvList)
|
||||||
l.write(prefix, args)
|
l.write(prefix, args)
|
||||||
}
|
}
|
||||||
|
@ -229,7 +229,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter {
|
||||||
type Formatter struct {
|
type Formatter struct {
|
||||||
outputFormat outputFormat
|
outputFormat outputFormat
|
||||||
prefix string
|
prefix string
|
||||||
values []interface{}
|
values []any
|
||||||
valuesStr string
|
valuesStr string
|
||||||
depth int
|
depth int
|
||||||
opts *Options
|
opts *Options
|
||||||
|
@ -246,10 +246,10 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// PseudoStruct is a list of key-value pairs that gets logged as a struct.
|
// PseudoStruct is a list of key-value pairs that gets logged as a struct.
|
||||||
type PseudoStruct []interface{}
|
type PseudoStruct []any
|
||||||
|
|
||||||
// render produces a log line, ready to use.
|
// render produces a log line, ready to use.
|
||||||
func (f Formatter) render(builtins, args []interface{}) string {
|
func (f Formatter) render(builtins, args []any) string {
|
||||||
// Empirically bytes.Buffer is faster than strings.Builder for this.
|
// Empirically bytes.Buffer is faster than strings.Builder for this.
|
||||||
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
|
@ -292,7 +292,7 @@ func (f Formatter) render(builtins, args []interface{}) string {
|
||||||
// This function returns a potentially modified version of kvList, which
|
// This function returns a potentially modified version of kvList, which
|
||||||
// ensures that there is a value for every key (adding a value if needed) and
|
// ensures that there is a value for every key (adding a value if needed) and
|
||||||
// that each key is a string (substituting a key if needed).
|
// that each key is a string (substituting a key if needed).
|
||||||
func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing bool, escapeKeys bool) []interface{} {
|
func (f Formatter) flatten(buf *bytes.Buffer, kvList []any, continuing bool, escapeKeys bool) []any {
|
||||||
// This logic overlaps with sanitize() but saves one type-cast per key,
|
// This logic overlaps with sanitize() but saves one type-cast per key,
|
||||||
// which can be measurable.
|
// which can be measurable.
|
||||||
if len(kvList)%2 != 0 {
|
if len(kvList)%2 != 0 {
|
||||||
|
@ -334,7 +334,7 @@ func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing b
|
||||||
return kvList
|
return kvList
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f Formatter) pretty(value interface{}) string {
|
func (f Formatter) pretty(value any) string {
|
||||||
return f.prettyWithFlags(value, 0, 0)
|
return f.prettyWithFlags(value, 0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +343,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: This is not fast. Most of the overhead goes here.
|
// TODO: This is not fast. Most of the overhead goes here.
|
||||||
func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) string {
|
func (f Formatter) prettyWithFlags(value any, flags uint32, depth int) string {
|
||||||
if depth > f.opts.MaxLogDepth {
|
if depth > f.opts.MaxLogDepth {
|
||||||
return `"<max-log-depth-exceeded>"`
|
return `"<max-log-depth-exceeded>"`
|
||||||
}
|
}
|
||||||
|
@ -614,7 +614,7 @@ func isEmpty(v reflect.Value) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func invokeMarshaler(m logr.Marshaler) (ret interface{}) {
|
func invokeMarshaler(m logr.Marshaler) (ret any) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
ret = fmt.Sprintf("<panic: %s>", r)
|
ret = fmt.Sprintf("<panic: %s>", r)
|
||||||
|
@ -675,12 +675,12 @@ func (f Formatter) caller() Caller {
|
||||||
|
|
||||||
const noValue = "<no-value>"
|
const noValue = "<no-value>"
|
||||||
|
|
||||||
func (f Formatter) nonStringKey(v interface{}) string {
|
func (f Formatter) nonStringKey(v any) string {
|
||||||
return fmt.Sprintf("<non-string-key: %s>", f.snippet(v))
|
return fmt.Sprintf("<non-string-key: %s>", f.snippet(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
// snippet produces a short snippet string of an arbitrary value.
|
// snippet produces a short snippet string of an arbitrary value.
|
||||||
func (f Formatter) snippet(v interface{}) string {
|
func (f Formatter) snippet(v any) string {
|
||||||
const snipLen = 16
|
const snipLen = 16
|
||||||
|
|
||||||
snip := f.pretty(v)
|
snip := f.pretty(v)
|
||||||
|
@ -693,7 +693,7 @@ func (f Formatter) snippet(v interface{}) string {
|
||||||
// sanitize ensures that a list of key-value pairs has a value for every key
|
// sanitize ensures that a list of key-value pairs has a value for every key
|
||||||
// (adding a value if needed) and that each key is a string (substituting a key
|
// (adding a value if needed) and that each key is a string (substituting a key
|
||||||
// if needed).
|
// if needed).
|
||||||
func (f Formatter) sanitize(kvList []interface{}) []interface{} {
|
func (f Formatter) sanitize(kvList []any) []any {
|
||||||
if len(kvList)%2 != 0 {
|
if len(kvList)%2 != 0 {
|
||||||
kvList = append(kvList, noValue)
|
kvList = append(kvList, noValue)
|
||||||
}
|
}
|
||||||
|
@ -727,8 +727,8 @@ func (f Formatter) GetDepth() int {
|
||||||
// FormatInfo renders an Info log message into strings. The prefix will be
|
// FormatInfo renders an Info log message into strings. The prefix will be
|
||||||
// empty when no names were set (via AddNames), or when the output is
|
// empty when no names were set (via AddNames), or when the output is
|
||||||
// configured for JSON.
|
// configured for JSON.
|
||||||
func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (prefix, argsStr string) {
|
func (f Formatter) FormatInfo(level int, msg string, kvList []any) (prefix, argsStr string) {
|
||||||
args := make([]interface{}, 0, 64) // using a constant here impacts perf
|
args := make([]any, 0, 64) // using a constant here impacts perf
|
||||||
prefix = f.prefix
|
prefix = f.prefix
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
args = append(args, "logger", prefix)
|
args = append(args, "logger", prefix)
|
||||||
|
@ -745,10 +745,10 @@ func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (pref
|
||||||
}
|
}
|
||||||
|
|
||||||
// FormatError renders an Error log message into strings. The prefix will be
|
// FormatError renders an Error log message into strings. The prefix will be
|
||||||
// empty when no names were set (via AddNames), or when the output is
|
// empty when no names were set (via AddNames), or when the output is
|
||||||
// configured for JSON.
|
// configured for JSON.
|
||||||
func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (prefix, argsStr string) {
|
func (f Formatter) FormatError(err error, msg string, kvList []any) (prefix, argsStr string) {
|
||||||
args := make([]interface{}, 0, 64) // using a constant here impacts perf
|
args := make([]any, 0, 64) // using a constant here impacts perf
|
||||||
prefix = f.prefix
|
prefix = f.prefix
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
args = append(args, "logger", prefix)
|
args = append(args, "logger", prefix)
|
||||||
|
@ -761,12 +761,12 @@ func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (pre
|
||||||
args = append(args, "caller", f.caller())
|
args = append(args, "caller", f.caller())
|
||||||
}
|
}
|
||||||
args = append(args, "msg", msg)
|
args = append(args, "msg", msg)
|
||||||
var loggableErr interface{}
|
var loggableErr any
|
||||||
if err != nil {
|
if err != nil {
|
||||||
loggableErr = err.Error()
|
loggableErr = err.Error()
|
||||||
}
|
}
|
||||||
args = append(args, "error", loggableErr)
|
args = append(args, "error", loggableErr)
|
||||||
return f.prefix, f.render(args, kvList)
|
return prefix, f.render(args, kvList)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddName appends the specified name. funcr uses '/' characters to separate
|
// AddName appends the specified name. funcr uses '/' characters to separate
|
||||||
|
@ -781,7 +781,7 @@ func (f *Formatter) AddName(name string) {
|
||||||
|
|
||||||
// AddValues adds key-value pairs to the set of saved values to be logged with
|
// AddValues adds key-value pairs to the set of saved values to be logged with
|
||||||
// each log line.
|
// each log line.
|
||||||
func (f *Formatter) AddValues(kvList []interface{}) {
|
func (f *Formatter) AddValues(kvList []any) {
|
||||||
// Three slice args forces a copy.
|
// Three slice args forces a copy.
|
||||||
n := len(f.values)
|
n := len(f.values)
|
||||||
f.values = append(f.values[:n:n], kvList...)
|
f.values = append(f.values[:n:n], kvList...)
|
||||||
|
|
35
vendor/github.com/go-logr/logr/logr.go
generated
vendored
35
vendor/github.com/go-logr/logr/logr.go
generated
vendored
|
@ -127,9 +127,9 @@ limitations under the License.
|
||||||
// such a value can call its methods without having to check whether the
|
// such a value can call its methods without having to check whether the
|
||||||
// instance is ready for use.
|
// instance is ready for use.
|
||||||
//
|
//
|
||||||
// Calling methods with the null logger (Logger{}) as instance will crash
|
// The zero logger (= Logger{}) is identical to Discard() and discards all log
|
||||||
// because it has no LogSink. Therefore this null logger should never be passed
|
// entries. Code that receives a Logger by value can simply call it, the methods
|
||||||
// around. For cases where passing a logger is optional, a pointer to Logger
|
// will never crash. For cases where passing a logger is optional, a pointer to Logger
|
||||||
// should be used.
|
// should be used.
|
||||||
//
|
//
|
||||||
// # Key Naming Conventions
|
// # Key Naming Conventions
|
||||||
|
@ -258,6 +258,12 @@ type Logger struct {
|
||||||
// Enabled tests whether this Logger is enabled. For example, commandline
|
// Enabled tests whether this Logger is enabled. For example, commandline
|
||||||
// flags might be used to set the logging verbosity and disable some info logs.
|
// flags might be used to set the logging verbosity and disable some info logs.
|
||||||
func (l Logger) Enabled() bool {
|
func (l Logger) Enabled() bool {
|
||||||
|
// Some implementations of LogSink look at the caller in Enabled (e.g.
|
||||||
|
// different verbosity levels per package or file), but we only pass one
|
||||||
|
// CallDepth in (via Init). This means that all calls from Logger to the
|
||||||
|
// LogSink's Enabled, Info, and Error methods must have the same number of
|
||||||
|
// frames. In other words, Logger methods can't call other Logger methods
|
||||||
|
// which call these LogSink methods unless we do it the same in all paths.
|
||||||
return l.sink != nil && l.sink.Enabled(l.level)
|
return l.sink != nil && l.sink.Enabled(l.level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,11 +273,11 @@ func (l Logger) Enabled() bool {
|
||||||
// line. The key/value pairs can then be used to add additional variable
|
// line. The key/value pairs can then be used to add additional variable
|
||||||
// information. The key/value pairs must alternate string keys and arbitrary
|
// information. The key/value pairs must alternate string keys and arbitrary
|
||||||
// values.
|
// values.
|
||||||
func (l Logger) Info(msg string, keysAndValues ...interface{}) {
|
func (l Logger) Info(msg string, keysAndValues ...any) {
|
||||||
if l.sink == nil {
|
if l.sink == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if l.Enabled() {
|
if l.sink.Enabled(l.level) { // see comment in Enabled
|
||||||
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
|
||||||
withHelper.GetCallStackHelper()()
|
withHelper.GetCallStackHelper()()
|
||||||
}
|
}
|
||||||
|
@ -289,7 +295,7 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) {
|
||||||
// while the err argument should be used to attach the actual error that
|
// while the err argument should be used to attach the actual error that
|
||||||
// triggered this log line, if present. The err parameter is optional
|
// triggered this log line, if present. The err parameter is optional
|
||||||
// and nil may be passed instead of an error instance.
|
// and nil may be passed instead of an error instance.
|
||||||
func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) {
|
func (l Logger) Error(err error, msg string, keysAndValues ...any) {
|
||||||
if l.sink == nil {
|
if l.sink == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -314,9 +320,16 @@ func (l Logger) V(level int) Logger {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetV returns the verbosity level of the logger. If the logger's LogSink is
|
||||||
|
// nil as in the Discard logger, this will always return 0.
|
||||||
|
func (l Logger) GetV() int {
|
||||||
|
// 0 if l.sink nil because of the if check in V above.
|
||||||
|
return l.level
|
||||||
|
}
|
||||||
|
|
||||||
// WithValues returns a new Logger instance with additional key/value pairs.
|
// WithValues returns a new Logger instance with additional key/value pairs.
|
||||||
// See Info for documentation on how key/value pairs work.
|
// See Info for documentation on how key/value pairs work.
|
||||||
func (l Logger) WithValues(keysAndValues ...interface{}) Logger {
|
func (l Logger) WithValues(keysAndValues ...any) Logger {
|
||||||
if l.sink == nil {
|
if l.sink == nil {
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
@ -467,15 +480,15 @@ type LogSink interface {
|
||||||
// The level argument is provided for optional logging. This method will
|
// The level argument is provided for optional logging. This method will
|
||||||
// only be called when Enabled(level) is true. See Logger.Info for more
|
// only be called when Enabled(level) is true. See Logger.Info for more
|
||||||
// details.
|
// details.
|
||||||
Info(level int, msg string, keysAndValues ...interface{})
|
Info(level int, msg string, keysAndValues ...any)
|
||||||
|
|
||||||
// Error logs an error, with the given message and key/value pairs as
|
// Error logs an error, with the given message and key/value pairs as
|
||||||
// context. See Logger.Error for more details.
|
// context. See Logger.Error for more details.
|
||||||
Error(err error, msg string, keysAndValues ...interface{})
|
Error(err error, msg string, keysAndValues ...any)
|
||||||
|
|
||||||
// WithValues returns a new LogSink with additional key/value pairs. See
|
// WithValues returns a new LogSink with additional key/value pairs. See
|
||||||
// Logger.WithValues for more details.
|
// Logger.WithValues for more details.
|
||||||
WithValues(keysAndValues ...interface{}) LogSink
|
WithValues(keysAndValues ...any) LogSink
|
||||||
|
|
||||||
// WithName returns a new LogSink with the specified name appended. See
|
// WithName returns a new LogSink with the specified name appended. See
|
||||||
// Logger.WithName for more details.
|
// Logger.WithName for more details.
|
||||||
|
@ -546,5 +559,5 @@ type Marshaler interface {
|
||||||
// with exported fields
|
// with exported fields
|
||||||
//
|
//
|
||||||
// It may return any value of any type.
|
// It may return any value of any type.
|
||||||
MarshalLog() interface{}
|
MarshalLog() any
|
||||||
}
|
}
|
||||||
|
|
27
vendor/github.com/google/go-cmp/LICENSE
generated
vendored
27
vendor/github.com/google/go-cmp/LICENSE
generated
vendored
|
@ -1,27 +0,0 @@
|
||||||
Copyright (c) 2017 The Go Authors. All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
671
vendor/github.com/google/go-cmp/cmp/compare.go
generated
vendored
671
vendor/github.com/google/go-cmp/cmp/compare.go
generated
vendored
|
@ -1,671 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package cmp determines equality of values.
|
|
||||||
//
|
|
||||||
// This package is intended to be a more powerful and safer alternative to
|
|
||||||
// [reflect.DeepEqual] for comparing whether two values are semantically equal.
|
|
||||||
// It is intended to only be used in tests, as performance is not a goal and
|
|
||||||
// it may panic if it cannot compare the values. Its propensity towards
|
|
||||||
// panicking means that its unsuitable for production environments where a
|
|
||||||
// spurious panic may be fatal.
|
|
||||||
//
|
|
||||||
// The primary features of cmp are:
|
|
||||||
//
|
|
||||||
// - When the default behavior of equality does not suit the test's needs,
|
|
||||||
// custom equality functions can override the equality operation.
|
|
||||||
// For example, an equality function may report floats as equal so long as
|
|
||||||
// they are within some tolerance of each other.
|
|
||||||
//
|
|
||||||
// - Types with an Equal method (e.g., [time.Time.Equal]) may use that method
|
|
||||||
// to determine equality. This allows package authors to determine
|
|
||||||
// the equality operation for the types that they define.
|
|
||||||
//
|
|
||||||
// - If no custom equality functions are used and no Equal method is defined,
|
|
||||||
// equality is determined by recursively comparing the primitive kinds on
|
|
||||||
// both values, much like [reflect.DeepEqual]. Unlike [reflect.DeepEqual],
|
|
||||||
// unexported fields are not compared by default; they result in panics
|
|
||||||
// unless suppressed by using an [Ignore] option
|
|
||||||
// (see [github.com/google/go-cmp/cmp/cmpopts.IgnoreUnexported])
|
|
||||||
// or explicitly compared using the [Exporter] option.
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/diff"
|
|
||||||
"github.com/google/go-cmp/cmp/internal/function"
|
|
||||||
"github.com/google/go-cmp/cmp/internal/value"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO(≥go1.18): Use any instead of interface{}.
|
|
||||||
|
|
||||||
// Equal reports whether x and y are equal by recursively applying the
|
|
||||||
// following rules in the given order to x and y and all of their sub-values:
|
|
||||||
//
|
|
||||||
// - Let S be the set of all [Ignore], [Transformer], and [Comparer] options that
|
|
||||||
// remain after applying all path filters, value filters, and type filters.
|
|
||||||
// If at least one [Ignore] exists in S, then the comparison is ignored.
|
|
||||||
// If the number of [Transformer] and [Comparer] options in S is non-zero,
|
|
||||||
// then Equal panics because it is ambiguous which option to use.
|
|
||||||
// If S contains a single [Transformer], then use that to transform
|
|
||||||
// the current values and recursively call Equal on the output values.
|
|
||||||
// If S contains a single [Comparer], then use that to compare the current values.
|
|
||||||
// Otherwise, evaluation proceeds to the next rule.
|
|
||||||
//
|
|
||||||
// - If the values have an Equal method of the form "(T) Equal(T) bool" or
|
|
||||||
// "(T) Equal(I) bool" where T is assignable to I, then use the result of
|
|
||||||
// x.Equal(y) even if x or y is nil. Otherwise, no such method exists and
|
|
||||||
// evaluation proceeds to the next rule.
|
|
||||||
//
|
|
||||||
// - Lastly, try to compare x and y based on their basic kinds.
|
|
||||||
// Simple kinds like booleans, integers, floats, complex numbers, strings,
|
|
||||||
// and channels are compared using the equivalent of the == operator in Go.
|
|
||||||
// Functions are only equal if they are both nil, otherwise they are unequal.
|
|
||||||
//
|
|
||||||
// Structs are equal if recursively calling Equal on all fields report equal.
|
|
||||||
// If a struct contains unexported fields, Equal panics unless an [Ignore] option
|
|
||||||
// (e.g., [github.com/google/go-cmp/cmp/cmpopts.IgnoreUnexported]) ignores that field
|
|
||||||
// or the [Exporter] option explicitly permits comparing the unexported field.
|
|
||||||
//
|
|
||||||
// Slices are equal if they are both nil or both non-nil, where recursively
|
|
||||||
// calling Equal on all non-ignored slice or array elements report equal.
|
|
||||||
// Empty non-nil slices and nil slices are not equal; to equate empty slices,
|
|
||||||
// consider using [github.com/google/go-cmp/cmp/cmpopts.EquateEmpty].
|
|
||||||
//
|
|
||||||
// Maps are equal if they are both nil or both non-nil, where recursively
|
|
||||||
// calling Equal on all non-ignored map entries report equal.
|
|
||||||
// Map keys are equal according to the == operator.
|
|
||||||
// To use custom comparisons for map keys, consider using
|
|
||||||
// [github.com/google/go-cmp/cmp/cmpopts.SortMaps].
|
|
||||||
// Empty non-nil maps and nil maps are not equal; to equate empty maps,
|
|
||||||
// consider using [github.com/google/go-cmp/cmp/cmpopts.EquateEmpty].
|
|
||||||
//
|
|
||||||
// Pointers and interfaces are equal if they are both nil or both non-nil,
|
|
||||||
// where they have the same underlying concrete type and recursively
|
|
||||||
// calling Equal on the underlying values reports equal.
|
|
||||||
//
|
|
||||||
// Before recursing into a pointer, slice element, or map, the current path
|
|
||||||
// is checked to detect whether the address has already been visited.
|
|
||||||
// If there is a cycle, then the pointed at values are considered equal
|
|
||||||
// only if both addresses were previously visited in the same path step.
|
|
||||||
func Equal(x, y interface{}, opts ...Option) bool {
|
|
||||||
s := newState(opts)
|
|
||||||
s.compareAny(rootStep(x, y))
|
|
||||||
return s.result.Equal()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Diff returns a human-readable report of the differences between two values:
|
|
||||||
// y - x. It returns an empty string if and only if Equal returns true for the
|
|
||||||
// same input values and options.
|
|
||||||
//
|
|
||||||
// The output is displayed as a literal in pseudo-Go syntax.
|
|
||||||
// At the start of each line, a "-" prefix indicates an element removed from x,
|
|
||||||
// a "+" prefix to indicates an element added from y, and the lack of a prefix
|
|
||||||
// indicates an element common to both x and y. If possible, the output
|
|
||||||
// uses fmt.Stringer.String or error.Error methods to produce more humanly
|
|
||||||
// readable outputs. In such cases, the string is prefixed with either an
|
|
||||||
// 's' or 'e' character, respectively, to indicate that the method was called.
|
|
||||||
//
|
|
||||||
// Do not depend on this output being stable. If you need the ability to
|
|
||||||
// programmatically interpret the difference, consider using a custom Reporter.
|
|
||||||
func Diff(x, y interface{}, opts ...Option) string {
|
|
||||||
s := newState(opts)
|
|
||||||
|
|
||||||
// Optimization: If there are no other reporters, we can optimize for the
|
|
||||||
// common case where the result is equal (and thus no reported difference).
|
|
||||||
// This avoids the expensive construction of a difference tree.
|
|
||||||
if len(s.reporters) == 0 {
|
|
||||||
s.compareAny(rootStep(x, y))
|
|
||||||
if s.result.Equal() {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
s.result = diff.Result{} // Reset results
|
|
||||||
}
|
|
||||||
|
|
||||||
r := new(defaultReporter)
|
|
||||||
s.reporters = append(s.reporters, reporter{r})
|
|
||||||
s.compareAny(rootStep(x, y))
|
|
||||||
d := r.String()
|
|
||||||
if (d == "") != s.result.Equal() {
|
|
||||||
panic("inconsistent difference and equality results")
|
|
||||||
}
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
// rootStep constructs the first path step. If x and y have differing types,
|
|
||||||
// then they are stored within an empty interface type.
|
|
||||||
func rootStep(x, y interface{}) PathStep {
|
|
||||||
vx := reflect.ValueOf(x)
|
|
||||||
vy := reflect.ValueOf(y)
|
|
||||||
|
|
||||||
// If the inputs are different types, auto-wrap them in an empty interface
|
|
||||||
// so that they have the same parent type.
|
|
||||||
var t reflect.Type
|
|
||||||
if !vx.IsValid() || !vy.IsValid() || vx.Type() != vy.Type() {
|
|
||||||
t = anyType
|
|
||||||
if vx.IsValid() {
|
|
||||||
vvx := reflect.New(t).Elem()
|
|
||||||
vvx.Set(vx)
|
|
||||||
vx = vvx
|
|
||||||
}
|
|
||||||
if vy.IsValid() {
|
|
||||||
vvy := reflect.New(t).Elem()
|
|
||||||
vvy.Set(vy)
|
|
||||||
vy = vvy
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
t = vx.Type()
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pathStep{t, vx, vy}
|
|
||||||
}
|
|
||||||
|
|
||||||
type state struct {
|
|
||||||
// These fields represent the "comparison state".
|
|
||||||
// Calling statelessCompare must not result in observable changes to these.
|
|
||||||
result diff.Result // The current result of comparison
|
|
||||||
curPath Path // The current path in the value tree
|
|
||||||
curPtrs pointerPath // The current set of visited pointers
|
|
||||||
reporters []reporter // Optional reporters
|
|
||||||
|
|
||||||
// recChecker checks for infinite cycles applying the same set of
|
|
||||||
// transformers upon the output of itself.
|
|
||||||
recChecker recChecker
|
|
||||||
|
|
||||||
// dynChecker triggers pseudo-random checks for option correctness.
|
|
||||||
// It is safe for statelessCompare to mutate this value.
|
|
||||||
dynChecker dynChecker
|
|
||||||
|
|
||||||
// These fields, once set by processOption, will not change.
|
|
||||||
exporters []exporter // List of exporters for structs with unexported fields
|
|
||||||
opts Options // List of all fundamental and filter options
|
|
||||||
}
|
|
||||||
|
|
||||||
func newState(opts []Option) *state {
|
|
||||||
// Always ensure a validator option exists to validate the inputs.
|
|
||||||
s := &state{opts: Options{validator{}}}
|
|
||||||
s.curPtrs.Init()
|
|
||||||
s.processOption(Options(opts))
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) processOption(opt Option) {
|
|
||||||
switch opt := opt.(type) {
|
|
||||||
case nil:
|
|
||||||
case Options:
|
|
||||||
for _, o := range opt {
|
|
||||||
s.processOption(o)
|
|
||||||
}
|
|
||||||
case coreOption:
|
|
||||||
type filtered interface {
|
|
||||||
isFiltered() bool
|
|
||||||
}
|
|
||||||
if fopt, ok := opt.(filtered); ok && !fopt.isFiltered() {
|
|
||||||
panic(fmt.Sprintf("cannot use an unfiltered option: %v", opt))
|
|
||||||
}
|
|
||||||
s.opts = append(s.opts, opt)
|
|
||||||
case exporter:
|
|
||||||
s.exporters = append(s.exporters, opt)
|
|
||||||
case reporter:
|
|
||||||
s.reporters = append(s.reporters, opt)
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("unknown option %T", opt))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// statelessCompare compares two values and returns the result.
|
|
||||||
// This function is stateless in that it does not alter the current result,
|
|
||||||
// or output to any registered reporters.
|
|
||||||
func (s *state) statelessCompare(step PathStep) diff.Result {
|
|
||||||
// We do not save and restore curPath and curPtrs because all of the
|
|
||||||
// compareX methods should properly push and pop from them.
|
|
||||||
// It is an implementation bug if the contents of the paths differ from
|
|
||||||
// when calling this function to when returning from it.
|
|
||||||
|
|
||||||
oldResult, oldReporters := s.result, s.reporters
|
|
||||||
s.result = diff.Result{} // Reset result
|
|
||||||
s.reporters = nil // Remove reporters to avoid spurious printouts
|
|
||||||
s.compareAny(step)
|
|
||||||
res := s.result
|
|
||||||
s.result, s.reporters = oldResult, oldReporters
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) compareAny(step PathStep) {
|
|
||||||
// Update the path stack.
|
|
||||||
s.curPath.push(step)
|
|
||||||
defer s.curPath.pop()
|
|
||||||
for _, r := range s.reporters {
|
|
||||||
r.PushStep(step)
|
|
||||||
defer r.PopStep()
|
|
||||||
}
|
|
||||||
s.recChecker.Check(s.curPath)
|
|
||||||
|
|
||||||
// Cycle-detection for slice elements (see NOTE in compareSlice).
|
|
||||||
t := step.Type()
|
|
||||||
vx, vy := step.Values()
|
|
||||||
if si, ok := step.(SliceIndex); ok && si.isSlice && vx.IsValid() && vy.IsValid() {
|
|
||||||
px, py := vx.Addr(), vy.Addr()
|
|
||||||
if eq, visited := s.curPtrs.Push(px, py); visited {
|
|
||||||
s.report(eq, reportByCycle)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer s.curPtrs.Pop(px, py)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rule 1: Check whether an option applies on this node in the value tree.
|
|
||||||
if s.tryOptions(t, vx, vy) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rule 2: Check whether the type has a valid Equal method.
|
|
||||||
if s.tryMethod(t, vx, vy) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rule 3: Compare based on the underlying kind.
|
|
||||||
switch t.Kind() {
|
|
||||||
case reflect.Bool:
|
|
||||||
s.report(vx.Bool() == vy.Bool(), 0)
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
s.report(vx.Int() == vy.Int(), 0)
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
s.report(vx.Uint() == vy.Uint(), 0)
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
s.report(vx.Float() == vy.Float(), 0)
|
|
||||||
case reflect.Complex64, reflect.Complex128:
|
|
||||||
s.report(vx.Complex() == vy.Complex(), 0)
|
|
||||||
case reflect.String:
|
|
||||||
s.report(vx.String() == vy.String(), 0)
|
|
||||||
case reflect.Chan, reflect.UnsafePointer:
|
|
||||||
s.report(vx.Pointer() == vy.Pointer(), 0)
|
|
||||||
case reflect.Func:
|
|
||||||
s.report(vx.IsNil() && vy.IsNil(), 0)
|
|
||||||
case reflect.Struct:
|
|
||||||
s.compareStruct(t, vx, vy)
|
|
||||||
case reflect.Slice, reflect.Array:
|
|
||||||
s.compareSlice(t, vx, vy)
|
|
||||||
case reflect.Map:
|
|
||||||
s.compareMap(t, vx, vy)
|
|
||||||
case reflect.Ptr:
|
|
||||||
s.comparePtr(t, vx, vy)
|
|
||||||
case reflect.Interface:
|
|
||||||
s.compareInterface(t, vx, vy)
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("%v kind not handled", t.Kind()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) tryOptions(t reflect.Type, vx, vy reflect.Value) bool {
|
|
||||||
// Evaluate all filters and apply the remaining options.
|
|
||||||
if opt := s.opts.filter(s, t, vx, vy); opt != nil {
|
|
||||||
opt.apply(s, vx, vy)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) tryMethod(t reflect.Type, vx, vy reflect.Value) bool {
|
|
||||||
// Check if this type even has an Equal method.
|
|
||||||
m, ok := t.MethodByName("Equal")
|
|
||||||
if !ok || !function.IsType(m.Type, function.EqualAssignable) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
eq := s.callTTBFunc(m.Func, vx, vy)
|
|
||||||
s.report(eq, reportByMethod)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value {
|
|
||||||
if !s.dynChecker.Next() {
|
|
||||||
return f.Call([]reflect.Value{v})[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the function twice and ensure that we get the same results back.
|
|
||||||
// We run in goroutines so that the race detector (if enabled) can detect
|
|
||||||
// unsafe mutations to the input.
|
|
||||||
c := make(chan reflect.Value)
|
|
||||||
go detectRaces(c, f, v)
|
|
||||||
got := <-c
|
|
||||||
want := f.Call([]reflect.Value{v})[0]
|
|
||||||
if step.vx, step.vy = got, want; !s.statelessCompare(step).Equal() {
|
|
||||||
// To avoid false-positives with non-reflexive equality operations,
|
|
||||||
// we sanity check whether a value is equal to itself.
|
|
||||||
if step.vx, step.vy = want, want; !s.statelessCompare(step).Equal() {
|
|
||||||
return want
|
|
||||||
}
|
|
||||||
panic(fmt.Sprintf("non-deterministic function detected: %s", function.NameOf(f)))
|
|
||||||
}
|
|
||||||
return want
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) callTTBFunc(f, x, y reflect.Value) bool {
|
|
||||||
if !s.dynChecker.Next() {
|
|
||||||
return f.Call([]reflect.Value{x, y})[0].Bool()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swapping the input arguments is sufficient to check that
|
|
||||||
// f is symmetric and deterministic.
|
|
||||||
// We run in goroutines so that the race detector (if enabled) can detect
|
|
||||||
// unsafe mutations to the input.
|
|
||||||
c := make(chan reflect.Value)
|
|
||||||
go detectRaces(c, f, y, x)
|
|
||||||
got := <-c
|
|
||||||
want := f.Call([]reflect.Value{x, y})[0].Bool()
|
|
||||||
if !got.IsValid() || got.Bool() != want {
|
|
||||||
panic(fmt.Sprintf("non-deterministic or non-symmetric function detected: %s", function.NameOf(f)))
|
|
||||||
}
|
|
||||||
return want
|
|
||||||
}
|
|
||||||
|
|
||||||
func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) {
|
|
||||||
var ret reflect.Value
|
|
||||||
defer func() {
|
|
||||||
recover() // Ignore panics, let the other call to f panic instead
|
|
||||||
c <- ret
|
|
||||||
}()
|
|
||||||
ret = f.Call(vs)[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) {
|
|
||||||
var addr bool
|
|
||||||
var vax, vay reflect.Value // Addressable versions of vx and vy
|
|
||||||
|
|
||||||
var mayForce, mayForceInit bool
|
|
||||||
step := StructField{&structField{}}
|
|
||||||
for i := 0; i < t.NumField(); i++ {
|
|
||||||
step.typ = t.Field(i).Type
|
|
||||||
step.vx = vx.Field(i)
|
|
||||||
step.vy = vy.Field(i)
|
|
||||||
step.name = t.Field(i).Name
|
|
||||||
step.idx = i
|
|
||||||
step.unexported = !isExported(step.name)
|
|
||||||
if step.unexported {
|
|
||||||
if step.name == "_" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// Defer checking of unexported fields until later to give an
|
|
||||||
// Ignore a chance to ignore the field.
|
|
||||||
if !vax.IsValid() || !vay.IsValid() {
|
|
||||||
// For retrieveUnexportedField to work, the parent struct must
|
|
||||||
// be addressable. Create a new copy of the values if
|
|
||||||
// necessary to make them addressable.
|
|
||||||
addr = vx.CanAddr() || vy.CanAddr()
|
|
||||||
vax = makeAddressable(vx)
|
|
||||||
vay = makeAddressable(vy)
|
|
||||||
}
|
|
||||||
if !mayForceInit {
|
|
||||||
for _, xf := range s.exporters {
|
|
||||||
mayForce = mayForce || xf(t)
|
|
||||||
}
|
|
||||||
mayForceInit = true
|
|
||||||
}
|
|
||||||
step.mayForce = mayForce
|
|
||||||
step.paddr = addr
|
|
||||||
step.pvx = vax
|
|
||||||
step.pvy = vay
|
|
||||||
step.field = t.Field(i)
|
|
||||||
}
|
|
||||||
s.compareAny(step)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) compareSlice(t reflect.Type, vx, vy reflect.Value) {
|
|
||||||
isSlice := t.Kind() == reflect.Slice
|
|
||||||
if isSlice && (vx.IsNil() || vy.IsNil()) {
|
|
||||||
s.report(vx.IsNil() && vy.IsNil(), 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: It is incorrect to call curPtrs.Push on the slice header pointer
|
|
||||||
// since slices represents a list of pointers, rather than a single pointer.
|
|
||||||
// The pointer checking logic must be handled on a per-element basis
|
|
||||||
// in compareAny.
|
|
||||||
//
|
|
||||||
// A slice header (see reflect.SliceHeader) in Go is a tuple of a starting
|
|
||||||
// pointer P, a length N, and a capacity C. Supposing each slice element has
|
|
||||||
// a memory size of M, then the slice is equivalent to the list of pointers:
|
|
||||||
// [P+i*M for i in range(N)]
|
|
||||||
//
|
|
||||||
// For example, v[:0] and v[:1] are slices with the same starting pointer,
|
|
||||||
// but they are clearly different values. Using the slice pointer alone
|
|
||||||
// violates the assumption that equal pointers implies equal values.
|
|
||||||
|
|
||||||
step := SliceIndex{&sliceIndex{pathStep: pathStep{typ: t.Elem()}, isSlice: isSlice}}
|
|
||||||
withIndexes := func(ix, iy int) SliceIndex {
|
|
||||||
if ix >= 0 {
|
|
||||||
step.vx, step.xkey = vx.Index(ix), ix
|
|
||||||
} else {
|
|
||||||
step.vx, step.xkey = reflect.Value{}, -1
|
|
||||||
}
|
|
||||||
if iy >= 0 {
|
|
||||||
step.vy, step.ykey = vy.Index(iy), iy
|
|
||||||
} else {
|
|
||||||
step.vy, step.ykey = reflect.Value{}, -1
|
|
||||||
}
|
|
||||||
return step
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore options are able to ignore missing elements in a slice.
|
|
||||||
// However, detecting these reliably requires an optimal differencing
|
|
||||||
// algorithm, for which diff.Difference is not.
|
|
||||||
//
|
|
||||||
// Instead, we first iterate through both slices to detect which elements
|
|
||||||
// would be ignored if standing alone. The index of non-discarded elements
|
|
||||||
// are stored in a separate slice, which diffing is then performed on.
|
|
||||||
var indexesX, indexesY []int
|
|
||||||
var ignoredX, ignoredY []bool
|
|
||||||
for ix := 0; ix < vx.Len(); ix++ {
|
|
||||||
ignored := s.statelessCompare(withIndexes(ix, -1)).NumDiff == 0
|
|
||||||
if !ignored {
|
|
||||||
indexesX = append(indexesX, ix)
|
|
||||||
}
|
|
||||||
ignoredX = append(ignoredX, ignored)
|
|
||||||
}
|
|
||||||
for iy := 0; iy < vy.Len(); iy++ {
|
|
||||||
ignored := s.statelessCompare(withIndexes(-1, iy)).NumDiff == 0
|
|
||||||
if !ignored {
|
|
||||||
indexesY = append(indexesY, iy)
|
|
||||||
}
|
|
||||||
ignoredY = append(ignoredY, ignored)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute an edit-script for slices vx and vy (excluding ignored elements).
|
|
||||||
edits := diff.Difference(len(indexesX), len(indexesY), func(ix, iy int) diff.Result {
|
|
||||||
return s.statelessCompare(withIndexes(indexesX[ix], indexesY[iy]))
|
|
||||||
})
|
|
||||||
|
|
||||||
// Replay the ignore-scripts and the edit-script.
|
|
||||||
var ix, iy int
|
|
||||||
for ix < vx.Len() || iy < vy.Len() {
|
|
||||||
var e diff.EditType
|
|
||||||
switch {
|
|
||||||
case ix < len(ignoredX) && ignoredX[ix]:
|
|
||||||
e = diff.UniqueX
|
|
||||||
case iy < len(ignoredY) && ignoredY[iy]:
|
|
||||||
e = diff.UniqueY
|
|
||||||
default:
|
|
||||||
e, edits = edits[0], edits[1:]
|
|
||||||
}
|
|
||||||
switch e {
|
|
||||||
case diff.UniqueX:
|
|
||||||
s.compareAny(withIndexes(ix, -1))
|
|
||||||
ix++
|
|
||||||
case diff.UniqueY:
|
|
||||||
s.compareAny(withIndexes(-1, iy))
|
|
||||||
iy++
|
|
||||||
default:
|
|
||||||
s.compareAny(withIndexes(ix, iy))
|
|
||||||
ix++
|
|
||||||
iy++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) compareMap(t reflect.Type, vx, vy reflect.Value) {
|
|
||||||
if vx.IsNil() || vy.IsNil() {
|
|
||||||
s.report(vx.IsNil() && vy.IsNil(), 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cycle-detection for maps.
|
|
||||||
if eq, visited := s.curPtrs.Push(vx, vy); visited {
|
|
||||||
s.report(eq, reportByCycle)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer s.curPtrs.Pop(vx, vy)
|
|
||||||
|
|
||||||
// We combine and sort the two map keys so that we can perform the
|
|
||||||
// comparisons in a deterministic order.
|
|
||||||
step := MapIndex{&mapIndex{pathStep: pathStep{typ: t.Elem()}}}
|
|
||||||
for _, k := range value.SortKeys(append(vx.MapKeys(), vy.MapKeys()...)) {
|
|
||||||
step.vx = vx.MapIndex(k)
|
|
||||||
step.vy = vy.MapIndex(k)
|
|
||||||
step.key = k
|
|
||||||
if !step.vx.IsValid() && !step.vy.IsValid() {
|
|
||||||
// It is possible for both vx and vy to be invalid if the
|
|
||||||
// key contained a NaN value in it.
|
|
||||||
//
|
|
||||||
// Even with the ability to retrieve NaN keys in Go 1.12,
|
|
||||||
// there still isn't a sensible way to compare the values since
|
|
||||||
// a NaN key may map to multiple unordered values.
|
|
||||||
// The most reasonable way to compare NaNs would be to compare the
|
|
||||||
// set of values. However, this is impossible to do efficiently
|
|
||||||
// since set equality is provably an O(n^2) operation given only
|
|
||||||
// an Equal function. If we had a Less function or Hash function,
|
|
||||||
// this could be done in O(n*log(n)) or O(n), respectively.
|
|
||||||
//
|
|
||||||
// Rather than adding complex logic to deal with NaNs, make it
|
|
||||||
// the user's responsibility to compare such obscure maps.
|
|
||||||
const help = "consider providing a Comparer to compare the map"
|
|
||||||
panic(fmt.Sprintf("%#v has map key with NaNs\n%s", s.curPath, help))
|
|
||||||
}
|
|
||||||
s.compareAny(step)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) comparePtr(t reflect.Type, vx, vy reflect.Value) {
|
|
||||||
if vx.IsNil() || vy.IsNil() {
|
|
||||||
s.report(vx.IsNil() && vy.IsNil(), 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cycle-detection for pointers.
|
|
||||||
if eq, visited := s.curPtrs.Push(vx, vy); visited {
|
|
||||||
s.report(eq, reportByCycle)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer s.curPtrs.Pop(vx, vy)
|
|
||||||
|
|
||||||
vx, vy = vx.Elem(), vy.Elem()
|
|
||||||
s.compareAny(Indirect{&indirect{pathStep{t.Elem(), vx, vy}}})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) compareInterface(t reflect.Type, vx, vy reflect.Value) {
|
|
||||||
if vx.IsNil() || vy.IsNil() {
|
|
||||||
s.report(vx.IsNil() && vy.IsNil(), 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
vx, vy = vx.Elem(), vy.Elem()
|
|
||||||
if vx.Type() != vy.Type() {
|
|
||||||
s.report(false, 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
s.compareAny(TypeAssertion{&typeAssertion{pathStep{vx.Type(), vx, vy}}})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *state) report(eq bool, rf resultFlags) {
|
|
||||||
if rf&reportByIgnore == 0 {
|
|
||||||
if eq {
|
|
||||||
s.result.NumSame++
|
|
||||||
rf |= reportEqual
|
|
||||||
} else {
|
|
||||||
s.result.NumDiff++
|
|
||||||
rf |= reportUnequal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, r := range s.reporters {
|
|
||||||
r.Report(Result{flags: rf})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// recChecker tracks the state needed to periodically perform checks that
|
|
||||||
// user provided transformers are not stuck in an infinitely recursive cycle.
|
|
||||||
type recChecker struct{ next int }
|
|
||||||
|
|
||||||
// Check scans the Path for any recursive transformers and panics when any
|
|
||||||
// recursive transformers are detected. Note that the presence of a
|
|
||||||
// recursive Transformer does not necessarily imply an infinite cycle.
|
|
||||||
// As such, this check only activates after some minimal number of path steps.
|
|
||||||
func (rc *recChecker) Check(p Path) {
|
|
||||||
const minLen = 1 << 16
|
|
||||||
if rc.next == 0 {
|
|
||||||
rc.next = minLen
|
|
||||||
}
|
|
||||||
if len(p) < rc.next {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
rc.next <<= 1
|
|
||||||
|
|
||||||
// Check whether the same transformer has appeared at least twice.
|
|
||||||
var ss []string
|
|
||||||
m := map[Option]int{}
|
|
||||||
for _, ps := range p {
|
|
||||||
if t, ok := ps.(Transform); ok {
|
|
||||||
t := t.Option()
|
|
||||||
if m[t] == 1 { // Transformer was used exactly once before
|
|
||||||
tf := t.(*transformer).fnc.Type()
|
|
||||||
ss = append(ss, fmt.Sprintf("%v: %v => %v", t, tf.In(0), tf.Out(0)))
|
|
||||||
}
|
|
||||||
m[t]++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(ss) > 0 {
|
|
||||||
const warning = "recursive set of Transformers detected"
|
|
||||||
const help = "consider using cmpopts.AcyclicTransformer"
|
|
||||||
set := strings.Join(ss, "\n\t")
|
|
||||||
panic(fmt.Sprintf("%s:\n\t%s\n%s", warning, set, help))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// dynChecker tracks the state needed to periodically perform checks that
|
|
||||||
// user provided functions are symmetric and deterministic.
|
|
||||||
// The zero value is safe for immediate use.
|
|
||||||
type dynChecker struct{ curr, next int }
|
|
||||||
|
|
||||||
// Next increments the state and reports whether a check should be performed.
|
|
||||||
//
|
|
||||||
// Checks occur every Nth function call, where N is a triangular number:
|
|
||||||
//
|
|
||||||
// 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 ...
|
|
||||||
//
|
|
||||||
// See https://en.wikipedia.org/wiki/Triangular_number
|
|
||||||
//
|
|
||||||
// This sequence ensures that the cost of checks drops significantly as
|
|
||||||
// the number of functions calls grows larger.
|
|
||||||
func (dc *dynChecker) Next() bool {
|
|
||||||
ok := dc.curr == dc.next
|
|
||||||
if ok {
|
|
||||||
dc.curr = 0
|
|
||||||
dc.next++
|
|
||||||
}
|
|
||||||
dc.curr++
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// makeAddressable returns a value that is always addressable.
|
|
||||||
// It returns the input verbatim if it is already addressable,
|
|
||||||
// otherwise it creates a new value and returns an addressable copy.
|
|
||||||
func makeAddressable(v reflect.Value) reflect.Value {
|
|
||||||
if v.CanAddr() {
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
vc := reflect.New(v.Type()).Elem()
|
|
||||||
vc.Set(v)
|
|
||||||
return vc
|
|
||||||
}
|
|
31
vendor/github.com/google/go-cmp/cmp/export.go
generated
vendored
31
vendor/github.com/google/go-cmp/cmp/export.go
generated
vendored
|
@ -1,31 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// retrieveUnexportedField uses unsafe to forcibly retrieve any field from
|
|
||||||
// a struct such that the value has read-write permissions.
|
|
||||||
//
|
|
||||||
// The parent struct, v, must be addressable, while f must be a StructField
|
|
||||||
// describing the field to retrieve. If addr is false,
|
|
||||||
// then the returned value will be shallowed copied to be non-addressable.
|
|
||||||
func retrieveUnexportedField(v reflect.Value, f reflect.StructField, addr bool) reflect.Value {
|
|
||||||
ve := reflect.NewAt(f.Type, unsafe.Pointer(uintptr(unsafe.Pointer(v.UnsafeAddr()))+f.Offset)).Elem()
|
|
||||||
if !addr {
|
|
||||||
// A field is addressable if and only if the struct is addressable.
|
|
||||||
// If the original parent value was not addressable, shallow copy the
|
|
||||||
// value to make it non-addressable to avoid leaking an implementation
|
|
||||||
// detail of how forcibly exporting a field works.
|
|
||||||
if ve.Kind() == reflect.Interface && ve.IsNil() {
|
|
||||||
return reflect.Zero(f.Type)
|
|
||||||
}
|
|
||||||
return reflect.ValueOf(ve.Interface()).Convert(f.Type)
|
|
||||||
}
|
|
||||||
return ve
|
|
||||||
}
|
|
18
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go
generated
vendored
18
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go
generated
vendored
|
@ -1,18 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build !cmp_debug
|
|
||||||
// +build !cmp_debug
|
|
||||||
|
|
||||||
package diff
|
|
||||||
|
|
||||||
var debug debugger
|
|
||||||
|
|
||||||
type debugger struct{}
|
|
||||||
|
|
||||||
func (debugger) Begin(_, _ int, f EqualFunc, _, _ *EditScript) EqualFunc {
|
|
||||||
return f
|
|
||||||
}
|
|
||||||
func (debugger) Update() {}
|
|
||||||
func (debugger) Finish() {}
|
|
123
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go
generated
vendored
123
vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go
generated
vendored
|
@ -1,123 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build cmp_debug
|
|
||||||
// +build cmp_debug
|
|
||||||
|
|
||||||
package diff
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// The algorithm can be seen running in real-time by enabling debugging:
|
|
||||||
// go test -tags=cmp_debug -v
|
|
||||||
//
|
|
||||||
// Example output:
|
|
||||||
// === RUN TestDifference/#34
|
|
||||||
// ┌───────────────────────────────┐
|
|
||||||
// │ \ · · · · · · · · · · · · · · │
|
|
||||||
// │ · # · · · · · · · · · · · · · │
|
|
||||||
// │ · \ · · · · · · · · · · · · · │
|
|
||||||
// │ · · \ · · · · · · · · · · · · │
|
|
||||||
// │ · · · X # · · · · · · · · · · │
|
|
||||||
// │ · · · # \ · · · · · · · · · · │
|
|
||||||
// │ · · · · · # # · · · · · · · · │
|
|
||||||
// │ · · · · · # \ · · · · · · · · │
|
|
||||||
// │ · · · · · · · \ · · · · · · · │
|
|
||||||
// │ · · · · · · · · \ · · · · · · │
|
|
||||||
// │ · · · · · · · · · \ · · · · · │
|
|
||||||
// │ · · · · · · · · · · \ · · # · │
|
|
||||||
// │ · · · · · · · · · · · \ # # · │
|
|
||||||
// │ · · · · · · · · · · · # # # · │
|
|
||||||
// │ · · · · · · · · · · # # # # · │
|
|
||||||
// │ · · · · · · · · · # # # # # · │
|
|
||||||
// │ · · · · · · · · · · · · · · \ │
|
|
||||||
// └───────────────────────────────┘
|
|
||||||
// [.Y..M.XY......YXYXY.|]
|
|
||||||
//
|
|
||||||
// The grid represents the edit-graph where the horizontal axis represents
|
|
||||||
// list X and the vertical axis represents list Y. The start of the two lists
|
|
||||||
// is the top-left, while the ends are the bottom-right. The '·' represents
|
|
||||||
// an unexplored node in the graph. The '\' indicates that the two symbols
|
|
||||||
// from list X and Y are equal. The 'X' indicates that two symbols are similar
|
|
||||||
// (but not exactly equal) to each other. The '#' indicates that the two symbols
|
|
||||||
// are different (and not similar). The algorithm traverses this graph trying to
|
|
||||||
// make the paths starting in the top-left and the bottom-right connect.
|
|
||||||
//
|
|
||||||
// The series of '.', 'X', 'Y', and 'M' characters at the bottom represents
|
|
||||||
// the currently established path from the forward and reverse searches,
|
|
||||||
// separated by a '|' character.
|
|
||||||
|
|
||||||
const (
|
|
||||||
updateDelay = 100 * time.Millisecond
|
|
||||||
finishDelay = 500 * time.Millisecond
|
|
||||||
ansiTerminal = true // ANSI escape codes used to move terminal cursor
|
|
||||||
)
|
|
||||||
|
|
||||||
var debug debugger
|
|
||||||
|
|
||||||
type debugger struct {
|
|
||||||
sync.Mutex
|
|
||||||
p1, p2 EditScript
|
|
||||||
fwdPath, revPath *EditScript
|
|
||||||
grid []byte
|
|
||||||
lines int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dbg *debugger) Begin(nx, ny int, f EqualFunc, p1, p2 *EditScript) EqualFunc {
|
|
||||||
dbg.Lock()
|
|
||||||
dbg.fwdPath, dbg.revPath = p1, p2
|
|
||||||
top := "┌─" + strings.Repeat("──", nx) + "┐\n"
|
|
||||||
row := "│ " + strings.Repeat("· ", nx) + "│\n"
|
|
||||||
btm := "└─" + strings.Repeat("──", nx) + "┘\n"
|
|
||||||
dbg.grid = []byte(top + strings.Repeat(row, ny) + btm)
|
|
||||||
dbg.lines = strings.Count(dbg.String(), "\n")
|
|
||||||
fmt.Print(dbg)
|
|
||||||
|
|
||||||
// Wrap the EqualFunc so that we can intercept each result.
|
|
||||||
return func(ix, iy int) (r Result) {
|
|
||||||
cell := dbg.grid[len(top)+iy*len(row):][len("│ ")+len("· ")*ix:][:len("·")]
|
|
||||||
for i := range cell {
|
|
||||||
cell[i] = 0 // Zero out the multiple bytes of UTF-8 middle-dot
|
|
||||||
}
|
|
||||||
switch r = f(ix, iy); {
|
|
||||||
case r.Equal():
|
|
||||||
cell[0] = '\\'
|
|
||||||
case r.Similar():
|
|
||||||
cell[0] = 'X'
|
|
||||||
default:
|
|
||||||
cell[0] = '#'
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dbg *debugger) Update() {
|
|
||||||
dbg.print(updateDelay)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dbg *debugger) Finish() {
|
|
||||||
dbg.print(finishDelay)
|
|
||||||
dbg.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dbg *debugger) String() string {
|
|
||||||
dbg.p1, dbg.p2 = *dbg.fwdPath, dbg.p2[:0]
|
|
||||||
for i := len(*dbg.revPath) - 1; i >= 0; i-- {
|
|
||||||
dbg.p2 = append(dbg.p2, (*dbg.revPath)[i])
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%s[%v|%v]\n\n", dbg.grid, dbg.p1, dbg.p2)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (dbg *debugger) print(d time.Duration) {
|
|
||||||
if ansiTerminal {
|
|
||||||
fmt.Printf("\x1b[%dA", dbg.lines) // Reset terminal cursor
|
|
||||||
}
|
|
||||||
fmt.Print(dbg)
|
|
||||||
time.Sleep(d)
|
|
||||||
}
|
|
402
vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go
generated
vendored
402
vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go
generated
vendored
|
@ -1,402 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package diff implements an algorithm for producing edit-scripts.
|
|
||||||
// The edit-script is a sequence of operations needed to transform one list
|
|
||||||
// of symbols into another (or vice-versa). The edits allowed are insertions,
|
|
||||||
// deletions, and modifications. The summation of all edits is called the
|
|
||||||
// Levenshtein distance as this problem is well-known in computer science.
|
|
||||||
//
|
|
||||||
// This package prioritizes performance over accuracy. That is, the run time
|
|
||||||
// is more important than obtaining a minimal Levenshtein distance.
|
|
||||||
package diff
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/rand"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/flags"
|
|
||||||
)
|
|
||||||
|
|
||||||
// EditType represents a single operation within an edit-script.
|
|
||||||
type EditType uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Identity indicates that a symbol pair is identical in both list X and Y.
|
|
||||||
Identity EditType = iota
|
|
||||||
// UniqueX indicates that a symbol only exists in X and not Y.
|
|
||||||
UniqueX
|
|
||||||
// UniqueY indicates that a symbol only exists in Y and not X.
|
|
||||||
UniqueY
|
|
||||||
// Modified indicates that a symbol pair is a modification of each other.
|
|
||||||
Modified
|
|
||||||
)
|
|
||||||
|
|
||||||
// EditScript represents the series of differences between two lists.
|
|
||||||
type EditScript []EditType
|
|
||||||
|
|
||||||
// String returns a human-readable string representing the edit-script where
|
|
||||||
// Identity, UniqueX, UniqueY, and Modified are represented by the
|
|
||||||
// '.', 'X', 'Y', and 'M' characters, respectively.
|
|
||||||
func (es EditScript) String() string {
|
|
||||||
b := make([]byte, len(es))
|
|
||||||
for i, e := range es {
|
|
||||||
switch e {
|
|
||||||
case Identity:
|
|
||||||
b[i] = '.'
|
|
||||||
case UniqueX:
|
|
||||||
b[i] = 'X'
|
|
||||||
case UniqueY:
|
|
||||||
b[i] = 'Y'
|
|
||||||
case Modified:
|
|
||||||
b[i] = 'M'
|
|
||||||
default:
|
|
||||||
panic("invalid edit-type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return string(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
// stats returns a histogram of the number of each type of edit operation.
|
|
||||||
func (es EditScript) stats() (s struct{ NI, NX, NY, NM int }) {
|
|
||||||
for _, e := range es {
|
|
||||||
switch e {
|
|
||||||
case Identity:
|
|
||||||
s.NI++
|
|
||||||
case UniqueX:
|
|
||||||
s.NX++
|
|
||||||
case UniqueY:
|
|
||||||
s.NY++
|
|
||||||
case Modified:
|
|
||||||
s.NM++
|
|
||||||
default:
|
|
||||||
panic("invalid edit-type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dist is the Levenshtein distance and is guaranteed to be 0 if and only if
|
|
||||||
// lists X and Y are equal.
|
|
||||||
func (es EditScript) Dist() int { return len(es) - es.stats().NI }
|
|
||||||
|
|
||||||
// LenX is the length of the X list.
|
|
||||||
func (es EditScript) LenX() int { return len(es) - es.stats().NY }
|
|
||||||
|
|
||||||
// LenY is the length of the Y list.
|
|
||||||
func (es EditScript) LenY() int { return len(es) - es.stats().NX }
|
|
||||||
|
|
||||||
// EqualFunc reports whether the symbols at indexes ix and iy are equal.
|
|
||||||
// When called by Difference, the index is guaranteed to be within nx and ny.
|
|
||||||
type EqualFunc func(ix int, iy int) Result
|
|
||||||
|
|
||||||
// Result is the result of comparison.
|
|
||||||
// NumSame is the number of sub-elements that are equal.
|
|
||||||
// NumDiff is the number of sub-elements that are not equal.
|
|
||||||
type Result struct{ NumSame, NumDiff int }
|
|
||||||
|
|
||||||
// BoolResult returns a Result that is either Equal or not Equal.
|
|
||||||
func BoolResult(b bool) Result {
|
|
||||||
if b {
|
|
||||||
return Result{NumSame: 1} // Equal, Similar
|
|
||||||
} else {
|
|
||||||
return Result{NumDiff: 2} // Not Equal, not Similar
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal indicates whether the symbols are equal. Two symbols are equal
|
|
||||||
// if and only if NumDiff == 0. If Equal, then they are also Similar.
|
|
||||||
func (r Result) Equal() bool { return r.NumDiff == 0 }
|
|
||||||
|
|
||||||
// Similar indicates whether two symbols are similar and may be represented
|
|
||||||
// by using the Modified type. As a special case, we consider binary comparisons
|
|
||||||
// (i.e., those that return Result{1, 0} or Result{0, 1}) to be similar.
|
|
||||||
//
|
|
||||||
// The exact ratio of NumSame to NumDiff to determine similarity may change.
|
|
||||||
func (r Result) Similar() bool {
|
|
||||||
// Use NumSame+1 to offset NumSame so that binary comparisons are similar.
|
|
||||||
return r.NumSame+1 >= r.NumDiff
|
|
||||||
}
|
|
||||||
|
|
||||||
var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0
|
|
||||||
|
|
||||||
// Difference reports whether two lists of lengths nx and ny are equal
|
|
||||||
// given the definition of equality provided as f.
|
|
||||||
//
|
|
||||||
// This function returns an edit-script, which is a sequence of operations
|
|
||||||
// needed to convert one list into the other. The following invariants for
|
|
||||||
// the edit-script are maintained:
|
|
||||||
// - eq == (es.Dist()==0)
|
|
||||||
// - nx == es.LenX()
|
|
||||||
// - ny == es.LenY()
|
|
||||||
//
|
|
||||||
// This algorithm is not guaranteed to be an optimal solution (i.e., one that
|
|
||||||
// produces an edit-script with a minimal Levenshtein distance). This algorithm
|
|
||||||
// favors performance over optimality. The exact output is not guaranteed to
|
|
||||||
// be stable and may change over time.
|
|
||||||
func Difference(nx, ny int, f EqualFunc) (es EditScript) {
|
|
||||||
// This algorithm is based on traversing what is known as an "edit-graph".
|
|
||||||
// See Figure 1 from "An O(ND) Difference Algorithm and Its Variations"
|
|
||||||
// by Eugene W. Myers. Since D can be as large as N itself, this is
|
|
||||||
// effectively O(N^2). Unlike the algorithm from that paper, we are not
|
|
||||||
// interested in the optimal path, but at least some "decent" path.
|
|
||||||
//
|
|
||||||
// For example, let X and Y be lists of symbols:
|
|
||||||
// X = [A B C A B B A]
|
|
||||||
// Y = [C B A B A C]
|
|
||||||
//
|
|
||||||
// The edit-graph can be drawn as the following:
|
|
||||||
// A B C A B B A
|
|
||||||
// ┌─────────────┐
|
|
||||||
// C │_|_|\|_|_|_|_│ 0
|
|
||||||
// B │_|\|_|_|\|\|_│ 1
|
|
||||||
// A │\|_|_|\|_|_|\│ 2
|
|
||||||
// B │_|\|_|_|\|\|_│ 3
|
|
||||||
// A │\|_|_|\|_|_|\│ 4
|
|
||||||
// C │ | |\| | | | │ 5
|
|
||||||
// └─────────────┘ 6
|
|
||||||
// 0 1 2 3 4 5 6 7
|
|
||||||
//
|
|
||||||
// List X is written along the horizontal axis, while list Y is written
|
|
||||||
// along the vertical axis. At any point on this grid, if the symbol in
|
|
||||||
// list X matches the corresponding symbol in list Y, then a '\' is drawn.
|
|
||||||
// The goal of any minimal edit-script algorithm is to find a path from the
|
|
||||||
// top-left corner to the bottom-right corner, while traveling through the
|
|
||||||
// fewest horizontal or vertical edges.
|
|
||||||
// A horizontal edge is equivalent to inserting a symbol from list X.
|
|
||||||
// A vertical edge is equivalent to inserting a symbol from list Y.
|
|
||||||
// A diagonal edge is equivalent to a matching symbol between both X and Y.
|
|
||||||
|
|
||||||
// Invariants:
|
|
||||||
// - 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx
|
|
||||||
// - 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny
|
|
||||||
//
|
|
||||||
// In general:
|
|
||||||
// - fwdFrontier.X < revFrontier.X
|
|
||||||
// - fwdFrontier.Y < revFrontier.Y
|
|
||||||
//
|
|
||||||
// Unless, it is time for the algorithm to terminate.
|
|
||||||
fwdPath := path{+1, point{0, 0}, make(EditScript, 0, (nx+ny)/2)}
|
|
||||||
revPath := path{-1, point{nx, ny}, make(EditScript, 0)}
|
|
||||||
fwdFrontier := fwdPath.point // Forward search frontier
|
|
||||||
revFrontier := revPath.point // Reverse search frontier
|
|
||||||
|
|
||||||
// Search budget bounds the cost of searching for better paths.
|
|
||||||
// The longest sequence of non-matching symbols that can be tolerated is
|
|
||||||
// approximately the square-root of the search budget.
|
|
||||||
searchBudget := 4 * (nx + ny) // O(n)
|
|
||||||
|
|
||||||
// Running the tests with the "cmp_debug" build tag prints a visualization
|
|
||||||
// of the algorithm running in real-time. This is educational for
|
|
||||||
// understanding how the algorithm works. See debug_enable.go.
|
|
||||||
f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es)
|
|
||||||
|
|
||||||
// The algorithm below is a greedy, meet-in-the-middle algorithm for
|
|
||||||
// computing sub-optimal edit-scripts between two lists.
|
|
||||||
//
|
|
||||||
// The algorithm is approximately as follows:
|
|
||||||
// - Searching for differences switches back-and-forth between
|
|
||||||
// a search that starts at the beginning (the top-left corner), and
|
|
||||||
// a search that starts at the end (the bottom-right corner).
|
|
||||||
// The goal of the search is connect with the search
|
|
||||||
// from the opposite corner.
|
|
||||||
// - As we search, we build a path in a greedy manner,
|
|
||||||
// where the first match seen is added to the path (this is sub-optimal,
|
|
||||||
// but provides a decent result in practice). When matches are found,
|
|
||||||
// we try the next pair of symbols in the lists and follow all matches
|
|
||||||
// as far as possible.
|
|
||||||
// - When searching for matches, we search along a diagonal going through
|
|
||||||
// through the "frontier" point. If no matches are found,
|
|
||||||
// we advance the frontier towards the opposite corner.
|
|
||||||
// - This algorithm terminates when either the X coordinates or the
|
|
||||||
// Y coordinates of the forward and reverse frontier points ever intersect.
|
|
||||||
|
|
||||||
// This algorithm is correct even if searching only in the forward direction
|
|
||||||
// or in the reverse direction. We do both because it is commonly observed
|
|
||||||
// that two lists commonly differ because elements were added to the front
|
|
||||||
// or end of the other list.
|
|
||||||
//
|
|
||||||
// Non-deterministically start with either the forward or reverse direction
|
|
||||||
// to introduce some deliberate instability so that we have the flexibility
|
|
||||||
// to change this algorithm in the future.
|
|
||||||
if flags.Deterministic || randBool {
|
|
||||||
goto forwardSearch
|
|
||||||
} else {
|
|
||||||
goto reverseSearch
|
|
||||||
}
|
|
||||||
|
|
||||||
forwardSearch:
|
|
||||||
{
|
|
||||||
// Forward search from the beginning.
|
|
||||||
if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 {
|
|
||||||
goto finishSearch
|
|
||||||
}
|
|
||||||
for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ {
|
|
||||||
// Search in a diagonal pattern for a match.
|
|
||||||
z := zigzag(i)
|
|
||||||
p := point{fwdFrontier.X + z, fwdFrontier.Y - z}
|
|
||||||
switch {
|
|
||||||
case p.X >= revPath.X || p.Y < fwdPath.Y:
|
|
||||||
stop1 = true // Hit top-right corner
|
|
||||||
case p.Y >= revPath.Y || p.X < fwdPath.X:
|
|
||||||
stop2 = true // Hit bottom-left corner
|
|
||||||
case f(p.X, p.Y).Equal():
|
|
||||||
// Match found, so connect the path to this point.
|
|
||||||
fwdPath.connect(p, f)
|
|
||||||
fwdPath.append(Identity)
|
|
||||||
// Follow sequence of matches as far as possible.
|
|
||||||
for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y {
|
|
||||||
if !f(fwdPath.X, fwdPath.Y).Equal() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
fwdPath.append(Identity)
|
|
||||||
}
|
|
||||||
fwdFrontier = fwdPath.point
|
|
||||||
stop1, stop2 = true, true
|
|
||||||
default:
|
|
||||||
searchBudget-- // Match not found
|
|
||||||
}
|
|
||||||
debug.Update()
|
|
||||||
}
|
|
||||||
// Advance the frontier towards reverse point.
|
|
||||||
if revPath.X-fwdFrontier.X >= revPath.Y-fwdFrontier.Y {
|
|
||||||
fwdFrontier.X++
|
|
||||||
} else {
|
|
||||||
fwdFrontier.Y++
|
|
||||||
}
|
|
||||||
goto reverseSearch
|
|
||||||
}
|
|
||||||
|
|
||||||
reverseSearch:
|
|
||||||
{
|
|
||||||
// Reverse search from the end.
|
|
||||||
if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 {
|
|
||||||
goto finishSearch
|
|
||||||
}
|
|
||||||
for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ {
|
|
||||||
// Search in a diagonal pattern for a match.
|
|
||||||
z := zigzag(i)
|
|
||||||
p := point{revFrontier.X - z, revFrontier.Y + z}
|
|
||||||
switch {
|
|
||||||
case fwdPath.X >= p.X || revPath.Y < p.Y:
|
|
||||||
stop1 = true // Hit bottom-left corner
|
|
||||||
case fwdPath.Y >= p.Y || revPath.X < p.X:
|
|
||||||
stop2 = true // Hit top-right corner
|
|
||||||
case f(p.X-1, p.Y-1).Equal():
|
|
||||||
// Match found, so connect the path to this point.
|
|
||||||
revPath.connect(p, f)
|
|
||||||
revPath.append(Identity)
|
|
||||||
// Follow sequence of matches as far as possible.
|
|
||||||
for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y {
|
|
||||||
if !f(revPath.X-1, revPath.Y-1).Equal() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
revPath.append(Identity)
|
|
||||||
}
|
|
||||||
revFrontier = revPath.point
|
|
||||||
stop1, stop2 = true, true
|
|
||||||
default:
|
|
||||||
searchBudget-- // Match not found
|
|
||||||
}
|
|
||||||
debug.Update()
|
|
||||||
}
|
|
||||||
// Advance the frontier towards forward point.
|
|
||||||
if revFrontier.X-fwdPath.X >= revFrontier.Y-fwdPath.Y {
|
|
||||||
revFrontier.X--
|
|
||||||
} else {
|
|
||||||
revFrontier.Y--
|
|
||||||
}
|
|
||||||
goto forwardSearch
|
|
||||||
}
|
|
||||||
|
|
||||||
finishSearch:
|
|
||||||
// Join the forward and reverse paths and then append the reverse path.
|
|
||||||
fwdPath.connect(revPath.point, f)
|
|
||||||
for i := len(revPath.es) - 1; i >= 0; i-- {
|
|
||||||
t := revPath.es[i]
|
|
||||||
revPath.es = revPath.es[:i]
|
|
||||||
fwdPath.append(t)
|
|
||||||
}
|
|
||||||
debug.Finish()
|
|
||||||
return fwdPath.es
|
|
||||||
}
|
|
||||||
|
|
||||||
type path struct {
|
|
||||||
dir int // +1 if forward, -1 if reverse
|
|
||||||
point // Leading point of the EditScript path
|
|
||||||
es EditScript
|
|
||||||
}
|
|
||||||
|
|
||||||
// connect appends any necessary Identity, Modified, UniqueX, or UniqueY types
|
|
||||||
// to the edit-script to connect p.point to dst.
|
|
||||||
func (p *path) connect(dst point, f EqualFunc) {
|
|
||||||
if p.dir > 0 {
|
|
||||||
// Connect in forward direction.
|
|
||||||
for dst.X > p.X && dst.Y > p.Y {
|
|
||||||
switch r := f(p.X, p.Y); {
|
|
||||||
case r.Equal():
|
|
||||||
p.append(Identity)
|
|
||||||
case r.Similar():
|
|
||||||
p.append(Modified)
|
|
||||||
case dst.X-p.X >= dst.Y-p.Y:
|
|
||||||
p.append(UniqueX)
|
|
||||||
default:
|
|
||||||
p.append(UniqueY)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for dst.X > p.X {
|
|
||||||
p.append(UniqueX)
|
|
||||||
}
|
|
||||||
for dst.Y > p.Y {
|
|
||||||
p.append(UniqueY)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Connect in reverse direction.
|
|
||||||
for p.X > dst.X && p.Y > dst.Y {
|
|
||||||
switch r := f(p.X-1, p.Y-1); {
|
|
||||||
case r.Equal():
|
|
||||||
p.append(Identity)
|
|
||||||
case r.Similar():
|
|
||||||
p.append(Modified)
|
|
||||||
case p.Y-dst.Y >= p.X-dst.X:
|
|
||||||
p.append(UniqueY)
|
|
||||||
default:
|
|
||||||
p.append(UniqueX)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for p.X > dst.X {
|
|
||||||
p.append(UniqueX)
|
|
||||||
}
|
|
||||||
for p.Y > dst.Y {
|
|
||||||
p.append(UniqueY)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *path) append(t EditType) {
|
|
||||||
p.es = append(p.es, t)
|
|
||||||
switch t {
|
|
||||||
case Identity, Modified:
|
|
||||||
p.add(p.dir, p.dir)
|
|
||||||
case UniqueX:
|
|
||||||
p.add(p.dir, 0)
|
|
||||||
case UniqueY:
|
|
||||||
p.add(0, p.dir)
|
|
||||||
}
|
|
||||||
debug.Update()
|
|
||||||
}
|
|
||||||
|
|
||||||
type point struct{ X, Y int }
|
|
||||||
|
|
||||||
func (p *point) add(dx, dy int) { p.X += dx; p.Y += dy }
|
|
||||||
|
|
||||||
// zigzag maps a consecutive sequence of integers to a zig-zag sequence.
|
|
||||||
//
|
|
||||||
// [0 1 2 3 4 5 ...] => [0 -1 +1 -2 +2 ...]
|
|
||||||
func zigzag(x int) int {
|
|
||||||
if x&1 != 0 {
|
|
||||||
x = ^x
|
|
||||||
}
|
|
||||||
return x >> 1
|
|
||||||
}
|
|
9
vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go
generated
vendored
9
vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go
generated
vendored
|
@ -1,9 +0,0 @@
|
||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package flags
|
|
||||||
|
|
||||||
// Deterministic controls whether the output of Diff should be deterministic.
|
|
||||||
// This is only used for testing.
|
|
||||||
var Deterministic bool
|
|
99
vendor/github.com/google/go-cmp/cmp/internal/function/func.go
generated
vendored
99
vendor/github.com/google/go-cmp/cmp/internal/function/func.go
generated
vendored
|
@ -1,99 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package function provides functionality for identifying function types.
|
|
||||||
package function
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"regexp"
|
|
||||||
"runtime"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type funcType int
|
|
||||||
|
|
||||||
const (
|
|
||||||
_ funcType = iota
|
|
||||||
|
|
||||||
tbFunc // func(T) bool
|
|
||||||
ttbFunc // func(T, T) bool
|
|
||||||
trbFunc // func(T, R) bool
|
|
||||||
tibFunc // func(T, I) bool
|
|
||||||
trFunc // func(T) R
|
|
||||||
|
|
||||||
Equal = ttbFunc // func(T, T) bool
|
|
||||||
EqualAssignable = tibFunc // func(T, I) bool; encapsulates func(T, T) bool
|
|
||||||
Transformer = trFunc // func(T) R
|
|
||||||
ValueFilter = ttbFunc // func(T, T) bool
|
|
||||||
Less = ttbFunc // func(T, T) bool
|
|
||||||
ValuePredicate = tbFunc // func(T) bool
|
|
||||||
KeyValuePredicate = trbFunc // func(T, R) bool
|
|
||||||
)
|
|
||||||
|
|
||||||
var boolType = reflect.TypeOf(true)
|
|
||||||
|
|
||||||
// IsType reports whether the reflect.Type is of the specified function type.
|
|
||||||
func IsType(t reflect.Type, ft funcType) bool {
|
|
||||||
if t == nil || t.Kind() != reflect.Func || t.IsVariadic() {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
ni, no := t.NumIn(), t.NumOut()
|
|
||||||
switch ft {
|
|
||||||
case tbFunc: // func(T) bool
|
|
||||||
if ni == 1 && no == 1 && t.Out(0) == boolType {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case ttbFunc: // func(T, T) bool
|
|
||||||
if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case trbFunc: // func(T, R) bool
|
|
||||||
if ni == 2 && no == 1 && t.Out(0) == boolType {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case tibFunc: // func(T, I) bool
|
|
||||||
if ni == 2 && no == 1 && t.In(0).AssignableTo(t.In(1)) && t.Out(0) == boolType {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
case trFunc: // func(T) R
|
|
||||||
if ni == 1 && no == 1 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
var lastIdentRx = regexp.MustCompile(`[_\p{L}][_\p{L}\p{N}]*$`)
|
|
||||||
|
|
||||||
// NameOf returns the name of the function value.
|
|
||||||
func NameOf(v reflect.Value) string {
|
|
||||||
fnc := runtime.FuncForPC(v.Pointer())
|
|
||||||
if fnc == nil {
|
|
||||||
return "<unknown>"
|
|
||||||
}
|
|
||||||
fullName := fnc.Name() // e.g., "long/path/name/mypkg.(*MyType).(long/path/name/mypkg.myMethod)-fm"
|
|
||||||
|
|
||||||
// Method closures have a "-fm" suffix.
|
|
||||||
fullName = strings.TrimSuffix(fullName, "-fm")
|
|
||||||
|
|
||||||
var name string
|
|
||||||
for len(fullName) > 0 {
|
|
||||||
inParen := strings.HasSuffix(fullName, ")")
|
|
||||||
fullName = strings.TrimSuffix(fullName, ")")
|
|
||||||
|
|
||||||
s := lastIdentRx.FindString(fullName)
|
|
||||||
if s == "" {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
name = s + "." + name
|
|
||||||
fullName = strings.TrimSuffix(fullName, s)
|
|
||||||
|
|
||||||
if i := strings.LastIndexByte(fullName, '('); inParen && i >= 0 {
|
|
||||||
fullName = fullName[:i]
|
|
||||||
}
|
|
||||||
fullName = strings.TrimSuffix(fullName, ".")
|
|
||||||
}
|
|
||||||
return strings.TrimSuffix(name, ".")
|
|
||||||
}
|
|
164
vendor/github.com/google/go-cmp/cmp/internal/value/name.go
generated
vendored
164
vendor/github.com/google/go-cmp/cmp/internal/value/name.go
generated
vendored
|
@ -1,164 +0,0 @@
|
||||||
// Copyright 2020, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package value
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
var anyType = reflect.TypeOf((*interface{})(nil)).Elem()
|
|
||||||
|
|
||||||
// TypeString is nearly identical to reflect.Type.String,
|
|
||||||
// but has an additional option to specify that full type names be used.
|
|
||||||
func TypeString(t reflect.Type, qualified bool) string {
|
|
||||||
return string(appendTypeName(nil, t, qualified, false))
|
|
||||||
}
|
|
||||||
|
|
||||||
func appendTypeName(b []byte, t reflect.Type, qualified, elideFunc bool) []byte {
|
|
||||||
// BUG: Go reflection provides no way to disambiguate two named types
|
|
||||||
// of the same name and within the same package,
|
|
||||||
// but declared within the namespace of different functions.
|
|
||||||
|
|
||||||
// Use the "any" alias instead of "interface{}" for better readability.
|
|
||||||
if t == anyType {
|
|
||||||
return append(b, "any"...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Named type.
|
|
||||||
if t.Name() != "" {
|
|
||||||
if qualified && t.PkgPath() != "" {
|
|
||||||
b = append(b, '"')
|
|
||||||
b = append(b, t.PkgPath()...)
|
|
||||||
b = append(b, '"')
|
|
||||||
b = append(b, '.')
|
|
||||||
b = append(b, t.Name()...)
|
|
||||||
} else {
|
|
||||||
b = append(b, t.String()...)
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unnamed type.
|
|
||||||
switch k := t.Kind(); k {
|
|
||||||
case reflect.Bool, reflect.String, reflect.UnsafePointer,
|
|
||||||
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
|
||||||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr,
|
|
||||||
reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128:
|
|
||||||
b = append(b, k.String()...)
|
|
||||||
case reflect.Chan:
|
|
||||||
if t.ChanDir() == reflect.RecvDir {
|
|
||||||
b = append(b, "<-"...)
|
|
||||||
}
|
|
||||||
b = append(b, "chan"...)
|
|
||||||
if t.ChanDir() == reflect.SendDir {
|
|
||||||
b = append(b, "<-"...)
|
|
||||||
}
|
|
||||||
b = append(b, ' ')
|
|
||||||
b = appendTypeName(b, t.Elem(), qualified, false)
|
|
||||||
case reflect.Func:
|
|
||||||
if !elideFunc {
|
|
||||||
b = append(b, "func"...)
|
|
||||||
}
|
|
||||||
b = append(b, '(')
|
|
||||||
for i := 0; i < t.NumIn(); i++ {
|
|
||||||
if i > 0 {
|
|
||||||
b = append(b, ", "...)
|
|
||||||
}
|
|
||||||
if i == t.NumIn()-1 && t.IsVariadic() {
|
|
||||||
b = append(b, "..."...)
|
|
||||||
b = appendTypeName(b, t.In(i).Elem(), qualified, false)
|
|
||||||
} else {
|
|
||||||
b = appendTypeName(b, t.In(i), qualified, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b = append(b, ')')
|
|
||||||
switch t.NumOut() {
|
|
||||||
case 0:
|
|
||||||
// Do nothing
|
|
||||||
case 1:
|
|
||||||
b = append(b, ' ')
|
|
||||||
b = appendTypeName(b, t.Out(0), qualified, false)
|
|
||||||
default:
|
|
||||||
b = append(b, " ("...)
|
|
||||||
for i := 0; i < t.NumOut(); i++ {
|
|
||||||
if i > 0 {
|
|
||||||
b = append(b, ", "...)
|
|
||||||
}
|
|
||||||
b = appendTypeName(b, t.Out(i), qualified, false)
|
|
||||||
}
|
|
||||||
b = append(b, ')')
|
|
||||||
}
|
|
||||||
case reflect.Struct:
|
|
||||||
b = append(b, "struct{ "...)
|
|
||||||
for i := 0; i < t.NumField(); i++ {
|
|
||||||
if i > 0 {
|
|
||||||
b = append(b, "; "...)
|
|
||||||
}
|
|
||||||
sf := t.Field(i)
|
|
||||||
if !sf.Anonymous {
|
|
||||||
if qualified && sf.PkgPath != "" {
|
|
||||||
b = append(b, '"')
|
|
||||||
b = append(b, sf.PkgPath...)
|
|
||||||
b = append(b, '"')
|
|
||||||
b = append(b, '.')
|
|
||||||
}
|
|
||||||
b = append(b, sf.Name...)
|
|
||||||
b = append(b, ' ')
|
|
||||||
}
|
|
||||||
b = appendTypeName(b, sf.Type, qualified, false)
|
|
||||||
if sf.Tag != "" {
|
|
||||||
b = append(b, ' ')
|
|
||||||
b = strconv.AppendQuote(b, string(sf.Tag))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if b[len(b)-1] == ' ' {
|
|
||||||
b = b[:len(b)-1]
|
|
||||||
} else {
|
|
||||||
b = append(b, ' ')
|
|
||||||
}
|
|
||||||
b = append(b, '}')
|
|
||||||
case reflect.Slice, reflect.Array:
|
|
||||||
b = append(b, '[')
|
|
||||||
if k == reflect.Array {
|
|
||||||
b = strconv.AppendUint(b, uint64(t.Len()), 10)
|
|
||||||
}
|
|
||||||
b = append(b, ']')
|
|
||||||
b = appendTypeName(b, t.Elem(), qualified, false)
|
|
||||||
case reflect.Map:
|
|
||||||
b = append(b, "map["...)
|
|
||||||
b = appendTypeName(b, t.Key(), qualified, false)
|
|
||||||
b = append(b, ']')
|
|
||||||
b = appendTypeName(b, t.Elem(), qualified, false)
|
|
||||||
case reflect.Ptr:
|
|
||||||
b = append(b, '*')
|
|
||||||
b = appendTypeName(b, t.Elem(), qualified, false)
|
|
||||||
case reflect.Interface:
|
|
||||||
b = append(b, "interface{ "...)
|
|
||||||
for i := 0; i < t.NumMethod(); i++ {
|
|
||||||
if i > 0 {
|
|
||||||
b = append(b, "; "...)
|
|
||||||
}
|
|
||||||
m := t.Method(i)
|
|
||||||
if qualified && m.PkgPath != "" {
|
|
||||||
b = append(b, '"')
|
|
||||||
b = append(b, m.PkgPath...)
|
|
||||||
b = append(b, '"')
|
|
||||||
b = append(b, '.')
|
|
||||||
}
|
|
||||||
b = append(b, m.Name...)
|
|
||||||
b = appendTypeName(b, m.Type, qualified, true)
|
|
||||||
}
|
|
||||||
if b[len(b)-1] == ' ' {
|
|
||||||
b = b[:len(b)-1]
|
|
||||||
} else {
|
|
||||||
b = append(b, ' ')
|
|
||||||
}
|
|
||||||
b = append(b, '}')
|
|
||||||
default:
|
|
||||||
panic("invalid kind: " + k.String())
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
34
vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go
generated
vendored
34
vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go
generated
vendored
|
@ -1,34 +0,0 @@
|
||||||
// Copyright 2018, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package value
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Pointer is an opaque typed pointer and is guaranteed to be comparable.
|
|
||||||
type Pointer struct {
|
|
||||||
p unsafe.Pointer
|
|
||||||
t reflect.Type
|
|
||||||
}
|
|
||||||
|
|
||||||
// PointerOf returns a Pointer from v, which must be a
|
|
||||||
// reflect.Ptr, reflect.Slice, or reflect.Map.
|
|
||||||
func PointerOf(v reflect.Value) Pointer {
|
|
||||||
// The proper representation of a pointer is unsafe.Pointer,
|
|
||||||
// which is necessary if the GC ever uses a moving collector.
|
|
||||||
return Pointer{unsafe.Pointer(v.Pointer()), v.Type()}
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNil reports whether the pointer is nil.
|
|
||||||
func (p Pointer) IsNil() bool {
|
|
||||||
return p.p == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uintptr returns the pointer as a uintptr.
|
|
||||||
func (p Pointer) Uintptr() uintptr {
|
|
||||||
return uintptr(p.p)
|
|
||||||
}
|
|
106
vendor/github.com/google/go-cmp/cmp/internal/value/sort.go
generated
vendored
106
vendor/github.com/google/go-cmp/cmp/internal/value/sort.go
generated
vendored
|
@ -1,106 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package value
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"reflect"
|
|
||||||
"sort"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SortKeys sorts a list of map keys, deduplicating keys if necessary.
|
|
||||||
// The type of each value must be comparable.
|
|
||||||
func SortKeys(vs []reflect.Value) []reflect.Value {
|
|
||||||
if len(vs) == 0 {
|
|
||||||
return vs
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort the map keys.
|
|
||||||
sort.SliceStable(vs, func(i, j int) bool { return isLess(vs[i], vs[j]) })
|
|
||||||
|
|
||||||
// Deduplicate keys (fails for NaNs).
|
|
||||||
vs2 := vs[:1]
|
|
||||||
for _, v := range vs[1:] {
|
|
||||||
if isLess(vs2[len(vs2)-1], v) {
|
|
||||||
vs2 = append(vs2, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return vs2
|
|
||||||
}
|
|
||||||
|
|
||||||
// isLess is a generic function for sorting arbitrary map keys.
|
|
||||||
// The inputs must be of the same type and must be comparable.
|
|
||||||
func isLess(x, y reflect.Value) bool {
|
|
||||||
switch x.Type().Kind() {
|
|
||||||
case reflect.Bool:
|
|
||||||
return !x.Bool() && y.Bool()
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return x.Int() < y.Int()
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
||||||
return x.Uint() < y.Uint()
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
// NOTE: This does not sort -0 as less than +0
|
|
||||||
// since Go maps treat -0 and +0 as equal keys.
|
|
||||||
fx, fy := x.Float(), y.Float()
|
|
||||||
return fx < fy || math.IsNaN(fx) && !math.IsNaN(fy)
|
|
||||||
case reflect.Complex64, reflect.Complex128:
|
|
||||||
cx, cy := x.Complex(), y.Complex()
|
|
||||||
rx, ix, ry, iy := real(cx), imag(cx), real(cy), imag(cy)
|
|
||||||
if rx == ry || (math.IsNaN(rx) && math.IsNaN(ry)) {
|
|
||||||
return ix < iy || math.IsNaN(ix) && !math.IsNaN(iy)
|
|
||||||
}
|
|
||||||
return rx < ry || math.IsNaN(rx) && !math.IsNaN(ry)
|
|
||||||
case reflect.Ptr, reflect.UnsafePointer, reflect.Chan:
|
|
||||||
return x.Pointer() < y.Pointer()
|
|
||||||
case reflect.String:
|
|
||||||
return x.String() < y.String()
|
|
||||||
case reflect.Array:
|
|
||||||
for i := 0; i < x.Len(); i++ {
|
|
||||||
if isLess(x.Index(i), y.Index(i)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if isLess(y.Index(i), x.Index(i)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
case reflect.Struct:
|
|
||||||
for i := 0; i < x.NumField(); i++ {
|
|
||||||
if isLess(x.Field(i), y.Field(i)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if isLess(y.Field(i), x.Field(i)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
case reflect.Interface:
|
|
||||||
vx, vy := x.Elem(), y.Elem()
|
|
||||||
if !vx.IsValid() || !vy.IsValid() {
|
|
||||||
return !vx.IsValid() && vy.IsValid()
|
|
||||||
}
|
|
||||||
tx, ty := vx.Type(), vy.Type()
|
|
||||||
if tx == ty {
|
|
||||||
return isLess(x.Elem(), y.Elem())
|
|
||||||
}
|
|
||||||
if tx.Kind() != ty.Kind() {
|
|
||||||
return vx.Kind() < vy.Kind()
|
|
||||||
}
|
|
||||||
if tx.String() != ty.String() {
|
|
||||||
return tx.String() < ty.String()
|
|
||||||
}
|
|
||||||
if tx.PkgPath() != ty.PkgPath() {
|
|
||||||
return tx.PkgPath() < ty.PkgPath()
|
|
||||||
}
|
|
||||||
// This can happen in rare situations, so we fallback to just comparing
|
|
||||||
// the unique pointer for a reflect.Type. This guarantees deterministic
|
|
||||||
// ordering within a program, but it is obviously not stable.
|
|
||||||
return reflect.ValueOf(vx.Type()).Pointer() < reflect.ValueOf(vy.Type()).Pointer()
|
|
||||||
default:
|
|
||||||
// Must be Func, Map, or Slice; which are not comparable.
|
|
||||||
panic(fmt.Sprintf("%T is not comparable", x.Type()))
|
|
||||||
}
|
|
||||||
}
|
|
554
vendor/github.com/google/go-cmp/cmp/options.go
generated
vendored
554
vendor/github.com/google/go-cmp/cmp/options.go
generated
vendored
|
@ -1,554 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/function"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Option configures for specific behavior of [Equal] and [Diff]. In particular,
|
|
||||||
// the fundamental Option functions ([Ignore], [Transformer], and [Comparer]),
|
|
||||||
// configure how equality is determined.
|
|
||||||
//
|
|
||||||
// The fundamental options may be composed with filters ([FilterPath] and
|
|
||||||
// [FilterValues]) to control the scope over which they are applied.
|
|
||||||
//
|
|
||||||
// The [github.com/google/go-cmp/cmp/cmpopts] package provides helper functions
|
|
||||||
// for creating options that may be used with [Equal] and [Diff].
|
|
||||||
type Option interface {
|
|
||||||
// filter applies all filters and returns the option that remains.
|
|
||||||
// Each option may only read s.curPath and call s.callTTBFunc.
|
|
||||||
//
|
|
||||||
// An Options is returned only if multiple comparers or transformers
|
|
||||||
// can apply simultaneously and will only contain values of those types
|
|
||||||
// or sub-Options containing values of those types.
|
|
||||||
filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption
|
|
||||||
}
|
|
||||||
|
|
||||||
// applicableOption represents the following types:
|
|
||||||
//
|
|
||||||
// Fundamental: ignore | validator | *comparer | *transformer
|
|
||||||
// Grouping: Options
|
|
||||||
type applicableOption interface {
|
|
||||||
Option
|
|
||||||
|
|
||||||
// apply executes the option, which may mutate s or panic.
|
|
||||||
apply(s *state, vx, vy reflect.Value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// coreOption represents the following types:
|
|
||||||
//
|
|
||||||
// Fundamental: ignore | validator | *comparer | *transformer
|
|
||||||
// Filters: *pathFilter | *valuesFilter
|
|
||||||
type coreOption interface {
|
|
||||||
Option
|
|
||||||
isCore()
|
|
||||||
}
|
|
||||||
|
|
||||||
type core struct{}
|
|
||||||
|
|
||||||
func (core) isCore() {}
|
|
||||||
|
|
||||||
// Options is a list of [Option] values that also satisfies the [Option] interface.
|
|
||||||
// Helper comparison packages may return an Options value when packing multiple
|
|
||||||
// [Option] values into a single [Option]. When this package processes an Options,
|
|
||||||
// it will be implicitly expanded into a flat list.
|
|
||||||
//
|
|
||||||
// Applying a filter on an Options is equivalent to applying that same filter
|
|
||||||
// on all individual options held within.
|
|
||||||
type Options []Option
|
|
||||||
|
|
||||||
func (opts Options) filter(s *state, t reflect.Type, vx, vy reflect.Value) (out applicableOption) {
|
|
||||||
for _, opt := range opts {
|
|
||||||
switch opt := opt.filter(s, t, vx, vy); opt.(type) {
|
|
||||||
case ignore:
|
|
||||||
return ignore{} // Only ignore can short-circuit evaluation
|
|
||||||
case validator:
|
|
||||||
out = validator{} // Takes precedence over comparer or transformer
|
|
||||||
case *comparer, *transformer, Options:
|
|
||||||
switch out.(type) {
|
|
||||||
case nil:
|
|
||||||
out = opt
|
|
||||||
case validator:
|
|
||||||
// Keep validator
|
|
||||||
case *comparer, *transformer, Options:
|
|
||||||
out = Options{out, opt} // Conflicting comparers or transformers
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
func (opts Options) apply(s *state, _, _ reflect.Value) {
|
|
||||||
const warning = "ambiguous set of applicable options"
|
|
||||||
const help = "consider using filters to ensure at most one Comparer or Transformer may apply"
|
|
||||||
var ss []string
|
|
||||||
for _, opt := range flattenOptions(nil, opts) {
|
|
||||||
ss = append(ss, fmt.Sprint(opt))
|
|
||||||
}
|
|
||||||
set := strings.Join(ss, "\n\t")
|
|
||||||
panic(fmt.Sprintf("%s at %#v:\n\t%s\n%s", warning, s.curPath, set, help))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (opts Options) String() string {
|
|
||||||
var ss []string
|
|
||||||
for _, opt := range opts {
|
|
||||||
ss = append(ss, fmt.Sprint(opt))
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("Options{%s}", strings.Join(ss, ", "))
|
|
||||||
}
|
|
||||||
|
|
||||||
// FilterPath returns a new [Option] where opt is only evaluated if filter f
|
|
||||||
// returns true for the current [Path] in the value tree.
|
|
||||||
//
|
|
||||||
// This filter is called even if a slice element or map entry is missing and
|
|
||||||
// provides an opportunity to ignore such cases. The filter function must be
|
|
||||||
// symmetric such that the filter result is identical regardless of whether the
|
|
||||||
// missing value is from x or y.
|
|
||||||
//
|
|
||||||
// The option passed in may be an [Ignore], [Transformer], [Comparer], [Options], or
|
|
||||||
// a previously filtered [Option].
|
|
||||||
func FilterPath(f func(Path) bool, opt Option) Option {
|
|
||||||
if f == nil {
|
|
||||||
panic("invalid path filter function")
|
|
||||||
}
|
|
||||||
if opt := normalizeOption(opt); opt != nil {
|
|
||||||
return &pathFilter{fnc: f, opt: opt}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type pathFilter struct {
|
|
||||||
core
|
|
||||||
fnc func(Path) bool
|
|
||||||
opt Option
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f pathFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption {
|
|
||||||
if f.fnc(s.curPath) {
|
|
||||||
return f.opt.filter(s, t, vx, vy)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f pathFilter) String() string {
|
|
||||||
return fmt.Sprintf("FilterPath(%s, %v)", function.NameOf(reflect.ValueOf(f.fnc)), f.opt)
|
|
||||||
}
|
|
||||||
|
|
||||||
// FilterValues returns a new [Option] where opt is only evaluated if filter f,
|
|
||||||
// which is a function of the form "func(T, T) bool", returns true for the
|
|
||||||
// current pair of values being compared. If either value is invalid or
|
|
||||||
// the type of the values is not assignable to T, then this filter implicitly
|
|
||||||
// returns false.
|
|
||||||
//
|
|
||||||
// The filter function must be
|
|
||||||
// symmetric (i.e., agnostic to the order of the inputs) and
|
|
||||||
// deterministic (i.e., produces the same result when given the same inputs).
|
|
||||||
// If T is an interface, it is possible that f is called with two values with
|
|
||||||
// different concrete types that both implement T.
|
|
||||||
//
|
|
||||||
// The option passed in may be an [Ignore], [Transformer], [Comparer], [Options], or
|
|
||||||
// a previously filtered [Option].
|
|
||||||
func FilterValues(f interface{}, opt Option) Option {
|
|
||||||
v := reflect.ValueOf(f)
|
|
||||||
if !function.IsType(v.Type(), function.ValueFilter) || v.IsNil() {
|
|
||||||
panic(fmt.Sprintf("invalid values filter function: %T", f))
|
|
||||||
}
|
|
||||||
if opt := normalizeOption(opt); opt != nil {
|
|
||||||
vf := &valuesFilter{fnc: v, opt: opt}
|
|
||||||
if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 {
|
|
||||||
vf.typ = ti
|
|
||||||
}
|
|
||||||
return vf
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type valuesFilter struct {
|
|
||||||
core
|
|
||||||
typ reflect.Type // T
|
|
||||||
fnc reflect.Value // func(T, T) bool
|
|
||||||
opt Option
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f valuesFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption {
|
|
||||||
if !vx.IsValid() || !vx.CanInterface() || !vy.IsValid() || !vy.CanInterface() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if (f.typ == nil || t.AssignableTo(f.typ)) && s.callTTBFunc(f.fnc, vx, vy) {
|
|
||||||
return f.opt.filter(s, t, vx, vy)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f valuesFilter) String() string {
|
|
||||||
return fmt.Sprintf("FilterValues(%s, %v)", function.NameOf(f.fnc), f.opt)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore is an [Option] that causes all comparisons to be ignored.
|
|
||||||
// This value is intended to be combined with [FilterPath] or [FilterValues].
|
|
||||||
// It is an error to pass an unfiltered Ignore option to [Equal].
|
|
||||||
func Ignore() Option { return ignore{} }
|
|
||||||
|
|
||||||
type ignore struct{ core }
|
|
||||||
|
|
||||||
func (ignore) isFiltered() bool { return false }
|
|
||||||
func (ignore) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { return ignore{} }
|
|
||||||
func (ignore) apply(s *state, _, _ reflect.Value) { s.report(true, reportByIgnore) }
|
|
||||||
func (ignore) String() string { return "Ignore()" }
|
|
||||||
|
|
||||||
// validator is a sentinel Option type to indicate that some options could not
|
|
||||||
// be evaluated due to unexported fields, missing slice elements, or
|
|
||||||
// missing map entries. Both values are validator only for unexported fields.
|
|
||||||
type validator struct{ core }
|
|
||||||
|
|
||||||
func (validator) filter(_ *state, _ reflect.Type, vx, vy reflect.Value) applicableOption {
|
|
||||||
if !vx.IsValid() || !vy.IsValid() {
|
|
||||||
return validator{}
|
|
||||||
}
|
|
||||||
if !vx.CanInterface() || !vy.CanInterface() {
|
|
||||||
return validator{}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func (validator) apply(s *state, vx, vy reflect.Value) {
|
|
||||||
// Implies missing slice element or map entry.
|
|
||||||
if !vx.IsValid() || !vy.IsValid() {
|
|
||||||
s.report(vx.IsValid() == vy.IsValid(), 0)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unable to Interface implies unexported field without visibility access.
|
|
||||||
if !vx.CanInterface() || !vy.CanInterface() {
|
|
||||||
help := "consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported"
|
|
||||||
var name string
|
|
||||||
if t := s.curPath.Index(-2).Type(); t.Name() != "" {
|
|
||||||
// Named type with unexported fields.
|
|
||||||
name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType
|
|
||||||
if _, ok := reflect.New(t).Interface().(error); ok {
|
|
||||||
help = "consider using cmpopts.EquateErrors to compare error values"
|
|
||||||
} else if t.Comparable() {
|
|
||||||
help = "consider using cmpopts.EquateComparable to compare comparable Go types"
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Unnamed type with unexported fields. Derive PkgPath from field.
|
|
||||||
var pkgPath string
|
|
||||||
for i := 0; i < t.NumField() && pkgPath == ""; i++ {
|
|
||||||
pkgPath = t.Field(i).PkgPath
|
|
||||||
}
|
|
||||||
name = fmt.Sprintf("%q.(%v)", pkgPath, t.String()) // e.g., "path/to/package".(struct { a int })
|
|
||||||
}
|
|
||||||
panic(fmt.Sprintf("cannot handle unexported field at %#v:\n\t%v\n%s", s.curPath, name, help))
|
|
||||||
}
|
|
||||||
|
|
||||||
panic("not reachable")
|
|
||||||
}
|
|
||||||
|
|
||||||
// identRx represents a valid identifier according to the Go specification.
|
|
||||||
const identRx = `[_\p{L}][_\p{L}\p{N}]*`
|
|
||||||
|
|
||||||
var identsRx = regexp.MustCompile(`^` + identRx + `(\.` + identRx + `)*$`)
|
|
||||||
|
|
||||||
// Transformer returns an [Option] that applies a transformation function that
|
|
||||||
// converts values of a certain type into that of another.
|
|
||||||
//
|
|
||||||
// The transformer f must be a function "func(T) R" that converts values of
|
|
||||||
// type T to those of type R and is implicitly filtered to input values
|
|
||||||
// assignable to T. The transformer must not mutate T in any way.
|
|
||||||
//
|
|
||||||
// To help prevent some cases of infinite recursive cycles applying the
|
|
||||||
// same transform to the output of itself (e.g., in the case where the
|
|
||||||
// input and output types are the same), an implicit filter is added such that
|
|
||||||
// a transformer is applicable only if that exact transformer is not already
|
|
||||||
// in the tail of the [Path] since the last non-[Transform] step.
|
|
||||||
// For situations where the implicit filter is still insufficient,
|
|
||||||
// consider using [github.com/google/go-cmp/cmp/cmpopts.AcyclicTransformer],
|
|
||||||
// which adds a filter to prevent the transformer from
|
|
||||||
// being recursively applied upon itself.
|
|
||||||
//
|
|
||||||
// The name is a user provided label that is used as the [Transform.Name] in the
|
|
||||||
// transformation [PathStep] (and eventually shown in the [Diff] output).
|
|
||||||
// The name must be a valid identifier or qualified identifier in Go syntax.
|
|
||||||
// If empty, an arbitrary name is used.
|
|
||||||
func Transformer(name string, f interface{}) Option {
|
|
||||||
v := reflect.ValueOf(f)
|
|
||||||
if !function.IsType(v.Type(), function.Transformer) || v.IsNil() {
|
|
||||||
panic(fmt.Sprintf("invalid transformer function: %T", f))
|
|
||||||
}
|
|
||||||
if name == "" {
|
|
||||||
name = function.NameOf(v)
|
|
||||||
if !identsRx.MatchString(name) {
|
|
||||||
name = "λ" // Lambda-symbol as placeholder name
|
|
||||||
}
|
|
||||||
} else if !identsRx.MatchString(name) {
|
|
||||||
panic(fmt.Sprintf("invalid name: %q", name))
|
|
||||||
}
|
|
||||||
tr := &transformer{name: name, fnc: reflect.ValueOf(f)}
|
|
||||||
if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 {
|
|
||||||
tr.typ = ti
|
|
||||||
}
|
|
||||||
return tr
|
|
||||||
}
|
|
||||||
|
|
||||||
type transformer struct {
|
|
||||||
core
|
|
||||||
name string
|
|
||||||
typ reflect.Type // T
|
|
||||||
fnc reflect.Value // func(T) R
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tr *transformer) isFiltered() bool { return tr.typ != nil }
|
|
||||||
|
|
||||||
func (tr *transformer) filter(s *state, t reflect.Type, _, _ reflect.Value) applicableOption {
|
|
||||||
for i := len(s.curPath) - 1; i >= 0; i-- {
|
|
||||||
if t, ok := s.curPath[i].(Transform); !ok {
|
|
||||||
break // Hit most recent non-Transform step
|
|
||||||
} else if tr == t.trans {
|
|
||||||
return nil // Cannot directly use same Transform
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if tr.typ == nil || t.AssignableTo(tr.typ) {
|
|
||||||
return tr
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tr *transformer) apply(s *state, vx, vy reflect.Value) {
|
|
||||||
step := Transform{&transform{pathStep{typ: tr.fnc.Type().Out(0)}, tr}}
|
|
||||||
vvx := s.callTRFunc(tr.fnc, vx, step)
|
|
||||||
vvy := s.callTRFunc(tr.fnc, vy, step)
|
|
||||||
step.vx, step.vy = vvx, vvy
|
|
||||||
s.compareAny(step)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tr transformer) String() string {
|
|
||||||
return fmt.Sprintf("Transformer(%s, %s)", tr.name, function.NameOf(tr.fnc))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Comparer returns an [Option] that determines whether two values are equal
|
|
||||||
// to each other.
|
|
||||||
//
|
|
||||||
// The comparer f must be a function "func(T, T) bool" and is implicitly
|
|
||||||
// filtered to input values assignable to T. If T is an interface, it is
|
|
||||||
// possible that f is called with two values of different concrete types that
|
|
||||||
// both implement T.
|
|
||||||
//
|
|
||||||
// The equality function must be:
|
|
||||||
// - Symmetric: equal(x, y) == equal(y, x)
|
|
||||||
// - Deterministic: equal(x, y) == equal(x, y)
|
|
||||||
// - Pure: equal(x, y) does not modify x or y
|
|
||||||
func Comparer(f interface{}) Option {
|
|
||||||
v := reflect.ValueOf(f)
|
|
||||||
if !function.IsType(v.Type(), function.Equal) || v.IsNil() {
|
|
||||||
panic(fmt.Sprintf("invalid comparer function: %T", f))
|
|
||||||
}
|
|
||||||
cm := &comparer{fnc: v}
|
|
||||||
if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 {
|
|
||||||
cm.typ = ti
|
|
||||||
}
|
|
||||||
return cm
|
|
||||||
}
|
|
||||||
|
|
||||||
type comparer struct {
|
|
||||||
core
|
|
||||||
typ reflect.Type // T
|
|
||||||
fnc reflect.Value // func(T, T) bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cm *comparer) isFiltered() bool { return cm.typ != nil }
|
|
||||||
|
|
||||||
func (cm *comparer) filter(_ *state, t reflect.Type, _, _ reflect.Value) applicableOption {
|
|
||||||
if cm.typ == nil || t.AssignableTo(cm.typ) {
|
|
||||||
return cm
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cm *comparer) apply(s *state, vx, vy reflect.Value) {
|
|
||||||
eq := s.callTTBFunc(cm.fnc, vx, vy)
|
|
||||||
s.report(eq, reportByFunc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cm comparer) String() string {
|
|
||||||
return fmt.Sprintf("Comparer(%s)", function.NameOf(cm.fnc))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exporter returns an [Option] that specifies whether [Equal] is allowed to
|
|
||||||
// introspect into the unexported fields of certain struct types.
|
|
||||||
//
|
|
||||||
// Users of this option must understand that comparing on unexported fields
|
|
||||||
// from external packages is not safe since changes in the internal
|
|
||||||
// implementation of some external package may cause the result of [Equal]
|
|
||||||
// to unexpectedly change. However, it may be valid to use this option on types
|
|
||||||
// defined in an internal package where the semantic meaning of an unexported
|
|
||||||
// field is in the control of the user.
|
|
||||||
//
|
|
||||||
// In many cases, a custom [Comparer] should be used instead that defines
|
|
||||||
// equality as a function of the public API of a type rather than the underlying
|
|
||||||
// unexported implementation.
|
|
||||||
//
|
|
||||||
// For example, the [reflect.Type] documentation defines equality to be determined
|
|
||||||
// by the == operator on the interface (essentially performing a shallow pointer
|
|
||||||
// comparison) and most attempts to compare *[regexp.Regexp] types are interested
|
|
||||||
// in only checking that the regular expression strings are equal.
|
|
||||||
// Both of these are accomplished using [Comparer] options:
|
|
||||||
//
|
|
||||||
// Comparer(func(x, y reflect.Type) bool { return x == y })
|
|
||||||
// Comparer(func(x, y *regexp.Regexp) bool { return x.String() == y.String() })
|
|
||||||
//
|
|
||||||
// In other cases, the [github.com/google/go-cmp/cmp/cmpopts.IgnoreUnexported]
|
|
||||||
// option can be used to ignore all unexported fields on specified struct types.
|
|
||||||
func Exporter(f func(reflect.Type) bool) Option {
|
|
||||||
return exporter(f)
|
|
||||||
}
|
|
||||||
|
|
||||||
type exporter func(reflect.Type) bool
|
|
||||||
|
|
||||||
func (exporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
// AllowUnexported returns an [Option] that allows [Equal] to forcibly introspect
|
|
||||||
// unexported fields of the specified struct types.
|
|
||||||
//
|
|
||||||
// See [Exporter] for the proper use of this option.
|
|
||||||
func AllowUnexported(types ...interface{}) Option {
|
|
||||||
m := make(map[reflect.Type]bool)
|
|
||||||
for _, typ := range types {
|
|
||||||
t := reflect.TypeOf(typ)
|
|
||||||
if t.Kind() != reflect.Struct {
|
|
||||||
panic(fmt.Sprintf("invalid struct type: %T", typ))
|
|
||||||
}
|
|
||||||
m[t] = true
|
|
||||||
}
|
|
||||||
return exporter(func(t reflect.Type) bool { return m[t] })
|
|
||||||
}
|
|
||||||
|
|
||||||
// Result represents the comparison result for a single node and
|
|
||||||
// is provided by cmp when calling Report (see [Reporter]).
|
|
||||||
type Result struct {
|
|
||||||
_ [0]func() // Make Result incomparable
|
|
||||||
flags resultFlags
|
|
||||||
}
|
|
||||||
|
|
||||||
// Equal reports whether the node was determined to be equal or not.
|
|
||||||
// As a special case, ignored nodes are considered equal.
|
|
||||||
func (r Result) Equal() bool {
|
|
||||||
return r.flags&(reportEqual|reportByIgnore) != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// ByIgnore reports whether the node is equal because it was ignored.
|
|
||||||
// This never reports true if [Result.Equal] reports false.
|
|
||||||
func (r Result) ByIgnore() bool {
|
|
||||||
return r.flags&reportByIgnore != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// ByMethod reports whether the Equal method determined equality.
|
|
||||||
func (r Result) ByMethod() bool {
|
|
||||||
return r.flags&reportByMethod != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// ByFunc reports whether a [Comparer] function determined equality.
|
|
||||||
func (r Result) ByFunc() bool {
|
|
||||||
return r.flags&reportByFunc != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// ByCycle reports whether a reference cycle was detected.
|
|
||||||
func (r Result) ByCycle() bool {
|
|
||||||
return r.flags&reportByCycle != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type resultFlags uint
|
|
||||||
|
|
||||||
const (
|
|
||||||
_ resultFlags = (1 << iota) / 2
|
|
||||||
|
|
||||||
reportEqual
|
|
||||||
reportUnequal
|
|
||||||
reportByIgnore
|
|
||||||
reportByMethod
|
|
||||||
reportByFunc
|
|
||||||
reportByCycle
|
|
||||||
)
|
|
||||||
|
|
||||||
// Reporter is an [Option] that can be passed to [Equal]. When [Equal] traverses
|
|
||||||
// the value trees, it calls PushStep as it descends into each node in the
|
|
||||||
// tree and PopStep as it ascend out of the node. The leaves of the tree are
|
|
||||||
// either compared (determined to be equal or not equal) or ignored and reported
|
|
||||||
// as such by calling the Report method.
|
|
||||||
func Reporter(r interface {
|
|
||||||
// PushStep is called when a tree-traversal operation is performed.
|
|
||||||
// The PathStep itself is only valid until the step is popped.
|
|
||||||
// The PathStep.Values are valid for the duration of the entire traversal
|
|
||||||
// and must not be mutated.
|
|
||||||
//
|
|
||||||
// Equal always calls PushStep at the start to provide an operation-less
|
|
||||||
// PathStep used to report the root values.
|
|
||||||
//
|
|
||||||
// Within a slice, the exact set of inserted, removed, or modified elements
|
|
||||||
// is unspecified and may change in future implementations.
|
|
||||||
// The entries of a map are iterated through in an unspecified order.
|
|
||||||
PushStep(PathStep)
|
|
||||||
|
|
||||||
// Report is called exactly once on leaf nodes to report whether the
|
|
||||||
// comparison identified the node as equal, unequal, or ignored.
|
|
||||||
// A leaf node is one that is immediately preceded by and followed by
|
|
||||||
// a pair of PushStep and PopStep calls.
|
|
||||||
Report(Result)
|
|
||||||
|
|
||||||
// PopStep ascends back up the value tree.
|
|
||||||
// There is always a matching pop call for every push call.
|
|
||||||
PopStep()
|
|
||||||
}) Option {
|
|
||||||
return reporter{r}
|
|
||||||
}
|
|
||||||
|
|
||||||
type reporter struct{ reporterIface }
|
|
||||||
type reporterIface interface {
|
|
||||||
PushStep(PathStep)
|
|
||||||
Report(Result)
|
|
||||||
PopStep()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (reporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption {
|
|
||||||
panic("not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
// normalizeOption normalizes the input options such that all Options groups
|
|
||||||
// are flattened and groups with a single element are reduced to that element.
|
|
||||||
// Only coreOptions and Options containing coreOptions are allowed.
|
|
||||||
func normalizeOption(src Option) Option {
|
|
||||||
switch opts := flattenOptions(nil, Options{src}); len(opts) {
|
|
||||||
case 0:
|
|
||||||
return nil
|
|
||||||
case 1:
|
|
||||||
return opts[0]
|
|
||||||
default:
|
|
||||||
return opts
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// flattenOptions copies all options in src to dst as a flat list.
|
|
||||||
// Only coreOptions and Options containing coreOptions are allowed.
|
|
||||||
func flattenOptions(dst, src Options) Options {
|
|
||||||
for _, opt := range src {
|
|
||||||
switch opt := opt.(type) {
|
|
||||||
case nil:
|
|
||||||
continue
|
|
||||||
case Options:
|
|
||||||
dst = flattenOptions(dst, opt)
|
|
||||||
case coreOption:
|
|
||||||
dst = append(dst, opt)
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("invalid option type: %T", opt))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dst
|
|
||||||
}
|
|
390
vendor/github.com/google/go-cmp/cmp/path.go
generated
vendored
390
vendor/github.com/google/go-cmp/cmp/path.go
generated
vendored
|
@ -1,390 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/value"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Path is a list of [PathStep] describing the sequence of operations to get
|
|
||||||
// from some root type to the current position in the value tree.
|
|
||||||
// The first Path element is always an operation-less [PathStep] that exists
|
|
||||||
// simply to identify the initial type.
|
|
||||||
//
|
|
||||||
// When traversing structs with embedded structs, the embedded struct will
|
|
||||||
// always be accessed as a field before traversing the fields of the
|
|
||||||
// embedded struct themselves. That is, an exported field from the
|
|
||||||
// embedded struct will never be accessed directly from the parent struct.
|
|
||||||
type Path []PathStep
|
|
||||||
|
|
||||||
// PathStep is a union-type for specific operations to traverse
|
|
||||||
// a value's tree structure. Users of this package never need to implement
|
|
||||||
// these types as values of this type will be returned by this package.
|
|
||||||
//
|
|
||||||
// Implementations of this interface:
|
|
||||||
// - [StructField]
|
|
||||||
// - [SliceIndex]
|
|
||||||
// - [MapIndex]
|
|
||||||
// - [Indirect]
|
|
||||||
// - [TypeAssertion]
|
|
||||||
// - [Transform]
|
|
||||||
type PathStep interface {
|
|
||||||
String() string
|
|
||||||
|
|
||||||
// Type is the resulting type after performing the path step.
|
|
||||||
Type() reflect.Type
|
|
||||||
|
|
||||||
// Values is the resulting values after performing the path step.
|
|
||||||
// The type of each valid value is guaranteed to be identical to Type.
|
|
||||||
//
|
|
||||||
// In some cases, one or both may be invalid or have restrictions:
|
|
||||||
// - For StructField, both are not interface-able if the current field
|
|
||||||
// is unexported and the struct type is not explicitly permitted by
|
|
||||||
// an Exporter to traverse unexported fields.
|
|
||||||
// - For SliceIndex, one may be invalid if an element is missing from
|
|
||||||
// either the x or y slice.
|
|
||||||
// - For MapIndex, one may be invalid if an entry is missing from
|
|
||||||
// either the x or y map.
|
|
||||||
//
|
|
||||||
// The provided values must not be mutated.
|
|
||||||
Values() (vx, vy reflect.Value)
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
_ PathStep = StructField{}
|
|
||||||
_ PathStep = SliceIndex{}
|
|
||||||
_ PathStep = MapIndex{}
|
|
||||||
_ PathStep = Indirect{}
|
|
||||||
_ PathStep = TypeAssertion{}
|
|
||||||
_ PathStep = Transform{}
|
|
||||||
)
|
|
||||||
|
|
||||||
func (pa *Path) push(s PathStep) {
|
|
||||||
*pa = append(*pa, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (pa *Path) pop() {
|
|
||||||
*pa = (*pa)[:len(*pa)-1]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last returns the last [PathStep] in the Path.
|
|
||||||
// If the path is empty, this returns a non-nil [PathStep]
|
|
||||||
// that reports a nil [PathStep.Type].
|
|
||||||
func (pa Path) Last() PathStep {
|
|
||||||
return pa.Index(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the ith step in the Path and supports negative indexing.
|
|
||||||
// A negative index starts counting from the tail of the Path such that -1
|
|
||||||
// refers to the last step, -2 refers to the second-to-last step, and so on.
|
|
||||||
// If index is invalid, this returns a non-nil [PathStep]
|
|
||||||
// that reports a nil [PathStep.Type].
|
|
||||||
func (pa Path) Index(i int) PathStep {
|
|
||||||
if i < 0 {
|
|
||||||
i = len(pa) + i
|
|
||||||
}
|
|
||||||
if i < 0 || i >= len(pa) {
|
|
||||||
return pathStep{}
|
|
||||||
}
|
|
||||||
return pa[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns the simplified path to a node.
|
|
||||||
// The simplified path only contains struct field accesses.
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// MyMap.MySlices.MyField
|
|
||||||
func (pa Path) String() string {
|
|
||||||
var ss []string
|
|
||||||
for _, s := range pa {
|
|
||||||
if _, ok := s.(StructField); ok {
|
|
||||||
ss = append(ss, s.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return strings.TrimPrefix(strings.Join(ss, ""), ".")
|
|
||||||
}
|
|
||||||
|
|
||||||
// GoString returns the path to a specific node using Go syntax.
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// (*root.MyMap["key"].(*mypkg.MyStruct).MySlices)[2][3].MyField
|
|
||||||
func (pa Path) GoString() string {
|
|
||||||
var ssPre, ssPost []string
|
|
||||||
var numIndirect int
|
|
||||||
for i, s := range pa {
|
|
||||||
var nextStep PathStep
|
|
||||||
if i+1 < len(pa) {
|
|
||||||
nextStep = pa[i+1]
|
|
||||||
}
|
|
||||||
switch s := s.(type) {
|
|
||||||
case Indirect:
|
|
||||||
numIndirect++
|
|
||||||
pPre, pPost := "(", ")"
|
|
||||||
switch nextStep.(type) {
|
|
||||||
case Indirect:
|
|
||||||
continue // Next step is indirection, so let them batch up
|
|
||||||
case StructField:
|
|
||||||
numIndirect-- // Automatic indirection on struct fields
|
|
||||||
case nil:
|
|
||||||
pPre, pPost = "", "" // Last step; no need for parenthesis
|
|
||||||
}
|
|
||||||
if numIndirect > 0 {
|
|
||||||
ssPre = append(ssPre, pPre+strings.Repeat("*", numIndirect))
|
|
||||||
ssPost = append(ssPost, pPost)
|
|
||||||
}
|
|
||||||
numIndirect = 0
|
|
||||||
continue
|
|
||||||
case Transform:
|
|
||||||
ssPre = append(ssPre, s.trans.name+"(")
|
|
||||||
ssPost = append(ssPost, ")")
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ssPost = append(ssPost, s.String())
|
|
||||||
}
|
|
||||||
for i, j := 0, len(ssPre)-1; i < j; i, j = i+1, j-1 {
|
|
||||||
ssPre[i], ssPre[j] = ssPre[j], ssPre[i]
|
|
||||||
}
|
|
||||||
return strings.Join(ssPre, "") + strings.Join(ssPost, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
type pathStep struct {
|
|
||||||
typ reflect.Type
|
|
||||||
vx, vy reflect.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ps pathStep) Type() reflect.Type { return ps.typ }
|
|
||||||
func (ps pathStep) Values() (vx, vy reflect.Value) { return ps.vx, ps.vy }
|
|
||||||
func (ps pathStep) String() string {
|
|
||||||
if ps.typ == nil {
|
|
||||||
return "<nil>"
|
|
||||||
}
|
|
||||||
s := value.TypeString(ps.typ, false)
|
|
||||||
if s == "" || strings.ContainsAny(s, "{}\n") {
|
|
||||||
return "root" // Type too simple or complex to print
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("{%s}", s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StructField is a [PathStep] that represents a struct field access
|
|
||||||
// on a field called [StructField.Name].
|
|
||||||
type StructField struct{ *structField }
|
|
||||||
type structField struct {
|
|
||||||
pathStep
|
|
||||||
name string
|
|
||||||
idx int
|
|
||||||
|
|
||||||
// These fields are used for forcibly accessing an unexported field.
|
|
||||||
// pvx, pvy, and field are only valid if unexported is true.
|
|
||||||
unexported bool
|
|
||||||
mayForce bool // Forcibly allow visibility
|
|
||||||
paddr bool // Was parent addressable?
|
|
||||||
pvx, pvy reflect.Value // Parent values (always addressable)
|
|
||||||
field reflect.StructField // Field information
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sf StructField) Type() reflect.Type { return sf.typ }
|
|
||||||
func (sf StructField) Values() (vx, vy reflect.Value) {
|
|
||||||
if !sf.unexported {
|
|
||||||
return sf.vx, sf.vy // CanInterface reports true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forcibly obtain read-write access to an unexported struct field.
|
|
||||||
if sf.mayForce {
|
|
||||||
vx = retrieveUnexportedField(sf.pvx, sf.field, sf.paddr)
|
|
||||||
vy = retrieveUnexportedField(sf.pvy, sf.field, sf.paddr)
|
|
||||||
return vx, vy // CanInterface reports true
|
|
||||||
}
|
|
||||||
return sf.vx, sf.vy // CanInterface reports false
|
|
||||||
}
|
|
||||||
func (sf StructField) String() string { return fmt.Sprintf(".%s", sf.name) }
|
|
||||||
|
|
||||||
// Name is the field name.
|
|
||||||
func (sf StructField) Name() string { return sf.name }
|
|
||||||
|
|
||||||
// Index is the index of the field in the parent struct type.
|
|
||||||
// See [reflect.Type.Field].
|
|
||||||
func (sf StructField) Index() int { return sf.idx }
|
|
||||||
|
|
||||||
// SliceIndex is a [PathStep] that represents an index operation on
|
|
||||||
// a slice or array at some index [SliceIndex.Key].
|
|
||||||
type SliceIndex struct{ *sliceIndex }
|
|
||||||
type sliceIndex struct {
|
|
||||||
pathStep
|
|
||||||
xkey, ykey int
|
|
||||||
isSlice bool // False for reflect.Array
|
|
||||||
}
|
|
||||||
|
|
||||||
func (si SliceIndex) Type() reflect.Type { return si.typ }
|
|
||||||
func (si SliceIndex) Values() (vx, vy reflect.Value) { return si.vx, si.vy }
|
|
||||||
func (si SliceIndex) String() string {
|
|
||||||
switch {
|
|
||||||
case si.xkey == si.ykey:
|
|
||||||
return fmt.Sprintf("[%d]", si.xkey)
|
|
||||||
case si.ykey == -1:
|
|
||||||
// [5->?] means "I don't know where X[5] went"
|
|
||||||
return fmt.Sprintf("[%d->?]", si.xkey)
|
|
||||||
case si.xkey == -1:
|
|
||||||
// [?->3] means "I don't know where Y[3] came from"
|
|
||||||
return fmt.Sprintf("[?->%d]", si.ykey)
|
|
||||||
default:
|
|
||||||
// [5->3] means "X[5] moved to Y[3]"
|
|
||||||
return fmt.Sprintf("[%d->%d]", si.xkey, si.ykey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Key is the index key; it may return -1 if in a split state
|
|
||||||
func (si SliceIndex) Key() int {
|
|
||||||
if si.xkey != si.ykey {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
return si.xkey
|
|
||||||
}
|
|
||||||
|
|
||||||
// SplitKeys are the indexes for indexing into slices in the
|
|
||||||
// x and y values, respectively. These indexes may differ due to the
|
|
||||||
// insertion or removal of an element in one of the slices, causing
|
|
||||||
// all of the indexes to be shifted. If an index is -1, then that
|
|
||||||
// indicates that the element does not exist in the associated slice.
|
|
||||||
//
|
|
||||||
// [SliceIndex.Key] is guaranteed to return -1 if and only if the indexes
|
|
||||||
// returned by SplitKeys are not the same. SplitKeys will never return -1 for
|
|
||||||
// both indexes.
|
|
||||||
func (si SliceIndex) SplitKeys() (ix, iy int) { return si.xkey, si.ykey }
|
|
||||||
|
|
||||||
// MapIndex is a [PathStep] that represents an index operation on a map at some index Key.
|
|
||||||
type MapIndex struct{ *mapIndex }
|
|
||||||
type mapIndex struct {
|
|
||||||
pathStep
|
|
||||||
key reflect.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
func (mi MapIndex) Type() reflect.Type { return mi.typ }
|
|
||||||
func (mi MapIndex) Values() (vx, vy reflect.Value) { return mi.vx, mi.vy }
|
|
||||||
func (mi MapIndex) String() string { return fmt.Sprintf("[%#v]", mi.key) }
|
|
||||||
|
|
||||||
// Key is the value of the map key.
|
|
||||||
func (mi MapIndex) Key() reflect.Value { return mi.key }
|
|
||||||
|
|
||||||
// Indirect is a [PathStep] that represents pointer indirection on the parent type.
|
|
||||||
type Indirect struct{ *indirect }
|
|
||||||
type indirect struct {
|
|
||||||
pathStep
|
|
||||||
}
|
|
||||||
|
|
||||||
func (in Indirect) Type() reflect.Type { return in.typ }
|
|
||||||
func (in Indirect) Values() (vx, vy reflect.Value) { return in.vx, in.vy }
|
|
||||||
func (in Indirect) String() string { return "*" }
|
|
||||||
|
|
||||||
// TypeAssertion is a [PathStep] that represents a type assertion on an interface.
|
|
||||||
type TypeAssertion struct{ *typeAssertion }
|
|
||||||
type typeAssertion struct {
|
|
||||||
pathStep
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ta TypeAssertion) Type() reflect.Type { return ta.typ }
|
|
||||||
func (ta TypeAssertion) Values() (vx, vy reflect.Value) { return ta.vx, ta.vy }
|
|
||||||
func (ta TypeAssertion) String() string { return fmt.Sprintf(".(%v)", value.TypeString(ta.typ, false)) }
|
|
||||||
|
|
||||||
// Transform is a [PathStep] that represents a transformation
|
|
||||||
// from the parent type to the current type.
|
|
||||||
type Transform struct{ *transform }
|
|
||||||
type transform struct {
|
|
||||||
pathStep
|
|
||||||
trans *transformer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tf Transform) Type() reflect.Type { return tf.typ }
|
|
||||||
func (tf Transform) Values() (vx, vy reflect.Value) { return tf.vx, tf.vy }
|
|
||||||
func (tf Transform) String() string { return fmt.Sprintf("%s()", tf.trans.name) }
|
|
||||||
|
|
||||||
// Name is the name of the [Transformer].
|
|
||||||
func (tf Transform) Name() string { return tf.trans.name }
|
|
||||||
|
|
||||||
// Func is the function pointer to the transformer function.
|
|
||||||
func (tf Transform) Func() reflect.Value { return tf.trans.fnc }
|
|
||||||
|
|
||||||
// Option returns the originally constructed [Transformer] option.
|
|
||||||
// The == operator can be used to detect the exact option used.
|
|
||||||
func (tf Transform) Option() Option { return tf.trans }
|
|
||||||
|
|
||||||
// pointerPath represents a dual-stack of pointers encountered when
|
|
||||||
// recursively traversing the x and y values. This data structure supports
|
|
||||||
// detection of cycles and determining whether the cycles are equal.
|
|
||||||
// In Go, cycles can occur via pointers, slices, and maps.
|
|
||||||
//
|
|
||||||
// The pointerPath uses a map to represent a stack; where descension into a
|
|
||||||
// pointer pushes the address onto the stack, and ascension from a pointer
|
|
||||||
// pops the address from the stack. Thus, when traversing into a pointer from
|
|
||||||
// reflect.Ptr, reflect.Slice element, or reflect.Map, we can detect cycles
|
|
||||||
// by checking whether the pointer has already been visited. The cycle detection
|
|
||||||
// uses a separate stack for the x and y values.
|
|
||||||
//
|
|
||||||
// If a cycle is detected we need to determine whether the two pointers
|
|
||||||
// should be considered equal. The definition of equality chosen by Equal
|
|
||||||
// requires two graphs to have the same structure. To determine this, both the
|
|
||||||
// x and y values must have a cycle where the previous pointers were also
|
|
||||||
// encountered together as a pair.
|
|
||||||
//
|
|
||||||
// Semantically, this is equivalent to augmenting Indirect, SliceIndex, and
|
|
||||||
// MapIndex with pointer information for the x and y values.
|
|
||||||
// Suppose px and py are two pointers to compare, we then search the
|
|
||||||
// Path for whether px was ever encountered in the Path history of x, and
|
|
||||||
// similarly so with py. If either side has a cycle, the comparison is only
|
|
||||||
// equal if both px and py have a cycle resulting from the same PathStep.
|
|
||||||
//
|
|
||||||
// Using a map as a stack is more performant as we can perform cycle detection
|
|
||||||
// in O(1) instead of O(N) where N is len(Path).
|
|
||||||
type pointerPath struct {
|
|
||||||
// mx is keyed by x pointers, where the value is the associated y pointer.
|
|
||||||
mx map[value.Pointer]value.Pointer
|
|
||||||
// my is keyed by y pointers, where the value is the associated x pointer.
|
|
||||||
my map[value.Pointer]value.Pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *pointerPath) Init() {
|
|
||||||
p.mx = make(map[value.Pointer]value.Pointer)
|
|
||||||
p.my = make(map[value.Pointer]value.Pointer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push indicates intent to descend into pointers vx and vy where
|
|
||||||
// visited reports whether either has been seen before. If visited before,
|
|
||||||
// equal reports whether both pointers were encountered together.
|
|
||||||
// Pop must be called if and only if the pointers were never visited.
|
|
||||||
//
|
|
||||||
// The pointers vx and vy must be a reflect.Ptr, reflect.Slice, or reflect.Map
|
|
||||||
// and be non-nil.
|
|
||||||
func (p pointerPath) Push(vx, vy reflect.Value) (equal, visited bool) {
|
|
||||||
px := value.PointerOf(vx)
|
|
||||||
py := value.PointerOf(vy)
|
|
||||||
_, ok1 := p.mx[px]
|
|
||||||
_, ok2 := p.my[py]
|
|
||||||
if ok1 || ok2 {
|
|
||||||
equal = p.mx[px] == py && p.my[py] == px // Pointers paired together
|
|
||||||
return equal, true
|
|
||||||
}
|
|
||||||
p.mx[px] = py
|
|
||||||
p.my[py] = px
|
|
||||||
return false, false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pop ascends from pointers vx and vy.
|
|
||||||
func (p pointerPath) Pop(vx, vy reflect.Value) {
|
|
||||||
delete(p.mx, value.PointerOf(vx))
|
|
||||||
delete(p.my, value.PointerOf(vy))
|
|
||||||
}
|
|
||||||
|
|
||||||
// isExported reports whether the identifier is exported.
|
|
||||||
func isExported(id string) bool {
|
|
||||||
r, _ := utf8.DecodeRuneInString(id)
|
|
||||||
return unicode.IsUpper(r)
|
|
||||||
}
|
|
54
vendor/github.com/google/go-cmp/cmp/report.go
generated
vendored
54
vendor/github.com/google/go-cmp/cmp/report.go
generated
vendored
|
@ -1,54 +0,0 @@
|
||||||
// Copyright 2017, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
// defaultReporter implements the reporter interface.
|
|
||||||
//
|
|
||||||
// As Equal serially calls the PushStep, Report, and PopStep methods, the
|
|
||||||
// defaultReporter constructs a tree-based representation of the compared value
|
|
||||||
// and the result of each comparison (see valueNode).
|
|
||||||
//
|
|
||||||
// When the String method is called, the FormatDiff method transforms the
|
|
||||||
// valueNode tree into a textNode tree, which is a tree-based representation
|
|
||||||
// of the textual output (see textNode).
|
|
||||||
//
|
|
||||||
// Lastly, the textNode.String method produces the final report as a string.
|
|
||||||
type defaultReporter struct {
|
|
||||||
root *valueNode
|
|
||||||
curr *valueNode
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *defaultReporter) PushStep(ps PathStep) {
|
|
||||||
r.curr = r.curr.PushStep(ps)
|
|
||||||
if r.root == nil {
|
|
||||||
r.root = r.curr
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (r *defaultReporter) Report(rs Result) {
|
|
||||||
r.curr.Report(rs)
|
|
||||||
}
|
|
||||||
func (r *defaultReporter) PopStep() {
|
|
||||||
r.curr = r.curr.PopStep()
|
|
||||||
}
|
|
||||||
|
|
||||||
// String provides a full report of the differences detected as a structured
|
|
||||||
// literal in pseudo-Go syntax. String may only be called after the entire tree
|
|
||||||
// has been traversed.
|
|
||||||
func (r *defaultReporter) String() string {
|
|
||||||
assert(r.root != nil && r.curr == nil)
|
|
||||||
if r.root.NumDiff == 0 {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
ptrs := new(pointerReferences)
|
|
||||||
text := formatOptions{}.FormatDiff(r.root, ptrs)
|
|
||||||
resolveReferences(text)
|
|
||||||
return text.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func assert(ok bool) {
|
|
||||||
if !ok {
|
|
||||||
panic("assertion failure")
|
|
||||||
}
|
|
||||||
}
|
|
433
vendor/github.com/google/go-cmp/cmp/report_compare.go
generated
vendored
433
vendor/github.com/google/go-cmp/cmp/report_compare.go
generated
vendored
|
@ -1,433 +0,0 @@
|
||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
)
|
|
||||||
|
|
||||||
// numContextRecords is the number of surrounding equal records to print.
|
|
||||||
const numContextRecords = 2
|
|
||||||
|
|
||||||
type diffMode byte
|
|
||||||
|
|
||||||
const (
|
|
||||||
diffUnknown diffMode = 0
|
|
||||||
diffIdentical diffMode = ' '
|
|
||||||
diffRemoved diffMode = '-'
|
|
||||||
diffInserted diffMode = '+'
|
|
||||||
)
|
|
||||||
|
|
||||||
type typeMode int
|
|
||||||
|
|
||||||
const (
|
|
||||||
// emitType always prints the type.
|
|
||||||
emitType typeMode = iota
|
|
||||||
// elideType never prints the type.
|
|
||||||
elideType
|
|
||||||
// autoType prints the type only for composite kinds
|
|
||||||
// (i.e., structs, slices, arrays, and maps).
|
|
||||||
autoType
|
|
||||||
)
|
|
||||||
|
|
||||||
type formatOptions struct {
|
|
||||||
// DiffMode controls the output mode of FormatDiff.
|
|
||||||
//
|
|
||||||
// If diffUnknown, then produce a diff of the x and y values.
|
|
||||||
// If diffIdentical, then emit values as if they were equal.
|
|
||||||
// If diffRemoved, then only emit x values (ignoring y values).
|
|
||||||
// If diffInserted, then only emit y values (ignoring x values).
|
|
||||||
DiffMode diffMode
|
|
||||||
|
|
||||||
// TypeMode controls whether to print the type for the current node.
|
|
||||||
//
|
|
||||||
// As a general rule of thumb, we always print the type of the next node
|
|
||||||
// after an interface, and always elide the type of the next node after
|
|
||||||
// a slice or map node.
|
|
||||||
TypeMode typeMode
|
|
||||||
|
|
||||||
// formatValueOptions are options specific to printing reflect.Values.
|
|
||||||
formatValueOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
func (opts formatOptions) WithDiffMode(d diffMode) formatOptions {
|
|
||||||
opts.DiffMode = d
|
|
||||||
return opts
|
|
||||||
}
|
|
||||||
func (opts formatOptions) WithTypeMode(t typeMode) formatOptions {
|
|
||||||
opts.TypeMode = t
|
|
||||||
return opts
|
|
||||||
}
|
|
||||||
func (opts formatOptions) WithVerbosity(level int) formatOptions {
|
|
||||||
opts.VerbosityLevel = level
|
|
||||||
opts.LimitVerbosity = true
|
|
||||||
return opts
|
|
||||||
}
|
|
||||||
func (opts formatOptions) verbosity() uint {
|
|
||||||
switch {
|
|
||||||
case opts.VerbosityLevel < 0:
|
|
||||||
return 0
|
|
||||||
case opts.VerbosityLevel > 16:
|
|
||||||
return 16 // some reasonable maximum to avoid shift overflow
|
|
||||||
default:
|
|
||||||
return uint(opts.VerbosityLevel)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const maxVerbosityPreset = 6
|
|
||||||
|
|
||||||
// verbosityPreset modifies the verbosity settings given an index
|
|
||||||
// between 0 and maxVerbosityPreset, inclusive.
|
|
||||||
func verbosityPreset(opts formatOptions, i int) formatOptions {
|
|
||||||
opts.VerbosityLevel = int(opts.verbosity()) + 2*i
|
|
||||||
if i > 0 {
|
|
||||||
opts.AvoidStringer = true
|
|
||||||
}
|
|
||||||
if i >= maxVerbosityPreset {
|
|
||||||
opts.PrintAddresses = true
|
|
||||||
opts.QualifiedNames = true
|
|
||||||
}
|
|
||||||
return opts
|
|
||||||
}
|
|
||||||
|
|
||||||
// FormatDiff converts a valueNode tree into a textNode tree, where the later
|
|
||||||
// is a textual representation of the differences detected in the former.
|
|
||||||
func (opts formatOptions) FormatDiff(v *valueNode, ptrs *pointerReferences) (out textNode) {
|
|
||||||
if opts.DiffMode == diffIdentical {
|
|
||||||
opts = opts.WithVerbosity(1)
|
|
||||||
} else if opts.verbosity() < 3 {
|
|
||||||
opts = opts.WithVerbosity(3)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether we have specialized formatting for this node.
|
|
||||||
// This is not necessary, but helpful for producing more readable outputs.
|
|
||||||
if opts.CanFormatDiffSlice(v) {
|
|
||||||
return opts.FormatDiffSlice(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var parentKind reflect.Kind
|
|
||||||
if v.parent != nil && v.parent.TransformerName == "" {
|
|
||||||
parentKind = v.parent.Type.Kind()
|
|
||||||
}
|
|
||||||
|
|
||||||
// For leaf nodes, format the value based on the reflect.Values alone.
|
|
||||||
// As a special case, treat equal []byte as a leaf nodes.
|
|
||||||
isBytes := v.Type.Kind() == reflect.Slice && v.Type.Elem() == byteType
|
|
||||||
isEqualBytes := isBytes && v.NumDiff+v.NumIgnored+v.NumTransformed == 0
|
|
||||||
if v.MaxDepth == 0 || isEqualBytes {
|
|
||||||
switch opts.DiffMode {
|
|
||||||
case diffUnknown, diffIdentical:
|
|
||||||
// Format Equal.
|
|
||||||
if v.NumDiff == 0 {
|
|
||||||
outx := opts.FormatValue(v.ValueX, parentKind, ptrs)
|
|
||||||
outy := opts.FormatValue(v.ValueY, parentKind, ptrs)
|
|
||||||
if v.NumIgnored > 0 && v.NumSame == 0 {
|
|
||||||
return textEllipsis
|
|
||||||
} else if outx.Len() < outy.Len() {
|
|
||||||
return outx
|
|
||||||
} else {
|
|
||||||
return outy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format unequal.
|
|
||||||
assert(opts.DiffMode == diffUnknown)
|
|
||||||
var list textList
|
|
||||||
outx := opts.WithTypeMode(elideType).FormatValue(v.ValueX, parentKind, ptrs)
|
|
||||||
outy := opts.WithTypeMode(elideType).FormatValue(v.ValueY, parentKind, ptrs)
|
|
||||||
for i := 0; i <= maxVerbosityPreset && outx != nil && outy != nil && outx.Equal(outy); i++ {
|
|
||||||
opts2 := verbosityPreset(opts, i).WithTypeMode(elideType)
|
|
||||||
outx = opts2.FormatValue(v.ValueX, parentKind, ptrs)
|
|
||||||
outy = opts2.FormatValue(v.ValueY, parentKind, ptrs)
|
|
||||||
}
|
|
||||||
if outx != nil {
|
|
||||||
list = append(list, textRecord{Diff: '-', Value: outx})
|
|
||||||
}
|
|
||||||
if outy != nil {
|
|
||||||
list = append(list, textRecord{Diff: '+', Value: outy})
|
|
||||||
}
|
|
||||||
return opts.WithTypeMode(emitType).FormatType(v.Type, list)
|
|
||||||
case diffRemoved:
|
|
||||||
return opts.FormatValue(v.ValueX, parentKind, ptrs)
|
|
||||||
case diffInserted:
|
|
||||||
return opts.FormatValue(v.ValueY, parentKind, ptrs)
|
|
||||||
default:
|
|
||||||
panic("invalid diff mode")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register slice element to support cycle detection.
|
|
||||||
if parentKind == reflect.Slice {
|
|
||||||
ptrRefs := ptrs.PushPair(v.ValueX, v.ValueY, opts.DiffMode, true)
|
|
||||||
defer ptrs.Pop()
|
|
||||||
defer func() { out = wrapTrunkReferences(ptrRefs, out) }()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Descend into the child value node.
|
|
||||||
if v.TransformerName != "" {
|
|
||||||
out := opts.WithTypeMode(emitType).FormatDiff(v.Value, ptrs)
|
|
||||||
out = &textWrap{Prefix: "Inverse(" + v.TransformerName + ", ", Value: out, Suffix: ")"}
|
|
||||||
return opts.FormatType(v.Type, out)
|
|
||||||
} else {
|
|
||||||
switch k := v.Type.Kind(); k {
|
|
||||||
case reflect.Struct, reflect.Array, reflect.Slice:
|
|
||||||
out = opts.formatDiffList(v.Records, k, ptrs)
|
|
||||||
out = opts.FormatType(v.Type, out)
|
|
||||||
case reflect.Map:
|
|
||||||
// Register map to support cycle detection.
|
|
||||||
ptrRefs := ptrs.PushPair(v.ValueX, v.ValueY, opts.DiffMode, false)
|
|
||||||
defer ptrs.Pop()
|
|
||||||
|
|
||||||
out = opts.formatDiffList(v.Records, k, ptrs)
|
|
||||||
out = wrapTrunkReferences(ptrRefs, out)
|
|
||||||
out = opts.FormatType(v.Type, out)
|
|
||||||
case reflect.Ptr:
|
|
||||||
// Register pointer to support cycle detection.
|
|
||||||
ptrRefs := ptrs.PushPair(v.ValueX, v.ValueY, opts.DiffMode, false)
|
|
||||||
defer ptrs.Pop()
|
|
||||||
|
|
||||||
out = opts.FormatDiff(v.Value, ptrs)
|
|
||||||
out = wrapTrunkReferences(ptrRefs, out)
|
|
||||||
out = &textWrap{Prefix: "&", Value: out}
|
|
||||||
case reflect.Interface:
|
|
||||||
out = opts.WithTypeMode(emitType).FormatDiff(v.Value, ptrs)
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("%v cannot have children", k))
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind, ptrs *pointerReferences) textNode {
|
|
||||||
// Derive record name based on the data structure kind.
|
|
||||||
var name string
|
|
||||||
var formatKey func(reflect.Value) string
|
|
||||||
switch k {
|
|
||||||
case reflect.Struct:
|
|
||||||
name = "field"
|
|
||||||
opts = opts.WithTypeMode(autoType)
|
|
||||||
formatKey = func(v reflect.Value) string { return v.String() }
|
|
||||||
case reflect.Slice, reflect.Array:
|
|
||||||
name = "element"
|
|
||||||
opts = opts.WithTypeMode(elideType)
|
|
||||||
formatKey = func(reflect.Value) string { return "" }
|
|
||||||
case reflect.Map:
|
|
||||||
name = "entry"
|
|
||||||
opts = opts.WithTypeMode(elideType)
|
|
||||||
formatKey = func(v reflect.Value) string { return formatMapKey(v, false, ptrs) }
|
|
||||||
}
|
|
||||||
|
|
||||||
maxLen := -1
|
|
||||||
if opts.LimitVerbosity {
|
|
||||||
if opts.DiffMode == diffIdentical {
|
|
||||||
maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc...
|
|
||||||
} else {
|
|
||||||
maxLen = (1 << opts.verbosity()) << 1 // 2, 4, 8, 16, 32, 64, etc...
|
|
||||||
}
|
|
||||||
opts.VerbosityLevel--
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle unification.
|
|
||||||
switch opts.DiffMode {
|
|
||||||
case diffIdentical, diffRemoved, diffInserted:
|
|
||||||
var list textList
|
|
||||||
var deferredEllipsis bool // Add final "..." to indicate records were dropped
|
|
||||||
for _, r := range recs {
|
|
||||||
if len(list) == maxLen {
|
|
||||||
deferredEllipsis = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// Elide struct fields that are zero value.
|
|
||||||
if k == reflect.Struct {
|
|
||||||
var isZero bool
|
|
||||||
switch opts.DiffMode {
|
|
||||||
case diffIdentical:
|
|
||||||
isZero = r.Value.ValueX.IsZero() || r.Value.ValueY.IsZero()
|
|
||||||
case diffRemoved:
|
|
||||||
isZero = r.Value.ValueX.IsZero()
|
|
||||||
case diffInserted:
|
|
||||||
isZero = r.Value.ValueY.IsZero()
|
|
||||||
}
|
|
||||||
if isZero {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Elide ignored nodes.
|
|
||||||
if r.Value.NumIgnored > 0 && r.Value.NumSame+r.Value.NumDiff == 0 {
|
|
||||||
deferredEllipsis = !(k == reflect.Slice || k == reflect.Array)
|
|
||||||
if !deferredEllipsis {
|
|
||||||
list.AppendEllipsis(diffStats{})
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if out := opts.FormatDiff(r.Value, ptrs); out != nil {
|
|
||||||
list = append(list, textRecord{Key: formatKey(r.Key), Value: out})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if deferredEllipsis {
|
|
||||||
list.AppendEllipsis(diffStats{})
|
|
||||||
}
|
|
||||||
return &textWrap{Prefix: "{", Value: list, Suffix: "}"}
|
|
||||||
case diffUnknown:
|
|
||||||
default:
|
|
||||||
panic("invalid diff mode")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle differencing.
|
|
||||||
var numDiffs int
|
|
||||||
var list textList
|
|
||||||
var keys []reflect.Value // invariant: len(list) == len(keys)
|
|
||||||
groups := coalesceAdjacentRecords(name, recs)
|
|
||||||
maxGroup := diffStats{Name: name}
|
|
||||||
for i, ds := range groups {
|
|
||||||
if maxLen >= 0 && numDiffs >= maxLen {
|
|
||||||
maxGroup = maxGroup.Append(ds)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle equal records.
|
|
||||||
if ds.NumDiff() == 0 {
|
|
||||||
// Compute the number of leading and trailing records to print.
|
|
||||||
var numLo, numHi int
|
|
||||||
numEqual := ds.NumIgnored + ds.NumIdentical
|
|
||||||
for numLo < numContextRecords && numLo+numHi < numEqual && i != 0 {
|
|
||||||
if r := recs[numLo].Value; r.NumIgnored > 0 && r.NumSame+r.NumDiff == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
numLo++
|
|
||||||
}
|
|
||||||
for numHi < numContextRecords && numLo+numHi < numEqual && i != len(groups)-1 {
|
|
||||||
if r := recs[numEqual-numHi-1].Value; r.NumIgnored > 0 && r.NumSame+r.NumDiff == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
numHi++
|
|
||||||
}
|
|
||||||
if numEqual-(numLo+numHi) == 1 && ds.NumIgnored == 0 {
|
|
||||||
numHi++ // Avoid pointless coalescing of a single equal record
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format the equal values.
|
|
||||||
for _, r := range recs[:numLo] {
|
|
||||||
out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value, ptrs)
|
|
||||||
list = append(list, textRecord{Key: formatKey(r.Key), Value: out})
|
|
||||||
keys = append(keys, r.Key)
|
|
||||||
}
|
|
||||||
if numEqual > numLo+numHi {
|
|
||||||
ds.NumIdentical -= numLo + numHi
|
|
||||||
list.AppendEllipsis(ds)
|
|
||||||
for len(keys) < len(list) {
|
|
||||||
keys = append(keys, reflect.Value{})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, r := range recs[numEqual-numHi : numEqual] {
|
|
||||||
out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value, ptrs)
|
|
||||||
list = append(list, textRecord{Key: formatKey(r.Key), Value: out})
|
|
||||||
keys = append(keys, r.Key)
|
|
||||||
}
|
|
||||||
recs = recs[numEqual:]
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle unequal records.
|
|
||||||
for _, r := range recs[:ds.NumDiff()] {
|
|
||||||
switch {
|
|
||||||
case opts.CanFormatDiffSlice(r.Value):
|
|
||||||
out := opts.FormatDiffSlice(r.Value)
|
|
||||||
list = append(list, textRecord{Key: formatKey(r.Key), Value: out})
|
|
||||||
keys = append(keys, r.Key)
|
|
||||||
case r.Value.NumChildren == r.Value.MaxDepth:
|
|
||||||
outx := opts.WithDiffMode(diffRemoved).FormatDiff(r.Value, ptrs)
|
|
||||||
outy := opts.WithDiffMode(diffInserted).FormatDiff(r.Value, ptrs)
|
|
||||||
for i := 0; i <= maxVerbosityPreset && outx != nil && outy != nil && outx.Equal(outy); i++ {
|
|
||||||
opts2 := verbosityPreset(opts, i)
|
|
||||||
outx = opts2.WithDiffMode(diffRemoved).FormatDiff(r.Value, ptrs)
|
|
||||||
outy = opts2.WithDiffMode(diffInserted).FormatDiff(r.Value, ptrs)
|
|
||||||
}
|
|
||||||
if outx != nil {
|
|
||||||
list = append(list, textRecord{Diff: diffRemoved, Key: formatKey(r.Key), Value: outx})
|
|
||||||
keys = append(keys, r.Key)
|
|
||||||
}
|
|
||||||
if outy != nil {
|
|
||||||
list = append(list, textRecord{Diff: diffInserted, Key: formatKey(r.Key), Value: outy})
|
|
||||||
keys = append(keys, r.Key)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
out := opts.FormatDiff(r.Value, ptrs)
|
|
||||||
list = append(list, textRecord{Key: formatKey(r.Key), Value: out})
|
|
||||||
keys = append(keys, r.Key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
recs = recs[ds.NumDiff():]
|
|
||||||
numDiffs += ds.NumDiff()
|
|
||||||
}
|
|
||||||
if maxGroup.IsZero() {
|
|
||||||
assert(len(recs) == 0)
|
|
||||||
} else {
|
|
||||||
list.AppendEllipsis(maxGroup)
|
|
||||||
for len(keys) < len(list) {
|
|
||||||
keys = append(keys, reflect.Value{})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert(len(list) == len(keys))
|
|
||||||
|
|
||||||
// For maps, the default formatting logic uses fmt.Stringer which may
|
|
||||||
// produce ambiguous output. Avoid calling String to disambiguate.
|
|
||||||
if k == reflect.Map {
|
|
||||||
var ambiguous bool
|
|
||||||
seenKeys := map[string]reflect.Value{}
|
|
||||||
for i, currKey := range keys {
|
|
||||||
if currKey.IsValid() {
|
|
||||||
strKey := list[i].Key
|
|
||||||
prevKey, seen := seenKeys[strKey]
|
|
||||||
if seen && prevKey.CanInterface() && currKey.CanInterface() {
|
|
||||||
ambiguous = prevKey.Interface() != currKey.Interface()
|
|
||||||
if ambiguous {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
seenKeys[strKey] = currKey
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ambiguous {
|
|
||||||
for i, k := range keys {
|
|
||||||
if k.IsValid() {
|
|
||||||
list[i].Key = formatMapKey(k, true, ptrs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &textWrap{Prefix: "{", Value: list, Suffix: "}"}
|
|
||||||
}
|
|
||||||
|
|
||||||
// coalesceAdjacentRecords coalesces the list of records into groups of
|
|
||||||
// adjacent equal, or unequal counts.
|
|
||||||
func coalesceAdjacentRecords(name string, recs []reportRecord) (groups []diffStats) {
|
|
||||||
var prevCase int // Arbitrary index into which case last occurred
|
|
||||||
lastStats := func(i int) *diffStats {
|
|
||||||
if prevCase != i {
|
|
||||||
groups = append(groups, diffStats{Name: name})
|
|
||||||
prevCase = i
|
|
||||||
}
|
|
||||||
return &groups[len(groups)-1]
|
|
||||||
}
|
|
||||||
for _, r := range recs {
|
|
||||||
switch rv := r.Value; {
|
|
||||||
case rv.NumIgnored > 0 && rv.NumSame+rv.NumDiff == 0:
|
|
||||||
lastStats(1).NumIgnored++
|
|
||||||
case rv.NumDiff == 0:
|
|
||||||
lastStats(1).NumIdentical++
|
|
||||||
case rv.NumDiff > 0 && !rv.ValueY.IsValid():
|
|
||||||
lastStats(2).NumRemoved++
|
|
||||||
case rv.NumDiff > 0 && !rv.ValueX.IsValid():
|
|
||||||
lastStats(2).NumInserted++
|
|
||||||
default:
|
|
||||||
lastStats(2).NumModified++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return groups
|
|
||||||
}
|
|
264
vendor/github.com/google/go-cmp/cmp/report_references.go
generated
vendored
264
vendor/github.com/google/go-cmp/cmp/report_references.go
generated
vendored
|
@ -1,264 +0,0 @@
|
||||||
// Copyright 2020, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/flags"
|
|
||||||
"github.com/google/go-cmp/cmp/internal/value"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
pointerDelimPrefix = "⟪"
|
|
||||||
pointerDelimSuffix = "⟫"
|
|
||||||
)
|
|
||||||
|
|
||||||
// formatPointer prints the address of the pointer.
|
|
||||||
func formatPointer(p value.Pointer, withDelims bool) string {
|
|
||||||
v := p.Uintptr()
|
|
||||||
if flags.Deterministic {
|
|
||||||
v = 0xdeadf00f // Only used for stable testing purposes
|
|
||||||
}
|
|
||||||
if withDelims {
|
|
||||||
return pointerDelimPrefix + formatHex(uint64(v)) + pointerDelimSuffix
|
|
||||||
}
|
|
||||||
return formatHex(uint64(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
// pointerReferences is a stack of pointers visited so far.
|
|
||||||
type pointerReferences [][2]value.Pointer
|
|
||||||
|
|
||||||
func (ps *pointerReferences) PushPair(vx, vy reflect.Value, d diffMode, deref bool) (pp [2]value.Pointer) {
|
|
||||||
if deref && vx.IsValid() {
|
|
||||||
vx = vx.Addr()
|
|
||||||
}
|
|
||||||
if deref && vy.IsValid() {
|
|
||||||
vy = vy.Addr()
|
|
||||||
}
|
|
||||||
switch d {
|
|
||||||
case diffUnknown, diffIdentical:
|
|
||||||
pp = [2]value.Pointer{value.PointerOf(vx), value.PointerOf(vy)}
|
|
||||||
case diffRemoved:
|
|
||||||
pp = [2]value.Pointer{value.PointerOf(vx), value.Pointer{}}
|
|
||||||
case diffInserted:
|
|
||||||
pp = [2]value.Pointer{value.Pointer{}, value.PointerOf(vy)}
|
|
||||||
}
|
|
||||||
*ps = append(*ps, pp)
|
|
||||||
return pp
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ps *pointerReferences) Push(v reflect.Value) (p value.Pointer, seen bool) {
|
|
||||||
p = value.PointerOf(v)
|
|
||||||
for _, pp := range *ps {
|
|
||||||
if p == pp[0] || p == pp[1] {
|
|
||||||
return p, true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*ps = append(*ps, [2]value.Pointer{p, p})
|
|
||||||
return p, false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ps *pointerReferences) Pop() {
|
|
||||||
*ps = (*ps)[:len(*ps)-1]
|
|
||||||
}
|
|
||||||
|
|
||||||
// trunkReferences is metadata for a textNode indicating that the sub-tree
|
|
||||||
// represents the value for either pointer in a pair of references.
|
|
||||||
type trunkReferences struct{ pp [2]value.Pointer }
|
|
||||||
|
|
||||||
// trunkReference is metadata for a textNode indicating that the sub-tree
|
|
||||||
// represents the value for the given pointer reference.
|
|
||||||
type trunkReference struct{ p value.Pointer }
|
|
||||||
|
|
||||||
// leafReference is metadata for a textNode indicating that the value is
|
|
||||||
// truncated as it refers to another part of the tree (i.e., a trunk).
|
|
||||||
type leafReference struct{ p value.Pointer }
|
|
||||||
|
|
||||||
func wrapTrunkReferences(pp [2]value.Pointer, s textNode) textNode {
|
|
||||||
switch {
|
|
||||||
case pp[0].IsNil():
|
|
||||||
return &textWrap{Value: s, Metadata: trunkReference{pp[1]}}
|
|
||||||
case pp[1].IsNil():
|
|
||||||
return &textWrap{Value: s, Metadata: trunkReference{pp[0]}}
|
|
||||||
case pp[0] == pp[1]:
|
|
||||||
return &textWrap{Value: s, Metadata: trunkReference{pp[0]}}
|
|
||||||
default:
|
|
||||||
return &textWrap{Value: s, Metadata: trunkReferences{pp}}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func wrapTrunkReference(p value.Pointer, printAddress bool, s textNode) textNode {
|
|
||||||
var prefix string
|
|
||||||
if printAddress {
|
|
||||||
prefix = formatPointer(p, true)
|
|
||||||
}
|
|
||||||
return &textWrap{Prefix: prefix, Value: s, Metadata: trunkReference{p}}
|
|
||||||
}
|
|
||||||
func makeLeafReference(p value.Pointer, printAddress bool) textNode {
|
|
||||||
out := &textWrap{Prefix: "(", Value: textEllipsis, Suffix: ")"}
|
|
||||||
var prefix string
|
|
||||||
if printAddress {
|
|
||||||
prefix = formatPointer(p, true)
|
|
||||||
}
|
|
||||||
return &textWrap{Prefix: prefix, Value: out, Metadata: leafReference{p}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// resolveReferences walks the textNode tree searching for any leaf reference
|
|
||||||
// metadata and resolves each against the corresponding trunk references.
|
|
||||||
// Since pointer addresses in memory are not particularly readable to the user,
|
|
||||||
// it replaces each pointer value with an arbitrary and unique reference ID.
|
|
||||||
func resolveReferences(s textNode) {
|
|
||||||
var walkNodes func(textNode, func(textNode))
|
|
||||||
walkNodes = func(s textNode, f func(textNode)) {
|
|
||||||
f(s)
|
|
||||||
switch s := s.(type) {
|
|
||||||
case *textWrap:
|
|
||||||
walkNodes(s.Value, f)
|
|
||||||
case textList:
|
|
||||||
for _, r := range s {
|
|
||||||
walkNodes(r.Value, f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect all trunks and leaves with reference metadata.
|
|
||||||
var trunks, leaves []*textWrap
|
|
||||||
walkNodes(s, func(s textNode) {
|
|
||||||
if s, ok := s.(*textWrap); ok {
|
|
||||||
switch s.Metadata.(type) {
|
|
||||||
case leafReference:
|
|
||||||
leaves = append(leaves, s)
|
|
||||||
case trunkReference, trunkReferences:
|
|
||||||
trunks = append(trunks, s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// No leaf references to resolve.
|
|
||||||
if len(leaves) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect the set of all leaf references to resolve.
|
|
||||||
leafPtrs := make(map[value.Pointer]bool)
|
|
||||||
for _, leaf := range leaves {
|
|
||||||
leafPtrs[leaf.Metadata.(leafReference).p] = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect the set of trunk pointers that are always paired together.
|
|
||||||
// This allows us to assign a single ID to both pointers for brevity.
|
|
||||||
// If a pointer in a pair ever occurs by itself or as a different pair,
|
|
||||||
// then the pair is broken.
|
|
||||||
pairedTrunkPtrs := make(map[value.Pointer]value.Pointer)
|
|
||||||
unpair := func(p value.Pointer) {
|
|
||||||
if !pairedTrunkPtrs[p].IsNil() {
|
|
||||||
pairedTrunkPtrs[pairedTrunkPtrs[p]] = value.Pointer{} // invalidate other half
|
|
||||||
}
|
|
||||||
pairedTrunkPtrs[p] = value.Pointer{} // invalidate this half
|
|
||||||
}
|
|
||||||
for _, trunk := range trunks {
|
|
||||||
switch p := trunk.Metadata.(type) {
|
|
||||||
case trunkReference:
|
|
||||||
unpair(p.p) // standalone pointer cannot be part of a pair
|
|
||||||
case trunkReferences:
|
|
||||||
p0, ok0 := pairedTrunkPtrs[p.pp[0]]
|
|
||||||
p1, ok1 := pairedTrunkPtrs[p.pp[1]]
|
|
||||||
switch {
|
|
||||||
case !ok0 && !ok1:
|
|
||||||
// Register the newly seen pair.
|
|
||||||
pairedTrunkPtrs[p.pp[0]] = p.pp[1]
|
|
||||||
pairedTrunkPtrs[p.pp[1]] = p.pp[0]
|
|
||||||
case ok0 && ok1 && p0 == p.pp[1] && p1 == p.pp[0]:
|
|
||||||
// Exact pair already seen; do nothing.
|
|
||||||
default:
|
|
||||||
// Pair conflicts with some other pair; break all pairs.
|
|
||||||
unpair(p.pp[0])
|
|
||||||
unpair(p.pp[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Correlate each pointer referenced by leaves to a unique identifier,
|
|
||||||
// and print the IDs for each trunk that matches those pointers.
|
|
||||||
var nextID uint
|
|
||||||
ptrIDs := make(map[value.Pointer]uint)
|
|
||||||
newID := func() uint {
|
|
||||||
id := nextID
|
|
||||||
nextID++
|
|
||||||
return id
|
|
||||||
}
|
|
||||||
for _, trunk := range trunks {
|
|
||||||
switch p := trunk.Metadata.(type) {
|
|
||||||
case trunkReference:
|
|
||||||
if print := leafPtrs[p.p]; print {
|
|
||||||
id, ok := ptrIDs[p.p]
|
|
||||||
if !ok {
|
|
||||||
id = newID()
|
|
||||||
ptrIDs[p.p] = id
|
|
||||||
}
|
|
||||||
trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id))
|
|
||||||
}
|
|
||||||
case trunkReferences:
|
|
||||||
print0 := leafPtrs[p.pp[0]]
|
|
||||||
print1 := leafPtrs[p.pp[1]]
|
|
||||||
if print0 || print1 {
|
|
||||||
id0, ok0 := ptrIDs[p.pp[0]]
|
|
||||||
id1, ok1 := ptrIDs[p.pp[1]]
|
|
||||||
isPair := pairedTrunkPtrs[p.pp[0]] == p.pp[1] && pairedTrunkPtrs[p.pp[1]] == p.pp[0]
|
|
||||||
if isPair {
|
|
||||||
var id uint
|
|
||||||
assert(ok0 == ok1) // must be seen together or not at all
|
|
||||||
if ok0 {
|
|
||||||
assert(id0 == id1) // must have the same ID
|
|
||||||
id = id0
|
|
||||||
} else {
|
|
||||||
id = newID()
|
|
||||||
ptrIDs[p.pp[0]] = id
|
|
||||||
ptrIDs[p.pp[1]] = id
|
|
||||||
}
|
|
||||||
trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id))
|
|
||||||
} else {
|
|
||||||
if print0 && !ok0 {
|
|
||||||
id0 = newID()
|
|
||||||
ptrIDs[p.pp[0]] = id0
|
|
||||||
}
|
|
||||||
if print1 && !ok1 {
|
|
||||||
id1 = newID()
|
|
||||||
ptrIDs[p.pp[1]] = id1
|
|
||||||
}
|
|
||||||
switch {
|
|
||||||
case print0 && print1:
|
|
||||||
trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id0)+","+formatReference(id1))
|
|
||||||
case print0:
|
|
||||||
trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id0))
|
|
||||||
case print1:
|
|
||||||
trunk.Prefix = updateReferencePrefix(trunk.Prefix, formatReference(id1))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update all leaf references with the unique identifier.
|
|
||||||
for _, leaf := range leaves {
|
|
||||||
if id, ok := ptrIDs[leaf.Metadata.(leafReference).p]; ok {
|
|
||||||
leaf.Prefix = updateReferencePrefix(leaf.Prefix, formatReference(id))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func formatReference(id uint) string {
|
|
||||||
return fmt.Sprintf("ref#%d", id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateReferencePrefix(prefix, ref string) string {
|
|
||||||
if prefix == "" {
|
|
||||||
return pointerDelimPrefix + ref + pointerDelimSuffix
|
|
||||||
}
|
|
||||||
suffix := strings.TrimPrefix(prefix, pointerDelimPrefix)
|
|
||||||
return pointerDelimPrefix + ref + ": " + suffix
|
|
||||||
}
|
|
414
vendor/github.com/google/go-cmp/cmp/report_reflect.go
generated
vendored
414
vendor/github.com/google/go-cmp/cmp/report_reflect.go
generated
vendored
|
@ -1,414 +0,0 @@
|
||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/value"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
anyType = reflect.TypeOf((*interface{})(nil)).Elem()
|
|
||||||
stringType = reflect.TypeOf((*string)(nil)).Elem()
|
|
||||||
bytesType = reflect.TypeOf((*[]byte)(nil)).Elem()
|
|
||||||
byteType = reflect.TypeOf((*byte)(nil)).Elem()
|
|
||||||
)
|
|
||||||
|
|
||||||
type formatValueOptions struct {
|
|
||||||
// AvoidStringer controls whether to avoid calling custom stringer
|
|
||||||
// methods like error.Error or fmt.Stringer.String.
|
|
||||||
AvoidStringer bool
|
|
||||||
|
|
||||||
// PrintAddresses controls whether to print the address of all pointers,
|
|
||||||
// slice elements, and maps.
|
|
||||||
PrintAddresses bool
|
|
||||||
|
|
||||||
// QualifiedNames controls whether FormatType uses the fully qualified name
|
|
||||||
// (including the full package path as opposed to just the package name).
|
|
||||||
QualifiedNames bool
|
|
||||||
|
|
||||||
// VerbosityLevel controls the amount of output to produce.
|
|
||||||
// A higher value produces more output. A value of zero or lower produces
|
|
||||||
// no output (represented using an ellipsis).
|
|
||||||
// If LimitVerbosity is false, then the level is treated as infinite.
|
|
||||||
VerbosityLevel int
|
|
||||||
|
|
||||||
// LimitVerbosity specifies that formatting should respect VerbosityLevel.
|
|
||||||
LimitVerbosity bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// FormatType prints the type as if it were wrapping s.
|
|
||||||
// This may return s as-is depending on the current type and TypeMode mode.
|
|
||||||
func (opts formatOptions) FormatType(t reflect.Type, s textNode) textNode {
|
|
||||||
// Check whether to emit the type or not.
|
|
||||||
switch opts.TypeMode {
|
|
||||||
case autoType:
|
|
||||||
switch t.Kind() {
|
|
||||||
case reflect.Struct, reflect.Slice, reflect.Array, reflect.Map:
|
|
||||||
if s.Equal(textNil) {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
if opts.DiffMode == diffIdentical {
|
|
||||||
return s // elide type for identical nodes
|
|
||||||
}
|
|
||||||
case elideType:
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine the type label, applying special handling for unnamed types.
|
|
||||||
typeName := value.TypeString(t, opts.QualifiedNames)
|
|
||||||
if t.Name() == "" {
|
|
||||||
// According to Go grammar, certain type literals contain symbols that
|
|
||||||
// do not strongly bind to the next lexicographical token (e.g., *T).
|
|
||||||
switch t.Kind() {
|
|
||||||
case reflect.Chan, reflect.Func, reflect.Ptr:
|
|
||||||
typeName = "(" + typeName + ")"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &textWrap{Prefix: typeName, Value: wrapParens(s)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// wrapParens wraps s with a set of parenthesis, but avoids it if the
|
|
||||||
// wrapped node itself is already surrounded by a pair of parenthesis or braces.
|
|
||||||
// It handles unwrapping one level of pointer-reference nodes.
|
|
||||||
func wrapParens(s textNode) textNode {
|
|
||||||
var refNode *textWrap
|
|
||||||
if s2, ok := s.(*textWrap); ok {
|
|
||||||
// Unwrap a single pointer reference node.
|
|
||||||
switch s2.Metadata.(type) {
|
|
||||||
case leafReference, trunkReference, trunkReferences:
|
|
||||||
refNode = s2
|
|
||||||
if s3, ok := refNode.Value.(*textWrap); ok {
|
|
||||||
s2 = s3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Already has delimiters that make parenthesis unnecessary.
|
|
||||||
hasParens := strings.HasPrefix(s2.Prefix, "(") && strings.HasSuffix(s2.Suffix, ")")
|
|
||||||
hasBraces := strings.HasPrefix(s2.Prefix, "{") && strings.HasSuffix(s2.Suffix, "}")
|
|
||||||
if hasParens || hasBraces {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if refNode != nil {
|
|
||||||
refNode.Value = &textWrap{Prefix: "(", Value: refNode.Value, Suffix: ")"}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
return &textWrap{Prefix: "(", Value: s, Suffix: ")"}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FormatValue prints the reflect.Value, taking extra care to avoid descending
|
|
||||||
// into pointers already in ptrs. As pointers are visited, ptrs is also updated.
|
|
||||||
func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind, ptrs *pointerReferences) (out textNode) {
|
|
||||||
if !v.IsValid() {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
t := v.Type()
|
|
||||||
|
|
||||||
// Check slice element for cycles.
|
|
||||||
if parentKind == reflect.Slice {
|
|
||||||
ptrRef, visited := ptrs.Push(v.Addr())
|
|
||||||
if visited {
|
|
||||||
return makeLeafReference(ptrRef, false)
|
|
||||||
}
|
|
||||||
defer ptrs.Pop()
|
|
||||||
defer func() { out = wrapTrunkReference(ptrRef, false, out) }()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether there is an Error or String method to call.
|
|
||||||
if !opts.AvoidStringer && v.CanInterface() {
|
|
||||||
// Avoid calling Error or String methods on nil receivers since many
|
|
||||||
// implementations crash when doing so.
|
|
||||||
if (t.Kind() != reflect.Ptr && t.Kind() != reflect.Interface) || !v.IsNil() {
|
|
||||||
var prefix, strVal string
|
|
||||||
func() {
|
|
||||||
// Swallow and ignore any panics from String or Error.
|
|
||||||
defer func() { recover() }()
|
|
||||||
switch v := v.Interface().(type) {
|
|
||||||
case error:
|
|
||||||
strVal = v.Error()
|
|
||||||
prefix = "e"
|
|
||||||
case fmt.Stringer:
|
|
||||||
strVal = v.String()
|
|
||||||
prefix = "s"
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if prefix != "" {
|
|
||||||
return opts.formatString(prefix, strVal)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether to explicitly wrap the result with the type.
|
|
||||||
var skipType bool
|
|
||||||
defer func() {
|
|
||||||
if !skipType {
|
|
||||||
out = opts.FormatType(t, out)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
switch t.Kind() {
|
|
||||||
case reflect.Bool:
|
|
||||||
return textLine(fmt.Sprint(v.Bool()))
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
return textLine(fmt.Sprint(v.Int()))
|
|
||||||
case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
||||||
return textLine(fmt.Sprint(v.Uint()))
|
|
||||||
case reflect.Uint8:
|
|
||||||
if parentKind == reflect.Slice || parentKind == reflect.Array {
|
|
||||||
return textLine(formatHex(v.Uint()))
|
|
||||||
}
|
|
||||||
return textLine(fmt.Sprint(v.Uint()))
|
|
||||||
case reflect.Uintptr:
|
|
||||||
return textLine(formatHex(v.Uint()))
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
return textLine(fmt.Sprint(v.Float()))
|
|
||||||
case reflect.Complex64, reflect.Complex128:
|
|
||||||
return textLine(fmt.Sprint(v.Complex()))
|
|
||||||
case reflect.String:
|
|
||||||
return opts.formatString("", v.String())
|
|
||||||
case reflect.UnsafePointer, reflect.Chan, reflect.Func:
|
|
||||||
return textLine(formatPointer(value.PointerOf(v), true))
|
|
||||||
case reflect.Struct:
|
|
||||||
var list textList
|
|
||||||
v := makeAddressable(v) // needed for retrieveUnexportedField
|
|
||||||
maxLen := v.NumField()
|
|
||||||
if opts.LimitVerbosity {
|
|
||||||
maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc...
|
|
||||||
opts.VerbosityLevel--
|
|
||||||
}
|
|
||||||
for i := 0; i < v.NumField(); i++ {
|
|
||||||
vv := v.Field(i)
|
|
||||||
if vv.IsZero() {
|
|
||||||
continue // Elide fields with zero values
|
|
||||||
}
|
|
||||||
if len(list) == maxLen {
|
|
||||||
list.AppendEllipsis(diffStats{})
|
|
||||||
break
|
|
||||||
}
|
|
||||||
sf := t.Field(i)
|
|
||||||
if !isExported(sf.Name) {
|
|
||||||
vv = retrieveUnexportedField(v, sf, true)
|
|
||||||
}
|
|
||||||
s := opts.WithTypeMode(autoType).FormatValue(vv, t.Kind(), ptrs)
|
|
||||||
list = append(list, textRecord{Key: sf.Name, Value: s})
|
|
||||||
}
|
|
||||||
return &textWrap{Prefix: "{", Value: list, Suffix: "}"}
|
|
||||||
case reflect.Slice:
|
|
||||||
if v.IsNil() {
|
|
||||||
return textNil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether this is a []byte of text data.
|
|
||||||
if t.Elem() == byteType {
|
|
||||||
b := v.Bytes()
|
|
||||||
isPrintSpace := func(r rune) bool { return unicode.IsPrint(r) || unicode.IsSpace(r) }
|
|
||||||
if len(b) > 0 && utf8.Valid(b) && len(bytes.TrimFunc(b, isPrintSpace)) == 0 {
|
|
||||||
out = opts.formatString("", string(b))
|
|
||||||
skipType = true
|
|
||||||
return opts.FormatType(t, out)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fallthrough
|
|
||||||
case reflect.Array:
|
|
||||||
maxLen := v.Len()
|
|
||||||
if opts.LimitVerbosity {
|
|
||||||
maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc...
|
|
||||||
opts.VerbosityLevel--
|
|
||||||
}
|
|
||||||
var list textList
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
if len(list) == maxLen {
|
|
||||||
list.AppendEllipsis(diffStats{})
|
|
||||||
break
|
|
||||||
}
|
|
||||||
s := opts.WithTypeMode(elideType).FormatValue(v.Index(i), t.Kind(), ptrs)
|
|
||||||
list = append(list, textRecord{Value: s})
|
|
||||||
}
|
|
||||||
|
|
||||||
out = &textWrap{Prefix: "{", Value: list, Suffix: "}"}
|
|
||||||
if t.Kind() == reflect.Slice && opts.PrintAddresses {
|
|
||||||
header := fmt.Sprintf("ptr:%v, len:%d, cap:%d", formatPointer(value.PointerOf(v), false), v.Len(), v.Cap())
|
|
||||||
out = &textWrap{Prefix: pointerDelimPrefix + header + pointerDelimSuffix, Value: out}
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
case reflect.Map:
|
|
||||||
if v.IsNil() {
|
|
||||||
return textNil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check pointer for cycles.
|
|
||||||
ptrRef, visited := ptrs.Push(v)
|
|
||||||
if visited {
|
|
||||||
return makeLeafReference(ptrRef, opts.PrintAddresses)
|
|
||||||
}
|
|
||||||
defer ptrs.Pop()
|
|
||||||
|
|
||||||
maxLen := v.Len()
|
|
||||||
if opts.LimitVerbosity {
|
|
||||||
maxLen = ((1 << opts.verbosity()) >> 1) << 2 // 0, 4, 8, 16, 32, etc...
|
|
||||||
opts.VerbosityLevel--
|
|
||||||
}
|
|
||||||
var list textList
|
|
||||||
for _, k := range value.SortKeys(v.MapKeys()) {
|
|
||||||
if len(list) == maxLen {
|
|
||||||
list.AppendEllipsis(diffStats{})
|
|
||||||
break
|
|
||||||
}
|
|
||||||
sk := formatMapKey(k, false, ptrs)
|
|
||||||
sv := opts.WithTypeMode(elideType).FormatValue(v.MapIndex(k), t.Kind(), ptrs)
|
|
||||||
list = append(list, textRecord{Key: sk, Value: sv})
|
|
||||||
}
|
|
||||||
|
|
||||||
out = &textWrap{Prefix: "{", Value: list, Suffix: "}"}
|
|
||||||
out = wrapTrunkReference(ptrRef, opts.PrintAddresses, out)
|
|
||||||
return out
|
|
||||||
case reflect.Ptr:
|
|
||||||
if v.IsNil() {
|
|
||||||
return textNil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check pointer for cycles.
|
|
||||||
ptrRef, visited := ptrs.Push(v)
|
|
||||||
if visited {
|
|
||||||
out = makeLeafReference(ptrRef, opts.PrintAddresses)
|
|
||||||
return &textWrap{Prefix: "&", Value: out}
|
|
||||||
}
|
|
||||||
defer ptrs.Pop()
|
|
||||||
|
|
||||||
// Skip the name only if this is an unnamed pointer type.
|
|
||||||
// Otherwise taking the address of a value does not reproduce
|
|
||||||
// the named pointer type.
|
|
||||||
if v.Type().Name() == "" {
|
|
||||||
skipType = true // Let the underlying value print the type instead
|
|
||||||
}
|
|
||||||
out = opts.FormatValue(v.Elem(), t.Kind(), ptrs)
|
|
||||||
out = wrapTrunkReference(ptrRef, opts.PrintAddresses, out)
|
|
||||||
out = &textWrap{Prefix: "&", Value: out}
|
|
||||||
return out
|
|
||||||
case reflect.Interface:
|
|
||||||
if v.IsNil() {
|
|
||||||
return textNil
|
|
||||||
}
|
|
||||||
// Interfaces accept different concrete types,
|
|
||||||
// so configure the underlying value to explicitly print the type.
|
|
||||||
return opts.WithTypeMode(emitType).FormatValue(v.Elem(), t.Kind(), ptrs)
|
|
||||||
default:
|
|
||||||
panic(fmt.Sprintf("%v kind not handled", v.Kind()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (opts formatOptions) formatString(prefix, s string) textNode {
|
|
||||||
maxLen := len(s)
|
|
||||||
maxLines := strings.Count(s, "\n") + 1
|
|
||||||
if opts.LimitVerbosity {
|
|
||||||
maxLen = (1 << opts.verbosity()) << 5 // 32, 64, 128, 256, etc...
|
|
||||||
maxLines = (1 << opts.verbosity()) << 2 // 4, 8, 16, 32, 64, etc...
|
|
||||||
}
|
|
||||||
|
|
||||||
// For multiline strings, use the triple-quote syntax,
|
|
||||||
// but only use it when printing removed or inserted nodes since
|
|
||||||
// we only want the extra verbosity for those cases.
|
|
||||||
lines := strings.Split(strings.TrimSuffix(s, "\n"), "\n")
|
|
||||||
isTripleQuoted := len(lines) >= 4 && (opts.DiffMode == '-' || opts.DiffMode == '+')
|
|
||||||
for i := 0; i < len(lines) && isTripleQuoted; i++ {
|
|
||||||
lines[i] = strings.TrimPrefix(strings.TrimSuffix(lines[i], "\r"), "\r") // trim leading/trailing carriage returns for legacy Windows endline support
|
|
||||||
isPrintable := func(r rune) bool {
|
|
||||||
return unicode.IsPrint(r) || r == '\t' // specially treat tab as printable
|
|
||||||
}
|
|
||||||
line := lines[i]
|
|
||||||
isTripleQuoted = !strings.HasPrefix(strings.TrimPrefix(line, prefix), `"""`) && !strings.HasPrefix(line, "...") && strings.TrimFunc(line, isPrintable) == "" && len(line) <= maxLen
|
|
||||||
}
|
|
||||||
if isTripleQuoted {
|
|
||||||
var list textList
|
|
||||||
list = append(list, textRecord{Diff: opts.DiffMode, Value: textLine(prefix + `"""`), ElideComma: true})
|
|
||||||
for i, line := range lines {
|
|
||||||
if numElided := len(lines) - i; i == maxLines-1 && numElided > 1 {
|
|
||||||
comment := commentString(fmt.Sprintf("%d elided lines", numElided))
|
|
||||||
list = append(list, textRecord{Diff: opts.DiffMode, Value: textEllipsis, ElideComma: true, Comment: comment})
|
|
||||||
break
|
|
||||||
}
|
|
||||||
list = append(list, textRecord{Diff: opts.DiffMode, Value: textLine(line), ElideComma: true})
|
|
||||||
}
|
|
||||||
list = append(list, textRecord{Diff: opts.DiffMode, Value: textLine(prefix + `"""`), ElideComma: true})
|
|
||||||
return &textWrap{Prefix: "(", Value: list, Suffix: ")"}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format the string as a single-line quoted string.
|
|
||||||
if len(s) > maxLen+len(textEllipsis) {
|
|
||||||
return textLine(prefix + formatString(s[:maxLen]) + string(textEllipsis))
|
|
||||||
}
|
|
||||||
return textLine(prefix + formatString(s))
|
|
||||||
}
|
|
||||||
|
|
||||||
// formatMapKey formats v as if it were a map key.
|
|
||||||
// The result is guaranteed to be a single line.
|
|
||||||
func formatMapKey(v reflect.Value, disambiguate bool, ptrs *pointerReferences) string {
|
|
||||||
var opts formatOptions
|
|
||||||
opts.DiffMode = diffIdentical
|
|
||||||
opts.TypeMode = elideType
|
|
||||||
opts.PrintAddresses = disambiguate
|
|
||||||
opts.AvoidStringer = disambiguate
|
|
||||||
opts.QualifiedNames = disambiguate
|
|
||||||
opts.VerbosityLevel = maxVerbosityPreset
|
|
||||||
opts.LimitVerbosity = true
|
|
||||||
s := opts.FormatValue(v, reflect.Map, ptrs).String()
|
|
||||||
return strings.TrimSpace(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// formatString prints s as a double-quoted or backtick-quoted string.
|
|
||||||
func formatString(s string) string {
|
|
||||||
// Use quoted string if it the same length as a raw string literal.
|
|
||||||
// Otherwise, attempt to use the raw string form.
|
|
||||||
qs := strconv.Quote(s)
|
|
||||||
if len(qs) == 1+len(s)+1 {
|
|
||||||
return qs
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disallow newlines to ensure output is a single line.
|
|
||||||
// Only allow printable runes for readability purposes.
|
|
||||||
rawInvalid := func(r rune) bool {
|
|
||||||
return r == '`' || r == '\n' || !(unicode.IsPrint(r) || r == '\t')
|
|
||||||
}
|
|
||||||
if utf8.ValidString(s) && strings.IndexFunc(s, rawInvalid) < 0 {
|
|
||||||
return "`" + s + "`"
|
|
||||||
}
|
|
||||||
return qs
|
|
||||||
}
|
|
||||||
|
|
||||||
// formatHex prints u as a hexadecimal integer in Go notation.
|
|
||||||
func formatHex(u uint64) string {
|
|
||||||
var f string
|
|
||||||
switch {
|
|
||||||
case u <= 0xff:
|
|
||||||
f = "0x%02x"
|
|
||||||
case u <= 0xffff:
|
|
||||||
f = "0x%04x"
|
|
||||||
case u <= 0xffffff:
|
|
||||||
f = "0x%06x"
|
|
||||||
case u <= 0xffffffff:
|
|
||||||
f = "0x%08x"
|
|
||||||
case u <= 0xffffffffff:
|
|
||||||
f = "0x%010x"
|
|
||||||
case u <= 0xffffffffffff:
|
|
||||||
f = "0x%012x"
|
|
||||||
case u <= 0xffffffffffffff:
|
|
||||||
f = "0x%014x"
|
|
||||||
case u <= 0xffffffffffffffff:
|
|
||||||
f = "0x%016x"
|
|
||||||
}
|
|
||||||
return fmt.Sprintf(f, u)
|
|
||||||
}
|
|
614
vendor/github.com/google/go-cmp/cmp/report_slices.go
generated
vendored
614
vendor/github.com/google/go-cmp/cmp/report_slices.go
generated
vendored
|
@ -1,614 +0,0 @@
|
||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/diff"
|
|
||||||
)
|
|
||||||
|
|
||||||
// CanFormatDiffSlice reports whether we support custom formatting for nodes
|
|
||||||
// that are slices of primitive kinds or strings.
|
|
||||||
func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool {
|
|
||||||
switch {
|
|
||||||
case opts.DiffMode != diffUnknown:
|
|
||||||
return false // Must be formatting in diff mode
|
|
||||||
case v.NumDiff == 0:
|
|
||||||
return false // No differences detected
|
|
||||||
case !v.ValueX.IsValid() || !v.ValueY.IsValid():
|
|
||||||
return false // Both values must be valid
|
|
||||||
case v.NumIgnored > 0:
|
|
||||||
return false // Some ignore option was used
|
|
||||||
case v.NumTransformed > 0:
|
|
||||||
return false // Some transform option was used
|
|
||||||
case v.NumCompared > 1:
|
|
||||||
return false // More than one comparison was used
|
|
||||||
case v.NumCompared == 1 && v.Type.Name() != "":
|
|
||||||
// The need for cmp to check applicability of options on every element
|
|
||||||
// in a slice is a significant performance detriment for large []byte.
|
|
||||||
// The workaround is to specify Comparer(bytes.Equal),
|
|
||||||
// which enables cmp to compare []byte more efficiently.
|
|
||||||
// If they differ, we still want to provide batched diffing.
|
|
||||||
// The logic disallows named types since they tend to have their own
|
|
||||||
// String method, with nicer formatting than what this provides.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether this is an interface with the same concrete types.
|
|
||||||
t := v.Type
|
|
||||||
vx, vy := v.ValueX, v.ValueY
|
|
||||||
if t.Kind() == reflect.Interface && !vx.IsNil() && !vy.IsNil() && vx.Elem().Type() == vy.Elem().Type() {
|
|
||||||
vx, vy = vx.Elem(), vy.Elem()
|
|
||||||
t = vx.Type()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check whether we provide specialized diffing for this type.
|
|
||||||
switch t.Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
case reflect.Array, reflect.Slice:
|
|
||||||
// Only slices of primitive types have specialized handling.
|
|
||||||
switch t.Elem().Kind() {
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
|
||||||
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr,
|
|
||||||
reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128:
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Both slice values have to be non-empty.
|
|
||||||
if t.Kind() == reflect.Slice && (vx.Len() == 0 || vy.Len() == 0) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// If a sufficient number of elements already differ,
|
|
||||||
// use specialized formatting even if length requirement is not met.
|
|
||||||
if v.NumDiff > v.NumSame {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use specialized string diffing for longer slices or strings.
|
|
||||||
const minLength = 32
|
|
||||||
return vx.Len() >= minLength && vy.Len() >= minLength
|
|
||||||
}
|
|
||||||
|
|
||||||
// FormatDiffSlice prints a diff for the slices (or strings) represented by v.
|
|
||||||
// This provides custom-tailored logic to make printing of differences in
|
|
||||||
// textual strings and slices of primitive kinds more readable.
|
|
||||||
func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode {
|
|
||||||
assert(opts.DiffMode == diffUnknown)
|
|
||||||
t, vx, vy := v.Type, v.ValueX, v.ValueY
|
|
||||||
if t.Kind() == reflect.Interface {
|
|
||||||
vx, vy = vx.Elem(), vy.Elem()
|
|
||||||
t = vx.Type()
|
|
||||||
opts = opts.WithTypeMode(emitType)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Auto-detect the type of the data.
|
|
||||||
var sx, sy string
|
|
||||||
var ssx, ssy []string
|
|
||||||
var isString, isMostlyText, isPureLinedText, isBinary bool
|
|
||||||
switch {
|
|
||||||
case t.Kind() == reflect.String:
|
|
||||||
sx, sy = vx.String(), vy.String()
|
|
||||||
isString = true
|
|
||||||
case t.Kind() == reflect.Slice && t.Elem() == byteType:
|
|
||||||
sx, sy = string(vx.Bytes()), string(vy.Bytes())
|
|
||||||
isString = true
|
|
||||||
case t.Kind() == reflect.Array:
|
|
||||||
// Arrays need to be addressable for slice operations to work.
|
|
||||||
vx2, vy2 := reflect.New(t).Elem(), reflect.New(t).Elem()
|
|
||||||
vx2.Set(vx)
|
|
||||||
vy2.Set(vy)
|
|
||||||
vx, vy = vx2, vy2
|
|
||||||
}
|
|
||||||
if isString {
|
|
||||||
var numTotalRunes, numValidRunes, numLines, lastLineIdx, maxLineLen int
|
|
||||||
for i, r := range sx + sy {
|
|
||||||
numTotalRunes++
|
|
||||||
if (unicode.IsPrint(r) || unicode.IsSpace(r)) && r != utf8.RuneError {
|
|
||||||
numValidRunes++
|
|
||||||
}
|
|
||||||
if r == '\n' {
|
|
||||||
if maxLineLen < i-lastLineIdx {
|
|
||||||
maxLineLen = i - lastLineIdx
|
|
||||||
}
|
|
||||||
lastLineIdx = i + 1
|
|
||||||
numLines++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isPureText := numValidRunes == numTotalRunes
|
|
||||||
isMostlyText = float64(numValidRunes) > math.Floor(0.90*float64(numTotalRunes))
|
|
||||||
isPureLinedText = isPureText && numLines >= 4 && maxLineLen <= 1024
|
|
||||||
isBinary = !isMostlyText
|
|
||||||
|
|
||||||
// Avoid diffing by lines if it produces a significantly more complex
|
|
||||||
// edit script than diffing by bytes.
|
|
||||||
if isPureLinedText {
|
|
||||||
ssx = strings.Split(sx, "\n")
|
|
||||||
ssy = strings.Split(sy, "\n")
|
|
||||||
esLines := diff.Difference(len(ssx), len(ssy), func(ix, iy int) diff.Result {
|
|
||||||
return diff.BoolResult(ssx[ix] == ssy[iy])
|
|
||||||
})
|
|
||||||
esBytes := diff.Difference(len(sx), len(sy), func(ix, iy int) diff.Result {
|
|
||||||
return diff.BoolResult(sx[ix] == sy[iy])
|
|
||||||
})
|
|
||||||
efficiencyLines := float64(esLines.Dist()) / float64(len(esLines))
|
|
||||||
efficiencyBytes := float64(esBytes.Dist()) / float64(len(esBytes))
|
|
||||||
quotedLength := len(strconv.Quote(sx + sy))
|
|
||||||
unquotedLength := len(sx) + len(sy)
|
|
||||||
escapeExpansionRatio := float64(quotedLength) / float64(unquotedLength)
|
|
||||||
isPureLinedText = efficiencyLines < 4*efficiencyBytes || escapeExpansionRatio > 1.1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format the string into printable records.
|
|
||||||
var list textList
|
|
||||||
var delim string
|
|
||||||
switch {
|
|
||||||
// If the text appears to be multi-lined text,
|
|
||||||
// then perform differencing across individual lines.
|
|
||||||
case isPureLinedText:
|
|
||||||
list = opts.formatDiffSlice(
|
|
||||||
reflect.ValueOf(ssx), reflect.ValueOf(ssy), 1, "line",
|
|
||||||
func(v reflect.Value, d diffMode) textRecord {
|
|
||||||
s := formatString(v.Index(0).String())
|
|
||||||
return textRecord{Diff: d, Value: textLine(s)}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
delim = "\n"
|
|
||||||
|
|
||||||
// If possible, use a custom triple-quote (""") syntax for printing
|
|
||||||
// differences in a string literal. This format is more readable,
|
|
||||||
// but has edge-cases where differences are visually indistinguishable.
|
|
||||||
// This format is avoided under the following conditions:
|
|
||||||
// - A line starts with `"""`
|
|
||||||
// - A line starts with "..."
|
|
||||||
// - A line contains non-printable characters
|
|
||||||
// - Adjacent different lines differ only by whitespace
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// """
|
|
||||||
// ... // 3 identical lines
|
|
||||||
// foo
|
|
||||||
// bar
|
|
||||||
// - baz
|
|
||||||
// + BAZ
|
|
||||||
// """
|
|
||||||
isTripleQuoted := true
|
|
||||||
prevRemoveLines := map[string]bool{}
|
|
||||||
prevInsertLines := map[string]bool{}
|
|
||||||
var list2 textList
|
|
||||||
list2 = append(list2, textRecord{Value: textLine(`"""`), ElideComma: true})
|
|
||||||
for _, r := range list {
|
|
||||||
if !r.Value.Equal(textEllipsis) {
|
|
||||||
line, _ := strconv.Unquote(string(r.Value.(textLine)))
|
|
||||||
line = strings.TrimPrefix(strings.TrimSuffix(line, "\r"), "\r") // trim leading/trailing carriage returns for legacy Windows endline support
|
|
||||||
normLine := strings.Map(func(r rune) rune {
|
|
||||||
if unicode.IsSpace(r) {
|
|
||||||
return -1 // drop whitespace to avoid visually indistinguishable output
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}, line)
|
|
||||||
isPrintable := func(r rune) bool {
|
|
||||||
return unicode.IsPrint(r) || r == '\t' // specially treat tab as printable
|
|
||||||
}
|
|
||||||
isTripleQuoted = !strings.HasPrefix(line, `"""`) && !strings.HasPrefix(line, "...") && strings.TrimFunc(line, isPrintable) == ""
|
|
||||||
switch r.Diff {
|
|
||||||
case diffRemoved:
|
|
||||||
isTripleQuoted = isTripleQuoted && !prevInsertLines[normLine]
|
|
||||||
prevRemoveLines[normLine] = true
|
|
||||||
case diffInserted:
|
|
||||||
isTripleQuoted = isTripleQuoted && !prevRemoveLines[normLine]
|
|
||||||
prevInsertLines[normLine] = true
|
|
||||||
}
|
|
||||||
if !isTripleQuoted {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
r.Value = textLine(line)
|
|
||||||
r.ElideComma = true
|
|
||||||
}
|
|
||||||
if !(r.Diff == diffRemoved || r.Diff == diffInserted) { // start a new non-adjacent difference group
|
|
||||||
prevRemoveLines = map[string]bool{}
|
|
||||||
prevInsertLines = map[string]bool{}
|
|
||||||
}
|
|
||||||
list2 = append(list2, r)
|
|
||||||
}
|
|
||||||
if r := list2[len(list2)-1]; r.Diff == diffIdentical && len(r.Value.(textLine)) == 0 {
|
|
||||||
list2 = list2[:len(list2)-1] // elide single empty line at the end
|
|
||||||
}
|
|
||||||
list2 = append(list2, textRecord{Value: textLine(`"""`), ElideComma: true})
|
|
||||||
if isTripleQuoted {
|
|
||||||
var out textNode = &textWrap{Prefix: "(", Value: list2, Suffix: ")"}
|
|
||||||
switch t.Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
if t != stringType {
|
|
||||||
out = opts.FormatType(t, out)
|
|
||||||
}
|
|
||||||
case reflect.Slice:
|
|
||||||
// Always emit type for slices since the triple-quote syntax
|
|
||||||
// looks like a string (not a slice).
|
|
||||||
opts = opts.WithTypeMode(emitType)
|
|
||||||
out = opts.FormatType(t, out)
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the text appears to be single-lined text,
|
|
||||||
// then perform differencing in approximately fixed-sized chunks.
|
|
||||||
// The output is printed as quoted strings.
|
|
||||||
case isMostlyText:
|
|
||||||
list = opts.formatDiffSlice(
|
|
||||||
reflect.ValueOf(sx), reflect.ValueOf(sy), 64, "byte",
|
|
||||||
func(v reflect.Value, d diffMode) textRecord {
|
|
||||||
s := formatString(v.String())
|
|
||||||
return textRecord{Diff: d, Value: textLine(s)}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
// If the text appears to be binary data,
|
|
||||||
// then perform differencing in approximately fixed-sized chunks.
|
|
||||||
// The output is inspired by hexdump.
|
|
||||||
case isBinary:
|
|
||||||
list = opts.formatDiffSlice(
|
|
||||||
reflect.ValueOf(sx), reflect.ValueOf(sy), 16, "byte",
|
|
||||||
func(v reflect.Value, d diffMode) textRecord {
|
|
||||||
var ss []string
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
ss = append(ss, formatHex(v.Index(i).Uint()))
|
|
||||||
}
|
|
||||||
s := strings.Join(ss, ", ")
|
|
||||||
comment := commentString(fmt.Sprintf("%c|%v|", d, formatASCII(v.String())))
|
|
||||||
return textRecord{Diff: d, Value: textLine(s), Comment: comment}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
// For all other slices of primitive types,
|
|
||||||
// then perform differencing in approximately fixed-sized chunks.
|
|
||||||
// The size of each chunk depends on the width of the element kind.
|
|
||||||
default:
|
|
||||||
var chunkSize int
|
|
||||||
if t.Elem().Kind() == reflect.Bool {
|
|
||||||
chunkSize = 16
|
|
||||||
} else {
|
|
||||||
switch t.Elem().Bits() {
|
|
||||||
case 8:
|
|
||||||
chunkSize = 16
|
|
||||||
case 16:
|
|
||||||
chunkSize = 12
|
|
||||||
case 32:
|
|
||||||
chunkSize = 8
|
|
||||||
default:
|
|
||||||
chunkSize = 8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
list = opts.formatDiffSlice(
|
|
||||||
vx, vy, chunkSize, t.Elem().Kind().String(),
|
|
||||||
func(v reflect.Value, d diffMode) textRecord {
|
|
||||||
var ss []string
|
|
||||||
for i := 0; i < v.Len(); i++ {
|
|
||||||
switch t.Elem().Kind() {
|
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
||||||
ss = append(ss, fmt.Sprint(v.Index(i).Int()))
|
|
||||||
case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
||||||
ss = append(ss, fmt.Sprint(v.Index(i).Uint()))
|
|
||||||
case reflect.Uint8, reflect.Uintptr:
|
|
||||||
ss = append(ss, formatHex(v.Index(i).Uint()))
|
|
||||||
case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128:
|
|
||||||
ss = append(ss, fmt.Sprint(v.Index(i).Interface()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s := strings.Join(ss, ", ")
|
|
||||||
return textRecord{Diff: d, Value: textLine(s)}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wrap the output with appropriate type information.
|
|
||||||
var out textNode = &textWrap{Prefix: "{", Value: list, Suffix: "}"}
|
|
||||||
if !isMostlyText {
|
|
||||||
// The "{...}" byte-sequence literal is not valid Go syntax for strings.
|
|
||||||
// Emit the type for extra clarity (e.g. "string{...}").
|
|
||||||
if t.Kind() == reflect.String {
|
|
||||||
opts = opts.WithTypeMode(emitType)
|
|
||||||
}
|
|
||||||
return opts.FormatType(t, out)
|
|
||||||
}
|
|
||||||
switch t.Kind() {
|
|
||||||
case reflect.String:
|
|
||||||
out = &textWrap{Prefix: "strings.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)}
|
|
||||||
if t != stringType {
|
|
||||||
out = opts.FormatType(t, out)
|
|
||||||
}
|
|
||||||
case reflect.Slice:
|
|
||||||
out = &textWrap{Prefix: "bytes.Join(", Value: out, Suffix: fmt.Sprintf(", %q)", delim)}
|
|
||||||
if t != bytesType {
|
|
||||||
out = opts.FormatType(t, out)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out
|
|
||||||
}
|
|
||||||
|
|
||||||
// formatASCII formats s as an ASCII string.
|
|
||||||
// This is useful for printing binary strings in a semi-legible way.
|
|
||||||
func formatASCII(s string) string {
|
|
||||||
b := bytes.Repeat([]byte{'.'}, len(s))
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
if ' ' <= s[i] && s[i] <= '~' {
|
|
||||||
b[i] = s[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return string(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (opts formatOptions) formatDiffSlice(
|
|
||||||
vx, vy reflect.Value, chunkSize int, name string,
|
|
||||||
makeRec func(reflect.Value, diffMode) textRecord,
|
|
||||||
) (list textList) {
|
|
||||||
eq := func(ix, iy int) bool {
|
|
||||||
return vx.Index(ix).Interface() == vy.Index(iy).Interface()
|
|
||||||
}
|
|
||||||
es := diff.Difference(vx.Len(), vy.Len(), func(ix, iy int) diff.Result {
|
|
||||||
return diff.BoolResult(eq(ix, iy))
|
|
||||||
})
|
|
||||||
|
|
||||||
appendChunks := func(v reflect.Value, d diffMode) int {
|
|
||||||
n0 := v.Len()
|
|
||||||
for v.Len() > 0 {
|
|
||||||
n := chunkSize
|
|
||||||
if n > v.Len() {
|
|
||||||
n = v.Len()
|
|
||||||
}
|
|
||||||
list = append(list, makeRec(v.Slice(0, n), d))
|
|
||||||
v = v.Slice(n, v.Len())
|
|
||||||
}
|
|
||||||
return n0 - v.Len()
|
|
||||||
}
|
|
||||||
|
|
||||||
var numDiffs int
|
|
||||||
maxLen := -1
|
|
||||||
if opts.LimitVerbosity {
|
|
||||||
maxLen = (1 << opts.verbosity()) << 2 // 4, 8, 16, 32, 64, etc...
|
|
||||||
opts.VerbosityLevel--
|
|
||||||
}
|
|
||||||
|
|
||||||
groups := coalesceAdjacentEdits(name, es)
|
|
||||||
groups = coalesceInterveningIdentical(groups, chunkSize/4)
|
|
||||||
groups = cleanupSurroundingIdentical(groups, eq)
|
|
||||||
maxGroup := diffStats{Name: name}
|
|
||||||
for i, ds := range groups {
|
|
||||||
if maxLen >= 0 && numDiffs >= maxLen {
|
|
||||||
maxGroup = maxGroup.Append(ds)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print equal.
|
|
||||||
if ds.NumDiff() == 0 {
|
|
||||||
// Compute the number of leading and trailing equal bytes to print.
|
|
||||||
var numLo, numHi int
|
|
||||||
numEqual := ds.NumIgnored + ds.NumIdentical
|
|
||||||
for numLo < chunkSize*numContextRecords && numLo+numHi < numEqual && i != 0 {
|
|
||||||
numLo++
|
|
||||||
}
|
|
||||||
for numHi < chunkSize*numContextRecords && numLo+numHi < numEqual && i != len(groups)-1 {
|
|
||||||
numHi++
|
|
||||||
}
|
|
||||||
if numEqual-(numLo+numHi) <= chunkSize && ds.NumIgnored == 0 {
|
|
||||||
numHi = numEqual - numLo // Avoid pointless coalescing of single equal row
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print the equal bytes.
|
|
||||||
appendChunks(vx.Slice(0, numLo), diffIdentical)
|
|
||||||
if numEqual > numLo+numHi {
|
|
||||||
ds.NumIdentical -= numLo + numHi
|
|
||||||
list.AppendEllipsis(ds)
|
|
||||||
}
|
|
||||||
appendChunks(vx.Slice(numEqual-numHi, numEqual), diffIdentical)
|
|
||||||
vx = vx.Slice(numEqual, vx.Len())
|
|
||||||
vy = vy.Slice(numEqual, vy.Len())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print unequal.
|
|
||||||
len0 := len(list)
|
|
||||||
nx := appendChunks(vx.Slice(0, ds.NumIdentical+ds.NumRemoved+ds.NumModified), diffRemoved)
|
|
||||||
vx = vx.Slice(nx, vx.Len())
|
|
||||||
ny := appendChunks(vy.Slice(0, ds.NumIdentical+ds.NumInserted+ds.NumModified), diffInserted)
|
|
||||||
vy = vy.Slice(ny, vy.Len())
|
|
||||||
numDiffs += len(list) - len0
|
|
||||||
}
|
|
||||||
if maxGroup.IsZero() {
|
|
||||||
assert(vx.Len() == 0 && vy.Len() == 0)
|
|
||||||
} else {
|
|
||||||
list.AppendEllipsis(maxGroup)
|
|
||||||
}
|
|
||||||
return list
|
|
||||||
}
|
|
||||||
|
|
||||||
// coalesceAdjacentEdits coalesces the list of edits into groups of adjacent
|
|
||||||
// equal or unequal counts.
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
//
|
|
||||||
// Input: "..XXY...Y"
|
|
||||||
// Output: [
|
|
||||||
// {NumIdentical: 2},
|
|
||||||
// {NumRemoved: 2, NumInserted 1},
|
|
||||||
// {NumIdentical: 3},
|
|
||||||
// {NumInserted: 1},
|
|
||||||
// ]
|
|
||||||
func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) {
|
|
||||||
var prevMode byte
|
|
||||||
lastStats := func(mode byte) *diffStats {
|
|
||||||
if prevMode != mode {
|
|
||||||
groups = append(groups, diffStats{Name: name})
|
|
||||||
prevMode = mode
|
|
||||||
}
|
|
||||||
return &groups[len(groups)-1]
|
|
||||||
}
|
|
||||||
for _, e := range es {
|
|
||||||
switch e {
|
|
||||||
case diff.Identity:
|
|
||||||
lastStats('=').NumIdentical++
|
|
||||||
case diff.UniqueX:
|
|
||||||
lastStats('!').NumRemoved++
|
|
||||||
case diff.UniqueY:
|
|
||||||
lastStats('!').NumInserted++
|
|
||||||
case diff.Modified:
|
|
||||||
lastStats('!').NumModified++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return groups
|
|
||||||
}
|
|
||||||
|
|
||||||
// coalesceInterveningIdentical coalesces sufficiently short (<= windowSize)
|
|
||||||
// equal groups into adjacent unequal groups that currently result in a
|
|
||||||
// dual inserted/removed printout. This acts as a high-pass filter to smooth
|
|
||||||
// out high-frequency changes within the windowSize.
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
//
|
|
||||||
// WindowSize: 16,
|
|
||||||
// Input: [
|
|
||||||
// {NumIdentical: 61}, // group 0
|
|
||||||
// {NumRemoved: 3, NumInserted: 1}, // group 1
|
|
||||||
// {NumIdentical: 6}, // ├── coalesce
|
|
||||||
// {NumInserted: 2}, // ├── coalesce
|
|
||||||
// {NumIdentical: 1}, // ├── coalesce
|
|
||||||
// {NumRemoved: 9}, // └── coalesce
|
|
||||||
// {NumIdentical: 64}, // group 2
|
|
||||||
// {NumRemoved: 3, NumInserted: 1}, // group 3
|
|
||||||
// {NumIdentical: 6}, // ├── coalesce
|
|
||||||
// {NumInserted: 2}, // ├── coalesce
|
|
||||||
// {NumIdentical: 1}, // ├── coalesce
|
|
||||||
// {NumRemoved: 7}, // ├── coalesce
|
|
||||||
// {NumIdentical: 1}, // ├── coalesce
|
|
||||||
// {NumRemoved: 2}, // └── coalesce
|
|
||||||
// {NumIdentical: 63}, // group 4
|
|
||||||
// ]
|
|
||||||
// Output: [
|
|
||||||
// {NumIdentical: 61},
|
|
||||||
// {NumIdentical: 7, NumRemoved: 12, NumInserted: 3},
|
|
||||||
// {NumIdentical: 64},
|
|
||||||
// {NumIdentical: 8, NumRemoved: 12, NumInserted: 3},
|
|
||||||
// {NumIdentical: 63},
|
|
||||||
// ]
|
|
||||||
func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStats {
|
|
||||||
groups, groupsOrig := groups[:0], groups
|
|
||||||
for i, ds := range groupsOrig {
|
|
||||||
if len(groups) >= 2 && ds.NumDiff() > 0 {
|
|
||||||
prev := &groups[len(groups)-2] // Unequal group
|
|
||||||
curr := &groups[len(groups)-1] // Equal group
|
|
||||||
next := &groupsOrig[i] // Unequal group
|
|
||||||
hadX, hadY := prev.NumRemoved > 0, prev.NumInserted > 0
|
|
||||||
hasX, hasY := next.NumRemoved > 0, next.NumInserted > 0
|
|
||||||
if ((hadX || hasX) && (hadY || hasY)) && curr.NumIdentical <= windowSize {
|
|
||||||
*prev = prev.Append(*curr).Append(*next)
|
|
||||||
groups = groups[:len(groups)-1] // Truncate off equal group
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
groups = append(groups, ds)
|
|
||||||
}
|
|
||||||
return groups
|
|
||||||
}
|
|
||||||
|
|
||||||
// cleanupSurroundingIdentical scans through all unequal groups, and
|
|
||||||
// moves any leading sequence of equal elements to the preceding equal group and
|
|
||||||
// moves and trailing sequence of equal elements to the succeeding equal group.
|
|
||||||
//
|
|
||||||
// This is necessary since coalesceInterveningIdentical may coalesce edit groups
|
|
||||||
// together such that leading/trailing spans of equal elements becomes possible.
|
|
||||||
// Note that this can occur even with an optimal diffing algorithm.
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
//
|
|
||||||
// Input: [
|
|
||||||
// {NumIdentical: 61},
|
|
||||||
// {NumIdentical: 1 , NumRemoved: 11, NumInserted: 2}, // assume 3 leading identical elements
|
|
||||||
// {NumIdentical: 67},
|
|
||||||
// {NumIdentical: 7, NumRemoved: 12, NumInserted: 3}, // assume 10 trailing identical elements
|
|
||||||
// {NumIdentical: 54},
|
|
||||||
// ]
|
|
||||||
// Output: [
|
|
||||||
// {NumIdentical: 64}, // incremented by 3
|
|
||||||
// {NumRemoved: 9},
|
|
||||||
// {NumIdentical: 67},
|
|
||||||
// {NumRemoved: 9},
|
|
||||||
// {NumIdentical: 64}, // incremented by 10
|
|
||||||
// ]
|
|
||||||
func cleanupSurroundingIdentical(groups []diffStats, eq func(i, j int) bool) []diffStats {
|
|
||||||
var ix, iy int // indexes into sequence x and y
|
|
||||||
for i, ds := range groups {
|
|
||||||
// Handle equal group.
|
|
||||||
if ds.NumDiff() == 0 {
|
|
||||||
ix += ds.NumIdentical
|
|
||||||
iy += ds.NumIdentical
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle unequal group.
|
|
||||||
nx := ds.NumIdentical + ds.NumRemoved + ds.NumModified
|
|
||||||
ny := ds.NumIdentical + ds.NumInserted + ds.NumModified
|
|
||||||
var numLeadingIdentical, numTrailingIdentical int
|
|
||||||
for j := 0; j < nx && j < ny && eq(ix+j, iy+j); j++ {
|
|
||||||
numLeadingIdentical++
|
|
||||||
}
|
|
||||||
for j := 0; j < nx && j < ny && eq(ix+nx-1-j, iy+ny-1-j); j++ {
|
|
||||||
numTrailingIdentical++
|
|
||||||
}
|
|
||||||
if numIdentical := numLeadingIdentical + numTrailingIdentical; numIdentical > 0 {
|
|
||||||
if numLeadingIdentical > 0 {
|
|
||||||
// Remove leading identical span from this group and
|
|
||||||
// insert it into the preceding group.
|
|
||||||
if i-1 >= 0 {
|
|
||||||
groups[i-1].NumIdentical += numLeadingIdentical
|
|
||||||
} else {
|
|
||||||
// No preceding group exists, so prepend a new group,
|
|
||||||
// but do so after we finish iterating over all groups.
|
|
||||||
defer func() {
|
|
||||||
groups = append([]diffStats{{Name: groups[0].Name, NumIdentical: numLeadingIdentical}}, groups...)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
// Increment indexes since the preceding group would have handled this.
|
|
||||||
ix += numLeadingIdentical
|
|
||||||
iy += numLeadingIdentical
|
|
||||||
}
|
|
||||||
if numTrailingIdentical > 0 {
|
|
||||||
// Remove trailing identical span from this group and
|
|
||||||
// insert it into the succeeding group.
|
|
||||||
if i+1 < len(groups) {
|
|
||||||
groups[i+1].NumIdentical += numTrailingIdentical
|
|
||||||
} else {
|
|
||||||
// No succeeding group exists, so append a new group,
|
|
||||||
// but do so after we finish iterating over all groups.
|
|
||||||
defer func() {
|
|
||||||
groups = append(groups, diffStats{Name: groups[len(groups)-1].Name, NumIdentical: numTrailingIdentical})
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
// Do not increment indexes since the succeeding group will handle this.
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update this group since some identical elements were removed.
|
|
||||||
nx -= numIdentical
|
|
||||||
ny -= numIdentical
|
|
||||||
groups[i] = diffStats{Name: ds.Name, NumRemoved: nx, NumInserted: ny}
|
|
||||||
}
|
|
||||||
ix += nx
|
|
||||||
iy += ny
|
|
||||||
}
|
|
||||||
return groups
|
|
||||||
}
|
|
432
vendor/github.com/google/go-cmp/cmp/report_text.go
generated
vendored
432
vendor/github.com/google/go-cmp/cmp/report_text.go
generated
vendored
|
@ -1,432 +0,0 @@
|
||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"math/rand"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
"unicode/utf8"
|
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp/internal/flags"
|
|
||||||
)
|
|
||||||
|
|
||||||
var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0
|
|
||||||
|
|
||||||
const maxColumnLength = 80
|
|
||||||
|
|
||||||
type indentMode int
|
|
||||||
|
|
||||||
func (n indentMode) appendIndent(b []byte, d diffMode) []byte {
|
|
||||||
// The output of Diff is documented as being unstable to provide future
|
|
||||||
// flexibility in changing the output for more humanly readable reports.
|
|
||||||
// This logic intentionally introduces instability to the exact output
|
|
||||||
// so that users can detect accidental reliance on stability early on,
|
|
||||||
// rather than much later when an actual change to the format occurs.
|
|
||||||
if flags.Deterministic || randBool {
|
|
||||||
// Use regular spaces (U+0020).
|
|
||||||
switch d {
|
|
||||||
case diffUnknown, diffIdentical:
|
|
||||||
b = append(b, " "...)
|
|
||||||
case diffRemoved:
|
|
||||||
b = append(b, "- "...)
|
|
||||||
case diffInserted:
|
|
||||||
b = append(b, "+ "...)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Use non-breaking spaces (U+00a0).
|
|
||||||
switch d {
|
|
||||||
case diffUnknown, diffIdentical:
|
|
||||||
b = append(b, " "...)
|
|
||||||
case diffRemoved:
|
|
||||||
b = append(b, "- "...)
|
|
||||||
case diffInserted:
|
|
||||||
b = append(b, "+ "...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return repeatCount(n).appendChar(b, '\t')
|
|
||||||
}
|
|
||||||
|
|
||||||
type repeatCount int
|
|
||||||
|
|
||||||
func (n repeatCount) appendChar(b []byte, c byte) []byte {
|
|
||||||
for ; n > 0; n-- {
|
|
||||||
b = append(b, c)
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// textNode is a simplified tree-based representation of structured text.
|
|
||||||
// Possible node types are textWrap, textList, or textLine.
|
|
||||||
type textNode interface {
|
|
||||||
// Len reports the length in bytes of a single-line version of the tree.
|
|
||||||
// Nested textRecord.Diff and textRecord.Comment fields are ignored.
|
|
||||||
Len() int
|
|
||||||
// Equal reports whether the two trees are structurally identical.
|
|
||||||
// Nested textRecord.Diff and textRecord.Comment fields are compared.
|
|
||||||
Equal(textNode) bool
|
|
||||||
// String returns the string representation of the text tree.
|
|
||||||
// It is not guaranteed that len(x.String()) == x.Len(),
|
|
||||||
// nor that x.String() == y.String() implies that x.Equal(y).
|
|
||||||
String() string
|
|
||||||
|
|
||||||
// formatCompactTo formats the contents of the tree as a single-line string
|
|
||||||
// to the provided buffer. Any nested textRecord.Diff and textRecord.Comment
|
|
||||||
// fields are ignored.
|
|
||||||
//
|
|
||||||
// However, not all nodes in the tree should be collapsed as a single-line.
|
|
||||||
// If a node can be collapsed as a single-line, it is replaced by a textLine
|
|
||||||
// node. Since the top-level node cannot replace itself, this also returns
|
|
||||||
// the current node itself.
|
|
||||||
//
|
|
||||||
// This does not mutate the receiver.
|
|
||||||
formatCompactTo([]byte, diffMode) ([]byte, textNode)
|
|
||||||
// formatExpandedTo formats the contents of the tree as a multi-line string
|
|
||||||
// to the provided buffer. In order for column alignment to operate well,
|
|
||||||
// formatCompactTo must be called before calling formatExpandedTo.
|
|
||||||
formatExpandedTo([]byte, diffMode, indentMode) []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// textWrap is a wrapper that concatenates a prefix and/or a suffix
|
|
||||||
// to the underlying node.
|
|
||||||
type textWrap struct {
|
|
||||||
Prefix string // e.g., "bytes.Buffer{"
|
|
||||||
Value textNode // textWrap | textList | textLine
|
|
||||||
Suffix string // e.g., "}"
|
|
||||||
Metadata interface{} // arbitrary metadata; has no effect on formatting
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *textWrap) Len() int {
|
|
||||||
return len(s.Prefix) + s.Value.Len() + len(s.Suffix)
|
|
||||||
}
|
|
||||||
func (s1 *textWrap) Equal(s2 textNode) bool {
|
|
||||||
if s2, ok := s2.(*textWrap); ok {
|
|
||||||
return s1.Prefix == s2.Prefix && s1.Value.Equal(s2.Value) && s1.Suffix == s2.Suffix
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
func (s *textWrap) String() string {
|
|
||||||
var d diffMode
|
|
||||||
var n indentMode
|
|
||||||
_, s2 := s.formatCompactTo(nil, d)
|
|
||||||
b := n.appendIndent(nil, d) // Leading indent
|
|
||||||
b = s2.formatExpandedTo(b, d, n) // Main body
|
|
||||||
b = append(b, '\n') // Trailing newline
|
|
||||||
return string(b)
|
|
||||||
}
|
|
||||||
func (s *textWrap) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) {
|
|
||||||
n0 := len(b) // Original buffer length
|
|
||||||
b = append(b, s.Prefix...)
|
|
||||||
b, s.Value = s.Value.formatCompactTo(b, d)
|
|
||||||
b = append(b, s.Suffix...)
|
|
||||||
if _, ok := s.Value.(textLine); ok {
|
|
||||||
return b, textLine(b[n0:])
|
|
||||||
}
|
|
||||||
return b, s
|
|
||||||
}
|
|
||||||
func (s *textWrap) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte {
|
|
||||||
b = append(b, s.Prefix...)
|
|
||||||
b = s.Value.formatExpandedTo(b, d, n)
|
|
||||||
b = append(b, s.Suffix...)
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// textList is a comma-separated list of textWrap or textLine nodes.
|
|
||||||
// The list may be formatted as multi-lines or single-line at the discretion
|
|
||||||
// of the textList.formatCompactTo method.
|
|
||||||
type textList []textRecord
|
|
||||||
type textRecord struct {
|
|
||||||
Diff diffMode // e.g., 0 or '-' or '+'
|
|
||||||
Key string // e.g., "MyField"
|
|
||||||
Value textNode // textWrap | textLine
|
|
||||||
ElideComma bool // avoid trailing comma
|
|
||||||
Comment fmt.Stringer // e.g., "6 identical fields"
|
|
||||||
}
|
|
||||||
|
|
||||||
// AppendEllipsis appends a new ellipsis node to the list if none already
|
|
||||||
// exists at the end. If cs is non-zero it coalesces the statistics with the
|
|
||||||
// previous diffStats.
|
|
||||||
func (s *textList) AppendEllipsis(ds diffStats) {
|
|
||||||
hasStats := !ds.IsZero()
|
|
||||||
if len(*s) == 0 || !(*s)[len(*s)-1].Value.Equal(textEllipsis) {
|
|
||||||
if hasStats {
|
|
||||||
*s = append(*s, textRecord{Value: textEllipsis, ElideComma: true, Comment: ds})
|
|
||||||
} else {
|
|
||||||
*s = append(*s, textRecord{Value: textEllipsis, ElideComma: true})
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if hasStats {
|
|
||||||
(*s)[len(*s)-1].Comment = (*s)[len(*s)-1].Comment.(diffStats).Append(ds)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s textList) Len() (n int) {
|
|
||||||
for i, r := range s {
|
|
||||||
n += len(r.Key)
|
|
||||||
if r.Key != "" {
|
|
||||||
n += len(": ")
|
|
||||||
}
|
|
||||||
n += r.Value.Len()
|
|
||||||
if i < len(s)-1 {
|
|
||||||
n += len(", ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s1 textList) Equal(s2 textNode) bool {
|
|
||||||
if s2, ok := s2.(textList); ok {
|
|
||||||
if len(s1) != len(s2) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for i := range s1 {
|
|
||||||
r1, r2 := s1[i], s2[i]
|
|
||||||
if !(r1.Diff == r2.Diff && r1.Key == r2.Key && r1.Value.Equal(r2.Value) && r1.Comment == r2.Comment) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s textList) String() string {
|
|
||||||
return (&textWrap{Prefix: "{", Value: s, Suffix: "}"}).String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s textList) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) {
|
|
||||||
s = append(textList(nil), s...) // Avoid mutating original
|
|
||||||
|
|
||||||
// Determine whether we can collapse this list as a single line.
|
|
||||||
n0 := len(b) // Original buffer length
|
|
||||||
var multiLine bool
|
|
||||||
for i, r := range s {
|
|
||||||
if r.Diff == diffInserted || r.Diff == diffRemoved {
|
|
||||||
multiLine = true
|
|
||||||
}
|
|
||||||
b = append(b, r.Key...)
|
|
||||||
if r.Key != "" {
|
|
||||||
b = append(b, ": "...)
|
|
||||||
}
|
|
||||||
b, s[i].Value = r.Value.formatCompactTo(b, d|r.Diff)
|
|
||||||
if _, ok := s[i].Value.(textLine); !ok {
|
|
||||||
multiLine = true
|
|
||||||
}
|
|
||||||
if r.Comment != nil {
|
|
||||||
multiLine = true
|
|
||||||
}
|
|
||||||
if i < len(s)-1 {
|
|
||||||
b = append(b, ", "...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Force multi-lined output when printing a removed/inserted node that
|
|
||||||
// is sufficiently long.
|
|
||||||
if (d == diffInserted || d == diffRemoved) && len(b[n0:]) > maxColumnLength {
|
|
||||||
multiLine = true
|
|
||||||
}
|
|
||||||
if !multiLine {
|
|
||||||
return b, textLine(b[n0:])
|
|
||||||
}
|
|
||||||
return b, s
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s textList) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte {
|
|
||||||
alignKeyLens := s.alignLens(
|
|
||||||
func(r textRecord) bool {
|
|
||||||
_, isLine := r.Value.(textLine)
|
|
||||||
return r.Key == "" || !isLine
|
|
||||||
},
|
|
||||||
func(r textRecord) int { return utf8.RuneCountInString(r.Key) },
|
|
||||||
)
|
|
||||||
alignValueLens := s.alignLens(
|
|
||||||
func(r textRecord) bool {
|
|
||||||
_, isLine := r.Value.(textLine)
|
|
||||||
return !isLine || r.Value.Equal(textEllipsis) || r.Comment == nil
|
|
||||||
},
|
|
||||||
func(r textRecord) int { return utf8.RuneCount(r.Value.(textLine)) },
|
|
||||||
)
|
|
||||||
|
|
||||||
// Format lists of simple lists in a batched form.
|
|
||||||
// If the list is sequence of only textLine values,
|
|
||||||
// then batch multiple values on a single line.
|
|
||||||
var isSimple bool
|
|
||||||
for _, r := range s {
|
|
||||||
_, isLine := r.Value.(textLine)
|
|
||||||
isSimple = r.Diff == 0 && r.Key == "" && isLine && r.Comment == nil
|
|
||||||
if !isSimple {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if isSimple {
|
|
||||||
n++
|
|
||||||
var batch []byte
|
|
||||||
emitBatch := func() {
|
|
||||||
if len(batch) > 0 {
|
|
||||||
b = n.appendIndent(append(b, '\n'), d)
|
|
||||||
b = append(b, bytes.TrimRight(batch, " ")...)
|
|
||||||
batch = batch[:0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, r := range s {
|
|
||||||
line := r.Value.(textLine)
|
|
||||||
if len(batch)+len(line)+len(", ") > maxColumnLength {
|
|
||||||
emitBatch()
|
|
||||||
}
|
|
||||||
batch = append(batch, line...)
|
|
||||||
batch = append(batch, ", "...)
|
|
||||||
}
|
|
||||||
emitBatch()
|
|
||||||
n--
|
|
||||||
return n.appendIndent(append(b, '\n'), d)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format the list as a multi-lined output.
|
|
||||||
n++
|
|
||||||
for i, r := range s {
|
|
||||||
b = n.appendIndent(append(b, '\n'), d|r.Diff)
|
|
||||||
if r.Key != "" {
|
|
||||||
b = append(b, r.Key+": "...)
|
|
||||||
}
|
|
||||||
b = alignKeyLens[i].appendChar(b, ' ')
|
|
||||||
|
|
||||||
b = r.Value.formatExpandedTo(b, d|r.Diff, n)
|
|
||||||
if !r.ElideComma {
|
|
||||||
b = append(b, ',')
|
|
||||||
}
|
|
||||||
b = alignValueLens[i].appendChar(b, ' ')
|
|
||||||
|
|
||||||
if r.Comment != nil {
|
|
||||||
b = append(b, " // "+r.Comment.String()...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
n--
|
|
||||||
|
|
||||||
return n.appendIndent(append(b, '\n'), d)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s textList) alignLens(
|
|
||||||
skipFunc func(textRecord) bool,
|
|
||||||
lenFunc func(textRecord) int,
|
|
||||||
) []repeatCount {
|
|
||||||
var startIdx, endIdx, maxLen int
|
|
||||||
lens := make([]repeatCount, len(s))
|
|
||||||
for i, r := range s {
|
|
||||||
if skipFunc(r) {
|
|
||||||
for j := startIdx; j < endIdx && j < len(s); j++ {
|
|
||||||
lens[j] = repeatCount(maxLen - lenFunc(s[j]))
|
|
||||||
}
|
|
||||||
startIdx, endIdx, maxLen = i+1, i+1, 0
|
|
||||||
} else {
|
|
||||||
if maxLen < lenFunc(r) {
|
|
||||||
maxLen = lenFunc(r)
|
|
||||||
}
|
|
||||||
endIdx = i + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for j := startIdx; j < endIdx && j < len(s); j++ {
|
|
||||||
lens[j] = repeatCount(maxLen - lenFunc(s[j]))
|
|
||||||
}
|
|
||||||
return lens
|
|
||||||
}
|
|
||||||
|
|
||||||
// textLine is a single-line segment of text and is always a leaf node
|
|
||||||
// in the textNode tree.
|
|
||||||
type textLine []byte
|
|
||||||
|
|
||||||
var (
|
|
||||||
textNil = textLine("nil")
|
|
||||||
textEllipsis = textLine("...")
|
|
||||||
)
|
|
||||||
|
|
||||||
func (s textLine) Len() int {
|
|
||||||
return len(s)
|
|
||||||
}
|
|
||||||
func (s1 textLine) Equal(s2 textNode) bool {
|
|
||||||
if s2, ok := s2.(textLine); ok {
|
|
||||||
return bytes.Equal([]byte(s1), []byte(s2))
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
func (s textLine) String() string {
|
|
||||||
return string(s)
|
|
||||||
}
|
|
||||||
func (s textLine) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) {
|
|
||||||
return append(b, s...), s
|
|
||||||
}
|
|
||||||
func (s textLine) formatExpandedTo(b []byte, _ diffMode, _ indentMode) []byte {
|
|
||||||
return append(b, s...)
|
|
||||||
}
|
|
||||||
|
|
||||||
type diffStats struct {
|
|
||||||
Name string
|
|
||||||
NumIgnored int
|
|
||||||
NumIdentical int
|
|
||||||
NumRemoved int
|
|
||||||
NumInserted int
|
|
||||||
NumModified int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s diffStats) IsZero() bool {
|
|
||||||
s.Name = ""
|
|
||||||
return s == diffStats{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s diffStats) NumDiff() int {
|
|
||||||
return s.NumRemoved + s.NumInserted + s.NumModified
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s diffStats) Append(ds diffStats) diffStats {
|
|
||||||
assert(s.Name == ds.Name)
|
|
||||||
s.NumIgnored += ds.NumIgnored
|
|
||||||
s.NumIdentical += ds.NumIdentical
|
|
||||||
s.NumRemoved += ds.NumRemoved
|
|
||||||
s.NumInserted += ds.NumInserted
|
|
||||||
s.NumModified += ds.NumModified
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// String prints a humanly-readable summary of coalesced records.
|
|
||||||
//
|
|
||||||
// Example:
|
|
||||||
//
|
|
||||||
// diffStats{Name: "Field", NumIgnored: 5}.String() => "5 ignored fields"
|
|
||||||
func (s diffStats) String() string {
|
|
||||||
var ss []string
|
|
||||||
var sum int
|
|
||||||
labels := [...]string{"ignored", "identical", "removed", "inserted", "modified"}
|
|
||||||
counts := [...]int{s.NumIgnored, s.NumIdentical, s.NumRemoved, s.NumInserted, s.NumModified}
|
|
||||||
for i, n := range counts {
|
|
||||||
if n > 0 {
|
|
||||||
ss = append(ss, fmt.Sprintf("%d %v", n, labels[i]))
|
|
||||||
}
|
|
||||||
sum += n
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pluralize the name (adjusting for some obscure English grammar rules).
|
|
||||||
name := s.Name
|
|
||||||
if sum > 1 {
|
|
||||||
name += "s"
|
|
||||||
if strings.HasSuffix(name, "ys") {
|
|
||||||
name = name[:len(name)-2] + "ies" // e.g., "entrys" => "entries"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format the list according to English grammar (with Oxford comma).
|
|
||||||
switch n := len(ss); n {
|
|
||||||
case 0:
|
|
||||||
return ""
|
|
||||||
case 1, 2:
|
|
||||||
return strings.Join(ss, " and ") + " " + name
|
|
||||||
default:
|
|
||||||
return strings.Join(ss[:n-1], ", ") + ", and " + ss[n-1] + " " + name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type commentString string
|
|
||||||
|
|
||||||
func (s commentString) String() string { return string(s) }
|
|
121
vendor/github.com/google/go-cmp/cmp/report_value.go
generated
vendored
121
vendor/github.com/google/go-cmp/cmp/report_value.go
generated
vendored
|
@ -1,121 +0,0 @@
|
||||||
// Copyright 2019, The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package cmp
|
|
||||||
|
|
||||||
import "reflect"
|
|
||||||
|
|
||||||
// valueNode represents a single node within a report, which is a
|
|
||||||
// structured representation of the value tree, containing information
|
|
||||||
// regarding which nodes are equal or not.
|
|
||||||
type valueNode struct {
|
|
||||||
parent *valueNode
|
|
||||||
|
|
||||||
Type reflect.Type
|
|
||||||
ValueX reflect.Value
|
|
||||||
ValueY reflect.Value
|
|
||||||
|
|
||||||
// NumSame is the number of leaf nodes that are equal.
|
|
||||||
// All descendants are equal only if NumDiff is 0.
|
|
||||||
NumSame int
|
|
||||||
// NumDiff is the number of leaf nodes that are not equal.
|
|
||||||
NumDiff int
|
|
||||||
// NumIgnored is the number of leaf nodes that are ignored.
|
|
||||||
NumIgnored int
|
|
||||||
// NumCompared is the number of leaf nodes that were compared
|
|
||||||
// using an Equal method or Comparer function.
|
|
||||||
NumCompared int
|
|
||||||
// NumTransformed is the number of non-leaf nodes that were transformed.
|
|
||||||
NumTransformed int
|
|
||||||
// NumChildren is the number of transitive descendants of this node.
|
|
||||||
// This counts from zero; thus, leaf nodes have no descendants.
|
|
||||||
NumChildren int
|
|
||||||
// MaxDepth is the maximum depth of the tree. This counts from zero;
|
|
||||||
// thus, leaf nodes have a depth of zero.
|
|
||||||
MaxDepth int
|
|
||||||
|
|
||||||
// Records is a list of struct fields, slice elements, or map entries.
|
|
||||||
Records []reportRecord // If populated, implies Value is not populated
|
|
||||||
|
|
||||||
// Value is the result of a transformation, pointer indirect, of
|
|
||||||
// type assertion.
|
|
||||||
Value *valueNode // If populated, implies Records is not populated
|
|
||||||
|
|
||||||
// TransformerName is the name of the transformer.
|
|
||||||
TransformerName string // If non-empty, implies Value is populated
|
|
||||||
}
|
|
||||||
type reportRecord struct {
|
|
||||||
Key reflect.Value // Invalid for slice element
|
|
||||||
Value *valueNode
|
|
||||||
}
|
|
||||||
|
|
||||||
func (parent *valueNode) PushStep(ps PathStep) (child *valueNode) {
|
|
||||||
vx, vy := ps.Values()
|
|
||||||
child = &valueNode{parent: parent, Type: ps.Type(), ValueX: vx, ValueY: vy}
|
|
||||||
switch s := ps.(type) {
|
|
||||||
case StructField:
|
|
||||||
assert(parent.Value == nil)
|
|
||||||
parent.Records = append(parent.Records, reportRecord{Key: reflect.ValueOf(s.Name()), Value: child})
|
|
||||||
case SliceIndex:
|
|
||||||
assert(parent.Value == nil)
|
|
||||||
parent.Records = append(parent.Records, reportRecord{Value: child})
|
|
||||||
case MapIndex:
|
|
||||||
assert(parent.Value == nil)
|
|
||||||
parent.Records = append(parent.Records, reportRecord{Key: s.Key(), Value: child})
|
|
||||||
case Indirect:
|
|
||||||
assert(parent.Value == nil && parent.Records == nil)
|
|
||||||
parent.Value = child
|
|
||||||
case TypeAssertion:
|
|
||||||
assert(parent.Value == nil && parent.Records == nil)
|
|
||||||
parent.Value = child
|
|
||||||
case Transform:
|
|
||||||
assert(parent.Value == nil && parent.Records == nil)
|
|
||||||
parent.Value = child
|
|
||||||
parent.TransformerName = s.Name()
|
|
||||||
parent.NumTransformed++
|
|
||||||
default:
|
|
||||||
assert(parent == nil) // Must be the root step
|
|
||||||
}
|
|
||||||
return child
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *valueNode) Report(rs Result) {
|
|
||||||
assert(r.MaxDepth == 0) // May only be called on leaf nodes
|
|
||||||
|
|
||||||
if rs.ByIgnore() {
|
|
||||||
r.NumIgnored++
|
|
||||||
} else {
|
|
||||||
if rs.Equal() {
|
|
||||||
r.NumSame++
|
|
||||||
} else {
|
|
||||||
r.NumDiff++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
assert(r.NumSame+r.NumDiff+r.NumIgnored == 1)
|
|
||||||
|
|
||||||
if rs.ByMethod() {
|
|
||||||
r.NumCompared++
|
|
||||||
}
|
|
||||||
if rs.ByFunc() {
|
|
||||||
r.NumCompared++
|
|
||||||
}
|
|
||||||
assert(r.NumCompared <= 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (child *valueNode) PopStep() (parent *valueNode) {
|
|
||||||
if child.parent == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
parent = child.parent
|
|
||||||
parent.NumSame += child.NumSame
|
|
||||||
parent.NumDiff += child.NumDiff
|
|
||||||
parent.NumIgnored += child.NumIgnored
|
|
||||||
parent.NumCompared += child.NumCompared
|
|
||||||
parent.NumTransformed += child.NumTransformed
|
|
||||||
parent.NumChildren += child.NumChildren + 1
|
|
||||||
if parent.MaxDepth < child.MaxDepth+1 {
|
|
||||||
parent.MaxDepth = child.MaxDepth + 1
|
|
||||||
}
|
|
||||||
return parent
|
|
||||||
}
|
|
11
vendor/github.com/google/uuid/CHANGELOG.md
generated
vendored
11
vendor/github.com/google/uuid/CHANGELOG.md
generated
vendored
|
@ -1,5 +1,16 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [1.4.0](https://github.com/google/uuid/compare/v1.3.1...v1.4.0) (2023-10-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* UUIDs slice type with Strings() convenience method ([#133](https://github.com/google/uuid/issues/133)) ([cd5fbbd](https://github.com/google/uuid/commit/cd5fbbdd02f3e3467ac18940e07e062be1f864b4))
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
* Clarify that Parse's job is to parse but not necessarily validate strings. (Documents current behavior)
|
||||||
|
|
||||||
## [1.3.1](https://github.com/google/uuid/compare/v1.3.0...v1.3.1) (2023-08-18)
|
## [1.3.1](https://github.com/google/uuid/compare/v1.3.0...v1.3.1) (2023-08-18)
|
||||||
|
|
||||||
|
|
||||||
|
|
2
vendor/github.com/google/uuid/CONTRIBUTING.md
generated
vendored
2
vendor/github.com/google/uuid/CONTRIBUTING.md
generated
vendored
|
@ -11,7 +11,7 @@ please explain why in the pull request description.
|
||||||
|
|
||||||
### Releasing
|
### Releasing
|
||||||
|
|
||||||
Commits that would precipitate a SemVer change, as desrcibed in the Conventional
|
Commits that would precipitate a SemVer change, as described in the Conventional
|
||||||
Commits Specification, will trigger [`release-please`](https://github.com/google-github-actions/release-please-action)
|
Commits Specification, will trigger [`release-please`](https://github.com/google-github-actions/release-please-action)
|
||||||
to create a release candidate pull request. Once submitted, `release-please`
|
to create a release candidate pull request. Once submitted, `release-please`
|
||||||
will create a release.
|
will create a release.
|
||||||
|
|
26
vendor/github.com/google/uuid/uuid.go
generated
vendored
26
vendor/github.com/google/uuid/uuid.go
generated
vendored
|
@ -56,11 +56,15 @@ func IsInvalidLengthError(err error) bool {
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse decodes s into a UUID or returns an error. Both the standard UUID
|
// Parse decodes s into a UUID or returns an error if it cannot be parsed. Both
|
||||||
// forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and
|
// the standard UUID forms defined in RFC 4122
|
||||||
// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the
|
// (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and
|
||||||
// Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex
|
// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) are decoded. In addition,
|
||||||
// encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
|
// Parse accepts non-standard strings such as the raw hex encoding
|
||||||
|
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx and 38 byte "Microsoft style" encodings,
|
||||||
|
// e.g. {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}. Only the middle 36 bytes are
|
||||||
|
// examined in the latter case. Parse should not be used to validate strings as
|
||||||
|
// it parses non-standard encodings as indicated above.
|
||||||
func Parse(s string) (UUID, error) {
|
func Parse(s string) (UUID, error) {
|
||||||
var uuid UUID
|
var uuid UUID
|
||||||
switch len(s) {
|
switch len(s) {
|
||||||
|
@ -294,3 +298,15 @@ func DisableRandPool() {
|
||||||
poolMu.Lock()
|
poolMu.Lock()
|
||||||
poolPos = randPoolSize
|
poolPos = randPoolSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UUIDs is a slice of UUID types.
|
||||||
|
type UUIDs []UUID
|
||||||
|
|
||||||
|
// Strings returns a string slice containing the string form of each UUID in uuids.
|
||||||
|
func (uuids UUIDs) Strings() []string {
|
||||||
|
var uuidStrs = make([]string, len(uuids))
|
||||||
|
for i, uuid := range uuids {
|
||||||
|
uuidStrs[i] = uuid.String()
|
||||||
|
}
|
||||||
|
return uuidStrs
|
||||||
|
}
|
||||||
|
|
11
vendor/github.com/klauspost/compress/zstd/enc_best.go
generated
vendored
11
vendor/github.com/klauspost/compress/zstd/enc_best.go
generated
vendored
|
@ -197,12 +197,13 @@ encodeLoop:
|
||||||
|
|
||||||
// Set m to a match at offset if it looks like that will improve compression.
|
// Set m to a match at offset if it looks like that will improve compression.
|
||||||
improve := func(m *match, offset int32, s int32, first uint32, rep int32) {
|
improve := func(m *match, offset int32, s int32, first uint32, rep int32) {
|
||||||
if s-offset >= e.maxMatchOff || load3232(src, offset) != first {
|
delta := s - offset
|
||||||
|
if delta >= e.maxMatchOff || delta <= 0 || load3232(src, offset) != first {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if debugAsserts {
|
if debugAsserts {
|
||||||
if offset <= 0 {
|
if offset >= s {
|
||||||
panic(offset)
|
panic(fmt.Sprintf("offset: %d - s:%d - rep: %d - cur :%d - max: %d", offset, s, rep, e.cur, e.maxMatchOff))
|
||||||
}
|
}
|
||||||
if !bytes.Equal(src[s:s+4], src[offset:offset+4]) {
|
if !bytes.Equal(src[s:s+4], src[offset:offset+4]) {
|
||||||
panic(fmt.Sprintf("first match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first))
|
panic(fmt.Sprintf("first match mismatch: %v != %v, first: %08x", src[s:s+4], src[offset:offset+4], first))
|
||||||
|
@ -343,8 +344,8 @@ encodeLoop:
|
||||||
if best.rep > 0 {
|
if best.rep > 0 {
|
||||||
var seq seq
|
var seq seq
|
||||||
seq.matchLen = uint32(best.length - zstdMinMatch)
|
seq.matchLen = uint32(best.length - zstdMinMatch)
|
||||||
if debugAsserts && s <= nextEmit {
|
if debugAsserts && s < nextEmit {
|
||||||
panic("s <= nextEmit")
|
panic("s < nextEmit")
|
||||||
}
|
}
|
||||||
addLiterals(&seq, best.s)
|
addLiterals(&seq, best.s)
|
||||||
|
|
||||||
|
|
3
vendor/github.com/mattn/go-isatty/isatty_bsd.go
generated
vendored
3
vendor/github.com/mattn/go-isatty/isatty_bsd.go
generated
vendored
|
@ -1,6 +1,7 @@
|
||||||
//go:build (darwin || freebsd || openbsd || netbsd || dragonfly || hurd) && !appengine
|
//go:build (darwin || freebsd || openbsd || netbsd || dragonfly || hurd) && !appengine && !tinygo
|
||||||
// +build darwin freebsd openbsd netbsd dragonfly hurd
|
// +build darwin freebsd openbsd netbsd dragonfly hurd
|
||||||
// +build !appengine
|
// +build !appengine
|
||||||
|
// +build !tinygo
|
||||||
|
|
||||||
package isatty
|
package isatty
|
||||||
|
|
||||||
|
|
5
vendor/github.com/mattn/go-isatty/isatty_others.go
generated
vendored
5
vendor/github.com/mattn/go-isatty/isatty_others.go
generated
vendored
|
@ -1,5 +1,6 @@
|
||||||
//go:build appengine || js || nacl || wasm
|
//go:build (appengine || js || nacl || tinygo || wasm) && !windows
|
||||||
// +build appengine js nacl wasm
|
// +build appengine js nacl tinygo wasm
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
package isatty
|
package isatty
|
||||||
|
|
||||||
|
|
3
vendor/github.com/mattn/go-isatty/isatty_tcgets.go
generated
vendored
3
vendor/github.com/mattn/go-isatty/isatty_tcgets.go
generated
vendored
|
@ -1,6 +1,7 @@
|
||||||
//go:build (linux || aix || zos) && !appengine
|
//go:build (linux || aix || zos) && !appengine && !tinygo
|
||||||
// +build linux aix zos
|
// +build linux aix zos
|
||||||
// +build !appengine
|
// +build !appengine
|
||||||
|
// +build !tinygo
|
||||||
|
|
||||||
package isatty
|
package isatty
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue