mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 14:42:26 -05:00 
			
		
		
		
	[chore] dependabot updates (#2922)
* [chore]: Bump github.com/prometheus/client_golang from 1.18.0 to 1.19.1 Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.18.0 to 1.19.1. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.18.0...v1.19.1) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * [chore]: Bump github.com/KimMachineGun/automemlimit from 0.6.0 to 0.6.1 Bumps [github.com/KimMachineGun/automemlimit](https://github.com/KimMachineGun/automemlimit) from 0.6.0 to 0.6.1. - [Release notes](https://github.com/KimMachineGun/automemlimit/releases) - [Commits](https://github.com/KimMachineGun/automemlimit/compare/v0.6.0...v0.6.1) --- updated-dependencies: - dependency-name: github.com/KimMachineGun/automemlimit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * [chore]: Bump github.com/tdewolff/minify/v2 from 2.20.20 to 2.20.24 Bumps [github.com/tdewolff/minify/v2](https://github.com/tdewolff/minify) from 2.20.20 to 2.20.24. - [Release notes](https://github.com/tdewolff/minify/releases) - [Commits](https://github.com/tdewolff/minify/compare/v2.20.20...v2.20.24) --- updated-dependencies: - dependency-name: github.com/tdewolff/minify/v2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * [chore]: Bump github.com/go-swagger/go-swagger Bumps [github.com/go-swagger/go-swagger](https://github.com/go-swagger/go-swagger) from 0.30.6-0.20240418033037-c46c303aaa02 to 0.31.0. - [Release notes](https://github.com/go-swagger/go-swagger/releases) - [Changelog](https://github.com/go-swagger/go-swagger/blob/master/.goreleaser.yml) - [Commits](https://github.com/go-swagger/go-swagger/commits/v0.31.0) --- updated-dependencies: - dependency-name: github.com/go-swagger/go-swagger dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * [chore]: Bump github.com/gin-gonic/gin from 1.9.1 to 1.10.0 Bumps [github.com/gin-gonic/gin](https://github.com/gin-gonic/gin) from 1.9.1 to 1.10.0. - [Release notes](https://github.com/gin-gonic/gin/releases) - [Changelog](https://github.com/gin-gonic/gin/blob/master/CHANGELOG.md) - [Commits](https://github.com/gin-gonic/gin/compare/v1.9.1...v1.10.0) --- updated-dependencies: - dependency-name: github.com/gin-gonic/gin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
		
					parent
					
						
							
								16c1832793
							
						
					
				
			
			
				commit
				
					
						6c0d93c6cb
					
				
			
		
					 85 changed files with 19847 additions and 13221 deletions
				
			
		
							
								
								
									
										25
									
								
								go.mod
									
										
									
									
									
								
							
							
						
						
									
										25
									
								
								go.mod
									
										
									
									
									
								
							|  | @ -24,7 +24,7 @@ require ( | ||||||
| 	codeberg.org/gruf/go-structr v0.8.4 | 	codeberg.org/gruf/go-structr v0.8.4 | ||||||
| 	codeberg.org/superseriousbusiness/exif-terminator v0.7.0 | 	codeberg.org/superseriousbusiness/exif-terminator v0.7.0 | ||||||
| 	github.com/DmitriyVTitov/size v1.5.0 | 	github.com/DmitriyVTitov/size v1.5.0 | ||||||
| 	github.com/KimMachineGun/automemlimit v0.6.0 | 	github.com/KimMachineGun/automemlimit v0.6.1 | ||||||
| 	github.com/abema/go-mp4 v1.2.0 | 	github.com/abema/go-mp4 v1.2.0 | ||||||
| 	github.com/buckket/go-blurhash v1.1.0 | 	github.com/buckket/go-blurhash v1.1.0 | ||||||
| 	github.com/coreos/go-oidc/v3 v3.10.0 | 	github.com/coreos/go-oidc/v3 v3.10.0 | ||||||
|  | @ -32,9 +32,9 @@ require ( | ||||||
| 	github.com/gin-contrib/cors v1.7.2 | 	github.com/gin-contrib/cors v1.7.2 | ||||||
| 	github.com/gin-contrib/gzip v1.0.1 | 	github.com/gin-contrib/gzip v1.0.1 | ||||||
| 	github.com/gin-contrib/sessions v1.0.1 | 	github.com/gin-contrib/sessions v1.0.1 | ||||||
| 	github.com/gin-gonic/gin v1.9.1 | 	github.com/gin-gonic/gin v1.10.0 | ||||||
| 	github.com/go-playground/form/v4 v4.2.1 | 	github.com/go-playground/form/v4 v4.2.1 | ||||||
| 	github.com/go-swagger/go-swagger v0.30.6-0.20240418033037-c46c303aaa02 | 	github.com/go-swagger/go-swagger v0.31.0 | ||||||
| 	github.com/google/uuid v1.6.0 | 	github.com/google/uuid v1.6.0 | ||||||
| 	github.com/gorilla/feeds v1.1.2 | 	github.com/gorilla/feeds v1.1.2 | ||||||
| 	github.com/gorilla/websocket v1.5.1 | 	github.com/gorilla/websocket v1.5.1 | ||||||
|  | @ -45,14 +45,14 @@ require ( | ||||||
| 	github.com/minio/minio-go/v7 v7.0.70 | 	github.com/minio/minio-go/v7 v7.0.70 | ||||||
| 	github.com/mitchellh/mapstructure v1.5.0 | 	github.com/mitchellh/mapstructure v1.5.0 | ||||||
| 	github.com/oklog/ulid v1.3.1 | 	github.com/oklog/ulid v1.3.1 | ||||||
| 	github.com/prometheus/client_golang v1.18.0 | 	github.com/prometheus/client_golang v1.19.1 | ||||||
| 	github.com/spf13/cobra v1.8.0 | 	github.com/spf13/cobra v1.8.0 | ||||||
| 	github.com/spf13/viper v1.18.2 | 	github.com/spf13/viper v1.18.2 | ||||||
| 	github.com/stretchr/testify v1.9.0 | 	github.com/stretchr/testify v1.9.0 | ||||||
| 	github.com/superseriousbusiness/activity v1.6.0-gts.0.20240408131430-247f7f7110f0 | 	github.com/superseriousbusiness/activity v1.6.0-gts.0.20240408131430-247f7f7110f0 | ||||||
| 	github.com/superseriousbusiness/httpsig v1.2.0-SSB | 	github.com/superseriousbusiness/httpsig v1.2.0-SSB | ||||||
| 	github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8 | 	github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8 | ||||||
| 	github.com/tdewolff/minify/v2 v2.20.20 | 	github.com/tdewolff/minify/v2 v2.20.24 | ||||||
| 	github.com/technologize/otel-go-contrib v1.1.1 | 	github.com/technologize/otel-go-contrib v1.1.1 | ||||||
| 	github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 | 	github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 | ||||||
| 	github.com/ulule/limiter/v3 v3.11.2 | 	github.com/ulule/limiter/v3 v3.11.2 | ||||||
|  | @ -168,7 +168,6 @@ require ( | ||||||
| 	github.com/magiconair/properties v1.8.7 // indirect | 	github.com/magiconair/properties v1.8.7 // indirect | ||||||
| 	github.com/mailru/easyjson v0.7.7 // indirect | 	github.com/mailru/easyjson v0.7.7 // indirect | ||||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||||
| 	github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect |  | ||||||
| 	github.com/minio/md5-simd v1.1.2 // indirect | 	github.com/minio/md5-simd v1.1.2 // indirect | ||||||
| 	github.com/mitchellh/copystructure v1.2.0 // indirect | 	github.com/mitchellh/copystructure v1.2.0 // indirect | ||||||
| 	github.com/mitchellh/reflectwalk v1.0.2 // indirect | 	github.com/mitchellh/reflectwalk v1.0.2 // indirect | ||||||
|  | @ -181,7 +180,7 @@ require ( | ||||||
| 	github.com/pkg/errors v0.9.1 // indirect | 	github.com/pkg/errors v0.9.1 // indirect | ||||||
| 	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_model v0.6.0 // indirect | 	github.com/prometheus/client_model v0.6.0 // indirect | ||||||
| 	github.com/prometheus/common v0.45.0 // indirect | 	github.com/prometheus/common v0.48.0 // indirect | ||||||
| 	github.com/prometheus/procfs v0.12.0 // indirect | 	github.com/prometheus/procfs v0.12.0 // indirect | ||||||
| 	github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b // indirect | 	github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b // indirect | ||||||
| 	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect | 	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect | ||||||
|  | @ -198,7 +197,7 @@ require ( | ||||||
| 	github.com/subosito/gotenv v1.6.0 // indirect | 	github.com/subosito/gotenv v1.6.0 // indirect | ||||||
| 	github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe // indirect | 	github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe // indirect | ||||||
| 	github.com/superseriousbusiness/go-png-image-structure/v2 v2.0.1-SSB // indirect | 	github.com/superseriousbusiness/go-png-image-structure/v2 v2.0.1-SSB // indirect | ||||||
| 	github.com/tdewolff/parse/v2 v2.7.13 // indirect | 	github.com/tdewolff/parse/v2 v2.7.14 // indirect | ||||||
| 	github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect | 	github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect | ||||||
| 	github.com/toqueteos/webbrowser v1.2.0 // indirect | 	github.com/toqueteos/webbrowser v1.2.0 // indirect | ||||||
| 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect | 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect | ||||||
|  | @ -210,16 +209,16 @@ require ( | ||||||
| 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect | ||||||
| 	go.opentelemetry.io/proto/otlp v1.2.0 // indirect | 	go.opentelemetry.io/proto/otlp v1.2.0 // indirect | ||||||
| 	go.uber.org/multierr v1.11.0 // indirect | 	go.uber.org/multierr v1.11.0 // indirect | ||||||
| 	golang.org/x/arch v0.7.0 // indirect | 	golang.org/x/arch v0.8.0 // indirect | ||||||
| 	golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect | 	golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect | ||||||
| 	golang.org/x/mod v0.16.0 // indirect | 	golang.org/x/mod v0.17.0 // indirect | ||||||
| 	golang.org/x/sync v0.6.0 // indirect | 	golang.org/x/sync v0.7.0 // indirect | ||||||
| 	golang.org/x/sys v0.20.0 // indirect | 	golang.org/x/sys v0.20.0 // indirect | ||||||
| 	golang.org/x/tools v0.19.0 // indirect | 	golang.org/x/tools v0.21.0 // indirect | ||||||
| 	google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect | 	google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect | ||||||
| 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect | 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect | ||||||
| 	google.golang.org/grpc v1.63.2 // indirect | 	google.golang.org/grpc v1.63.2 // indirect | ||||||
| 	google.golang.org/protobuf v1.34.0 // indirect | 	google.golang.org/protobuf v1.34.1 // indirect | ||||||
| 	gopkg.in/ini.v1 v1.67.0 // indirect | 	gopkg.in/ini.v1 v1.67.0 // indirect | ||||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||||
| 	modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect | 	modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect | ||||||
|  |  | ||||||
							
								
								
									
										50
									
								
								go.sum
									
										
									
									
									
								
							
							
						
						
									
										50
									
								
								go.sum
									
										
									
									
									
								
							|  | @ -85,8 +85,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 | ||||||
| github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= | ||||||
| github.com/DmitriyVTitov/size v1.5.0 h1:/PzqxYrOyOUX1BXj6J9OuVRVGe+66VL4D9FlUaW515g= | github.com/DmitriyVTitov/size v1.5.0 h1:/PzqxYrOyOUX1BXj6J9OuVRVGe+66VL4D9FlUaW515g= | ||||||
| github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= | github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= | ||||||
| github.com/KimMachineGun/automemlimit v0.6.0 h1:p/BXkH+K40Hax+PuWWPQ478hPjsp9h1CPDhLlA3Z37E= | github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8= | ||||||
| github.com/KimMachineGun/automemlimit v0.6.0/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= | github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= | ||||||
| github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= | github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= | ||||||
| github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= | github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= | ||||||
| github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= | github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= | ||||||
|  | @ -201,8 +201,8 @@ github.com/gin-contrib/sessions v1.0.1 h1:3hsJyNs7v7N8OtelFmYXFrulAf6zSR7nW/putc | ||||||
| github.com/gin-contrib/sessions v1.0.1/go.mod h1:ouxSFM24/OgIud5MJYQJLpy6AwxQ5EYO9yLhbtObGkM= | github.com/gin-contrib/sessions v1.0.1/go.mod h1:ouxSFM24/OgIud5MJYQJLpy6AwxQ5EYO9yLhbtObGkM= | ||||||
| github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= | ||||||
| github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= | ||||||
| github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= | github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= | ||||||
| github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= | github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= | ||||||
| github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= | github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= | ||||||
| github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= | github.com/go-errors/errors v1.0.2/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= | ||||||
| github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= | github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= | ||||||
|  | @ -254,8 +254,8 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 | ||||||
| github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= | github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= | ||||||
| github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= | github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= | ||||||
| github.com/go-session/session v3.1.2+incompatible/go.mod h1:8B3iivBQjrz/JtC68Np2T1yBBLxTan3mn/3OM0CyRt0= | github.com/go-session/session v3.1.2+incompatible/go.mod h1:8B3iivBQjrz/JtC68Np2T1yBBLxTan3mn/3OM0CyRt0= | ||||||
| github.com/go-swagger/go-swagger v0.30.6-0.20240418033037-c46c303aaa02 h1:J6YiT/eg3gAfKMdVCkWXe6khsO+nxa8W4URZ4AUqzbA= | github.com/go-swagger/go-swagger v0.31.0 h1:H8eOYQnY2u7vNKWDNykv2xJP3pBhRG/R+SOCAmKrLlc= | ||||||
| github.com/go-swagger/go-swagger v0.30.6-0.20240418033037-c46c303aaa02/go.mod h1:i1/E+d8iPNReSE7y04FaVu5OPKB3il5cn+T1Egogg3I= | github.com/go-swagger/go-swagger v0.31.0/go.mod h1:WSigRRWEig8zV6t6Sm8Y+EmUjlzA/HoaZJ5edupq7po= | ||||||
| github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= | github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= | ||||||
| github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= | github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= | ||||||
| github.com/go-xmlfmt/xmlfmt v0.0.0-20211206191508-7fd73a941850 h1:PSPmmucxGiFBtbQcttHTUc4LQ3P09AW+ldO2qspyKdY= | github.com/go-xmlfmt/xmlfmt v0.0.0-20211206191508-7fd73a941850 h1:PSPmmucxGiFBtbQcttHTUc4LQ3P09AW+ldO2qspyKdY= | ||||||
|  | @ -422,8 +422,6 @@ github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope | ||||||
| github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||||
| github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= | ||||||
| github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||||
| github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= |  | ||||||
| github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= |  | ||||||
| github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= | github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= | ||||||
| github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= | github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= | ||||||
| github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= | github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= | ||||||
|  | @ -475,13 +473,13 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI | ||||||
| github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
| github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= | github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= | ||||||
| github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= | github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= | ||||||
| github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= | github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= | ||||||
| github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= | github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= | ||||||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||||
| github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= | github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= | ||||||
| github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= | github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= | ||||||
| github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= | github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= | ||||||
| github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= | github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= | ||||||
| github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= | github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= | ||||||
| github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= | github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= | ||||||
| github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b h1:aUNXCGgukb4gtY99imuIeoh8Vr0GSwAlYxPAhqZrpFc= | github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b h1:aUNXCGgukb4gtY99imuIeoh8Vr0GSwAlYxPAhqZrpFc= | ||||||
|  | @ -553,10 +551,10 @@ github.com/superseriousbusiness/httpsig v1.2.0-SSB h1:BinBGKbf2LSuVT5+MuH0XynHN9 | ||||||
| github.com/superseriousbusiness/httpsig v1.2.0-SSB/go.mod h1:+rxfATjFaDoDIVaJOTSP0gj6UrbicaYPEptvCLC9F28= | github.com/superseriousbusiness/httpsig v1.2.0-SSB/go.mod h1:+rxfATjFaDoDIVaJOTSP0gj6UrbicaYPEptvCLC9F28= | ||||||
| github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8 h1:nTIhuP157oOFcscuoK1kCme1xTeGIzztSw70lX9NrDQ= | github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8 h1:nTIhuP157oOFcscuoK1kCme1xTeGIzztSw70lX9NrDQ= | ||||||
| github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8/go.mod h1:uYC/W92oVRJ49Vh1GcvTqpeFqHi+Ovrl2sMllQWRAEo= | github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8/go.mod h1:uYC/W92oVRJ49Vh1GcvTqpeFqHi+Ovrl2sMllQWRAEo= | ||||||
| github.com/tdewolff/minify/v2 v2.20.20 h1:vhULb+VsW2twkplgsawAoUY957efb+EdiZ7zu5fUhhk= | github.com/tdewolff/minify/v2 v2.20.24 h1:I4FCC5Q2YdGnmXNokZ1OkGpkO+Weao/62y5/2eQ19vo= | ||||||
| github.com/tdewolff/minify/v2 v2.20.20/go.mod h1:GYaLXFpIIwsX99apQHXfGdISUdlA98wmaoWxjT9C37k= | github.com/tdewolff/minify/v2 v2.20.24/go.mod h1:1TJni7+mATKu24cBQQpgwakrYRD27uC1/rdJOgdv8ns= | ||||||
| github.com/tdewolff/parse/v2 v2.7.13 h1:iSiwOUkCYLNfapHoqdLcqZVgvQ0jrsao8YYKP/UJYTI= | github.com/tdewolff/parse/v2 v2.7.14 h1:100KJ+QAO3PpMb3uUjzEU/NpmCdbBYz6KPmCIAfWpR8= | ||||||
| github.com/tdewolff/parse/v2 v2.7.13/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= | github.com/tdewolff/parse/v2 v2.7.14/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= | ||||||
| github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= | github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= | ||||||
| github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo= | github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo= | ||||||
| github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= | github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= | ||||||
|  | @ -671,8 +669,8 @@ 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/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= | ||||||
| golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= | golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= | ||||||
| golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= | golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= | ||||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||||
| golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||||
|  | @ -718,8 +716,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB | ||||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
| golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
| golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||||||
| golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= | golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= | ||||||
| golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | ||||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
| golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||||
|  | @ -771,8 +769,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ | ||||||
| golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= | golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= | ||||||
| golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
|  | @ -874,8 +872,8 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc | ||||||
| golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||||
| golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||||||
| golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||||||
| golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= | golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= | ||||||
| golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= | golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= | ||||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | @ -961,8 +959,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 | ||||||
| google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | ||||||
| google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= | ||||||
| google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | ||||||
| google.golang.org/protobuf v1.34.0 h1:Qo/qEd2RZPCf2nKuorzksSknv0d3ERwp1vFG38gSmH4= | google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= | ||||||
| google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= | google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= | ||||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/KimMachineGun/automemlimit/memlimit/memlimit.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/KimMachineGun/automemlimit/memlimit/memlimit.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -167,7 +167,7 @@ func SetGoMemLimitWithOpts(opts ...Option) (_ int64, _err error) { | ||||||
| 	limit, err := setGoMemLimit(ApplyRatio(cfg.provider, ratio)) | 	limit, err := setGoMemLimit(ApplyRatio(cfg.provider, ratio)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		if errors.Is(err, ErrNoLimit) { | 		if errors.Is(err, ErrNoLimit) { | ||||||
| 			cfg.logger.Info("memory is not limited, skipping: %v", err) | 			cfg.logger.Info("memory is not limited, skipping") | ||||||
| 			return 0, nil | 			return 0, nil | ||||||
| 		} | 		} | ||||||
| 		return 0, fmt.Errorf("failed to set GOMEMLIMIT: %w", err) | 		return 0, fmt.Errorf("failed to set GOMEMLIMIT: %w", err) | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/github.com/gin-gonic/gin/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/gin-gonic/gin/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -5,3 +5,7 @@ count.out | ||||||
| test | test | ||||||
| profile.out | profile.out | ||||||
| tmp.out | tmp.out | ||||||
|  | 
 | ||||||
|  | # Develop tools | ||||||
|  | .idea/ | ||||||
|  | .vscode/ | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/gin-gonic/gin/.golangci.yml
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/gin-gonic/gin/.golangci.yml
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -3,7 +3,6 @@ run: | ||||||
| linters: | linters: | ||||||
|   enable: |   enable: | ||||||
|     - asciicheck |     - asciicheck | ||||||
|     - depguard |  | ||||||
|     - dogsled |     - dogsled | ||||||
|     - durationcheck |     - durationcheck | ||||||
|     - errcheck |     - errcheck | ||||||
|  |  | ||||||
							
								
								
									
										29
									
								
								vendor/github.com/gin-gonic/gin/.goreleaser.yaml
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/gin-gonic/gin/.goreleaser.yaml
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,8 +1,7 @@ | ||||||
| project_name: gin | project_name: gin | ||||||
| 
 | 
 | ||||||
| builds: | builds: | ||||||
|   - |   - # If true, skip the build. | ||||||
|     # If true, skip the build. |  | ||||||
|     # Useful for library projects. |     # Useful for library projects. | ||||||
|     # Default is false |     # Default is false | ||||||
|     skip: true |     skip: true | ||||||
|  | @ -10,7 +9,7 @@ builds: | ||||||
| changelog: | changelog: | ||||||
|   # Set it to true if you wish to skip the changelog generation. |   # Set it to true if you wish to skip the changelog generation. | ||||||
|   # This may result in an empty release notes on GitHub/GitLab/Gitea. |   # This may result in an empty release notes on GitHub/GitLab/Gitea. | ||||||
|   skip: false |   disable: false | ||||||
| 
 | 
 | ||||||
|   # Changelog generation implementation to use. |   # Changelog generation implementation to use. | ||||||
|   # |   # | ||||||
|  | @ -21,7 +20,7 @@ changelog: | ||||||
|   # - `github-native`: uses the GitHub release notes generation API, disables the groups feature. |   # - `github-native`: uses the GitHub release notes generation API, disables the groups feature. | ||||||
|   # |   # | ||||||
|   # Defaults to `git`. |   # Defaults to `git`. | ||||||
|   use: git |   use: github | ||||||
| 
 | 
 | ||||||
|   # Sorts the changelog by the commit's messages. |   # Sorts the changelog by the commit's messages. | ||||||
|   # Could either be asc, desc or empty |   # Could either be asc, desc or empty | ||||||
|  | @ -38,20 +37,20 @@ changelog: | ||||||
|     - title: Features |     - title: Features | ||||||
|       regexp: "^.*feat[(\\w)]*:+.*$" |       regexp: "^.*feat[(\\w)]*:+.*$" | ||||||
|       order: 0 |       order: 0 | ||||||
|     - title: 'Bug fixes' |     - title: "Bug fixes" | ||||||
|       regexp: "^.*fix[(\\w)]*:+.*$" |       regexp: "^.*fix[(\\w)]*:+.*$" | ||||||
|       order: 1 |       order: 1 | ||||||
|     - title: 'Enhancements' |     - title: "Enhancements" | ||||||
|       regexp: "^.*chore[(\\w)]*:+.*$" |       regexp: "^.*chore[(\\w)]*:+.*$" | ||||||
|       order: 2 |       order: 2 | ||||||
|  |     - title: "Refactor" | ||||||
|  |       regexp: "^.*refactor[(\\w)]*:+.*$" | ||||||
|  |       order: 3 | ||||||
|  |     - title: "Build process updates" | ||||||
|  |       regexp: ^.*?(build|ci)(\(.+\))??!?:.+$ | ||||||
|  |       order: 4 | ||||||
|  |     - title: "Documentation updates" | ||||||
|  |       regexp: ^.*?docs?(\(.+\))??!?:.+$ | ||||||
|  |       order: 4 | ||||||
|     - title: Others |     - title: Others | ||||||
|       order: 999 |       order: 999 | ||||||
| 
 |  | ||||||
|   filters: |  | ||||||
|     # Commit messages matching the regexp listed here will be removed from |  | ||||||
|     # the changelog |  | ||||||
|     # Default is empty |  | ||||||
|     exclude: |  | ||||||
|       - '^docs' |  | ||||||
|       - 'CICD' |  | ||||||
|       - typo |  | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/gin-gonic/gin/Makefile
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/gin-gonic/gin/Makefile
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -42,6 +42,7 @@ fmt-check: | ||||||
| 		exit 1; \
 | 		exit 1; \
 | ||||||
| 	fi; | 	fi; | ||||||
| 
 | 
 | ||||||
|  | .PHONY: vet | ||||||
| vet: | vet: | ||||||
| 	$(GO) vet $(VETPACKAGES) | 	$(GO) vet $(VETPACKAGES) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										25
									
								
								vendor/github.com/gin-gonic/gin/auth.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/gin-gonic/gin/auth.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -16,6 +16,9 @@ import ( | ||||||
| // AuthUserKey is the cookie name for user credential in basic auth. | // AuthUserKey is the cookie name for user credential in basic auth. | ||||||
| const AuthUserKey = "user" | const AuthUserKey = "user" | ||||||
| 
 | 
 | ||||||
|  | // AuthProxyUserKey is the cookie name for proxy_user credential in basic auth for proxy. | ||||||
|  | const AuthProxyUserKey = "proxy_user" | ||||||
|  | 
 | ||||||
| // Accounts defines a key/value for user/pass list of authorized logins. | // Accounts defines a key/value for user/pass list of authorized logins. | ||||||
| type Accounts map[string]string | type Accounts map[string]string | ||||||
| 
 | 
 | ||||||
|  | @ -89,3 +92,25 @@ func authorizationHeader(user, password string) string { | ||||||
| 	base := user + ":" + password | 	base := user + ":" + password | ||||||
| 	return "Basic " + base64.StdEncoding.EncodeToString(bytesconv.StringToBytes(base)) | 	return "Basic " + base64.StdEncoding.EncodeToString(bytesconv.StringToBytes(base)) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // BasicAuthForProxy returns a Basic HTTP Proxy-Authorization middleware. | ||||||
|  | // If the realm is empty, "Proxy Authorization Required" will be used by default. | ||||||
|  | func BasicAuthForProxy(accounts Accounts, realm string) HandlerFunc { | ||||||
|  | 	if realm == "" { | ||||||
|  | 		realm = "Proxy Authorization Required" | ||||||
|  | 	} | ||||||
|  | 	realm = "Basic realm=" + strconv.Quote(realm) | ||||||
|  | 	pairs := processAccounts(accounts) | ||||||
|  | 	return func(c *Context) { | ||||||
|  | 		proxyUser, found := pairs.searchCredential(c.requestHeader("Proxy-Authorization")) | ||||||
|  | 		if !found { | ||||||
|  | 			// Credentials doesn't match, we return 407 and abort handlers chain. | ||||||
|  | 			c.Header("Proxy-Authenticate", realm) | ||||||
|  | 			c.AbortWithStatus(http.StatusProxyAuthRequired) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		// The proxy_user credentials was found, set proxy_user's id to key AuthProxyUserKey in this context, the proxy_user's id can be read later using | ||||||
|  | 		// c.MustGet(gin.AuthProxyUserKey). | ||||||
|  | 		c.Set(AuthProxyUserKey, proxyUser) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										27
									
								
								vendor/github.com/gin-gonic/gin/binding/binding.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/gin-gonic/gin/binding/binding.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -21,6 +21,7 @@ const ( | ||||||
| 	MIMEMSGPACK           = "application/x-msgpack" | 	MIMEMSGPACK           = "application/x-msgpack" | ||||||
| 	MIMEMSGPACK2          = "application/msgpack" | 	MIMEMSGPACK2          = "application/msgpack" | ||||||
| 	MIMEYAML              = "application/x-yaml" | 	MIMEYAML              = "application/x-yaml" | ||||||
|  | 	MIMEYAML2             = "application/yaml" | ||||||
| 	MIMETOML              = "application/toml" | 	MIMETOML              = "application/toml" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -72,18 +73,18 @@ var Validator StructValidator = &defaultValidator{} | ||||||
| // These implement the Binding interface and can be used to bind the data | // These implement the Binding interface and can be used to bind the data | ||||||
| // present in the request to struct instances. | // present in the request to struct instances. | ||||||
| var ( | var ( | ||||||
| 	JSON          = jsonBinding{} | 	JSON          BindingBody = jsonBinding{} | ||||||
| 	XML           = xmlBinding{} | 	XML           BindingBody = xmlBinding{} | ||||||
| 	Form          = formBinding{} | 	Form          Binding     = formBinding{} | ||||||
| 	Query         = queryBinding{} | 	Query         Binding     = queryBinding{} | ||||||
| 	FormPost      = formPostBinding{} | 	FormPost      Binding     = formPostBinding{} | ||||||
| 	FormMultipart = formMultipartBinding{} | 	FormMultipart Binding     = formMultipartBinding{} | ||||||
| 	ProtoBuf      = protobufBinding{} | 	ProtoBuf      BindingBody = protobufBinding{} | ||||||
| 	MsgPack       = msgpackBinding{} | 	MsgPack       BindingBody = msgpackBinding{} | ||||||
| 	YAML          = yamlBinding{} | 	YAML          BindingBody = yamlBinding{} | ||||||
| 	Uri           = uriBinding{} | 	Uri           BindingUri  = uriBinding{} | ||||||
| 	Header        = headerBinding{} | 	Header        Binding     = headerBinding{} | ||||||
| 	TOML          = tomlBinding{} | 	TOML          BindingBody = tomlBinding{} | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Default returns the appropriate Binding instance based on the HTTP method | // Default returns the appropriate Binding instance based on the HTTP method | ||||||
|  | @ -102,7 +103,7 @@ func Default(method, contentType string) Binding { | ||||||
| 		return ProtoBuf | 		return ProtoBuf | ||||||
| 	case MIMEMSGPACK, MIMEMSGPACK2: | 	case MIMEMSGPACK, MIMEMSGPACK2: | ||||||
| 		return MsgPack | 		return MsgPack | ||||||
| 	case MIMEYAML: | 	case MIMEYAML, MIMEYAML2: | ||||||
| 		return YAML | 		return YAML | ||||||
| 	case MIMETOML: | 	case MIMETOML: | ||||||
| 		return TOML | 		return TOML | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/gin-gonic/gin/binding/binding_nomsgpack.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -19,6 +19,7 @@ const ( | ||||||
| 	MIMEMultipartPOSTForm = "multipart/form-data" | 	MIMEMultipartPOSTForm = "multipart/form-data" | ||||||
| 	MIMEPROTOBUF          = "application/x-protobuf" | 	MIMEPROTOBUF          = "application/x-protobuf" | ||||||
| 	MIMEYAML              = "application/x-yaml" | 	MIMEYAML              = "application/x-yaml" | ||||||
|  | 	MIMEYAML2             = "application/yaml" | ||||||
| 	MIMETOML              = "application/toml" | 	MIMETOML              = "application/toml" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -96,7 +97,7 @@ func Default(method, contentType string) Binding { | ||||||
| 		return XML | 		return XML | ||||||
| 	case MIMEPROTOBUF: | 	case MIMEPROTOBUF: | ||||||
| 		return ProtoBuf | 		return ProtoBuf | ||||||
| 	case MIMEYAML: | 	case MIMEYAML, MIMEYAML2: | ||||||
| 		return YAML | 		return YAML | ||||||
| 	case MIMEMultipartPOSTForm: | 	case MIMEMultipartPOSTForm: | ||||||
| 		return FormMultipart | 		return FormMultipart | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								vendor/github.com/gin-gonic/gin/binding/default_validator.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/gin-gonic/gin/binding/default_validator.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -54,7 +54,10 @@ func (v *defaultValidator) ValidateStruct(obj any) error { | ||||||
| 	value := reflect.ValueOf(obj) | 	value := reflect.ValueOf(obj) | ||||||
| 	switch value.Kind() { | 	switch value.Kind() { | ||||||
| 	case reflect.Ptr: | 	case reflect.Ptr: | ||||||
| 		return v.ValidateStruct(value.Elem().Interface()) | 		if value.Elem().Kind() != reflect.Struct { | ||||||
|  | 			return v.ValidateStruct(value.Elem().Interface()) | ||||||
|  | 		} | ||||||
|  | 		return v.validateStruct(obj) | ||||||
| 	case reflect.Struct: | 	case reflect.Struct: | ||||||
| 		return v.validateStruct(obj) | 		return v.validateStruct(obj) | ||||||
| 	case reflect.Slice, reflect.Array: | 	case reflect.Slice, reflect.Array: | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								vendor/github.com/gin-gonic/gin/binding/form_mapping.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/gin-gonic/gin/binding/form_mapping.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -7,6 +7,7 @@ package binding | ||||||
| import ( | import ( | ||||||
| 	"errors" | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"mime/multipart" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | @ -164,6 +165,23 @@ func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter | ||||||
| 	return setter.TrySet(value, field, tagValue, setOpt) | 	return setter.TrySet(value, field, tagValue, setOpt) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // BindUnmarshaler is the interface used to wrap the UnmarshalParam method. | ||||||
|  | type BindUnmarshaler interface { | ||||||
|  | 	// UnmarshalParam decodes and assigns a value from an form or query param. | ||||||
|  | 	UnmarshalParam(param string) error | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // trySetCustom tries to set a custom type value | ||||||
|  | // If the value implements the BindUnmarshaler interface, it will be used to set the value, we will return `true` | ||||||
|  | // to skip the default value setting. | ||||||
|  | func trySetCustom(val string, value reflect.Value) (isSet bool, err error) { | ||||||
|  | 	switch v := value.Addr().Interface().(type) { | ||||||
|  | 	case BindUnmarshaler: | ||||||
|  | 		return true, v.UnmarshalParam(val) | ||||||
|  | 	} | ||||||
|  | 	return false, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func setByForm(value reflect.Value, field reflect.StructField, form map[string][]string, tagValue string, opt setOptions) (isSet bool, err error) { | func setByForm(value reflect.Value, field reflect.StructField, form map[string][]string, tagValue string, opt setOptions) (isSet bool, err error) { | ||||||
| 	vs, ok := form[tagValue] | 	vs, ok := form[tagValue] | ||||||
| 	if !ok && !opt.isDefaultExists { | 	if !ok && !opt.isDefaultExists { | ||||||
|  | @ -193,6 +211,9 @@ func setByForm(value reflect.Value, field reflect.StructField, form map[string][ | ||||||
| 		if len(vs) > 0 { | 		if len(vs) > 0 { | ||||||
| 			val = vs[0] | 			val = vs[0] | ||||||
| 		} | 		} | ||||||
|  | 		if ok, err := trySetCustom(val, value); ok { | ||||||
|  | 			return ok, err | ||||||
|  | 		} | ||||||
| 		return true, setWithProperType(val, value, field) | 		return true, setWithProperType(val, value, field) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -235,10 +256,17 @@ func setWithProperType(val string, value reflect.Value, field reflect.StructFiel | ||||||
| 		switch value.Interface().(type) { | 		switch value.Interface().(type) { | ||||||
| 		case time.Time: | 		case time.Time: | ||||||
| 			return setTimeField(val, field, value) | 			return setTimeField(val, field, value) | ||||||
|  | 		case multipart.FileHeader: | ||||||
|  | 			return nil | ||||||
| 		} | 		} | ||||||
| 		return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) | 		return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) | ||||||
| 	case reflect.Map: | 	case reflect.Map: | ||||||
| 		return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) | 		return json.Unmarshal(bytesconv.StringToBytes(val), value.Addr().Interface()) | ||||||
|  | 	case reflect.Ptr: | ||||||
|  | 		if !value.Elem().IsValid() { | ||||||
|  | 			value.Set(reflect.New(value.Type().Elem())) | ||||||
|  | 		} | ||||||
|  | 		return setWithProperType(val, value.Elem(), field) | ||||||
| 	default: | 	default: | ||||||
| 		return errUnknownType | 		return errUnknownType | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								vendor/github.com/gin-gonic/gin/codecov.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/gin-gonic/gin/codecov.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | ||||||
|  | coverage: | ||||||
|  |   require_ci_to_pass: true | ||||||
|  | 
 | ||||||
|  |   status: | ||||||
|  |     project: | ||||||
|  |       default: | ||||||
|  |         target: 99% | ||||||
|  |         threshold: 99% | ||||||
|  | 
 | ||||||
|  |     patch: | ||||||
|  |       default: | ||||||
|  |         target: 99% | ||||||
|  |         threshold: 95% | ||||||
							
								
								
									
										52
									
								
								vendor/github.com/gin-gonic/gin/context.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/gin-gonic/gin/context.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -43,6 +43,10 @@ const BodyBytesKey = "_gin-gonic/gin/bodybyteskey" | ||||||
| // ContextKey is the key that a Context returns itself for. | // ContextKey is the key that a Context returns itself for. | ||||||
| const ContextKey = "_gin-gonic/gin/contextkey" | const ContextKey = "_gin-gonic/gin/contextkey" | ||||||
| 
 | 
 | ||||||
|  | type ContextKeyType int | ||||||
|  | 
 | ||||||
|  | const ContextRequestKey ContextKeyType = 0 | ||||||
|  | 
 | ||||||
| // abortIndex represents a typical value used in abort functions. | // abortIndex represents a typical value used in abort functions. | ||||||
| const abortIndex int8 = math.MaxInt8 >> 1 | const abortIndex int8 = math.MaxInt8 >> 1 | ||||||
| 
 | 
 | ||||||
|  | @ -113,20 +117,27 @@ func (c *Context) Copy() *Context { | ||||||
| 	cp := Context{ | 	cp := Context{ | ||||||
| 		writermem: c.writermem, | 		writermem: c.writermem, | ||||||
| 		Request:   c.Request, | 		Request:   c.Request, | ||||||
| 		Params:    c.Params, |  | ||||||
| 		engine:    c.engine, | 		engine:    c.engine, | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	cp.writermem.ResponseWriter = nil | 	cp.writermem.ResponseWriter = nil | ||||||
| 	cp.Writer = &cp.writermem | 	cp.Writer = &cp.writermem | ||||||
| 	cp.index = abortIndex | 	cp.index = abortIndex | ||||||
| 	cp.handlers = nil | 	cp.handlers = nil | ||||||
| 	cp.Keys = map[string]any{} | 	cp.fullPath = c.fullPath | ||||||
| 	for k, v := range c.Keys { | 
 | ||||||
|  | 	cKeys := c.Keys | ||||||
|  | 	cp.Keys = make(map[string]any, len(cKeys)) | ||||||
|  | 	c.mu.RLock() | ||||||
|  | 	for k, v := range cKeys { | ||||||
| 		cp.Keys[k] = v | 		cp.Keys[k] = v | ||||||
| 	} | 	} | ||||||
| 	paramCopy := make([]Param, len(cp.Params)) | 	c.mu.RUnlock() | ||||||
| 	copy(paramCopy, cp.Params) | 
 | ||||||
| 	cp.Params = paramCopy | 	cParams := c.Params | ||||||
|  | 	cp.Params = make([]Param, len(cParams)) | ||||||
|  | 	copy(cp.Params, cParams) | ||||||
|  | 
 | ||||||
| 	return &cp | 	return &cp | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -386,7 +397,7 @@ func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string) | ||||||
| // | // | ||||||
| //	router.GET("/user/:id", func(c *gin.Context) { | //	router.GET("/user/:id", func(c *gin.Context) { | ||||||
| //	    // a GET request to /user/john | //	    // a GET request to /user/john | ||||||
| //	    id := c.Param("id") // id == "/john" | //	    id := c.Param("id") // id == "john" | ||||||
| //	    // a GET request to /user/john/ | //	    // a GET request to /user/john/ | ||||||
| //	    id := c.Param("id") // id == "/john/" | //	    id := c.Param("id") // id == "/john/" | ||||||
| //	}) | //	}) | ||||||
|  | @ -728,7 +739,7 @@ func (c *Context) ShouldBindHeader(obj any) error { | ||||||
| 
 | 
 | ||||||
| // ShouldBindUri binds the passed struct pointer using the specified binding engine. | // ShouldBindUri binds the passed struct pointer using the specified binding engine. | ||||||
| func (c *Context) ShouldBindUri(obj any) error { | func (c *Context) ShouldBindUri(obj any) error { | ||||||
| 	m := make(map[string][]string) | 	m := make(map[string][]string, len(c.Params)) | ||||||
| 	for _, v := range c.Params { | 	for _, v := range c.Params { | ||||||
| 		m[v.Key] = []string{v.Value} | 		m[v.Key] = []string{v.Value} | ||||||
| 	} | 	} | ||||||
|  | @ -763,6 +774,26 @@ func (c *Context) ShouldBindBodyWith(obj any, bb binding.BindingBody) (err error | ||||||
| 	return bb.BindBody(body, obj) | 	return bb.BindBody(body, obj) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // ShouldBindBodyWithJSON is a shortcut for c.ShouldBindBodyWith(obj, binding.JSON). | ||||||
|  | func (c *Context) ShouldBindBodyWithJSON(obj any) error { | ||||||
|  | 	return c.ShouldBindBodyWith(obj, binding.JSON) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ShouldBindBodyWithXML is a shortcut for c.ShouldBindBodyWith(obj, binding.XML). | ||||||
|  | func (c *Context) ShouldBindBodyWithXML(obj any) error { | ||||||
|  | 	return c.ShouldBindBodyWith(obj, binding.XML) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ShouldBindBodyWithYAML is a shortcut for c.ShouldBindBodyWith(obj, binding.YAML). | ||||||
|  | func (c *Context) ShouldBindBodyWithYAML(obj any) error { | ||||||
|  | 	return c.ShouldBindBodyWith(obj, binding.YAML) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ShouldBindBodyWithTOML is a shortcut for c.ShouldBindBodyWith(obj, binding.TOML). | ||||||
|  | func (c *Context) ShouldBindBodyWithTOML(obj any) error { | ||||||
|  | 	return c.ShouldBindBodyWith(obj, binding.TOML) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // ClientIP implements one best effort algorithm to return the real client IP. | // ClientIP implements one best effort algorithm to return the real client IP. | ||||||
| // It calls c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not. | // It calls c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not. | ||||||
| // If it is it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]). | // If it is it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]). | ||||||
|  | @ -873,6 +904,9 @@ func (c *Context) GetHeader(key string) string { | ||||||
| 
 | 
 | ||||||
| // GetRawData returns stream data. | // GetRawData returns stream data. | ||||||
| func (c *Context) GetRawData() ([]byte, error) { | func (c *Context) GetRawData() ([]byte, error) { | ||||||
|  | 	if c.Request.Body == nil { | ||||||
|  | 		return nil, errors.New("cannot read nil body") | ||||||
|  | 	} | ||||||
| 	return io.ReadAll(c.Request.Body) | 	return io.ReadAll(c.Request.Body) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1215,7 +1249,7 @@ func (c *Context) Err() error { | ||||||
| // if no value is associated with key. Successive calls to Value with | // if no value is associated with key. Successive calls to Value with | ||||||
| // the same key returns the same result. | // the same key returns the same result. | ||||||
| func (c *Context) Value(key any) any { | func (c *Context) Value(key any) any { | ||||||
| 	if key == 0 { | 	if key == ContextRequestKey { | ||||||
| 		return c.Request | 		return c.Request | ||||||
| 	} | 	} | ||||||
| 	if key == ContextKey { | 	if key == ContextKey { | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								vendor/github.com/gin-gonic/gin/debug.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/gin-gonic/gin/debug.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -23,6 +23,9 @@ func IsDebugging() bool { | ||||||
| // DebugPrintRouteFunc indicates debug log output format. | // DebugPrintRouteFunc indicates debug log output format. | ||||||
| var DebugPrintRouteFunc func(httpMethod, absolutePath, handlerName string, nuHandlers int) | var DebugPrintRouteFunc func(httpMethod, absolutePath, handlerName string, nuHandlers int) | ||||||
| 
 | 
 | ||||||
|  | // DebugPrintFunc indicates debug log output format. | ||||||
|  | var DebugPrintFunc func(format string, values ...interface{}) | ||||||
|  | 
 | ||||||
| func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) { | func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) { | ||||||
| 	if IsDebugging() { | 	if IsDebugging() { | ||||||
| 		nuHandlers := len(handlers) | 		nuHandlers := len(handlers) | ||||||
|  | @ -48,12 +51,19 @@ func debugPrintLoadTemplate(tmpl *template.Template) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func debugPrint(format string, values ...any) { | func debugPrint(format string, values ...any) { | ||||||
| 	if IsDebugging() { | 	if !IsDebugging() { | ||||||
| 		if !strings.HasSuffix(format, "\n") { | 		return | ||||||
| 			format += "\n" |  | ||||||
| 		} |  | ||||||
| 		fmt.Fprintf(DefaultWriter, "[GIN-debug] "+format, values...) |  | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	if DebugPrintFunc != nil { | ||||||
|  | 		DebugPrintFunc(format, values...) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if !strings.HasSuffix(format, "\n") { | ||||||
|  | 		format += "\n" | ||||||
|  | 	} | ||||||
|  | 	fmt.Fprintf(DefaultWriter, "[GIN-debug] "+format, values...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func getMinVer(v string) (uint64, error) { | func getMinVer(v string) (uint64, error) { | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/gin-gonic/gin/deprecated.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/gin-gonic/gin/deprecated.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -12,6 +12,8 @@ import ( | ||||||
| 
 | 
 | ||||||
| // BindWith binds the passed struct pointer using the specified binding engine. | // BindWith binds the passed struct pointer using the specified binding engine. | ||||||
| // See the binding package. | // See the binding package. | ||||||
|  | // | ||||||
|  | // Deprecated: Use MustBindWith or ShouldBindWith. | ||||||
| func (c *Context) BindWith(obj any, b binding.Binding) error { | func (c *Context) BindWith(obj any, b binding.Binding) error { | ||||||
| 	log.Println(`BindWith(\"any, binding.Binding\") error is going to | 	log.Println(`BindWith(\"any, binding.Binding\") error is going to | ||||||
| 	be deprecated, please check issue #662 and either use MustBindWith() if you | 	be deprecated, please check issue #662 and either use MustBindWith() if you | ||||||
|  |  | ||||||
							
								
								
									
										37
									
								
								vendor/github.com/gin-gonic/gin/gin.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/gin-gonic/gin/gin.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -47,6 +47,9 @@ var regRemoveRepeatedChar = regexp.MustCompile("/{2,}") | ||||||
| // HandlerFunc defines the handler used by gin middleware as return value. | // HandlerFunc defines the handler used by gin middleware as return value. | ||||||
| type HandlerFunc func(*Context) | type HandlerFunc func(*Context) | ||||||
| 
 | 
 | ||||||
|  | // OptionFunc defines the function to change the default configuration | ||||||
|  | type OptionFunc func(*Engine) | ||||||
|  | 
 | ||||||
| // HandlersChain defines a HandlerFunc slice. | // HandlersChain defines a HandlerFunc slice. | ||||||
| type HandlersChain []HandlerFunc | type HandlersChain []HandlerFunc | ||||||
| 
 | 
 | ||||||
|  | @ -77,6 +80,8 @@ const ( | ||||||
| 	// PlatformCloudflare when using Cloudflare's CDN. Trust CF-Connecting-IP for determining | 	// PlatformCloudflare when using Cloudflare's CDN. Trust CF-Connecting-IP for determining | ||||||
| 	// the client's IP | 	// the client's IP | ||||||
| 	PlatformCloudflare = "CF-Connecting-IP" | 	PlatformCloudflare = "CF-Connecting-IP" | ||||||
|  | 	// PlatformFlyIO when running on Fly.io. Trust Fly-Client-IP for determining the client's IP | ||||||
|  | 	PlatformFlyIO = "Fly-Client-IP" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Engine is the framework's instance, it contains the muxer, middleware and configuration settings. | // Engine is the framework's instance, it contains the muxer, middleware and configuration settings. | ||||||
|  | @ -180,7 +185,7 @@ var _ IRouter = (*Engine)(nil) | ||||||
| // - ForwardedByClientIP:    true | // - ForwardedByClientIP:    true | ||||||
| // - UseRawPath:             false | // - UseRawPath:             false | ||||||
| // - UnescapePathValues:     true | // - UnescapePathValues:     true | ||||||
| func New() *Engine { | func New(opts ...OptionFunc) *Engine { | ||||||
| 	debugPrintWARNINGNew() | 	debugPrintWARNINGNew() | ||||||
| 	engine := &Engine{ | 	engine := &Engine{ | ||||||
| 		RouterGroup: RouterGroup{ | 		RouterGroup: RouterGroup{ | ||||||
|  | @ -209,15 +214,15 @@ func New() *Engine { | ||||||
| 	engine.pool.New = func() any { | 	engine.pool.New = func() any { | ||||||
| 		return engine.allocateContext(engine.maxParams) | 		return engine.allocateContext(engine.maxParams) | ||||||
| 	} | 	} | ||||||
| 	return engine | 	return engine.With(opts...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Default returns an Engine instance with the Logger and Recovery middleware already attached. | // Default returns an Engine instance with the Logger and Recovery middleware already attached. | ||||||
| func Default() *Engine { | func Default(opts ...OptionFunc) *Engine { | ||||||
| 	debugPrintWARNINGDefault() | 	debugPrintWARNINGDefault() | ||||||
| 	engine := New() | 	engine := New() | ||||||
| 	engine.Use(Logger(), Recovery()) | 	engine.Use(Logger(), Recovery()) | ||||||
| 	return engine | 	return engine.With(opts...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (engine *Engine) Handler() http.Handler { | func (engine *Engine) Handler() http.Handler { | ||||||
|  | @ -311,6 +316,15 @@ func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes { | ||||||
| 	return engine | 	return engine | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // With returns a new Engine instance with the provided options. | ||||||
|  | func (engine *Engine) With(opts ...OptionFunc) *Engine { | ||||||
|  | 	for _, opt := range opts { | ||||||
|  | 		opt(engine) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return engine | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (engine *Engine) rebuild404Handlers() { | func (engine *Engine) rebuild404Handlers() { | ||||||
| 	engine.allNoRoute = engine.combineHandlers(engine.noRoute) | 	engine.allNoRoute = engine.combineHandlers(engine.noRoute) | ||||||
| } | } | ||||||
|  | @ -334,7 +348,6 @@ func (engine *Engine) addRoute(method, path string, handlers HandlersChain) { | ||||||
| 	} | 	} | ||||||
| 	root.addRoute(path, handlers) | 	root.addRoute(path, handlers) | ||||||
| 
 | 
 | ||||||
| 	// Update maxParams |  | ||||||
| 	if paramsCount := countParams(path); paramsCount > engine.maxParams { | 	if paramsCount := countParams(path); paramsCount > engine.maxParams { | ||||||
| 		engine.maxParams = paramsCount | 		engine.maxParams = paramsCount | ||||||
| 	} | 	} | ||||||
|  | @ -634,17 +647,25 @@ func (engine *Engine) handleHTTPRequest(c *Context) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if engine.HandleMethodNotAllowed { | 	if engine.HandleMethodNotAllowed { | ||||||
|  | 		// According to RFC 7231 section 6.5.5, MUST generate an Allow header field in response | ||||||
|  | 		// containing a list of the target resource's currently supported methods. | ||||||
|  | 		allowed := make([]string, 0, len(t)-1) | ||||||
| 		for _, tree := range engine.trees { | 		for _, tree := range engine.trees { | ||||||
| 			if tree.method == httpMethod { | 			if tree.method == httpMethod { | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 			if value := tree.root.getValue(rPath, nil, c.skippedNodes, unescape); value.handlers != nil { | 			if value := tree.root.getValue(rPath, nil, c.skippedNodes, unescape); value.handlers != nil { | ||||||
| 				c.handlers = engine.allNoMethod | 				allowed = append(allowed, tree.method) | ||||||
| 				serveError(c, http.StatusMethodNotAllowed, default405Body) |  | ||||||
| 				return |  | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 		if len(allowed) > 0 { | ||||||
|  | 			c.handlers = engine.allNoMethod | ||||||
|  | 			c.writermem.Header().Set("Allow", strings.Join(allowed, ", ")) | ||||||
|  | 			serveError(c, http.StatusMethodNotAllowed, default405Body) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	c.handlers = engine.allNoRoute | 	c.handlers = engine.allNoRoute | ||||||
| 	serveError(c, http.StatusNotFound, default404Body) | 	serveError(c, http.StatusNotFound, default404Body) | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										63
									
								
								vendor/github.com/gin-gonic/gin/logger.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/gin-gonic/gin/logger.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -47,8 +47,15 @@ type LoggerConfig struct { | ||||||
| 	// SkipPaths is an url path array which logs are not written. | 	// SkipPaths is an url path array which logs are not written. | ||||||
| 	// Optional. | 	// Optional. | ||||||
| 	SkipPaths []string | 	SkipPaths []string | ||||||
|  | 
 | ||||||
|  | 	// Skip is a Skipper that indicates which logs should not be written. | ||||||
|  | 	// Optional. | ||||||
|  | 	Skip Skipper | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Skipper is a function to skip logs based on provided Context | ||||||
|  | type Skipper func(c *Context) bool | ||||||
|  | 
 | ||||||
| // LogFormatter gives the signature of the formatter function passed to LoggerWithFormatter | // LogFormatter gives the signature of the formatter function passed to LoggerWithFormatter | ||||||
| type LogFormatter func(params LogFormatterParams) string | type LogFormatter func(params LogFormatterParams) string | ||||||
| 
 | 
 | ||||||
|  | @ -83,6 +90,8 @@ func (p *LogFormatterParams) StatusCodeColor() string { | ||||||
| 	code := p.StatusCode | 	code := p.StatusCode | ||||||
| 
 | 
 | ||||||
| 	switch { | 	switch { | ||||||
|  | 	case code >= http.StatusContinue && code < http.StatusOK: | ||||||
|  | 		return white | ||||||
| 	case code >= http.StatusOK && code < http.StatusMultipleChoices: | 	case code >= http.StatusOK && code < http.StatusMultipleChoices: | ||||||
| 		return green | 		return green | ||||||
| 	case code >= http.StatusMultipleChoices && code < http.StatusBadRequest: | 	case code >= http.StatusMultipleChoices && code < http.StatusBadRequest: | ||||||
|  | @ -239,32 +248,34 @@ func LoggerWithConfig(conf LoggerConfig) HandlerFunc { | ||||||
| 		// Process request | 		// Process request | ||||||
| 		c.Next() | 		c.Next() | ||||||
| 
 | 
 | ||||||
| 		// Log only when path is not being skipped | 		// Log only when it is not being skipped | ||||||
| 		if _, ok := skip[path]; !ok { | 		if _, ok := skip[path]; ok || (conf.Skip != nil && conf.Skip(c)) { | ||||||
| 			param := LogFormatterParams{ | 			return | ||||||
| 				Request: c.Request, |  | ||||||
| 				isTerm:  isTerm, |  | ||||||
| 				Keys:    c.Keys, |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			// Stop timer |  | ||||||
| 			param.TimeStamp = time.Now() |  | ||||||
| 			param.Latency = param.TimeStamp.Sub(start) |  | ||||||
| 
 |  | ||||||
| 			param.ClientIP = c.ClientIP() |  | ||||||
| 			param.Method = c.Request.Method |  | ||||||
| 			param.StatusCode = c.Writer.Status() |  | ||||||
| 			param.ErrorMessage = c.Errors.ByType(ErrorTypePrivate).String() |  | ||||||
| 
 |  | ||||||
| 			param.BodySize = c.Writer.Size() |  | ||||||
| 
 |  | ||||||
| 			if raw != "" { |  | ||||||
| 				path = path + "?" + raw |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			param.Path = path |  | ||||||
| 
 |  | ||||||
| 			fmt.Fprint(out, formatter(param)) |  | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		param := LogFormatterParams{ | ||||||
|  | 			Request: c.Request, | ||||||
|  | 			isTerm:  isTerm, | ||||||
|  | 			Keys:    c.Keys, | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Stop timer | ||||||
|  | 		param.TimeStamp = time.Now() | ||||||
|  | 		param.Latency = param.TimeStamp.Sub(start) | ||||||
|  | 
 | ||||||
|  | 		param.ClientIP = c.ClientIP() | ||||||
|  | 		param.Method = c.Request.Method | ||||||
|  | 		param.StatusCode = c.Writer.Status() | ||||||
|  | 		param.ErrorMessage = c.Errors.ByType(ErrorTypePrivate).String() | ||||||
|  | 
 | ||||||
|  | 		param.BodySize = c.Writer.Size() | ||||||
|  | 
 | ||||||
|  | 		if raw != "" { | ||||||
|  | 			path = path + "?" + raw | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		param.Path = path | ||||||
|  | 
 | ||||||
|  | 		fmt.Fprint(out, formatter(param)) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								vendor/github.com/gin-gonic/gin/render/render.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/gin-gonic/gin/render/render.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -15,22 +15,22 @@ type Render interface { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	_ Render     = JSON{} | 	_ Render     = (*JSON)(nil) | ||||||
| 	_ Render     = IndentedJSON{} | 	_ Render     = (*IndentedJSON)(nil) | ||||||
| 	_ Render     = SecureJSON{} | 	_ Render     = (*SecureJSON)(nil) | ||||||
| 	_ Render     = JsonpJSON{} | 	_ Render     = (*JsonpJSON)(nil) | ||||||
| 	_ Render     = XML{} | 	_ Render     = (*XML)(nil) | ||||||
| 	_ Render     = String{} | 	_ Render     = (*String)(nil) | ||||||
| 	_ Render     = Redirect{} | 	_ Render     = (*Redirect)(nil) | ||||||
| 	_ Render     = Data{} | 	_ Render     = (*Data)(nil) | ||||||
| 	_ Render     = HTML{} | 	_ Render     = (*HTML)(nil) | ||||||
| 	_ HTMLRender = HTMLDebug{} | 	_ HTMLRender = (*HTMLDebug)(nil) | ||||||
| 	_ HTMLRender = HTMLProduction{} | 	_ HTMLRender = (*HTMLProduction)(nil) | ||||||
| 	_ Render     = YAML{} | 	_ Render     = (*YAML)(nil) | ||||||
| 	_ Render     = Reader{} | 	_ Render     = (*Reader)(nil) | ||||||
| 	_ Render     = AsciiJSON{} | 	_ Render     = (*AsciiJSON)(nil) | ||||||
| 	_ Render     = ProtoBuf{} | 	_ Render     = (*ProtoBuf)(nil) | ||||||
| 	_ Render     = TOML{} | 	_ Render     = (*TOML)(nil) | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func writeContentType(w http.ResponseWriter, value []string) { | func writeContentType(w http.ResponseWriter, value []string) { | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/gin-gonic/gin/render/yaml.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/gin-gonic/gin/render/yaml.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -15,7 +15,7 @@ type YAML struct { | ||||||
| 	Data any | 	Data any | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var yamlContentType = []string{"application/x-yaml; charset=utf-8"} | var yamlContentType = []string{"application/yaml; charset=utf-8"} | ||||||
| 
 | 
 | ||||||
| // Render (YAML) marshals the given interface object and writes data with custom ContentType. | // Render (YAML) marshals the given interface object and writes data with custom ContentType. | ||||||
| func (r YAML) Render(w http.ResponseWriter) error { | func (r YAML) Render(w http.ResponseWriter) error { | ||||||
|  |  | ||||||
							
								
								
									
										43
									
								
								vendor/github.com/gin-gonic/gin/tree.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/gin-gonic/gin/tree.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -351,7 +351,10 @@ func (n *node) insertChild(path string, fullPath string, handlers HandlersChain) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if len(n.path) > 0 && n.path[len(n.path)-1] == '/' { | 		if len(n.path) > 0 && n.path[len(n.path)-1] == '/' { | ||||||
| 			pathSeg := strings.SplitN(n.children[0].path, "/", 2)[0] | 			pathSeg := "" | ||||||
|  | 			if len(n.children) != 0 { | ||||||
|  | 				pathSeg = strings.SplitN(n.children[0].path, "/", 2)[0] | ||||||
|  | 			} | ||||||
| 			panic("catch-all wildcard '" + path + | 			panic("catch-all wildcard '" + path + | ||||||
| 				"' in new path '" + fullPath + | 				"' in new path '" + fullPath + | ||||||
| 				"' conflicts with existing path segment '" + pathSeg + | 				"' conflicts with existing path segment '" + pathSeg + | ||||||
|  | @ -478,7 +481,7 @@ walk: // Outer loop for walking the tree | ||||||
| 					// We can recommend to redirect to the same URL without a | 					// We can recommend to redirect to the same URL without a | ||||||
| 					// trailing slash if a leaf exists for that path. | 					// trailing slash if a leaf exists for that path. | ||||||
| 					value.tsr = path == "/" && n.handlers != nil | 					value.tsr = path == "/" && n.handlers != nil | ||||||
| 					return | 					return value | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				// Handle wildcard child, which is always at the end of the array | 				// Handle wildcard child, which is always at the end of the array | ||||||
|  | @ -497,7 +500,14 @@ walk: // Outer loop for walking the tree | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					// Save param value | 					// Save param value | ||||||
| 					if params != nil && cap(*params) > 0 { | 					if params != nil { | ||||||
|  | 						// Preallocate capacity if necessary | ||||||
|  | 						if cap(*params) < int(globalParamsCount) { | ||||||
|  | 							newParams := make(Params, len(*params), globalParamsCount) | ||||||
|  | 							copy(newParams, *params) | ||||||
|  | 							*params = newParams | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
| 						if value.params == nil { | 						if value.params == nil { | ||||||
| 							value.params = params | 							value.params = params | ||||||
| 						} | 						} | ||||||
|  | @ -526,12 +536,12 @@ walk: // Outer loop for walking the tree | ||||||
| 
 | 
 | ||||||
| 						// ... but we can't | 						// ... but we can't | ||||||
| 						value.tsr = len(path) == end+1 | 						value.tsr = len(path) == end+1 | ||||||
| 						return | 						return value | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					if value.handlers = n.handlers; value.handlers != nil { | 					if value.handlers = n.handlers; value.handlers != nil { | ||||||
| 						value.fullPath = n.fullPath | 						value.fullPath = n.fullPath | ||||||
| 						return | 						return value | ||||||
| 					} | 					} | ||||||
| 					if len(n.children) == 1 { | 					if len(n.children) == 1 { | ||||||
| 						// No handle found. Check if a handle for this path + a | 						// No handle found. Check if a handle for this path + a | ||||||
|  | @ -539,11 +549,18 @@ walk: // Outer loop for walking the tree | ||||||
| 						n = n.children[0] | 						n = n.children[0] | ||||||
| 						value.tsr = (n.path == "/" && n.handlers != nil) || (n.path == "" && n.indices == "/") | 						value.tsr = (n.path == "/" && n.handlers != nil) || (n.path == "" && n.indices == "/") | ||||||
| 					} | 					} | ||||||
| 					return | 					return value | ||||||
| 
 | 
 | ||||||
| 				case catchAll: | 				case catchAll: | ||||||
| 					// Save param value | 					// Save param value | ||||||
| 					if params != nil { | 					if params != nil { | ||||||
|  | 						// Preallocate capacity if necessary | ||||||
|  | 						if cap(*params) < int(globalParamsCount) { | ||||||
|  | 							newParams := make(Params, len(*params), globalParamsCount) | ||||||
|  | 							copy(newParams, *params) | ||||||
|  | 							*params = newParams | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
| 						if value.params == nil { | 						if value.params == nil { | ||||||
| 							value.params = params | 							value.params = params | ||||||
| 						} | 						} | ||||||
|  | @ -564,7 +581,7 @@ walk: // Outer loop for walking the tree | ||||||
| 
 | 
 | ||||||
| 					value.handlers = n.handlers | 					value.handlers = n.handlers | ||||||
| 					value.fullPath = n.fullPath | 					value.fullPath = n.fullPath | ||||||
| 					return | 					return value | ||||||
| 
 | 
 | ||||||
| 				default: | 				default: | ||||||
| 					panic("invalid node type") | 					panic("invalid node type") | ||||||
|  | @ -595,7 +612,7 @@ walk: // Outer loop for walking the tree | ||||||
| 			// Check if this node has a handle registered. | 			// Check if this node has a handle registered. | ||||||
| 			if value.handlers = n.handlers; value.handlers != nil { | 			if value.handlers = n.handlers; value.handlers != nil { | ||||||
| 				value.fullPath = n.fullPath | 				value.fullPath = n.fullPath | ||||||
| 				return | 				return value | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// If there is no handle for this route, but this route has a | 			// If there is no handle for this route, but this route has a | ||||||
|  | @ -603,12 +620,12 @@ walk: // Outer loop for walking the tree | ||||||
| 			// additional trailing slash | 			// additional trailing slash | ||||||
| 			if path == "/" && n.wildChild && n.nType != root { | 			if path == "/" && n.wildChild && n.nType != root { | ||||||
| 				value.tsr = true | 				value.tsr = true | ||||||
| 				return | 				return value | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if path == "/" && n.nType == static { | 			if path == "/" && n.nType == static { | ||||||
| 				value.tsr = true | 				value.tsr = true | ||||||
| 				return | 				return value | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// No handle found. Check if a handle for this path + a | 			// No handle found. Check if a handle for this path + a | ||||||
|  | @ -618,11 +635,11 @@ walk: // Outer loop for walking the tree | ||||||
| 					n = n.children[i] | 					n = n.children[i] | ||||||
| 					value.tsr = (len(n.path) == 1 && n.handlers != nil) || | 					value.tsr = (len(n.path) == 1 && n.handlers != nil) || | ||||||
| 						(n.nType == catchAll && n.children[0].handlers != nil) | 						(n.nType == catchAll && n.children[0].handlers != nil) | ||||||
| 					return | 					return value | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			return | 			return value | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// Nothing found. We can recommend to redirect to the same URL with an | 		// Nothing found. We can recommend to redirect to the same URL with an | ||||||
|  | @ -648,7 +665,7 @@ walk: // Outer loop for walking the tree | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return | 		return value | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/gin-gonic/gin/version.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/gin-gonic/gin/version.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -5,4 +5,4 @@ | ||||||
| package gin | package gin | ||||||
| 
 | 
 | ||||||
| // Version is the current gin framework's version. | // Version is the current gin framework's version. | ||||||
| const Version = "v1.9.1" | const Version = "v1.10.0" | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/go-swagger/go-swagger/generator/operation.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-swagger/go-swagger/generator/operation.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -788,7 +788,7 @@ func (b *codeGenOpBuilder) MakeParameter(receiver string, resolver *typeResolver | ||||||
| 				return GenParameter{}, err | 				return GenParameter{}, err | ||||||
| 			} | 			} | ||||||
| 			res.Child = &pi | 			res.Child = &pi | ||||||
| 			// Propagates HasValidations from from child array | 			// Propagates HasValidations from child array | ||||||
| 			hasChildValidations = pi.HasValidations | 			hasChildValidations = pi.HasValidations | ||||||
| 		} | 		} | ||||||
| 		res.IsNullable = !param.Required && !param.AllowEmptyValue | 		res.IsNullable = !param.Required && !param.AllowEmptyValue | ||||||
|  |  | ||||||
							
								
								
									
										201
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										201
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,201 +0,0 @@ | ||||||
|                                  Apache License |  | ||||||
|                            Version 2.0, January 2004 |  | ||||||
|                         http://www.apache.org/licenses/ |  | ||||||
| 
 |  | ||||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |  | ||||||
| 
 |  | ||||||
|    1. Definitions. |  | ||||||
| 
 |  | ||||||
|       "License" shall mean the terms and conditions for use, reproduction, |  | ||||||
|       and distribution as defined by Sections 1 through 9 of this document. |  | ||||||
| 
 |  | ||||||
|       "Licensor" shall mean the copyright owner or entity authorized by |  | ||||||
|       the copyright owner that is granting the License. |  | ||||||
| 
 |  | ||||||
|       "Legal Entity" shall mean the union of the acting entity and all |  | ||||||
|       other entities that control, are controlled by, or are under common |  | ||||||
|       control with that entity. For the purposes of this definition, |  | ||||||
|       "control" means (i) the power, direct or indirect, to cause the |  | ||||||
|       direction or management of such entity, whether by contract or |  | ||||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the |  | ||||||
|       outstanding shares, or (iii) beneficial ownership of such entity. |  | ||||||
| 
 |  | ||||||
|       "You" (or "Your") shall mean an individual or Legal Entity |  | ||||||
|       exercising permissions granted by this License. |  | ||||||
| 
 |  | ||||||
|       "Source" form shall mean the preferred form for making modifications, |  | ||||||
|       including but not limited to software source code, documentation |  | ||||||
|       source, and configuration files. |  | ||||||
| 
 |  | ||||||
|       "Object" form shall mean any form resulting from mechanical |  | ||||||
|       transformation or translation of a Source form, including but |  | ||||||
|       not limited to compiled object code, generated documentation, |  | ||||||
|       and conversions to other media types. |  | ||||||
| 
 |  | ||||||
|       "Work" shall mean the work of authorship, whether in Source or |  | ||||||
|       Object form, made available under the License, as indicated by a |  | ||||||
|       copyright notice that is included in or attached to the work |  | ||||||
|       (an example is provided in the Appendix below). |  | ||||||
| 
 |  | ||||||
|       "Derivative Works" shall mean any work, whether in Source or Object |  | ||||||
|       form, that is based on (or derived from) the Work and for which the |  | ||||||
|       editorial revisions, annotations, elaborations, or other modifications |  | ||||||
|       represent, as a whole, an original work of authorship. For the purposes |  | ||||||
|       of this License, Derivative Works shall not include works that remain |  | ||||||
|       separable from, or merely link (or bind by name) to the interfaces of, |  | ||||||
|       the Work and Derivative Works thereof. |  | ||||||
| 
 |  | ||||||
|       "Contribution" shall mean any work of authorship, including |  | ||||||
|       the original version of the Work and any modifications or additions |  | ||||||
|       to that Work or Derivative Works thereof, that is intentionally |  | ||||||
|       submitted to Licensor for inclusion in the Work by the copyright owner |  | ||||||
|       or by an individual or Legal Entity authorized to submit on behalf of |  | ||||||
|       the copyright owner. For the purposes of this definition, "submitted" |  | ||||||
|       means any form of electronic, verbal, or written communication sent |  | ||||||
|       to the Licensor or its representatives, including but not limited to |  | ||||||
|       communication on electronic mailing lists, source code control systems, |  | ||||||
|       and issue tracking systems that are managed by, or on behalf of, the |  | ||||||
|       Licensor for the purpose of discussing and improving the Work, but |  | ||||||
|       excluding communication that is conspicuously marked or otherwise |  | ||||||
|       designated in writing by the copyright owner as "Not a Contribution." |  | ||||||
| 
 |  | ||||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity |  | ||||||
|       on behalf of whom a Contribution has been received by Licensor and |  | ||||||
|       subsequently incorporated within the Work. |  | ||||||
| 
 |  | ||||||
|    2. Grant of Copyright License. Subject to the terms and conditions of |  | ||||||
|       this License, each Contributor hereby grants to You a perpetual, |  | ||||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable |  | ||||||
|       copyright license to reproduce, prepare Derivative Works of, |  | ||||||
|       publicly display, publicly perform, sublicense, and distribute the |  | ||||||
|       Work and such Derivative Works in Source or Object form. |  | ||||||
| 
 |  | ||||||
|    3. Grant of Patent License. Subject to the terms and conditions of |  | ||||||
|       this License, each Contributor hereby grants to You a perpetual, |  | ||||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable |  | ||||||
|       (except as stated in this section) patent license to make, have made, |  | ||||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, |  | ||||||
|       where such license applies only to those patent claims licensable |  | ||||||
|       by such Contributor that are necessarily infringed by their |  | ||||||
|       Contribution(s) alone or by combination of their Contribution(s) |  | ||||||
|       with the Work to which such Contribution(s) was submitted. If You |  | ||||||
|       institute patent litigation against any entity (including a |  | ||||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work |  | ||||||
|       or a Contribution incorporated within the Work constitutes direct |  | ||||||
|       or contributory patent infringement, then any patent licenses |  | ||||||
|       granted to You under this License for that Work shall terminate |  | ||||||
|       as of the date such litigation is filed. |  | ||||||
| 
 |  | ||||||
|    4. Redistribution. You may reproduce and distribute copies of the |  | ||||||
|       Work or Derivative Works thereof in any medium, with or without |  | ||||||
|       modifications, and in Source or Object form, provided that You |  | ||||||
|       meet the following conditions: |  | ||||||
| 
 |  | ||||||
|       (a) You must give any other recipients of the Work or |  | ||||||
|           Derivative Works a copy of this License; and |  | ||||||
| 
 |  | ||||||
|       (b) You must cause any modified files to carry prominent notices |  | ||||||
|           stating that You changed the files; and |  | ||||||
| 
 |  | ||||||
|       (c) You must retain, in the Source form of any Derivative Works |  | ||||||
|           that You distribute, all copyright, patent, trademark, and |  | ||||||
|           attribution notices from the Source form of the Work, |  | ||||||
|           excluding those notices that do not pertain to any part of |  | ||||||
|           the Derivative Works; and |  | ||||||
| 
 |  | ||||||
|       (d) If the Work includes a "NOTICE" text file as part of its |  | ||||||
|           distribution, then any Derivative Works that You distribute must |  | ||||||
|           include a readable copy of the attribution notices contained |  | ||||||
|           within such NOTICE file, excluding those notices that do not |  | ||||||
|           pertain to any part of the Derivative Works, in at least one |  | ||||||
|           of the following places: within a NOTICE text file distributed |  | ||||||
|           as part of the Derivative Works; within the Source form or |  | ||||||
|           documentation, if provided along with the Derivative Works; or, |  | ||||||
|           within a display generated by the Derivative Works, if and |  | ||||||
|           wherever such third-party notices normally appear. The contents |  | ||||||
|           of the NOTICE file are for informational purposes only and |  | ||||||
|           do not modify the License. You may add Your own attribution |  | ||||||
|           notices within Derivative Works that You distribute, alongside |  | ||||||
|           or as an addendum to the NOTICE text from the Work, provided |  | ||||||
|           that such additional attribution notices cannot be construed |  | ||||||
|           as modifying the License. |  | ||||||
| 
 |  | ||||||
|       You may add Your own copyright statement to Your modifications and |  | ||||||
|       may provide additional or different license terms and conditions |  | ||||||
|       for use, reproduction, or distribution of Your modifications, or |  | ||||||
|       for any such Derivative Works as a whole, provided Your use, |  | ||||||
|       reproduction, and distribution of the Work otherwise complies with |  | ||||||
|       the conditions stated in this License. |  | ||||||
| 
 |  | ||||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, |  | ||||||
|       any Contribution intentionally submitted for inclusion in the Work |  | ||||||
|       by You to the Licensor shall be under the terms and conditions of |  | ||||||
|       this License, without any additional terms or conditions. |  | ||||||
|       Notwithstanding the above, nothing herein shall supersede or modify |  | ||||||
|       the terms of any separate license agreement you may have executed |  | ||||||
|       with Licensor regarding such Contributions. |  | ||||||
| 
 |  | ||||||
|    6. Trademarks. This License does not grant permission to use the trade |  | ||||||
|       names, trademarks, service marks, or product names of the Licensor, |  | ||||||
|       except as required for reasonable and customary use in describing the |  | ||||||
|       origin of the Work and reproducing the content of the NOTICE file. |  | ||||||
| 
 |  | ||||||
|    7. Disclaimer of Warranty. Unless required by applicable law or |  | ||||||
|       agreed to in writing, Licensor provides the Work (and each |  | ||||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, |  | ||||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |  | ||||||
|       implied, including, without limitation, any warranties or conditions |  | ||||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |  | ||||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the |  | ||||||
|       appropriateness of using or redistributing the Work and assume any |  | ||||||
|       risks associated with Your exercise of permissions under this License. |  | ||||||
| 
 |  | ||||||
|    8. Limitation of Liability. In no event and under no legal theory, |  | ||||||
|       whether in tort (including negligence), contract, or otherwise, |  | ||||||
|       unless required by applicable law (such as deliberate and grossly |  | ||||||
|       negligent acts) or agreed to in writing, shall any Contributor be |  | ||||||
|       liable to You for damages, including any direct, indirect, special, |  | ||||||
|       incidental, or consequential damages of any character arising as a |  | ||||||
|       result of this License or out of the use or inability to use the |  | ||||||
|       Work (including but not limited to damages for loss of goodwill, |  | ||||||
|       work stoppage, computer failure or malfunction, or any and all |  | ||||||
|       other commercial damages or losses), even if such Contributor |  | ||||||
|       has been advised of the possibility of such damages. |  | ||||||
| 
 |  | ||||||
|    9. Accepting Warranty or Additional Liability. While redistributing |  | ||||||
|       the Work or Derivative Works thereof, You may choose to offer, |  | ||||||
|       and charge a fee for, acceptance of support, warranty, indemnity, |  | ||||||
|       or other liability obligations and/or rights consistent with this |  | ||||||
|       License. However, in accepting such obligations, You may act only |  | ||||||
|       on Your own behalf and on Your sole responsibility, not on behalf |  | ||||||
|       of any other Contributor, and only if You agree to indemnify, |  | ||||||
|       defend, and hold each Contributor harmless for any liability |  | ||||||
|       incurred by, or claims asserted against, such Contributor by reason |  | ||||||
|       of your accepting any such warranty or additional liability. |  | ||||||
| 
 |  | ||||||
|    END OF TERMS AND CONDITIONS |  | ||||||
| 
 |  | ||||||
|    APPENDIX: How to apply the Apache License to your work. |  | ||||||
| 
 |  | ||||||
|       To apply the Apache License to your work, attach the following |  | ||||||
|       boilerplate notice, with the fields enclosed by brackets "{}" |  | ||||||
|       replaced with your own identifying information. (Don't include |  | ||||||
|       the brackets!)  The text should be enclosed in the appropriate |  | ||||||
|       comment syntax for the file format. We also recommend that a |  | ||||||
|       file or class name and description of purpose be included on the |  | ||||||
|       same "printed page" as the copyright notice for easier |  | ||||||
|       identification within third-party archives. |  | ||||||
| 
 |  | ||||||
|    Copyright {yyyy} {name of copyright owner} |  | ||||||
| 
 |  | ||||||
|    Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
|    you may not use this file except in compliance with the License. |  | ||||||
|    You may obtain a copy of the License at |  | ||||||
| 
 |  | ||||||
|        http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| 
 |  | ||||||
|    Unless required by applicable law or agreed to in writing, software |  | ||||||
|    distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
|    See the License for the specific language governing permissions and |  | ||||||
|    limitations under the License. |  | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| Copyright 2012 Matt T. Proud (matt.proud@gmail.com) |  | ||||||
							
								
								
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| cover.dat |  | ||||||
							
								
								
									
										7
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,7 +0,0 @@ | ||||||
| all: |  | ||||||
| 
 |  | ||||||
| cover: |  | ||||||
| 	go test -cover -v -coverprofile=cover.dat ./... |  | ||||||
| 	go tool cover -func cover.dat |  | ||||||
| 
 |  | ||||||
| .PHONY: cover |  | ||||||
							
								
								
									
										81
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										81
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,81 +0,0 @@ | ||||||
| // Copyright 2013 Matt T. Proud |  | ||||||
| // |  | ||||||
| // Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| // you may not use this file except in compliance with the License. |  | ||||||
| // You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //     http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| // Unless required by applicable law or agreed to in writing, software |  | ||||||
| // distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| // See the License for the specific language governing permissions and |  | ||||||
| // limitations under the License. |  | ||||||
| 
 |  | ||||||
| package pbutil |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"encoding/binary" |  | ||||||
| 	"errors" |  | ||||||
| 	"io" |  | ||||||
| 
 |  | ||||||
| 	"google.golang.org/protobuf/proto" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // TODO: Give error package name prefix in next minor release. |  | ||||||
| var errInvalidVarint = errors.New("invalid varint32 encountered") |  | ||||||
| 
 |  | ||||||
| // ReadDelimited decodes a message from the provided length-delimited stream, |  | ||||||
| // where the length is encoded as 32-bit varint prefix to the message body. |  | ||||||
| // It returns the total number of bytes read and any applicable error.  This is |  | ||||||
| // roughly equivalent to the companion Java API's |  | ||||||
| // MessageLite#parseDelimitedFrom.  As per the reader contract, this function |  | ||||||
| // calls r.Read repeatedly as required until exactly one message including its |  | ||||||
| // prefix is read and decoded (or an error has occurred).  The function never |  | ||||||
| // reads more bytes from the stream than required.  The function never returns |  | ||||||
| // an error if a message has been read and decoded correctly, even if the end |  | ||||||
| // of the stream has been reached in doing so.  In that case, any subsequent |  | ||||||
| // calls return (0, io.EOF). |  | ||||||
| func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { |  | ||||||
| 	// TODO: Consider allowing the caller to specify a decode buffer in the |  | ||||||
| 	// next major version. |  | ||||||
| 
 |  | ||||||
| 	// TODO: Consider using error wrapping to annotate error state in pass- |  | ||||||
| 	// through cases in the next minor version. |  | ||||||
| 
 |  | ||||||
| 	// Per AbstractParser#parsePartialDelimitedFrom with |  | ||||||
| 	// CodedInputStream#readRawVarint32. |  | ||||||
| 	var headerBuf [binary.MaxVarintLen32]byte |  | ||||||
| 	var bytesRead, varIntBytes int |  | ||||||
| 	var messageLength uint64 |  | ||||||
| 	for varIntBytes == 0 { // i.e. no varint has been decoded yet. |  | ||||||
| 		if bytesRead >= len(headerBuf) { |  | ||||||
| 			return bytesRead, errInvalidVarint |  | ||||||
| 		} |  | ||||||
| 		// We have to read byte by byte here to avoid reading more bytes |  | ||||||
| 		// than required. Each read byte is appended to what we have |  | ||||||
| 		// read before. |  | ||||||
| 		newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) |  | ||||||
| 		if newBytesRead == 0 { |  | ||||||
| 			if err != nil { |  | ||||||
| 				return bytesRead, err |  | ||||||
| 			} |  | ||||||
| 			// A Reader should not return (0, nil); but if it does, it should |  | ||||||
| 			// be treated as no-op according to the Reader contract. |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		bytesRead += newBytesRead |  | ||||||
| 		// Now present everything read so far to the varint decoder and |  | ||||||
| 		// see if a varint can be decoded already. |  | ||||||
| 		messageLength, varIntBytes = binary.Uvarint(headerBuf[:bytesRead]) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	messageBuf := make([]byte, messageLength) |  | ||||||
| 	newBytesRead, err := io.ReadFull(r, messageBuf) |  | ||||||
| 	bytesRead += newBytesRead |  | ||||||
| 	if err != nil { |  | ||||||
| 		return bytesRead, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return bytesRead, proto.Unmarshal(messageBuf, m) |  | ||||||
| } |  | ||||||
							
								
								
									
										16
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,16 +0,0 @@ | ||||||
| // Copyright 2013 Matt T. Proud |  | ||||||
| // |  | ||||||
| // Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| // you may not use this file except in compliance with the License. |  | ||||||
| // You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //     http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| // Unless required by applicable law or agreed to in writing, software |  | ||||||
| // distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| // See the License for the specific language governing permissions and |  | ||||||
| // limitations under the License. |  | ||||||
| 
 |  | ||||||
| // Package pbutil provides record length-delimited Protocol Buffer streaming. |  | ||||||
| package pbutil |  | ||||||
							
								
								
									
										49
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,49 +0,0 @@ | ||||||
| // Copyright 2013 Matt T. Proud |  | ||||||
| // |  | ||||||
| // Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| // you may not use this file except in compliance with the License. |  | ||||||
| // You may obtain a copy of the License at |  | ||||||
| // |  | ||||||
| //     http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| // |  | ||||||
| // Unless required by applicable law or agreed to in writing, software |  | ||||||
| // distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| // See the License for the specific language governing permissions and |  | ||||||
| // limitations under the License. |  | ||||||
| 
 |  | ||||||
| package pbutil |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"encoding/binary" |  | ||||||
| 	"io" |  | ||||||
| 
 |  | ||||||
| 	"google.golang.org/protobuf/proto" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // WriteDelimited encodes and dumps a message to the provided writer prefixed |  | ||||||
| // with a 32-bit varint indicating the length of the encoded message, producing |  | ||||||
| // a length-delimited record stream, which can be used to chain together |  | ||||||
| // encoded messages of the same type together in a file.  It returns the total |  | ||||||
| // number of bytes written and any applicable error.  This is roughly |  | ||||||
| // equivalent to the companion Java API's MessageLite#writeDelimitedTo. |  | ||||||
| func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { |  | ||||||
| 	// TODO: Consider allowing the caller to specify an encode buffer in the |  | ||||||
| 	// next major version. |  | ||||||
| 
 |  | ||||||
| 	buffer, err := proto.Marshal(m) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return 0, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var buf [binary.MaxVarintLen32]byte |  | ||||||
| 	encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) |  | ||||||
| 
 |  | ||||||
| 	sync, err := w.Write(buf[:encodedLength]) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return sync, err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	n, err = w.Write(buffer) |  | ||||||
| 	return n + sync, err |  | ||||||
| } |  | ||||||
							
								
								
									
										27
									
								
								vendor/github.com/prometheus/common/expfmt/decode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/prometheus/common/expfmt/decode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -14,6 +14,7 @@ | ||||||
| package expfmt | package expfmt | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"bufio" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"math" | 	"math" | ||||||
|  | @ -21,8 +22,8 @@ import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 
 | 
 | ||||||
| 	dto "github.com/prometheus/client_model/go" | 	dto "github.com/prometheus/client_model/go" | ||||||
|  | 	"google.golang.org/protobuf/encoding/protodelim" | ||||||
| 
 | 
 | ||||||
| 	"github.com/matttproud/golang_protobuf_extensions/v2/pbutil" |  | ||||||
| 	"github.com/prometheus/common/model" | 	"github.com/prometheus/common/model" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -44,7 +45,7 @@ func ResponseFormat(h http.Header) Format { | ||||||
| 
 | 
 | ||||||
| 	mediatype, params, err := mime.ParseMediaType(ct) | 	mediatype, params, err := mime.ParseMediaType(ct) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return FmtUnknown | 		return fmtUnknown | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	const textType = "text/plain" | 	const textType = "text/plain" | ||||||
|  | @ -52,28 +53,28 @@ func ResponseFormat(h http.Header) Format { | ||||||
| 	switch mediatype { | 	switch mediatype { | ||||||
| 	case ProtoType: | 	case ProtoType: | ||||||
| 		if p, ok := params["proto"]; ok && p != ProtoProtocol { | 		if p, ok := params["proto"]; ok && p != ProtoProtocol { | ||||||
| 			return FmtUnknown | 			return fmtUnknown | ||||||
| 		} | 		} | ||||||
| 		if e, ok := params["encoding"]; ok && e != "delimited" { | 		if e, ok := params["encoding"]; ok && e != "delimited" { | ||||||
| 			return FmtUnknown | 			return fmtUnknown | ||||||
| 		} | 		} | ||||||
| 		return FmtProtoDelim | 		return fmtProtoDelim | ||||||
| 
 | 
 | ||||||
| 	case textType: | 	case textType: | ||||||
| 		if v, ok := params["version"]; ok && v != TextVersion { | 		if v, ok := params["version"]; ok && v != TextVersion { | ||||||
| 			return FmtUnknown | 			return fmtUnknown | ||||||
| 		} | 		} | ||||||
| 		return FmtText | 		return fmtText | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return FmtUnknown | 	return fmtUnknown | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewDecoder returns a new decoder based on the given input format. | // NewDecoder returns a new decoder based on the given input format. | ||||||
| // If the input format does not imply otherwise, a text format decoder is returned. | // If the input format does not imply otherwise, a text format decoder is returned. | ||||||
| func NewDecoder(r io.Reader, format Format) Decoder { | func NewDecoder(r io.Reader, format Format) Decoder { | ||||||
| 	switch format { | 	switch format.FormatType() { | ||||||
| 	case FmtProtoDelim: | 	case TypeProtoDelim: | ||||||
| 		return &protoDecoder{r: r} | 		return &protoDecoder{r: r} | ||||||
| 	} | 	} | ||||||
| 	return &textDecoder{r: r} | 	return &textDecoder{r: r} | ||||||
|  | @ -86,8 +87,10 @@ type protoDecoder struct { | ||||||
| 
 | 
 | ||||||
| // Decode implements the Decoder interface. | // Decode implements the Decoder interface. | ||||||
| func (d *protoDecoder) Decode(v *dto.MetricFamily) error { | func (d *protoDecoder) Decode(v *dto.MetricFamily) error { | ||||||
| 	_, err := pbutil.ReadDelimited(d.r, v) | 	opts := protodelim.UnmarshalOptions{ | ||||||
| 	if err != nil { | 		MaxSize: -1, | ||||||
|  | 	} | ||||||
|  | 	if err := opts.UnmarshalFrom(bufio.NewReader(d.r), v); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if !model.IsValidMetricName(model.LabelValue(v.GetName())) { | 	if !model.IsValidMetricName(model.LabelValue(v.GetName())) { | ||||||
|  |  | ||||||
							
								
								
									
										78
									
								
								vendor/github.com/prometheus/common/expfmt/encode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/prometheus/common/expfmt/encode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -18,10 +18,12 @@ import ( | ||||||
| 	"io" | 	"io" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 
 | 
 | ||||||
| 	"github.com/matttproud/golang_protobuf_extensions/v2/pbutil" | 	"google.golang.org/protobuf/encoding/protodelim" | ||||||
| 	"github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" |  | ||||||
| 	"google.golang.org/protobuf/encoding/prototext" | 	"google.golang.org/protobuf/encoding/prototext" | ||||||
| 
 | 
 | ||||||
|  | 	"github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" | ||||||
|  | 	"github.com/prometheus/common/model" | ||||||
|  | 
 | ||||||
| 	dto "github.com/prometheus/client_model/go" | 	dto "github.com/prometheus/client_model/go" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -60,23 +62,32 @@ func (ec encoderCloser) Close() error { | ||||||
| // as the support is still experimental. To include the option to negotiate | // as the support is still experimental. To include the option to negotiate | ||||||
| // FmtOpenMetrics, use NegotiateOpenMetrics. | // FmtOpenMetrics, use NegotiateOpenMetrics. | ||||||
| func Negotiate(h http.Header) Format { | func Negotiate(h http.Header) Format { | ||||||
|  | 	escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) | ||||||
| 	for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { | 	for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { | ||||||
|  | 		if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { | ||||||
|  | 			switch Format(escapeParam) { | ||||||
|  | 			case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: | ||||||
|  | 				escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) | ||||||
|  | 			default: | ||||||
|  | 				// If the escaping parameter is unknown, ignore it. | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		ver := ac.Params["version"] | 		ver := ac.Params["version"] | ||||||
| 		if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { | 		if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { | ||||||
| 			switch ac.Params["encoding"] { | 			switch ac.Params["encoding"] { | ||||||
| 			case "delimited": | 			case "delimited": | ||||||
| 				return FmtProtoDelim | 				return fmtProtoDelim + escapingScheme | ||||||
| 			case "text": | 			case "text": | ||||||
| 				return FmtProtoText | 				return fmtProtoText + escapingScheme | ||||||
| 			case "compact-text": | 			case "compact-text": | ||||||
| 				return FmtProtoCompact | 				return fmtProtoCompact + escapingScheme | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { | 		if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { | ||||||
| 			return FmtText | 			return fmtText + escapingScheme | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return FmtText | 	return fmtText + escapingScheme | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NegotiateIncludingOpenMetrics works like Negotiate but includes | // NegotiateIncludingOpenMetrics works like Negotiate but includes | ||||||
|  | @ -84,29 +95,40 @@ func Negotiate(h http.Header) Format { | ||||||
| // temporary and will disappear once FmtOpenMetrics is fully supported and as | // temporary and will disappear once FmtOpenMetrics is fully supported and as | ||||||
| // such may be negotiated by the normal Negotiate function. | // such may be negotiated by the normal Negotiate function. | ||||||
| func NegotiateIncludingOpenMetrics(h http.Header) Format { | func NegotiateIncludingOpenMetrics(h http.Header) Format { | ||||||
|  | 	escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) | ||||||
| 	for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { | 	for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { | ||||||
|  | 		if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { | ||||||
|  | 			switch Format(escapeParam) { | ||||||
|  | 			case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: | ||||||
|  | 				escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) | ||||||
|  | 			default: | ||||||
|  | 				// If the escaping parameter is unknown, ignore it. | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		ver := ac.Params["version"] | 		ver := ac.Params["version"] | ||||||
| 		if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { | 		if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { | ||||||
| 			switch ac.Params["encoding"] { | 			switch ac.Params["encoding"] { | ||||||
| 			case "delimited": | 			case "delimited": | ||||||
| 				return FmtProtoDelim | 				return fmtProtoDelim + escapingScheme | ||||||
| 			case "text": | 			case "text": | ||||||
| 				return FmtProtoText | 				return fmtProtoText + escapingScheme | ||||||
| 			case "compact-text": | 			case "compact-text": | ||||||
| 				return FmtProtoCompact | 				return fmtProtoCompact + escapingScheme | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { | 		if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { | ||||||
| 			return FmtText | 			return fmtText + escapingScheme | ||||||
| 		} | 		} | ||||||
| 		if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") { | 		if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") { | ||||||
| 			if ver == OpenMetricsVersion_1_0_0 { | 			switch ver { | ||||||
| 				return FmtOpenMetrics_1_0_0 | 			case OpenMetricsVersion_1_0_0: | ||||||
|  | 				return fmtOpenMetrics_1_0_0 + escapingScheme | ||||||
|  | 			default: | ||||||
|  | 				return fmtOpenMetrics_0_0_1 + escapingScheme | ||||||
| 			} | 			} | ||||||
| 			return FmtOpenMetrics_0_0_1 |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return FmtText | 	return fmtText + escapingScheme | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewEncoder returns a new encoder based on content type negotiation. All | // NewEncoder returns a new encoder based on content type negotiation. All | ||||||
|  | @ -115,44 +137,48 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format { | ||||||
| // for FmtOpenMetrics, but a future (breaking) release will add the Close method | // for FmtOpenMetrics, but a future (breaking) release will add the Close method | ||||||
| // to the Encoder interface directly. The current version of the Encoder | // to the Encoder interface directly. The current version of the Encoder | ||||||
| // interface is kept for backwards compatibility. | // interface is kept for backwards compatibility. | ||||||
|  | // In cases where the Format does not allow for UTF-8 names, the global | ||||||
|  | // NameEscapingScheme will be applied. | ||||||
| func NewEncoder(w io.Writer, format Format) Encoder { | func NewEncoder(w io.Writer, format Format) Encoder { | ||||||
| 	switch format { | 	escapingScheme := format.ToEscapingScheme() | ||||||
| 	case FmtProtoDelim: | 
 | ||||||
|  | 	switch format.FormatType() { | ||||||
|  | 	case TypeProtoDelim: | ||||||
| 		return encoderCloser{ | 		return encoderCloser{ | ||||||
| 			encode: func(v *dto.MetricFamily) error { | 			encode: func(v *dto.MetricFamily) error { | ||||||
| 				_, err := pbutil.WriteDelimited(w, v) | 				_, err := protodelim.MarshalTo(w, v) | ||||||
| 				return err | 				return err | ||||||
| 			}, | 			}, | ||||||
| 			close: func() error { return nil }, | 			close: func() error { return nil }, | ||||||
| 		} | 		} | ||||||
| 	case FmtProtoCompact: | 	case TypeProtoCompact: | ||||||
| 		return encoderCloser{ | 		return encoderCloser{ | ||||||
| 			encode: func(v *dto.MetricFamily) error { | 			encode: func(v *dto.MetricFamily) error { | ||||||
| 				_, err := fmt.Fprintln(w, v.String()) | 				_, err := fmt.Fprintln(w, model.EscapeMetricFamily(v, escapingScheme).String()) | ||||||
| 				return err | 				return err | ||||||
| 			}, | 			}, | ||||||
| 			close: func() error { return nil }, | 			close: func() error { return nil }, | ||||||
| 		} | 		} | ||||||
| 	case FmtProtoText: | 	case TypeProtoText: | ||||||
| 		return encoderCloser{ | 		return encoderCloser{ | ||||||
| 			encode: func(v *dto.MetricFamily) error { | 			encode: func(v *dto.MetricFamily) error { | ||||||
| 				_, err := fmt.Fprintln(w, prototext.Format(v)) | 				_, err := fmt.Fprintln(w, prototext.Format(model.EscapeMetricFamily(v, escapingScheme))) | ||||||
| 				return err | 				return err | ||||||
| 			}, | 			}, | ||||||
| 			close: func() error { return nil }, | 			close: func() error { return nil }, | ||||||
| 		} | 		} | ||||||
| 	case FmtText: | 	case TypeTextPlain: | ||||||
| 		return encoderCloser{ | 		return encoderCloser{ | ||||||
| 			encode: func(v *dto.MetricFamily) error { | 			encode: func(v *dto.MetricFamily) error { | ||||||
| 				_, err := MetricFamilyToText(w, v) | 				_, err := MetricFamilyToText(w, model.EscapeMetricFamily(v, escapingScheme)) | ||||||
| 				return err | 				return err | ||||||
| 			}, | 			}, | ||||||
| 			close: func() error { return nil }, | 			close: func() error { return nil }, | ||||||
| 		} | 		} | ||||||
| 	case FmtOpenMetrics_0_0_1, FmtOpenMetrics_1_0_0: | 	case TypeOpenMetrics: | ||||||
| 		return encoderCloser{ | 		return encoderCloser{ | ||||||
| 			encode: func(v *dto.MetricFamily) error { | 			encode: func(v *dto.MetricFamily) error { | ||||||
| 				_, err := MetricFamilyToOpenMetrics(w, v) | 				_, err := MetricFamilyToOpenMetrics(w, model.EscapeMetricFamily(v, escapingScheme)) | ||||||
| 				return err | 				return err | ||||||
| 			}, | 			}, | ||||||
| 			close: func() error { | 			close: func() error { | ||||||
|  |  | ||||||
							
								
								
									
										144
									
								
								vendor/github.com/prometheus/common/expfmt/expfmt.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										144
									
								
								vendor/github.com/prometheus/common/expfmt/expfmt.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -14,30 +14,154 @@ | ||||||
| // Package expfmt contains tools for reading and writing Prometheus metrics. | // Package expfmt contains tools for reading and writing Prometheus metrics. | ||||||
| package expfmt | package expfmt | ||||||
| 
 | 
 | ||||||
|  | import ( | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"github.com/prometheus/common/model" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // Format specifies the HTTP content type of the different wire protocols. | // Format specifies the HTTP content type of the different wire protocols. | ||||||
| type Format string | type Format string | ||||||
| 
 | 
 | ||||||
| // Constants to assemble the Content-Type values for the different wire protocols. | // Constants to assemble the Content-Type values for the different wire | ||||||
|  | // protocols. The Content-Type strings here are all for the legacy exposition | ||||||
|  | // formats, where valid characters for metric names and label names are limited. | ||||||
|  | // Support for arbitrary UTF-8 characters in those names is already partially | ||||||
|  | // implemented in this module (see model.ValidationScheme), but to actually use | ||||||
|  | // it on the wire, new content-type strings will have to be agreed upon and | ||||||
|  | // added here. | ||||||
| const ( | const ( | ||||||
| 	TextVersion              = "0.0.4" | 	TextVersion              = "0.0.4" | ||||||
| 	ProtoType                = `application/vnd.google.protobuf` | 	ProtoType                = `application/vnd.google.protobuf` | ||||||
| 	ProtoProtocol            = `io.prometheus.client.MetricFamily` | 	ProtoProtocol            = `io.prometheus.client.MetricFamily` | ||||||
| 	ProtoFmt                 = ProtoType + "; proto=" + ProtoProtocol + ";" | 	protoFmt                 = ProtoType + "; proto=" + ProtoProtocol + ";" | ||||||
| 	OpenMetricsType          = `application/openmetrics-text` | 	OpenMetricsType          = `application/openmetrics-text` | ||||||
| 	OpenMetricsVersion_0_0_1 = "0.0.1" | 	OpenMetricsVersion_0_0_1 = "0.0.1" | ||||||
| 	OpenMetricsVersion_1_0_0 = "1.0.0" | 	OpenMetricsVersion_1_0_0 = "1.0.0" | ||||||
| 
 | 
 | ||||||
| 	// The Content-Type values for the different wire protocols. | 	// The Content-Type values for the different wire protocols. Note that these | ||||||
| 	FmtUnknown           Format = `<unknown>` | 	// values are now unexported. If code was relying on comparisons to these | ||||||
| 	FmtText              Format = `text/plain; version=` + TextVersion + `; charset=utf-8` | 	// constants, instead use FormatType(). | ||||||
| 	FmtProtoDelim        Format = ProtoFmt + ` encoding=delimited` | 	fmtUnknown           Format = `<unknown>` | ||||||
| 	FmtProtoText         Format = ProtoFmt + ` encoding=text` | 	fmtText              Format = `text/plain; version=` + TextVersion + `; charset=utf-8` | ||||||
| 	FmtProtoCompact      Format = ProtoFmt + ` encoding=compact-text` | 	fmtProtoDelim        Format = protoFmt + ` encoding=delimited` | ||||||
| 	FmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` | 	fmtProtoText         Format = protoFmt + ` encoding=text` | ||||||
| 	FmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` | 	fmtProtoCompact      Format = protoFmt + ` encoding=compact-text` | ||||||
|  | 	fmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` | ||||||
|  | 	fmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	hdrContentType = "Content-Type" | 	hdrContentType = "Content-Type" | ||||||
| 	hdrAccept      = "Accept" | 	hdrAccept      = "Accept" | ||||||
| ) | ) | ||||||
|  | 
 | ||||||
|  | // FormatType is a Go enum representing the overall category for the given | ||||||
|  | // Format. As the number of Format permutations increases, doing basic string | ||||||
|  | // comparisons are not feasible, so this enum captures the most useful | ||||||
|  | // high-level attribute of the Format string. | ||||||
|  | type FormatType int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	TypeUnknown = iota | ||||||
|  | 	TypeProtoCompact | ||||||
|  | 	TypeProtoDelim | ||||||
|  | 	TypeProtoText | ||||||
|  | 	TypeTextPlain | ||||||
|  | 	TypeOpenMetrics | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // NewFormat generates a new Format from the type provided. Mostly used for | ||||||
|  | // tests, most Formats should be generated as part of content negotiation in | ||||||
|  | // encode.go. | ||||||
|  | func NewFormat(t FormatType) Format { | ||||||
|  | 	switch t { | ||||||
|  | 	case TypeProtoCompact: | ||||||
|  | 		return fmtProtoCompact | ||||||
|  | 	case TypeProtoDelim: | ||||||
|  | 		return fmtProtoDelim | ||||||
|  | 	case TypeProtoText: | ||||||
|  | 		return fmtProtoText | ||||||
|  | 	case TypeTextPlain: | ||||||
|  | 		return fmtText | ||||||
|  | 	case TypeOpenMetrics: | ||||||
|  | 		return fmtOpenMetrics_1_0_0 | ||||||
|  | 	default: | ||||||
|  | 		return fmtUnknown | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // FormatType deduces an overall FormatType for the given format. | ||||||
|  | func (f Format) FormatType() FormatType { | ||||||
|  | 	toks := strings.Split(string(f), ";") | ||||||
|  | 	if len(toks) < 2 { | ||||||
|  | 		return TypeUnknown | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	params := make(map[string]string) | ||||||
|  | 	for i, t := range toks { | ||||||
|  | 		if i == 0 { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		args := strings.Split(t, "=") | ||||||
|  | 		if len(args) != 2 { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		params[strings.TrimSpace(args[0])] = strings.TrimSpace(args[1]) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch strings.TrimSpace(toks[0]) { | ||||||
|  | 	case ProtoType: | ||||||
|  | 		if params["proto"] != ProtoProtocol { | ||||||
|  | 			return TypeUnknown | ||||||
|  | 		} | ||||||
|  | 		switch params["encoding"] { | ||||||
|  | 		case "delimited": | ||||||
|  | 			return TypeProtoDelim | ||||||
|  | 		case "text": | ||||||
|  | 			return TypeProtoText | ||||||
|  | 		case "compact-text": | ||||||
|  | 			return TypeProtoCompact | ||||||
|  | 		default: | ||||||
|  | 			return TypeUnknown | ||||||
|  | 		} | ||||||
|  | 	case OpenMetricsType: | ||||||
|  | 		if params["charset"] != "utf-8" { | ||||||
|  | 			return TypeUnknown | ||||||
|  | 		} | ||||||
|  | 		return TypeOpenMetrics | ||||||
|  | 	case "text/plain": | ||||||
|  | 		v, ok := params["version"] | ||||||
|  | 		if !ok { | ||||||
|  | 			return TypeTextPlain | ||||||
|  | 		} | ||||||
|  | 		if v == TextVersion { | ||||||
|  | 			return TypeTextPlain | ||||||
|  | 		} | ||||||
|  | 		return TypeUnknown | ||||||
|  | 	default: | ||||||
|  | 		return TypeUnknown | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ToEscapingScheme returns an EscapingScheme depending on the Format. Iff the | ||||||
|  | // Format contains a escaping=allow-utf-8 term, it will select NoEscaping. If a valid | ||||||
|  | // "escaping" term exists, that will be used. Otherwise, the global default will | ||||||
|  | // be returned. | ||||||
|  | func (format Format) ToEscapingScheme() model.EscapingScheme { | ||||||
|  | 	for _, p := range strings.Split(string(format), ";") { | ||||||
|  | 		toks := strings.Split(p, "=") | ||||||
|  | 		if len(toks) != 2 { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		key, value := strings.TrimSpace(toks[0]), strings.TrimSpace(toks[1]) | ||||||
|  | 		if key == model.EscapingKey { | ||||||
|  | 			scheme, err := model.ToEscapingScheme(value) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return model.NameEscapingScheme | ||||||
|  | 			} | ||||||
|  | 			return scheme | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return model.NameEscapingScheme | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										85
									
								
								vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										85
									
								
								vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -35,6 +35,18 @@ import ( | ||||||
| // sanity checks. If the input contains duplicate metrics or invalid metric or | // sanity checks. If the input contains duplicate metrics or invalid metric or | ||||||
| // label names, the conversion will result in invalid text format output. | // label names, the conversion will result in invalid text format output. | ||||||
| // | // | ||||||
|  | // If metric names conform to the legacy validation pattern, they will be placed | ||||||
|  | // outside the brackets in the traditional way, like `foo{}`. If the metric name | ||||||
|  | // fails the legacy validation check, it will be placed quoted inside the | ||||||
|  | // brackets: `{"foo"}`. As stated above, the input is assumed to be santized and | ||||||
|  | // no error will be thrown in this case. | ||||||
|  | // | ||||||
|  | // Similar to metric names, if label names conform to the legacy validation | ||||||
|  | // pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label | ||||||
|  | // name fails the legacy validation check, it will be quoted: | ||||||
|  | // `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and | ||||||
|  | // no error will be thrown in this case. | ||||||
|  | // | ||||||
| // This function fulfills the type 'expfmt.encoder'. | // This function fulfills the type 'expfmt.encoder'. | ||||||
| // | // | ||||||
| // Note that OpenMetrics requires a final `# EOF` line. Since this function acts | // Note that OpenMetrics requires a final `# EOF` line. Since this function acts | ||||||
|  | @ -98,7 +110,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		n, err = w.WriteString(shortName) | 		n, err = writeName(w, shortName) | ||||||
| 		written += n | 		written += n | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return | 			return | ||||||
|  | @ -124,7 +136,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	n, err = w.WriteString(shortName) | 	n, err = writeName(w, shortName) | ||||||
| 	written += n | 	written += n | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
|  | @ -303,21 +315,9 @@ func writeOpenMetricsSample( | ||||||
| 	floatValue float64, intValue uint64, useIntValue bool, | 	floatValue float64, intValue uint64, useIntValue bool, | ||||||
| 	exemplar *dto.Exemplar, | 	exemplar *dto.Exemplar, | ||||||
| ) (int, error) { | ) (int, error) { | ||||||
| 	var written int | 	written := 0 | ||||||
| 	n, err := w.WriteString(name) | 	n, err := writeOpenMetricsNameAndLabelPairs( | ||||||
| 	written += n | 		w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, | ||||||
| 	if err != nil { |  | ||||||
| 		return written, err |  | ||||||
| 	} |  | ||||||
| 	if suffix != "" { |  | ||||||
| 		n, err = w.WriteString(suffix) |  | ||||||
| 		written += n |  | ||||||
| 		if err != nil { |  | ||||||
| 			return written, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	n, err = writeOpenMetricsLabelPairs( |  | ||||||
| 		w, metric.Label, additionalLabelName, additionalLabelValue, |  | ||||||
| 	) | 	) | ||||||
| 	written += n | 	written += n | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -365,27 +365,58 @@ func writeOpenMetricsSample( | ||||||
| 	return written, nil | 	return written, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // writeOpenMetricsLabelPairs works like writeOpenMetrics but formats the float | // writeOpenMetricsNameAndLabelPairs works like writeOpenMetricsSample but | ||||||
| // in OpenMetrics style. | // formats the float in OpenMetrics style. | ||||||
| func writeOpenMetricsLabelPairs( | func writeOpenMetricsNameAndLabelPairs( | ||||||
| 	w enhancedWriter, | 	w enhancedWriter, | ||||||
|  | 	name string, | ||||||
| 	in []*dto.LabelPair, | 	in []*dto.LabelPair, | ||||||
| 	additionalLabelName string, additionalLabelValue float64, | 	additionalLabelName string, additionalLabelValue float64, | ||||||
| ) (int, error) { | ) (int, error) { | ||||||
| 	if len(in) == 0 && additionalLabelName == "" { |  | ||||||
| 		return 0, nil |  | ||||||
| 	} |  | ||||||
| 	var ( | 	var ( | ||||||
| 		written   int | 		written            int | ||||||
| 		separator byte = '{' | 		separator          byte = '{' | ||||||
|  | 		metricInsideBraces      = false | ||||||
| 	) | 	) | ||||||
|  | 
 | ||||||
|  | 	if name != "" { | ||||||
|  | 		// If the name does not pass the legacy validity check, we must put the | ||||||
|  | 		// metric name inside the braces, quoted. | ||||||
|  | 		if !model.IsValidLegacyMetricName(model.LabelValue(name)) { | ||||||
|  | 			metricInsideBraces = true | ||||||
|  | 			err := w.WriteByte(separator) | ||||||
|  | 			written++ | ||||||
|  | 			if err != nil { | ||||||
|  | 				return written, err | ||||||
|  | 			} | ||||||
|  | 			separator = ',' | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		n, err := writeName(w, name) | ||||||
|  | 		written += n | ||||||
|  | 		if err != nil { | ||||||
|  | 			return written, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(in) == 0 && additionalLabelName == "" { | ||||||
|  | 		if metricInsideBraces { | ||||||
|  | 			err := w.WriteByte('}') | ||||||
|  | 			written++ | ||||||
|  | 			if err != nil { | ||||||
|  | 				return written, err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return written, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for _, lp := range in { | 	for _, lp := range in { | ||||||
| 		err := w.WriteByte(separator) | 		err := w.WriteByte(separator) | ||||||
| 		written++ | 		written++ | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return written, err | 			return written, err | ||||||
| 		} | 		} | ||||||
| 		n, err := w.WriteString(lp.GetName()) | 		n, err := writeName(w, lp.GetName()) | ||||||
| 		written += n | 		written += n | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return written, err | 			return written, err | ||||||
|  | @ -451,7 +482,7 @@ func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) { | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return written, err | 		return written, err | ||||||
| 	} | 	} | ||||||
| 	n, err = writeOpenMetricsLabelPairs(w, e.Label, "", 0) | 	n, err = writeOpenMetricsNameAndLabelPairs(w, "", e.Label, "", 0) | ||||||
| 	written += n | 	written += n | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return written, err | 		return written, err | ||||||
|  |  | ||||||
							
								
								
									
										118
									
								
								vendor/github.com/prometheus/common/expfmt/text_create.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										118
									
								
								vendor/github.com/prometheus/common/expfmt/text_create.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -62,6 +62,18 @@ var ( | ||||||
| // contains duplicate metrics or invalid metric or label names, the conversion | // contains duplicate metrics or invalid metric or label names, the conversion | ||||||
| // will result in invalid text format output. | // will result in invalid text format output. | ||||||
| // | // | ||||||
|  | // If metric names conform to the legacy validation pattern, they will be placed | ||||||
|  | // outside the brackets in the traditional way, like `foo{}`. If the metric name | ||||||
|  | // fails the legacy validation check, it will be placed quoted inside the | ||||||
|  | // brackets: `{"foo"}`. As stated above, the input is assumed to be santized and | ||||||
|  | // no error will be thrown in this case. | ||||||
|  | // | ||||||
|  | // Similar to metric names, if label names conform to the legacy validation | ||||||
|  | // pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label | ||||||
|  | // name fails the legacy validation check, it will be quoted: | ||||||
|  | // `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and | ||||||
|  | // no error will be thrown in this case. | ||||||
|  | // | ||||||
| // This method fulfills the type 'prometheus.encoder'. | // This method fulfills the type 'prometheus.encoder'. | ||||||
| func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { | func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { | ||||||
| 	// Fail-fast checks. | 	// Fail-fast checks. | ||||||
|  | @ -98,7 +110,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		n, err = w.WriteString(name) | 		n, err = writeName(w, name) | ||||||
| 		written += n | 		written += n | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return | 			return | ||||||
|  | @ -124,7 +136,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	n, err = w.WriteString(name) | 	n, err = writeName(w, name) | ||||||
| 	written += n | 	written += n | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
|  | @ -280,21 +292,9 @@ func writeSample( | ||||||
| 	additionalLabelName string, additionalLabelValue float64, | 	additionalLabelName string, additionalLabelValue float64, | ||||||
| 	value float64, | 	value float64, | ||||||
| ) (int, error) { | ) (int, error) { | ||||||
| 	var written int | 	written := 0 | ||||||
| 	n, err := w.WriteString(name) | 	n, err := writeNameAndLabelPairs( | ||||||
| 	written += n | 		w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, | ||||||
| 	if err != nil { |  | ||||||
| 		return written, err |  | ||||||
| 	} |  | ||||||
| 	if suffix != "" { |  | ||||||
| 		n, err = w.WriteString(suffix) |  | ||||||
| 		written += n |  | ||||||
| 		if err != nil { |  | ||||||
| 			return written, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	n, err = writeLabelPairs( |  | ||||||
| 		w, metric.Label, additionalLabelName, additionalLabelValue, |  | ||||||
| 	) | 	) | ||||||
| 	written += n | 	written += n | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -330,32 +330,64 @@ func writeSample( | ||||||
| 	return written, nil | 	return written, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // writeLabelPairs converts a slice of LabelPair proto messages plus the | // writeNameAndLabelPairs converts a slice of LabelPair proto messages plus the | ||||||
| // explicitly given additional label pair into text formatted as required by the | // explicitly given metric name and additional label pair into text formatted as | ||||||
| // text format and writes it to 'w'. An empty slice in combination with an empty | // required by the text format and writes it to 'w'. An empty slice in | ||||||
| // string 'additionalLabelName' results in nothing being written. Otherwise, the | // combination with an empty string 'additionalLabelName' results in nothing | ||||||
| // label pairs are written, escaped as required by the text format, and enclosed | // being written. Otherwise, the label pairs are written, escaped as required by | ||||||
| // in '{...}'. The function returns the number of bytes written and any error | // the text format, and enclosed in '{...}'. The function returns the number of | ||||||
| // encountered. | // bytes written and any error encountered. If the metric name is not | ||||||
| func writeLabelPairs( | // legacy-valid, it will be put inside the brackets as well. Legacy-invalid | ||||||
|  | // label names will also be quoted. | ||||||
|  | func writeNameAndLabelPairs( | ||||||
| 	w enhancedWriter, | 	w enhancedWriter, | ||||||
|  | 	name string, | ||||||
| 	in []*dto.LabelPair, | 	in []*dto.LabelPair, | ||||||
| 	additionalLabelName string, additionalLabelValue float64, | 	additionalLabelName string, additionalLabelValue float64, | ||||||
| ) (int, error) { | ) (int, error) { | ||||||
| 	if len(in) == 0 && additionalLabelName == "" { |  | ||||||
| 		return 0, nil |  | ||||||
| 	} |  | ||||||
| 	var ( | 	var ( | ||||||
| 		written   int | 		written            int | ||||||
| 		separator byte = '{' | 		separator          byte = '{' | ||||||
|  | 		metricInsideBraces      = false | ||||||
| 	) | 	) | ||||||
|  | 
 | ||||||
|  | 	if name != "" { | ||||||
|  | 		// If the name does not pass the legacy validity check, we must put the | ||||||
|  | 		// metric name inside the braces. | ||||||
|  | 		if !model.IsValidLegacyMetricName(model.LabelValue(name)) { | ||||||
|  | 			metricInsideBraces = true | ||||||
|  | 			err := w.WriteByte(separator) | ||||||
|  | 			written++ | ||||||
|  | 			if err != nil { | ||||||
|  | 				return written, err | ||||||
|  | 			} | ||||||
|  | 			separator = ',' | ||||||
|  | 		} | ||||||
|  | 		n, err := writeName(w, name) | ||||||
|  | 		written += n | ||||||
|  | 		if err != nil { | ||||||
|  | 			return written, err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(in) == 0 && additionalLabelName == "" { | ||||||
|  | 		if metricInsideBraces { | ||||||
|  | 			err := w.WriteByte('}') | ||||||
|  | 			written++ | ||||||
|  | 			if err != nil { | ||||||
|  | 				return written, err | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return written, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for _, lp := range in { | 	for _, lp := range in { | ||||||
| 		err := w.WriteByte(separator) | 		err := w.WriteByte(separator) | ||||||
| 		written++ | 		written++ | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return written, err | 			return written, err | ||||||
| 		} | 		} | ||||||
| 		n, err := w.WriteString(lp.GetName()) | 		n, err := writeName(w, lp.GetName()) | ||||||
| 		written += n | 		written += n | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return written, err | 			return written, err | ||||||
|  | @ -462,3 +494,27 @@ func writeInt(w enhancedWriter, i int64) (int, error) { | ||||||
| 	numBufPool.Put(bp) | 	numBufPool.Put(bp) | ||||||
| 	return written, err | 	return written, err | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // writeName writes a string as-is if it complies with the legacy naming | ||||||
|  | // scheme, or escapes it in double quotes if not. | ||||||
|  | func writeName(w enhancedWriter, name string) (int, error) { | ||||||
|  | 	if model.IsValidLegacyMetricName(model.LabelValue(name)) { | ||||||
|  | 		return w.WriteString(name) | ||||||
|  | 	} | ||||||
|  | 	var written int | ||||||
|  | 	var err error | ||||||
|  | 	err = w.WriteByte('"') | ||||||
|  | 	written++ | ||||||
|  | 	if err != nil { | ||||||
|  | 		return written, err | ||||||
|  | 	} | ||||||
|  | 	var n int | ||||||
|  | 	n, err = writeEscapedString(w, name, true) | ||||||
|  | 	written += n | ||||||
|  | 	if err != nil { | ||||||
|  | 		return written, err | ||||||
|  | 	} | ||||||
|  | 	err = w.WriteByte('"') | ||||||
|  | 	written++ | ||||||
|  | 	return written, err | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								vendor/github.com/prometheus/common/expfmt/text_parse.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/prometheus/common/expfmt/text_parse.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -16,6 +16,7 @@ package expfmt | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"bytes" | 	"bytes" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"math" | 	"math" | ||||||
|  | @ -24,8 +25,9 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	dto "github.com/prometheus/client_model/go" | 	dto "github.com/prometheus/client_model/go" | ||||||
| 
 | 
 | ||||||
| 	"github.com/prometheus/common/model" |  | ||||||
| 	"google.golang.org/protobuf/proto" | 	"google.golang.org/protobuf/proto" | ||||||
|  | 
 | ||||||
|  | 	"github.com/prometheus/common/model" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // A stateFn is a function that represents a state in a state machine. By | // A stateFn is a function that represents a state in a state machine. By | ||||||
|  | @ -112,7 +114,7 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF | ||||||
| 	// stream. Turn this error into something nicer and more | 	// stream. Turn this error into something nicer and more | ||||||
| 	// meaningful. (io.EOF is often used as a signal for the legitimate end | 	// meaningful. (io.EOF is often used as a signal for the legitimate end | ||||||
| 	// of an input stream.) | 	// of an input stream.) | ||||||
| 	if p.err == io.EOF { | 	if p.err != nil && errors.Is(p.err, io.EOF) { | ||||||
| 		p.parseError("unexpected end of input stream") | 		p.parseError("unexpected end of input stream") | ||||||
| 	} | 	} | ||||||
| 	return p.metricFamiliesByName, p.err | 	return p.metricFamiliesByName, p.err | ||||||
|  | @ -146,7 +148,7 @@ func (p *TextParser) startOfLine() stateFn { | ||||||
| 		// which is not an error but the signal that we are done. | 		// which is not an error but the signal that we are done. | ||||||
| 		// Any other error that happens to align with the start of | 		// Any other error that happens to align with the start of | ||||||
| 		// a line is still an error. | 		// a line is still an error. | ||||||
| 		if p.err == io.EOF { | 		if errors.Is(p.err, io.EOF) { | ||||||
| 			p.err = nil | 			p.err = nil | ||||||
| 		} | 		} | ||||||
| 		return nil | 		return nil | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/github.com/prometheus/common/model/alert.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/prometheus/common/model/alert.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -90,13 +90,13 @@ func (a *Alert) Validate() error { | ||||||
| 		return fmt.Errorf("start time must be before end time") | 		return fmt.Errorf("start time must be before end time") | ||||||
| 	} | 	} | ||||||
| 	if err := a.Labels.Validate(); err != nil { | 	if err := a.Labels.Validate(); err != nil { | ||||||
| 		return fmt.Errorf("invalid label set: %s", err) | 		return fmt.Errorf("invalid label set: %w", err) | ||||||
| 	} | 	} | ||||||
| 	if len(a.Labels) == 0 { | 	if len(a.Labels) == 0 { | ||||||
| 		return fmt.Errorf("at least one label pair required") | 		return fmt.Errorf("at least one label pair required") | ||||||
| 	} | 	} | ||||||
| 	if err := a.Annotations.Validate(); err != nil { | 	if err := a.Annotations.Validate(); err != nil { | ||||||
| 		return fmt.Errorf("invalid annotations: %s", err) | 		return fmt.Errorf("invalid annotations: %w", err) | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								vendor/github.com/prometheus/common/model/labels.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/prometheus/common/model/labels.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -97,17 +97,25 @@ var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") | ||||||
| // therewith. | // therewith. | ||||||
| type LabelName string | type LabelName string | ||||||
| 
 | 
 | ||||||
| // IsValid is true iff the label name matches the pattern of LabelNameRE. This | // IsValid returns true iff name matches the pattern of LabelNameRE for legacy | ||||||
| // method, however, does not use LabelNameRE for the check but a much faster | // names, and iff it's valid UTF-8 if NameValidationScheme is set to | ||||||
| // hardcoded implementation. | // UTF8Validation. For the legacy matching, it does not use LabelNameRE for the | ||||||
|  | // check but a much faster hardcoded implementation. | ||||||
| func (ln LabelName) IsValid() bool { | func (ln LabelName) IsValid() bool { | ||||||
| 	if len(ln) == 0 { | 	if len(ln) == 0 { | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| 	for i, b := range ln { | 	switch NameValidationScheme { | ||||||
| 		if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { | 	case LegacyValidation: | ||||||
| 			return false | 		for i, b := range ln { | ||||||
|  | 			if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { | ||||||
|  | 				return false | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
|  | 	case UTF8Validation: | ||||||
|  | 		return utf8.ValidString(string(ln)) | ||||||
|  | 	default: | ||||||
|  | 		panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) | ||||||
| 	} | 	} | ||||||
| 	return true | 	return true | ||||||
| } | } | ||||||
|  | @ -164,7 +172,7 @@ func (l LabelNames) String() string { | ||||||
| // A LabelValue is an associated value for a LabelName. | // A LabelValue is an associated value for a LabelName. | ||||||
| type LabelValue string | type LabelValue string | ||||||
| 
 | 
 | ||||||
| // IsValid returns true iff the string is a valid UTF8. | // IsValid returns true iff the string is a valid UTF-8. | ||||||
| func (lv LabelValue) IsValid() bool { | func (lv LabelValue) IsValid() bool { | ||||||
| 	return utf8.ValidString(string(lv)) | 	return utf8.ValidString(string(lv)) | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								vendor/github.com/prometheus/common/model/metadata.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/prometheus/common/model/metadata.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | ||||||
|  | // Copyright 2023 The Prometheus Authors | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | // http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  | 
 | ||||||
|  | package model | ||||||
|  | 
 | ||||||
|  | // MetricType represents metric type values. | ||||||
|  | type MetricType string | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	MetricTypeCounter        = MetricType("counter") | ||||||
|  | 	MetricTypeGauge          = MetricType("gauge") | ||||||
|  | 	MetricTypeHistogram      = MetricType("histogram") | ||||||
|  | 	MetricTypeGaugeHistogram = MetricType("gaugehistogram") | ||||||
|  | 	MetricTypeSummary        = MetricType("summary") | ||||||
|  | 	MetricTypeInfo           = MetricType("info") | ||||||
|  | 	MetricTypeStateset       = MetricType("stateset") | ||||||
|  | 	MetricTypeUnknown        = MetricType("unknown") | ||||||
|  | ) | ||||||
							
								
								
									
										368
									
								
								vendor/github.com/prometheus/common/model/metric.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										368
									
								
								vendor/github.com/prometheus/common/model/metric.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -18,15 +18,84 @@ import ( | ||||||
| 	"regexp" | 	"regexp" | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"unicode/utf8" | ||||||
|  | 
 | ||||||
|  | 	dto "github.com/prometheus/client_model/go" | ||||||
|  | 	"google.golang.org/protobuf/proto" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| 	// MetricNameRE is a regular expression matching valid metric | 	// NameValidationScheme determines the method of name validation to be used by | ||||||
| 	// names. Note that the IsValidMetricName function performs the same | 	// all calls to IsValidMetricName() and LabelName IsValid(). Setting UTF-8 mode | ||||||
| 	// check but faster than a match with this regular expression. | 	// in isolation from other components that don't support UTF-8 may result in | ||||||
| 	MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) | 	// bugs or other undefined behavior. This value is intended to be set by | ||||||
|  | 	// UTF-8-aware binaries as part of their startup. To avoid need for locking, | ||||||
|  | 	// this value should be set once, ideally in an init(), before multiple | ||||||
|  | 	// goroutines are started. | ||||||
|  | 	NameValidationScheme = LegacyValidation | ||||||
|  | 
 | ||||||
|  | 	// NameEscapingScheme defines the default way that names will be | ||||||
|  | 	// escaped when presented to systems that do not support UTF-8 names. If the | ||||||
|  | 	// Content-Type "escaping" term is specified, that will override this value. | ||||||
|  | 	NameEscapingScheme = ValueEncodingEscaping | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // ValidationScheme is a Go enum for determining how metric and label names will | ||||||
|  | // be validated by this library. | ||||||
|  | type ValidationScheme int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// LegacyValidation is a setting that requirets that metric and label names | ||||||
|  | 	// conform to the original Prometheus character requirements described by | ||||||
|  | 	// MetricNameRE and LabelNameRE. | ||||||
|  | 	LegacyValidation ValidationScheme = iota | ||||||
|  | 
 | ||||||
|  | 	// UTF8Validation only requires that metric and label names be valid UTF-8 | ||||||
|  | 	// strings. | ||||||
|  | 	UTF8Validation | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type EscapingScheme int | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// NoEscaping indicates that a name will not be escaped. Unescaped names that | ||||||
|  | 	// do not conform to the legacy validity check will use a new exposition | ||||||
|  | 	// format syntax that will be officially standardized in future versions. | ||||||
|  | 	NoEscaping EscapingScheme = iota | ||||||
|  | 
 | ||||||
|  | 	// UnderscoreEscaping replaces all legacy-invalid characters with underscores. | ||||||
|  | 	UnderscoreEscaping | ||||||
|  | 
 | ||||||
|  | 	// DotsEscaping is similar to UnderscoreEscaping, except that dots are | ||||||
|  | 	// converted to `_dot_` and pre-existing underscores are converted to `__`. | ||||||
|  | 	DotsEscaping | ||||||
|  | 
 | ||||||
|  | 	// ValueEncodingEscaping prepends the name with `U__` and replaces all invalid | ||||||
|  | 	// characters with the unicode value, surrounded by underscores. Single | ||||||
|  | 	// underscores are replaced with double underscores. | ||||||
|  | 	ValueEncodingEscaping | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// EscapingKey is the key in an Accept or Content-Type header that defines how | ||||||
|  | 	// metric and label names that do not conform to the legacy character | ||||||
|  | 	// requirements should be escaped when being scraped by a legacy prometheus | ||||||
|  | 	// system. If a system does not explicitly pass an escaping parameter in the | ||||||
|  | 	// Accept header, the default NameEscapingScheme will be used. | ||||||
|  | 	EscapingKey = "escaping" | ||||||
|  | 
 | ||||||
|  | 	// Possible values for Escaping Key: | ||||||
|  | 	AllowUTF8         = "allow-utf-8" // No escaping required. | ||||||
|  | 	EscapeUnderscores = "underscores" | ||||||
|  | 	EscapeDots        = "dots" | ||||||
|  | 	EscapeValues      = "values" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // MetricNameRE is a regular expression matching valid metric | ||||||
|  | // names. Note that the IsValidMetricName function performs the same | ||||||
|  | // check but faster than a match with this regular expression. | ||||||
|  | var MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) | ||||||
|  | 
 | ||||||
| // A Metric is similar to a LabelSet, but the key difference is that a Metric is | // A Metric is similar to a LabelSet, but the key difference is that a Metric is | ||||||
| // a singleton and refers to one and only one stream of samples. | // a singleton and refers to one and only one stream of samples. | ||||||
| type Metric LabelSet | type Metric LabelSet | ||||||
|  | @ -86,17 +155,302 @@ func (m Metric) FastFingerprint() Fingerprint { | ||||||
| 	return LabelSet(m).FastFingerprint() | 	return LabelSet(m).FastFingerprint() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // IsValidMetricName returns true iff name matches the pattern of MetricNameRE. | // IsValidMetricName returns true iff name matches the pattern of MetricNameRE | ||||||
|  | // for legacy names, and iff it's valid UTF-8 if the UTF8Validation scheme is | ||||||
|  | // selected. | ||||||
|  | func IsValidMetricName(n LabelValue) bool { | ||||||
|  | 	switch NameValidationScheme { | ||||||
|  | 	case LegacyValidation: | ||||||
|  | 		return IsValidLegacyMetricName(n) | ||||||
|  | 	case UTF8Validation: | ||||||
|  | 		if len(n) == 0 { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 		return utf8.ValidString(string(n)) | ||||||
|  | 	default: | ||||||
|  | 		panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsValidLegacyMetricName is similar to IsValidMetricName but always uses the | ||||||
|  | // legacy validation scheme regardless of the value of NameValidationScheme. | ||||||
| // This function, however, does not use MetricNameRE for the check but a much | // This function, however, does not use MetricNameRE for the check but a much | ||||||
| // faster hardcoded implementation. | // faster hardcoded implementation. | ||||||
| func IsValidMetricName(n LabelValue) bool { | func IsValidLegacyMetricName(n LabelValue) bool { | ||||||
| 	if len(n) == 0 { | 	if len(n) == 0 { | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
| 	for i, b := range n { | 	for i, b := range n { | ||||||
| 		if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { | 		if !isValidLegacyRune(b, i) { | ||||||
| 			return false | 			return false | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return true | 	return true | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // EscapeMetricFamily escapes the given metric names and labels with the given | ||||||
|  | // escaping scheme. Returns a new object that uses the same pointers to fields | ||||||
|  | // when possible and creates new escaped versions so as not to mutate the | ||||||
|  | // input. | ||||||
|  | func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricFamily { | ||||||
|  | 	if v == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if scheme == NoEscaping { | ||||||
|  | 		return v | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	out := &dto.MetricFamily{ | ||||||
|  | 		Help: v.Help, | ||||||
|  | 		Type: v.Type, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// If the name is nil, copy as-is, don't try to escape. | ||||||
|  | 	if v.Name == nil || IsValidLegacyMetricName(LabelValue(v.GetName())) { | ||||||
|  | 		out.Name = v.Name | ||||||
|  | 	} else { | ||||||
|  | 		out.Name = proto.String(EscapeName(v.GetName(), scheme)) | ||||||
|  | 	} | ||||||
|  | 	for _, m := range v.Metric { | ||||||
|  | 		if !metricNeedsEscaping(m) { | ||||||
|  | 			out.Metric = append(out.Metric, m) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		escaped := &dto.Metric{ | ||||||
|  | 			Gauge:       m.Gauge, | ||||||
|  | 			Counter:     m.Counter, | ||||||
|  | 			Summary:     m.Summary, | ||||||
|  | 			Untyped:     m.Untyped, | ||||||
|  | 			Histogram:   m.Histogram, | ||||||
|  | 			TimestampMs: m.TimestampMs, | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for _, l := range m.Label { | ||||||
|  | 			if l.GetName() == MetricNameLabel { | ||||||
|  | 				if l.Value == nil || IsValidLegacyMetricName(LabelValue(l.GetValue())) { | ||||||
|  | 					escaped.Label = append(escaped.Label, l) | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
|  | 				escaped.Label = append(escaped.Label, &dto.LabelPair{ | ||||||
|  | 					Name:  proto.String(MetricNameLabel), | ||||||
|  | 					Value: proto.String(EscapeName(l.GetValue(), scheme)), | ||||||
|  | 				}) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			if l.Name == nil || IsValidLegacyMetricName(LabelValue(l.GetName())) { | ||||||
|  | 				escaped.Label = append(escaped.Label, l) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			escaped.Label = append(escaped.Label, &dto.LabelPair{ | ||||||
|  | 				Name:  proto.String(EscapeName(l.GetName(), scheme)), | ||||||
|  | 				Value: l.Value, | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 		out.Metric = append(out.Metric, escaped) | ||||||
|  | 	} | ||||||
|  | 	return out | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func metricNeedsEscaping(m *dto.Metric) bool { | ||||||
|  | 	for _, l := range m.Label { | ||||||
|  | 		if l.GetName() == MetricNameLabel && !IsValidLegacyMetricName(LabelValue(l.GetValue())) { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 		if !IsValidLegacyMetricName(LabelValue(l.GetName())) { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	lowerhex = "0123456789abcdef" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // EscapeName escapes the incoming name according to the provided escaping | ||||||
|  | // scheme. Depending on the rules of escaping, this may cause no change in the | ||||||
|  | // string that is returned. (Especially NoEscaping, which by definition is a | ||||||
|  | // noop). This function does not do any validation of the name. | ||||||
|  | func EscapeName(name string, scheme EscapingScheme) string { | ||||||
|  | 	if len(name) == 0 { | ||||||
|  | 		return name | ||||||
|  | 	} | ||||||
|  | 	var escaped strings.Builder | ||||||
|  | 	switch scheme { | ||||||
|  | 	case NoEscaping: | ||||||
|  | 		return name | ||||||
|  | 	case UnderscoreEscaping: | ||||||
|  | 		if IsValidLegacyMetricName(LabelValue(name)) { | ||||||
|  | 			return name | ||||||
|  | 		} | ||||||
|  | 		for i, b := range name { | ||||||
|  | 			if isValidLegacyRune(b, i) { | ||||||
|  | 				escaped.WriteRune(b) | ||||||
|  | 			} else { | ||||||
|  | 				escaped.WriteRune('_') | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return escaped.String() | ||||||
|  | 	case DotsEscaping: | ||||||
|  | 		// Do not early return for legacy valid names, we still escape underscores. | ||||||
|  | 		for i, b := range name { | ||||||
|  | 			if b == '_' { | ||||||
|  | 				escaped.WriteString("__") | ||||||
|  | 			} else if b == '.' { | ||||||
|  | 				escaped.WriteString("_dot_") | ||||||
|  | 			} else if isValidLegacyRune(b, i) { | ||||||
|  | 				escaped.WriteRune(b) | ||||||
|  | 			} else { | ||||||
|  | 				escaped.WriteRune('_') | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return escaped.String() | ||||||
|  | 	case ValueEncodingEscaping: | ||||||
|  | 		if IsValidLegacyMetricName(LabelValue(name)) { | ||||||
|  | 			return name | ||||||
|  | 		} | ||||||
|  | 		escaped.WriteString("U__") | ||||||
|  | 		for i, b := range name { | ||||||
|  | 			if isValidLegacyRune(b, i) { | ||||||
|  | 				escaped.WriteRune(b) | ||||||
|  | 			} else if !utf8.ValidRune(b) { | ||||||
|  | 				escaped.WriteString("_FFFD_") | ||||||
|  | 			} else if b < 0x100 { | ||||||
|  | 				escaped.WriteRune('_') | ||||||
|  | 				for s := 4; s >= 0; s -= 4 { | ||||||
|  | 					escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) | ||||||
|  | 				} | ||||||
|  | 				escaped.WriteRune('_') | ||||||
|  | 			} else if b < 0x10000 { | ||||||
|  | 				escaped.WriteRune('_') | ||||||
|  | 				for s := 12; s >= 0; s -= 4 { | ||||||
|  | 					escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) | ||||||
|  | 				} | ||||||
|  | 				escaped.WriteRune('_') | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return escaped.String() | ||||||
|  | 	default: | ||||||
|  | 		panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // lower function taken from strconv.atoi | ||||||
|  | func lower(c byte) byte { | ||||||
|  | 	return c | ('x' - 'X') | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnescapeName unescapes the incoming name according to the provided escaping | ||||||
|  | // scheme if possible. Some schemes are partially or totally non-roundtripable. | ||||||
|  | // If any error is enountered, returns the original input. | ||||||
|  | func UnescapeName(name string, scheme EscapingScheme) string { | ||||||
|  | 	if len(name) == 0 { | ||||||
|  | 		return name | ||||||
|  | 	} | ||||||
|  | 	switch scheme { | ||||||
|  | 	case NoEscaping: | ||||||
|  | 		return name | ||||||
|  | 	case UnderscoreEscaping: | ||||||
|  | 		// It is not possible to unescape from underscore replacement. | ||||||
|  | 		return name | ||||||
|  | 	case DotsEscaping: | ||||||
|  | 		name = strings.ReplaceAll(name, "_dot_", ".") | ||||||
|  | 		name = strings.ReplaceAll(name, "__", "_") | ||||||
|  | 		return name | ||||||
|  | 	case ValueEncodingEscaping: | ||||||
|  | 		escapedName, found := strings.CutPrefix(name, "U__") | ||||||
|  | 		if !found { | ||||||
|  | 			return name | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		var unescaped strings.Builder | ||||||
|  | 	TOP: | ||||||
|  | 		for i := 0; i < len(escapedName); i++ { | ||||||
|  | 			// All non-underscores are treated normally. | ||||||
|  | 			if escapedName[i] != '_' { | ||||||
|  | 				unescaped.WriteByte(escapedName[i]) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			i++ | ||||||
|  | 			if i >= len(escapedName) { | ||||||
|  | 				return name | ||||||
|  | 			} | ||||||
|  | 			// A double underscore is a single underscore. | ||||||
|  | 			if escapedName[i] == '_' { | ||||||
|  | 				unescaped.WriteByte('_') | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			// We think we are in a UTF-8 code, process it. | ||||||
|  | 			var utf8Val uint | ||||||
|  | 			for j := 0; i < len(escapedName); j++ { | ||||||
|  | 				// This is too many characters for a utf8 value. | ||||||
|  | 				if j > 4 { | ||||||
|  | 					return name | ||||||
|  | 				} | ||||||
|  | 				// Found a closing underscore, convert to a rune, check validity, and append. | ||||||
|  | 				if escapedName[i] == '_' { | ||||||
|  | 					utf8Rune := rune(utf8Val) | ||||||
|  | 					if !utf8.ValidRune(utf8Rune) { | ||||||
|  | 						return name | ||||||
|  | 					} | ||||||
|  | 					unescaped.WriteRune(utf8Rune) | ||||||
|  | 					continue TOP | ||||||
|  | 				} | ||||||
|  | 				r := lower(escapedName[i]) | ||||||
|  | 				utf8Val *= 16 | ||||||
|  | 				if r >= '0' && r <= '9' { | ||||||
|  | 					utf8Val += uint(r) - '0' | ||||||
|  | 				} else if r >= 'a' && r <= 'f' { | ||||||
|  | 					utf8Val += uint(r) - 'a' + 10 | ||||||
|  | 				} else { | ||||||
|  | 					return name | ||||||
|  | 				} | ||||||
|  | 				i++ | ||||||
|  | 			} | ||||||
|  | 			// Didn't find closing underscore, invalid. | ||||||
|  | 			return name | ||||||
|  | 		} | ||||||
|  | 		return unescaped.String() | ||||||
|  | 	default: | ||||||
|  | 		panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func isValidLegacyRune(b rune, i int) bool { | ||||||
|  | 	return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (e EscapingScheme) String() string { | ||||||
|  | 	switch e { | ||||||
|  | 	case NoEscaping: | ||||||
|  | 		return AllowUTF8 | ||||||
|  | 	case UnderscoreEscaping: | ||||||
|  | 		return EscapeUnderscores | ||||||
|  | 	case DotsEscaping: | ||||||
|  | 		return EscapeDots | ||||||
|  | 	case ValueEncodingEscaping: | ||||||
|  | 		return EscapeValues | ||||||
|  | 	default: | ||||||
|  | 		panic(fmt.Sprintf("unknown format scheme %d", e)) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ToEscapingScheme(s string) (EscapingScheme, error) { | ||||||
|  | 	if s == "" { | ||||||
|  | 		return NoEscaping, fmt.Errorf("got empty string instead of escaping scheme") | ||||||
|  | 	} | ||||||
|  | 	switch s { | ||||||
|  | 	case AllowUTF8: | ||||||
|  | 		return NoEscaping, nil | ||||||
|  | 	case EscapeUnderscores: | ||||||
|  | 		return UnderscoreEscaping, nil | ||||||
|  | 	case EscapeDots: | ||||||
|  | 		return DotsEscaping, nil | ||||||
|  | 	case EscapeValues: | ||||||
|  | 		return ValueEncodingEscaping, nil | ||||||
|  | 	default: | ||||||
|  | 		return NoEscaping, fmt.Errorf("unknown format scheme " + s) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								vendor/github.com/prometheus/common/model/signature.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/prometheus/common/model/signature.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -22,10 +22,8 @@ import ( | ||||||
| // when calculating their combined hash value (aka signature aka fingerprint). | // when calculating their combined hash value (aka signature aka fingerprint). | ||||||
| const SeparatorByte byte = 255 | const SeparatorByte byte = 255 | ||||||
| 
 | 
 | ||||||
| var ( | // cache the signature of an empty label set. | ||||||
| 	// cache the signature of an empty label set. | var emptyLabelSignature = hashNew() | ||||||
| 	emptyLabelSignature = hashNew() |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| // LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a | // LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a | ||||||
| // given label set. (Collisions are possible but unlikely if the number of label | // given label set. (Collisions are possible but unlikely if the number of label | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/prometheus/common/model/silence.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/prometheus/common/model/silence.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -81,7 +81,7 @@ func (s *Silence) Validate() error { | ||||||
| 	} | 	} | ||||||
| 	for _, m := range s.Matchers { | 	for _, m := range s.Matchers { | ||||||
| 		if err := m.Validate(); err != nil { | 		if err := m.Validate(); err != nil { | ||||||
| 			return fmt.Errorf("invalid matcher: %s", err) | 			return fmt.Errorf("invalid matcher: %w", err) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	if s.StartsAt.IsZero() { | 	if s.StartsAt.IsZero() { | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								vendor/github.com/prometheus/common/model/value.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/prometheus/common/model/value.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -21,14 +21,12 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | // ZeroSample is the pseudo zero-value of Sample used to signal a | ||||||
| 	// ZeroSample is the pseudo zero-value of Sample used to signal a | // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, | ||||||
| 	// non-existing sample. It is a Sample with timestamp Earliest, value 0.0, | // and metric nil. Note that the natural zero value of Sample has a timestamp | ||||||
| 	// and metric nil. Note that the natural zero value of Sample has a timestamp | // of 0, which is possible to appear in a real Sample and thus not suitable | ||||||
| 	// of 0, which is possible to appear in a real Sample and thus not suitable | // to signal a non-existing Sample. | ||||||
| 	// to signal a non-existing Sample. | var ZeroSample = Sample{Timestamp: Earliest} | ||||||
| 	ZeroSample = Sample{Timestamp: Earliest} |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| // Sample is a sample pair associated with a metric. A single sample must either | // Sample is a sample pair associated with a metric. A single sample must either | ||||||
| // define Value or Histogram but not both. Histogram == nil implies the Value | // define Value or Histogram but not both. Histogram == nil implies the Value | ||||||
|  | @ -274,7 +272,7 @@ func (s *Scalar) UnmarshalJSON(b []byte) error { | ||||||
| 
 | 
 | ||||||
| 	value, err := strconv.ParseFloat(f, 64) | 	value, err := strconv.ParseFloat(f, 64) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("error parsing sample value: %s", err) | 		return fmt.Errorf("error parsing sample value: %w", err) | ||||||
| 	} | 	} | ||||||
| 	s.Value = SampleValue(value) | 	s.Value = SampleValue(value) | ||||||
| 	return nil | 	return nil | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								vendor/github.com/prometheus/common/model/value_float.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/prometheus/common/model/value_float.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -20,14 +20,12 @@ import ( | ||||||
| 	"strconv" | 	"strconv" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var ( | // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a | ||||||
| 	// ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a | // non-existing sample pair. It is a SamplePair with timestamp Earliest and | ||||||
| 	// non-existing sample pair. It is a SamplePair with timestamp Earliest and | // value 0.0. Note that the natural zero value of SamplePair has a timestamp | ||||||
| 	// value 0.0. Note that the natural zero value of SamplePair has a timestamp | // of 0, which is possible to appear in a real SamplePair and thus not | ||||||
| 	// of 0, which is possible to appear in a real SamplePair and thus not | // suitable to signal a non-existing SamplePair. | ||||||
| 	// suitable to signal a non-existing SamplePair. | var ZeroSamplePair = SamplePair{Timestamp: Earliest} | ||||||
| 	ZeroSamplePair = SamplePair{Timestamp: Earliest} |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| // A SampleValue is a representation of a value for a given sample at a given | // A SampleValue is a representation of a value for a given sample at a given | ||||||
| // time. | // time. | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/github.com/tdewolff/minify/v2/html/html.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/tdewolff/minify/v2/html/html.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -515,7 +515,7 @@ func (o *Minifier) Minify(m *minify.M, w io.Writer, r io.Reader, _ map[string]st | ||||||
| 
 | 
 | ||||||
| 			// skip text in select and optgroup tags | 			// skip text in select and optgroup tags | ||||||
| 			if t.Hash == Select || t.Hash == Optgroup { | 			if t.Hash == Select || t.Hash == Optgroup { | ||||||
| 				if next := tb.Peek(0); next.TokenType == html.TextToken { | 				if next := tb.Peek(0); next.TokenType == html.TextToken && !next.HasTemplate { | ||||||
| 					tb.Shift() | 					tb.Shift() | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
							
								
								
									
										483
									
								
								vendor/github.com/tdewolff/parse/v2/binary.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										483
									
								
								vendor/github.com/tdewolff/parse/v2/binary.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,483 @@ | ||||||
|  | package parse | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/binary" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"math" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // BinaryReader is a binary big endian file format reader. | ||||||
|  | type BinaryReader struct { | ||||||
|  | 	Endianness binary.ByteOrder | ||||||
|  | 	buf        []byte | ||||||
|  | 	pos        uint32 | ||||||
|  | 	eof        bool | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewBinaryReader returns a big endian binary file format reader. | ||||||
|  | func NewBinaryReader(buf []byte) *BinaryReader { | ||||||
|  | 	if math.MaxUint32 < uint(len(buf)) { | ||||||
|  | 		return &BinaryReader{binary.BigEndian, nil, 0, true} | ||||||
|  | 	} | ||||||
|  | 	return &BinaryReader{binary.BigEndian, buf, 0, false} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewBinaryReaderLE returns a little endian binary file format reader. | ||||||
|  | func NewBinaryReaderLE(buf []byte) *BinaryReader { | ||||||
|  | 	r := NewBinaryReader(buf) | ||||||
|  | 	r.Endianness = binary.LittleEndian | ||||||
|  | 	return r | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Seek set the reader position in the buffer. | ||||||
|  | func (r *BinaryReader) Seek(pos uint32) error { | ||||||
|  | 	if uint32(len(r.buf)) < pos { | ||||||
|  | 		r.eof = true | ||||||
|  | 		return io.EOF | ||||||
|  | 	} | ||||||
|  | 	r.pos = pos | ||||||
|  | 	r.eof = false | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Pos returns the reader's position. | ||||||
|  | func (r *BinaryReader) Pos() uint32 { | ||||||
|  | 	return r.pos | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Len returns the remaining length of the buffer. | ||||||
|  | func (r *BinaryReader) Len() uint32 { | ||||||
|  | 	return uint32(len(r.buf)) - r.pos | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // EOF returns true if we reached the end-of-file. | ||||||
|  | func (r *BinaryReader) EOF() bool { | ||||||
|  | 	return r.eof | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Read complies with io.Reader. | ||||||
|  | func (r *BinaryReader) Read(b []byte) (int, error) { | ||||||
|  | 	n := copy(b, r.buf[r.pos:]) | ||||||
|  | 	r.pos += uint32(n) | ||||||
|  | 	if r.pos == uint32(len(r.buf)) { | ||||||
|  | 		r.eof = true | ||||||
|  | 		return n, io.EOF | ||||||
|  | 	} | ||||||
|  | 	return n, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadBytes reads n bytes. | ||||||
|  | func (r *BinaryReader) ReadBytes(n uint32) []byte { | ||||||
|  | 	if r.eof || uint32(len(r.buf))-r.pos < n { | ||||||
|  | 		r.eof = true | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	buf := r.buf[r.pos : r.pos+n : r.pos+n] | ||||||
|  | 	r.pos += n | ||||||
|  | 	return buf | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadString reads a string of length n. | ||||||
|  | func (r *BinaryReader) ReadString(n uint32) string { | ||||||
|  | 	return string(r.ReadBytes(n)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadByte reads a single byte. | ||||||
|  | func (r *BinaryReader) ReadByte() byte { | ||||||
|  | 	b := r.ReadBytes(1) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return b[0] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint8 reads a uint8. | ||||||
|  | func (r *BinaryReader) ReadUint8() uint8 { | ||||||
|  | 	return r.ReadByte() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint16 reads a uint16. | ||||||
|  | func (r *BinaryReader) ReadUint16() uint16 { | ||||||
|  | 	b := r.ReadBytes(2) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return r.Endianness.Uint16(b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint32 reads a uint32. | ||||||
|  | func (r *BinaryReader) ReadUint32() uint32 { | ||||||
|  | 	b := r.ReadBytes(4) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return r.Endianness.Uint32(b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint64 reads a uint64. | ||||||
|  | func (r *BinaryReader) ReadUint64() uint64 { | ||||||
|  | 	b := r.ReadBytes(8) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return r.Endianness.Uint64(b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt8 reads a int8. | ||||||
|  | func (r *BinaryReader) ReadInt8() int8 { | ||||||
|  | 	return int8(r.ReadByte()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt16 reads a int16. | ||||||
|  | func (r *BinaryReader) ReadInt16() int16 { | ||||||
|  | 	return int16(r.ReadUint16()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt32 reads a int32. | ||||||
|  | func (r *BinaryReader) ReadInt32() int32 { | ||||||
|  | 	return int32(r.ReadUint32()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt64 reads a int64. | ||||||
|  | func (r *BinaryReader) ReadInt64() int64 { | ||||||
|  | 	return int64(r.ReadUint64()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type BinaryFileReader struct { | ||||||
|  | 	f      *os.File | ||||||
|  | 	size   uint64 | ||||||
|  | 	offset uint64 | ||||||
|  | 
 | ||||||
|  | 	Endianness binary.ByteOrder | ||||||
|  | 	buf        []byte | ||||||
|  | 	pos        int | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewBinaryFileReader(f *os.File, chunk int) (*BinaryFileReader, error) { | ||||||
|  | 	var buf []byte | ||||||
|  | 	var size uint64 | ||||||
|  | 	if chunk == 0 { | ||||||
|  | 		var err error | ||||||
|  | 		if buf, err = io.ReadAll(f); err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		buf = make([]byte, 0, chunk) | ||||||
|  | 	} | ||||||
|  | 	if info, err := f.Stat(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} else { | ||||||
|  | 		size = uint64(info.Size()) | ||||||
|  | 	} | ||||||
|  | 	return &BinaryFileReader{ | ||||||
|  | 		f:          f, | ||||||
|  | 		size:       size, | ||||||
|  | 		Endianness: binary.BigEndian, | ||||||
|  | 		buf:        buf, | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (r *BinaryFileReader) buffer(pos, length uint64) error { | ||||||
|  | 	if pos < r.offset || r.offset+uint64(len(r.buf)) < pos+length { | ||||||
|  | 		if math.MaxInt64 < pos { | ||||||
|  | 			return fmt.Errorf("seek position too large") | ||||||
|  | 		} else if _, err := r.f.Seek(int64(pos), 0); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} else if n, err := r.f.Read(r.buf[:cap(r.buf)]); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} else { | ||||||
|  | 			r.offset = pos | ||||||
|  | 			r.buf = r.buf[:n] | ||||||
|  | 			r.pos = 0 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Seek set the reader position in the buffer. | ||||||
|  | func (r *BinaryFileReader) Seek(pos uint64) error { | ||||||
|  | 	if r.size <= pos { | ||||||
|  | 		return io.EOF | ||||||
|  | 	} else if err := r.buffer(pos, 0); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	r.pos = int(pos - r.offset) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Pos returns the reader's position. | ||||||
|  | func (r *BinaryFileReader) Pos() uint64 { | ||||||
|  | 	return r.offset + uint64(r.pos) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Len returns the remaining length of the buffer. | ||||||
|  | func (r *BinaryFileReader) Len() uint64 { | ||||||
|  | 	return r.size - r.Pos() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Offset returns the offset of the buffer. | ||||||
|  | func (r *BinaryFileReader) Offset() uint64 { | ||||||
|  | 	return r.offset | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BufferLen returns the length of the buffer. | ||||||
|  | func (r *BinaryFileReader) BufferLen() int { | ||||||
|  | 	return len(r.buf) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Read complies with io.Reader. | ||||||
|  | func (r *BinaryFileReader) Read(b []byte) (int, error) { | ||||||
|  | 	if len(b) <= cap(r.buf) { | ||||||
|  | 		if err := r.buffer(r.offset+uint64(r.pos), uint64(len(b))); err != nil { | ||||||
|  | 			return 0, err | ||||||
|  | 		} | ||||||
|  | 		n := copy(b, r.buf[r.pos:]) | ||||||
|  | 		r.pos += n | ||||||
|  | 		return n, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// read directly from file | ||||||
|  | 	if _, err := r.f.Seek(int64(r.offset)+int64(r.pos), 0); err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 	n, err := r.f.Read(b) | ||||||
|  | 	r.offset += uint64(r.pos + n) | ||||||
|  | 	r.pos = 0 | ||||||
|  | 	r.buf = r.buf[:0] | ||||||
|  | 	return n, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadBytes reads n bytes. | ||||||
|  | func (r *BinaryFileReader) ReadBytes(n int) []byte { | ||||||
|  | 	if n < len(r.buf)-r.pos { | ||||||
|  | 		b := r.buf[r.pos : r.pos+n] | ||||||
|  | 		r.pos += n | ||||||
|  | 		return b | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	b := make([]byte, n) | ||||||
|  | 	if _, err := r.Read(b); err != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return b | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadString reads a string of length n. | ||||||
|  | func (r *BinaryFileReader) ReadString(n int) string { | ||||||
|  | 	return string(r.ReadBytes(n)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadByte reads a single byte. | ||||||
|  | func (r *BinaryFileReader) ReadByte() byte { | ||||||
|  | 	b := r.ReadBytes(1) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return b[0] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint8 reads a uint8. | ||||||
|  | func (r *BinaryFileReader) ReadUint8() uint8 { | ||||||
|  | 	return r.ReadByte() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint16 reads a uint16. | ||||||
|  | func (r *BinaryFileReader) ReadUint16() uint16 { | ||||||
|  | 	b := r.ReadBytes(2) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return r.Endianness.Uint16(b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint32 reads a uint32. | ||||||
|  | func (r *BinaryFileReader) ReadUint32() uint32 { | ||||||
|  | 	b := r.ReadBytes(4) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return r.Endianness.Uint32(b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadUint64 reads a uint64. | ||||||
|  | func (r *BinaryFileReader) ReadUint64() uint64 { | ||||||
|  | 	b := r.ReadBytes(8) | ||||||
|  | 	if b == nil { | ||||||
|  | 		return 0 | ||||||
|  | 	} | ||||||
|  | 	return r.Endianness.Uint64(b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt8 reads a int8. | ||||||
|  | func (r *BinaryFileReader) ReadInt8() int8 { | ||||||
|  | 	return int8(r.ReadByte()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt16 reads a int16. | ||||||
|  | func (r *BinaryFileReader) ReadInt16() int16 { | ||||||
|  | 	return int16(r.ReadUint16()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt32 reads a int32. | ||||||
|  | func (r *BinaryFileReader) ReadInt32() int32 { | ||||||
|  | 	return int32(r.ReadUint32()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ReadInt64 reads a int64. | ||||||
|  | func (r *BinaryFileReader) ReadInt64() int64 { | ||||||
|  | 	return int64(r.ReadUint64()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BinaryWriter is a big endian binary file format writer. | ||||||
|  | type BinaryWriter struct { | ||||||
|  | 	buf []byte | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewBinaryWriter returns a big endian binary file format writer. | ||||||
|  | func NewBinaryWriter(buf []byte) *BinaryWriter { | ||||||
|  | 	return &BinaryWriter{buf} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Len returns the buffer's length in bytes. | ||||||
|  | func (w *BinaryWriter) Len() uint32 { | ||||||
|  | 	return uint32(len(w.buf)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Bytes returns the buffer's bytes. | ||||||
|  | func (w *BinaryWriter) Bytes() []byte { | ||||||
|  | 	return w.buf | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write complies with io.Writer. | ||||||
|  | func (w *BinaryWriter) Write(b []byte) (int, error) { | ||||||
|  | 	w.buf = append(w.buf, b...) | ||||||
|  | 	return len(b), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteBytes writes the given bytes to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteBytes(v []byte) { | ||||||
|  | 	w.buf = append(w.buf, v...) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteString writes the given string to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteString(v string) { | ||||||
|  | 	w.WriteBytes([]byte(v)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteByte writes the given byte to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteByte(v byte) { | ||||||
|  | 	w.WriteBytes([]byte{v}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteUint8 writes the given uint8 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteUint8(v uint8) { | ||||||
|  | 	w.WriteByte(v) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteUint16 writes the given uint16 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteUint16(v uint16) { | ||||||
|  | 	pos := len(w.buf) | ||||||
|  | 	w.buf = append(w.buf, make([]byte, 2)...) | ||||||
|  | 	binary.BigEndian.PutUint16(w.buf[pos:], v) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteUint32 writes the given uint32 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteUint32(v uint32) { | ||||||
|  | 	pos := len(w.buf) | ||||||
|  | 	w.buf = append(w.buf, make([]byte, 4)...) | ||||||
|  | 	binary.BigEndian.PutUint32(w.buf[pos:], v) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteUint64 writes the given uint64 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteUint64(v uint64) { | ||||||
|  | 	pos := len(w.buf) | ||||||
|  | 	w.buf = append(w.buf, make([]byte, 8)...) | ||||||
|  | 	binary.BigEndian.PutUint64(w.buf[pos:], v) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteInt8 writes the given int8 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteInt8(v int8) { | ||||||
|  | 	w.WriteUint8(uint8(v)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteInt16 writes the given int16 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteInt16(v int16) { | ||||||
|  | 	w.WriteUint16(uint16(v)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteInt32 writes the given int32 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteInt32(v int32) { | ||||||
|  | 	w.WriteUint32(uint32(v)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WriteInt64 writes the given int64 to the buffer. | ||||||
|  | func (w *BinaryWriter) WriteInt64(v int64) { | ||||||
|  | 	w.WriteUint64(uint64(v)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BitmapReader is a binary bitmap reader. | ||||||
|  | type BitmapReader struct { | ||||||
|  | 	buf []byte | ||||||
|  | 	pos uint32 // TODO: to uint64 | ||||||
|  | 	eof bool | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewBitmapReader returns a binary bitmap reader. | ||||||
|  | func NewBitmapReader(buf []byte) *BitmapReader { | ||||||
|  | 	return &BitmapReader{buf, 0, false} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Pos returns the current bit position. | ||||||
|  | func (r *BitmapReader) Pos() uint32 { | ||||||
|  | 	return r.pos | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // EOF returns if we reached the buffer's end-of-file. | ||||||
|  | func (r *BitmapReader) EOF() bool { | ||||||
|  | 	return r.eof | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Read reads the next bit. | ||||||
|  | func (r *BitmapReader) Read() bool { | ||||||
|  | 	if r.eof || uint32(len(r.buf)) <= (r.pos+1)/8 { | ||||||
|  | 		r.eof = true | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	bit := r.buf[r.pos>>3]&(0x80>>(r.pos&7)) != 0 | ||||||
|  | 	r.pos += 1 | ||||||
|  | 	return bit | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // BitmapWriter is a binary bitmap writer. | ||||||
|  | type BitmapWriter struct { | ||||||
|  | 	buf []byte | ||||||
|  | 	pos uint32 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewBitmapWriter returns a binary bitmap writer. | ||||||
|  | func NewBitmapWriter(buf []byte) *BitmapWriter { | ||||||
|  | 	return &BitmapWriter{buf, 0} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Len returns the buffer's length in bytes. | ||||||
|  | func (w *BitmapWriter) Len() uint32 { | ||||||
|  | 	return uint32(len(w.buf)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Bytes returns the buffer's bytes. | ||||||
|  | func (w *BitmapWriter) Bytes() []byte { | ||||||
|  | 	return w.buf | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write writes the next bit. | ||||||
|  | func (w *BitmapWriter) Write(bit bool) { | ||||||
|  | 	if uint32(len(w.buf)) <= (w.pos+1)/8 { | ||||||
|  | 		w.buf = append(w.buf, 0) | ||||||
|  | 	} | ||||||
|  | 	if bit { | ||||||
|  | 		w.buf[w.pos>>3] = w.buf[w.pos>>3] | (0x80 >> (w.pos & 7)) | ||||||
|  | 	} | ||||||
|  | 	w.pos += 1 | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								vendor/github.com/tdewolff/parse/v2/input.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/tdewolff/parse/v2/input.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -92,7 +92,7 @@ func (z *Input) Err() error { | ||||||
| func (z *Input) PeekErr(pos int) error { | func (z *Input) PeekErr(pos int) error { | ||||||
| 	if z.err != nil { | 	if z.err != nil { | ||||||
| 		return z.err | 		return z.err | ||||||
| 	} else if z.pos+pos >= len(z.buf)-1 { | 	} else if len(z.buf)-1 <= z.pos+pos { | ||||||
| 		return io.EOF | 		return io.EOF | ||||||
| 	} | 	} | ||||||
| 	return nil | 	return nil | ||||||
|  | @ -109,11 +109,11 @@ func (z *Input) Peek(pos int) byte { | ||||||
| func (z *Input) PeekRune(pos int) (rune, int) { | func (z *Input) PeekRune(pos int) (rune, int) { | ||||||
| 	// from unicode/utf8 | 	// from unicode/utf8 | ||||||
| 	c := z.Peek(pos) | 	c := z.Peek(pos) | ||||||
| 	if c < 0xC0 || z.Peek(pos+1) == 0 { | 	if c < 0xC0 || len(z.buf)-1-z.pos < 2 { | ||||||
| 		return rune(c), 1 | 		return rune(c), 1 | ||||||
| 	} else if c < 0xE0 || z.Peek(pos+2) == 0 { | 	} else if c < 0xE0 || len(z.buf)-1-z.pos < 3 { | ||||||
| 		return rune(c&0x1F)<<6 | rune(z.Peek(pos+1)&0x3F), 2 | 		return rune(c&0x1F)<<6 | rune(z.Peek(pos+1)&0x3F), 2 | ||||||
| 	} else if c < 0xF0 || z.Peek(pos+3) == 0 { | 	} else if c < 0xF0 || len(z.buf)-1-z.pos < 4 { | ||||||
| 		return rune(c&0x0F)<<12 | rune(z.Peek(pos+1)&0x3F)<<6 | rune(z.Peek(pos+2)&0x3F), 3 | 		return rune(c&0x0F)<<12 | rune(z.Peek(pos+1)&0x3F)<<6 | rune(z.Peek(pos+2)&0x3F), 3 | ||||||
| 	} | 	} | ||||||
| 	return rune(c&0x07)<<18 | rune(z.Peek(pos+1)&0x3F)<<12 | rune(z.Peek(pos+2)&0x3F)<<6 | rune(z.Peek(pos+3)&0x3F), 4 | 	return rune(c&0x07)<<18 | rune(z.Peek(pos+1)&0x3F)<<12 | rune(z.Peek(pos+2)&0x3F)<<6 | rune(z.Peek(pos+3)&0x3F), 4 | ||||||
|  | @ -124,6 +124,20 @@ func (z *Input) Move(n int) { | ||||||
| 	z.pos += n | 	z.pos += n | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // MoveRune advances the position by the length of the current rune. | ||||||
|  | func (z *Input) MoveRune() { | ||||||
|  | 	c := z.Peek(0) | ||||||
|  | 	if c < 0xC0 || len(z.buf)-1-z.pos < 2 { | ||||||
|  | 		z.pos++ | ||||||
|  | 	} else if c < 0xE0 || len(z.buf)-1-z.pos < 3 { | ||||||
|  | 		z.pos += 2 | ||||||
|  | 	} else if c < 0xF0 || len(z.buf)-1-z.pos < 4 { | ||||||
|  | 		z.pos += 3 | ||||||
|  | 	} else { | ||||||
|  | 		z.pos += 4 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Pos returns a mark to which can be rewinded. | // Pos returns a mark to which can be rewinded. | ||||||
| func (z *Input) Pos() int { | func (z *Input) Pos() int { | ||||||
| 	return z.pos - z.start | 	return z.pos - z.start | ||||||
|  |  | ||||||
							
								
								
									
										42
									
								
								vendor/golang.org/x/sync/semaphore/semaphore.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/golang.org/x/sync/semaphore/semaphore.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -35,11 +35,25 @@ type Weighted struct { | ||||||
| // Acquire acquires the semaphore with a weight of n, blocking until resources | // Acquire acquires the semaphore with a weight of n, blocking until resources | ||||||
| // are available or ctx is done. On success, returns nil. On failure, returns | // are available or ctx is done. On success, returns nil. On failure, returns | ||||||
| // ctx.Err() and leaves the semaphore unchanged. | // ctx.Err() and leaves the semaphore unchanged. | ||||||
| // |  | ||||||
| // If ctx is already done, Acquire may still succeed without blocking. |  | ||||||
| func (s *Weighted) Acquire(ctx context.Context, n int64) error { | func (s *Weighted) Acquire(ctx context.Context, n int64) error { | ||||||
|  | 	done := ctx.Done() | ||||||
|  | 
 | ||||||
| 	s.mu.Lock() | 	s.mu.Lock() | ||||||
|  | 	select { | ||||||
|  | 	case <-done: | ||||||
|  | 		// ctx becoming done has "happened before" acquiring the semaphore, | ||||||
|  | 		// whether it became done before the call began or while we were | ||||||
|  | 		// waiting for the mutex. We prefer to fail even if we could acquire | ||||||
|  | 		// the mutex without blocking. | ||||||
|  | 		s.mu.Unlock() | ||||||
|  | 		return ctx.Err() | ||||||
|  | 	default: | ||||||
|  | 	} | ||||||
| 	if s.size-s.cur >= n && s.waiters.Len() == 0 { | 	if s.size-s.cur >= n && s.waiters.Len() == 0 { | ||||||
|  | 		// Since we hold s.mu and haven't synchronized since checking done, if | ||||||
|  | 		// ctx becomes done before we return here, it becoming done must have | ||||||
|  | 		// "happened concurrently" with this call - it cannot "happen before" | ||||||
|  | 		// we return in this branch. So, we're ok to always acquire here. | ||||||
| 		s.cur += n | 		s.cur += n | ||||||
| 		s.mu.Unlock() | 		s.mu.Unlock() | ||||||
| 		return nil | 		return nil | ||||||
|  | @ -48,7 +62,7 @@ func (s *Weighted) Acquire(ctx context.Context, n int64) error { | ||||||
| 	if n > s.size { | 	if n > s.size { | ||||||
| 		// Don't make other Acquire calls block on one that's doomed to fail. | 		// Don't make other Acquire calls block on one that's doomed to fail. | ||||||
| 		s.mu.Unlock() | 		s.mu.Unlock() | ||||||
| 		<-ctx.Done() | 		<-done | ||||||
| 		return ctx.Err() | 		return ctx.Err() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -58,14 +72,14 @@ func (s *Weighted) Acquire(ctx context.Context, n int64) error { | ||||||
| 	s.mu.Unlock() | 	s.mu.Unlock() | ||||||
| 
 | 
 | ||||||
| 	select { | 	select { | ||||||
| 	case <-ctx.Done(): | 	case <-done: | ||||||
| 		err := ctx.Err() |  | ||||||
| 		s.mu.Lock() | 		s.mu.Lock() | ||||||
| 		select { | 		select { | ||||||
| 		case <-ready: | 		case <-ready: | ||||||
| 			// Acquired the semaphore after we were canceled.  Rather than trying to | 			// Acquired the semaphore after we were canceled. | ||||||
| 			// fix up the queue, just pretend we didn't notice the cancelation. | 			// Pretend we didn't and put the tokens back. | ||||||
| 			err = nil | 			s.cur -= n | ||||||
|  | 			s.notifyWaiters() | ||||||
| 		default: | 		default: | ||||||
| 			isFront := s.waiters.Front() == elem | 			isFront := s.waiters.Front() == elem | ||||||
| 			s.waiters.Remove(elem) | 			s.waiters.Remove(elem) | ||||||
|  | @ -75,9 +89,19 @@ func (s *Weighted) Acquire(ctx context.Context, n int64) error { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		s.mu.Unlock() | 		s.mu.Unlock() | ||||||
| 		return err | 		return ctx.Err() | ||||||
| 
 | 
 | ||||||
| 	case <-ready: | 	case <-ready: | ||||||
|  | 		// Acquired the semaphore. Check that ctx isn't already done. | ||||||
|  | 		// We check the done channel instead of calling ctx.Err because we | ||||||
|  | 		// already have the channel, and ctx.Err is O(n) with the nesting | ||||||
|  | 		// depth of ctx. | ||||||
|  | 		select { | ||||||
|  | 		case <-done: | ||||||
|  | 			s.Release(n) | ||||||
|  | 			return ctx.Err() | ||||||
|  | 		default: | ||||||
|  | 		} | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										162
									
								
								vendor/golang.org/x/tools/go/packages/packages.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										162
									
								
								vendor/golang.org/x/tools/go/packages/packages.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -9,6 +9,7 @@ package packages | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"go/ast" | 	"go/ast" | ||||||
| 	"go/parser" | 	"go/parser" | ||||||
|  | @ -24,6 +25,8 @@ import ( | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | 	"golang.org/x/sync/errgroup" | ||||||
|  | 
 | ||||||
| 	"golang.org/x/tools/go/gcexportdata" | 	"golang.org/x/tools/go/gcexportdata" | ||||||
| 	"golang.org/x/tools/internal/gocommand" | 	"golang.org/x/tools/internal/gocommand" | ||||||
| 	"golang.org/x/tools/internal/packagesinternal" | 	"golang.org/x/tools/internal/packagesinternal" | ||||||
|  | @ -126,9 +129,8 @@ type Config struct { | ||||||
| 	Mode LoadMode | 	Mode LoadMode | ||||||
| 
 | 
 | ||||||
| 	// Context specifies the context for the load operation. | 	// Context specifies the context for the load operation. | ||||||
| 	// If the context is cancelled, the loader may stop early | 	// Cancelling the context may cause [Load] to abort and | ||||||
| 	// and return an ErrCancelled error. | 	// return an error. | ||||||
| 	// If Context is nil, the load cannot be cancelled. |  | ||||||
| 	Context context.Context | 	Context context.Context | ||||||
| 
 | 
 | ||||||
| 	// Logf is the logger for the config. | 	// Logf is the logger for the config. | ||||||
|  | @ -211,8 +213,8 @@ type Config struct { | ||||||
| // Config specifies loading options; | // Config specifies loading options; | ||||||
| // nil behaves the same as an empty Config. | // nil behaves the same as an empty Config. | ||||||
| // | // | ||||||
| // Load returns an error if any of the patterns was invalid | // If any of the patterns was invalid as defined by the | ||||||
| // as defined by the underlying build system. | // underlying build system, Load returns an error. | ||||||
| // It may return an empty list of packages without an error, | // It may return an empty list of packages without an error, | ||||||
| // for instance for an empty expansion of a valid wildcard. | // for instance for an empty expansion of a valid wildcard. | ||||||
| // Errors associated with a particular package are recorded in the | // Errors associated with a particular package are recorded in the | ||||||
|  | @ -255,8 +257,27 @@ func Load(cfg *Config, patterns ...string) ([]*Package, error) { | ||||||
| // defaultDriver will fall back to the go list driver. | // defaultDriver will fall back to the go list driver. | ||||||
| // The boolean result indicates that an external driver handled the request. | // The boolean result indicates that an external driver handled the request. | ||||||
| func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, error) { | func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, error) { | ||||||
|  | 	const ( | ||||||
|  | 		// windowsArgMax specifies the maximum command line length for | ||||||
|  | 		// the Windows' CreateProcess function. | ||||||
|  | 		windowsArgMax = 32767 | ||||||
|  | 		// maxEnvSize is a very rough estimation of the maximum environment | ||||||
|  | 		// size of a user. | ||||||
|  | 		maxEnvSize = 16384 | ||||||
|  | 		// safeArgMax specifies the maximum safe command line length to use | ||||||
|  | 		// by the underlying driver excl. the environment. We choose the Windows' | ||||||
|  | 		// ARG_MAX as the starting point because it's one of the lowest ARG_MAX | ||||||
|  | 		// constants out of the different supported platforms, | ||||||
|  | 		// e.g., https://www.in-ulm.de/~mascheck/various/argmax/#results. | ||||||
|  | 		safeArgMax = windowsArgMax - maxEnvSize | ||||||
|  | 	) | ||||||
|  | 	chunks, err := splitIntoChunks(patterns, safeArgMax) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, false, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if driver := findExternalDriver(cfg); driver != nil { | 	if driver := findExternalDriver(cfg); driver != nil { | ||||||
| 		response, err := driver(cfg, patterns...) | 		response, err := callDriverOnChunks(driver, cfg, chunks) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, false, err | 			return nil, false, err | ||||||
| 		} else if !response.NotHandled { | 		} else if !response.NotHandled { | ||||||
|  | @ -265,11 +286,82 @@ func defaultDriver(cfg *Config, patterns ...string) (*DriverResponse, bool, erro | ||||||
| 		// (fall through) | 		// (fall through) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	response, err := goListDriver(cfg, patterns...) | 	response, err := callDriverOnChunks(goListDriver, cfg, chunks) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, false, err | 		return nil, false, err | ||||||
| 	} | 	} | ||||||
| 	return response, false, nil | 	return response, false, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // splitIntoChunks chunks the slice so that the total number of characters | ||||||
|  | // in a chunk is no longer than argMax. | ||||||
|  | func splitIntoChunks(patterns []string, argMax int) ([][]string, error) { | ||||||
|  | 	if argMax <= 0 { | ||||||
|  | 		return nil, errors.New("failed to split patterns into chunks, negative safe argMax value") | ||||||
|  | 	} | ||||||
|  | 	var chunks [][]string | ||||||
|  | 	charsInChunk := 0 | ||||||
|  | 	nextChunkStart := 0 | ||||||
|  | 	for i, v := range patterns { | ||||||
|  | 		vChars := len(v) | ||||||
|  | 		if vChars > argMax { | ||||||
|  | 			// a single pattern is longer than the maximum safe ARG_MAX, hardly should happen | ||||||
|  | 			return nil, errors.New("failed to split patterns into chunks, a pattern is too long") | ||||||
|  | 		} | ||||||
|  | 		charsInChunk += vChars + 1 // +1 is for a whitespace between patterns that has to be counted too | ||||||
|  | 		if charsInChunk > argMax { | ||||||
|  | 			chunks = append(chunks, patterns[nextChunkStart:i]) | ||||||
|  | 			nextChunkStart = i | ||||||
|  | 			charsInChunk = vChars | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// add the last chunk | ||||||
|  | 	if nextChunkStart < len(patterns) { | ||||||
|  | 		chunks = append(chunks, patterns[nextChunkStart:]) | ||||||
|  | 	} | ||||||
|  | 	return chunks, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func callDriverOnChunks(driver driver, cfg *Config, chunks [][]string) (*DriverResponse, error) { | ||||||
|  | 	if len(chunks) == 0 { | ||||||
|  | 		return driver(cfg) | ||||||
|  | 	} | ||||||
|  | 	responses := make([]*DriverResponse, len(chunks)) | ||||||
|  | 	errNotHandled := errors.New("driver returned NotHandled") | ||||||
|  | 	var g errgroup.Group | ||||||
|  | 	for i, chunk := range chunks { | ||||||
|  | 		i := i | ||||||
|  | 		chunk := chunk | ||||||
|  | 		g.Go(func() (err error) { | ||||||
|  | 			responses[i], err = driver(cfg, chunk...) | ||||||
|  | 			if responses[i] != nil && responses[i].NotHandled { | ||||||
|  | 				err = errNotHandled | ||||||
|  | 			} | ||||||
|  | 			return err | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	if err := g.Wait(); err != nil { | ||||||
|  | 		if errors.Is(err, errNotHandled) { | ||||||
|  | 			return &DriverResponse{NotHandled: true}, nil | ||||||
|  | 		} | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return mergeResponses(responses...), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func mergeResponses(responses ...*DriverResponse) *DriverResponse { | ||||||
|  | 	if len(responses) == 0 { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	response := newDeduper() | ||||||
|  | 	response.dr.NotHandled = false | ||||||
|  | 	response.dr.Compiler = responses[0].Compiler | ||||||
|  | 	response.dr.Arch = responses[0].Arch | ||||||
|  | 	response.dr.GoVersion = responses[0].GoVersion | ||||||
|  | 	for _, v := range responses { | ||||||
|  | 		response.addAll(v) | ||||||
|  | 	} | ||||||
|  | 	return response.dr | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // A Package describes a loaded Go package. | // A Package describes a loaded Go package. | ||||||
|  | @ -335,6 +427,10 @@ type Package struct { | ||||||
| 	// The NeedTypes LoadMode bit sets this field for packages matching the | 	// The NeedTypes LoadMode bit sets this field for packages matching the | ||||||
| 	// patterns; type information for dependencies may be missing or incomplete, | 	// patterns; type information for dependencies may be missing or incomplete, | ||||||
| 	// unless NeedDeps and NeedImports are also set. | 	// unless NeedDeps and NeedImports are also set. | ||||||
|  | 	// | ||||||
|  | 	// Each call to [Load] returns a consistent set of type | ||||||
|  | 	// symbols, as defined by the comment at [types.Identical]. | ||||||
|  | 	// Avoid mixing type information from two or more calls to [Load]. | ||||||
| 	Types *types.Package | 	Types *types.Package | ||||||
| 
 | 
 | ||||||
| 	// Fset provides position information for Types, TypesInfo, and Syntax. | 	// Fset provides position information for Types, TypesInfo, and Syntax. | ||||||
|  | @ -761,6 +857,12 @@ func (ld *loader) refine(response *DriverResponse) ([]*Package, error) { | ||||||
| 		wg.Wait() | 		wg.Wait() | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// If the context is done, return its error and | ||||||
|  | 	// throw out [likely] incomplete packages. | ||||||
|  | 	if err := ld.Context.Err(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	result := make([]*Package, len(initial)) | 	result := make([]*Package, len(initial)) | ||||||
| 	for i, lpkg := range initial { | 	for i, lpkg := range initial { | ||||||
| 		result[i] = lpkg.Package | 		result[i] = lpkg.Package | ||||||
|  | @ -856,6 +958,14 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { | ||||||
| 	lpkg.Types = types.NewPackage(lpkg.PkgPath, lpkg.Name) | 	lpkg.Types = types.NewPackage(lpkg.PkgPath, lpkg.Name) | ||||||
| 	lpkg.Fset = ld.Fset | 	lpkg.Fset = ld.Fset | ||||||
| 
 | 
 | ||||||
|  | 	// Start shutting down if the context is done and do not load | ||||||
|  | 	// source or export data files. | ||||||
|  | 	// Packages that import this one will have ld.Context.Err() != nil. | ||||||
|  | 	// ld.Context.Err() will be returned later by refine. | ||||||
|  | 	if ld.Context.Err() != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// Subtle: we populate all Types fields with an empty Package | 	// Subtle: we populate all Types fields with an empty Package | ||||||
| 	// before loading export data so that export data processing | 	// before loading export data so that export data processing | ||||||
| 	// never has to create a types.Package for an indirect dependency, | 	// never has to create a types.Package for an indirect dependency, | ||||||
|  | @ -975,6 +1085,13 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Start shutting down if the context is done and do not type check. | ||||||
|  | 	// Packages that import this one will have ld.Context.Err() != nil. | ||||||
|  | 	// ld.Context.Err() will be returned later by refine. | ||||||
|  | 	if ld.Context.Err() != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	lpkg.TypesInfo = &types.Info{ | 	lpkg.TypesInfo = &types.Info{ | ||||||
| 		Types:      make(map[ast.Expr]types.TypeAndValue), | 		Types:      make(map[ast.Expr]types.TypeAndValue), | ||||||
| 		Defs:       make(map[*ast.Ident]types.Object), | 		Defs:       make(map[*ast.Ident]types.Object), | ||||||
|  | @ -1025,7 +1142,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { | ||||||
| 		Sizes: ld.sizes, // may be nil | 		Sizes: ld.sizes, // may be nil | ||||||
| 	} | 	} | ||||||
| 	if lpkg.Module != nil && lpkg.Module.GoVersion != "" { | 	if lpkg.Module != nil && lpkg.Module.GoVersion != "" { | ||||||
| 		typesinternal.SetGoVersion(tc, "go"+lpkg.Module.GoVersion) | 		tc.GoVersion = "go" + lpkg.Module.GoVersion | ||||||
| 	} | 	} | ||||||
| 	if (ld.Mode & typecheckCgo) != 0 { | 	if (ld.Mode & typecheckCgo) != 0 { | ||||||
| 		if !typesinternal.SetUsesCgo(tc) { | 		if !typesinternal.SetUsesCgo(tc) { | ||||||
|  | @ -1036,10 +1153,24 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax) |  | ||||||
| 
 | 
 | ||||||
|  | 	typErr := types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax) | ||||||
| 	lpkg.importErrors = nil // no longer needed | 	lpkg.importErrors = nil // no longer needed | ||||||
| 
 | 
 | ||||||
|  | 	// In go/types go1.21 and go1.22, Checker.Files failed fast with a | ||||||
|  | 	// a "too new" error, without calling tc.Error and without | ||||||
|  | 	// proceeding to type-check the package (#66525). | ||||||
|  | 	// We rely on the runtimeVersion error to give the suggested remedy. | ||||||
|  | 	if typErr != nil && len(lpkg.Errors) == 0 && len(lpkg.Syntax) > 0 { | ||||||
|  | 		if msg := typErr.Error(); strings.HasPrefix(msg, "package requires newer Go version") { | ||||||
|  | 			appendError(types.Error{ | ||||||
|  | 				Fset: ld.Fset, | ||||||
|  | 				Pos:  lpkg.Syntax[0].Package, | ||||||
|  | 				Msg:  msg, | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// If !Cgo, the type-checker uses FakeImportC mode, so | 	// If !Cgo, the type-checker uses FakeImportC mode, so | ||||||
| 	// it doesn't invoke the importer for import "C", | 	// it doesn't invoke the importer for import "C", | ||||||
| 	// nor report an error for the import, | 	// nor report an error for the import, | ||||||
|  | @ -1061,6 +1192,12 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// If types.Checker.Files had an error that was unreported, | ||||||
|  | 	// make sure to report the unknown error so the package is illTyped. | ||||||
|  | 	if typErr != nil && len(lpkg.Errors) == 0 { | ||||||
|  | 		appendError(typErr) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// Record accumulated errors. | 	// Record accumulated errors. | ||||||
| 	illTyped := len(lpkg.Errors) > 0 | 	illTyped := len(lpkg.Errors) > 0 | ||||||
| 	if !illTyped { | 	if !illTyped { | ||||||
|  | @ -1132,11 +1269,6 @@ func (ld *loader) parseFiles(filenames []string) ([]*ast.File, []error) { | ||||||
| 	parsed := make([]*ast.File, n) | 	parsed := make([]*ast.File, n) | ||||||
| 	errors := make([]error, n) | 	errors := make([]error, n) | ||||||
| 	for i, file := range filenames { | 	for i, file := range filenames { | ||||||
| 		if ld.Config.Context.Err() != nil { |  | ||||||
| 			parsed[i] = nil |  | ||||||
| 			errors[i] = ld.Config.Context.Err() |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		wg.Add(1) | 		wg.Add(1) | ||||||
| 		go func(i int, filename string) { | 		go func(i int, filename string) { | ||||||
| 			parsed[i], errors[i] = ld.parseFile(filename) | 			parsed[i], errors[i] = ld.parseFile(filename) | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -30,7 +30,6 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"golang.org/x/tools/internal/aliases" | 	"golang.org/x/tools/internal/aliases" | ||||||
| 	"golang.org/x/tools/internal/typeparams" |  | ||||||
| 	"golang.org/x/tools/internal/typesinternal" | 	"golang.org/x/tools/internal/typesinternal" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -395,7 +394,7 @@ func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) { | ||||||
| 	// of objectpath will only be giving us origin methods, anyway, as referring | 	// of objectpath will only be giving us origin methods, anyway, as referring | ||||||
| 	// to instantiated methods is usually not useful. | 	// to instantiated methods is usually not useful. | ||||||
| 
 | 
 | ||||||
| 	if typeparams.OriginMethod(meth) != meth { | 	if meth.Origin() != meth { | ||||||
| 		return "", false | 		return "", false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/tools/internal/aliases/aliases.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/tools/internal/aliases/aliases.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -16,10 +16,14 @@ import ( | ||||||
| // NewAlias creates a new TypeName in Package pkg that | // NewAlias creates a new TypeName in Package pkg that | ||||||
| // is an alias for the type rhs. | // is an alias for the type rhs. | ||||||
| // | // | ||||||
| // When GoVersion>=1.22 and GODEBUG=gotypesalias=1, | // The enabled parameter determines whether the resulting [TypeName]'s | ||||||
| // the Type() of the return value is a *types.Alias. | // type is an [types.Alias]. Its value must be the result of a call to | ||||||
| func NewAlias(pos token.Pos, pkg *types.Package, name string, rhs types.Type) *types.TypeName { | // [Enabled], which computes the effective value of | ||||||
| 	if enabled() { | // GODEBUG=gotypesalias=... by invoking the type checker. The Enabled | ||||||
|  | // function is expensive and should be called once per task (e.g. | ||||||
|  | // package import), not once per call to NewAlias. | ||||||
|  | func NewAlias(enabled bool, pos token.Pos, pkg *types.Package, name string, rhs types.Type) *types.TypeName { | ||||||
|  | 	if enabled { | ||||||
| 		tname := types.NewTypeName(pos, pkg, name, nil) | 		tname := types.NewTypeName(pos, pkg, name, nil) | ||||||
| 		newAlias(tname, rhs) | 		newAlias(tname, rhs) | ||||||
| 		return tname | 		return tname | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								vendor/golang.org/x/tools/internal/aliases/aliases_go121.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -15,16 +15,17 @@ import ( | ||||||
| // It will never be created by go/types. | // It will never be created by go/types. | ||||||
| type Alias struct{} | type Alias struct{} | ||||||
| 
 | 
 | ||||||
| func (*Alias) String() string { panic("unreachable") } | func (*Alias) String() string         { panic("unreachable") } | ||||||
| 
 |  | ||||||
| func (*Alias) Underlying() types.Type { panic("unreachable") } | func (*Alias) Underlying() types.Type { panic("unreachable") } | ||||||
| 
 | func (*Alias) Obj() *types.TypeName   { panic("unreachable") } | ||||||
| func (*Alias) Obj() *types.TypeName { panic("unreachable") } | func Rhs(alias *Alias) types.Type     { panic("unreachable") } | ||||||
| 
 | 
 | ||||||
| // Unalias returns the type t for go <=1.21. | // Unalias returns the type t for go <=1.21. | ||||||
| func Unalias(t types.Type) types.Type { return t } | func Unalias(t types.Type) types.Type { return t } | ||||||
| 
 | 
 | ||||||
| // Always false for go <=1.21. Ignores GODEBUG. |  | ||||||
| func enabled() bool { return false } |  | ||||||
| 
 |  | ||||||
| func newAlias(name *types.TypeName, rhs types.Type) *Alias { panic("unreachable") } | func newAlias(name *types.TypeName, rhs types.Type) *Alias { panic("unreachable") } | ||||||
|  | 
 | ||||||
|  | // Enabled reports whether [NewAlias] should create [types.Alias] types. | ||||||
|  | // | ||||||
|  | // Before go1.22, this function always returns false. | ||||||
|  | func Enabled() bool { return false } | ||||||
|  |  | ||||||
							
								
								
									
										69
									
								
								vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										69
									
								
								vendor/golang.org/x/tools/internal/aliases/aliases_go122.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -12,14 +12,22 @@ import ( | ||||||
| 	"go/parser" | 	"go/parser" | ||||||
| 	"go/token" | 	"go/token" | ||||||
| 	"go/types" | 	"go/types" | ||||||
| 	"os" |  | ||||||
| 	"strings" |  | ||||||
| 	"sync" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Alias is an alias of types.Alias. | // Alias is an alias of types.Alias. | ||||||
| type Alias = types.Alias | type Alias = types.Alias | ||||||
| 
 | 
 | ||||||
|  | // Rhs returns the type on the right-hand side of the alias declaration. | ||||||
|  | func Rhs(alias *Alias) types.Type { | ||||||
|  | 	if alias, ok := any(alias).(interface{ Rhs() types.Type }); ok { | ||||||
|  | 		return alias.Rhs() // go1.23+ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// go1.22's Alias didn't have the Rhs method, | ||||||
|  | 	// so Unalias is the best we can do. | ||||||
|  | 	return Unalias(alias) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Unalias is a wrapper of types.Unalias. | // Unalias is a wrapper of types.Unalias. | ||||||
| func Unalias(t types.Type) types.Type { return types.Unalias(t) } | func Unalias(t types.Type) types.Type { return types.Unalias(t) } | ||||||
| 
 | 
 | ||||||
|  | @ -33,40 +41,23 @@ func newAlias(tname *types.TypeName, rhs types.Type) *Alias { | ||||||
| 	return a | 	return a | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // enabled returns true when types.Aliases are enabled. | // Enabled reports whether [NewAlias] should create [types.Alias] types. | ||||||
| func enabled() bool { | // | ||||||
| 	// Use the gotypesalias value in GODEBUG if set. | // This function is expensive! Call it sparingly. | ||||||
| 	godebug := os.Getenv("GODEBUG") | func Enabled() bool { | ||||||
| 	value := -1 // last set value. | 	// The only reliable way to compute the answer is to invoke go/types. | ||||||
| 	for _, f := range strings.Split(godebug, ",") { | 	// We don't parse the GODEBUG environment variable, because | ||||||
| 		switch f { | 	// (a) it's tricky to do so in a manner that is consistent | ||||||
| 		case "gotypesalias=1": | 	//     with the godebug package; in particular, a simple | ||||||
| 			value = 1 | 	//     substring check is not good enough. The value is a | ||||||
| 		case "gotypesalias=0": | 	//     rightmost-wins list of options. But more importantly: | ||||||
| 			value = 0 | 	// (b) it is impossible to detect changes to the effective | ||||||
| 		} | 	//     setting caused by os.Setenv("GODEBUG"), as happens in | ||||||
| 	} | 	//     many tests. Therefore any attempt to cache the result | ||||||
| 	switch value { | 	//     is just incorrect. | ||||||
| 	case 0: | 	fset := token.NewFileSet() | ||||||
| 		return false | 	f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0) | ||||||
| 	case 1: | 	pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil) | ||||||
| 		return true | 	_, enabled := pkg.Scope().Lookup("A").Type().(*types.Alias) | ||||||
| 	default: | 	return enabled | ||||||
| 		return aliasesDefault() |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // aliasesDefault reports if aliases are enabled by default. |  | ||||||
| func aliasesDefault() bool { |  | ||||||
| 	// Dynamically check if Aliases will be produced from go/types. |  | ||||||
| 	aliasesDefaultOnce.Do(func() { |  | ||||||
| 		fset := token.NewFileSet() |  | ||||||
| 		f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0) |  | ||||||
| 		pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil) |  | ||||||
| 		_, gotypesaliasDefault = pkg.Scope().Lookup("A").Type().(*types.Alias) |  | ||||||
| 	}) |  | ||||||
| 	return gotypesaliasDefault |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gotypesaliasDefault bool |  | ||||||
| var aliasesDefaultOnce sync.Once |  | ||||||
|  |  | ||||||
							
								
								
									
										59
									
								
								vendor/golang.org/x/tools/internal/event/tag/tag.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										59
									
								
								vendor/golang.org/x/tools/internal/event/tag/tag.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,59 +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 tag provides the labels used for telemetry throughout gopls. |  | ||||||
| package tag |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"golang.org/x/tools/internal/event/keys" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	// create the label keys we use |  | ||||||
| 	Method        = keys.NewString("method", "") |  | ||||||
| 	StatusCode    = keys.NewString("status.code", "") |  | ||||||
| 	StatusMessage = keys.NewString("status.message", "") |  | ||||||
| 	RPCID         = keys.NewString("id", "") |  | ||||||
| 	RPCDirection  = keys.NewString("direction", "") |  | ||||||
| 	File          = keys.NewString("file", "") |  | ||||||
| 	Directory     = keys.New("directory", "") |  | ||||||
| 	URI           = keys.New("URI", "") |  | ||||||
| 	Package       = keys.NewString("package", "") // sorted comma-separated list of Package IDs |  | ||||||
| 	PackagePath   = keys.NewString("package_path", "") |  | ||||||
| 	Query         = keys.New("query", "") |  | ||||||
| 	Snapshot      = keys.NewUInt64("snapshot", "") |  | ||||||
| 	Operation     = keys.NewString("operation", "") |  | ||||||
| 
 |  | ||||||
| 	Position     = keys.New("position", "") |  | ||||||
| 	Category     = keys.NewString("category", "") |  | ||||||
| 	PackageCount = keys.NewInt("packages", "") |  | ||||||
| 	Files        = keys.New("files", "") |  | ||||||
| 	Port         = keys.NewInt("port", "") |  | ||||||
| 	Type         = keys.New("type", "") |  | ||||||
| 	HoverKind    = keys.NewString("hoverkind", "") |  | ||||||
| 
 |  | ||||||
| 	NewServer = keys.NewString("new_server", "A new server was added") |  | ||||||
| 	EndServer = keys.NewString("end_server", "A server was shut down") |  | ||||||
| 
 |  | ||||||
| 	ServerID     = keys.NewString("server", "The server ID an event is related to") |  | ||||||
| 	Logfile      = keys.NewString("logfile", "") |  | ||||||
| 	DebugAddress = keys.NewString("debug_address", "") |  | ||||||
| 	GoplsPath    = keys.NewString("gopls_path", "") |  | ||||||
| 	ClientID     = keys.NewString("client_id", "") |  | ||||||
| 
 |  | ||||||
| 	Level = keys.NewInt("level", "The logging level") |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	// create the stats we measure |  | ||||||
| 	Started       = keys.NewInt64("started", "Count of started RPCs.") |  | ||||||
| 	ReceivedBytes = keys.NewInt64("received_bytes", "Bytes received.")            //, unit.Bytes) |  | ||||||
| 	SentBytes     = keys.NewInt64("sent_bytes", "Bytes sent.")                    //, unit.Bytes) |  | ||||||
| 	Latency       = keys.NewFloat64("latency_ms", "Elapsed time in milliseconds") //, unit.Milliseconds) |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| const ( |  | ||||||
| 	Inbound  = "in" |  | ||||||
| 	Outbound = "out" |  | ||||||
| ) |  | ||||||
							
								
								
									
										28
									
								
								vendor/golang.org/x/tools/internal/gcimporter/iexport.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/golang.org/x/tools/internal/gcimporter/iexport.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -464,7 +464,7 @@ func (p *iexporter) doDecl(obj types.Object) { | ||||||
| 
 | 
 | ||||||
| 	switch obj := obj.(type) { | 	switch obj := obj.(type) { | ||||||
| 	case *types.Var: | 	case *types.Var: | ||||||
| 		w.tag('V') | 		w.tag(varTag) | ||||||
| 		w.pos(obj.Pos()) | 		w.pos(obj.Pos()) | ||||||
| 		w.typ(obj.Type(), obj.Pkg()) | 		w.typ(obj.Type(), obj.Pkg()) | ||||||
| 
 | 
 | ||||||
|  | @ -482,9 +482,9 @@ func (p *iexporter) doDecl(obj types.Object) { | ||||||
| 
 | 
 | ||||||
| 		// Function. | 		// Function. | ||||||
| 		if sig.TypeParams().Len() == 0 { | 		if sig.TypeParams().Len() == 0 { | ||||||
| 			w.tag('F') | 			w.tag(funcTag) | ||||||
| 		} else { | 		} else { | ||||||
| 			w.tag('G') | 			w.tag(genericFuncTag) | ||||||
| 		} | 		} | ||||||
| 		w.pos(obj.Pos()) | 		w.pos(obj.Pos()) | ||||||
| 		// The tparam list of the function type is the declaration of the type | 		// The tparam list of the function type is the declaration of the type | ||||||
|  | @ -500,7 +500,7 @@ func (p *iexporter) doDecl(obj types.Object) { | ||||||
| 		w.signature(sig) | 		w.signature(sig) | ||||||
| 
 | 
 | ||||||
| 	case *types.Const: | 	case *types.Const: | ||||||
| 		w.tag('C') | 		w.tag(constTag) | ||||||
| 		w.pos(obj.Pos()) | 		w.pos(obj.Pos()) | ||||||
| 		w.value(obj.Type(), obj.Val()) | 		w.value(obj.Type(), obj.Val()) | ||||||
| 
 | 
 | ||||||
|  | @ -508,7 +508,7 @@ func (p *iexporter) doDecl(obj types.Object) { | ||||||
| 		t := obj.Type() | 		t := obj.Type() | ||||||
| 
 | 
 | ||||||
| 		if tparam, ok := aliases.Unalias(t).(*types.TypeParam); ok { | 		if tparam, ok := aliases.Unalias(t).(*types.TypeParam); ok { | ||||||
| 			w.tag('P') | 			w.tag(typeParamTag) | ||||||
| 			w.pos(obj.Pos()) | 			w.pos(obj.Pos()) | ||||||
| 			constraint := tparam.Constraint() | 			constraint := tparam.Constraint() | ||||||
| 			if p.version >= iexportVersionGo1_18 { | 			if p.version >= iexportVersionGo1_18 { | ||||||
|  | @ -523,8 +523,13 @@ func (p *iexporter) doDecl(obj types.Object) { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if obj.IsAlias() { | 		if obj.IsAlias() { | ||||||
| 			w.tag('A') | 			w.tag(aliasTag) | ||||||
| 			w.pos(obj.Pos()) | 			w.pos(obj.Pos()) | ||||||
|  | 			if alias, ok := t.(*aliases.Alias); ok { | ||||||
|  | 				// Preserve materialized aliases, | ||||||
|  | 				// even of non-exported types. | ||||||
|  | 				t = aliases.Rhs(alias) | ||||||
|  | 			} | ||||||
| 			w.typ(t, obj.Pkg()) | 			w.typ(t, obj.Pkg()) | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
|  | @ -536,9 +541,9 @@ func (p *iexporter) doDecl(obj types.Object) { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if named.TypeParams().Len() == 0 { | 		if named.TypeParams().Len() == 0 { | ||||||
| 			w.tag('T') | 			w.tag(typeTag) | ||||||
| 		} else { | 		} else { | ||||||
| 			w.tag('U') | 			w.tag(genericTypeTag) | ||||||
| 		} | 		} | ||||||
| 		w.pos(obj.Pos()) | 		w.pos(obj.Pos()) | ||||||
| 
 | 
 | ||||||
|  | @ -548,7 +553,7 @@ func (p *iexporter) doDecl(obj types.Object) { | ||||||
| 			w.tparamList(obj.Name(), named.TypeParams(), obj.Pkg()) | 			w.tparamList(obj.Name(), named.TypeParams(), obj.Pkg()) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		underlying := obj.Type().Underlying() | 		underlying := named.Underlying() | ||||||
| 		w.typ(underlying, obj.Pkg()) | 		w.typ(underlying, obj.Pkg()) | ||||||
| 
 | 
 | ||||||
| 		if types.IsInterface(t) { | 		if types.IsInterface(t) { | ||||||
|  | @ -739,7 +744,10 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { | ||||||
| 		}() | 		}() | ||||||
| 	} | 	} | ||||||
| 	switch t := t.(type) { | 	switch t := t.(type) { | ||||||
| 	// TODO(adonovan): support types.Alias. | 	case *aliases.Alias: | ||||||
|  | 		// TODO(adonovan): support parameterized aliases, following *types.Named. | ||||||
|  | 		w.startType(aliasType) | ||||||
|  | 		w.qualifiedType(t.Obj()) | ||||||
| 
 | 
 | ||||||
| 	case *types.Named: | 	case *types.Named: | ||||||
| 		if targs := t.TypeArgs(); targs.Len() > 0 { | 		if targs := t.TypeArgs(); targs.Len() > 0 { | ||||||
|  |  | ||||||
							
								
								
									
										44
									
								
								vendor/golang.org/x/tools/internal/gcimporter/iimport.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/golang.org/x/tools/internal/gcimporter/iimport.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -80,6 +80,20 @@ const ( | ||||||
| 	typeParamType | 	typeParamType | ||||||
| 	instanceType | 	instanceType | ||||||
| 	unionType | 	unionType | ||||||
|  | 	aliasType | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Object tags | ||||||
|  | const ( | ||||||
|  | 	varTag          = 'V' | ||||||
|  | 	funcTag         = 'F' | ||||||
|  | 	genericFuncTag  = 'G' | ||||||
|  | 	constTag        = 'C' | ||||||
|  | 	aliasTag        = 'A' | ||||||
|  | 	genericAliasTag = 'B' | ||||||
|  | 	typeParamTag    = 'P' | ||||||
|  | 	typeTag         = 'T' | ||||||
|  | 	genericTypeTag  = 'U' | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // IImportData imports a package from the serialized package data | // IImportData imports a package from the serialized package data | ||||||
|  | @ -196,6 +210,7 @@ func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte | ||||||
| 	p := iimporter{ | 	p := iimporter{ | ||||||
| 		version: int(version), | 		version: int(version), | ||||||
| 		ipath:   path, | 		ipath:   path, | ||||||
|  | 		aliases: aliases.Enabled(), | ||||||
| 		shallow: shallow, | 		shallow: shallow, | ||||||
| 		reportf: reportf, | 		reportf: reportf, | ||||||
| 
 | 
 | ||||||
|  | @ -324,7 +339,7 @@ func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// SetConstraint can't be called if the constraint type is not yet complete. | 	// SetConstraint can't be called if the constraint type is not yet complete. | ||||||
| 	// When type params are created in the 'P' case of (*importReader).obj(), | 	// When type params are created in the typeParamTag case of (*importReader).obj(), | ||||||
| 	// the associated constraint type may not be complete due to recursion. | 	// the associated constraint type may not be complete due to recursion. | ||||||
| 	// Therefore, we defer calling SetConstraint there, and call it here instead | 	// Therefore, we defer calling SetConstraint there, and call it here instead | ||||||
| 	// after all types are complete. | 	// after all types are complete. | ||||||
|  | @ -355,6 +370,7 @@ type iimporter struct { | ||||||
| 	version int | 	version int | ||||||
| 	ipath   string | 	ipath   string | ||||||
| 
 | 
 | ||||||
|  | 	aliases bool | ||||||
| 	shallow bool | 	shallow bool | ||||||
| 	reportf ReportFunc // if non-nil, used to report bugs | 	reportf ReportFunc // if non-nil, used to report bugs | ||||||
| 
 | 
 | ||||||
|  | @ -546,25 +562,29 @@ func (r *importReader) obj(name string) { | ||||||
| 	pos := r.pos() | 	pos := r.pos() | ||||||
| 
 | 
 | ||||||
| 	switch tag { | 	switch tag { | ||||||
| 	case 'A': | 	case aliasTag: | ||||||
| 		typ := r.typ() | 		typ := r.typ() | ||||||
|  | 		// TODO(adonovan): support generic aliases: | ||||||
|  | 		// if tag == genericAliasTag { | ||||||
|  | 		// 	tparams := r.tparamList() | ||||||
|  | 		// 	alias.SetTypeParams(tparams) | ||||||
|  | 		// } | ||||||
|  | 		r.declare(aliases.NewAlias(r.p.aliases, pos, r.currPkg, name, typ)) | ||||||
| 
 | 
 | ||||||
| 		r.declare(types.NewTypeName(pos, r.currPkg, name, typ)) | 	case constTag: | ||||||
| 
 |  | ||||||
| 	case 'C': |  | ||||||
| 		typ, val := r.value() | 		typ, val := r.value() | ||||||
| 
 | 
 | ||||||
| 		r.declare(types.NewConst(pos, r.currPkg, name, typ, val)) | 		r.declare(types.NewConst(pos, r.currPkg, name, typ, val)) | ||||||
| 
 | 
 | ||||||
| 	case 'F', 'G': | 	case funcTag, genericFuncTag: | ||||||
| 		var tparams []*types.TypeParam | 		var tparams []*types.TypeParam | ||||||
| 		if tag == 'G' { | 		if tag == genericFuncTag { | ||||||
| 			tparams = r.tparamList() | 			tparams = r.tparamList() | ||||||
| 		} | 		} | ||||||
| 		sig := r.signature(nil, nil, tparams) | 		sig := r.signature(nil, nil, tparams) | ||||||
| 		r.declare(types.NewFunc(pos, r.currPkg, name, sig)) | 		r.declare(types.NewFunc(pos, r.currPkg, name, sig)) | ||||||
| 
 | 
 | ||||||
| 	case 'T', 'U': | 	case typeTag, genericTypeTag: | ||||||
| 		// Types can be recursive. We need to setup a stub | 		// Types can be recursive. We need to setup a stub | ||||||
| 		// declaration before recursing. | 		// declaration before recursing. | ||||||
| 		obj := types.NewTypeName(pos, r.currPkg, name, nil) | 		obj := types.NewTypeName(pos, r.currPkg, name, nil) | ||||||
|  | @ -572,7 +592,7 @@ func (r *importReader) obj(name string) { | ||||||
| 		// Declare obj before calling r.tparamList, so the new type name is recognized | 		// Declare obj before calling r.tparamList, so the new type name is recognized | ||||||
| 		// if used in the constraint of one of its own typeparams (see #48280). | 		// if used in the constraint of one of its own typeparams (see #48280). | ||||||
| 		r.declare(obj) | 		r.declare(obj) | ||||||
| 		if tag == 'U' { | 		if tag == genericTypeTag { | ||||||
| 			tparams := r.tparamList() | 			tparams := r.tparamList() | ||||||
| 			named.SetTypeParams(tparams) | 			named.SetTypeParams(tparams) | ||||||
| 		} | 		} | ||||||
|  | @ -604,7 +624,7 @@ func (r *importReader) obj(name string) { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	case 'P': | 	case typeParamTag: | ||||||
| 		// We need to "declare" a typeparam in order to have a name that | 		// We need to "declare" a typeparam in order to have a name that | ||||||
| 		// can be referenced recursively (if needed) in the type param's | 		// can be referenced recursively (if needed) in the type param's | ||||||
| 		// bound. | 		// bound. | ||||||
|  | @ -637,7 +657,7 @@ func (r *importReader) obj(name string) { | ||||||
| 		// completely set up all types in ImportData. | 		// completely set up all types in ImportData. | ||||||
| 		r.p.later = append(r.p.later, setConstraintArgs{t: t, constraint: constraint}) | 		r.p.later = append(r.p.later, setConstraintArgs{t: t, constraint: constraint}) | ||||||
| 
 | 
 | ||||||
| 	case 'V': | 	case varTag: | ||||||
| 		typ := r.typ() | 		typ := r.typ() | ||||||
| 
 | 
 | ||||||
| 		r.declare(types.NewVar(pos, r.currPkg, name, typ)) | 		r.declare(types.NewVar(pos, r.currPkg, name, typ)) | ||||||
|  | @ -854,7 +874,7 @@ func (r *importReader) doType(base *types.Named) (res types.Type) { | ||||||
| 		errorf("unexpected kind tag in %q: %v", r.p.ipath, k) | 		errorf("unexpected kind tag in %q: %v", r.p.ipath, k) | ||||||
| 		return nil | 		return nil | ||||||
| 
 | 
 | ||||||
| 	case definedType: | 	case aliasType, definedType: | ||||||
| 		pkg, name := r.qualifiedIdent() | 		pkg, name := r.qualifiedIdent() | ||||||
| 		r.p.doDecl(pkg, name) | 		r.p.doDecl(pkg, name) | ||||||
| 		return pkg.Scope().Lookup(name).(*types.TypeName).Type() | 		return pkg.Scope().Lookup(name).(*types.TypeName).Type() | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -26,6 +26,7 @@ type pkgReader struct { | ||||||
| 
 | 
 | ||||||
| 	ctxt    *types.Context | 	ctxt    *types.Context | ||||||
| 	imports map[string]*types.Package // previously imported packages, indexed by path | 	imports map[string]*types.Package // previously imported packages, indexed by path | ||||||
|  | 	aliases bool                      // create types.Alias nodes | ||||||
| 
 | 
 | ||||||
| 	// lazily initialized arrays corresponding to the unified IR | 	// lazily initialized arrays corresponding to the unified IR | ||||||
| 	// PosBase, Pkg, and Type sections, respectively. | 	// PosBase, Pkg, and Type sections, respectively. | ||||||
|  | @ -99,6 +100,7 @@ func readUnifiedPackage(fset *token.FileSet, ctxt *types.Context, imports map[st | ||||||
| 
 | 
 | ||||||
| 		ctxt:    ctxt, | 		ctxt:    ctxt, | ||||||
| 		imports: imports, | 		imports: imports, | ||||||
|  | 		aliases: aliases.Enabled(), | ||||||
| 
 | 
 | ||||||
| 		posBases: make([]string, input.NumElems(pkgbits.RelocPosBase)), | 		posBases: make([]string, input.NumElems(pkgbits.RelocPosBase)), | ||||||
| 		pkgs:     make([]*types.Package, input.NumElems(pkgbits.RelocPkg)), | 		pkgs:     make([]*types.Package, input.NumElems(pkgbits.RelocPkg)), | ||||||
|  | @ -524,7 +526,7 @@ func (pr *pkgReader) objIdx(idx pkgbits.Index) (*types.Package, string) { | ||||||
| 		case pkgbits.ObjAlias: | 		case pkgbits.ObjAlias: | ||||||
| 			pos := r.pos() | 			pos := r.pos() | ||||||
| 			typ := r.typ() | 			typ := r.typ() | ||||||
| 			declare(types.NewTypeName(pos, objPkg, objName, typ)) | 			declare(aliases.NewAlias(r.p.aliases, pos, objPkg, objName, typ)) | ||||||
| 
 | 
 | ||||||
| 		case pkgbits.ObjConst: | 		case pkgbits.ObjConst: | ||||||
| 			pos := r.pos() | 			pos := r.pos() | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/tools/internal/gocommand/invoke.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/tools/internal/gocommand/invoke.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -25,7 +25,6 @@ import ( | ||||||
| 	"golang.org/x/tools/internal/event" | 	"golang.org/x/tools/internal/event" | ||||||
| 	"golang.org/x/tools/internal/event/keys" | 	"golang.org/x/tools/internal/event/keys" | ||||||
| 	"golang.org/x/tools/internal/event/label" | 	"golang.org/x/tools/internal/event/label" | ||||||
| 	"golang.org/x/tools/internal/event/tag" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // An Runner will run go command invocations and serialize | // An Runner will run go command invocations and serialize | ||||||
|  | @ -55,11 +54,14 @@ func (runner *Runner) initialize() { | ||||||
| // 1.14: go: updating go.mod: existing contents have changed since last read | // 1.14: go: updating go.mod: existing contents have changed since last read | ||||||
| var modConcurrencyError = regexp.MustCompile(`go:.*go.mod.*contents have changed`) | var modConcurrencyError = regexp.MustCompile(`go:.*go.mod.*contents have changed`) | ||||||
| 
 | 
 | ||||||
| // verb is an event label for the go command verb. | // event keys for go command invocations | ||||||
| var verb = keys.NewString("verb", "go command verb") | var ( | ||||||
|  | 	verb      = keys.NewString("verb", "go command verb") | ||||||
|  | 	directory = keys.NewString("directory", "") | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| func invLabels(inv Invocation) []label.Label { | func invLabels(inv Invocation) []label.Label { | ||||||
| 	return []label.Label{verb.Of(inv.Verb), tag.Directory.Of(inv.WorkingDir)} | 	return []label.Label{verb.Of(inv.Verb), directory.Of(inv.WorkingDir)} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Run is a convenience wrapper around RunRaw. | // Run is a convenience wrapper around RunRaw. | ||||||
|  | @ -158,12 +160,15 @@ type Invocation struct { | ||||||
| 	BuildFlags []string | 	BuildFlags []string | ||||||
| 
 | 
 | ||||||
| 	// If ModFlag is set, the go command is invoked with -mod=ModFlag. | 	// If ModFlag is set, the go command is invoked with -mod=ModFlag. | ||||||
|  | 	// TODO(rfindley): remove, in favor of Args. | ||||||
| 	ModFlag string | 	ModFlag string | ||||||
| 
 | 
 | ||||||
| 	// If ModFile is set, the go command is invoked with -modfile=ModFile. | 	// If ModFile is set, the go command is invoked with -modfile=ModFile. | ||||||
|  | 	// TODO(rfindley): remove, in favor of Args. | ||||||
| 	ModFile string | 	ModFile string | ||||||
| 
 | 
 | ||||||
| 	// If Overlay is set, the go command is invoked with -overlay=Overlay. | 	// If Overlay is set, the go command is invoked with -overlay=Overlay. | ||||||
|  | 	// TODO(rfindley): remove, in favor of Args. | ||||||
| 	Overlay string | 	Overlay string | ||||||
| 
 | 
 | ||||||
| 	// If CleanEnv is set, the invocation will run only with the environment | 	// If CleanEnv is set, the invocation will run only with the environment | ||||||
|  |  | ||||||
							
								
								
									
										54
									
								
								vendor/golang.org/x/tools/internal/gocommand/vendor.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								vendor/golang.org/x/tools/internal/gocommand/vendor.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -107,3 +107,57 @@ func getMainModuleAnd114(ctx context.Context, inv Invocation, r *Runner) (*Modul | ||||||
| 	} | 	} | ||||||
| 	return mod, lines[4] == "go1.14", nil | 	return mod, lines[4] == "go1.14", nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // WorkspaceVendorEnabled reports whether workspace vendoring is enabled. It takes a *Runner to execute Go commands | ||||||
|  | // with the supplied context.Context and Invocation. The Invocation can contain pre-defined fields, | ||||||
|  | // of which only Verb and Args are modified to run the appropriate Go command. | ||||||
|  | // Inspired by setDefaultBuildMod in modload/init.go | ||||||
|  | func WorkspaceVendorEnabled(ctx context.Context, inv Invocation, r *Runner) (bool, []*ModuleJSON, error) { | ||||||
|  | 	inv.Verb = "env" | ||||||
|  | 	inv.Args = []string{"GOWORK"} | ||||||
|  | 	stdout, err := r.Run(ctx, inv) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, nil, err | ||||||
|  | 	} | ||||||
|  | 	goWork := string(bytes.TrimSpace(stdout.Bytes())) | ||||||
|  | 	if fi, err := os.Stat(filepath.Join(filepath.Dir(goWork), "vendor")); err == nil && fi.IsDir() { | ||||||
|  | 		mainMods, err := getWorkspaceMainModules(ctx, inv, r) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return false, nil, err | ||||||
|  | 		} | ||||||
|  | 		return true, mainMods, nil | ||||||
|  | 	} | ||||||
|  | 	return false, nil, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // getWorkspaceMainModules gets the main modules' information. | ||||||
|  | // This is the information needed to figure out if vendoring should be enabled. | ||||||
|  | func getWorkspaceMainModules(ctx context.Context, inv Invocation, r *Runner) ([]*ModuleJSON, error) { | ||||||
|  | 	const format = `{{.Path}} | ||||||
|  | {{.Dir}} | ||||||
|  | {{.GoMod}} | ||||||
|  | {{.GoVersion}} | ||||||
|  | ` | ||||||
|  | 	inv.Verb = "list" | ||||||
|  | 	inv.Args = []string{"-m", "-f", format} | ||||||
|  | 	stdout, err := r.Run(ctx, inv) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	lines := strings.Split(strings.TrimSuffix(stdout.String(), "\n"), "\n") | ||||||
|  | 	if len(lines) < 4 { | ||||||
|  | 		return nil, fmt.Errorf("unexpected stdout: %q", stdout.String()) | ||||||
|  | 	} | ||||||
|  | 	mods := make([]*ModuleJSON, 0, len(lines)/4) | ||||||
|  | 	for i := 0; i < len(lines); i += 4 { | ||||||
|  | 		mods = append(mods, &ModuleJSON{ | ||||||
|  | 			Path:      lines[i], | ||||||
|  | 			Dir:       lines[i+1], | ||||||
|  | 			GoMod:     lines[i+2], | ||||||
|  | 			GoVersion: lines[i+3], | ||||||
|  | 			Main:      true, | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | 	return mods, nil | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										127
									
								
								vendor/golang.org/x/tools/internal/imports/fix.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										127
									
								
								vendor/golang.org/x/tools/internal/imports/fix.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -31,6 +31,7 @@ import ( | ||||||
| 	"golang.org/x/tools/internal/event" | 	"golang.org/x/tools/internal/event" | ||||||
| 	"golang.org/x/tools/internal/gocommand" | 	"golang.org/x/tools/internal/gocommand" | ||||||
| 	"golang.org/x/tools/internal/gopathwalk" | 	"golang.org/x/tools/internal/gopathwalk" | ||||||
|  | 	"golang.org/x/tools/internal/stdlib" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // importToGroup is a list of functions which map from an import path to | // importToGroup is a list of functions which map from an import path to | ||||||
|  | @ -300,6 +301,20 @@ func (p *pass) loadPackageNames(imports []*ImportInfo) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // if there is a trailing major version, remove it | ||||||
|  | func withoutVersion(nm string) string { | ||||||
|  | 	if v := path.Base(nm); len(v) > 0 && v[0] == 'v' { | ||||||
|  | 		if _, err := strconv.Atoi(v[1:]); err == nil { | ||||||
|  | 			// this is, for instance, called with rand/v2 and returns rand | ||||||
|  | 			if len(v) < len(nm) { | ||||||
|  | 				xnm := nm[:len(nm)-len(v)-1] | ||||||
|  | 				return path.Base(xnm) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nm | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // importIdentifier returns the identifier that imp will introduce. It will | // importIdentifier returns the identifier that imp will introduce. It will | ||||||
| // guess if the package name has not been loaded, e.g. because the source | // guess if the package name has not been loaded, e.g. because the source | ||||||
| // is not available. | // is not available. | ||||||
|  | @ -309,7 +324,7 @@ func (p *pass) importIdentifier(imp *ImportInfo) string { | ||||||
| 	} | 	} | ||||||
| 	known := p.knownPackages[imp.ImportPath] | 	known := p.knownPackages[imp.ImportPath] | ||||||
| 	if known != nil && known.name != "" { | 	if known != nil && known.name != "" { | ||||||
| 		return known.name | 		return withoutVersion(known.name) | ||||||
| 	} | 	} | ||||||
| 	return ImportPathToAssumedName(imp.ImportPath) | 	return ImportPathToAssumedName(imp.ImportPath) | ||||||
| } | } | ||||||
|  | @ -511,9 +526,9 @@ func (p *pass) assumeSiblingImportsValid() { | ||||||
| 		} | 		} | ||||||
| 		for left, rights := range refs { | 		for left, rights := range refs { | ||||||
| 			if imp, ok := importsByName[left]; ok { | 			if imp, ok := importsByName[left]; ok { | ||||||
| 				if m, ok := stdlib[imp.ImportPath]; ok { | 				if m, ok := stdlib.PackageSymbols[imp.ImportPath]; ok { | ||||||
| 					// We have the stdlib in memory; no need to guess. | 					// We have the stdlib in memory; no need to guess. | ||||||
| 					rights = copyExports(m) | 					rights = symbolNameSet(m) | ||||||
| 				} | 				} | ||||||
| 				p.addCandidate(imp, &packageInfo{ | 				p.addCandidate(imp, &packageInfo{ | ||||||
| 					// no name; we already know it. | 					// no name; we already know it. | ||||||
|  | @ -641,7 +656,7 @@ func getCandidatePkgs(ctx context.Context, wrappedCallback *scanCallback, filena | ||||||
| 	dupCheck := map[string]struct{}{} | 	dupCheck := map[string]struct{}{} | ||||||
| 
 | 
 | ||||||
| 	// Start off with the standard library. | 	// Start off with the standard library. | ||||||
| 	for importPath, exports := range stdlib { | 	for importPath, symbols := range stdlib.PackageSymbols { | ||||||
| 		p := &pkg{ | 		p := &pkg{ | ||||||
| 			dir:             filepath.Join(goenv["GOROOT"], "src", importPath), | 			dir:             filepath.Join(goenv["GOROOT"], "src", importPath), | ||||||
| 			importPathShort: importPath, | 			importPathShort: importPath, | ||||||
|  | @ -650,6 +665,13 @@ func getCandidatePkgs(ctx context.Context, wrappedCallback *scanCallback, filena | ||||||
| 		} | 		} | ||||||
| 		dupCheck[importPath] = struct{}{} | 		dupCheck[importPath] = struct{}{} | ||||||
| 		if notSelf(p) && wrappedCallback.dirFound(p) && wrappedCallback.packageNameLoaded(p) { | 		if notSelf(p) && wrappedCallback.dirFound(p) && wrappedCallback.packageNameLoaded(p) { | ||||||
|  | 			var exports []stdlib.Symbol | ||||||
|  | 			for _, sym := range symbols { | ||||||
|  | 				switch sym.Kind { | ||||||
|  | 				case stdlib.Func, stdlib.Type, stdlib.Var, stdlib.Const: | ||||||
|  | 					exports = append(exports, sym) | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
| 			wrappedCallback.exportsLoaded(p, exports) | 			wrappedCallback.exportsLoaded(p, exports) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -670,7 +692,7 @@ func getCandidatePkgs(ctx context.Context, wrappedCallback *scanCallback, filena | ||||||
| 			dupCheck[pkg.importPathShort] = struct{}{} | 			dupCheck[pkg.importPathShort] = struct{}{} | ||||||
| 			return notSelf(pkg) && wrappedCallback.packageNameLoaded(pkg) | 			return notSelf(pkg) && wrappedCallback.packageNameLoaded(pkg) | ||||||
| 		}, | 		}, | ||||||
| 		exportsLoaded: func(pkg *pkg, exports []string) { | 		exportsLoaded: func(pkg *pkg, exports []stdlib.Symbol) { | ||||||
| 			// If we're an x_test, load the package under test's test variant. | 			// If we're an x_test, load the package under test's test variant. | ||||||
| 			if strings.HasSuffix(filePkg, "_test") && pkg.dir == filepath.Dir(filename) { | 			if strings.HasSuffix(filePkg, "_test") && pkg.dir == filepath.Dir(filename) { | ||||||
| 				var err error | 				var err error | ||||||
|  | @ -795,7 +817,7 @@ func GetImportPaths(ctx context.Context, wrapped func(ImportFix), searchPrefix, | ||||||
| // A PackageExport is a package and its exports. | // A PackageExport is a package and its exports. | ||||||
| type PackageExport struct { | type PackageExport struct { | ||||||
| 	Fix     *ImportFix | 	Fix     *ImportFix | ||||||
| 	Exports []string | 	Exports []stdlib.Symbol | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetPackageExports returns all known packages with name pkg and their exports. | // GetPackageExports returns all known packages with name pkg and their exports. | ||||||
|  | @ -810,8 +832,8 @@ func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchP | ||||||
| 		packageNameLoaded: func(pkg *pkg) bool { | 		packageNameLoaded: func(pkg *pkg) bool { | ||||||
| 			return pkg.packageName == searchPkg | 			return pkg.packageName == searchPkg | ||||||
| 		}, | 		}, | ||||||
| 		exportsLoaded: func(pkg *pkg, exports []string) { | 		exportsLoaded: func(pkg *pkg, exports []stdlib.Symbol) { | ||||||
| 			sort.Strings(exports) | 			sortSymbols(exports) | ||||||
| 			wrapped(PackageExport{ | 			wrapped(PackageExport{ | ||||||
| 				Fix: &ImportFix{ | 				Fix: &ImportFix{ | ||||||
| 					StmtInfo: ImportInfo{ | 					StmtInfo: ImportInfo{ | ||||||
|  | @ -988,8 +1010,10 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) { | ||||||
| 		// already know the view type. | 		// already know the view type. | ||||||
| 		if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 { | 		if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 { | ||||||
| 			e.resolver = newGopathResolver(e) | 			e.resolver = newGopathResolver(e) | ||||||
|  | 		} else if r, err := newModuleResolver(e, e.ModCache); err != nil { | ||||||
|  | 			e.resolverErr = err | ||||||
| 		} else { | 		} else { | ||||||
| 			e.resolver, e.resolverErr = newModuleResolver(e, e.ModCache) | 			e.resolver = Resolver(r) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -1049,24 +1073,40 @@ func addStdlibCandidates(pass *pass, refs references) error { | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | 	localbase := func(nm string) string { | ||||||
|  | 		ans := path.Base(nm) | ||||||
|  | 		if ans[0] == 'v' { | ||||||
|  | 			// this is called, for instance, with math/rand/v2 and returns rand/v2 | ||||||
|  | 			if _, err := strconv.Atoi(ans[1:]); err == nil { | ||||||
|  | 				ix := strings.LastIndex(nm, ans) | ||||||
|  | 				more := path.Base(nm[:ix]) | ||||||
|  | 				ans = path.Join(more, ans) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return ans | ||||||
|  | 	} | ||||||
| 	add := func(pkg string) { | 	add := func(pkg string) { | ||||||
| 		// Prevent self-imports. | 		// Prevent self-imports. | ||||||
| 		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(goenv["GOROOT"], "src", pkg) == pass.srcDir { | 		if path.Base(pkg) == pass.f.Name.Name && filepath.Join(goenv["GOROOT"], "src", pkg) == pass.srcDir { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		exports := copyExports(stdlib[pkg]) | 		exports := symbolNameSet(stdlib.PackageSymbols[pkg]) | ||||||
| 		pass.addCandidate( | 		pass.addCandidate( | ||||||
| 			&ImportInfo{ImportPath: pkg}, | 			&ImportInfo{ImportPath: pkg}, | ||||||
| 			&packageInfo{name: path.Base(pkg), exports: exports}) | 			&packageInfo{name: localbase(pkg), exports: exports}) | ||||||
| 	} | 	} | ||||||
| 	for left := range refs { | 	for left := range refs { | ||||||
| 		if left == "rand" { | 		if left == "rand" { | ||||||
| 			// Make sure we try crypto/rand before math/rand. | 			// Make sure we try crypto/rand before any version of math/rand as both have Int() | ||||||
|  | 			// and our policy is to recommend crypto | ||||||
| 			add("crypto/rand") | 			add("crypto/rand") | ||||||
| 			add("math/rand") | 			// if the user's no later than go1.21, this should be "math/rand" | ||||||
|  | 			// but we have no way of figuring out what the user is using | ||||||
|  | 			// TODO: investigate using the toolchain version to disambiguate in the stdlib | ||||||
|  | 			add("math/rand/v2") | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		for importPath := range stdlib { | 		for importPath := range stdlib.PackageSymbols { | ||||||
| 			if path.Base(importPath) == left { | 			if path.Base(importPath) == left { | ||||||
| 				add(importPath) | 				add(importPath) | ||||||
| 			} | 			} | ||||||
|  | @ -1085,7 +1125,7 @@ type Resolver interface { | ||||||
| 
 | 
 | ||||||
| 	// loadExports returns the set of exported symbols in the package at dir. | 	// loadExports returns the set of exported symbols in the package at dir. | ||||||
| 	// loadExports may be called concurrently. | 	// loadExports may be called concurrently. | ||||||
| 	loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) | 	loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []stdlib.Symbol, error) | ||||||
| 
 | 
 | ||||||
| 	// scoreImportPath returns the relevance for an import path. | 	// scoreImportPath returns the relevance for an import path. | ||||||
| 	scoreImportPath(ctx context.Context, path string) float64 | 	scoreImportPath(ctx context.Context, path string) float64 | ||||||
|  | @ -1114,7 +1154,7 @@ type scanCallback struct { | ||||||
| 	// If it returns true, the package's exports will be loaded. | 	// If it returns true, the package's exports will be loaded. | ||||||
| 	packageNameLoaded func(pkg *pkg) bool | 	packageNameLoaded func(pkg *pkg) bool | ||||||
| 	// exportsLoaded is called when a package's exports have been loaded. | 	// exportsLoaded is called when a package's exports have been loaded. | ||||||
| 	exportsLoaded func(pkg *pkg, exports []string) | 	exportsLoaded func(pkg *pkg, exports []stdlib.Symbol) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error { | func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error { | ||||||
|  | @ -1295,7 +1335,7 @@ func (r *gopathResolver) loadPackageNames(importPaths []string, srcDir string) ( | ||||||
| // importPathToName finds out the actual package name, as declared in its .go files. | // importPathToName finds out the actual package name, as declared in its .go files. | ||||||
| func importPathToName(bctx *build.Context, importPath, srcDir string) string { | func importPathToName(bctx *build.Context, importPath, srcDir string) string { | ||||||
| 	// Fast path for standard library without going to disk. | 	// Fast path for standard library without going to disk. | ||||||
| 	if _, ok := stdlib[importPath]; ok { | 	if stdlib.HasPackage(importPath) { | ||||||
| 		return path.Base(importPath) // stdlib packages always match their paths. | 		return path.Base(importPath) // stdlib packages always match their paths. | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -1493,7 +1533,7 @@ func (r *gopathResolver) scan(ctx context.Context, callback *scanCallback) error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *gopathResolver) scoreImportPath(ctx context.Context, path string) float64 { | func (r *gopathResolver) scoreImportPath(ctx context.Context, path string) float64 { | ||||||
| 	if _, ok := stdlib[path]; ok { | 	if stdlib.HasPackage(path) { | ||||||
| 		return MaxRelevance | 		return MaxRelevance | ||||||
| 	} | 	} | ||||||
| 	return MaxRelevance - 1 | 	return MaxRelevance - 1 | ||||||
|  | @ -1510,7 +1550,7 @@ func filterRoots(roots []gopathwalk.Root, include func(gopathwalk.Root) bool) [] | ||||||
| 	return result | 	return result | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *gopathResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) { | func (r *gopathResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []stdlib.Symbol, error) { | ||||||
| 	if info, ok := r.cache.Load(pkg.dir); ok && !includeTest { | 	if info, ok := r.cache.Load(pkg.dir); ok && !includeTest { | ||||||
| 		return r.cache.CacheExports(ctx, r.env, info) | 		return r.cache.CacheExports(ctx, r.env, info) | ||||||
| 	} | 	} | ||||||
|  | @ -1530,7 +1570,7 @@ func VendorlessPath(ipath string) string { | ||||||
| 	return ipath | 	return ipath | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, includeTest bool) (string, []string, error) { | func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, includeTest bool) (string, []stdlib.Symbol, error) { | ||||||
| 	// Look for non-test, buildable .go files which could provide exports. | 	// Look for non-test, buildable .go files which could provide exports. | ||||||
| 	all, err := os.ReadDir(dir) | 	all, err := os.ReadDir(dir) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -1554,7 +1594,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var pkgName string | 	var pkgName string | ||||||
| 	var exports []string | 	var exports []stdlib.Symbol | ||||||
| 	fset := token.NewFileSet() | 	fset := token.NewFileSet() | ||||||
| 	for _, fi := range files { | 	for _, fi := range files { | ||||||
| 		select { | 		select { | ||||||
|  | @ -1581,21 +1621,41 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		pkgName = f.Name.Name | 		pkgName = f.Name.Name | ||||||
| 		for name := range f.Scope.Objects { | 		for name, obj := range f.Scope.Objects { | ||||||
| 			if ast.IsExported(name) { | 			if ast.IsExported(name) { | ||||||
| 				exports = append(exports, name) | 				var kind stdlib.Kind | ||||||
|  | 				switch obj.Kind { | ||||||
|  | 				case ast.Con: | ||||||
|  | 					kind = stdlib.Const | ||||||
|  | 				case ast.Typ: | ||||||
|  | 					kind = stdlib.Type | ||||||
|  | 				case ast.Var: | ||||||
|  | 					kind = stdlib.Var | ||||||
|  | 				case ast.Fun: | ||||||
|  | 					kind = stdlib.Func | ||||||
|  | 				} | ||||||
|  | 				exports = append(exports, stdlib.Symbol{ | ||||||
|  | 					Name:    name, | ||||||
|  | 					Kind:    kind, | ||||||
|  | 					Version: 0, // unknown; be permissive | ||||||
|  | 				}) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	sortSymbols(exports) | ||||||
| 
 | 
 | ||||||
| 	if env.Logf != nil { | 	if env.Logf != nil { | ||||||
| 		sortedExports := append([]string(nil), exports...) | 		env.Logf("loaded exports in dir %v (package %v): %v", dir, pkgName, exports) | ||||||
| 		sort.Strings(sortedExports) |  | ||||||
| 		env.Logf("loaded exports in dir %v (package %v): %v", dir, pkgName, strings.Join(sortedExports, ", ")) |  | ||||||
| 	} | 	} | ||||||
| 	return pkgName, exports, nil | 	return pkgName, exports, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func sortSymbols(syms []stdlib.Symbol) { | ||||||
|  | 	sort.Slice(syms, func(i, j int) bool { | ||||||
|  | 		return syms[i].Name < syms[j].Name | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // findImport searches for a package with the given symbols. | // findImport searches for a package with the given symbols. | ||||||
| // If no package is found, findImport returns ("", false, nil) | // If no package is found, findImport returns ("", false, nil) | ||||||
| func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgName string, symbols map[string]bool) (*pkg, error) { | func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgName string, symbols map[string]bool) (*pkg, error) { | ||||||
|  | @ -1662,7 +1722,7 @@ func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgNa | ||||||
| 
 | 
 | ||||||
| 				exportsMap := make(map[string]bool, len(exports)) | 				exportsMap := make(map[string]bool, len(exports)) | ||||||
| 				for _, sym := range exports { | 				for _, sym := range exports { | ||||||
| 					exportsMap[sym] = true | 					exportsMap[sym.Name] = true | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				// If it doesn't have the right | 				// If it doesn't have the right | ||||||
|  | @ -1820,10 +1880,13 @@ func (fn visitFn) Visit(node ast.Node) ast.Visitor { | ||||||
| 	return fn(node) | 	return fn(node) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func copyExports(pkg []string) map[string]bool { | func symbolNameSet(symbols []stdlib.Symbol) map[string]bool { | ||||||
| 	m := make(map[string]bool, len(pkg)) | 	names := make(map[string]bool) | ||||||
| 	for _, v := range pkg { | 	for _, sym := range symbols { | ||||||
| 		m[v] = true | 		switch sym.Kind { | ||||||
|  | 		case stdlib.Const, stdlib.Var, stdlib.Type, stdlib.Func: | ||||||
|  | 			names[sym.Name] = true | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	return m | 	return names | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/tools/internal/imports/imports.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/tools/internal/imports/imports.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -2,8 +2,6 @@ | ||||||
| // Use of this source code is governed by a BSD-style | // Use of this source code is governed by a BSD-style | ||||||
| // license that can be found in the LICENSE file. | // license that can be found in the LICENSE file. | ||||||
| 
 | 
 | ||||||
| //go:generate go run mkstdlib.go |  | ||||||
| 
 |  | ||||||
| // Package imports implements a Go pretty-printer (like package "go/format") | // Package imports implements a Go pretty-printer (like package "go/format") | ||||||
| // that also adds or removes import statements as necessary. | // that also adds or removes import statements as necessary. | ||||||
| package imports | package imports | ||||||
|  | @ -109,7 +107,7 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // formatFile formats the file syntax tree. | // formatFile formats the file syntax tree. | ||||||
| // It may mutate the token.FileSet. | // It may mutate the token.FileSet and the ast.File. | ||||||
| // | // | ||||||
| // If an adjust function is provided, it is called after formatting | // If an adjust function is provided, it is called after formatting | ||||||
| // with the original source (formatFile's src parameter) and the | // with the original source (formatFile's src parameter) and the | ||||||
|  |  | ||||||
							
								
								
									
										75
									
								
								vendor/golang.org/x/tools/internal/imports/mod.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								vendor/golang.org/x/tools/internal/imports/mod.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -21,6 +21,7 @@ import ( | ||||||
| 	"golang.org/x/tools/internal/event" | 	"golang.org/x/tools/internal/event" | ||||||
| 	"golang.org/x/tools/internal/gocommand" | 	"golang.org/x/tools/internal/gocommand" | ||||||
| 	"golang.org/x/tools/internal/gopathwalk" | 	"golang.org/x/tools/internal/gopathwalk" | ||||||
|  | 	"golang.org/x/tools/internal/stdlib" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Notes(rfindley): ModuleResolver appears to be heavily optimized for scanning | // Notes(rfindley): ModuleResolver appears to be heavily optimized for scanning | ||||||
|  | @ -111,11 +112,11 @@ func newModuleResolver(e *ProcessEnv, moduleCacheCache *DirInfoCache) (*ModuleRe | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	vendorEnabled := false | 	vendorEnabled := false | ||||||
| 	var mainModVendor *gocommand.ModuleJSON | 	var mainModVendor *gocommand.ModuleJSON    // for module vendoring | ||||||
|  | 	var mainModsVendor []*gocommand.ModuleJSON // for workspace vendoring | ||||||
| 
 | 
 | ||||||
| 	// Module vendor directories are ignored in workspace mode: | 	goWork := r.env.Env["GOWORK"] | ||||||
| 	// https://go.googlesource.com/proposal/+/master/design/45713-workspace.md | 	if len(goWork) == 0 { | ||||||
| 	if len(r.env.Env["GOWORK"]) == 0 { |  | ||||||
| 		// TODO(rfindley): VendorEnabled runs the go command to get GOFLAGS, but | 		// TODO(rfindley): VendorEnabled runs the go command to get GOFLAGS, but | ||||||
| 		// they should be available from the ProcessEnv. Can we avoid the redundant | 		// they should be available from the ProcessEnv. Can we avoid the redundant | ||||||
| 		// invocation? | 		// invocation? | ||||||
|  | @ -123,18 +124,35 @@ func newModuleResolver(e *ProcessEnv, moduleCacheCache *DirInfoCache) (*ModuleRe | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
|  | 	} else { | ||||||
|  | 		vendorEnabled, mainModsVendor, err = gocommand.WorkspaceVendorEnabled(context.Background(), inv, r.env.GocmdRunner) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if mainModVendor != nil && vendorEnabled { | 	if vendorEnabled { | ||||||
| 		// Vendor mode is on, so all the non-Main modules are irrelevant, | 		if mainModVendor != nil { | ||||||
| 		// and we need to search /vendor for everything. | 			// Module vendor mode is on, so all the non-Main modules are irrelevant, | ||||||
| 		r.mains = []*gocommand.ModuleJSON{mainModVendor} | 			// and we need to search /vendor for everything. | ||||||
| 		r.dummyVendorMod = &gocommand.ModuleJSON{ | 			r.mains = []*gocommand.ModuleJSON{mainModVendor} | ||||||
| 			Path: "", | 			r.dummyVendorMod = &gocommand.ModuleJSON{ | ||||||
| 			Dir:  filepath.Join(mainModVendor.Dir, "vendor"), | 				Path: "", | ||||||
|  | 				Dir:  filepath.Join(mainModVendor.Dir, "vendor"), | ||||||
|  | 			} | ||||||
|  | 			r.modsByModPath = []*gocommand.ModuleJSON{mainModVendor, r.dummyVendorMod} | ||||||
|  | 			r.modsByDir = []*gocommand.ModuleJSON{mainModVendor, r.dummyVendorMod} | ||||||
|  | 		} else { | ||||||
|  | 			// Workspace vendor mode is on, so all the non-Main modules are irrelevant, | ||||||
|  | 			// and we need to search /vendor for everything. | ||||||
|  | 			r.mains = mainModsVendor | ||||||
|  | 			r.dummyVendorMod = &gocommand.ModuleJSON{ | ||||||
|  | 				Path: "", | ||||||
|  | 				Dir:  filepath.Join(filepath.Dir(goWork), "vendor"), | ||||||
|  | 			} | ||||||
|  | 			r.modsByModPath = append(append([]*gocommand.ModuleJSON{}, mainModsVendor...), r.dummyVendorMod) | ||||||
|  | 			r.modsByDir = append(append([]*gocommand.ModuleJSON{}, mainModsVendor...), r.dummyVendorMod) | ||||||
| 		} | 		} | ||||||
| 		r.modsByModPath = []*gocommand.ModuleJSON{mainModVendor, r.dummyVendorMod} |  | ||||||
| 		r.modsByDir = []*gocommand.ModuleJSON{mainModVendor, r.dummyVendorMod} |  | ||||||
| 	} else { | 	} else { | ||||||
| 		// Vendor mode is off, so run go list -m ... to find everything. | 		// Vendor mode is off, so run go list -m ... to find everything. | ||||||
| 		err := r.initAllMods() | 		err := r.initAllMods() | ||||||
|  | @ -165,8 +183,9 @@ func newModuleResolver(e *ProcessEnv, moduleCacheCache *DirInfoCache) (*ModuleRe | ||||||
| 		return count(j) < count(i) // descending order | 		return count(j) < count(i) // descending order | ||||||
| 	}) | 	}) | ||||||
| 
 | 
 | ||||||
| 	r.roots = []gopathwalk.Root{ | 	r.roots = []gopathwalk.Root{} | ||||||
| 		{Path: filepath.Join(goenv["GOROOT"], "/src"), Type: gopathwalk.RootGOROOT}, | 	if goenv["GOROOT"] != "" { // "" happens in tests | ||||||
|  | 		r.roots = append(r.roots, gopathwalk.Root{Path: filepath.Join(goenv["GOROOT"], "/src"), Type: gopathwalk.RootGOROOT}) | ||||||
| 	} | 	} | ||||||
| 	r.mainByDir = make(map[string]*gocommand.ModuleJSON) | 	r.mainByDir = make(map[string]*gocommand.ModuleJSON) | ||||||
| 	for _, main := range r.mains { | 	for _, main := range r.mains { | ||||||
|  | @ -313,15 +332,19 @@ func (r *ModuleResolver) ClearForNewScan() Resolver { | ||||||
| // TODO(rfindley): move this to a new env.go, consolidating ProcessEnv methods. | // TODO(rfindley): move this to a new env.go, consolidating ProcessEnv methods. | ||||||
| func (e *ProcessEnv) ClearModuleInfo() { | func (e *ProcessEnv) ClearModuleInfo() { | ||||||
| 	if r, ok := e.resolver.(*ModuleResolver); ok { | 	if r, ok := e.resolver.(*ModuleResolver); ok { | ||||||
| 		resolver, resolverErr := newModuleResolver(e, e.ModCache) | 		resolver, err := newModuleResolver(e, e.ModCache) | ||||||
| 		if resolverErr == nil { | 		if err != nil { | ||||||
| 			<-r.scanSema // acquire (guards caches) | 			e.resolver = nil | ||||||
| 			resolver.moduleCacheCache = r.moduleCacheCache | 			e.resolverErr = err | ||||||
| 			resolver.otherCache = r.otherCache | 			return | ||||||
| 			r.scanSema <- struct{}{} // release |  | ||||||
| 		} | 		} | ||||||
| 		e.resolver = resolver | 
 | ||||||
| 		e.resolverErr = resolverErr | 		<-r.scanSema // acquire (guards caches) | ||||||
|  | 		resolver.moduleCacheCache = r.moduleCacheCache | ||||||
|  | 		resolver.otherCache = r.otherCache | ||||||
|  | 		r.scanSema <- struct{}{} // release | ||||||
|  | 
 | ||||||
|  | 		e.UpdateResolver(resolver) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -412,7 +435,7 @@ func (r *ModuleResolver) cachePackageName(info directoryPackageInfo) (string, er | ||||||
| 	return r.otherCache.CachePackageName(info) | 	return r.otherCache.CachePackageName(info) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *ModuleResolver) cacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []string, error) { | func (r *ModuleResolver) cacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []stdlib.Symbol, error) { | ||||||
| 	if info.rootType == gopathwalk.RootModuleCache { | 	if info.rootType == gopathwalk.RootModuleCache { | ||||||
| 		return r.moduleCacheCache.CacheExports(ctx, env, info) | 		return r.moduleCacheCache.CacheExports(ctx, env, info) | ||||||
| 	} | 	} | ||||||
|  | @ -632,7 +655,7 @@ func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *ModuleResolver) scoreImportPath(ctx context.Context, path string) float64 { | func (r *ModuleResolver) scoreImportPath(ctx context.Context, path string) float64 { | ||||||
| 	if _, ok := stdlib[path]; ok { | 	if stdlib.HasPackage(path) { | ||||||
| 		return MaxRelevance | 		return MaxRelevance | ||||||
| 	} | 	} | ||||||
| 	mod, _ := r.findPackage(path) | 	mod, _ := r.findPackage(path) | ||||||
|  | @ -710,7 +733,7 @@ func (r *ModuleResolver) canonicalize(info directoryPackageInfo) (*pkg, error) { | ||||||
| 	return res, nil | 	return res, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (r *ModuleResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []string, error) { | func (r *ModuleResolver) loadExports(ctx context.Context, pkg *pkg, includeTest bool) (string, []stdlib.Symbol, error) { | ||||||
| 	if info, ok := r.cacheLoad(pkg.dir); ok && !includeTest { | 	if info, ok := r.cacheLoad(pkg.dir); ok && !includeTest { | ||||||
| 		return r.cacheExports(ctx, r.env, info) | 		return r.cacheExports(ctx, r.env, info) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								vendor/golang.org/x/tools/internal/imports/mod_cache.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/golang.org/x/tools/internal/imports/mod_cache.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -14,6 +14,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"golang.org/x/mod/module" | 	"golang.org/x/mod/module" | ||||||
| 	"golang.org/x/tools/internal/gopathwalk" | 	"golang.org/x/tools/internal/gopathwalk" | ||||||
|  | 	"golang.org/x/tools/internal/stdlib" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // To find packages to import, the resolver needs to know about all of | // To find packages to import, the resolver needs to know about all of | ||||||
|  | @ -73,7 +74,7 @@ type directoryPackageInfo struct { | ||||||
| 	// the default build context GOOS and GOARCH. | 	// the default build context GOOS and GOARCH. | ||||||
| 	// | 	// | ||||||
| 	// We can make this explicit, and key exports by GOOS, GOARCH. | 	// We can make this explicit, and key exports by GOOS, GOARCH. | ||||||
| 	exports []string | 	exports []stdlib.Symbol | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // reachedStatus returns true when info has a status at least target and any error associated with | // reachedStatus returns true when info has a status at least target and any error associated with | ||||||
|  | @ -229,7 +230,7 @@ func (d *DirInfoCache) CachePackageName(info directoryPackageInfo) (string, erro | ||||||
| 	return info.packageName, info.err | 	return info.packageName, info.err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *DirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []string, error) { | func (d *DirInfoCache) CacheExports(ctx context.Context, env *ProcessEnv, info directoryPackageInfo) (string, []stdlib.Symbol, error) { | ||||||
| 	if reached, _ := info.reachedStatus(exportsLoaded); reached { | 	if reached, _ := info.reachedStatus(exportsLoaded); reached { | ||||||
| 		return info.packageName, info.exports, info.err | 		return info.packageName, info.exports, info.err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/tools/internal/imports/sortimports.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/tools/internal/imports/sortimports.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -18,7 +18,7 @@ import ( | ||||||
| // sortImports sorts runs of consecutive import lines in import blocks in f. | // sortImports sorts runs of consecutive import lines in import blocks in f. | ||||||
| // It also removes duplicate imports when it is possible to do so without data loss. | // It also removes duplicate imports when it is possible to do so without data loss. | ||||||
| // | // | ||||||
| // It may mutate the token.File. | // It may mutate the token.File and the ast.File. | ||||||
| func sortImports(localPrefix string, tokFile *token.File, f *ast.File) { | func sortImports(localPrefix string, tokFile *token.File, f *ast.File) { | ||||||
| 	for i, d := range f.Decls { | 	for i, d := range f.Decls { | ||||||
| 		d, ok := d.(*ast.GenDecl) | 		d, ok := d.(*ast.GenDecl) | ||||||
|  |  | ||||||
							
								
								
									
										11406
									
								
								vendor/golang.org/x/tools/internal/imports/zstdlib.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11406
									
								
								vendor/golang.org/x/tools/internal/imports/zstdlib.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										4
									
								
								vendor/golang.org/x/tools/internal/pkgbits/decoder.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/tools/internal/pkgbits/decoder.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -23,6 +23,9 @@ type PkgDecoder struct { | ||||||
| 	// version is the file format version. | 	// version is the file format version. | ||||||
| 	version uint32 | 	version uint32 | ||||||
| 
 | 
 | ||||||
|  | 	// aliases determines whether types.Aliases should be created | ||||||
|  | 	aliases bool | ||||||
|  | 
 | ||||||
| 	// sync indicates whether the file uses sync markers. | 	// sync indicates whether the file uses sync markers. | ||||||
| 	sync bool | 	sync bool | ||||||
| 
 | 
 | ||||||
|  | @ -73,6 +76,7 @@ func (pr *PkgDecoder) SyncMarkers() bool { return pr.sync } | ||||||
| func NewPkgDecoder(pkgPath, input string) PkgDecoder { | func NewPkgDecoder(pkgPath, input string) PkgDecoder { | ||||||
| 	pr := PkgDecoder{ | 	pr := PkgDecoder{ | ||||||
| 		pkgPath: pkgPath, | 		pkgPath: pkgPath, | ||||||
|  | 		//aliases: aliases.Enabled(), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// TODO(mdempsky): Implement direct indexing of input string to | 	// TODO(mdempsky): Implement direct indexing of input string to | ||||||
|  |  | ||||||
							
								
								
									
										17320
									
								
								vendor/golang.org/x/tools/internal/stdlib/manifest.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17320
									
								
								vendor/golang.org/x/tools/internal/stdlib/manifest.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										97
									
								
								vendor/golang.org/x/tools/internal/stdlib/stdlib.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								vendor/golang.org/x/tools/internal/stdlib/stdlib.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | ||||||
|  | // Copyright 2022 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:generate go run generate.go | ||||||
|  | 
 | ||||||
|  | // Package stdlib provides a table of all exported symbols in the | ||||||
|  | // standard library, along with the version at which they first | ||||||
|  | // appeared. | ||||||
|  | package stdlib | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Symbol struct { | ||||||
|  | 	Name    string | ||||||
|  | 	Kind    Kind | ||||||
|  | 	Version Version // Go version that first included the symbol | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // A Kind indicates the kind of a symbol: | ||||||
|  | // function, variable, constant, type, and so on. | ||||||
|  | type Kind int8 | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	Invalid Kind = iota // Example name: | ||||||
|  | 	Type                // "Buffer" | ||||||
|  | 	Func                // "Println" | ||||||
|  | 	Var                 // "EOF" | ||||||
|  | 	Const               // "Pi" | ||||||
|  | 	Field               // "Point.X" | ||||||
|  | 	Method              // "(*Buffer).Grow" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func (kind Kind) String() string { | ||||||
|  | 	return [...]string{ | ||||||
|  | 		Invalid: "invalid", | ||||||
|  | 		Type:    "type", | ||||||
|  | 		Func:    "func", | ||||||
|  | 		Var:     "var", | ||||||
|  | 		Const:   "const", | ||||||
|  | 		Field:   "field", | ||||||
|  | 		Method:  "method", | ||||||
|  | 	}[kind] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // A Version represents a version of Go of the form "go1.%d". | ||||||
|  | type Version int8 | ||||||
|  | 
 | ||||||
|  | // String returns a version string of the form "go1.23", without allocating. | ||||||
|  | func (v Version) String() string { return versions[v] } | ||||||
|  | 
 | ||||||
|  | var versions [30]string // (increase constant as needed) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	for i := range versions { | ||||||
|  | 		versions[i] = fmt.Sprintf("go1.%d", i) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // HasPackage reports whether the specified package path is part of | ||||||
|  | // the standard library's public API. | ||||||
|  | func HasPackage(path string) bool { | ||||||
|  | 	_, ok := PackageSymbols[path] | ||||||
|  | 	return ok | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SplitField splits the field symbol name into type and field | ||||||
|  | // components. It must be called only on Field symbols. | ||||||
|  | // | ||||||
|  | // Example: "File.Package" -> ("File", "Package") | ||||||
|  | func (sym *Symbol) SplitField() (typename, name string) { | ||||||
|  | 	if sym.Kind != Field { | ||||||
|  | 		panic("not a field") | ||||||
|  | 	} | ||||||
|  | 	typename, name, _ = strings.Cut(sym.Name, ".") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // SplitMethod splits the method symbol name into pointer, receiver, | ||||||
|  | // and method components. It must be called only on Method symbols. | ||||||
|  | // | ||||||
|  | // Example: "(*Buffer).Grow" -> (true, "Buffer", "Grow") | ||||||
|  | func (sym *Symbol) SplitMethod() (ptr bool, recv, name string) { | ||||||
|  | 	if sym.Kind != Method { | ||||||
|  | 		panic("not a method") | ||||||
|  | 	} | ||||||
|  | 	recv, name, _ = strings.Cut(sym.Name, ".") | ||||||
|  | 	recv = recv[len("(") : len(recv)-len(")")] | ||||||
|  | 	ptr = recv[0] == '*' | ||||||
|  | 	if ptr { | ||||||
|  | 		recv = recv[len("*"):] | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										195
									
								
								vendor/golang.org/x/tools/internal/typeparams/common.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										195
									
								
								vendor/golang.org/x/tools/internal/typeparams/common.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,195 +0,0 @@ | ||||||
| // Copyright 2021 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 typeparams contains common utilities for writing tools that |  | ||||||
| // interact with generic Go code, as introduced with Go 1.18. It |  | ||||||
| // supplements the standard library APIs. Notably, the StructuralTerms |  | ||||||
| // API computes a minimal representation of the structural |  | ||||||
| // restrictions on a type parameter. |  | ||||||
| // |  | ||||||
| // An external version of these APIs is available in the |  | ||||||
| // golang.org/x/exp/typeparams module. |  | ||||||
| package typeparams |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"go/ast" |  | ||||||
| 	"go/token" |  | ||||||
| 	"go/types" |  | ||||||
| 
 |  | ||||||
| 	"golang.org/x/tools/internal/aliases" |  | ||||||
| 	"golang.org/x/tools/internal/typesinternal" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // UnpackIndexExpr extracts data from AST nodes that represent index |  | ||||||
| // expressions. |  | ||||||
| // |  | ||||||
| // For an ast.IndexExpr, the resulting indices slice will contain exactly one |  | ||||||
| // index expression. For an ast.IndexListExpr (go1.18+), it may have a variable |  | ||||||
| // number of index expressions. |  | ||||||
| // |  | ||||||
| // For nodes that don't represent index expressions, the first return value of |  | ||||||
| // UnpackIndexExpr will be nil. |  | ||||||
| func UnpackIndexExpr(n ast.Node) (x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) { |  | ||||||
| 	switch e := n.(type) { |  | ||||||
| 	case *ast.IndexExpr: |  | ||||||
| 		return e.X, e.Lbrack, []ast.Expr{e.Index}, e.Rbrack |  | ||||||
| 	case *ast.IndexListExpr: |  | ||||||
| 		return e.X, e.Lbrack, e.Indices, e.Rbrack |  | ||||||
| 	} |  | ||||||
| 	return nil, token.NoPos, nil, token.NoPos |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // PackIndexExpr returns an *ast.IndexExpr or *ast.IndexListExpr, depending on |  | ||||||
| // the cardinality of indices. Calling PackIndexExpr with len(indices) == 0 |  | ||||||
| // will panic. |  | ||||||
| func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) ast.Expr { |  | ||||||
| 	switch len(indices) { |  | ||||||
| 	case 0: |  | ||||||
| 		panic("empty indices") |  | ||||||
| 	case 1: |  | ||||||
| 		return &ast.IndexExpr{ |  | ||||||
| 			X:      x, |  | ||||||
| 			Lbrack: lbrack, |  | ||||||
| 			Index:  indices[0], |  | ||||||
| 			Rbrack: rbrack, |  | ||||||
| 		} |  | ||||||
| 	default: |  | ||||||
| 		return &ast.IndexListExpr{ |  | ||||||
| 			X:       x, |  | ||||||
| 			Lbrack:  lbrack, |  | ||||||
| 			Indices: indices, |  | ||||||
| 			Rbrack:  rbrack, |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // IsTypeParam reports whether t is a type parameter (or an alias of one). |  | ||||||
| func IsTypeParam(t types.Type) bool { |  | ||||||
| 	_, ok := aliases.Unalias(t).(*types.TypeParam) |  | ||||||
| 	return ok |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // OriginMethod returns the origin method associated with the method fn. |  | ||||||
| // For methods on a non-generic receiver base type, this is just |  | ||||||
| // fn. However, for methods with a generic receiver, OriginMethod returns the |  | ||||||
| // corresponding method in the method set of the origin type. |  | ||||||
| // |  | ||||||
| // As a special case, if fn is not a method (has no receiver), OriginMethod |  | ||||||
| // returns fn. |  | ||||||
| func OriginMethod(fn *types.Func) *types.Func { |  | ||||||
| 	recv := fn.Type().(*types.Signature).Recv() |  | ||||||
| 	if recv == nil { |  | ||||||
| 		return fn |  | ||||||
| 	} |  | ||||||
| 	_, named := typesinternal.ReceiverNamed(recv) |  | ||||||
| 	if named == nil { |  | ||||||
| 		// Receiver is a *types.Interface. |  | ||||||
| 		return fn |  | ||||||
| 	} |  | ||||||
| 	if named.TypeParams().Len() == 0 { |  | ||||||
| 		// Receiver base has no type parameters, so we can avoid the lookup below. |  | ||||||
| 		return fn |  | ||||||
| 	} |  | ||||||
| 	orig := named.Origin() |  | ||||||
| 	gfn, _, _ := types.LookupFieldOrMethod(orig, true, fn.Pkg(), fn.Name()) |  | ||||||
| 
 |  | ||||||
| 	// This is a fix for a gopls crash (#60628) due to a go/types bug (#60634). In: |  | ||||||
| 	// 	package p |  | ||||||
| 	//      type T *int |  | ||||||
| 	//      func (*T) f() {} |  | ||||||
| 	// LookupFieldOrMethod(T, true, p, f)=nil, but NewMethodSet(*T)={(*T).f}. |  | ||||||
| 	// Here we make them consistent by force. |  | ||||||
| 	// (The go/types bug is general, but this workaround is reached only |  | ||||||
| 	// for generic T thanks to the early return above.) |  | ||||||
| 	if gfn == nil { |  | ||||||
| 		mset := types.NewMethodSet(types.NewPointer(orig)) |  | ||||||
| 		for i := 0; i < mset.Len(); i++ { |  | ||||||
| 			m := mset.At(i) |  | ||||||
| 			if m.Obj().Id() == fn.Id() { |  | ||||||
| 				gfn = m.Obj() |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// In golang/go#61196, we observe another crash, this time inexplicable. |  | ||||||
| 	if gfn == nil { |  | ||||||
| 		panic(fmt.Sprintf("missing origin method for %s.%s; named == origin: %t, named.NumMethods(): %d, origin.NumMethods(): %d", named, fn, named == orig, named.NumMethods(), orig.NumMethods())) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return gfn.(*types.Func) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // GenericAssignableTo is a generalization of types.AssignableTo that |  | ||||||
| // implements the following rule for uninstantiated generic types: |  | ||||||
| // |  | ||||||
| // If V and T are generic named types, then V is considered assignable to T if, |  | ||||||
| // for every possible instantation of V[A_1, ..., A_N], the instantiation |  | ||||||
| // T[A_1, ..., A_N] is valid and V[A_1, ..., A_N] implements T[A_1, ..., A_N]. |  | ||||||
| // |  | ||||||
| // If T has structural constraints, they must be satisfied by V. |  | ||||||
| // |  | ||||||
| // For example, consider the following type declarations: |  | ||||||
| // |  | ||||||
| //	type Interface[T any] interface { |  | ||||||
| //		Accept(T) |  | ||||||
| //	} |  | ||||||
| // |  | ||||||
| //	type Container[T any] struct { |  | ||||||
| //		Element T |  | ||||||
| //	} |  | ||||||
| // |  | ||||||
| //	func (c Container[T]) Accept(t T) { c.Element = t } |  | ||||||
| // |  | ||||||
| // In this case, GenericAssignableTo reports that instantiations of Container |  | ||||||
| // are assignable to the corresponding instantiation of Interface. |  | ||||||
| func GenericAssignableTo(ctxt *types.Context, V, T types.Type) bool { |  | ||||||
| 	V = aliases.Unalias(V) |  | ||||||
| 	T = aliases.Unalias(T) |  | ||||||
| 
 |  | ||||||
| 	// If V and T are not both named, or do not have matching non-empty type |  | ||||||
| 	// parameter lists, fall back on types.AssignableTo. |  | ||||||
| 
 |  | ||||||
| 	VN, Vnamed := V.(*types.Named) |  | ||||||
| 	TN, Tnamed := T.(*types.Named) |  | ||||||
| 	if !Vnamed || !Tnamed { |  | ||||||
| 		return types.AssignableTo(V, T) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	vtparams := VN.TypeParams() |  | ||||||
| 	ttparams := TN.TypeParams() |  | ||||||
| 	if vtparams.Len() == 0 || vtparams.Len() != ttparams.Len() || VN.TypeArgs().Len() != 0 || TN.TypeArgs().Len() != 0 { |  | ||||||
| 		return types.AssignableTo(V, T) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// V and T have the same (non-zero) number of type params. Instantiate both |  | ||||||
| 	// with the type parameters of V. This must always succeed for V, and will |  | ||||||
| 	// succeed for T if and only if the type set of each type parameter of V is a |  | ||||||
| 	// subset of the type set of the corresponding type parameter of T, meaning |  | ||||||
| 	// that every instantiation of V corresponds to a valid instantiation of T. |  | ||||||
| 
 |  | ||||||
| 	// Minor optimization: ensure we share a context across the two |  | ||||||
| 	// instantiations below. |  | ||||||
| 	if ctxt == nil { |  | ||||||
| 		ctxt = types.NewContext() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var targs []types.Type |  | ||||||
| 	for i := 0; i < vtparams.Len(); i++ { |  | ||||||
| 		targs = append(targs, vtparams.At(i)) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	vinst, err := types.Instantiate(ctxt, V, targs, true) |  | ||||||
| 	if err != nil { |  | ||||||
| 		panic("type parameters should satisfy their own constraints") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	tinst, err := types.Instantiate(ctxt, T, targs, true) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return types.AssignableTo(vinst, tinst) |  | ||||||
| } |  | ||||||
							
								
								
									
										137
									
								
								vendor/golang.org/x/tools/internal/typeparams/coretype.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										137
									
								
								vendor/golang.org/x/tools/internal/typeparams/coretype.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,137 +0,0 @@ | ||||||
| // Copyright 2022 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 typeparams |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"go/types" |  | ||||||
| 
 |  | ||||||
| 	"golang.org/x/tools/internal/aliases" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // CoreType returns the core type of T or nil if T does not have a core type. |  | ||||||
| // |  | ||||||
| // See https://go.dev/ref/spec#Core_types for the definition of a core type. |  | ||||||
| func CoreType(T types.Type) types.Type { |  | ||||||
| 	U := T.Underlying() |  | ||||||
| 	if _, ok := U.(*types.Interface); !ok { |  | ||||||
| 		return U // for non-interface types, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	terms, err := _NormalTerms(U) |  | ||||||
| 	if len(terms) == 0 || err != nil { |  | ||||||
| 		// len(terms) -> empty type set of interface. |  | ||||||
| 		// err != nil => U is invalid, exceeds complexity bounds, or has an empty type set. |  | ||||||
| 		return nil // no core type. |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	U = terms[0].Type().Underlying() |  | ||||||
| 	var identical int // i in [0,identical) => Identical(U, terms[i].Type().Underlying()) |  | ||||||
| 	for identical = 1; identical < len(terms); identical++ { |  | ||||||
| 		if !types.Identical(U, terms[identical].Type().Underlying()) { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if identical == len(terms) { |  | ||||||
| 		// https://go.dev/ref/spec#Core_types |  | ||||||
| 		// "There is a single type U which is the underlying type of all types in the type set of T" |  | ||||||
| 		return U |  | ||||||
| 	} |  | ||||||
| 	ch, ok := U.(*types.Chan) |  | ||||||
| 	if !ok { |  | ||||||
| 		return nil // no core type as identical < len(terms) and U is not a channel. |  | ||||||
| 	} |  | ||||||
| 	// https://go.dev/ref/spec#Core_types |  | ||||||
| 	// "the type chan E if T contains only bidirectional channels, or the type chan<- E or |  | ||||||
| 	// <-chan E depending on the direction of the directional channels present." |  | ||||||
| 	for chans := identical; chans < len(terms); chans++ { |  | ||||||
| 		curr, ok := terms[chans].Type().Underlying().(*types.Chan) |  | ||||||
| 		if !ok { |  | ||||||
| 			return nil |  | ||||||
| 		} |  | ||||||
| 		if !types.Identical(ch.Elem(), curr.Elem()) { |  | ||||||
| 			return nil // channel elements are not identical. |  | ||||||
| 		} |  | ||||||
| 		if ch.Dir() == types.SendRecv { |  | ||||||
| 			// ch is bidirectional. We can safely always use curr's direction. |  | ||||||
| 			ch = curr |  | ||||||
| 		} else if curr.Dir() != types.SendRecv && ch.Dir() != curr.Dir() { |  | ||||||
| 			// ch and curr are not bidirectional and not the same direction. |  | ||||||
| 			return nil |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return ch |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // _NormalTerms returns a slice of terms representing the normalized structural |  | ||||||
| // type restrictions of a type, if any. |  | ||||||
| // |  | ||||||
| // For all types other than *types.TypeParam, *types.Interface, and |  | ||||||
| // *types.Union, this is just a single term with Tilde() == false and |  | ||||||
| // Type() == typ. For *types.TypeParam, *types.Interface, and *types.Union, see |  | ||||||
| // below. |  | ||||||
| // |  | ||||||
| // Structural type restrictions of a type parameter are created via |  | ||||||
| // non-interface types embedded in its constraint interface (directly, or via a |  | ||||||
| // chain of interface embeddings). For example, in the declaration type |  | ||||||
| // T[P interface{~int; m()}] int the structural restriction of the type |  | ||||||
| // parameter P is ~int. |  | ||||||
| // |  | ||||||
| // With interface embedding and unions, the specification of structural type |  | ||||||
| // restrictions may be arbitrarily complex. For example, consider the |  | ||||||
| // following: |  | ||||||
| // |  | ||||||
| //	type A interface{ ~string|~[]byte } |  | ||||||
| // |  | ||||||
| //	type B interface{ int|string } |  | ||||||
| // |  | ||||||
| //	type C interface { ~string|~int } |  | ||||||
| // |  | ||||||
| //	type T[P interface{ A|B; C }] int |  | ||||||
| // |  | ||||||
| // In this example, the structural type restriction of P is ~string|int: A|B |  | ||||||
| // expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int, |  | ||||||
| // which when intersected with C (~string|~int) yields ~string|int. |  | ||||||
| // |  | ||||||
| // _NormalTerms computes these expansions and reductions, producing a |  | ||||||
| // "normalized" form of the embeddings. A structural restriction is normalized |  | ||||||
| // if it is a single union containing no interface terms, and is minimal in the |  | ||||||
| // sense that removing any term changes the set of types satisfying the |  | ||||||
| // constraint. It is left as a proof for the reader that, modulo sorting, there |  | ||||||
| // is exactly one such normalized form. |  | ||||||
| // |  | ||||||
| // Because the minimal representation always takes this form, _NormalTerms |  | ||||||
| // returns a slice of tilde terms corresponding to the terms of the union in |  | ||||||
| // the normalized structural restriction. An error is returned if the type is |  | ||||||
| // invalid, exceeds complexity bounds, or has an empty type set. In the latter |  | ||||||
| // case, _NormalTerms returns ErrEmptyTypeSet. |  | ||||||
| // |  | ||||||
| // _NormalTerms makes no guarantees about the order of terms, except that it |  | ||||||
| // is deterministic. |  | ||||||
| func _NormalTerms(typ types.Type) ([]*types.Term, error) { |  | ||||||
| 	switch typ := aliases.Unalias(typ).(type) { |  | ||||||
| 	case *types.TypeParam: |  | ||||||
| 		return StructuralTerms(typ) |  | ||||||
| 	case *types.Union: |  | ||||||
| 		return UnionTermSet(typ) |  | ||||||
| 	case *types.Interface: |  | ||||||
| 		return InterfaceTermSet(typ) |  | ||||||
| 	default: |  | ||||||
| 		return []*types.Term{types.NewTerm(false, typ)}, nil |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // MustDeref returns the type of the variable pointed to by t. |  | ||||||
| // It panics if t's core type is not a pointer. |  | ||||||
| // |  | ||||||
| // TODO(adonovan): ideally this would live in typesinternal, but that |  | ||||||
| // creates an import cycle. Move there when we melt this package down. |  | ||||||
| func MustDeref(t types.Type) types.Type { |  | ||||||
| 	if ptr, ok := CoreType(t).(*types.Pointer); ok { |  | ||||||
| 		return ptr.Elem() |  | ||||||
| 	} |  | ||||||
| 	panic(fmt.Sprintf("%v is not a pointer", t)) |  | ||||||
| } |  | ||||||
							
								
								
									
										218
									
								
								vendor/golang.org/x/tools/internal/typeparams/normalize.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										218
									
								
								vendor/golang.org/x/tools/internal/typeparams/normalize.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,218 +0,0 @@ | ||||||
| // Copyright 2021 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 typeparams |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"errors" |  | ||||||
| 	"fmt" |  | ||||||
| 	"go/types" |  | ||||||
| 	"os" |  | ||||||
| 	"strings" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| //go:generate go run copytermlist.go |  | ||||||
| 
 |  | ||||||
| const debug = false |  | ||||||
| 
 |  | ||||||
| var ErrEmptyTypeSet = errors.New("empty type set") |  | ||||||
| 
 |  | ||||||
| // StructuralTerms returns a slice of terms representing the normalized |  | ||||||
| // structural type restrictions of a type parameter, if any. |  | ||||||
| // |  | ||||||
| // Structural type restrictions of a type parameter are created via |  | ||||||
| // non-interface types embedded in its constraint interface (directly, or via a |  | ||||||
| // chain of interface embeddings). For example, in the declaration |  | ||||||
| // |  | ||||||
| //	type T[P interface{~int; m()}] int |  | ||||||
| // |  | ||||||
| // the structural restriction of the type parameter P is ~int. |  | ||||||
| // |  | ||||||
| // With interface embedding and unions, the specification of structural type |  | ||||||
| // restrictions may be arbitrarily complex. For example, consider the |  | ||||||
| // following: |  | ||||||
| // |  | ||||||
| //	type A interface{ ~string|~[]byte } |  | ||||||
| // |  | ||||||
| //	type B interface{ int|string } |  | ||||||
| // |  | ||||||
| //	type C interface { ~string|~int } |  | ||||||
| // |  | ||||||
| //	type T[P interface{ A|B; C }] int |  | ||||||
| // |  | ||||||
| // In this example, the structural type restriction of P is ~string|int: A|B |  | ||||||
| // expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int, |  | ||||||
| // which when intersected with C (~string|~int) yields ~string|int. |  | ||||||
| // |  | ||||||
| // StructuralTerms computes these expansions and reductions, producing a |  | ||||||
| // "normalized" form of the embeddings. A structural restriction is normalized |  | ||||||
| // if it is a single union containing no interface terms, and is minimal in the |  | ||||||
| // sense that removing any term changes the set of types satisfying the |  | ||||||
| // constraint. It is left as a proof for the reader that, modulo sorting, there |  | ||||||
| // is exactly one such normalized form. |  | ||||||
| // |  | ||||||
| // Because the minimal representation always takes this form, StructuralTerms |  | ||||||
| // returns a slice of tilde terms corresponding to the terms of the union in |  | ||||||
| // the normalized structural restriction. An error is returned if the |  | ||||||
| // constraint interface is invalid, exceeds complexity bounds, or has an empty |  | ||||||
| // type set. In the latter case, StructuralTerms returns ErrEmptyTypeSet. |  | ||||||
| // |  | ||||||
| // StructuralTerms makes no guarantees about the order of terms, except that it |  | ||||||
| // is deterministic. |  | ||||||
| func StructuralTerms(tparam *types.TypeParam) ([]*types.Term, error) { |  | ||||||
| 	constraint := tparam.Constraint() |  | ||||||
| 	if constraint == nil { |  | ||||||
| 		return nil, fmt.Errorf("%s has nil constraint", tparam) |  | ||||||
| 	} |  | ||||||
| 	iface, _ := constraint.Underlying().(*types.Interface) |  | ||||||
| 	if iface == nil { |  | ||||||
| 		return nil, fmt.Errorf("constraint is %T, not *types.Interface", constraint.Underlying()) |  | ||||||
| 	} |  | ||||||
| 	return InterfaceTermSet(iface) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // InterfaceTermSet computes the normalized terms for a constraint interface, |  | ||||||
| // returning an error if the term set cannot be computed or is empty. In the |  | ||||||
| // latter case, the error will be ErrEmptyTypeSet. |  | ||||||
| // |  | ||||||
| // See the documentation of StructuralTerms for more information on |  | ||||||
| // normalization. |  | ||||||
| func InterfaceTermSet(iface *types.Interface) ([]*types.Term, error) { |  | ||||||
| 	return computeTermSet(iface) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // UnionTermSet computes the normalized terms for a union, returning an error |  | ||||||
| // if the term set cannot be computed or is empty. In the latter case, the |  | ||||||
| // error will be ErrEmptyTypeSet. |  | ||||||
| // |  | ||||||
| // See the documentation of StructuralTerms for more information on |  | ||||||
| // normalization. |  | ||||||
| func UnionTermSet(union *types.Union) ([]*types.Term, error) { |  | ||||||
| 	return computeTermSet(union) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func computeTermSet(typ types.Type) ([]*types.Term, error) { |  | ||||||
| 	tset, err := computeTermSetInternal(typ, make(map[types.Type]*termSet), 0) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	if tset.terms.isEmpty() { |  | ||||||
| 		return nil, ErrEmptyTypeSet |  | ||||||
| 	} |  | ||||||
| 	if tset.terms.isAll() { |  | ||||||
| 		return nil, nil |  | ||||||
| 	} |  | ||||||
| 	var terms []*types.Term |  | ||||||
| 	for _, term := range tset.terms { |  | ||||||
| 		terms = append(terms, types.NewTerm(term.tilde, term.typ)) |  | ||||||
| 	} |  | ||||||
| 	return terms, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // A termSet holds the normalized set of terms for a given type. |  | ||||||
| // |  | ||||||
| // The name termSet is intentionally distinct from 'type set': a type set is |  | ||||||
| // all types that implement a type (and includes method restrictions), whereas |  | ||||||
| // a term set just represents the structural restrictions on a type. |  | ||||||
| type termSet struct { |  | ||||||
| 	complete bool |  | ||||||
| 	terms    termlist |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func indentf(depth int, format string, args ...interface{}) { |  | ||||||
| 	fmt.Fprintf(os.Stderr, strings.Repeat(".", depth)+format+"\n", args...) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func computeTermSetInternal(t types.Type, seen map[types.Type]*termSet, depth int) (res *termSet, err error) { |  | ||||||
| 	if t == nil { |  | ||||||
| 		panic("nil type") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if debug { |  | ||||||
| 		indentf(depth, "%s", t.String()) |  | ||||||
| 		defer func() { |  | ||||||
| 			if err != nil { |  | ||||||
| 				indentf(depth, "=> %s", err) |  | ||||||
| 			} else { |  | ||||||
| 				indentf(depth, "=> %s", res.terms.String()) |  | ||||||
| 			} |  | ||||||
| 		}() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	const maxTermCount = 100 |  | ||||||
| 	if tset, ok := seen[t]; ok { |  | ||||||
| 		if !tset.complete { |  | ||||||
| 			return nil, fmt.Errorf("cycle detected in the declaration of %s", t) |  | ||||||
| 		} |  | ||||||
| 		return tset, nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Mark the current type as seen to avoid infinite recursion. |  | ||||||
| 	tset := new(termSet) |  | ||||||
| 	defer func() { |  | ||||||
| 		tset.complete = true |  | ||||||
| 	}() |  | ||||||
| 	seen[t] = tset |  | ||||||
| 
 |  | ||||||
| 	switch u := t.Underlying().(type) { |  | ||||||
| 	case *types.Interface: |  | ||||||
| 		// The term set of an interface is the intersection of the term sets of its |  | ||||||
| 		// embedded types. |  | ||||||
| 		tset.terms = allTermlist |  | ||||||
| 		for i := 0; i < u.NumEmbeddeds(); i++ { |  | ||||||
| 			embedded := u.EmbeddedType(i) |  | ||||||
| 			if _, ok := embedded.Underlying().(*types.TypeParam); ok { |  | ||||||
| 				return nil, fmt.Errorf("invalid embedded type %T", embedded) |  | ||||||
| 			} |  | ||||||
| 			tset2, err := computeTermSetInternal(embedded, seen, depth+1) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return nil, err |  | ||||||
| 			} |  | ||||||
| 			tset.terms = tset.terms.intersect(tset2.terms) |  | ||||||
| 		} |  | ||||||
| 	case *types.Union: |  | ||||||
| 		// The term set of a union is the union of term sets of its terms. |  | ||||||
| 		tset.terms = nil |  | ||||||
| 		for i := 0; i < u.Len(); i++ { |  | ||||||
| 			t := u.Term(i) |  | ||||||
| 			var terms termlist |  | ||||||
| 			switch t.Type().Underlying().(type) { |  | ||||||
| 			case *types.Interface: |  | ||||||
| 				tset2, err := computeTermSetInternal(t.Type(), seen, depth+1) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return nil, err |  | ||||||
| 				} |  | ||||||
| 				terms = tset2.terms |  | ||||||
| 			case *types.TypeParam, *types.Union: |  | ||||||
| 				// A stand-alone type parameter or union is not permitted as union |  | ||||||
| 				// term. |  | ||||||
| 				return nil, fmt.Errorf("invalid union term %T", t) |  | ||||||
| 			default: |  | ||||||
| 				if t.Type() == types.Typ[types.Invalid] { |  | ||||||
| 					continue |  | ||||||
| 				} |  | ||||||
| 				terms = termlist{{t.Tilde(), t.Type()}} |  | ||||||
| 			} |  | ||||||
| 			tset.terms = tset.terms.union(terms) |  | ||||||
| 			if len(tset.terms) > maxTermCount { |  | ||||||
| 				return nil, fmt.Errorf("exceeded max term count %d", maxTermCount) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	case *types.TypeParam: |  | ||||||
| 		panic("unreachable") |  | ||||||
| 	default: |  | ||||||
| 		// For all other types, the term set is just a single non-tilde term |  | ||||||
| 		// holding the type itself. |  | ||||||
| 		if u != types.Typ[types.Invalid] { |  | ||||||
| 			tset.terms = termlist{{false, t}} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return tset, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // under is a facade for the go/types internal function of the same name. It is |  | ||||||
| // used by typeterm.go. |  | ||||||
| func under(t types.Type) types.Type { |  | ||||||
| 	return t.Underlying() |  | ||||||
| } |  | ||||||
							
								
								
									
										163
									
								
								vendor/golang.org/x/tools/internal/typeparams/termlist.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										163
									
								
								vendor/golang.org/x/tools/internal/typeparams/termlist.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,163 +0,0 @@ | ||||||
| // Copyright 2021 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. |  | ||||||
| 
 |  | ||||||
| // Code generated by copytermlist.go DO NOT EDIT. |  | ||||||
| 
 |  | ||||||
| package typeparams |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"bytes" |  | ||||||
| 	"go/types" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| // A termlist represents the type set represented by the union |  | ||||||
| // t1 ∪ y2 ∪ ... tn of the type sets of the terms t1 to tn. |  | ||||||
| // A termlist is in normal form if all terms are disjoint. |  | ||||||
| // termlist operations don't require the operands to be in |  | ||||||
| // normal form. |  | ||||||
| type termlist []*term |  | ||||||
| 
 |  | ||||||
| // allTermlist represents the set of all types. |  | ||||||
| // It is in normal form. |  | ||||||
| var allTermlist = termlist{new(term)} |  | ||||||
| 
 |  | ||||||
| // String prints the termlist exactly (without normalization). |  | ||||||
| func (xl termlist) String() string { |  | ||||||
| 	if len(xl) == 0 { |  | ||||||
| 		return "∅" |  | ||||||
| 	} |  | ||||||
| 	var buf bytes.Buffer |  | ||||||
| 	for i, x := range xl { |  | ||||||
| 		if i > 0 { |  | ||||||
| 			buf.WriteString(" | ") |  | ||||||
| 		} |  | ||||||
| 		buf.WriteString(x.String()) |  | ||||||
| 	} |  | ||||||
| 	return buf.String() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // isEmpty reports whether the termlist xl represents the empty set of types. |  | ||||||
| func (xl termlist) isEmpty() bool { |  | ||||||
| 	// If there's a non-nil term, the entire list is not empty. |  | ||||||
| 	// If the termlist is in normal form, this requires at most |  | ||||||
| 	// one iteration. |  | ||||||
| 	for _, x := range xl { |  | ||||||
| 		if x != nil { |  | ||||||
| 			return false |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return true |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // isAll reports whether the termlist xl represents the set of all types. |  | ||||||
| func (xl termlist) isAll() bool { |  | ||||||
| 	// If there's a 𝓤 term, the entire list is 𝓤. |  | ||||||
| 	// If the termlist is in normal form, this requires at most |  | ||||||
| 	// one iteration. |  | ||||||
| 	for _, x := range xl { |  | ||||||
| 		if x != nil && x.typ == nil { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // norm returns the normal form of xl. |  | ||||||
| func (xl termlist) norm() termlist { |  | ||||||
| 	// Quadratic algorithm, but good enough for now. |  | ||||||
| 	// TODO(gri) fix asymptotic performance |  | ||||||
| 	used := make([]bool, len(xl)) |  | ||||||
| 	var rl termlist |  | ||||||
| 	for i, xi := range xl { |  | ||||||
| 		if xi == nil || used[i] { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		for j := i + 1; j < len(xl); j++ { |  | ||||||
| 			xj := xl[j] |  | ||||||
| 			if xj == nil || used[j] { |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 			if u1, u2 := xi.union(xj); u2 == nil { |  | ||||||
| 				// If we encounter a 𝓤 term, the entire list is 𝓤. |  | ||||||
| 				// Exit early. |  | ||||||
| 				// (Note that this is not just an optimization; |  | ||||||
| 				// if we continue, we may end up with a 𝓤 term |  | ||||||
| 				// and other terms and the result would not be |  | ||||||
| 				// in normal form.) |  | ||||||
| 				if u1.typ == nil { |  | ||||||
| 					return allTermlist |  | ||||||
| 				} |  | ||||||
| 				xi = u1 |  | ||||||
| 				used[j] = true // xj is now unioned into xi - ignore it in future iterations |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		rl = append(rl, xi) |  | ||||||
| 	} |  | ||||||
| 	return rl |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // union returns the union xl ∪ yl. |  | ||||||
| func (xl termlist) union(yl termlist) termlist { |  | ||||||
| 	return append(xl, yl...).norm() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // intersect returns the intersection xl ∩ yl. |  | ||||||
| func (xl termlist) intersect(yl termlist) termlist { |  | ||||||
| 	if xl.isEmpty() || yl.isEmpty() { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Quadratic algorithm, but good enough for now. |  | ||||||
| 	// TODO(gri) fix asymptotic performance |  | ||||||
| 	var rl termlist |  | ||||||
| 	for _, x := range xl { |  | ||||||
| 		for _, y := range yl { |  | ||||||
| 			if r := x.intersect(y); r != nil { |  | ||||||
| 				rl = append(rl, r) |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return rl.norm() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // equal reports whether xl and yl represent the same type set. |  | ||||||
| func (xl termlist) equal(yl termlist) bool { |  | ||||||
| 	// TODO(gri) this should be more efficient |  | ||||||
| 	return xl.subsetOf(yl) && yl.subsetOf(xl) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // includes reports whether t ∈ xl. |  | ||||||
| func (xl termlist) includes(t types.Type) bool { |  | ||||||
| 	for _, x := range xl { |  | ||||||
| 		if x.includes(t) { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // supersetOf reports whether y ⊆ xl. |  | ||||||
| func (xl termlist) supersetOf(y *term) bool { |  | ||||||
| 	for _, x := range xl { |  | ||||||
| 		if y.subsetOf(x) { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // subsetOf reports whether xl ⊆ yl. |  | ||||||
| func (xl termlist) subsetOf(yl termlist) bool { |  | ||||||
| 	if yl.isEmpty() { |  | ||||||
| 		return xl.isEmpty() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// each term x of xl must be a subset of yl |  | ||||||
| 	for _, x := range xl { |  | ||||||
| 		if !yl.supersetOf(x) { |  | ||||||
| 			return false // x is not a subset yl |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return true |  | ||||||
| } |  | ||||||
							
								
								
									
										169
									
								
								vendor/golang.org/x/tools/internal/typeparams/typeterm.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										169
									
								
								vendor/golang.org/x/tools/internal/typeparams/typeterm.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,169 +0,0 @@ | ||||||
| // Copyright 2021 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. |  | ||||||
| 
 |  | ||||||
| // Code generated by copytermlist.go DO NOT EDIT. |  | ||||||
| 
 |  | ||||||
| package typeparams |  | ||||||
| 
 |  | ||||||
| import "go/types" |  | ||||||
| 
 |  | ||||||
| // A term describes elementary type sets: |  | ||||||
| // |  | ||||||
| //	 ∅:  (*term)(nil)     == ∅                      // set of no types (empty set) |  | ||||||
| //	 𝓤:  &term{}          == 𝓤                      // set of all types (𝓤niverse) |  | ||||||
| //	 T:  &term{false, T}  == {T}                    // set of type T |  | ||||||
| //	~t:  &term{true, t}   == {t' | under(t') == t}  // set of types with underlying type t |  | ||||||
| type term struct { |  | ||||||
| 	tilde bool // valid if typ != nil |  | ||||||
| 	typ   types.Type |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (x *term) String() string { |  | ||||||
| 	switch { |  | ||||||
| 	case x == nil: |  | ||||||
| 		return "∅" |  | ||||||
| 	case x.typ == nil: |  | ||||||
| 		return "𝓤" |  | ||||||
| 	case x.tilde: |  | ||||||
| 		return "~" + x.typ.String() |  | ||||||
| 	default: |  | ||||||
| 		return x.typ.String() |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // equal reports whether x and y represent the same type set. |  | ||||||
| func (x *term) equal(y *term) bool { |  | ||||||
| 	// easy cases |  | ||||||
| 	switch { |  | ||||||
| 	case x == nil || y == nil: |  | ||||||
| 		return x == y |  | ||||||
| 	case x.typ == nil || y.typ == nil: |  | ||||||
| 		return x.typ == y.typ |  | ||||||
| 	} |  | ||||||
| 	// ∅ ⊂ x, y ⊂ 𝓤 |  | ||||||
| 
 |  | ||||||
| 	return x.tilde == y.tilde && types.Identical(x.typ, y.typ) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // union returns the union x ∪ y: zero, one, or two non-nil terms. |  | ||||||
| func (x *term) union(y *term) (_, _ *term) { |  | ||||||
| 	// easy cases |  | ||||||
| 	switch { |  | ||||||
| 	case x == nil && y == nil: |  | ||||||
| 		return nil, nil // ∅ ∪ ∅ == ∅ |  | ||||||
| 	case x == nil: |  | ||||||
| 		return y, nil // ∅ ∪ y == y |  | ||||||
| 	case y == nil: |  | ||||||
| 		return x, nil // x ∪ ∅ == x |  | ||||||
| 	case x.typ == nil: |  | ||||||
| 		return x, nil // 𝓤 ∪ y == 𝓤 |  | ||||||
| 	case y.typ == nil: |  | ||||||
| 		return y, nil // x ∪ 𝓤 == 𝓤 |  | ||||||
| 	} |  | ||||||
| 	// ∅ ⊂ x, y ⊂ 𝓤 |  | ||||||
| 
 |  | ||||||
| 	if x.disjoint(y) { |  | ||||||
| 		return x, y // x ∪ y == (x, y) if x ∩ y == ∅ |  | ||||||
| 	} |  | ||||||
| 	// x.typ == y.typ |  | ||||||
| 
 |  | ||||||
| 	// ~t ∪ ~t == ~t |  | ||||||
| 	// ~t ∪  T == ~t |  | ||||||
| 	//  T ∪ ~t == ~t |  | ||||||
| 	//  T ∪  T ==  T |  | ||||||
| 	if x.tilde || !y.tilde { |  | ||||||
| 		return x, nil |  | ||||||
| 	} |  | ||||||
| 	return y, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // intersect returns the intersection x ∩ y. |  | ||||||
| func (x *term) intersect(y *term) *term { |  | ||||||
| 	// easy cases |  | ||||||
| 	switch { |  | ||||||
| 	case x == nil || y == nil: |  | ||||||
| 		return nil // ∅ ∩ y == ∅ and ∩ ∅ == ∅ |  | ||||||
| 	case x.typ == nil: |  | ||||||
| 		return y // 𝓤 ∩ y == y |  | ||||||
| 	case y.typ == nil: |  | ||||||
| 		return x // x ∩ 𝓤 == x |  | ||||||
| 	} |  | ||||||
| 	// ∅ ⊂ x, y ⊂ 𝓤 |  | ||||||
| 
 |  | ||||||
| 	if x.disjoint(y) { |  | ||||||
| 		return nil // x ∩ y == ∅ if x ∩ y == ∅ |  | ||||||
| 	} |  | ||||||
| 	// x.typ == y.typ |  | ||||||
| 
 |  | ||||||
| 	// ~t ∩ ~t == ~t |  | ||||||
| 	// ~t ∩  T ==  T |  | ||||||
| 	//  T ∩ ~t ==  T |  | ||||||
| 	//  T ∩  T ==  T |  | ||||||
| 	if !x.tilde || y.tilde { |  | ||||||
| 		return x |  | ||||||
| 	} |  | ||||||
| 	return y |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // includes reports whether t ∈ x. |  | ||||||
| func (x *term) includes(t types.Type) bool { |  | ||||||
| 	// easy cases |  | ||||||
| 	switch { |  | ||||||
| 	case x == nil: |  | ||||||
| 		return false // t ∈ ∅ == false |  | ||||||
| 	case x.typ == nil: |  | ||||||
| 		return true // t ∈ 𝓤 == true |  | ||||||
| 	} |  | ||||||
| 	// ∅ ⊂ x ⊂ 𝓤 |  | ||||||
| 
 |  | ||||||
| 	u := t |  | ||||||
| 	if x.tilde { |  | ||||||
| 		u = under(u) |  | ||||||
| 	} |  | ||||||
| 	return types.Identical(x.typ, u) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // subsetOf reports whether x ⊆ y. |  | ||||||
| func (x *term) subsetOf(y *term) bool { |  | ||||||
| 	// easy cases |  | ||||||
| 	switch { |  | ||||||
| 	case x == nil: |  | ||||||
| 		return true // ∅ ⊆ y == true |  | ||||||
| 	case y == nil: |  | ||||||
| 		return false // x ⊆ ∅ == false since x != ∅ |  | ||||||
| 	case y.typ == nil: |  | ||||||
| 		return true // x ⊆ 𝓤 == true |  | ||||||
| 	case x.typ == nil: |  | ||||||
| 		return false // 𝓤 ⊆ y == false since y != 𝓤 |  | ||||||
| 	} |  | ||||||
| 	// ∅ ⊂ x, y ⊂ 𝓤 |  | ||||||
| 
 |  | ||||||
| 	if x.disjoint(y) { |  | ||||||
| 		return false // x ⊆ y == false if x ∩ y == ∅ |  | ||||||
| 	} |  | ||||||
| 	// x.typ == y.typ |  | ||||||
| 
 |  | ||||||
| 	// ~t ⊆ ~t == true |  | ||||||
| 	// ~t ⊆ T == false |  | ||||||
| 	//  T ⊆ ~t == true |  | ||||||
| 	//  T ⊆  T == true |  | ||||||
| 	return !x.tilde || y.tilde |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // disjoint reports whether x ∩ y == ∅. |  | ||||||
| // x.typ and y.typ must not be nil. |  | ||||||
| func (x *term) disjoint(y *term) bool { |  | ||||||
| 	if debug && (x.typ == nil || y.typ == nil) { |  | ||||||
| 		panic("invalid argument(s)") |  | ||||||
| 	} |  | ||||||
| 	ux := x.typ |  | ||||||
| 	if y.tilde { |  | ||||||
| 		ux = under(ux) |  | ||||||
| 	} |  | ||||||
| 	uy := y.typ |  | ||||||
| 	if x.tilde { |  | ||||||
| 		uy = under(uy) |  | ||||||
| 	} |  | ||||||
| 	return !types.Identical(ux, uy) |  | ||||||
| } |  | ||||||
							
								
								
									
										6
									
								
								vendor/golang.org/x/tools/internal/typesinternal/errorcode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/golang.org/x/tools/internal/typesinternal/errorcode.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -167,7 +167,7 @@ const ( | ||||||
| 	UntypedNilUse | 	UntypedNilUse | ||||||
| 
 | 
 | ||||||
| 	// WrongAssignCount occurs when the number of values on the right-hand side | 	// WrongAssignCount occurs when the number of values on the right-hand side | ||||||
| 	// of an assignment or or initialization expression does not match the number | 	// of an assignment or initialization expression does not match the number | ||||||
| 	// of variables on the left-hand side. | 	// of variables on the left-hand side. | ||||||
| 	// | 	// | ||||||
| 	// Example: | 	// Example: | ||||||
|  | @ -1449,10 +1449,10 @@ const ( | ||||||
| 	NotAGenericType | 	NotAGenericType | ||||||
| 
 | 
 | ||||||
| 	// WrongTypeArgCount occurs when a type or function is instantiated with an | 	// WrongTypeArgCount occurs when a type or function is instantiated with an | ||||||
| 	// incorrent number of type arguments, including when a generic type or | 	// incorrect number of type arguments, including when a generic type or | ||||||
| 	// function is used without instantiation. | 	// function is used without instantiation. | ||||||
| 	// | 	// | ||||||
| 	// Errors inolving failed type inference are assigned other error codes. | 	// Errors involving failed type inference are assigned other error codes. | ||||||
| 	// | 	// | ||||||
| 	// Example: | 	// Example: | ||||||
| 	//  type T[p any] int | 	//  type T[p any] int | ||||||
|  |  | ||||||
							
								
								
									
										89
									
								
								vendor/golang.org/x/tools/internal/typesinternal/toonew.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								vendor/golang.org/x/tools/internal/typesinternal/toonew.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | ||||||
|  | // Copyright 2024 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 typesinternal | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"go/types" | ||||||
|  | 
 | ||||||
|  | 	"golang.org/x/tools/internal/stdlib" | ||||||
|  | 	"golang.org/x/tools/internal/versions" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // TooNewStdSymbols computes the set of package-level symbols | ||||||
|  | // exported by pkg that are not available at the specified version. | ||||||
|  | // The result maps each symbol to its minimum version. | ||||||
|  | // | ||||||
|  | // The pkg is allowed to contain type errors. | ||||||
|  | func TooNewStdSymbols(pkg *types.Package, version string) map[types.Object]string { | ||||||
|  | 	disallowed := make(map[types.Object]string) | ||||||
|  | 
 | ||||||
|  | 	// Pass 1: package-level symbols. | ||||||
|  | 	symbols := stdlib.PackageSymbols[pkg.Path()] | ||||||
|  | 	for _, sym := range symbols { | ||||||
|  | 		symver := sym.Version.String() | ||||||
|  | 		if versions.Before(version, symver) { | ||||||
|  | 			switch sym.Kind { | ||||||
|  | 			case stdlib.Func, stdlib.Var, stdlib.Const, stdlib.Type: | ||||||
|  | 				disallowed[pkg.Scope().Lookup(sym.Name)] = symver | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Pass 2: fields and methods. | ||||||
|  | 	// | ||||||
|  | 	// We allow fields and methods if their associated type is | ||||||
|  | 	// disallowed, as otherwise we would report false positives | ||||||
|  | 	// for compatibility shims. Consider: | ||||||
|  | 	// | ||||||
|  | 	//   //go:build go1.22 | ||||||
|  | 	//   type T struct { F std.Real } // correct new API | ||||||
|  | 	// | ||||||
|  | 	//   //go:build !go1.22 | ||||||
|  | 	//   type T struct { F fake } // shim | ||||||
|  | 	//   type fake struct { ... } | ||||||
|  | 	//   func (fake) M () {} | ||||||
|  | 	// | ||||||
|  | 	// These alternative declarations of T use either the std.Real | ||||||
|  | 	// type, introduced in go1.22, or a fake type, for the field | ||||||
|  | 	// F. (The fakery could be arbitrarily deep, involving more | ||||||
|  | 	// nested fields and methods than are shown here.) Clients | ||||||
|  | 	// that use the compatibility shim T will compile with any | ||||||
|  | 	// version of go, whether older or newer than go1.22, but only | ||||||
|  | 	// the newer version will use the std.Real implementation. | ||||||
|  | 	// | ||||||
|  | 	// Now consider a reference to method M in new(T).F.M() in a | ||||||
|  | 	// module that requires a minimum of go1.21. The analysis may | ||||||
|  | 	// occur using a version of Go higher than 1.21, selecting the | ||||||
|  | 	// first version of T, so the method M is Real.M. This would | ||||||
|  | 	// spuriously cause the analyzer to report a reference to a | ||||||
|  | 	// too-new symbol even though this expression compiles just | ||||||
|  | 	// fine (with the fake implementation) using go1.21. | ||||||
|  | 	for _, sym := range symbols { | ||||||
|  | 		symVersion := sym.Version.String() | ||||||
|  | 		if !versions.Before(version, symVersion) { | ||||||
|  | 			continue // allowed | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		var obj types.Object | ||||||
|  | 		switch sym.Kind { | ||||||
|  | 		case stdlib.Field: | ||||||
|  | 			typename, name := sym.SplitField() | ||||||
|  | 			if t := pkg.Scope().Lookup(typename); t != nil && disallowed[t] == "" { | ||||||
|  | 				obj, _, _ = types.LookupFieldOrMethod(t.Type(), false, pkg, name) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		case stdlib.Method: | ||||||
|  | 			ptr, recvname, name := sym.SplitMethod() | ||||||
|  | 			if t := pkg.Scope().Lookup(recvname); t != nil && disallowed[t] == "" { | ||||||
|  | 				obj, _, _ = types.LookupFieldOrMethod(t.Type(), ptr, pkg, name) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if obj != nil { | ||||||
|  | 			disallowed[obj] = symVersion | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return disallowed | ||||||
|  | } | ||||||
							
								
								
									
										2
									
								
								vendor/golang.org/x/tools/internal/typesinternal/types.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/golang.org/x/tools/internal/typesinternal/types.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -48,5 +48,3 @@ func ReadGo116ErrorData(err types.Error) (code ErrorCode, start, end token.Pos, | ||||||
| 	} | 	} | ||||||
| 	return ErrorCode(data[0]), token.Pos(data[1]), token.Pos(data[2]), true | 	return ErrorCode(data[0]), token.Pos(data[1]), token.Pos(data[2]), true | ||||||
| } | } | ||||||
| 
 |  | ||||||
| var SetGoVersion = func(conf *types.Config, version string) bool { return false } |  | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								vendor/golang.org/x/tools/internal/typesinternal/types_118.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/golang.org/x/tools/internal/typesinternal/types_118.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,16 +0,0 @@ | ||||||
| // Copyright 2021 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 typesinternal |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"go/types" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	SetGoVersion = func(conf *types.Config, version string) bool { |  | ||||||
| 		conf.GoVersion = version |  | ||||||
| 		return true |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
							
								
								
									
										160
									
								
								vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,160 @@ | ||||||
|  | // Copyright 2022 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 protodelim marshals and unmarshals varint size-delimited messages. | ||||||
|  | package protodelim | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"encoding/binary" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 
 | ||||||
|  | 	"google.golang.org/protobuf/encoding/protowire" | ||||||
|  | 	"google.golang.org/protobuf/internal/errors" | ||||||
|  | 	"google.golang.org/protobuf/proto" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // MarshalOptions is a configurable varint size-delimited marshaler. | ||||||
|  | type MarshalOptions struct{ proto.MarshalOptions } | ||||||
|  | 
 | ||||||
|  | // MarshalTo writes a varint size-delimited wire-format message to w. | ||||||
|  | // If w returns an error, MarshalTo returns it unchanged. | ||||||
|  | func (o MarshalOptions) MarshalTo(w io.Writer, m proto.Message) (int, error) { | ||||||
|  | 	msgBytes, err := o.MarshalOptions.Marshal(m) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return 0, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sizeBytes := protowire.AppendVarint(nil, uint64(len(msgBytes))) | ||||||
|  | 	sizeWritten, err := w.Write(sizeBytes) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return sizeWritten, err | ||||||
|  | 	} | ||||||
|  | 	msgWritten, err := w.Write(msgBytes) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return sizeWritten + msgWritten, err | ||||||
|  | 	} | ||||||
|  | 	return sizeWritten + msgWritten, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // MarshalTo writes a varint size-delimited wire-format message to w | ||||||
|  | // with the default options. | ||||||
|  | // | ||||||
|  | // See the documentation for [MarshalOptions.MarshalTo]. | ||||||
|  | func MarshalTo(w io.Writer, m proto.Message) (int, error) { | ||||||
|  | 	return MarshalOptions{}.MarshalTo(w, m) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalOptions is a configurable varint size-delimited unmarshaler. | ||||||
|  | type UnmarshalOptions struct { | ||||||
|  | 	proto.UnmarshalOptions | ||||||
|  | 
 | ||||||
|  | 	// MaxSize is the maximum size in wire-format bytes of a single message. | ||||||
|  | 	// Unmarshaling a message larger than MaxSize will return an error. | ||||||
|  | 	// A zero MaxSize will default to 4 MiB. | ||||||
|  | 	// Setting MaxSize to -1 disables the limit. | ||||||
|  | 	MaxSize int64 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const defaultMaxSize = 4 << 20 // 4 MiB, corresponds to the default gRPC max request/response size | ||||||
|  | 
 | ||||||
|  | // SizeTooLargeError is an error that is returned when the unmarshaler encounters a message size | ||||||
|  | // that is larger than its configured [UnmarshalOptions.MaxSize]. | ||||||
|  | type SizeTooLargeError struct { | ||||||
|  | 	// Size is the varint size of the message encountered | ||||||
|  | 	// that was larger than the provided MaxSize. | ||||||
|  | 	Size uint64 | ||||||
|  | 
 | ||||||
|  | 	// MaxSize is the MaxSize limit configured in UnmarshalOptions, which Size exceeded. | ||||||
|  | 	MaxSize uint64 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (e *SizeTooLargeError) Error() string { | ||||||
|  | 	return fmt.Sprintf("message size %d exceeded unmarshaler's maximum configured size %d", e.Size, e.MaxSize) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Reader is the interface expected by [UnmarshalFrom]. | ||||||
|  | // It is implemented by *[bufio.Reader]. | ||||||
|  | type Reader interface { | ||||||
|  | 	io.Reader | ||||||
|  | 	io.ByteReader | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalFrom parses and consumes a varint size-delimited wire-format message | ||||||
|  | // from r. | ||||||
|  | // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||||
|  | // | ||||||
|  | // The error is [io.EOF] error only if no bytes are read. | ||||||
|  | // If an EOF happens after reading some but not all the bytes, | ||||||
|  | // UnmarshalFrom returns a non-io.EOF error. | ||||||
|  | // In particular if r returns a non-io.EOF error, UnmarshalFrom returns it unchanged, | ||||||
|  | // and if only a size is read with no subsequent message, [io.ErrUnexpectedEOF] is returned. | ||||||
|  | func (o UnmarshalOptions) UnmarshalFrom(r Reader, m proto.Message) error { | ||||||
|  | 	var sizeArr [binary.MaxVarintLen64]byte | ||||||
|  | 	sizeBuf := sizeArr[:0] | ||||||
|  | 	for i := range sizeArr { | ||||||
|  | 		b, err := r.ReadByte() | ||||||
|  | 		if err != nil { | ||||||
|  | 			// Immediate EOF is unexpected. | ||||||
|  | 			if err == io.EOF && i != 0 { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		sizeBuf = append(sizeBuf, b) | ||||||
|  | 		if b < 0x80 { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	size, n := protowire.ConsumeVarint(sizeBuf) | ||||||
|  | 	if n < 0 { | ||||||
|  | 		return protowire.ParseError(n) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	maxSize := o.MaxSize | ||||||
|  | 	if maxSize == 0 { | ||||||
|  | 		maxSize = defaultMaxSize | ||||||
|  | 	} | ||||||
|  | 	if maxSize != -1 && size > uint64(maxSize) { | ||||||
|  | 		return errors.Wrap(&SizeTooLargeError{Size: size, MaxSize: uint64(maxSize)}, "") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var b []byte | ||||||
|  | 	var err error | ||||||
|  | 	if br, ok := r.(*bufio.Reader); ok { | ||||||
|  | 		// Use the []byte from the bufio.Reader instead of having to allocate one. | ||||||
|  | 		// This reduces CPU usage and allocated bytes. | ||||||
|  | 		b, err = br.Peek(int(size)) | ||||||
|  | 		if err == nil { | ||||||
|  | 			defer br.Discard(int(size)) | ||||||
|  | 		} else { | ||||||
|  | 			b = nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if b == nil { | ||||||
|  | 		b = make([]byte, size) | ||||||
|  | 		_, err = io.ReadFull(r, b) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err == io.EOF { | ||||||
|  | 		return io.ErrUnexpectedEOF | ||||||
|  | 	} | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if err := o.Unmarshal(b, m); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // UnmarshalFrom parses and consumes a varint size-delimited wire-format message | ||||||
|  | // from r with the default options. | ||||||
|  | // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||||
|  | // | ||||||
|  | // See the documentation for [UnmarshalOptions.UnmarshalFrom]. | ||||||
|  | func UnmarshalFrom(r Reader, m proto.Message) error { | ||||||
|  | 	return UnmarshalOptions{}.UnmarshalFrom(r, m) | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb
									
										
									
										generated
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										11
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -8,6 +8,7 @@ package filedesc | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 
 | 
 | ||||||
| 	"google.golang.org/protobuf/internal/descfmt" | 	"google.golang.org/protobuf/internal/descfmt" | ||||||
|  | @ -198,6 +199,16 @@ func (p *Fields) lazyInit() *Fields { | ||||||
| 				if _, ok := p.byText[d.TextName()]; !ok { | 				if _, ok := p.byText[d.TextName()]; !ok { | ||||||
| 					p.byText[d.TextName()] = d | 					p.byText[d.TextName()] = d | ||||||
| 				} | 				} | ||||||
|  | 				if isGroupLike(d) { | ||||||
|  | 					lowerJSONName := strings.ToLower(d.JSONName()) | ||||||
|  | 					if _, ok := p.byJSON[lowerJSONName]; !ok { | ||||||
|  | 						p.byJSON[lowerJSONName] = d | ||||||
|  | 					} | ||||||
|  | 					lowerTextName := strings.ToLower(d.TextName()) | ||||||
|  | 					if _, ok := p.byText[lowerTextName]; !ok { | ||||||
|  | 						p.byText[lowerTextName] = d | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
| 				if _, ok := p.byNum[d.Number()]; !ok { | 				if _, ok := p.byNum[d.Number()]; !ok { | ||||||
| 					p.byNum[d.Number()] = d | 					p.byNum[d.Number()] = d | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/editions.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/google.golang.org/protobuf/internal/filedesc/editions.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -108,7 +108,9 @@ func unmarshalEditionDefault(b []byte) { | ||||||
| 			v, m := protowire.ConsumeBytes(b) | 			v, m := protowire.ConsumeBytes(b) | ||||||
| 			b = b[m:] | 			b = b[m:] | ||||||
| 			switch num { | 			switch num { | ||||||
| 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_Features_field_number: | 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_number: | ||||||
|  | 				fs = unmarshalFeatureSet(v, fs) | ||||||
|  | 			case genid.FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_number: | ||||||
| 				fs = unmarshalFeatureSet(v, fs) | 				fs = unmarshalFeatureSet(v, fs) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
							
								
								
									
										46
									
								
								vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -21,6 +21,7 @@ const ( | ||||||
| // Enum values for google.protobuf.Edition. | // Enum values for google.protobuf.Edition. | ||||||
| const ( | const ( | ||||||
| 	Edition_EDITION_UNKNOWN_enum_value         = 0 | 	Edition_EDITION_UNKNOWN_enum_value         = 0 | ||||||
|  | 	Edition_EDITION_LEGACY_enum_value          = 900 | ||||||
| 	Edition_EDITION_PROTO2_enum_value          = 998 | 	Edition_EDITION_PROTO2_enum_value          = 998 | ||||||
| 	Edition_EDITION_PROTO3_enum_value          = 999 | 	Edition_EDITION_PROTO3_enum_value          = 999 | ||||||
| 	Edition_EDITION_2023_enum_value            = 1000 | 	Edition_EDITION_2023_enum_value            = 1000 | ||||||
|  | @ -653,6 +654,7 @@ const ( | ||||||
| 	FieldOptions_Targets_field_name             protoreflect.Name = "targets" | 	FieldOptions_Targets_field_name             protoreflect.Name = "targets" | ||||||
| 	FieldOptions_EditionDefaults_field_name     protoreflect.Name = "edition_defaults" | 	FieldOptions_EditionDefaults_field_name     protoreflect.Name = "edition_defaults" | ||||||
| 	FieldOptions_Features_field_name            protoreflect.Name = "features" | 	FieldOptions_Features_field_name            protoreflect.Name = "features" | ||||||
|  | 	FieldOptions_FeatureSupport_field_name      protoreflect.Name = "feature_support" | ||||||
| 	FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | 	FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" | ||||||
| 
 | 
 | ||||||
| 	FieldOptions_Ctype_field_fullname               protoreflect.FullName = "google.protobuf.FieldOptions.ctype" | 	FieldOptions_Ctype_field_fullname               protoreflect.FullName = "google.protobuf.FieldOptions.ctype" | ||||||
|  | @ -667,6 +669,7 @@ const ( | ||||||
| 	FieldOptions_Targets_field_fullname             protoreflect.FullName = "google.protobuf.FieldOptions.targets" | 	FieldOptions_Targets_field_fullname             protoreflect.FullName = "google.protobuf.FieldOptions.targets" | ||||||
| 	FieldOptions_EditionDefaults_field_fullname     protoreflect.FullName = "google.protobuf.FieldOptions.edition_defaults" | 	FieldOptions_EditionDefaults_field_fullname     protoreflect.FullName = "google.protobuf.FieldOptions.edition_defaults" | ||||||
| 	FieldOptions_Features_field_fullname            protoreflect.FullName = "google.protobuf.FieldOptions.features" | 	FieldOptions_Features_field_fullname            protoreflect.FullName = "google.protobuf.FieldOptions.features" | ||||||
|  | 	FieldOptions_FeatureSupport_field_fullname      protoreflect.FullName = "google.protobuf.FieldOptions.feature_support" | ||||||
| 	FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" | 	FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -684,6 +687,7 @@ const ( | ||||||
| 	FieldOptions_Targets_field_number             protoreflect.FieldNumber = 19 | 	FieldOptions_Targets_field_number             protoreflect.FieldNumber = 19 | ||||||
| 	FieldOptions_EditionDefaults_field_number     protoreflect.FieldNumber = 20 | 	FieldOptions_EditionDefaults_field_number     protoreflect.FieldNumber = 20 | ||||||
| 	FieldOptions_Features_field_number            protoreflect.FieldNumber = 21 | 	FieldOptions_Features_field_number            protoreflect.FieldNumber = 21 | ||||||
|  | 	FieldOptions_FeatureSupport_field_number      protoreflect.FieldNumber = 22 | ||||||
| 	FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | 	FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -767,6 +771,33 @@ const ( | ||||||
| 	FieldOptions_EditionDefault_Value_field_number   protoreflect.FieldNumber = 2 | 	FieldOptions_EditionDefault_Value_field_number   protoreflect.FieldNumber = 2 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // Names for google.protobuf.FieldOptions.FeatureSupport. | ||||||
|  | const ( | ||||||
|  | 	FieldOptions_FeatureSupport_message_name     protoreflect.Name     = "FeatureSupport" | ||||||
|  | 	FieldOptions_FeatureSupport_message_fullname protoreflect.FullName = "google.protobuf.FieldOptions.FeatureSupport" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Field names for google.protobuf.FieldOptions.FeatureSupport. | ||||||
|  | const ( | ||||||
|  | 	FieldOptions_FeatureSupport_EditionIntroduced_field_name  protoreflect.Name = "edition_introduced" | ||||||
|  | 	FieldOptions_FeatureSupport_EditionDeprecated_field_name  protoreflect.Name = "edition_deprecated" | ||||||
|  | 	FieldOptions_FeatureSupport_DeprecationWarning_field_name protoreflect.Name = "deprecation_warning" | ||||||
|  | 	FieldOptions_FeatureSupport_EditionRemoved_field_name     protoreflect.Name = "edition_removed" | ||||||
|  | 
 | ||||||
|  | 	FieldOptions_FeatureSupport_EditionIntroduced_field_fullname  protoreflect.FullName = "google.protobuf.FieldOptions.FeatureSupport.edition_introduced" | ||||||
|  | 	FieldOptions_FeatureSupport_EditionDeprecated_field_fullname  protoreflect.FullName = "google.protobuf.FieldOptions.FeatureSupport.edition_deprecated" | ||||||
|  | 	FieldOptions_FeatureSupport_DeprecationWarning_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.FeatureSupport.deprecation_warning" | ||||||
|  | 	FieldOptions_FeatureSupport_EditionRemoved_field_fullname     protoreflect.FullName = "google.protobuf.FieldOptions.FeatureSupport.edition_removed" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Field numbers for google.protobuf.FieldOptions.FeatureSupport. | ||||||
|  | const ( | ||||||
|  | 	FieldOptions_FeatureSupport_EditionIntroduced_field_number  protoreflect.FieldNumber = 1 | ||||||
|  | 	FieldOptions_FeatureSupport_EditionDeprecated_field_number  protoreflect.FieldNumber = 2 | ||||||
|  | 	FieldOptions_FeatureSupport_DeprecationWarning_field_number protoreflect.FieldNumber = 3 | ||||||
|  | 	FieldOptions_FeatureSupport_EditionRemoved_field_number     protoreflect.FieldNumber = 4 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // Names for google.protobuf.OneofOptions. | // Names for google.protobuf.OneofOptions. | ||||||
| const ( | const ( | ||||||
| 	OneofOptions_message_name     protoreflect.Name     = "OneofOptions" | 	OneofOptions_message_name     protoreflect.Name     = "OneofOptions" | ||||||
|  | @ -1110,17 +1141,20 @@ const ( | ||||||
| 
 | 
 | ||||||
| // Field names for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. | // Field names for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. | ||||||
| const ( | const ( | ||||||
| 	FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_name  protoreflect.Name = "edition" | 	FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_name             protoreflect.Name = "edition" | ||||||
| 	FeatureSetDefaults_FeatureSetEditionDefault_Features_field_name protoreflect.Name = "features" | 	FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_name protoreflect.Name = "overridable_features" | ||||||
|  | 	FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_name       protoreflect.Name = "fixed_features" | ||||||
| 
 | 
 | ||||||
| 	FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_fullname  protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.edition" | 	FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_fullname             protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.edition" | ||||||
| 	FeatureSetDefaults_FeatureSetEditionDefault_Features_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.features" | 	FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_fullname protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.overridable_features" | ||||||
|  | 	FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_fullname       protoreflect.FullName = "google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault.fixed_features" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Field numbers for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. | // Field numbers for google.protobuf.FeatureSetDefaults.FeatureSetEditionDefault. | ||||||
| const ( | const ( | ||||||
| 	FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number  protoreflect.FieldNumber = 3 | 	FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number             protoreflect.FieldNumber = 3 | ||||||
| 	FeatureSetDefaults_FeatureSetEditionDefault_Features_field_number protoreflect.FieldNumber = 2 | 	FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_number protoreflect.FieldNumber = 4 | ||||||
|  | 	FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_number       protoreflect.FieldNumber = 5 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Names for google.protobuf.SourceCodeInfo. | // Names for google.protobuf.SourceCodeInfo. | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								vendor/google.golang.org/protobuf/internal/version/version.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/google.golang.org/protobuf/internal/version/version.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -52,7 +52,7 @@ import ( | ||||||
| const ( | const ( | ||||||
| 	Major      = 1 | 	Major      = 1 | ||||||
| 	Minor      = 34 | 	Minor      = 34 | ||||||
| 	Patch      = 0 | 	Patch      = 1 | ||||||
| 	PreRelease = "" | 	PreRelease = "" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -373,6 +373,8 @@ func (p *SourcePath) appendFieldOptions(b []byte) []byte { | ||||||
| 		b = p.appendRepeatedField(b, "edition_defaults", (*SourcePath).appendFieldOptions_EditionDefault) | 		b = p.appendRepeatedField(b, "edition_defaults", (*SourcePath).appendFieldOptions_EditionDefault) | ||||||
| 	case 21: | 	case 21: | ||||||
| 		b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) | 		b = p.appendSingularField(b, "features", (*SourcePath).appendFeatureSet) | ||||||
|  | 	case 22: | ||||||
|  | 		b = p.appendSingularField(b, "feature_support", (*SourcePath).appendFieldOptions_FeatureSupport) | ||||||
| 	case 999: | 	case 999: | ||||||
| 		b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) | 		b = p.appendRepeatedField(b, "uninterpreted_option", (*SourcePath).appendUninterpretedOption) | ||||||
| 	} | 	} | ||||||
|  | @ -519,6 +521,23 @@ func (p *SourcePath) appendFieldOptions_EditionDefault(b []byte) []byte { | ||||||
| 	return b | 	return b | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (p *SourcePath) appendFieldOptions_FeatureSupport(b []byte) []byte { | ||||||
|  | 	if len(*p) == 0 { | ||||||
|  | 		return b | ||||||
|  | 	} | ||||||
|  | 	switch (*p)[0] { | ||||||
|  | 	case 1: | ||||||
|  | 		b = p.appendSingularField(b, "edition_introduced", nil) | ||||||
|  | 	case 2: | ||||||
|  | 		b = p.appendSingularField(b, "edition_deprecated", nil) | ||||||
|  | 	case 3: | ||||||
|  | 		b = p.appendSingularField(b, "deprecation_warning", nil) | ||||||
|  | 	case 4: | ||||||
|  | 		b = p.appendSingularField(b, "edition_removed", nil) | ||||||
|  | 	} | ||||||
|  | 	return b | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (p *SourcePath) appendUninterpretedOption_NamePart(b []byte) []byte { | func (p *SourcePath) appendUninterpretedOption_NamePart(b []byte) []byte { | ||||||
| 	if len(*p) == 0 { | 	if len(*p) == 0 { | ||||||
| 		return b | 		return b | ||||||
|  |  | ||||||
							
								
								
									
										35
									
								
								vendor/modules.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/modules.txt
									
										
									
									
										vendored
									
									
								
							|  | @ -74,7 +74,7 @@ codeberg.org/superseriousbusiness/exif-terminator | ||||||
| # github.com/DmitriyVTitov/size v1.5.0 | # github.com/DmitriyVTitov/size v1.5.0 | ||||||
| ## explicit; go 1.14 | ## explicit; go 1.14 | ||||||
| github.com/DmitriyVTitov/size | github.com/DmitriyVTitov/size | ||||||
| # github.com/KimMachineGun/automemlimit v0.6.0 | # github.com/KimMachineGun/automemlimit v0.6.1 | ||||||
| ## explicit; go 1.21 | ## explicit; go 1.21 | ||||||
| github.com/KimMachineGun/automemlimit | github.com/KimMachineGun/automemlimit | ||||||
| github.com/KimMachineGun/automemlimit/memlimit | github.com/KimMachineGun/automemlimit/memlimit | ||||||
|  | @ -233,7 +233,7 @@ github.com/gin-contrib/sessions/memstore | ||||||
| # github.com/gin-contrib/sse v0.1.0 | # github.com/gin-contrib/sse v0.1.0 | ||||||
| ## explicit; go 1.12 | ## explicit; go 1.12 | ||||||
| github.com/gin-contrib/sse | github.com/gin-contrib/sse | ||||||
| # github.com/gin-gonic/gin v1.9.1 | # github.com/gin-gonic/gin v1.10.0 | ||||||
| ## explicit; go 1.20 | ## explicit; go 1.20 | ||||||
| github.com/gin-gonic/gin | github.com/gin-gonic/gin | ||||||
| github.com/gin-gonic/gin/binding | github.com/gin-gonic/gin/binding | ||||||
|  | @ -318,8 +318,8 @@ github.com/go-playground/universal-translator | ||||||
| # github.com/go-playground/validator/v10 v10.20.0 | # github.com/go-playground/validator/v10 v10.20.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| github.com/go-playground/validator/v10 | github.com/go-playground/validator/v10 | ||||||
| # github.com/go-swagger/go-swagger v0.30.6-0.20240418033037-c46c303aaa02 | # github.com/go-swagger/go-swagger v0.31.0 | ||||||
| ## explicit; go 1.20 | ## explicit; go 1.21 | ||||||
| github.com/go-swagger/go-swagger/cmd/swagger | github.com/go-swagger/go-swagger/cmd/swagger | ||||||
| github.com/go-swagger/go-swagger/cmd/swagger/commands | github.com/go-swagger/go-swagger/cmd/swagger/commands | ||||||
| github.com/go-swagger/go-swagger/cmd/swagger/commands/diff | github.com/go-swagger/go-swagger/cmd/swagger/commands/diff | ||||||
|  | @ -484,9 +484,6 @@ github.com/mailru/easyjson/jwriter | ||||||
| # github.com/mattn/go-isatty v0.0.20 | # github.com/mattn/go-isatty v0.0.20 | ||||||
| ## explicit; go 1.15 | ## explicit; go 1.15 | ||||||
| github.com/mattn/go-isatty | github.com/mattn/go-isatty | ||||||
| # github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 |  | ||||||
| ## explicit; go 1.19 |  | ||||||
| github.com/matttproud/golang_protobuf_extensions/v2/pbutil |  | ||||||
| # github.com/microcosm-cc/bluemonday v1.0.26 | # github.com/microcosm-cc/bluemonday v1.0.26 | ||||||
| ## explicit; go 1.21 | ## explicit; go 1.21 | ||||||
| github.com/microcosm-cc/bluemonday | github.com/microcosm-cc/bluemonday | ||||||
|  | @ -550,15 +547,15 @@ github.com/pkg/errors | ||||||
| # github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 | # github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 | ||||||
| ## explicit | ## explicit | ||||||
| github.com/pmezard/go-difflib/difflib | github.com/pmezard/go-difflib/difflib | ||||||
| # github.com/prometheus/client_golang v1.18.0 | # github.com/prometheus/client_golang v1.19.1 | ||||||
| ## explicit; go 1.19 | ## explicit; go 1.20 | ||||||
| github.com/prometheus/client_golang/prometheus | github.com/prometheus/client_golang/prometheus | ||||||
| github.com/prometheus/client_golang/prometheus/internal | github.com/prometheus/client_golang/prometheus/internal | ||||||
| github.com/prometheus/client_golang/prometheus/promhttp | github.com/prometheus/client_golang/prometheus/promhttp | ||||||
| # github.com/prometheus/client_model v0.6.0 | # github.com/prometheus/client_model v0.6.0 | ||||||
| ## explicit; go 1.19 | ## explicit; go 1.19 | ||||||
| github.com/prometheus/client_model/go | github.com/prometheus/client_model/go | ||||||
| # github.com/prometheus/common v0.45.0 | # github.com/prometheus/common v0.48.0 | ||||||
| ## explicit; go 1.20 | ## explicit; go 1.20 | ||||||
| github.com/prometheus/common/expfmt | github.com/prometheus/common/expfmt | ||||||
| github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg | github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg | ||||||
|  | @ -814,11 +811,11 @@ github.com/superseriousbusiness/oauth2/v4/generates | ||||||
| github.com/superseriousbusiness/oauth2/v4/manage | github.com/superseriousbusiness/oauth2/v4/manage | ||||||
| github.com/superseriousbusiness/oauth2/v4/models | github.com/superseriousbusiness/oauth2/v4/models | ||||||
| github.com/superseriousbusiness/oauth2/v4/server | github.com/superseriousbusiness/oauth2/v4/server | ||||||
| # github.com/tdewolff/minify/v2 v2.20.20 | # github.com/tdewolff/minify/v2 v2.20.24 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| github.com/tdewolff/minify/v2 | github.com/tdewolff/minify/v2 | ||||||
| github.com/tdewolff/minify/v2/html | github.com/tdewolff/minify/v2/html | ||||||
| # github.com/tdewolff/parse/v2 v2.7.13 | # github.com/tdewolff/parse/v2 v2.7.14 | ||||||
| ## explicit; go 1.13 | ## explicit; go 1.13 | ||||||
| github.com/tdewolff/parse/v2 | github.com/tdewolff/parse/v2 | ||||||
| github.com/tdewolff/parse/v2/buffer | github.com/tdewolff/parse/v2/buffer | ||||||
|  | @ -1000,7 +997,7 @@ go.uber.org/automaxprocs/maxprocs | ||||||
| # go.uber.org/multierr v1.11.0 | # go.uber.org/multierr v1.11.0 | ||||||
| ## explicit; go 1.19 | ## explicit; go 1.19 | ||||||
| go.uber.org/multierr | go.uber.org/multierr | ||||||
| # golang.org/x/arch v0.7.0 | # golang.org/x/arch v0.8.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/arch/x86/x86asm | golang.org/x/arch/x86/x86asm | ||||||
| # golang.org/x/crypto v0.23.0 | # golang.org/x/crypto v0.23.0 | ||||||
|  | @ -1041,7 +1038,7 @@ golang.org/x/image/tiff/lzw | ||||||
| golang.org/x/image/vp8 | golang.org/x/image/vp8 | ||||||
| golang.org/x/image/vp8l | golang.org/x/image/vp8l | ||||||
| golang.org/x/image/webp | golang.org/x/image/webp | ||||||
| # golang.org/x/mod v0.16.0 | # golang.org/x/mod v0.17.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/mod/internal/lazyregexp | golang.org/x/mod/internal/lazyregexp | ||||||
| golang.org/x/mod/module | golang.org/x/mod/module | ||||||
|  | @ -1070,7 +1067,7 @@ golang.org/x/net/trace | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/oauth2 | golang.org/x/oauth2 | ||||||
| golang.org/x/oauth2/internal | golang.org/x/oauth2/internal | ||||||
| # golang.org/x/sync v0.6.0 | # golang.org/x/sync v0.7.0 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| golang.org/x/sync/errgroup | golang.org/x/sync/errgroup | ||||||
| golang.org/x/sync/semaphore | golang.org/x/sync/semaphore | ||||||
|  | @ -1102,7 +1099,7 @@ golang.org/x/text/transform | ||||||
| golang.org/x/text/unicode/bidi | golang.org/x/text/unicode/bidi | ||||||
| golang.org/x/text/unicode/norm | golang.org/x/text/unicode/norm | ||||||
| golang.org/x/text/width | golang.org/x/text/width | ||||||
| # golang.org/x/tools v0.19.0 | # golang.org/x/tools v0.21.0 | ||||||
| ## explicit; go 1.19 | ## explicit; go 1.19 | ||||||
| golang.org/x/tools/go/ast/astutil | golang.org/x/tools/go/ast/astutil | ||||||
| golang.org/x/tools/go/gcexportdata | golang.org/x/tools/go/gcexportdata | ||||||
|  | @ -1115,15 +1112,14 @@ golang.org/x/tools/internal/event | ||||||
| golang.org/x/tools/internal/event/core | golang.org/x/tools/internal/event/core | ||||||
| golang.org/x/tools/internal/event/keys | golang.org/x/tools/internal/event/keys | ||||||
| golang.org/x/tools/internal/event/label | golang.org/x/tools/internal/event/label | ||||||
| golang.org/x/tools/internal/event/tag |  | ||||||
| golang.org/x/tools/internal/gcimporter | golang.org/x/tools/internal/gcimporter | ||||||
| golang.org/x/tools/internal/gocommand | golang.org/x/tools/internal/gocommand | ||||||
| golang.org/x/tools/internal/gopathwalk | golang.org/x/tools/internal/gopathwalk | ||||||
| golang.org/x/tools/internal/imports | golang.org/x/tools/internal/imports | ||||||
| golang.org/x/tools/internal/packagesinternal | golang.org/x/tools/internal/packagesinternal | ||||||
| golang.org/x/tools/internal/pkgbits | golang.org/x/tools/internal/pkgbits | ||||||
|  | golang.org/x/tools/internal/stdlib | ||||||
| golang.org/x/tools/internal/tokeninternal | golang.org/x/tools/internal/tokeninternal | ||||||
| golang.org/x/tools/internal/typeparams |  | ||||||
| golang.org/x/tools/internal/typesinternal | golang.org/x/tools/internal/typesinternal | ||||||
| golang.org/x/tools/internal/versions | golang.org/x/tools/internal/versions | ||||||
| # google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de | # google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de | ||||||
|  | @ -1188,8 +1184,9 @@ google.golang.org/grpc/serviceconfig | ||||||
| google.golang.org/grpc/stats | google.golang.org/grpc/stats | ||||||
| google.golang.org/grpc/status | google.golang.org/grpc/status | ||||||
| google.golang.org/grpc/tap | google.golang.org/grpc/tap | ||||||
| # google.golang.org/protobuf v1.34.0 | # google.golang.org/protobuf v1.34.1 | ||||||
| ## explicit; go 1.17 | ## explicit; go 1.17 | ||||||
|  | google.golang.org/protobuf/encoding/protodelim | ||||||
| google.golang.org/protobuf/encoding/protojson | google.golang.org/protobuf/encoding/protojson | ||||||
| google.golang.org/protobuf/encoding/prototext | google.golang.org/protobuf/encoding/prototext | ||||||
| google.golang.org/protobuf/encoding/protowire | google.golang.org/protobuf/encoding/protowire | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue