mirror of
				https://github.com/42wim/matterbridge.git
				synced 2025-10-31 05:47:24 +01:00 
			
		
		
		
	Update dependencies and build to go1.22 (#2113)
* Update dependencies and build to go1.22 * Fix api changes wrt to dependencies * Update golangci config
This commit is contained in:
		
							parent
							
								
									56e7bd01ca
								
							
						
					
					
						commit
						2f33fe86f5
					
				
							
								
								
									
										8
									
								
								.github/workflows/development.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/development.yml
									
									
									
									
										vendored
									
									
								
							| @ -16,7 +16,7 @@ jobs: | ||||
|   test-build-upload: | ||||
|     strategy: | ||||
|       matrix: | ||||
|         go-version: [1.20.x] | ||||
|         go-version: [1.22.x] | ||||
|         platform: [ubuntu-latest] | ||||
|     runs-on: ${{ matrix.platform }} | ||||
|     steps: | ||||
| @ -39,19 +39,19 @@ jobs: | ||||
|         CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "-s -X github.com/42wim/matterbridge/version.GitHash=$(git log --pretty=format:'%h' -n 1)" -o output/win/matterbridge-$VERSION-windows-amd64.exe | ||||
|         CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "-s -X github.com/42wim/matterbridge/version.GitHash=$(git log --pretty=format:'%h' -n 1)" -o output/mac/matterbridge-$VERSION-darwin-amd64 | ||||
|     - name: Upload linux 64-bit | ||||
|       if: startsWith(matrix.go-version,'1.20') | ||||
|       if: startsWith(matrix.go-version,'1.22') | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: matterbridge-linux-64bit | ||||
|         path: output/lin | ||||
|     - name: Upload windows 64-bit | ||||
|       if: startsWith(matrix.go-version,'1.20') | ||||
|       if: startsWith(matrix.go-version,'1.22') | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: matterbridge-windows-64bit | ||||
|         path: output/win | ||||
|     - name: Upload darwin 64-bit | ||||
|       if: startsWith(matrix.go-version,'1.20') | ||||
|       if: startsWith(matrix.go-version,'1.22') | ||||
|       uses: actions/upload-artifact@v3 | ||||
|       with: | ||||
|         name: matterbridge-darwin-64bit | ||||
|  | ||||
| @ -212,6 +212,8 @@ linters: | ||||
|     - execinquery | ||||
|     - nosnakecase | ||||
|     - exhaustive | ||||
|     - testifylint | ||||
|     - mnd | ||||
| # rules to deal with reported isues | ||||
| issues: | ||||
|   # List of regexps of issue texts to exclude, empty list by default. | ||||
|  | ||||
| @ -90,7 +90,7 @@ func (b *Bdiscord) Connect() error { | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	guilds, err := b.c.UserGuilds(100, "", "") | ||||
| 	guilds, err := b.c.UserGuilds(100, "", "", false) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| @ -101,7 +101,9 @@ func (b *Bslack) populateMessageWithBotInfo(ev *slack.MessageEvent, rmsg *config | ||||
| 	var err error | ||||
| 	var bot *slack.Bot | ||||
| 	for { | ||||
| 		bot, err = b.rtm.GetBotInfo(ev.BotID) | ||||
| 		bot, err = b.rtm.GetBotInfo(slack.GetBotInfoParameters{ | ||||
| 			Bot: ev.BotID, | ||||
| 		}) | ||||
| 		if err == nil { | ||||
| 			break | ||||
| 		} | ||||
|  | ||||
| @ -136,7 +136,7 @@ func isGroupJid(identifier string) bool { | ||||
| func (b *Bwhatsapp) getDevice() (*store.Device, error) { | ||||
| 	device := &store.Device{} | ||||
| 
 | ||||
| 	storeContainer, err := sqlstore.New("sqlite", "file:"+b.Config.GetString("sessionfile")+".db?_foreign_keys=on&_pragma=busy_timeout=10000", nil) | ||||
| 	storeContainer, err := sqlstore.New("sqlite", "file:"+b.Config.GetString("sessionfile")+".db?_pragma=foreign_keys(1)&_pragma=busy_timeout=10000", nil) | ||||
| 	if err != nil { | ||||
| 		return device, fmt.Errorf("failed to connect to database: %v", err) | ||||
| 	} | ||||
| @ -151,7 +151,6 @@ func (b *Bwhatsapp) getDevice() (*store.Device, error) { | ||||
| 
 | ||||
| func (b *Bwhatsapp) getNewReplyContext(parentID string) (*proto.ContextInfo, error) { | ||||
| 	replyInfo, err := b.parseMessageID(parentID) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										106
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								go.mod
									
									
									
									
									
								
							| @ -5,21 +5,21 @@ require ( | ||||
| 	github.com/Benau/tgsconverter v0.0.0-20210809170556-99f4a4f6337f | ||||
| 	github.com/Philipp15b/go-steam v1.0.1-0.20200727090957-6ae9b3c0a560 | ||||
| 	github.com/Rhymen/go-whatsapp v0.1.2-0.20211102134409-31a2e740845c | ||||
| 	github.com/SevereCloud/vksdk/v2 v2.16.0 | ||||
| 	github.com/bwmarrin/discordgo v0.27.1 | ||||
| 	github.com/d5/tengo/v2 v2.16.1 | ||||
| 	github.com/davecgh/go-spew v1.1.1 | ||||
| 	github.com/fsnotify/fsnotify v1.6.0 | ||||
| 	github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 | ||||
| 	github.com/SevereCloud/vksdk/v2 v2.16.1 | ||||
| 	github.com/bwmarrin/discordgo v0.28.1 | ||||
| 	github.com/d5/tengo/v2 v2.17.0 | ||||
| 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc | ||||
| 	github.com/fsnotify/fsnotify v1.7.0 | ||||
| 	github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2 | ||||
| 	github.com/google/gops v0.3.27 | ||||
| 	github.com/gorilla/schema v1.2.0 | ||||
| 	github.com/gorilla/schema v1.3.0 | ||||
| 	github.com/harmony-development/shibshib v0.0.0-20220101224523-c98059d09cfa | ||||
| 	github.com/hashicorp/golang-lru v0.6.0 | ||||
| 	github.com/jpillora/backoff v1.0.0 | ||||
| 	github.com/keybase/go-keybase-chat-bot v0.0.0-20221220212439-e48d9abd2c20 | ||||
| 	github.com/kyokomi/emoji/v2 v2.2.12 | ||||
| 	github.com/labstack/echo/v4 v4.11.1 | ||||
| 	github.com/lrstanley/girc v0.0.0-20230729130341-dd5853a5f1a6 | ||||
| 	github.com/kyokomi/emoji/v2 v2.2.13 | ||||
| 	github.com/labstack/echo/v4 v4.12.0 | ||||
| 	github.com/lrstanley/girc v0.0.0-20240519163535-a518c5b87a79 | ||||
| 	github.com/matterbridge/Rocket.Chat.Go.SDK v0.0.0-20211016222428-79310a412696 | ||||
| 	github.com/matterbridge/go-xmpp v0.0.0-20211030125215-791a06c5f1be | ||||
| 	github.com/matterbridge/gomatrix v0.0.0-20220411225302-271e5088ea27 | ||||
| @ -39,21 +39,21 @@ require ( | ||||
| 	github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d | ||||
| 	github.com/shazow/ssh-chat v1.10.1 | ||||
| 	github.com/sirupsen/logrus v1.9.3 | ||||
| 	github.com/slack-go/slack v0.12.2 | ||||
| 	github.com/spf13/viper v1.16.0 | ||||
| 	github.com/stretchr/testify v1.8.4 | ||||
| 	github.com/slack-go/slack v0.13.0 | ||||
| 	github.com/spf13/viper v1.18.2 | ||||
| 	github.com/stretchr/testify v1.9.0 | ||||
| 	github.com/vincent-petithory/dataurl v1.0.0 | ||||
| 	github.com/writeas/go-strip-markdown v2.0.1+incompatible | ||||
| 	github.com/yaegashi/msgraph.go v0.1.4 | ||||
| 	github.com/zfjagann/golang-ring v0.0.0-20220330170733-19bcea1b6289 | ||||
| 	go.mau.fi/whatsmeow v0.0.0-20230805111647-405414b9b5c0 | ||||
| 	golang.org/x/image v0.11.0 | ||||
| 	golang.org/x/oauth2 v0.11.0 | ||||
| 	golang.org/x/text v0.12.0 | ||||
| 	go.mau.fi/whatsmeow v0.0.0-20240520180327-81f8f07f1dfb | ||||
| 	golang.org/x/image v0.16.0 | ||||
| 	golang.org/x/oauth2 v0.20.0 | ||||
| 	golang.org/x/text v0.15.0 | ||||
| 	gomod.garykim.dev/nc-talk v0.3.0 | ||||
| 	google.golang.org/protobuf v1.31.0 | ||||
| 	google.golang.org/protobuf v1.33.0 | ||||
| 	layeh.com/gumble v0.0.0-20221205141517-d1df60a3cc14 | ||||
| 	modernc.org/sqlite v1.25.0 | ||||
| 	modernc.org/sqlite v1.29.10 | ||||
| ) | ||||
| 
 | ||||
| require ( | ||||
| @ -68,24 +68,24 @@ require ( | ||||
| 	github.com/francoispqt/gojay v1.2.13 // indirect | ||||
| 	github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect | ||||
| 	github.com/golang-jwt/jwt v3.2.2+incompatible // indirect | ||||
| 	github.com/golang/protobuf v1.5.3 // indirect | ||||
| 	github.com/google/uuid v1.3.0 // indirect | ||||
| 	github.com/golang/protobuf v1.5.4 // indirect | ||||
| 	github.com/google/uuid v1.6.0 // indirect | ||||
| 	github.com/gopackage/ddp v0.0.3 // indirect | ||||
| 	github.com/gorilla/websocket v1.5.0 // indirect | ||||
| 	github.com/graph-gophers/graphql-go v1.3.0 // indirect | ||||
| 	github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect | ||||
| 	github.com/hashicorp/hcl v1.0.0 // indirect | ||||
| 	github.com/json-iterator/go v1.1.12 // indirect | ||||
| 	github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect | ||||
| 	github.com/kettek/apng v0.0.0-20191108220231-414630eed80f // indirect | ||||
| 	github.com/klauspost/compress v1.16.0 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.3 // indirect | ||||
| 	github.com/labstack/gommon v0.4.0 // indirect | ||||
| 	github.com/klauspost/compress v1.17.0 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect | ||||
| 	github.com/labstack/gommon v0.4.2 // indirect | ||||
| 	github.com/magiconair/properties v1.8.7 // indirect | ||||
| 	github.com/mattermost/go-i18n v1.11.1-0.20211013152124-5c415071e404 // indirect | ||||
| 	github.com/mattermost/ldap v0.0.0-20201202150706-ee0e6284187d // indirect | ||||
| 	github.com/mattermost/logr/v2 v2.0.15 // indirect | ||||
| 	github.com/mattn/go-colorable v0.1.13 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.19 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||
| 	github.com/mattn/go-runewidth v0.0.13 // indirect | ||||
| 	github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect | ||||
| 	github.com/minio/md5-simd v1.1.2 // indirect | ||||
| @ -95,57 +95,61 @@ require ( | ||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
| 	github.com/modern-go/reflect2 v1.0.2 // indirect | ||||
| 	github.com/monaco-io/request v1.0.5 // indirect | ||||
| 	github.com/ncruces/go-strftime v0.1.9 // indirect | ||||
| 	github.com/opentracing/opentracing-go v1.2.0 // indirect | ||||
| 	github.com/pborman/uuid v1.2.1 // indirect | ||||
| 	github.com/pelletier/go-toml v1.9.5 // indirect | ||||
| 	github.com/pelletier/go-toml/v2 v2.0.8 // indirect | ||||
| 	github.com/pelletier/go-toml/v2 v2.1.0 // indirect | ||||
| 	github.com/philhofer/fwd v1.1.1 // indirect | ||||
| 	github.com/pkg/errors v0.9.1 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect | ||||
| 	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect | ||||
| 	github.com/rickb777/date v1.12.4 // indirect | ||||
| 	github.com/rickb777/plural v1.2.0 // indirect | ||||
| 	github.com/rivo/uniseg v0.2.0 // indirect | ||||
| 	github.com/rs/zerolog v1.32.0 // indirect | ||||
| 	github.com/sagikazarmark/locafero v0.4.0 // indirect | ||||
| 	github.com/sagikazarmark/slog-shim v0.1.0 // indirect | ||||
| 	github.com/shazow/rateio v0.0.0-20200113175441-4461efc8bdc4 // indirect | ||||
| 	github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882 // indirect | ||||
| 	github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 // indirect | ||||
| 	github.com/spf13/afero v1.9.5 // indirect | ||||
| 	github.com/spf13/cast v1.5.1 // indirect | ||||
| 	github.com/spf13/jwalterweatherman v1.1.0 // indirect | ||||
| 	github.com/sourcegraph/conc v0.3.0 // indirect | ||||
| 	github.com/spf13/afero v1.11.0 // indirect | ||||
| 	github.com/spf13/cast v1.6.0 // indirect | ||||
| 	github.com/spf13/pflag v1.0.5 // indirect | ||||
| 	github.com/subosito/gotenv v1.4.2 // indirect | ||||
| 	github.com/subosito/gotenv v1.6.0 // indirect | ||||
| 	github.com/tinylib/msgp v1.1.6 // indirect | ||||
| 	github.com/valyala/bytebufferpool v1.0.0 // indirect | ||||
| 	github.com/valyala/fasttemplate v1.2.2 // indirect | ||||
| 	github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect | ||||
| 	github.com/vmihailenco/msgpack/v5 v5.4.0 // indirect | ||||
| 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect | ||||
| 	github.com/wiggin77/merror v1.0.3 // indirect | ||||
| 	github.com/wiggin77/srslog v1.0.1 // indirect | ||||
| 	go.mau.fi/libsignal v0.1.0 // indirect | ||||
| 	golang.org/x/crypto v0.12.0 // indirect | ||||
| 	golang.org/x/mod v0.8.0 // indirect | ||||
| 	golang.org/x/net v0.14.0 // indirect | ||||
| 	golang.org/x/sys v0.11.0 // indirect | ||||
| 	golang.org/x/term v0.11.0 // indirect | ||||
| 	golang.org/x/time v0.3.0 // indirect | ||||
| 	golang.org/x/tools v0.6.0 // indirect | ||||
| 	google.golang.org/appengine v1.6.7 // indirect | ||||
| 	go.mau.fi/util v0.4.1 // indirect | ||||
| 	go.uber.org/atomic v1.9.0 // indirect | ||||
| 	go.uber.org/multierr v1.9.0 // indirect | ||||
| 	golang.org/x/crypto v0.23.0 // indirect | ||||
| 	golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f // indirect | ||||
| 	golang.org/x/net v0.25.0 // indirect | ||||
| 	golang.org/x/sys v0.20.0 // indirect | ||||
| 	golang.org/x/term v0.20.0 // indirect | ||||
| 	golang.org/x/time v0.5.0 // indirect | ||||
| 	gopkg.in/ini.v1 v1.67.0 // indirect | ||||
| 	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect | ||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| 	lukechampine.com/uint128 v1.2.0 // indirect | ||||
| 	modernc.org/cc/v3 v3.40.0 // indirect | ||||
| 	modernc.org/ccgo/v3 v3.16.13 // indirect | ||||
| 	modernc.org/libc v1.24.1 // indirect | ||||
| 	modernc.org/mathutil v1.5.0 // indirect | ||||
| 	modernc.org/memory v1.6.0 // indirect | ||||
| 	modernc.org/opt v0.1.3 // indirect | ||||
| 	modernc.org/strutil v1.1.3 // indirect | ||||
| 	modernc.org/token v1.0.1 // indirect | ||||
| 	modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect | ||||
| 	modernc.org/libc v1.49.3 // indirect | ||||
| 	modernc.org/mathutil v1.6.0 // indirect | ||||
| 	modernc.org/memory v1.8.0 // indirect | ||||
| 	modernc.org/strutil v1.2.0 // indirect | ||||
| 	modernc.org/token v1.1.0 // indirect | ||||
| 	rsc.io/qr v0.2.0 // indirect | ||||
| ) | ||||
| 
 | ||||
| //replace github.com/matrix-org/gomatrix => github.com/matterbridge/gomatrix v0.0.0-20220205235239-607eb9ee6419 | ||||
| 
 | ||||
| go 1.19 | ||||
| go 1.21 | ||||
| 
 | ||||
| toolchain go1.22.3 | ||||
|  | ||||
							
								
								
									
										250
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										250
									
								
								go.sum
									
									
									
									
									
								
							| @ -6,7 +6,6 @@ cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgo | ||||
| cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= | ||||
| cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= | ||||
| cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= | ||||
| cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= | ||||
| cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= | ||||
| cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= | ||||
| cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= | ||||
| @ -19,7 +18,6 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY | ||||
| cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= | ||||
| cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= | ||||
| cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= | ||||
| cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= | ||||
| cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= | ||||
| cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= | ||||
| cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= | ||||
| @ -46,7 +44,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo | ||||
| cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= | ||||
| cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= | ||||
| cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= | ||||
| cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= | ||||
| code.sajari.com/docconv v1.2.0/go.mod h1:r8yfCP6OKbZ9Xkd87aBa4nfpk6ud/PoyLwex3n6cXSc= | ||||
| dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= | ||||
| dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= | ||||
| @ -127,8 +124,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko | ||||
| github.com/Rhymen/go-whatsapp v0.1.2-0.20211102134409-31a2e740845c h1:4mIZQXKYBymQ9coA82nNyG/CjicMNLBZ8cPVrhNUM3g= | ||||
| github.com/Rhymen/go-whatsapp v0.1.2-0.20211102134409-31a2e740845c/go.mod h1:DNSFRLFDFIqm2+0aJzSOVfn25020vldM4SRqz6YtLgI= | ||||
| github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= | ||||
| github.com/SevereCloud/vksdk/v2 v2.16.0 h1:DQ90qqwY/yF1X/SWZQs1kQ/Ik+tphK82d+S6Rch46wQ= | ||||
| github.com/SevereCloud/vksdk/v2 v2.16.0/go.mod h1:VN6BH9nFUXcP7Uf0uX74Aht2DQ7+139aG3/Og+jia4w= | ||||
| github.com/SevereCloud/vksdk/v2 v2.16.1 h1:UiazL3vTy7lMm33oIXRMxXg8S5I8bQuqEdLtbmOSpG4= | ||||
| github.com/SevereCloud/vksdk/v2 v2.16.1/go.mod h1:UfVcBt8qh5+gIflQO6L+CWwrXcpwhOl5hKvKf8sXUd8= | ||||
| github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= | ||||
| github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= | ||||
| github.com/advancedlogic/GoOse v0.0.0-20191112112754-e742535969c1/go.mod h1:f3HCSN1fBWjcpGtXyM119MJgeQl838v6so/PQOqvE1w= | ||||
| @ -246,8 +243,8 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 | ||||
| github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= | ||||
| github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= | ||||
| github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= | ||||
| github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= | ||||
| github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= | ||||
| github.com/bwmarrin/discordgo v0.28.1 h1:gXsuo2GBO7NbR6uqmrrBDplPUx2T3nzu775q/Rd1aG4= | ||||
| github.com/bwmarrin/discordgo v0.28.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= | ||||
| github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= | ||||
| @ -378,6 +375,7 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 | ||||
| github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= | ||||
| github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= | ||||
| github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= | ||||
| github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= | ||||
| github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= | ||||
| github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k= | ||||
| @ -395,12 +393,13 @@ github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1S | ||||
| github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= | ||||
| github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= | ||||
| github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= | ||||
| github.com/d5/tengo/v2 v2.16.1 h1:/N6dqiGu9toqANInZEOQMM8I06icdZnmb+81DG/lZdw= | ||||
| github.com/d5/tengo/v2 v2.16.1/go.mod h1:XRGjEs5I9jYIKTxly6HCF8oiiilk5E/RYXOZ5b0DZC8= | ||||
| github.com/d5/tengo/v2 v2.17.0 h1:BWUN9NoJzw48jZKiYDXDIF3QrIVZRm1uV1gTzeZ2lqM= | ||||
| github.com/d5/tengo/v2 v2.17.0/go.mod h1:XRGjEs5I9jYIKTxly6HCF8oiiilk5E/RYXOZ5b0DZC8= | ||||
| github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= | ||||
| github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/dchote/go-openal v0.0.0-20171116030048-f4a9a141d372/go.mod h1:74z+CYu2/mx4N+mcIS/rsvfAxBPBV9uv8zRAnwyFkdI= | ||||
| github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= | ||||
| github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= | ||||
| @ -467,12 +466,13 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu | ||||
| github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= | ||||
| github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= | ||||
| github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= | ||||
| github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= | ||||
| github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= | ||||
| github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= | ||||
| github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= | ||||
| github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= | ||||
| github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= | ||||
| github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= | ||||
| github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= | ||||
| github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= | ||||
| github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= | ||||
| github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= | ||||
| @ -617,16 +617,16 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw | ||||
| github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||
| github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= | ||||
| github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | ||||
| github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= | ||||
| github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= | ||||
| github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E= | ||||
| github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= | ||||
| github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2 h1:yEt5djSYb4iNtmV9iJGVday+i4e9u6Mrn5iP64HH5QM= | ||||
| github.com/gomarkdown/markdown v0.0.0-20240419095408-642f0ee99ae2/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= | ||||
| github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= | ||||
| github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= | ||||
| github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| @ -647,6 +647,7 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ | ||||
| github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= | ||||
| github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= | ||||
| github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= | ||||
| github.com/google/go-github/v35 v35.2.0/go.mod h1:s0515YVTI+IMrDoy9Y4pHt9ShGpzHvHO8rZ7L7acgvs= | ||||
| github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= | ||||
| @ -667,27 +668,27 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf | ||||
| github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= | ||||
| github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= | ||||
| github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= | ||||
| github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= | ||||
| github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= | ||||
| github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= | ||||
| github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= | ||||
| github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||
| github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= | ||||
| github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= | ||||
| github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= | ||||
| github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= | ||||
| github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= | ||||
| github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= | ||||
| github.com/gopackage/ddp v0.0.3 h1:fd0DxScoiS+ogq22ktey6DjDSDybtJPAn69geMpUtFc= | ||||
| github.com/gopackage/ddp v0.0.3/go.mod h1:3hUXYG6C/6JsoxKsQaK7st09+GP9RZBFPzyAlU/0SLg= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| @ -700,8 +701,9 @@ github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z | ||||
| github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= | ||||
| github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= | ||||
| github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= | ||||
| github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= | ||||
| github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= | ||||
| github.com/gorilla/schema v1.3.0 h1:rbciOzXAx3IB8stEFnfTwO3sYa6EWlQk79XdyustPDA= | ||||
| github.com/gorilla/schema v1.3.0/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= | ||||
| github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||
| github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= | ||||
| github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| @ -756,6 +758,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ | ||||
| github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||
| github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= | ||||
| github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||
| github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= | ||||
| github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= | ||||
| github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= | ||||
| github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= | ||||
| github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= | ||||
| @ -873,7 +877,6 @@ github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYb | ||||
| github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= | ||||
| github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= | ||||
| github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= | ||||
| github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= | ||||
| github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= | ||||
| github.com/kettek/apng v0.0.0-20191108220231-414630eed80f h1:dnCYnTSltLuPMfc7dMrkz2uBUcEf/OFBR8yRh3oRT98= | ||||
| github.com/kettek/apng v0.0.0-20191108220231-414630eed80f/go.mod h1:x78/VRQYKuCftMWS0uK5e+F5RJ7S4gSlESRWI0Prl6Q= | ||||
| @ -895,8 +898,8 @@ github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 | ||||
| github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= | ||||
| github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= | ||||
| github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= | ||||
| github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= | ||||
| github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= | ||||
| github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= | ||||
| github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= | ||||
| github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | ||||
| github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | ||||
| github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= | ||||
| @ -904,8 +907,8 @@ github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd | ||||
| github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||
| github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||
| github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= | ||||
| github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= | ||||
| github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= | ||||
| github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= | ||||
| @ -917,6 +920,7 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn | ||||
| github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||
| github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= | ||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= | ||||
| @ -925,14 +929,14 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= | ||||
| github.com/kyokomi/emoji/v2 v2.2.12 h1:sSVA5nH9ebR3Zji1o31wu3yOwD1zKXQA2z0zUyeit60= | ||||
| github.com/kyokomi/emoji/v2 v2.2.12/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE= | ||||
| github.com/kyokomi/emoji/v2 v2.2.13 h1:GhTfQa67venUUvmleTNFnb+bi7S3aocF7ZCXU9fSO7U= | ||||
| github.com/kyokomi/emoji/v2 v2.2.13/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE= | ||||
| github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= | ||||
| github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= | ||||
| github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= | ||||
| github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0= | ||||
| github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM= | ||||
| github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= | ||||
| github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= | ||||
| github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= | ||||
| github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= | ||||
| github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= | ||||
| github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= | ||||
| github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= | ||||
| github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= | ||||
| @ -945,8 +949,8 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/lrstanley/girc v0.0.0-20230729130341-dd5853a5f1a6 h1:InzqHdpTHFBhVtlu9NB7Ot2p6Y4A9IcTjWBihkKE1JM= | ||||
| github.com/lrstanley/girc v0.0.0-20230729130341-dd5853a5f1a6/go.mod h1:lgrnhcF8bg/Bd5HA5DOb4Z+uGqUqGnp4skr+J2GwVgI= | ||||
| github.com/lrstanley/girc v0.0.0-20240519163535-a518c5b87a79 h1:6yveo9g55i+VPr+Dinsp/Z7z/msCAq0E+Nag8lTl25k= | ||||
| github.com/lrstanley/girc v0.0.0-20240519163535-a518c5b87a79/go.mod h1:lgrnhcF8bg/Bd5HA5DOb4Z+uGqUqGnp4skr+J2GwVgI= | ||||
| github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= | ||||
| github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | ||||
| github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= | ||||
| @ -1010,8 +1014,9 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME | ||||
| github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | ||||
| github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | ||||
| github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= | ||||
| github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= | ||||
| github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||
| 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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | ||||
| github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= | ||||
| github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= | ||||
| @ -1024,7 +1029,6 @@ github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq | ||||
| github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | ||||
| github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | ||||
| github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= | ||||
| github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= | ||||
| github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | ||||
| github.com/mattn/godown v0.0.1 h1:39uk50ufLVQFs0eapIJVX5fCS74a1Fs2g5f1MVqIHdE= | ||||
| github.com/mattn/godown v0.0.1/go.mod h1:/ivCKurgV/bx6yqtP/Jtc2Xmrv3beCYBvlfAUl4X5g4= | ||||
| @ -1102,6 +1106,8 @@ github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5Vgl | ||||
| github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= | ||||
| github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= | ||||
| github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= | ||||
| github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= | ||||
| github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= | ||||
| github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= | ||||
| github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= | ||||
| github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= | ||||
| @ -1199,8 +1205,8 @@ github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko | ||||
| github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= | ||||
| github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= | ||||
| github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= | ||||
| github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= | ||||
| github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= | ||||
| github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= | ||||
| github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= | ||||
| github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= | ||||
| github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= | ||||
| github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= | ||||
| @ -1220,9 +1226,9 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= | ||||
| github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= | ||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= | ||||
| github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= | ||||
| github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= | ||||
| github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | ||||
| @ -1289,6 +1295,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR | ||||
| github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | ||||
| github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= | ||||
| github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= | ||||
| github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= | ||||
| github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= | ||||
| github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= | ||||
| github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= | ||||
| @ -1296,6 +1303,8 @@ github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= | ||||
| github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= | ||||
| github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= | ||||
| github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= | ||||
| github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= | ||||
| github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= | ||||
| github.com/rudderlabs/analytics-go v3.3.2+incompatible/go.mod h1:LF8/ty9kUX4PTY3l5c97K3nZZaX5Hwsvt+NBaRL/f30= | ||||
| github.com/russellhaering/goxmldsig v1.2.0/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= | ||||
| github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | ||||
| @ -1308,6 +1317,10 @@ github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0 | ||||
| github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= | ||||
| github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= | ||||
| github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= | ||||
| github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= | ||||
| github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= | ||||
| github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= | ||||
| github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= | ||||
| github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= | ||||
| github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= | ||||
| github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | ||||
| @ -1366,8 +1379,8 @@ github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882 h1:A7o8tOE | ||||
| github.com/sizeofint/webpanimation v0.0.0-20210809145948-1d2b32119882/go.mod h1:5IwJoz9Pw7JsrCN4/skkxUtSWT7myuUPLhCgv6Q5vvQ= | ||||
| github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9 h1:lpEzuenPuO1XNTeikEmvqYFcU37GVLl8SRNblzyvGBE= | ||||
| github.com/skip2/go-qrcode v0.0.0-20190110000554-dc11ecdae0a9/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo= | ||||
| github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ= | ||||
| github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= | ||||
| github.com/slack-go/slack v0.13.0 h1:7my/pR2ubZJ9912p9FtvALYpbt0cQPAqkRy2jaSI1PQ= | ||||
| github.com/slack-go/slack v0.13.0/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= | ||||
| github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= | ||||
| github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= | ||||
| github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= | ||||
| @ -1377,17 +1390,19 @@ github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4S | ||||
| github.com/snowflakedb/gosnowflake v1.6.3/go.mod h1:6hLajn6yxuJ4xUHZegMekpq9rnQbGJ7TMwXjgTmA6lg= | ||||
| github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= | ||||
| github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= | ||||
| github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= | ||||
| github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= | ||||
| github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= | ||||
| github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= | ||||
| github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= | ||||
| github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= | ||||
| github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= | ||||
| github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= | ||||
| github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= | ||||
| github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= | ||||
| github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||
| github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= | ||||
| github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= | ||||
| github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= | ||||
| github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= | ||||
| github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= | ||||
| github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | ||||
| github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= | ||||
| github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= | ||||
| @ -1396,7 +1411,6 @@ github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSW | ||||
| github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= | ||||
| github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= | ||||
| github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= | ||||
| github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= | ||||
| github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= | ||||
| github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | ||||
| github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= | ||||
| @ -1408,8 +1422,8 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM | ||||
| github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= | ||||
| github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= | ||||
| github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= | ||||
| github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= | ||||
| github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= | ||||
| github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= | ||||
| github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= | ||||
| github.com/splitio/go-client/v6 v6.1.0/go.mod h1:CEGAEFT99Fwb32ZIRcnZoXTMXddtB6IIpTmt3RP8mnM= | ||||
| github.com/splitio/go-split-commons/v3 v3.1.0/go.mod h1:29NCy20oAS4ZMy4qkwTd6277eieVDonx4V/aeDU/wUQ= | ||||
| github.com/splitio/go-toolkit/v4 v4.2.0/go.mod h1:EdIHN0yzB1GTXDYQc0KdKvnjkO/jfUM2YqHVYfhD3Wo= | ||||
| @ -1431,12 +1445,12 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ | ||||
| github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= | ||||
| github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= | ||||
| github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= | ||||
| github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | ||||
| github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= | ||||
| github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= | ||||
| github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= | ||||
| github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= | ||||
| github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= | ||||
| @ -1492,8 +1506,9 @@ github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:tw | ||||
| github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= | ||||
| github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= | ||||
| github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= | ||||
| github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= | ||||
| github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= | ||||
| github.com/vmihailenco/msgpack/v5 v5.4.0 h1:hRM0digJwyR6vll33NNAwCFguy5JuBD6jxDmQP3l608= | ||||
| github.com/vmihailenco/msgpack/v5 v5.4.0/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= | ||||
| github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= | ||||
| github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= | ||||
| github.com/wiggin77/merror v1.0.2/go.mod h1:uQTcIU0Z6jRK4OwqganPYerzQxSFJ4GSHM3aurxxQpg= | ||||
| @ -1506,6 +1521,7 @@ github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr | ||||
| github.com/writeas/go-strip-markdown v2.0.1+incompatible h1:IIqxTM5Jr7RzhigcL6FkrCNfXkvbR+Nbu1ls48pXYcw= | ||||
| github.com/writeas/go-strip-markdown v2.0.1+incompatible/go.mod h1:Rsyu10ZhbEK9pXdk8V6MVnZmTzRG0alMNLMwa0J01fE= | ||||
| github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= | ||||
| github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= | ||||
| github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= | ||||
| github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= | ||||
| github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= | ||||
| @ -1533,7 +1549,6 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec | ||||
| github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= | ||||
| github.com/yuin/goldmark v1.4.11/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= | ||||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||
| github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= | ||||
| github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= | ||||
| github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= | ||||
| @ -1551,8 +1566,10 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3 | ||||
| go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= | ||||
| go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c= | ||||
| go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I= | ||||
| go.mau.fi/whatsmeow v0.0.0-20230805111647-405414b9b5c0 h1:6kAOyrp8E9p99X1I3uj7BtEFspdcVjnYzUZpqcHo/mE= | ||||
| go.mau.fi/whatsmeow v0.0.0-20230805111647-405414b9b5c0/go.mod h1:+ObGpFE6cbbY4hKc1FmQH9MVfqaemmlXGXSnwDvCOyE= | ||||
| go.mau.fi/util v0.4.1 h1:3EC9KxIXo5+h869zDGf5OOZklRd/FjeVnimTwtm3owg= | ||||
| go.mau.fi/util v0.4.1/go.mod h1:GjkTEBsehYZbSh2LlE6cWEn+6ZIZTGrTMM/5DMNlmFY= | ||||
| go.mau.fi/whatsmeow v0.0.0-20240520180327-81f8f07f1dfb h1:FW5W0ewNOmunylB3Pmru8PvxYkhI6ZphCJtimM2aB6o= | ||||
| go.mau.fi/whatsmeow v0.0.0-20240520180327-81f8f07f1dfb/go.mod h1:0+65CYaE6r4dWzr0dN8i+UZKy0gIfJ79VuSqIl0nKRM= | ||||
| go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= | ||||
| go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= | ||||
| go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= | ||||
| @ -1569,10 +1586,13 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | ||||
| go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= | ||||
| go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | ||||
| go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= | ||||
| go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | ||||
| go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= | ||||
| go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= | ||||
| go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | ||||
| go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | ||||
| go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | ||||
| @ -1613,9 +1633,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y | ||||
| golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= | ||||
| golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= | ||||
| golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= | ||||
| golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= | ||||
| golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| @ -1631,6 +1650,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 | ||||
| golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= | ||||
| golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= | ||||
| golang.org/x/exp v0.0.0-20200908183739-ae8ad444f925/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw= | ||||
| golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f h1:3CW0unweImhOzd5FmYuRsD4Y4oQFKZIjAnKbjV4WIrw= | ||||
| golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= | ||||
| golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= | ||||
| golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= | ||||
| golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= | ||||
| @ -1642,8 +1663,8 @@ golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+o | ||||
| golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= | ||||
| golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= | ||||
| golang.org/x/image v0.0.0-20220321031419-a8550c1d254a/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= | ||||
| golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo= | ||||
| golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= | ||||
| golang.org/x/image v0.16.0 h1:9kloLAKhUufZhA12l5fwnx2NZW39/we1UhBesW433jw= | ||||
| golang.org/x/image v0.16.0/go.mod h1:ugSZItdV4nOxyqp56HmXwH0Ry0nBCpjnZdpDaIHdoPs= | ||||
| golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||
| golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||
| golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | ||||
| @ -1670,9 +1691,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||
| golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= | ||||
| golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||||
| golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= | ||||
| golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= | ||||
| golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | ||||
| golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| @ -1749,10 +1769,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx | ||||
| golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | ||||
| golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | ||||
| golang.org/x/net v0.0.0-20220403103023-749bd193bc2b/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= | ||||
| golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= | ||||
| golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= | ||||
| golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= | ||||
| golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= | ||||
| golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= | ||||
| golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| @ -1772,8 +1790,8 @@ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ | ||||
| golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||
| golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= | ||||
| golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= | ||||
| golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= | ||||
| golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= | ||||
| golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= | ||||
| golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= | ||||
| golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| @ -1787,9 +1805,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= | ||||
| golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| @ -1883,7 +1898,6 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w | ||||
| golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| @ -1892,7 +1906,6 @@ golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7w | ||||
| golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| @ -1908,26 +1921,21 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc | ||||
| golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220403205710-6acee93ad0eb/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= | ||||
| golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= | ||||
| golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | ||||
| golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= | ||||
| golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= | ||||
| golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= | ||||
| golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= | ||||
| golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| @ -1937,17 +1945,16 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||
| golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= | ||||
| golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= | ||||
| golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= | ||||
| golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | ||||
| golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= | ||||
| golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= | ||||
| golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | ||||
| golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| @ -2023,7 +2030,6 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f | ||||
| golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= | ||||
| golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| @ -2032,9 +2038,8 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= | ||||
| golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||||
| golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= | ||||
| golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | ||||
| golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= | ||||
| golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= | ||||
| golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| @ -2088,7 +2093,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 | ||||
| google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= | ||||
| google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= | ||||
| google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||||
| google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= | ||||
| google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| @ -2134,10 +2138,8 @@ google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6D | ||||
| google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= | ||||
| @ -2203,8 +2205,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 | ||||
| google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||
| google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||
| google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= | ||||
| google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= | ||||
| google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= | ||||
| gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= | ||||
| gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= | ||||
| gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= | ||||
| @ -2300,8 +2302,6 @@ layeh.com/gopus v0.0.0-20161224163843-0ebf989153aa/go.mod h1:AOef7vHz0+v4sWwJnr0 | ||||
| layeh.com/gumble v0.0.0-20221205141517-d1df60a3cc14 h1:wY8eeq7DpM5iAugNbFrvuhdtmN8XM1iU+Ki5YZWjukg= | ||||
| layeh.com/gumble v0.0.0-20221205141517-d1df60a3cc14/go.mod h1:tWPVA9ZAfImNwabjcd9uDE+Mtz0Hfs7a7G3vxrnrwyc= | ||||
| lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= | ||||
| lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= | ||||
| lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= | ||||
| modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= | ||||
| modernc.org/cc/v3 v3.32.4/go.mod h1:0R6jl1aZlIl2avnYfbfHBS1QB6/f+16mihBObaBC878= | ||||
| modernc.org/cc/v3 v3.33.6/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= | ||||
| @ -2318,8 +2318,8 @@ modernc.org/cc/v3 v3.35.15/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g | ||||
| modernc.org/cc/v3 v3.35.16/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= | ||||
| modernc.org/cc/v3 v3.35.17/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= | ||||
| modernc.org/cc/v3 v3.35.18/go.mod h1:iPJg1pkwXqAV16SNgFBVYmggfMg6xhs+2oiO0vclK3g= | ||||
| modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= | ||||
| modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= | ||||
| modernc.org/cc/v4 v4.20.0 h1:45Or8mQfbUqJOG9WaxvlFYOAQO0lQ5RvqBcFCXngjxk= | ||||
| modernc.org/cc/v4 v4.20.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= | ||||
| modernc.org/ccgo/v3 v3.9.2/go.mod h1:gnJpy6NIVqkETT+L5zPsQFj7L2kkhfPMzOghRNv/CFo= | ||||
| modernc.org/ccgo/v3 v3.9.5/go.mod h1:umuo2EP2oDSBnD3ckjaVUXMrmeAw8C8OSICVa0iFf60= | ||||
| modernc.org/ccgo/v3 v3.10.0/go.mod h1:c0yBmkRFi7uW4J7fwx/JiijwOjeAeR2NoSaRVFPmjMw= | ||||
| @ -2360,15 +2360,19 @@ modernc.org/ccgo/v3 v3.12.88/go.mod h1:0MFzUHIuSIthpVZyMWiFYMwjiFnhrN5MkvBrUwON+ | ||||
| modernc.org/ccgo/v3 v3.12.90/go.mod h1:obhSc3CdivCRpYZmrvO88TXlW0NvoSVvdh/ccRjJYko= | ||||
| modernc.org/ccgo/v3 v3.12.92/go.mod h1:5yDdN7ti9KWPi5bRVWPl8UNhpEAtCjuEE7ayQnzzqHA= | ||||
| modernc.org/ccgo/v3 v3.12.95/go.mod h1:ZcLyvtocXYi8uF+9Ebm3G8EF8HNY5hGomBqthDp4eC8= | ||||
| modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= | ||||
| modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= | ||||
| modernc.org/ccgo/v4 v4.16.0 h1:ofwORa6vx2FMm0916/CkZjpFPSR70VwTjUCe2Eg5BnA= | ||||
| modernc.org/ccgo/v4 v4.16.0/go.mod h1:dkNyWIjFrVIZ68DTo36vHK+6/ShBn4ysU61So6PIqCI= | ||||
| modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= | ||||
| modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= | ||||
| modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8= | ||||
| modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw= | ||||
| modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= | ||||
| modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= | ||||
| modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= | ||||
| modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw= | ||||
| modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= | ||||
| modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= | ||||
| modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= | ||||
| modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= | ||||
| modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= | ||||
| modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= | ||||
| modernc.org/internal v1.0.0/go.mod h1:VUD/+JAkhCpvkUitlEOnhpVxCgsBI90oTzSCRcqQVSM= | ||||
| modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= | ||||
| @ -2413,43 +2417,43 @@ modernc.org/libc v1.11.98/go.mod h1:ynK5sbjsU77AP+nn61+k+wxUGRx9rOFcIqWYYMaDZ4c= | ||||
| modernc.org/libc v1.11.99/go.mod h1:wLLYgEiY2D17NbBOEp+mIJJJBGSiy7fLL4ZrGGZ+8jI= | ||||
| modernc.org/libc v1.11.101/go.mod h1:wLLYgEiY2D17NbBOEp+mIJJJBGSiy7fLL4ZrGGZ+8jI= | ||||
| modernc.org/libc v1.11.104/go.mod h1:2MH3DaF/gCU8i/UBiVE1VFRos4o523M7zipmwH8SIgQ= | ||||
| modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= | ||||
| modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= | ||||
| modernc.org/libc v1.49.3 h1:j2MRCRdwJI2ls/sGbeSk0t2bypOG/uvPZUsGQFDulqg= | ||||
| modernc.org/libc v1.49.3/go.mod h1:yMZuGkn7pXbKfoT/M35gFJOAEdSKdxL0q64sF7KqCDo= | ||||
| modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= | ||||
| modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= | ||||
| modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= | ||||
| modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= | ||||
| modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= | ||||
| modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= | ||||
| modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= | ||||
| modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= | ||||
| modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= | ||||
| modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= | ||||
| modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= | ||||
| modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM= | ||||
| modernc.org/memory v1.6.0 h1:i6mzavxrE9a30whzMfwf7XWVODx2r5OYXvU46cirX7o= | ||||
| modernc.org/memory v1.6.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= | ||||
| modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= | ||||
| modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= | ||||
| modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= | ||||
| modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= | ||||
| modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= | ||||
| modernc.org/ql v1.0.0/go.mod h1:xGVyrLIatPcO2C1JvI/Co8c0sr6y91HKFNy4pt9JXEY= | ||||
| modernc.org/sortutil v1.1.0/go.mod h1:ZyL98OQHJgH9IEfN71VsamvJgrtRX9Dj2gX+vH86L1k= | ||||
| modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= | ||||
| modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= | ||||
| modernc.org/sqlite v1.10.6/go.mod h1:Z9FEjUtZP4qFEg6/SiADg9XCER7aYy9a/j7Pg9P7CPs= | ||||
| modernc.org/sqlite v1.14.3/go.mod h1:xMpicS1i2MJ4C8+Ap0vYBqTwYfpFvdnPE6brbFOtV2Y= | ||||
| modernc.org/sqlite v1.25.0 h1:AFweiwPNd/b3BoKnBOfFm+Y260guGMF+0UFk0savqeA= | ||||
| modernc.org/sqlite v1.25.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU= | ||||
| modernc.org/sqlite v1.29.10 h1:3u93dz83myFnMilBGCOLbr+HjklS6+5rJLx4q86RDAg= | ||||
| modernc.org/sqlite v1.29.10/go.mod h1:ItX2a1OVGgNsFh6Dv60JQvGfJfTPHPVpV6DF59akYOA= | ||||
| modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= | ||||
| modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= | ||||
| modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= | ||||
| modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= | ||||
| modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= | ||||
| modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= | ||||
| modernc.org/tcl v1.5.2/go.mod h1:pmJYOLgpiys3oI4AeAafkcUfE+TKKilminxNyU/+Zlo= | ||||
| modernc.org/tcl v1.9.2/go.mod h1:aw7OnlIoiuJgu1gwbTZtrKnGpDqH9wyH++jZcxdqNsg= | ||||
| modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= | ||||
| modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= | ||||
| modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= | ||||
| modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= | ||||
| modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= | ||||
| modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= | ||||
| modernc.org/z v1.0.1-0.20210308123920-1f282aa71362/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= | ||||
| modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= | ||||
| modernc.org/z v1.2.20/go.mod h1:zU9FiF4PbHdOTUxw+IF8j7ArBMRPsHgq10uVPt6xTzo= | ||||
| modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= | ||||
| modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= | ||||
| rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= | ||||
| rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/SevereCloud/vksdk/v2/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/SevereCloud/vksdk/v2/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,6 +7,6 @@ package vksdk | ||||
| 
 | ||||
| // Module constants. | ||||
| const ( | ||||
| 	Version = "2.16.0" | ||||
| 	Version = "2.16.1" | ||||
| 	API     = "5.131" | ||||
| ) | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/SevereCloud/vksdk/v2/object/board.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/SevereCloud/vksdk/v2/object/board.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -36,5 +36,5 @@ type BoardTopicPoll struct { | ||||
| 	OwnerID  int           `json:"owner_id"`  // Poll owner's ID | ||||
| 	PollID   int           `json:"poll_id"`   // Poll ID | ||||
| 	Question string        `json:"question"`  // Poll question | ||||
| 	Votes    string        `json:"votes"`     // Votes number | ||||
| 	Votes    int           `json:"votes"`     // Votes number | ||||
| } | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/github.com/SevereCloud/vksdk/v2/object/object.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/SevereCloud/vksdk/v2/object/object.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -285,8 +285,8 @@ type BaseLinkProduct struct { | ||||
| 
 | ||||
| // BaseLinkRating struct. | ||||
| type BaseLinkRating struct { | ||||
| 	ReviewsCount int     `json:"reviews_count"` | ||||
| 	Stars        float64 `json:"stars"` | ||||
| 	ReviewsCount json.Number `json:"reviews_count"` | ||||
| 	Stars        float64     `json:"stars"` | ||||
| } | ||||
| 
 | ||||
| // BasePlace struct. | ||||
|  | ||||
							
								
								
									
										44
									
								
								vendor/github.com/bwmarrin/discordgo/components.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/bwmarrin/discordgo/components.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -132,10 +132,10 @@ type ComponentEmoji struct { | ||||
| 
 | ||||
| // Button represents button component. | ||||
| type Button struct { | ||||
| 	Label    string         `json:"label"` | ||||
| 	Style    ButtonStyle    `json:"style"` | ||||
| 	Disabled bool           `json:"disabled"` | ||||
| 	Emoji    ComponentEmoji `json:"emoji"` | ||||
| 	Label    string          `json:"label"` | ||||
| 	Style    ButtonStyle     `json:"style"` | ||||
| 	Disabled bool            `json:"disabled"` | ||||
| 	Emoji    *ComponentEmoji `json:"emoji,omitempty"` | ||||
| 
 | ||||
| 	// NOTE: Only button with LinkButton style can have link. Also, URL is mutually exclusive with CustomID. | ||||
| 	URL      string `json:"url,omitempty"` | ||||
| @ -166,14 +166,32 @@ func (Button) Type() ComponentType { | ||||
| 
 | ||||
| // SelectMenuOption represents an option for a select menu. | ||||
| type SelectMenuOption struct { | ||||
| 	Label       string         `json:"label,omitempty"` | ||||
| 	Value       string         `json:"value"` | ||||
| 	Description string         `json:"description"` | ||||
| 	Emoji       ComponentEmoji `json:"emoji"` | ||||
| 	Label       string          `json:"label,omitempty"` | ||||
| 	Value       string          `json:"value"` | ||||
| 	Description string          `json:"description"` | ||||
| 	Emoji       *ComponentEmoji `json:"emoji,omitempty"` | ||||
| 	// Determines whenever option is selected by default or not. | ||||
| 	Default bool `json:"default"` | ||||
| } | ||||
| 
 | ||||
| // SelectMenuDefaultValueType represents the type of an entity selected by default in auto-populated select menus. | ||||
| type SelectMenuDefaultValueType string | ||||
| 
 | ||||
| // SelectMenuDefaultValue types. | ||||
| const ( | ||||
| 	SelectMenuDefaultValueUser    SelectMenuDefaultValueType = "user" | ||||
| 	SelectMenuDefaultValueRole    SelectMenuDefaultValueType = "role" | ||||
| 	SelectMenuDefaultValueChannel SelectMenuDefaultValueType = "channel" | ||||
| ) | ||||
| 
 | ||||
| // SelectMenuDefaultValue represents an entity selected by default in auto-populated select menus. | ||||
| type SelectMenuDefaultValue struct { | ||||
| 	// ID of the entity. | ||||
| 	ID string `json:"id"` | ||||
| 	// Type of the entity. | ||||
| 	Type SelectMenuDefaultValueType `json:"type"` | ||||
| } | ||||
| 
 | ||||
| // SelectMenuType represents select menu type. | ||||
| type SelectMenuType ComponentType | ||||
| 
 | ||||
| @ -198,9 +216,13 @@ type SelectMenu struct { | ||||
| 	MinValues *int `json:"min_values,omitempty"` | ||||
| 	// This value determines the maximal amount of selected items in the menu. | ||||
| 	// If MaxValues or MinValues are greater than one then the user can select multiple items in the component. | ||||
| 	MaxValues int                `json:"max_values,omitempty"` | ||||
| 	Options   []SelectMenuOption `json:"options,omitempty"` | ||||
| 	Disabled  bool               `json:"disabled"` | ||||
| 	MaxValues int `json:"max_values,omitempty"` | ||||
| 	// List of default values for auto-populated select menus. | ||||
| 	// NOTE: Number of entries should be in the range defined by MinValues and MaxValues. | ||||
| 	DefaultValues []SelectMenuDefaultValue `json:"default_values,omitempty"` | ||||
| 
 | ||||
| 	Options  []SelectMenuOption `json:"options,omitempty"` | ||||
| 	Disabled bool               `json:"disabled"` | ||||
| 
 | ||||
| 	// NOTE: Can only be used in SelectMenu with Channel menu type. | ||||
| 	ChannelTypes []ChannelType `json:"channel_types,omitempty"` | ||||
|  | ||||
							
								
								
									
										31
									
								
								vendor/github.com/bwmarrin/discordgo/discord.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								vendor/github.com/bwmarrin/discordgo/discord.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -22,7 +22,7 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| // VERSION of DiscordGo, follows Semantic Versioning. (http://semver.org/) | ||||
| const VERSION = "0.27.1" | ||||
| const VERSION = "0.28.1" | ||||
| 
 | ||||
| // New creates a new Discord session with provided token. | ||||
| // If the token is for a bot, it must be prefixed with "Bot " | ||||
| @ -33,20 +33,21 @@ func New(token string) (s *Session, err error) { | ||||
| 
 | ||||
| 	// Create an empty Session interface. | ||||
| 	s = &Session{ | ||||
| 		State:                  NewState(), | ||||
| 		Ratelimiter:            NewRatelimiter(), | ||||
| 		StateEnabled:           true, | ||||
| 		Compress:               true, | ||||
| 		ShouldReconnectOnError: true, | ||||
| 		ShouldRetryOnRateLimit: true, | ||||
| 		ShardID:                0, | ||||
| 		ShardCount:             1, | ||||
| 		MaxRestRetries:         3, | ||||
| 		Client:                 &http.Client{Timeout: (20 * time.Second)}, | ||||
| 		Dialer:                 websocket.DefaultDialer, | ||||
| 		UserAgent:              "DiscordBot (https://github.com/bwmarrin/discordgo, v" + VERSION + ")", | ||||
| 		sequence:               new(int64), | ||||
| 		LastHeartbeatAck:       time.Now().UTC(), | ||||
| 		State:                              NewState(), | ||||
| 		Ratelimiter:                        NewRatelimiter(), | ||||
| 		StateEnabled:                       true, | ||||
| 		Compress:                           true, | ||||
| 		ShouldReconnectOnError:             true, | ||||
| 		ShouldReconnectVoiceOnSessionError: true, | ||||
| 		ShouldRetryOnRateLimit:             true, | ||||
| 		ShardID:                            0, | ||||
| 		ShardCount:                         1, | ||||
| 		MaxRestRetries:                     3, | ||||
| 		Client:                             &http.Client{Timeout: (20 * time.Second)}, | ||||
| 		Dialer:                             websocket.DefaultDialer, | ||||
| 		UserAgent:                          "DiscordBot (https://github.com/bwmarrin/discordgo, v" + VERSION + ")", | ||||
| 		sequence:                           new(int64), | ||||
| 		LastHeartbeatAck:                   time.Now().UTC(), | ||||
| 	} | ||||
| 
 | ||||
| 	// Initialize the Identify Package with defaults | ||||
|  | ||||
							
								
								
									
										13
									
								
								vendor/github.com/bwmarrin/discordgo/endpoints.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/bwmarrin/discordgo/endpoints.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -42,6 +42,7 @@ var ( | ||||
| 	EndpointCDNChannelIcons = EndpointCDN + "channel-icons/" | ||||
| 	EndpointCDNBanners      = EndpointCDN + "banners/" | ||||
| 	EndpointCDNGuilds       = EndpointCDN + "guilds/" | ||||
| 	EndpointCDNRoleIcons    = EndpointCDN + "role-icons/" | ||||
| 
 | ||||
| 	EndpointVoice        = EndpointAPI + "/voice/" | ||||
| 	EndpointVoiceRegions = EndpointVoice + "regions" | ||||
| @ -49,9 +50,8 @@ var ( | ||||
| 	EndpointUser               = func(uID string) string { return EndpointUsers + uID } | ||||
| 	EndpointUserAvatar         = func(uID, aID string) string { return EndpointCDNAvatars + uID + "/" + aID + ".png" } | ||||
| 	EndpointUserAvatarAnimated = func(uID, aID string) string { return EndpointCDNAvatars + uID + "/" + aID + ".gif" } | ||||
| 	EndpointDefaultUserAvatar  = func(uDiscriminator string) string { | ||||
| 		uDiscriminatorInt, _ := strconv.Atoi(uDiscriminator) | ||||
| 		return EndpointCDN + "embed/avatars/" + strconv.Itoa(uDiscriminatorInt%5) + ".png" | ||||
| 	EndpointDefaultUserAvatar  = func(idx int) string { | ||||
| 		return EndpointCDN + "embed/avatars/" + strconv.Itoa(idx) + ".png" | ||||
| 	} | ||||
| 	EndpointUserBanner = func(uID, cID string) string { | ||||
| 		return EndpointCDNBanners + uID + "/" + cID + ".png" | ||||
| @ -104,7 +104,8 @@ var ( | ||||
| 	EndpointGuildScheduledEvents     = func(gID string) string { return EndpointGuilds + gID + "/scheduled-events" } | ||||
| 	EndpointGuildScheduledEvent      = func(gID, eID string) string { return EndpointGuilds + gID + "/scheduled-events/" + eID } | ||||
| 	EndpointGuildScheduledEventUsers = func(gID, eID string) string { return EndpointGuildScheduledEvent(gID, eID) + "/users" } | ||||
| 	EndpointGuildTemplate            = func(tID string) string { return EndpointGuilds + "/templates/" + tID } | ||||
| 	EndpointGuildOnboarding          = func(gID string) string { return EndpointGuilds + gID + "/onboarding" } | ||||
| 	EndpointGuildTemplate            = func(tID string) string { return EndpointGuilds + "templates/" + tID } | ||||
| 	EndpointGuildTemplates           = func(gID string) string { return EndpointGuilds + gID + "/templates" } | ||||
| 	EndpointGuildTemplateSync        = func(gID, tID string) string { return EndpointGuilds + gID + "/templates/" + tID } | ||||
| 	EndpointGuildMemberAvatar        = func(gId, uID, aID string) string { | ||||
| @ -114,6 +115,10 @@ var ( | ||||
| 		return EndpointCDNGuilds + gId + "/users/" + uID + "/avatars/" + aID + ".gif" | ||||
| 	} | ||||
| 
 | ||||
| 	EndpointRoleIcon = func(rID, hash string) string { | ||||
| 		return EndpointCDNRoleIcons + rID + "/" + hash + ".png" | ||||
| 	} | ||||
| 
 | ||||
| 	EndpointChannel                             = func(cID string) string { return EndpointChannels + cID } | ||||
| 	EndpointChannelThreads                      = func(cID string) string { return EndpointChannel(cID) + "/threads" } | ||||
| 	EndpointChannelActiveThreads                = func(cID string) string { return EndpointChannelThreads(cID) + "/active" } | ||||
|  | ||||
							
								
								
									
										24
									
								
								vendor/github.com/bwmarrin/discordgo/eventhandlers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/bwmarrin/discordgo/eventhandlers.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -19,6 +19,7 @@ const ( | ||||
| 	connectEventType                             = "__CONNECT__" | ||||
| 	disconnectEventType                          = "__DISCONNECT__" | ||||
| 	eventEventType                               = "__EVENT__" | ||||
| 	guildAuditLogEntryCreateEventType            = "GUILD_AUDIT_LOG_ENTRY_CREATE" | ||||
| 	guildBanAddEventType                         = "GUILD_BAN_ADD" | ||||
| 	guildBanRemoveEventType                      = "GUILD_BAN_REMOVE" | ||||
| 	guildCreateEventType                         = "GUILD_CREATE" | ||||
| @ -294,6 +295,26 @@ func (eh eventEventHandler) Handle(s *Session, i interface{}) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // guildAuditLogEntryCreateEventHandler is an event handler for GuildAuditLogEntryCreate events. | ||||
| type guildAuditLogEntryCreateEventHandler func(*Session, *GuildAuditLogEntryCreate) | ||||
| 
 | ||||
| // Type returns the event type for GuildAuditLogEntryCreate events. | ||||
| func (eh guildAuditLogEntryCreateEventHandler) Type() string { | ||||
| 	return guildAuditLogEntryCreateEventType | ||||
| } | ||||
| 
 | ||||
| // New returns a new instance of GuildAuditLogEntryCreate. | ||||
| func (eh guildAuditLogEntryCreateEventHandler) New() interface{} { | ||||
| 	return &GuildAuditLogEntryCreate{} | ||||
| } | ||||
| 
 | ||||
| // Handle is the handler for GuildAuditLogEntryCreate events. | ||||
| func (eh guildAuditLogEntryCreateEventHandler) Handle(s *Session, i interface{}) { | ||||
| 	if t, ok := i.(*GuildAuditLogEntryCreate); ok { | ||||
| 		eh(s, t) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // guildBanAddEventHandler is an event handler for GuildBanAdd events. | ||||
| type guildBanAddEventHandler func(*Session, *GuildBanAdd) | ||||
| 
 | ||||
| @ -1277,6 +1298,8 @@ func handlerForInterface(handler interface{}) EventHandler { | ||||
| 		return disconnectEventHandler(v) | ||||
| 	case func(*Session, *Event): | ||||
| 		return eventEventHandler(v) | ||||
| 	case func(*Session, *GuildAuditLogEntryCreate): | ||||
| 		return guildAuditLogEntryCreateEventHandler(v) | ||||
| 	case func(*Session, *GuildBanAdd): | ||||
| 		return guildBanAddEventHandler(v) | ||||
| 	case func(*Session, *GuildBanRemove): | ||||
| @ -1388,6 +1411,7 @@ func init() { | ||||
| 	registerInterfaceProvider(channelDeleteEventHandler(nil)) | ||||
| 	registerInterfaceProvider(channelPinsUpdateEventHandler(nil)) | ||||
| 	registerInterfaceProvider(channelUpdateEventHandler(nil)) | ||||
| 	registerInterfaceProvider(guildAuditLogEntryCreateEventHandler(nil)) | ||||
| 	registerInterfaceProvider(guildBanAddEventHandler(nil)) | ||||
| 	registerInterfaceProvider(guildBanRemoveEventHandler(nil)) | ||||
| 	registerInterfaceProvider(guildCreateEventHandler(nil)) | ||||
|  | ||||
							
								
								
									
										5
									
								
								vendor/github.com/bwmarrin/discordgo/events.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/bwmarrin/discordgo/events.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -401,3 +401,8 @@ type AutoModerationActionExecution struct { | ||||
| 	MatchedKeyword       string                        `json:"matched_keyword"` | ||||
| 	MatchedContent       string                        `json:"matched_content"` | ||||
| } | ||||
| 
 | ||||
| // GuildAuditLogEntryCreate is the data for a GuildAuditLogEntryCreate event. | ||||
| type GuildAuditLogEntryCreate struct { | ||||
| 	*AuditLogEntry | ||||
| } | ||||
|  | ||||
							
								
								
									
										8
									
								
								vendor/github.com/bwmarrin/discordgo/interactions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/bwmarrin/discordgo/interactions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -314,9 +314,10 @@ type InteractionData interface { | ||||
| 
 | ||||
| // ApplicationCommandInteractionData contains the data of application command interaction. | ||||
| type ApplicationCommandInteractionData struct { | ||||
| 	ID       string                                     `json:"id"` | ||||
| 	Name     string                                     `json:"name"` | ||||
| 	Resolved *ApplicationCommandInteractionDataResolved `json:"resolved"` | ||||
| 	ID          string                                     `json:"id"` | ||||
| 	Name        string                                     `json:"name"` | ||||
| 	CommandType ApplicationCommandType                     `json:"type"` | ||||
| 	Resolved    *ApplicationCommandInteractionDataResolved `json:"resolved"` | ||||
| 
 | ||||
| 	// Slash command options | ||||
| 	Options []*ApplicationCommandInteractionDataOption `json:"options"` | ||||
| @ -553,6 +554,7 @@ type InteractionResponseData struct { | ||||
| 	Embeds          []*MessageEmbed         `json:"embeds"` | ||||
| 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||
| 	Files           []*File                 `json:"-"` | ||||
| 	Attachments     *[]*MessageAttachment   `json:"attachments,omitempty"` | ||||
| 
 | ||||
| 	// NOTE: only MessageFlagsSuppressEmbeds and MessageFlagsEphemeral can be set. | ||||
| 	Flags MessageFlags `json:"flags,omitempty"` | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/bwmarrin/discordgo/locales.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/bwmarrin/discordgo/locales.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -39,6 +39,7 @@ const ( | ||||
| 	Romanian     Locale = "ro" | ||||
| 	Russian      Locale = "ru" | ||||
| 	SpanishES    Locale = "es-ES" | ||||
| 	SpanishLATAM Locale = "es-419" | ||||
| 	Swedish      Locale = "sv-SE" | ||||
| 	Thai         Locale = "th" | ||||
| 	Turkish      Locale = "tr" | ||||
| @ -74,6 +75,7 @@ var Locales = map[Locale]string{ | ||||
| 	Romanian:     "Romanian", | ||||
| 	Russian:      "Russian", | ||||
| 	SpanishES:    "Spanish (Spain)", | ||||
| 	SpanishLATAM: "Spanish (LATAM)", | ||||
| 	Swedish:      "Swedish", | ||||
| 	Thai:         "Thai", | ||||
| 	Turkish:      "Turkish", | ||||
|  | ||||
							
								
								
									
										46
									
								
								vendor/github.com/bwmarrin/discordgo/message.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/bwmarrin/discordgo/message.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -148,8 +148,8 @@ type Message struct { | ||||
| 	// The thread that was started from this message, includes thread member object | ||||
| 	Thread *Channel `json:"thread,omitempty"` | ||||
| 
 | ||||
| 	// An array of Sticker objects, if any were sent. | ||||
| 	StickerItems []*Sticker `json:"sticker_items"` | ||||
| 	// An array of StickerItem objects, representing sent stickers, if there were any. | ||||
| 	StickerItems []*StickerItem `json:"sticker_items"` | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON is a helper function to unmarshal the Message. | ||||
| @ -215,6 +215,10 @@ const ( | ||||
| 	MessageFlagsLoading MessageFlags = 1 << 7 | ||||
| 	// MessageFlagsFailedToMentionSomeRolesInThread this message failed to mention some roles and add their members to the thread. | ||||
| 	MessageFlagsFailedToMentionSomeRolesInThread MessageFlags = 1 << 8 | ||||
| 	// MessageFlagsSuppressNotifications this message will not trigger push and desktop notifications. | ||||
| 	MessageFlagsSuppressNotifications MessageFlags = 1 << 12 | ||||
| 	// MessageFlagsIsVoiceMessage this message is a voice message. | ||||
| 	MessageFlagsIsVoiceMessage MessageFlags = 1 << 13 | ||||
| ) | ||||
| 
 | ||||
| // File stores info about files you e.g. send in messages. | ||||
| @ -233,6 +237,8 @@ type MessageSend struct { | ||||
| 	Files           []*File                 `json:"-"` | ||||
| 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||
| 	Reference       *MessageReference       `json:"message_reference,omitempty"` | ||||
| 	StickerIDs      []string                `json:"sticker_ids"` | ||||
| 	Flags           MessageFlags            `json:"flags,omitempty"` | ||||
| 
 | ||||
| 	// TODO: Remove this when compatibility is not required. | ||||
| 	File *File `json:"-"` | ||||
| @ -245,8 +251,8 @@ type MessageSend struct { | ||||
| // is also where you should get the instance from. | ||||
| type MessageEdit struct { | ||||
| 	Content         *string                 `json:"content,omitempty"` | ||||
| 	Components      []MessageComponent      `json:"components"` | ||||
| 	Embeds          []*MessageEmbed         `json:"embeds"` | ||||
| 	Components      *[]MessageComponent     `json:"components,omitempty"` | ||||
| 	Embeds          *[]*MessageEmbed        `json:"embeds,omitempty"` | ||||
| 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||
| 	Flags           MessageFlags            `json:"flags,omitempty"` | ||||
| 	// Files to append to the message | ||||
| @ -280,14 +286,14 @@ func (m *MessageEdit) SetContent(str string) *MessageEdit { | ||||
| // SetEmbed is a convenience function for setting the embed, | ||||
| // so you can chain commands. | ||||
| func (m *MessageEdit) SetEmbed(embed *MessageEmbed) *MessageEdit { | ||||
| 	m.Embeds = []*MessageEmbed{embed} | ||||
| 	m.Embeds = &[]*MessageEmbed{embed} | ||||
| 	return m | ||||
| } | ||||
| 
 | ||||
| // SetEmbeds is a convenience function for setting the embeds, | ||||
| // so you can chain commands. | ||||
| func (m *MessageEdit) SetEmbeds(embeds []*MessageEmbed) *MessageEdit { | ||||
| 	m.Embeds = embeds | ||||
| 	m.Embeds = &embeds | ||||
| 	return m | ||||
| } | ||||
| 
 | ||||
| @ -460,20 +466,32 @@ type MessageApplication struct { | ||||
| 
 | ||||
| // MessageReference contains reference data sent with crossposted messages | ||||
| type MessageReference struct { | ||||
| 	MessageID string `json:"message_id"` | ||||
| 	ChannelID string `json:"channel_id,omitempty"` | ||||
| 	GuildID   string `json:"guild_id,omitempty"` | ||||
| 	MessageID       string `json:"message_id"` | ||||
| 	ChannelID       string `json:"channel_id,omitempty"` | ||||
| 	GuildID         string `json:"guild_id,omitempty"` | ||||
| 	FailIfNotExists *bool  `json:"fail_if_not_exists,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // Reference returns MessageReference of given message | ||||
| func (m *Message) Reference() *MessageReference { | ||||
| func (m *Message) reference(failIfNotExists bool) *MessageReference { | ||||
| 	return &MessageReference{ | ||||
| 		GuildID:   m.GuildID, | ||||
| 		ChannelID: m.ChannelID, | ||||
| 		MessageID: m.ID, | ||||
| 		GuildID:         m.GuildID, | ||||
| 		ChannelID:       m.ChannelID, | ||||
| 		MessageID:       m.ID, | ||||
| 		FailIfNotExists: &failIfNotExists, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Reference returns a MessageReference of the given message. | ||||
| func (m *Message) Reference() *MessageReference { | ||||
| 	return m.reference(true) | ||||
| } | ||||
| 
 | ||||
| // SoftReference returns a MessageReference of the given message. | ||||
| // If the message doesn't exist it will instead be sent as a non-reply message. | ||||
| func (m *Message) SoftReference() *MessageReference { | ||||
| 	return m.reference(false) | ||||
| } | ||||
| 
 | ||||
| // ContentWithMentionsReplaced will replace all @<id> mentions with the | ||||
| // username of the mention. | ||||
| func (m *Message) ContentWithMentionsReplaced() (content string) { | ||||
|  | ||||
							
								
								
									
										120
									
								
								vendor/github.com/bwmarrin/discordgo/restapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										120
									
								
								vendor/github.com/bwmarrin/discordgo/restapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -424,10 +424,11 @@ func (s *Session) UserGuildMember(guildID string, options ...RequestOption) (st | ||||
| } | ||||
| 
 | ||||
| // UserGuilds returns an array of UserGuild structures for all guilds. | ||||
| // limit     : The number guilds that can be returned. (max 100) | ||||
| // beforeID  : If provided all guilds returned will be before given ID. | ||||
| // afterID   : If provided all guilds returned will be after given ID. | ||||
| func (s *Session) UserGuilds(limit int, beforeID, afterID string, options ...RequestOption) (st []*UserGuild, err error) { | ||||
| // limit       : The number guilds that can be returned. (max 200) | ||||
| // beforeID    : If provided all guilds returned will be before given ID. | ||||
| // afterID     : If provided all guilds returned will be after given ID. | ||||
| // withCounts  : Whether to include approximate member and presence counts or not. | ||||
| func (s *Session) UserGuilds(limit int, beforeID, afterID string, withCounts bool, options ...RequestOption) (st []*UserGuild, err error) { | ||||
| 
 | ||||
| 	v := url.Values{} | ||||
| 
 | ||||
| @ -440,6 +441,9 @@ func (s *Session) UserGuilds(limit int, beforeID, afterID string, options ...Req | ||||
| 	if beforeID != "" { | ||||
| 		v.Set("before", beforeID) | ||||
| 	} | ||||
| 	if withCounts { | ||||
| 		v.Set("with_counts", "true") | ||||
| 	} | ||||
| 
 | ||||
| 	uri := EndpointUserGuilds("@me") | ||||
| 
 | ||||
| @ -672,14 +676,9 @@ func (s *Session) GuildEdit(guildID string, g *GuildParams, options ...RequestOp | ||||
| 
 | ||||
| // GuildDelete deletes a Guild. | ||||
| // guildID   : The ID of a Guild | ||||
| func (s *Session) GuildDelete(guildID string, options ...RequestOption) (st *Guild, err error) { | ||||
| func (s *Session) GuildDelete(guildID string, options ...RequestOption) (err error) { | ||||
| 
 | ||||
| 	body, err := s.RequestWithBucketID("DELETE", EndpointGuild(guildID), nil, EndpointGuild(guildID), options...) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	err = unmarshal(body, &st) | ||||
| 	_, err = s.RequestWithBucketID("DELETE", EndpointGuild(guildID), nil, EndpointGuild(guildID), options...) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| @ -1700,13 +1699,19 @@ func (s *Session) ChannelMessageSendComplex(channelID string, data *MessageSend, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if data.StickerIDs != nil { | ||||
| 		if len(data.StickerIDs) > 3 { | ||||
| 			err = fmt.Errorf("cannot send more than 3 stickers") | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	var response []byte | ||||
| 	if len(files) > 0 { | ||||
| 		contentType, body, encodeErr := MultipartBodyWithJSON(data, files) | ||||
| 		if encodeErr != nil { | ||||
| 			return st, encodeErr | ||||
| 		} | ||||
| 
 | ||||
| 		response, err = s.request("POST", endpoint, contentType, body, endpoint, 0, options...) | ||||
| 	} else { | ||||
| 		response, err = s.RequestWithBucketID("POST", endpoint, data, endpoint, options...) | ||||
| @ -1796,16 +1801,18 @@ func (s *Session) ChannelMessageEditComplex(m *MessageEdit, options ...RequestOp | ||||
| 	// TODO: Remove this when compatibility is not required. | ||||
| 	if m.Embed != nil { | ||||
| 		if m.Embeds == nil { | ||||
| 			m.Embeds = []*MessageEmbed{m.Embed} | ||||
| 			m.Embeds = &[]*MessageEmbed{m.Embed} | ||||
| 		} else { | ||||
| 			err = fmt.Errorf("cannot specify both Embed and Embeds") | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for _, embed := range m.Embeds { | ||||
| 		if embed.Type == "" { | ||||
| 			embed.Type = "rich" | ||||
| 	if m.Embeds != nil { | ||||
| 		for _, embed := range *m.Embeds { | ||||
| 			if embed.Type == "" { | ||||
| 				embed.Type = "rich" | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -2267,7 +2274,7 @@ func (s *Session) WebhookWithToken(webhookID, token string, options ...RequestOp | ||||
| // webhookID: The ID of a webhook. | ||||
| // name     : The name of the webhook. | ||||
| // avatar   : The avatar of the webhook. | ||||
| func (s *Session) WebhookEdit(webhookID, name, avatar, channelID string, options ...RequestOption) (st *Role, err error) { | ||||
| func (s *Session) WebhookEdit(webhookID, name, avatar, channelID string, options ...RequestOption) (st *Webhook, err error) { | ||||
| 
 | ||||
| 	data := struct { | ||||
| 		Name      string `json:"name,omitempty"` | ||||
| @ -2290,14 +2297,15 @@ func (s *Session) WebhookEdit(webhookID, name, avatar, channelID string, options | ||||
| // token    : The auth token for the webhook. | ||||
| // name     : The name of the webhook. | ||||
| // avatar   : The avatar of the webhook. | ||||
| func (s *Session) WebhookEditWithToken(webhookID, token, name, avatar string, options ...RequestOption) (st *Role, err error) { | ||||
| func (s *Session) WebhookEditWithToken(webhookID, token, name, avatar string, options ...RequestOption) (st *Webhook, err error) { | ||||
| 
 | ||||
| 	data := struct { | ||||
| 		Name   string `json:"name,omitempty"` | ||||
| 		Avatar string `json:"avatar,omitempty"` | ||||
| 	}{name, avatar} | ||||
| 
 | ||||
| 	body, err := s.RequestWithBucketID("PATCH", EndpointWebhookToken(webhookID, token), data, EndpointWebhookToken("", ""), options...) | ||||
| 	var body []byte | ||||
| 	body, err = s.RequestWithBucketID("PATCH", EndpointWebhookToken(webhookID, token), data, EndpointWebhookToken("", ""), options...) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| @ -2709,11 +2717,22 @@ func (s *Session) ThreadMemberRemove(threadID, memberID string, options ...Reque | ||||
| 	return err | ||||
| } | ||||
| 
 | ||||
| // ThreadMember returns thread member object for the specified member of a thread | ||||
| func (s *Session) ThreadMember(threadID, memberID string, options ...RequestOption) (member *ThreadMember, err error) { | ||||
| 	endpoint := EndpointThreadMember(threadID, memberID) | ||||
| // ThreadMember returns thread member object for the specified member of a thread. | ||||
| // withMember : Whether to include a guild member object. | ||||
| func (s *Session) ThreadMember(threadID, memberID string, withMember bool, options ...RequestOption) (member *ThreadMember, err error) { | ||||
| 	uri := EndpointThreadMember(threadID, memberID) | ||||
| 
 | ||||
| 	queryParams := url.Values{} | ||||
| 	if withMember { | ||||
| 		queryParams.Set("with_member", "true") | ||||
| 	} | ||||
| 
 | ||||
| 	if len(queryParams) > 0 { | ||||
| 		uri += "?" + queryParams.Encode() | ||||
| 	} | ||||
| 
 | ||||
| 	var body []byte | ||||
| 	body, err = s.RequestWithBucketID("GET", endpoint, nil, endpoint, options...) | ||||
| 	body, err = s.RequestWithBucketID("GET", uri, nil, uri, options...) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return | ||||
| @ -2724,9 +2743,29 @@ func (s *Session) ThreadMember(threadID, memberID string, options ...RequestOpti | ||||
| } | ||||
| 
 | ||||
| // ThreadMembers returns all members of specified thread. | ||||
| func (s *Session) ThreadMembers(threadID string, options ...RequestOption) (members []*ThreadMember, err error) { | ||||
| // limit      : Max number of thread members to return (1-100). Defaults to 100. | ||||
| // afterID    : Get thread members after this user ID. | ||||
| // withMember : Whether to include a guild member object for each thread member. | ||||
| func (s *Session) ThreadMembers(threadID string, limit int, withMember bool, afterID string, options ...RequestOption) (members []*ThreadMember, err error) { | ||||
| 	uri := EndpointThreadMembers(threadID) | ||||
| 
 | ||||
| 	queryParams := url.Values{} | ||||
| 	if withMember { | ||||
| 		queryParams.Set("with_member", "true") | ||||
| 	} | ||||
| 	if limit > 0 { | ||||
| 		queryParams.Set("limit", strconv.Itoa(limit)) | ||||
| 	} | ||||
| 	if afterID != "" { | ||||
| 		queryParams.Set("after", afterID) | ||||
| 	} | ||||
| 
 | ||||
| 	if len(queryParams) > 0 { | ||||
| 		uri += "?" + queryParams.Encode() | ||||
| 	} | ||||
| 
 | ||||
| 	var body []byte | ||||
| 	body, err = s.RequestWithBucketID("GET", EndpointThreadMembers(threadID), nil, EndpointThreadMembers(threadID), options...) | ||||
| 	body, err = s.RequestWithBucketID("GET", uri, nil, uri, options...) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return | ||||
| @ -3248,6 +3287,37 @@ func (s *Session) GuildScheduledEventUsers(guildID, eventID string, limit int, w | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // GuildOnboarding returns onboarding configuration of a guild. | ||||
| // guildID   : The ID of the guild | ||||
| func (s *Session) GuildOnboarding(guildID string, options ...RequestOption) (onboarding *GuildOnboarding, err error) { | ||||
| 	endpoint := EndpointGuildOnboarding(guildID) | ||||
| 
 | ||||
| 	var body []byte | ||||
| 	body, err = s.RequestWithBucketID("GET", endpoint, nil, endpoint, options...) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	err = unmarshal(body, &onboarding) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // GuildOnboardingEdit edits onboarding configuration of a guild. | ||||
| // guildID   : The ID of the guild | ||||
| // o         : New GuildOnboarding data | ||||
| func (s *Session) GuildOnboardingEdit(guildID string, o *GuildOnboarding, options ...RequestOption) (onboarding *GuildOnboarding, err error) { | ||||
| 	endpoint := EndpointGuildOnboarding(guildID) | ||||
| 
 | ||||
| 	var body []byte | ||||
| 	body, err = s.RequestWithBucketID("PUT", endpoint, o, endpoint, options...) | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	err = unmarshal(body, &onboarding) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // ---------------------------------------------------------------------- | ||||
| // Functions specific to auto moderation | ||||
| // ---------------------------------------------------------------------- | ||||
|  | ||||
							
								
								
									
										245
									
								
								vendor/github.com/bwmarrin/discordgo/structs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										245
									
								
								vendor/github.com/bwmarrin/discordgo/structs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -42,6 +42,9 @@ type Session struct { | ||||
| 	// Should the session reconnect the websocket on errors. | ||||
| 	ShouldReconnectOnError bool | ||||
| 
 | ||||
| 	// Should voice connections reconnect on a session reconnect. | ||||
| 	ShouldReconnectVoiceOnSessionError bool | ||||
| 
 | ||||
| 	// Should the session retry requests when rate limited. | ||||
| 	ShouldRetryOnRateLimit bool | ||||
| 
 | ||||
| @ -285,7 +288,9 @@ const ( | ||||
| 	ChannelTypeGuildPublicThread  ChannelType = 11 | ||||
| 	ChannelTypeGuildPrivateThread ChannelType = 12 | ||||
| 	ChannelTypeGuildStageVoice    ChannelType = 13 | ||||
| 	ChannelTypeGuildDirectory     ChannelType = 14 | ||||
| 	ChannelTypeGuildForum         ChannelType = 15 | ||||
| 	ChannelTypeGuildMedia         ChannelType = 16 | ||||
| ) | ||||
| 
 | ||||
| // ChannelFlags represent flags of a channel/thread. | ||||
| @ -440,7 +445,7 @@ type ChannelEdit struct { | ||||
| 	Name                          string                 `json:"name,omitempty"` | ||||
| 	Topic                         string                 `json:"topic,omitempty"` | ||||
| 	NSFW                          *bool                  `json:"nsfw,omitempty"` | ||||
| 	Position                      int                    `json:"position"` | ||||
| 	Position                      *int                   `json:"position,omitempty"` | ||||
| 	Bitrate                       int                    `json:"bitrate,omitempty"` | ||||
| 	UserLimit                     int                    `json:"user_limit,omitempty"` | ||||
| 	PermissionOverwrites          []*PermissionOverwrite `json:"permission_overwrites,omitempty"` | ||||
| @ -528,6 +533,10 @@ type ThreadMember struct { | ||||
| 	JoinTimestamp time.Time `json:"join_timestamp"` | ||||
| 	// Any user-thread settings, currently only used for notifications | ||||
| 	Flags int `json:"flags"` | ||||
| 	// Additional information about the user. | ||||
| 	// NOTE: only present if the withMember parameter is set to true | ||||
| 	// when calling Session.ThreadMembers or Session.ThreadMember. | ||||
| 	Member *Member `json:"member,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // ThreadsList represents a list of threads alongisde with thread member objects for the current user. | ||||
| @ -649,6 +658,13 @@ type Sticker struct { | ||||
| 	SortValue   int           `json:"sort_value"` | ||||
| } | ||||
| 
 | ||||
| // StickerItem represents the smallest amount of data required to render a sticker. A partial sticker object. | ||||
| type StickerItem struct { | ||||
| 	ID         string        `json:"id"` | ||||
| 	Name       string        `json:"name"` | ||||
| 	FormatType StickerFormat `json:"format_type"` | ||||
| } | ||||
| 
 | ||||
| // StickerPack represents a pack of standard stickers. | ||||
| type StickerPack struct { | ||||
| 	ID             string     `json:"id"` | ||||
| @ -1067,6 +1083,109 @@ type GuildScheduledEventUser struct { | ||||
| 	Member                *Member `json:"member"` | ||||
| } | ||||
| 
 | ||||
| // GuildOnboardingMode defines the criteria used to satisfy constraints that are required for enabling onboarding. | ||||
| // https://discord.com/developers/docs/resources/guild#guild-onboarding-object-onboarding-mode | ||||
| type GuildOnboardingMode int | ||||
| 
 | ||||
| // Block containing known GuildOnboardingMode values. | ||||
| const ( | ||||
| 	// GuildOnboardingModeDefault counts default channels towards constraints. | ||||
| 	GuildOnboardingModeDefault GuildOnboardingMode = 0 | ||||
| 	// GuildOnboardingModeAdvanced counts default channels and questions towards constraints. | ||||
| 	GuildOnboardingModeAdvanced GuildOnboardingMode = 1 | ||||
| ) | ||||
| 
 | ||||
| // GuildOnboarding represents the onboarding flow for a guild. | ||||
| // https://discord.com/developers/docs/resources/guild#guild-onboarding-object | ||||
| type GuildOnboarding struct { | ||||
| 	// ID of the guild this onboarding flow is part of. | ||||
| 	GuildID string `json:"guild_id,omitempty"` | ||||
| 
 | ||||
| 	// Prompts shown during onboarding and in the customize community (Channels & Roles) tab. | ||||
| 	Prompts *[]GuildOnboardingPrompt `json:"prompts,omitempty"` | ||||
| 
 | ||||
| 	// Channel IDs that members get opted into automatically. | ||||
| 	DefaultChannelIDs []string `json:"default_channel_ids,omitempty"` | ||||
| 
 | ||||
| 	// Whether onboarding is enabled in the guild. | ||||
| 	Enabled *bool `json:"enabled,omitempty"` | ||||
| 
 | ||||
| 	// Mode of onboarding. | ||||
| 	Mode *GuildOnboardingMode `json:"mode,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // GuildOnboardingPromptType is the type of an onboarding prompt. | ||||
| // https://discord.com/developers/docs/resources/guild#guild-onboarding-object-prompt-types | ||||
| type GuildOnboardingPromptType int | ||||
| 
 | ||||
| // Block containing known GuildOnboardingPromptType values. | ||||
| const ( | ||||
| 	GuildOnboardingPromptTypeMultipleChoice GuildOnboardingPromptType = 0 | ||||
| 	GuildOnboardingPromptTypeDropdown       GuildOnboardingPromptType = 1 | ||||
| ) | ||||
| 
 | ||||
| // GuildOnboardingPrompt is a prompt shown during onboarding and in the customize community (Channels & Roles) tab. | ||||
| // https://discord.com/developers/docs/resources/guild#guild-onboarding-object-onboarding-prompt-structure | ||||
| type GuildOnboardingPrompt struct { | ||||
| 	// ID of the prompt. | ||||
| 	// NOTE: always requires to be a valid snowflake (e.g. "0"), see | ||||
| 	// https://github.com/discord/discord-api-docs/issues/6320 for more information. | ||||
| 	ID string `json:"id,omitempty"` | ||||
| 
 | ||||
| 	// Type of the prompt. | ||||
| 	Type GuildOnboardingPromptType `json:"type"` | ||||
| 
 | ||||
| 	// Options available within the prompt. | ||||
| 	Options []GuildOnboardingPromptOption `json:"options"` | ||||
| 
 | ||||
| 	// Title of the prompt. | ||||
| 	Title string `json:"title"` | ||||
| 
 | ||||
| 	// Indicates whether users are limited to selecting one option for the prompt. | ||||
| 	SingleSelect bool `json:"single_select"` | ||||
| 
 | ||||
| 	// Indicates whether the prompt is required before a user completes the onboarding flow. | ||||
| 	Required bool `json:"required"` | ||||
| 
 | ||||
| 	// Indicates whether the prompt is present in the onboarding flow. | ||||
| 	// If false, the prompt will only appear in the customize community (Channels & Roles) tab. | ||||
| 	InOnboarding bool `json:"in_onboarding"` | ||||
| } | ||||
| 
 | ||||
| // GuildOnboardingPromptOption is an option available within an onboarding prompt. | ||||
| // https://discord.com/developers/docs/resources/guild#guild-onboarding-object-prompt-option-structure | ||||
| type GuildOnboardingPromptOption struct { | ||||
| 	// ID of the prompt option. | ||||
| 	ID string `json:"id,omitempty"` | ||||
| 
 | ||||
| 	// IDs for channels a member is added to when the option is selected. | ||||
| 	ChannelIDs []string `json:"channel_ids"` | ||||
| 
 | ||||
| 	// IDs for roles assigned to a member when the option is selected. | ||||
| 	RoleIDs []string `json:"role_ids"` | ||||
| 
 | ||||
| 	// Emoji of the option. | ||||
| 	// NOTE: when creating or updating a prompt option | ||||
| 	// EmojiID, EmojiName and EmojiAnimated should be used instead. | ||||
| 	Emoji *Emoji `json:"emoji,omitempty"` | ||||
| 
 | ||||
| 	// Title of the option. | ||||
| 	Title string `json:"title"` | ||||
| 
 | ||||
| 	// Description of the option. | ||||
| 	Description string `json:"description"` | ||||
| 
 | ||||
| 	// ID of the option's emoji. | ||||
| 	// NOTE: only used when creating or updating a prompt option. | ||||
| 	EmojiID string `json:"emoji_id,omitempty"` | ||||
| 	// Name of the option's emoji. | ||||
| 	// NOTE: only used when creating or updating a prompt option. | ||||
| 	EmojiName string `json:"emoji_name,omitempty"` | ||||
| 	// Whether the option's emoji is animated. | ||||
| 	// NOTE: only used when creating or updating a prompt option. | ||||
| 	EmojiAnimated *bool `json:"emoji_animated,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // A GuildTemplate represents a replicable template for guild creation | ||||
| type GuildTemplate struct { | ||||
| 	// The unique code for the guild template | ||||
| @ -1157,6 +1276,14 @@ type UserGuild struct { | ||||
| 	Owner       bool           `json:"owner"` | ||||
| 	Permissions int64          `json:"permissions,string"` | ||||
| 	Features    []GuildFeature `json:"features"` | ||||
| 
 | ||||
| 	// Approximate number of members in this guild. | ||||
| 	// NOTE: this field is only filled when withCounts is true. | ||||
| 	ApproximateMemberCount int `json:"approximate_member_count"` | ||||
| 
 | ||||
| 	// Approximate number of non-offline members in this guild. | ||||
| 	// NOTE: this field is only filled when withCounts is true. | ||||
| 	ApproximatePresenceCount int `json:"approximate_presence_count"` | ||||
| } | ||||
| 
 | ||||
| // GuildFeature indicates the presence of a feature in a guild | ||||
| @ -1239,13 +1366,51 @@ type Role struct { | ||||
| 	// This is a combination of bit masks; the presence of a certain permission can | ||||
| 	// be checked by performing a bitwise AND between this int and the permission. | ||||
| 	Permissions int64 `json:"permissions,string"` | ||||
| 
 | ||||
| 	// The hash of the role icon. Use Role.IconURL to retrieve the icon's URL. | ||||
| 	Icon string `json:"icon"` | ||||
| 
 | ||||
| 	// The emoji assigned to this role. | ||||
| 	UnicodeEmoji string `json:"unicode_emoji"` | ||||
| 
 | ||||
| 	// The flags of the role, which describe its extra features. | ||||
| 	// This is a combination of bit masks; the presence of a certain flag can | ||||
| 	// be checked by performing a bitwise AND between this int and the flag. | ||||
| 	Flags RoleFlags `json:"flags"` | ||||
| } | ||||
| 
 | ||||
| // RoleFlags represent the flags of a Role. | ||||
| // https://discord.com/developers/docs/topics/permissions#role-object-role-flags | ||||
| type RoleFlags int | ||||
| 
 | ||||
| // Block containing known RoleFlags values. | ||||
| const ( | ||||
| 	// RoleFlagInPrompt indicates whether the Role is selectable by members in an onboarding prompt. | ||||
| 	RoleFlagInPrompt RoleFlags = 1 << 0 | ||||
| ) | ||||
| 
 | ||||
| // Mention returns a string which mentions the role | ||||
| func (r *Role) Mention() string { | ||||
| 	return fmt.Sprintf("<@&%s>", r.ID) | ||||
| } | ||||
| 
 | ||||
| // IconURL returns the URL of the role's icon. | ||||
| // | ||||
| //	size:    The size of the desired role icon as a power of two | ||||
| //	         Image size can be any power of two between 16 and 4096. | ||||
| func (r *Role) IconURL(size string) string { | ||||
| 	if r.Icon == "" { | ||||
| 		return "" | ||||
| 	} | ||||
| 
 | ||||
| 	URL := EndpointRoleIcon(r.ID, r.Icon) | ||||
| 
 | ||||
| 	if size != "" { | ||||
| 		return URL + "?size=" + size | ||||
| 	} | ||||
| 	return URL | ||||
| } | ||||
| 
 | ||||
| // RoleParams represents the parameters needed to create or update a Role | ||||
| type RoleParams struct { | ||||
| 	// The role's name | ||||
| @ -1258,6 +1423,12 @@ type RoleParams struct { | ||||
| 	Permissions *int64 `json:"permissions,omitempty,string"` | ||||
| 	// Whether this role is mentionable | ||||
| 	Mentionable *bool `json:"mentionable,omitempty"` | ||||
| 	// The role's unicode emoji. | ||||
| 	// NOTE: can only be set if the guild has the ROLE_ICONS feature. | ||||
| 	UnicodeEmoji *string `json:"unicode_emoji,omitempty"` | ||||
| 	// The role's icon image encoded in base64. | ||||
| 	// NOTE: can only be set if the guild has the ROLE_ICONS feature. | ||||
| 	Icon *string `json:"icon,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // Roles are a collection of Role | ||||
| @ -1330,6 +1501,22 @@ type Assets struct { | ||||
| 	SmallText    string `json:"small_text,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // MemberFlags represent flags of a guild member. | ||||
| // https://discord.com/developers/docs/resources/guild#guild-member-object-guild-member-flags | ||||
| type MemberFlags int | ||||
| 
 | ||||
| // Block containing known MemberFlags values. | ||||
| const ( | ||||
| 	// MemberFlagDidRejoin indicates whether the Member has left and rejoined the guild. | ||||
| 	MemberFlagDidRejoin MemberFlags = 1 << 0 | ||||
| 	// MemberFlagCompletedOnboarding indicates whether the Member has completed onboarding. | ||||
| 	MemberFlagCompletedOnboarding MemberFlags = 1 << 1 | ||||
| 	// MemberFlagBypassesVerification indicates whether the Member is exempt from guild verification requirements. | ||||
| 	MemberFlagBypassesVerification MemberFlags = 1 << 2 | ||||
| 	// MemberFlagStartedOnboarding indicates whether the Member has started onboarding. | ||||
| 	MemberFlagStartedOnboarding MemberFlags = 1 << 3 | ||||
| ) | ||||
| 
 | ||||
| // A Member stores user information for Guild members. A guild | ||||
| // member represents a certain user's presence in a guild. | ||||
| type Member struct { | ||||
| @ -1360,6 +1547,10 @@ type Member struct { | ||||
| 	// When the user used their Nitro boost on the server | ||||
| 	PremiumSince *time.Time `json:"premium_since"` | ||||
| 
 | ||||
| 	// The flags of this member. This is a combination of bit masks; the presence of a certain | ||||
| 	// flag can be checked by performing a bitwise AND between this int and the flag. | ||||
| 	Flags MemberFlags `json:"flags"` | ||||
| 
 | ||||
| 	// Is true while the member hasn't accepted the membership screen. | ||||
| 	Pending bool `json:"pending"` | ||||
| 
 | ||||
| @ -1391,6 +1582,15 @@ func (m *Member) AvatarURL(size string) string { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // DisplayName returns the member's guild nickname if they have one, | ||||
| // otherwise it returns their discord display name. | ||||
| func (m *Member) DisplayName() string { | ||||
| 	if m.Nick != "" { | ||||
| 		return m.Nick | ||||
| 	} | ||||
| 	return m.User.GlobalName | ||||
| } | ||||
| 
 | ||||
| // ClientStatus stores the online, offline, idle, or dnd status of each device of a Guild member. | ||||
| type ClientStatus struct { | ||||
| 	Desktop Status `json:"desktop"` | ||||
| @ -1738,14 +1938,18 @@ const ( | ||||
| // AuditLogOptions optional data for the AuditLog | ||||
| // https://discord.com/developers/docs/resources/audit-log#audit-log-entry-object-optional-audit-entry-info | ||||
| type AuditLogOptions struct { | ||||
| 	DeleteMemberDays string               `json:"delete_member_days"` | ||||
| 	MembersRemoved   string               `json:"members_removed"` | ||||
| 	ChannelID        string               `json:"channel_id"` | ||||
| 	MessageID        string               `json:"message_id"` | ||||
| 	Count            string               `json:"count"` | ||||
| 	ID               string               `json:"id"` | ||||
| 	Type             *AuditLogOptionsType `json:"type"` | ||||
| 	RoleName         string               `json:"role_name"` | ||||
| 	DeleteMemberDays              string               `json:"delete_member_days"` | ||||
| 	MembersRemoved                string               `json:"members_removed"` | ||||
| 	ChannelID                     string               `json:"channel_id"` | ||||
| 	MessageID                     string               `json:"message_id"` | ||||
| 	Count                         string               `json:"count"` | ||||
| 	ID                            string               `json:"id"` | ||||
| 	Type                          *AuditLogOptionsType `json:"type"` | ||||
| 	RoleName                      string               `json:"role_name"` | ||||
| 	ApplicationID                 string               `json:"application_id"` | ||||
| 	AutoModerationRuleName        string               `json:"auto_moderation_rule_name"` | ||||
| 	AutoModerationRuleTriggerType string               `json:"auto_moderation_rule_trigger_type"` | ||||
| 	IntegrationType               string               `json:"integration_type"` | ||||
| } | ||||
| 
 | ||||
| // AuditLogOptionsType of the AuditLogOption | ||||
| @ -1754,8 +1958,8 @@ type AuditLogOptionsType string | ||||
| 
 | ||||
| // Valid Types for AuditLogOptionsType | ||||
| const ( | ||||
| 	AuditLogOptionsTypeMember AuditLogOptionsType = "member" | ||||
| 	AuditLogOptionsTypeRole   AuditLogOptionsType = "role" | ||||
| 	AuditLogOptionsTypeRole   AuditLogOptionsType = "0" | ||||
| 	AuditLogOptionsTypeMember AuditLogOptionsType = "1" | ||||
| ) | ||||
| 
 | ||||
| // AuditLogAction is the Action of the AuditLog (see AuditLogAction* consts) | ||||
| @ -1816,7 +2020,7 @@ const ( | ||||
| 	AuditLogActionStickerDelete AuditLogAction = 92 | ||||
| 
 | ||||
| 	AuditLogGuildScheduledEventCreate AuditLogAction = 100 | ||||
| 	AuditLogGuildScheduledEventUpdare AuditLogAction = 101 | ||||
| 	AuditLogGuildScheduledEventUpdate AuditLogAction = 101 | ||||
| 	AuditLogGuildScheduledEventDelete AuditLogAction = 102 | ||||
| 
 | ||||
| 	AuditLogActionThreadCreate AuditLogAction = 110 | ||||
| @ -1824,6 +2028,16 @@ const ( | ||||
| 	AuditLogActionThreadDelete AuditLogAction = 112 | ||||
| 
 | ||||
| 	AuditLogActionApplicationCommandPermissionUpdate AuditLogAction = 121 | ||||
| 
 | ||||
| 	AuditLogActionAutoModerationRuleCreate                AuditLogAction = 140 | ||||
| 	AuditLogActionAutoModerationRuleUpdate                AuditLogAction = 141 | ||||
| 	AuditLogActionAutoModerationRuleDelete                AuditLogAction = 142 | ||||
| 	AuditLogActionAutoModerationBlockMessage              AuditLogAction = 143 | ||||
| 	AuditLogActionAutoModerationFlagToChannel             AuditLogAction = 144 | ||||
| 	AuditLogActionAutoModerationUserCommunicationDisabled AuditLogAction = 145 | ||||
| 
 | ||||
| 	AuditLogActionCreatorMonetizationRequestCreated AuditLogAction = 150 | ||||
| 	AuditLogActionCreatorMonetizationTermsAccepted  AuditLogAction = 151 | ||||
| ) | ||||
| 
 | ||||
| // GuildMemberParams stores data needed to update a member | ||||
| @ -2341,6 +2555,9 @@ const ( | ||||
| 
 | ||||
| 	ErrCodeCannotUpdateAFinishedEvent             = 180000 | ||||
| 	ErrCodeFailedToCreateStageNeededForStageEvent = 180002 | ||||
| 
 | ||||
| 	ErrCodeCannotEnableOnboardingRequirementsAreNotMet  = 350000 | ||||
| 	ErrCodeCannotUpdateOnboardingWhileBelowRequirements = 350001 | ||||
| ) | ||||
| 
 | ||||
| // Intent is the type of a Gateway Intent | ||||
| @ -2351,7 +2568,7 @@ type Intent int | ||||
| const ( | ||||
| 	IntentGuilds                      Intent = 1 << 0 | ||||
| 	IntentGuildMembers                Intent = 1 << 1 | ||||
| 	IntentGuildBans                   Intent = 1 << 2 | ||||
| 	IntentGuildModeration             Intent = 1 << 2 | ||||
| 	IntentGuildEmojis                 Intent = 1 << 3 | ||||
| 	IntentGuildIntegrations           Intent = 1 << 4 | ||||
| 	IntentGuildWebhooks               Intent = 1 << 5 | ||||
| @ -2371,6 +2588,8 @@ const ( | ||||
| 
 | ||||
| 	// TODO: remove when compatibility is not needed | ||||
| 
 | ||||
| 	IntentGuildBans Intent = IntentGuildModeration | ||||
| 
 | ||||
| 	IntentsGuilds                 Intent = 1 << 0 | ||||
| 	IntentsGuildMembers           Intent = 1 << 1 | ||||
| 	IntentsGuildBans              Intent = 1 << 2 | ||||
|  | ||||
							
								
								
									
										63
									
								
								vendor/github.com/bwmarrin/discordgo/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/bwmarrin/discordgo/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +1,9 @@ | ||||
| package discordgo | ||||
| 
 | ||||
| import ( | ||||
| 	"strconv" | ||||
| ) | ||||
| 
 | ||||
| // UserFlags is the flags of "user" (see UserFlags* consts) | ||||
| // https://discord.com/developers/docs/resources/user#user-object-user-flags | ||||
| type UserFlags int | ||||
| @ -20,6 +24,20 @@ const ( | ||||
| 	UserFlagVerifiedBot               UserFlags = 1 << 16 | ||||
| 	UserFlagVerifiedBotDeveloper      UserFlags = 1 << 17 | ||||
| 	UserFlagDiscordCertifiedModerator UserFlags = 1 << 18 | ||||
| 	UserFlagBotHTTPInteractions       UserFlags = 1 << 19 | ||||
| 	UserFlagActiveBotDeveloper        UserFlags = 1 << 22 | ||||
| ) | ||||
| 
 | ||||
| // UserPremiumType is the type of premium (nitro) subscription a user has (see UserPremiumType* consts). | ||||
| // https://discord.com/developers/docs/resources/user#user-object-premium-types | ||||
| type UserPremiumType int | ||||
| 
 | ||||
| // Valid UserPremiumType values. | ||||
| const ( | ||||
| 	UserPremiumTypeNone         UserPremiumType = 0 | ||||
| 	UserPremiumTypeNitroClassic UserPremiumType = 1 | ||||
| 	UserPremiumTypeNitro        UserPremiumType = 2 | ||||
| 	UserPremiumTypeNitroBasic   UserPremiumType = 3 | ||||
| ) | ||||
| 
 | ||||
| // A User stores all data for an individual Discord user. | ||||
| @ -44,6 +62,10 @@ type User struct { | ||||
| 	// The discriminator of the user (4 numbers after name). | ||||
| 	Discriminator string `json:"discriminator"` | ||||
| 
 | ||||
| 	// The user's display name, if it is set. | ||||
| 	// For bots, this is the application name. | ||||
| 	GlobalName string `json:"global_name"` | ||||
| 
 | ||||
| 	// The token of the user. This is only present for | ||||
| 	// the user represented by the current session. | ||||
| 	Token string `json:"token"` | ||||
| @ -70,7 +92,7 @@ type User struct { | ||||
| 
 | ||||
| 	// The type of Nitro subscription on a user's account. | ||||
| 	// Only available when the request is authorized via a Bearer token. | ||||
| 	PremiumType int `json:"premium_type"` | ||||
| 	PremiumType UserPremiumType `json:"premium_type"` | ||||
| 
 | ||||
| 	// Whether the user is an Official Discord System user (part of the urgent message system). | ||||
| 	System bool `json:"system"` | ||||
| @ -81,7 +103,14 @@ type User struct { | ||||
| } | ||||
| 
 | ||||
| // String returns a unique identifier of the form username#discriminator | ||||
| // or just username, if the discriminator is set to "0". | ||||
| func (u *User) String() string { | ||||
| 	// If the user has been migrated from the legacy username system, their discriminator is "0". | ||||
| 	// See https://support-dev.discord.com/hc/en-us/articles/13667755828631 | ||||
| 	if u.Discriminator == "0" { | ||||
| 		return u.Username | ||||
| 	} | ||||
| 
 | ||||
| 	return u.Username + "#" + u.Discriminator | ||||
| } | ||||
| 
 | ||||
| @ -91,17 +120,35 @@ func (u *User) Mention() string { | ||||
| } | ||||
| 
 | ||||
| // AvatarURL returns a URL to the user's avatar. | ||||
| //    size:    The size of the user's avatar as a power of two | ||||
| //             if size is an empty string, no size parameter will | ||||
| //             be added to the URL. | ||||
| // | ||||
| //	size:    The size of the user's avatar as a power of two | ||||
| //	         if size is an empty string, no size parameter will | ||||
| //	         be added to the URL. | ||||
| func (u *User) AvatarURL(size string) string { | ||||
| 	return avatarURL(u.Avatar, EndpointDefaultUserAvatar(u.Discriminator), | ||||
| 		EndpointUserAvatar(u.ID, u.Avatar), EndpointUserAvatarAnimated(u.ID, u.Avatar), size) | ||||
| 	return avatarURL( | ||||
| 		u.Avatar, | ||||
| 		EndpointDefaultUserAvatar(u.DefaultAvatarIndex()), | ||||
| 		EndpointUserAvatar(u.ID, u.Avatar), | ||||
| 		EndpointUserAvatarAnimated(u.ID, u.Avatar), | ||||
| 		size, | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| // BannerURL returns the URL of the users's banner image. | ||||
| //    size:    The size of the desired banner image as a power of two | ||||
| //             Image size can be any power of two between 16 and 4096. | ||||
| // | ||||
| //	size:    The size of the desired banner image as a power of two | ||||
| //	         Image size can be any power of two between 16 and 4096. | ||||
| func (u *User) BannerURL(size string) string { | ||||
| 	return bannerURL(u.Banner, EndpointUserBanner(u.ID, u.Banner), EndpointUserBannerAnimated(u.ID, u.Banner), size) | ||||
| } | ||||
| 
 | ||||
| // DefaultAvatarIndex returns the index of the user's default avatar. | ||||
| func (u *User) DefaultAvatarIndex() int { | ||||
| 	if u.Discriminator == "0" { | ||||
| 		id, _ := strconv.ParseUint(u.ID, 10, 64) | ||||
| 		return int((id >> 22) % 6) | ||||
| 	} | ||||
| 
 | ||||
| 	id, _ := strconv.Atoi(u.Discriminator) | ||||
| 	return id % 5 | ||||
| } | ||||
|  | ||||
							
								
								
									
										6
									
								
								vendor/github.com/bwmarrin/discordgo/voice.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/bwmarrin/discordgo/voice.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -76,7 +76,7 @@ type VoiceSpeakingUpdateHandler func(vc *VoiceConnection, vs *VoiceSpeakingUpdat | ||||
| // Speaking sends a speaking notification to Discord over the voice websocket. | ||||
| // This must be sent as true prior to sending audio and should be set to false | ||||
| // once finished sending audio. | ||||
| //  b  : Send true if speaking, false if not. | ||||
| // b : Send true if speaking, false if not. | ||||
| func (v *VoiceConnection) Speaking(b bool) (err error) { | ||||
| 
 | ||||
| 	v.log(LogDebug, "called (%t)", b) | ||||
| @ -294,11 +294,15 @@ func (v *VoiceConnection) open() (err error) { | ||||
| 		if v.sessionID != "" { | ||||
| 			break | ||||
| 		} | ||||
| 
 | ||||
| 		if i > 20 { // only loop for up to 1 second total | ||||
| 			return fmt.Errorf("did not receive voice Session ID in time") | ||||
| 		} | ||||
| 		// Release the lock, so sessionID can be populated upon receiving a VoiceStateUpdate event. | ||||
| 		v.Unlock() | ||||
| 		time.Sleep(50 * time.Millisecond) | ||||
| 		i++ | ||||
| 		v.Lock() | ||||
| 	} | ||||
| 
 | ||||
| 	// Connect to VoiceConnection Websocket | ||||
|  | ||||
							
								
								
									
										5
									
								
								vendor/github.com/bwmarrin/discordgo/webhook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/bwmarrin/discordgo/webhook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -34,10 +34,14 @@ type WebhookParams struct { | ||||
| 	Files           []*File                 `json:"-"` | ||||
| 	Components      []MessageComponent      `json:"components"` | ||||
| 	Embeds          []*MessageEmbed         `json:"embeds,omitempty"` | ||||
| 	Attachments     []*MessageAttachment    `json:"attachments,omitempty"` | ||||
| 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||
| 	// Only MessageFlagsSuppressEmbeds and MessageFlagsEphemeral can be set. | ||||
| 	// MessageFlagsEphemeral can only be set when using Followup Message Create endpoint. | ||||
| 	Flags MessageFlags `json:"flags,omitempty"` | ||||
| 	// Name of the thread to create. | ||||
| 	// NOTE: can only be set if the webhook channel is a forum. | ||||
| 	ThreadName string `json:"thread_name,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // WebhookEdit stores data for editing of a webhook message. | ||||
| @ -46,5 +50,6 @@ type WebhookEdit struct { | ||||
| 	Components      *[]MessageComponent     `json:"components,omitempty"` | ||||
| 	Embeds          *[]*MessageEmbed        `json:"embeds,omitempty"` | ||||
| 	Files           []*File                 `json:"-"` | ||||
| 	Attachments     *[]*MessageAttachment   `json:"attachments,omitempty"` | ||||
| 	AllowedMentions *MessageAllowedMentions `json:"allowed_mentions,omitempty"` | ||||
| } | ||||
|  | ||||
							
								
								
									
										39
									
								
								vendor/github.com/bwmarrin/discordgo/wsapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/bwmarrin/discordgo/wsapi.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -389,6 +389,26 @@ func (s *Session) UpdateListeningStatus(name string) (err error) { | ||||
| 	return s.UpdateStatusComplex(*newUpdateStatusData(0, ActivityTypeListening, name, "")) | ||||
| } | ||||
| 
 | ||||
| // UpdateCustomStatus is used to update the user's custom status. | ||||
| // If state!="" then set the custom status. | ||||
| // Else, set user to active and remove the custom status. | ||||
| func (s *Session) UpdateCustomStatus(state string) (err error) { | ||||
| 	data := UpdateStatusData{ | ||||
| 		Status: "online", | ||||
| 	} | ||||
| 
 | ||||
| 	if state != "" { | ||||
| 		// Discord requires a non-empty activity name, therefore we provide "Custom Status" as a placeholder. | ||||
| 		data.Activities = []*Activity{{ | ||||
| 			Name:  "Custom Status", | ||||
| 			Type:  ActivityTypeCustom, | ||||
| 			State: state, | ||||
| 		}} | ||||
| 	} | ||||
| 
 | ||||
| 	return s.UpdateStatusComplex(data) | ||||
| } | ||||
| 
 | ||||
| // UpdateStatusComplex allows for sending the raw status update data untouched by discordgo. | ||||
| func (s *Session) UpdateStatusComplex(usd UpdateStatusData) (err error) { | ||||
| 	// The comment does say "untouched by discordgo", but we might need to lie a bit here. | ||||
| @ -862,17 +882,18 @@ func (s *Session) reconnect() { | ||||
| 				// However, there seems to be cases where something "weird" | ||||
| 				// happens.  So we're doing this for now just to improve | ||||
| 				// stability in those edge cases. | ||||
| 				s.RLock() | ||||
| 				defer s.RUnlock() | ||||
| 				for _, v := range s.VoiceConnections { | ||||
| 				if s.ShouldReconnectVoiceOnSessionError { | ||||
| 					s.RLock() | ||||
| 					defer s.RUnlock() | ||||
| 					for _, v := range s.VoiceConnections { | ||||
| 
 | ||||
| 					s.log(LogInformational, "reconnecting voice connection to guild %s", v.GuildID) | ||||
| 					go v.reconnect() | ||||
| 
 | ||||
| 					// This is here just to prevent violently spamming the | ||||
| 					// voice reconnects | ||||
| 					time.Sleep(1 * time.Second) | ||||
| 						s.log(LogInformational, "reconnecting voice connection to guild %s", v.GuildID) | ||||
| 						go v.reconnect() | ||||
| 
 | ||||
| 						// This is here just to prevent violently spamming the | ||||
| 						// voice reconnects | ||||
| 						time.Sleep(1 * time.Second) | ||||
| 					} | ||||
| 				} | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/github.com/d5/tengo/v2/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/d5/tengo/v2/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +1,3 @@ | ||||
| dist/ | ||||
| dist/ | ||||
| 
 | ||||
| .idea | ||||
							
								
								
									
										6
									
								
								vendor/github.com/d5/tengo/v2/instructions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/d5/tengo/v2/instructions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -28,6 +28,12 @@ func MakeInstruction(opcode parser.Opcode, operands ...int) []byte { | ||||
| 			n := uint16(o) | ||||
| 			instruction[offset] = byte(n >> 8) | ||||
| 			instruction[offset+1] = byte(n) | ||||
| 		case 4: | ||||
| 			n := uint32(o) | ||||
| 			instruction[offset] = byte(n >> 24) | ||||
| 			instruction[offset+1] = byte(n >> 16) | ||||
| 			instruction[offset+2] = byte(n >> 8) | ||||
| 			instruction[offset+3] = byte(n) | ||||
| 		} | ||||
| 		offset += width | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/d5/tengo/v2/parser/expr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/d5/tengo/v2/parser/expr.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -351,7 +351,7 @@ func (e *ImportExpr) End() Pos { | ||||
| } | ||||
| 
 | ||||
| func (e *ImportExpr) String() string { | ||||
| 	return `import("` + e.ModuleName + `")"` | ||||
| 	return `import("` + e.ModuleName + `")` | ||||
| } | ||||
| 
 | ||||
| // IndexExpr represents an index expression. | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/github.com/d5/tengo/v2/parser/opcodes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/d5/tengo/v2/parser/opcodes.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -106,10 +106,10 @@ var OpcodeOperands = [...][]int{ | ||||
| 	OpNotEqual:      {}, | ||||
| 	OpMinus:         {}, | ||||
| 	OpLNot:          {}, | ||||
| 	OpJumpFalsy:     {2}, | ||||
| 	OpAndJump:       {2}, | ||||
| 	OpOrJump:        {2}, | ||||
| 	OpJump:          {2}, | ||||
| 	OpJumpFalsy:     {4}, | ||||
| 	OpAndJump:       {4}, | ||||
| 	OpOrJump:        {4}, | ||||
| 	OpJump:          {4}, | ||||
| 	OpNull:          {}, | ||||
| 	OpGetGlobal:     {2}, | ||||
| 	OpSetGlobal:     {2}, | ||||
| @ -149,6 +149,8 @@ func ReadOperands(numOperands []int, ins []byte) (operands []int, offset int) { | ||||
| 			operands = append(operands, int(ins[offset])) | ||||
| 		case 2: | ||||
| 			operands = append(operands, int(ins[offset+1])|int(ins[offset])<<8) | ||||
| 		case 4: | ||||
| 			operands = append(operands, int(ins[offset+3])|int(ins[offset+2])<<8|int(ins[offset+1])<<16|int(ins[offset])<<24) | ||||
| 		} | ||||
| 		offset += width | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										3
									
								
								vendor/github.com/d5/tengo/v2/stdlib/os.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/d5/tengo/v2/stdlib/os.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -6,11 +6,14 @@ import ( | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"runtime" | ||||
| 
 | ||||
| 	"github.com/d5/tengo/v2" | ||||
| ) | ||||
| 
 | ||||
| var osModule = map[string]tengo.Object{ | ||||
| 	"platform":            &tengo.String{Value: runtime.GOOS}, | ||||
| 	"arch":                &tengo.String{Value: runtime.GOARCH}, | ||||
| 	"o_rdonly":            &tengo.Int{Value: int64(os.O_RDONLY)}, | ||||
| 	"o_wronly":            &tengo.Int{Value: int64(os.O_WRONLY)}, | ||||
| 	"o_rdwr":              &tengo.Int{Value: int64(os.O_RDWR)}, | ||||
|  | ||||
							
								
								
									
										17
									
								
								vendor/github.com/d5/tengo/v2/vm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/d5/tengo/v2/vm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -218,30 +218,30 @@ func (v *VM) run() { | ||||
| 				return | ||||
| 			} | ||||
| 		case parser.OpJumpFalsy: | ||||
| 			v.ip += 2 | ||||
| 			v.ip += 4 | ||||
| 			v.sp-- | ||||
| 			if v.stack[v.sp].IsFalsy() { | ||||
| 				pos := int(v.curInsts[v.ip]) | int(v.curInsts[v.ip-1])<<8 | ||||
| 				pos := int(v.curInsts[v.ip]) | int(v.curInsts[v.ip-1])<<8 | int(v.curInsts[v.ip-2])<<16 | int(v.curInsts[v.ip-3])<<24 | ||||
| 				v.ip = pos - 1 | ||||
| 			} | ||||
| 		case parser.OpAndJump: | ||||
| 			v.ip += 2 | ||||
| 			v.ip += 4 | ||||
| 			if v.stack[v.sp-1].IsFalsy() { | ||||
| 				pos := int(v.curInsts[v.ip]) | int(v.curInsts[v.ip-1])<<8 | ||||
| 				pos := int(v.curInsts[v.ip]) | int(v.curInsts[v.ip-1])<<8 | int(v.curInsts[v.ip-2])<<16 | int(v.curInsts[v.ip-3])<<24 | ||||
| 				v.ip = pos - 1 | ||||
| 			} else { | ||||
| 				v.sp-- | ||||
| 			} | ||||
| 		case parser.OpOrJump: | ||||
| 			v.ip += 2 | ||||
| 			v.ip += 4 | ||||
| 			if v.stack[v.sp-1].IsFalsy() { | ||||
| 				v.sp-- | ||||
| 			} else { | ||||
| 				pos := int(v.curInsts[v.ip]) | int(v.curInsts[v.ip-1])<<8 | ||||
| 				pos := int(v.curInsts[v.ip]) | int(v.curInsts[v.ip-1])<<8 | int(v.curInsts[v.ip-2])<<16 | int(v.curInsts[v.ip-3])<<24 | ||||
| 				v.ip = pos - 1 | ||||
| 			} | ||||
| 		case parser.OpJump: | ||||
| 			pos := int(v.curInsts[v.ip+2]) | int(v.curInsts[v.ip+1])<<8 | ||||
| 			pos := int(v.curInsts[v.ip+4]) | int(v.curInsts[v.ip+3])<<8 | int(v.curInsts[v.ip+2])<<16 | int(v.curInsts[v.ip+1])<<24 | ||||
| 			v.ip = pos - 1 | ||||
| 		case parser.OpSetGlobal: | ||||
| 			v.ip += 2 | ||||
| @ -534,6 +534,9 @@ func (v *VM) run() { | ||||
| 				} | ||||
| 				v.stack[v.sp] = val | ||||
| 				v.sp++ | ||||
| 			default: | ||||
| 				v.err = fmt.Errorf("not indexable: %s", left.TypeName()) | ||||
| 				return | ||||
| 			} | ||||
| 		case parser.OpCall: | ||||
| 			numArgs := int(v.curInsts[v.ip+1]) | ||||
|  | ||||
							
								
								
									
										13
									
								
								vendor/github.com/fsnotify/fsnotify/.cirrus.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/fsnotify/fsnotify/.cirrus.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| freebsd_task: | ||||
|   name: 'FreeBSD' | ||||
|   freebsd_instance: | ||||
|     image_family: freebsd-13-2 | ||||
|   install_script: | ||||
|     - pkg update -f | ||||
|     - pkg install -y go | ||||
|   test_script: | ||||
|       # run tests as user "cirrus" instead of root | ||||
|     - pw useradd cirrus -m | ||||
|     - chown -R cirrus:cirrus . | ||||
|     - FSNOTIFY_BUFFER=4096 sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./... | ||||
|     -                      sudo --preserve-env=FSNOTIFY_BUFFER -u cirrus go test -parallel 1 -race ./... | ||||
							
								
								
									
										1
									
								
								vendor/github.com/fsnotify/fsnotify/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/fsnotify/fsnotify/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -4,3 +4,4 @@ | ||||
| 
 | ||||
| # Output of go build ./cmd/fsnotify | ||||
| /fsnotify | ||||
| /fsnotify.exe | ||||
|  | ||||
							
								
								
									
										87
									
								
								vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										87
									
								
								vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,16 +1,87 @@ | ||||
| # Changelog | ||||
| 
 | ||||
| All notable changes to this project will be documented in this file. | ||||
| 
 | ||||
| The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), | ||||
| and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | ||||
| 
 | ||||
| ## [Unreleased] | ||||
| 
 | ||||
| Unreleased | ||||
| ---------- | ||||
| Nothing yet. | ||||
| 
 | ||||
| ## [1.6.0] - 2022-10-13 | ||||
| 1.7.0 - 2023-10-22 | ||||
| ------------------ | ||||
| This version of fsnotify needs Go 1.17. | ||||
| 
 | ||||
| ### Additions | ||||
| 
 | ||||
| - illumos: add FEN backend to support illumos and Solaris. ([#371]) | ||||
| 
 | ||||
| - all: add `NewBufferedWatcher()` to use a buffered channel, which can be useful | ||||
|   in cases where you can't control the kernel buffer and receive a large number | ||||
|   of events in bursts. ([#550], [#572]) | ||||
| 
 | ||||
| - all: add `AddWith()`, which is identical to `Add()` but allows passing | ||||
|   options. ([#521]) | ||||
| 
 | ||||
| - windows: allow setting the ReadDirectoryChangesW() buffer size with | ||||
|   `fsnotify.WithBufferSize()`; the default of 64K is the highest value that | ||||
|   works on all platforms and is enough for most purposes, but in some cases a | ||||
|   highest buffer is needed. ([#521]) | ||||
| 
 | ||||
| ### Changes and fixes | ||||
| 
 | ||||
| - inotify: remove watcher if a watched path is renamed ([#518]) | ||||
| 
 | ||||
|   After a rename the reported name wasn't updated, or even an empty string. | ||||
|   Inotify doesn't provide any good facilities to update it, so just remove the | ||||
|   watcher. This is already how it worked on kqueue and FEN. | ||||
| 
 | ||||
|   On Windows this does work, and remains working. | ||||
| 
 | ||||
| - windows: don't listen for file attribute changes ([#520]) | ||||
| 
 | ||||
|   File attribute changes are sent as `FILE_ACTION_MODIFIED` by the Windows API, | ||||
|   with no way to see if they're a file write or attribute change, so would show | ||||
|   up as a fsnotify.Write event. This is never useful, and could result in many | ||||
|   spurious Write events. | ||||
| 
 | ||||
| - windows: return `ErrEventOverflow` if the buffer is full ([#525]) | ||||
| 
 | ||||
|   Before it would merely return "short read", making it hard to detect this | ||||
|   error. | ||||
| 
 | ||||
| - kqueue: make sure events for all files are delivered properly when removing a | ||||
|   watched directory ([#526]) | ||||
| 
 | ||||
|   Previously they would get sent with `""` (empty string) or `"."` as the path | ||||
|   name. | ||||
| 
 | ||||
| - kqueue: don't emit spurious Create events for symbolic links ([#524]) | ||||
| 
 | ||||
|   The link would get resolved but kqueue would "forget" it already saw the link | ||||
|   itself, resulting on a Create for every Write event for the directory. | ||||
| 
 | ||||
| - all: return `ErrClosed` on `Add()` when the watcher is closed ([#516]) | ||||
| 
 | ||||
| - other: add `Watcher.Errors` and `Watcher.Events` to the no-op `Watcher` in | ||||
|   `backend_other.go`, making it easier to use on unsupported platforms such as | ||||
|   WASM, AIX, etc. ([#528]) | ||||
| 
 | ||||
| - other: use the `backend_other.go` no-op if the `appengine` build tag is set; | ||||
|   Google AppEngine forbids usage of the unsafe package so the inotify backend | ||||
|   won't compile there. | ||||
| 
 | ||||
| [#371]: https://github.com/fsnotify/fsnotify/pull/371 | ||||
| [#516]: https://github.com/fsnotify/fsnotify/pull/516 | ||||
| [#518]: https://github.com/fsnotify/fsnotify/pull/518 | ||||
| [#520]: https://github.com/fsnotify/fsnotify/pull/520 | ||||
| [#521]: https://github.com/fsnotify/fsnotify/pull/521 | ||||
| [#524]: https://github.com/fsnotify/fsnotify/pull/524 | ||||
| [#525]: https://github.com/fsnotify/fsnotify/pull/525 | ||||
| [#526]: https://github.com/fsnotify/fsnotify/pull/526 | ||||
| [#528]: https://github.com/fsnotify/fsnotify/pull/528 | ||||
| [#537]: https://github.com/fsnotify/fsnotify/pull/537 | ||||
| [#550]: https://github.com/fsnotify/fsnotify/pull/550 | ||||
| [#572]: https://github.com/fsnotify/fsnotify/pull/572 | ||||
| 
 | ||||
| 1.6.0 - 2022-10-13 | ||||
| ------------------ | ||||
| This version of fsnotify needs Go 1.16 (this was already the case since 1.5.1, | ||||
| but not documented). It also increases the minimum Linux version to 2.6.32. | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										79
									
								
								vendor/github.com/fsnotify/fsnotify/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										79
									
								
								vendor/github.com/fsnotify/fsnotify/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,29 +1,31 @@ | ||||
| fsnotify is a Go library to provide cross-platform filesystem notifications on | ||||
| Windows, Linux, macOS, and BSD systems. | ||||
| Windows, Linux, macOS, BSD, and illumos. | ||||
| 
 | ||||
| Go 1.16 or newer is required; the full documentation is at | ||||
| Go 1.17 or newer is required; the full documentation is at | ||||
| https://pkg.go.dev/github.com/fsnotify/fsnotify | ||||
| 
 | ||||
| **It's best to read the documentation at pkg.go.dev, as it's pinned to the last | ||||
| released version, whereas this README is for the last development version which | ||||
| may include additions/changes.** | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| Platform support: | ||||
| 
 | ||||
| | Adapter               | OS             | Status                                                       | | ||||
| | --------------------- | ---------------| -------------------------------------------------------------| | ||||
| | inotify               | Linux 2.6.32+  | Supported                                                    | | ||||
| | kqueue                | BSD, macOS     | Supported                                                    | | ||||
| | ReadDirectoryChangesW | Windows        | Supported                                                    | | ||||
| | FSEvents              | macOS          | [Planned](https://github.com/fsnotify/fsnotify/issues/11)    | | ||||
| | FEN                   | Solaris 11     | [In Progress](https://github.com/fsnotify/fsnotify/pull/371) | | ||||
| | fanotify              | Linux 5.9+     | [Maybe](https://github.com/fsnotify/fsnotify/issues/114)     | | ||||
| | USN Journals          | Windows        | [Maybe](https://github.com/fsnotify/fsnotify/issues/53)      | | ||||
| | Polling               | *All*          | [Maybe](https://github.com/fsnotify/fsnotify/issues/9)       | | ||||
| | Backend               | OS         | Status                                                                    | | ||||
| | :-------------------- | :--------- | :------------------------------------------------------------------------ | | ||||
| | inotify               | Linux      | Supported                                                                 | | ||||
| | kqueue                | BSD, macOS | Supported                                                                 | | ||||
| | ReadDirectoryChangesW | Windows    | Supported                                                                 | | ||||
| | FEN                   | illumos    | Supported                                                                 | | ||||
| | fanotify              | Linux 5.9+ | [Not yet](https://github.com/fsnotify/fsnotify/issues/114)                | | ||||
| | AHAFS                 | AIX        | [aix branch]; experimental due to lack of maintainer and test environment | | ||||
| | FSEvents              | macOS      | [Needs support in x/sys/unix][fsevents]                                   | | ||||
| | USN Journals          | Windows    | [Needs support in x/sys/windows][usn]                                     | | ||||
| | Polling               | *All*      | [Not yet](https://github.com/fsnotify/fsnotify/issues/9)                  | | ||||
| 
 | ||||
| Linux and macOS should include Android and iOS, but these are currently untested. | ||||
| Linux and illumos should include Android and Solaris, but these are currently | ||||
| untested. | ||||
| 
 | ||||
| [fsevents]:   https://github.com/fsnotify/fsnotify/issues/11#issuecomment-1279133120 | ||||
| [usn]:        https://github.com/fsnotify/fsnotify/issues/53#issuecomment-1279829847 | ||||
| [aix branch]: https://github.com/fsnotify/fsnotify/issues/353#issuecomment-1284590129 | ||||
| 
 | ||||
| Usage | ||||
| ----- | ||||
| @ -83,20 +85,23 @@ run with: | ||||
| 
 | ||||
|     % go run ./cmd/fsnotify | ||||
| 
 | ||||
| Further detailed documentation can be found in godoc: | ||||
| https://pkg.go.dev/github.com/fsnotify/fsnotify | ||||
| 
 | ||||
| FAQ | ||||
| --- | ||||
| ### Will a file still be watched when it's moved to another directory? | ||||
| No, not unless you are watching the location it was moved to. | ||||
| 
 | ||||
| ### Are subdirectories watched too? | ||||
| ### Are subdirectories watched? | ||||
| No, you must add watches for any directory you want to watch (a recursive | ||||
| watcher is on the roadmap: [#18]). | ||||
| 
 | ||||
| [#18]: https://github.com/fsnotify/fsnotify/issues/18 | ||||
| 
 | ||||
| ### Do I have to watch the Error and Event channels in a goroutine? | ||||
| As of now, yes (you can read both channels in the same goroutine using `select`, | ||||
| you don't need a separate goroutine for both channels; see the example). | ||||
| Yes. You can read both channels in the same goroutine using `select` (you don't | ||||
| need a separate goroutine for both channels; see the example). | ||||
| 
 | ||||
| ### Why don't notifications work with NFS, SMB, FUSE, /proc, or /sys? | ||||
| fsnotify requires support from underlying OS to work. The current NFS and SMB | ||||
| @ -107,6 +112,32 @@ This could be fixed with a polling watcher ([#9]), but it's not yet implemented. | ||||
| 
 | ||||
| [#9]: https://github.com/fsnotify/fsnotify/issues/9 | ||||
| 
 | ||||
| ### Why do I get many Chmod events? | ||||
| Some programs may generate a lot of attribute changes; for example Spotlight on | ||||
| macOS, anti-virus programs, backup applications, and some others are known to do | ||||
| this. As a rule, it's typically best to ignore Chmod events. They're often not | ||||
| useful, and tend to cause problems. | ||||
| 
 | ||||
| Spotlight indexing on macOS can result in multiple events (see [#15]). A | ||||
| temporary workaround is to add your folder(s) to the *Spotlight Privacy | ||||
| settings* until we have a native FSEvents implementation (see [#11]). | ||||
| 
 | ||||
| [#11]: https://github.com/fsnotify/fsnotify/issues/11 | ||||
| [#15]: https://github.com/fsnotify/fsnotify/issues/15 | ||||
| 
 | ||||
| ### Watching a file doesn't work well | ||||
| Watching individual files (rather than directories) is generally not recommended | ||||
| as many programs (especially editors) update files atomically: it will write to | ||||
| a temporary file which is then moved to to destination, overwriting the original | ||||
| (or some variant thereof). The watcher on the original file is now lost, as that | ||||
| no longer exists. | ||||
| 
 | ||||
| The upshot of this is that a power failure or crash won't leave a half-written | ||||
| file. | ||||
| 
 | ||||
| Watch the parent directory and use `Event.Name` to filter out files you're not | ||||
| interested in. There is an example of this in `cmd/fsnotify/file.go`. | ||||
| 
 | ||||
| Platform-specific notes | ||||
| ----------------------- | ||||
| ### Linux | ||||
| @ -151,11 +182,3 @@ these platforms. | ||||
| 
 | ||||
| The sysctl variables `kern.maxfiles` and `kern.maxfilesperproc` can be used to | ||||
| control the maximum number of open files. | ||||
| 
 | ||||
| ### macOS | ||||
| Spotlight indexing on macOS can result in multiple events (see [#15]). A temporary | ||||
| workaround is to add your folder(s) to the *Spotlight Privacy settings* until we | ||||
| have a native FSEvents implementation (see [#11]). | ||||
| 
 | ||||
| [#11]: https://github.com/fsnotify/fsnotify/issues/11 | ||||
| [#15]: https://github.com/fsnotify/fsnotify/issues/15 | ||||
|  | ||||
							
								
								
									
										550
									
								
								vendor/github.com/fsnotify/fsnotify/backend_fen.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										550
									
								
								vendor/github.com/fsnotify/fsnotify/backend_fen.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,10 +1,19 @@ | ||||
| //go:build solaris | ||||
| // +build solaris | ||||
| 
 | ||||
| // Note: the documentation on the Watcher type and methods is generated from | ||||
| // mkdoc.zsh | ||||
| 
 | ||||
| package fsnotify | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
| 
 | ||||
| // Watcher watches a set of paths, delivering events on a channel. | ||||
| @ -17,9 +26,9 @@ import ( | ||||
| // When a file is removed a Remove event won't be emitted until all file | ||||
| // descriptors are closed, and deletes will always emit a Chmod. For example: | ||||
| // | ||||
| //     fp := os.Open("file") | ||||
| //     os.Remove("file")        // Triggers Chmod | ||||
| //     fp.Close()               // Triggers Remove | ||||
| //	fp := os.Open("file") | ||||
| //	os.Remove("file")        // Triggers Chmod | ||||
| //	fp.Close()               // Triggers Remove | ||||
| // | ||||
| // This is the event that inotify sends, so not much can be changed about this. | ||||
| // | ||||
| @ -33,16 +42,16 @@ import ( | ||||
| // | ||||
| // To increase them you can use sysctl or write the value to the /proc file: | ||||
| // | ||||
| //     # Default values on Linux 5.18 | ||||
| //     sysctl fs.inotify.max_user_watches=124983 | ||||
| //     sysctl fs.inotify.max_user_instances=128 | ||||
| //	# Default values on Linux 5.18 | ||||
| //	sysctl fs.inotify.max_user_watches=124983 | ||||
| //	sysctl fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // To make the changes persist on reboot edit /etc/sysctl.conf or | ||||
| // /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check | ||||
| // your distro's documentation): | ||||
| // | ||||
| //     fs.inotify.max_user_watches=124983 | ||||
| //     fs.inotify.max_user_instances=128 | ||||
| //	fs.inotify.max_user_watches=124983 | ||||
| //	fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // Reaching the limit will result in a "no space left on device" or "too many open | ||||
| // files" error. | ||||
| @ -58,14 +67,20 @@ import ( | ||||
| // control the maximum number of open files, as well as /etc/login.conf on BSD | ||||
| // systems. | ||||
| // | ||||
| // # macOS notes | ||||
| // # Windows notes | ||||
| // | ||||
| // Spotlight indexing on macOS can result in multiple events (see [#15]). A | ||||
| // temporary workaround is to add your folder(s) to the "Spotlight Privacy | ||||
| // Settings" until we have a native FSEvents implementation (see [#11]). | ||||
| // Paths can be added as "C:\path\to\dir", but forward slashes | ||||
| // ("C:/path/to/dir") will also work. | ||||
| // | ||||
| // [#11]: https://github.com/fsnotify/fsnotify/issues/11 | ||||
| // [#15]: https://github.com/fsnotify/fsnotify/issues/15 | ||||
| // When a watched directory is removed it will always send an event for the | ||||
| // directory itself, but may not send events for all files in that directory. | ||||
| // Sometimes it will send events for all times, sometimes it will send no | ||||
| // events, and often only for some files. | ||||
| // | ||||
| // The default ReadDirectoryChangesW() buffer size is 64K, which is the largest | ||||
| // value that is guaranteed to work with SMB filesystems. If you have many | ||||
| // events in quick succession this may not be enough, and you will have to use | ||||
| // [WithBufferSize] to increase the value. | ||||
| type Watcher struct { | ||||
| 	// Events sends the filesystem change events. | ||||
| 	// | ||||
| @ -92,44 +107,129 @@ type Watcher struct { | ||||
| 	//                      initiated by the user may show up as one or multiple | ||||
| 	//                      writes, depending on when the system syncs things to | ||||
| 	//                      disk. For example when compiling a large Go program | ||||
| 	//                      you may get hundreds of Write events, so you | ||||
| 	//                      probably want to wait until you've stopped receiving | ||||
| 	//                      them (see the dedup example in cmd/fsnotify). | ||||
| 	//                      you may get hundreds of Write events, and you may | ||||
| 	//                      want to wait until you've stopped receiving them | ||||
| 	//                      (see the dedup example in cmd/fsnotify). | ||||
| 	// | ||||
| 	//                      Some systems may send Write event for directories | ||||
| 	//                      when the directory content changes. | ||||
| 	// | ||||
| 	//   fsnotify.Chmod     Attributes were changed. On Linux this is also sent | ||||
| 	//                      when a file is removed (or more accurately, when a | ||||
| 	//                      link to an inode is removed). On kqueue it's sent | ||||
| 	//                      and on kqueue when a file is truncated. On Windows | ||||
| 	//                      it's never sent. | ||||
| 	//                      when a file is truncated. On Windows it's never | ||||
| 	//                      sent. | ||||
| 	Events chan Event | ||||
| 
 | ||||
| 	// Errors sends any errors. | ||||
| 	// | ||||
| 	// ErrEventOverflow is used to indicate there are too many events: | ||||
| 	// | ||||
| 	//  - inotify:      There are too many queued events (fs.inotify.max_queued_events sysctl) | ||||
| 	//  - windows:      The buffer size is too small; WithBufferSize() can be used to increase it. | ||||
| 	//  - kqueue, fen:  Not used. | ||||
| 	Errors chan error | ||||
| 
 | ||||
| 	mu      sync.Mutex | ||||
| 	port    *unix.EventPort | ||||
| 	done    chan struct{}       // Channel for sending a "quit message" to the reader goroutine | ||||
| 	dirs    map[string]struct{} // Explicitly watched directories | ||||
| 	watches map[string]struct{} // Explicitly watched non-directories | ||||
| } | ||||
| 
 | ||||
| // NewWatcher creates a new Watcher. | ||||
| func NewWatcher() (*Watcher, error) { | ||||
| 	return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") | ||||
| 	return NewBufferedWatcher(0) | ||||
| } | ||||
| 
 | ||||
| // Close removes all watches and closes the events channel. | ||||
| // NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events | ||||
| // channel. | ||||
| // | ||||
| // The main use case for this is situations with a very large number of events | ||||
| // where the kernel buffer size can't be increased (e.g. due to lack of | ||||
| // permissions). An unbuffered Watcher will perform better for almost all use | ||||
| // cases, and whenever possible you will be better off increasing the kernel | ||||
| // buffers instead of adding a large userspace buffer. | ||||
| func NewBufferedWatcher(sz uint) (*Watcher, error) { | ||||
| 	w := &Watcher{ | ||||
| 		Events:  make(chan Event, sz), | ||||
| 		Errors:  make(chan error), | ||||
| 		dirs:    make(map[string]struct{}), | ||||
| 		watches: make(map[string]struct{}), | ||||
| 		done:    make(chan struct{}), | ||||
| 	} | ||||
| 
 | ||||
| 	var err error | ||||
| 	w.port, err = unix.NewEventPort() | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("fsnotify.NewWatcher: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	go w.readEvents() | ||||
| 	return w, nil | ||||
| } | ||||
| 
 | ||||
| // sendEvent attempts to send an event to the user, returning true if the event | ||||
| // was put in the channel successfully and false if the watcher has been closed. | ||||
| func (w *Watcher) sendEvent(name string, op Op) (sent bool) { | ||||
| 	select { | ||||
| 	case w.Events <- Event{Name: name, Op: op}: | ||||
| 		return true | ||||
| 	case <-w.done: | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // sendError attempts to send an error to the user, returning true if the error | ||||
| // was put in the channel successfully and false if the watcher has been closed. | ||||
| func (w *Watcher) sendError(err error) (sent bool) { | ||||
| 	select { | ||||
| 	case w.Errors <- err: | ||||
| 		return true | ||||
| 	case <-w.done: | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) isClosed() bool { | ||||
| 	select { | ||||
| 	case <-w.done: | ||||
| 		return true | ||||
| 	default: | ||||
| 		return false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Close removes all watches and closes the Events channel. | ||||
| func (w *Watcher) Close() error { | ||||
| 	return nil | ||||
| 	// Take the lock used by associateFile to prevent lingering events from | ||||
| 	// being processed after the close | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	close(w.done) | ||||
| 	return w.port.Close() | ||||
| } | ||||
| 
 | ||||
| // Add starts monitoring the path for changes. | ||||
| // | ||||
| // A path can only be watched once; attempting to watch it more than once will | ||||
| // return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // added. A watch will be automatically removed if the path is deleted. | ||||
| // A path can only be watched once; watching it more than once is a no-op and will | ||||
| // not return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // watched. | ||||
| // | ||||
| // A path will remain watched if it gets renamed to somewhere else on the same | ||||
| // filesystem, but the monitor will get removed if the path gets deleted and | ||||
| // re-created, or if it's moved to a different filesystem. | ||||
| // A watch will be automatically removed if the watched path is deleted or | ||||
| // renamed. The exception is the Windows backend, which doesn't remove the | ||||
| // watcher on renames. | ||||
| // | ||||
| // Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special | ||||
| // filesystems (/proc, /sys, etc.) generally don't work. | ||||
| // | ||||
| // Returns [ErrClosed] if [Watcher.Close] was called. | ||||
| // | ||||
| // See [Watcher.AddWith] for a version that allows adding options. | ||||
| // | ||||
| // # Watching directories | ||||
| // | ||||
| // All files in a directory are monitored, including new files that are created | ||||
| @ -139,15 +239,63 @@ func (w *Watcher) Close() error { | ||||
| // # Watching files | ||||
| // | ||||
| // Watching individual files (rather than directories) is generally not | ||||
| // recommended as many tools update files atomically. Instead of "just" writing | ||||
| // to the file a temporary file will be written to first, and if successful the | ||||
| // temporary file is moved to to destination removing the original, or some | ||||
| // variant thereof. The watcher on the original file is now lost, as it no | ||||
| // longer exists. | ||||
| // recommended as many programs (especially editors) update files atomically: it | ||||
| // will write to a temporary file which is then moved to to destination, | ||||
| // overwriting the original (or some variant thereof). The watcher on the | ||||
| // original file is now lost, as that no longer exists. | ||||
| // | ||||
| // Instead, watch the parent directory and use Event.Name to filter out files | ||||
| // you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. | ||||
| func (w *Watcher) Add(name string) error { | ||||
| // The upshot of this is that a power failure or crash won't leave a | ||||
| // half-written file. | ||||
| // | ||||
| // Watch the parent directory and use Event.Name to filter out files you're not | ||||
| // interested in. There is an example of this in cmd/fsnotify/file.go. | ||||
| func (w *Watcher) Add(name string) error { return w.AddWith(name) } | ||||
| 
 | ||||
| // AddWith is like [Watcher.Add], but allows adding options. When using Add() | ||||
| // the defaults described below are used. | ||||
| // | ||||
| // Possible options are: | ||||
| // | ||||
| //   - [WithBufferSize] sets the buffer size for the Windows backend; no-op on | ||||
| //     other platforms. The default is 64K (65536 bytes). | ||||
| func (w *Watcher) AddWith(name string, opts ...addOpt) error { | ||||
| 	if w.isClosed() { | ||||
| 		return ErrClosed | ||||
| 	} | ||||
| 	if w.port.PathIsWatched(name) { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	_ = getOptions(opts...) | ||||
| 
 | ||||
| 	// Currently we resolve symlinks that were explicitly requested to be | ||||
| 	// watched. Otherwise we would use LStat here. | ||||
| 	stat, err := os.Stat(name) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// Associate all files in the directory. | ||||
| 	if stat.IsDir() { | ||||
| 		err := w.handleDirectory(name, stat, true, w.associateFile) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 
 | ||||
| 		w.mu.Lock() | ||||
| 		w.dirs[name] = struct{}{} | ||||
| 		w.mu.Unlock() | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	err = w.associateFile(name, stat, true) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	w.watches[name] = struct{}{} | ||||
| 	w.mu.Unlock() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| @ -157,6 +305,336 @@ func (w *Watcher) Add(name string) error { | ||||
| // /tmp/dir and /tmp/dir/subdir then you will need to remove both. | ||||
| // | ||||
| // Removing a path that has not yet been added returns [ErrNonExistentWatch]. | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) Remove(name string) error { | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if !w.port.PathIsWatched(name) { | ||||
| 		return fmt.Errorf("%w: %s", ErrNonExistentWatch, name) | ||||
| 	} | ||||
| 
 | ||||
| 	// The user has expressed an intent. Immediately remove this name from | ||||
| 	// whichever watch list it might be in. If it's not in there the delete | ||||
| 	// doesn't cause harm. | ||||
| 	w.mu.Lock() | ||||
| 	delete(w.watches, name) | ||||
| 	delete(w.dirs, name) | ||||
| 	w.mu.Unlock() | ||||
| 
 | ||||
| 	stat, err := os.Stat(name) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// Remove associations for every file in the directory. | ||||
| 	if stat.IsDir() { | ||||
| 		err := w.handleDirectory(name, stat, false, w.dissociateFile) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	err = w.port.DissociatePath(name) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // readEvents contains the main loop that runs in a goroutine watching for events. | ||||
| func (w *Watcher) readEvents() { | ||||
| 	// If this function returns, the watcher has been closed and we can close | ||||
| 	// these channels | ||||
| 	defer func() { | ||||
| 		close(w.Errors) | ||||
| 		close(w.Events) | ||||
| 	}() | ||||
| 
 | ||||
| 	pevents := make([]unix.PortEvent, 8) | ||||
| 	for { | ||||
| 		count, err := w.port.Get(pevents, 1, nil) | ||||
| 		if err != nil && err != unix.ETIME { | ||||
| 			// Interrupted system call (count should be 0) ignore and continue | ||||
| 			if errors.Is(err, unix.EINTR) && count == 0 { | ||||
| 				continue | ||||
| 			} | ||||
| 			// Get failed because we called w.Close() | ||||
| 			if errors.Is(err, unix.EBADF) && w.isClosed() { | ||||
| 				return | ||||
| 			} | ||||
| 			// There was an error not caused by calling w.Close() | ||||
| 			if !w.sendError(err) { | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		p := pevents[:count] | ||||
| 		for _, pevent := range p { | ||||
| 			if pevent.Source != unix.PORT_SOURCE_FILE { | ||||
| 				// Event from unexpected source received; should never happen. | ||||
| 				if !w.sendError(errors.New("Event from unexpected source received")) { | ||||
| 					return | ||||
| 				} | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			err = w.handleEvent(&pevent) | ||||
| 			if err != nil { | ||||
| 				if !w.sendError(err) { | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) handleDirectory(path string, stat os.FileInfo, follow bool, handler func(string, os.FileInfo, bool) error) error { | ||||
| 	files, err := os.ReadDir(path) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	// Handle all children of the directory. | ||||
| 	for _, entry := range files { | ||||
| 		finfo, err := entry.Info() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		err = handler(filepath.Join(path, finfo.Name()), finfo, false) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// And finally handle the directory itself. | ||||
| 	return handler(path, stat, follow) | ||||
| } | ||||
| 
 | ||||
| // handleEvent might need to emit more than one fsnotify event if the events | ||||
| // bitmap matches more than one event type (e.g. the file was both modified and | ||||
| // had the attributes changed between when the association was created and the | ||||
| // when event was returned) | ||||
| func (w *Watcher) handleEvent(event *unix.PortEvent) error { | ||||
| 	var ( | ||||
| 		events     = event.Events | ||||
| 		path       = event.Path | ||||
| 		fmode      = event.Cookie.(os.FileMode) | ||||
| 		reRegister = true | ||||
| 	) | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	_, watchedDir := w.dirs[path] | ||||
| 	_, watchedPath := w.watches[path] | ||||
| 	w.mu.Unlock() | ||||
| 	isWatched := watchedDir || watchedPath | ||||
| 
 | ||||
| 	if events&unix.FILE_DELETE != 0 { | ||||
| 		if !w.sendEvent(path, Remove) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		reRegister = false | ||||
| 	} | ||||
| 	if events&unix.FILE_RENAME_FROM != 0 { | ||||
| 		if !w.sendEvent(path, Rename) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		// Don't keep watching the new file name | ||||
| 		reRegister = false | ||||
| 	} | ||||
| 	if events&unix.FILE_RENAME_TO != 0 { | ||||
| 		// We don't report a Rename event for this case, because Rename events | ||||
| 		// are interpreted as referring to the _old_ name of the file, and in | ||||
| 		// this case the event would refer to the new name of the file. This | ||||
| 		// type of rename event is not supported by fsnotify. | ||||
| 
 | ||||
| 		// inotify reports a Remove event in this case, so we simulate this | ||||
| 		// here. | ||||
| 		if !w.sendEvent(path, Remove) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		// Don't keep watching the file that was removed | ||||
| 		reRegister = false | ||||
| 	} | ||||
| 
 | ||||
| 	// The file is gone, nothing left to do. | ||||
| 	if !reRegister { | ||||
| 		if watchedDir { | ||||
| 			w.mu.Lock() | ||||
| 			delete(w.dirs, path) | ||||
| 			w.mu.Unlock() | ||||
| 		} | ||||
| 		if watchedPath { | ||||
| 			w.mu.Lock() | ||||
| 			delete(w.watches, path) | ||||
| 			w.mu.Unlock() | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	// If we didn't get a deletion the file still exists and we're going to have | ||||
| 	// to watch it again. Let's Stat it now so that we can compare permissions | ||||
| 	// and have what we need to continue watching the file | ||||
| 
 | ||||
| 	stat, err := os.Lstat(path) | ||||
| 	if err != nil { | ||||
| 		// This is unexpected, but we should still emit an event. This happens | ||||
| 		// most often on "rm -r" of a subdirectory inside a watched directory We | ||||
| 		// get a modify event of something happening inside, but by the time we | ||||
| 		// get here, the sudirectory is already gone. Clearly we were watching | ||||
| 		// this path but now it is gone. Let's tell the user that it was | ||||
| 		// removed. | ||||
| 		if !w.sendEvent(path, Remove) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		// Suppress extra write events on removed directories; they are not | ||||
| 		// informative and can be confusing. | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	// resolve symlinks that were explicitly watched as we would have at Add() | ||||
| 	// time. this helps suppress spurious Chmod events on watched symlinks | ||||
| 	if isWatched { | ||||
| 		stat, err = os.Stat(path) | ||||
| 		if err != nil { | ||||
| 			// The symlink still exists, but the target is gone. Report the | ||||
| 			// Remove similar to above. | ||||
| 			if !w.sendEvent(path, Remove) { | ||||
| 				return nil | ||||
| 			} | ||||
| 			// Don't return the error | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if events&unix.FILE_MODIFIED != 0 { | ||||
| 		if fmode.IsDir() { | ||||
| 			if watchedDir { | ||||
| 				if err := w.updateDirectory(path); err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 			} else { | ||||
| 				if !w.sendEvent(path, Write) { | ||||
| 					return nil | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			if !w.sendEvent(path, Write) { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if events&unix.FILE_ATTRIB != 0 && stat != nil { | ||||
| 		// Only send Chmod if perms changed | ||||
| 		if stat.Mode().Perm() != fmode.Perm() { | ||||
| 			if !w.sendEvent(path, Chmod) { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if stat != nil { | ||||
| 		// If we get here, it means we've hit an event above that requires us to | ||||
| 		// continue watching the file or directory | ||||
| 		return w.associateFile(path, stat, isWatched) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) updateDirectory(path string) error { | ||||
| 	// The directory was modified, so we must find unwatched entities and watch | ||||
| 	// them. If something was removed from the directory, nothing will happen, | ||||
| 	// as everything else should still be watched. | ||||
| 	files, err := os.ReadDir(path) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	for _, entry := range files { | ||||
| 		path := filepath.Join(path, entry.Name()) | ||||
| 		if w.port.PathIsWatched(path) { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		finfo, err := entry.Info() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		err = w.associateFile(path, finfo, false) | ||||
| 		if err != nil { | ||||
| 			if !w.sendError(err) { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		if !w.sendEvent(path, Create) { | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) associateFile(path string, stat os.FileInfo, follow bool) error { | ||||
| 	if w.isClosed() { | ||||
| 		return ErrClosed | ||||
| 	} | ||||
| 	// This is primarily protecting the call to AssociatePath but it is | ||||
| 	// important and intentional that the call to PathIsWatched is also | ||||
| 	// protected by this mutex. Without this mutex, AssociatePath has been seen | ||||
| 	// to error out that the path is already associated. | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 
 | ||||
| 	if w.port.PathIsWatched(path) { | ||||
| 		// Remove the old association in favor of this one If we get ENOENT, | ||||
| 		// then while the x/sys/unix wrapper still thought that this path was | ||||
| 		// associated, the underlying event port did not. This call will have | ||||
| 		// cleared up that discrepancy. The most likely cause is that the event | ||||
| 		// has fired but we haven't processed it yet. | ||||
| 		err := w.port.DissociatePath(path) | ||||
| 		if err != nil && err != unix.ENOENT { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	// FILE_NOFOLLOW means we watch symlinks themselves rather than their | ||||
| 	// targets. | ||||
| 	events := unix.FILE_MODIFIED | unix.FILE_ATTRIB | unix.FILE_NOFOLLOW | ||||
| 	if follow { | ||||
| 		// We *DO* follow symlinks for explicitly watched entries. | ||||
| 		events = unix.FILE_MODIFIED | unix.FILE_ATTRIB | ||||
| 	} | ||||
| 	return w.port.AssociatePath(path, stat, | ||||
| 		events, | ||||
| 		stat.Mode()) | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) dissociateFile(path string, stat os.FileInfo, unused bool) error { | ||||
| 	if !w.port.PathIsWatched(path) { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return w.port.DissociatePath(path) | ||||
| } | ||||
| 
 | ||||
| // WatchList returns all paths explicitly added with [Watcher.Add] (and are not | ||||
| // yet removed). | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) WatchList() []string { | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 
 | ||||
| 	entries := make([]string, 0, len(w.watches)+len(w.dirs)) | ||||
| 	for pathname := range w.dirs { | ||||
| 		entries = append(entries, pathname) | ||||
| 	} | ||||
| 	for pathname := range w.watches { | ||||
| 		entries = append(entries, pathname) | ||||
| 	} | ||||
| 
 | ||||
| 	return entries | ||||
| } | ||||
|  | ||||
							
								
								
									
										381
									
								
								vendor/github.com/fsnotify/fsnotify/backend_inotify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										381
									
								
								vendor/github.com/fsnotify/fsnotify/backend_inotify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,5 +1,8 @@ | ||||
| //go:build linux | ||||
| // +build linux | ||||
| //go:build linux && !appengine | ||||
| // +build linux,!appengine | ||||
| 
 | ||||
| // Note: the documentation on the Watcher type and methods is generated from | ||||
| // mkdoc.zsh | ||||
| 
 | ||||
| package fsnotify | ||||
| 
 | ||||
| @ -26,9 +29,9 @@ import ( | ||||
| // When a file is removed a Remove event won't be emitted until all file | ||||
| // descriptors are closed, and deletes will always emit a Chmod. For example: | ||||
| // | ||||
| //     fp := os.Open("file") | ||||
| //     os.Remove("file")        // Triggers Chmod | ||||
| //     fp.Close()               // Triggers Remove | ||||
| //	fp := os.Open("file") | ||||
| //	os.Remove("file")        // Triggers Chmod | ||||
| //	fp.Close()               // Triggers Remove | ||||
| // | ||||
| // This is the event that inotify sends, so not much can be changed about this. | ||||
| // | ||||
| @ -42,16 +45,16 @@ import ( | ||||
| // | ||||
| // To increase them you can use sysctl or write the value to the /proc file: | ||||
| // | ||||
| //     # Default values on Linux 5.18 | ||||
| //     sysctl fs.inotify.max_user_watches=124983 | ||||
| //     sysctl fs.inotify.max_user_instances=128 | ||||
| //	# Default values on Linux 5.18 | ||||
| //	sysctl fs.inotify.max_user_watches=124983 | ||||
| //	sysctl fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // To make the changes persist on reboot edit /etc/sysctl.conf or | ||||
| // /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check | ||||
| // your distro's documentation): | ||||
| // | ||||
| //     fs.inotify.max_user_watches=124983 | ||||
| //     fs.inotify.max_user_instances=128 | ||||
| //	fs.inotify.max_user_watches=124983 | ||||
| //	fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // Reaching the limit will result in a "no space left on device" or "too many open | ||||
| // files" error. | ||||
| @ -67,14 +70,20 @@ import ( | ||||
| // control the maximum number of open files, as well as /etc/login.conf on BSD | ||||
| // systems. | ||||
| // | ||||
| // # macOS notes | ||||
| // # Windows notes | ||||
| // | ||||
| // Spotlight indexing on macOS can result in multiple events (see [#15]). A | ||||
| // temporary workaround is to add your folder(s) to the "Spotlight Privacy | ||||
| // Settings" until we have a native FSEvents implementation (see [#11]). | ||||
| // Paths can be added as "C:\path\to\dir", but forward slashes | ||||
| // ("C:/path/to/dir") will also work. | ||||
| // | ||||
| // [#11]: https://github.com/fsnotify/fsnotify/issues/11 | ||||
| // [#15]: https://github.com/fsnotify/fsnotify/issues/15 | ||||
| // When a watched directory is removed it will always send an event for the | ||||
| // directory itself, but may not send events for all files in that directory. | ||||
| // Sometimes it will send events for all times, sometimes it will send no | ||||
| // events, and often only for some files. | ||||
| // | ||||
| // The default ReadDirectoryChangesW() buffer size is 64K, which is the largest | ||||
| // value that is guaranteed to work with SMB filesystems. If you have many | ||||
| // events in quick succession this may not be enough, and you will have to use | ||||
| // [WithBufferSize] to increase the value. | ||||
| type Watcher struct { | ||||
| 	// Events sends the filesystem change events. | ||||
| 	// | ||||
| @ -101,36 +110,148 @@ type Watcher struct { | ||||
| 	//                      initiated by the user may show up as one or multiple | ||||
| 	//                      writes, depending on when the system syncs things to | ||||
| 	//                      disk. For example when compiling a large Go program | ||||
| 	//                      you may get hundreds of Write events, so you | ||||
| 	//                      probably want to wait until you've stopped receiving | ||||
| 	//                      them (see the dedup example in cmd/fsnotify). | ||||
| 	//                      you may get hundreds of Write events, and you may | ||||
| 	//                      want to wait until you've stopped receiving them | ||||
| 	//                      (see the dedup example in cmd/fsnotify). | ||||
| 	// | ||||
| 	//                      Some systems may send Write event for directories | ||||
| 	//                      when the directory content changes. | ||||
| 	// | ||||
| 	//   fsnotify.Chmod     Attributes were changed. On Linux this is also sent | ||||
| 	//                      when a file is removed (or more accurately, when a | ||||
| 	//                      link to an inode is removed). On kqueue it's sent | ||||
| 	//                      and on kqueue when a file is truncated. On Windows | ||||
| 	//                      it's never sent. | ||||
| 	//                      when a file is truncated. On Windows it's never | ||||
| 	//                      sent. | ||||
| 	Events chan Event | ||||
| 
 | ||||
| 	// Errors sends any errors. | ||||
| 	// | ||||
| 	// ErrEventOverflow is used to indicate there are too many events: | ||||
| 	// | ||||
| 	//  - inotify:      There are too many queued events (fs.inotify.max_queued_events sysctl) | ||||
| 	//  - windows:      The buffer size is too small; WithBufferSize() can be used to increase it. | ||||
| 	//  - kqueue, fen:  Not used. | ||||
| 	Errors chan error | ||||
| 
 | ||||
| 	// Store fd here as os.File.Read() will no longer return on close after | ||||
| 	// calling Fd(). See: https://github.com/golang/go/issues/26439 | ||||
| 	fd          int | ||||
| 	mu          sync.Mutex // Map access | ||||
| 	inotifyFile *os.File | ||||
| 	watches     map[string]*watch // Map of inotify watches (key: path) | ||||
| 	paths       map[int]string    // Map of watched paths (key: watch descriptor) | ||||
| 	done        chan struct{}     // Channel for sending a "quit message" to the reader goroutine | ||||
| 	doneResp    chan struct{}     // Channel to respond to Close | ||||
| 	watches     *watches | ||||
| 	done        chan struct{} // Channel for sending a "quit message" to the reader goroutine | ||||
| 	closeMu     sync.Mutex | ||||
| 	doneResp    chan struct{} // Channel to respond to Close | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| 	watches struct { | ||||
| 		mu   sync.RWMutex | ||||
| 		wd   map[uint32]*watch // wd → watch | ||||
| 		path map[string]uint32 // pathname → wd | ||||
| 	} | ||||
| 	watch struct { | ||||
| 		wd    uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) | ||||
| 		flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) | ||||
| 		path  string // Watch path. | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| func newWatches() *watches { | ||||
| 	return &watches{ | ||||
| 		wd:   make(map[uint32]*watch), | ||||
| 		path: make(map[string]uint32), | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (w *watches) len() int { | ||||
| 	w.mu.RLock() | ||||
| 	defer w.mu.RUnlock() | ||||
| 	return len(w.wd) | ||||
| } | ||||
| 
 | ||||
| func (w *watches) add(ww *watch) { | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 	w.wd[ww.wd] = ww | ||||
| 	w.path[ww.path] = ww.wd | ||||
| } | ||||
| 
 | ||||
| func (w *watches) remove(wd uint32) { | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 	delete(w.path, w.wd[wd].path) | ||||
| 	delete(w.wd, wd) | ||||
| } | ||||
| 
 | ||||
| func (w *watches) removePath(path string) (uint32, bool) { | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 
 | ||||
| 	wd, ok := w.path[path] | ||||
| 	if !ok { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 
 | ||||
| 	delete(w.path, path) | ||||
| 	delete(w.wd, wd) | ||||
| 
 | ||||
| 	return wd, true | ||||
| } | ||||
| 
 | ||||
| func (w *watches) byPath(path string) *watch { | ||||
| 	w.mu.RLock() | ||||
| 	defer w.mu.RUnlock() | ||||
| 	return w.wd[w.path[path]] | ||||
| } | ||||
| 
 | ||||
| func (w *watches) byWd(wd uint32) *watch { | ||||
| 	w.mu.RLock() | ||||
| 	defer w.mu.RUnlock() | ||||
| 	return w.wd[wd] | ||||
| } | ||||
| 
 | ||||
| func (w *watches) updatePath(path string, f func(*watch) (*watch, error)) error { | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 
 | ||||
| 	var existing *watch | ||||
| 	wd, ok := w.path[path] | ||||
| 	if ok { | ||||
| 		existing = w.wd[wd] | ||||
| 	} | ||||
| 
 | ||||
| 	upd, err := f(existing) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if upd != nil { | ||||
| 		w.wd[upd.wd] = upd | ||||
| 		w.path[upd.path] = upd.wd | ||||
| 
 | ||||
| 		if upd.wd != wd { | ||||
| 			delete(w.wd, wd) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // NewWatcher creates a new Watcher. | ||||
| func NewWatcher() (*Watcher, error) { | ||||
| 	// Create inotify fd | ||||
| 	// Need to set the FD to nonblocking mode in order for SetDeadline methods to work | ||||
| 	// Otherwise, blocking i/o operations won't terminate on close | ||||
| 	return NewBufferedWatcher(0) | ||||
| } | ||||
| 
 | ||||
| // NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events | ||||
| // channel. | ||||
| // | ||||
| // The main use case for this is situations with a very large number of events | ||||
| // where the kernel buffer size can't be increased (e.g. due to lack of | ||||
| // permissions). An unbuffered Watcher will perform better for almost all use | ||||
| // cases, and whenever possible you will be better off increasing the kernel | ||||
| // buffers instead of adding a large userspace buffer. | ||||
| func NewBufferedWatcher(sz uint) (*Watcher, error) { | ||||
| 	// Need to set nonblocking mode for SetDeadline to work, otherwise blocking | ||||
| 	// I/O operations won't terminate on close. | ||||
| 	fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC | unix.IN_NONBLOCK) | ||||
| 	if fd == -1 { | ||||
| 		return nil, errno | ||||
| @ -139,9 +260,8 @@ func NewWatcher() (*Watcher, error) { | ||||
| 	w := &Watcher{ | ||||
| 		fd:          fd, | ||||
| 		inotifyFile: os.NewFile(uintptr(fd), ""), | ||||
| 		watches:     make(map[string]*watch), | ||||
| 		paths:       make(map[int]string), | ||||
| 		Events:      make(chan Event), | ||||
| 		watches:     newWatches(), | ||||
| 		Events:      make(chan Event, sz), | ||||
| 		Errors:      make(chan error), | ||||
| 		done:        make(chan struct{}), | ||||
| 		doneResp:    make(chan struct{}), | ||||
| @ -157,8 +277,8 @@ func (w *Watcher) sendEvent(e Event) bool { | ||||
| 	case w.Events <- e: | ||||
| 		return true | ||||
| 	case <-w.done: | ||||
| 		return false | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // Returns true if the error was sent, or false if watcher is closed. | ||||
| @ -180,17 +300,15 @@ func (w *Watcher) isClosed() bool { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Close removes all watches and closes the events channel. | ||||
| // Close removes all watches and closes the Events channel. | ||||
| func (w *Watcher) Close() error { | ||||
| 	w.mu.Lock() | ||||
| 	w.closeMu.Lock() | ||||
| 	if w.isClosed() { | ||||
| 		w.mu.Unlock() | ||||
| 		w.closeMu.Unlock() | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	// Send 'close' signal to goroutine, and set the Watcher to closed. | ||||
| 	close(w.done) | ||||
| 	w.mu.Unlock() | ||||
| 	w.closeMu.Unlock() | ||||
| 
 | ||||
| 	// Causes any blocking reads to return with an error, provided the file | ||||
| 	// still supports deadline operations. | ||||
| @ -207,17 +325,21 @@ func (w *Watcher) Close() error { | ||||
| 
 | ||||
| // Add starts monitoring the path for changes. | ||||
| // | ||||
| // A path can only be watched once; attempting to watch it more than once will | ||||
| // return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // added. A watch will be automatically removed if the path is deleted. | ||||
| // A path can only be watched once; watching it more than once is a no-op and will | ||||
| // not return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // watched. | ||||
| // | ||||
| // A path will remain watched if it gets renamed to somewhere else on the same | ||||
| // filesystem, but the monitor will get removed if the path gets deleted and | ||||
| // re-created, or if it's moved to a different filesystem. | ||||
| // A watch will be automatically removed if the watched path is deleted or | ||||
| // renamed. The exception is the Windows backend, which doesn't remove the | ||||
| // watcher on renames. | ||||
| // | ||||
| // Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special | ||||
| // filesystems (/proc, /sys, etc.) generally don't work. | ||||
| // | ||||
| // Returns [ErrClosed] if [Watcher.Close] was called. | ||||
| // | ||||
| // See [Watcher.AddWith] for a version that allows adding options. | ||||
| // | ||||
| // # Watching directories | ||||
| // | ||||
| // All files in a directory are monitored, including new files that are created | ||||
| @ -227,44 +349,59 @@ func (w *Watcher) Close() error { | ||||
| // # Watching files | ||||
| // | ||||
| // Watching individual files (rather than directories) is generally not | ||||
| // recommended as many tools update files atomically. Instead of "just" writing | ||||
| // to the file a temporary file will be written to first, and if successful the | ||||
| // temporary file is moved to to destination removing the original, or some | ||||
| // variant thereof. The watcher on the original file is now lost, as it no | ||||
| // longer exists. | ||||
| // recommended as many programs (especially editors) update files atomically: it | ||||
| // will write to a temporary file which is then moved to to destination, | ||||
| // overwriting the original (or some variant thereof). The watcher on the | ||||
| // original file is now lost, as that no longer exists. | ||||
| // | ||||
| // Instead, watch the parent directory and use Event.Name to filter out files | ||||
| // you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. | ||||
| func (w *Watcher) Add(name string) error { | ||||
| 	name = filepath.Clean(name) | ||||
| // The upshot of this is that a power failure or crash won't leave a | ||||
| // half-written file. | ||||
| // | ||||
| // Watch the parent directory and use Event.Name to filter out files you're not | ||||
| // interested in. There is an example of this in cmd/fsnotify/file.go. | ||||
| func (w *Watcher) Add(name string) error { return w.AddWith(name) } | ||||
| 
 | ||||
| // AddWith is like [Watcher.Add], but allows adding options. When using Add() | ||||
| // the defaults described below are used. | ||||
| // | ||||
| // Possible options are: | ||||
| // | ||||
| //   - [WithBufferSize] sets the buffer size for the Windows backend; no-op on | ||||
| //     other platforms. The default is 64K (65536 bytes). | ||||
| func (w *Watcher) AddWith(name string, opts ...addOpt) error { | ||||
| 	if w.isClosed() { | ||||
| 		return errors.New("inotify instance already closed") | ||||
| 		return ErrClosed | ||||
| 	} | ||||
| 
 | ||||
| 	name = filepath.Clean(name) | ||||
| 	_ = getOptions(opts...) | ||||
| 
 | ||||
| 	var flags uint32 = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | | ||||
| 		unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | | ||||
| 		unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 	watchEntry := w.watches[name] | ||||
| 	if watchEntry != nil { | ||||
| 		flags |= watchEntry.flags | unix.IN_MASK_ADD | ||||
| 	} | ||||
| 	wd, errno := unix.InotifyAddWatch(w.fd, name, flags) | ||||
| 	if wd == -1 { | ||||
| 		return errno | ||||
| 	} | ||||
| 	return w.watches.updatePath(name, func(existing *watch) (*watch, error) { | ||||
| 		if existing != nil { | ||||
| 			flags |= existing.flags | unix.IN_MASK_ADD | ||||
| 		} | ||||
| 
 | ||||
| 	if watchEntry == nil { | ||||
| 		w.watches[name] = &watch{wd: uint32(wd), flags: flags} | ||||
| 		w.paths[wd] = name | ||||
| 	} else { | ||||
| 		watchEntry.wd = uint32(wd) | ||||
| 		watchEntry.flags = flags | ||||
| 	} | ||||
| 		wd, err := unix.InotifyAddWatch(w.fd, name, flags) | ||||
| 		if wd == -1 { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 
 | ||||
| 	return nil | ||||
| 		if existing == nil { | ||||
| 			return &watch{ | ||||
| 				wd:    uint32(wd), | ||||
| 				path:  name, | ||||
| 				flags: flags, | ||||
| 			}, nil | ||||
| 		} | ||||
| 
 | ||||
| 		existing.wd = uint32(wd) | ||||
| 		existing.flags = flags | ||||
| 		return existing, nil | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| // Remove stops monitoring the path for changes. | ||||
| @ -273,32 +410,22 @@ func (w *Watcher) Add(name string) error { | ||||
| // /tmp/dir and /tmp/dir/subdir then you will need to remove both. | ||||
| // | ||||
| // Removing a path that has not yet been added returns [ErrNonExistentWatch]. | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) Remove(name string) error { | ||||
| 	name = filepath.Clean(name) | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return w.remove(filepath.Clean(name)) | ||||
| } | ||||
| 
 | ||||
| 	// Fetch the watch. | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 	watch, ok := w.watches[name] | ||||
| 
 | ||||
| 	// Remove it from inotify. | ||||
| func (w *Watcher) remove(name string) error { | ||||
| 	wd, ok := w.watches.removePath(name) | ||||
| 	if !ok { | ||||
| 		return fmt.Errorf("%w: %s", ErrNonExistentWatch, name) | ||||
| 	} | ||||
| 
 | ||||
| 	// We successfully removed the watch if InotifyRmWatch doesn't return an | ||||
| 	// error, we need to clean up our internal state to ensure it matches | ||||
| 	// inotify's kernel state. | ||||
| 	delete(w.paths, int(watch.wd)) | ||||
| 	delete(w.watches, name) | ||||
| 
 | ||||
| 	// inotify_rm_watch will return EINVAL if the file has been deleted; | ||||
| 	// the inotify will already have been removed. | ||||
| 	// watches and pathes are deleted in ignoreLinux() implicitly and asynchronously | ||||
| 	// by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE | ||||
| 	// so that EINVAL means that the wd is being rm_watch()ed or its file removed | ||||
| 	// by another thread and we have not received IN_IGNORE event. | ||||
| 	success, errno := unix.InotifyRmWatch(w.fd, watch.wd) | ||||
| 	success, errno := unix.InotifyRmWatch(w.fd, wd) | ||||
| 	if success == -1 { | ||||
| 		// TODO: Perhaps it's not helpful to return an error here in every case; | ||||
| 		//       The only two possible errors are: | ||||
| @ -312,26 +439,26 @@ func (w *Watcher) Remove(name string) error { | ||||
| 		//         are watching is deleted. | ||||
| 		return errno | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // WatchList returns all paths added with [Add] (and are not yet removed). | ||||
| // WatchList returns all paths explicitly added with [Watcher.Add] (and are not | ||||
| // yet removed). | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) WatchList() []string { | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 
 | ||||
| 	entries := make([]string, 0, len(w.watches)) | ||||
| 	for pathname := range w.watches { | ||||
| 		entries = append(entries, pathname) | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	return entries | ||||
| } | ||||
| 	entries := make([]string, 0, w.watches.len()) | ||||
| 	w.watches.mu.RLock() | ||||
| 	for pathname := range w.watches.path { | ||||
| 		entries = append(entries, pathname) | ||||
| 	} | ||||
| 	w.watches.mu.RUnlock() | ||||
| 
 | ||||
| type watch struct { | ||||
| 	wd    uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) | ||||
| 	flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) | ||||
| 	return entries | ||||
| } | ||||
| 
 | ||||
| // readEvents reads from the inotify file descriptor, converts the | ||||
| @ -367,14 +494,11 @@ func (w *Watcher) readEvents() { | ||||
| 		if n < unix.SizeofInotifyEvent { | ||||
| 			var err error | ||||
| 			if n == 0 { | ||||
| 				// If EOF is received. This should really never happen. | ||||
| 				err = io.EOF | ||||
| 				err = io.EOF // If EOF is received. This should really never happen. | ||||
| 			} else if n < 0 { | ||||
| 				// If an error occurred while reading. | ||||
| 				err = errno | ||||
| 				err = errno // If an error occurred while reading. | ||||
| 			} else { | ||||
| 				// Read was too short. | ||||
| 				err = errors.New("notify: short read in readEvents()") | ||||
| 				err = errors.New("notify: short read in readEvents()") // Read was too short. | ||||
| 			} | ||||
| 			if !w.sendError(err) { | ||||
| 				return | ||||
| @ -403,18 +527,29 @@ func (w *Watcher) readEvents() { | ||||
| 			// doesn't append the filename to the event, but we would like to always fill the | ||||
| 			// the "Name" field with a valid filename. We retrieve the path of the watch from | ||||
| 			// the "paths" map. | ||||
| 			w.mu.Lock() | ||||
| 			name, ok := w.paths[int(raw.Wd)] | ||||
| 			// IN_DELETE_SELF occurs when the file/directory being watched is removed. | ||||
| 			// This is a sign to clean up the maps, otherwise we are no longer in sync | ||||
| 			// with the inotify kernel state which has already deleted the watch | ||||
| 			// automatically. | ||||
| 			if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { | ||||
| 				delete(w.paths, int(raw.Wd)) | ||||
| 				delete(w.watches, name) | ||||
| 			} | ||||
| 			w.mu.Unlock() | ||||
| 			watch := w.watches.byWd(uint32(raw.Wd)) | ||||
| 
 | ||||
| 			// inotify will automatically remove the watch on deletes; just need | ||||
| 			// to clean our state here. | ||||
| 			if watch != nil && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { | ||||
| 				w.watches.remove(watch.wd) | ||||
| 			} | ||||
| 			// We can't really update the state when a watched path is moved; | ||||
| 			// only IN_MOVE_SELF is sent and not IN_MOVED_{FROM,TO}. So remove | ||||
| 			// the watch. | ||||
| 			if watch != nil && mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF { | ||||
| 				err := w.remove(watch.path) | ||||
| 				if err != nil && !errors.Is(err, ErrNonExistentWatch) { | ||||
| 					if !w.sendError(err) { | ||||
| 						return | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			var name string | ||||
| 			if watch != nil { | ||||
| 				name = watch.path | ||||
| 			} | ||||
| 			if nameLen > 0 { | ||||
| 				// Point "bytes" at the first byte of the filename | ||||
| 				bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen] | ||||
|  | ||||
							
								
								
									
										293
									
								
								vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										293
									
								
								vendor/github.com/fsnotify/fsnotify/backend_kqueue.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,12 +1,14 @@ | ||||
| //go:build freebsd || openbsd || netbsd || dragonfly || darwin | ||||
| // +build freebsd openbsd netbsd dragonfly darwin | ||||
| 
 | ||||
| // Note: the documentation on the Watcher type and methods is generated from | ||||
| // mkdoc.zsh | ||||
| 
 | ||||
| package fsnotify | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"sync" | ||||
| @ -24,9 +26,9 @@ import ( | ||||
| // When a file is removed a Remove event won't be emitted until all file | ||||
| // descriptors are closed, and deletes will always emit a Chmod. For example: | ||||
| // | ||||
| //     fp := os.Open("file") | ||||
| //     os.Remove("file")        // Triggers Chmod | ||||
| //     fp.Close()               // Triggers Remove | ||||
| //	fp := os.Open("file") | ||||
| //	os.Remove("file")        // Triggers Chmod | ||||
| //	fp.Close()               // Triggers Remove | ||||
| // | ||||
| // This is the event that inotify sends, so not much can be changed about this. | ||||
| // | ||||
| @ -40,16 +42,16 @@ import ( | ||||
| // | ||||
| // To increase them you can use sysctl or write the value to the /proc file: | ||||
| // | ||||
| //     # Default values on Linux 5.18 | ||||
| //     sysctl fs.inotify.max_user_watches=124983 | ||||
| //     sysctl fs.inotify.max_user_instances=128 | ||||
| //	# Default values on Linux 5.18 | ||||
| //	sysctl fs.inotify.max_user_watches=124983 | ||||
| //	sysctl fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // To make the changes persist on reboot edit /etc/sysctl.conf or | ||||
| // /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check | ||||
| // your distro's documentation): | ||||
| // | ||||
| //     fs.inotify.max_user_watches=124983 | ||||
| //     fs.inotify.max_user_instances=128 | ||||
| //	fs.inotify.max_user_watches=124983 | ||||
| //	fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // Reaching the limit will result in a "no space left on device" or "too many open | ||||
| // files" error. | ||||
| @ -65,14 +67,20 @@ import ( | ||||
| // control the maximum number of open files, as well as /etc/login.conf on BSD | ||||
| // systems. | ||||
| // | ||||
| // # macOS notes | ||||
| // # Windows notes | ||||
| // | ||||
| // Spotlight indexing on macOS can result in multiple events (see [#15]). A | ||||
| // temporary workaround is to add your folder(s) to the "Spotlight Privacy | ||||
| // Settings" until we have a native FSEvents implementation (see [#11]). | ||||
| // Paths can be added as "C:\path\to\dir", but forward slashes | ||||
| // ("C:/path/to/dir") will also work. | ||||
| // | ||||
| // [#11]: https://github.com/fsnotify/fsnotify/issues/11 | ||||
| // [#15]: https://github.com/fsnotify/fsnotify/issues/15 | ||||
| // When a watched directory is removed it will always send an event for the | ||||
| // directory itself, but may not send events for all files in that directory. | ||||
| // Sometimes it will send events for all times, sometimes it will send no | ||||
| // events, and often only for some files. | ||||
| // | ||||
| // The default ReadDirectoryChangesW() buffer size is 64K, which is the largest | ||||
| // value that is guaranteed to work with SMB filesystems. If you have many | ||||
| // events in quick succession this may not be enough, and you will have to use | ||||
| // [WithBufferSize] to increase the value. | ||||
| type Watcher struct { | ||||
| 	// Events sends the filesystem change events. | ||||
| 	// | ||||
| @ -99,18 +107,27 @@ type Watcher struct { | ||||
| 	//                      initiated by the user may show up as one or multiple | ||||
| 	//                      writes, depending on when the system syncs things to | ||||
| 	//                      disk. For example when compiling a large Go program | ||||
| 	//                      you may get hundreds of Write events, so you | ||||
| 	//                      probably want to wait until you've stopped receiving | ||||
| 	//                      them (see the dedup example in cmd/fsnotify). | ||||
| 	//                      you may get hundreds of Write events, and you may | ||||
| 	//                      want to wait until you've stopped receiving them | ||||
| 	//                      (see the dedup example in cmd/fsnotify). | ||||
| 	// | ||||
| 	//                      Some systems may send Write event for directories | ||||
| 	//                      when the directory content changes. | ||||
| 	// | ||||
| 	//   fsnotify.Chmod     Attributes were changed. On Linux this is also sent | ||||
| 	//                      when a file is removed (or more accurately, when a | ||||
| 	//                      link to an inode is removed). On kqueue it's sent | ||||
| 	//                      and on kqueue when a file is truncated. On Windows | ||||
| 	//                      it's never sent. | ||||
| 	//                      when a file is truncated. On Windows it's never | ||||
| 	//                      sent. | ||||
| 	Events chan Event | ||||
| 
 | ||||
| 	// Errors sends any errors. | ||||
| 	// | ||||
| 	// ErrEventOverflow is used to indicate there are too many events: | ||||
| 	// | ||||
| 	//  - inotify:      There are too many queued events (fs.inotify.max_queued_events sysctl) | ||||
| 	//  - windows:      The buffer size is too small; WithBufferSize() can be used to increase it. | ||||
| 	//  - kqueue, fen:  Not used. | ||||
| 	Errors chan error | ||||
| 
 | ||||
| 	done         chan struct{} | ||||
| @ -133,6 +150,18 @@ type pathInfo struct { | ||||
| 
 | ||||
| // NewWatcher creates a new Watcher. | ||||
| func NewWatcher() (*Watcher, error) { | ||||
| 	return NewBufferedWatcher(0) | ||||
| } | ||||
| 
 | ||||
| // NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events | ||||
| // channel. | ||||
| // | ||||
| // The main use case for this is situations with a very large number of events | ||||
| // where the kernel buffer size can't be increased (e.g. due to lack of | ||||
| // permissions). An unbuffered Watcher will perform better for almost all use | ||||
| // cases, and whenever possible you will be better off increasing the kernel | ||||
| // buffers instead of adding a large userspace buffer. | ||||
| func NewBufferedWatcher(sz uint) (*Watcher, error) { | ||||
| 	kq, closepipe, err := newKqueue() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @ -147,7 +176,7 @@ func NewWatcher() (*Watcher, error) { | ||||
| 		paths:        make(map[int]pathInfo), | ||||
| 		fileExists:   make(map[string]struct{}), | ||||
| 		userWatches:  make(map[string]struct{}), | ||||
| 		Events:       make(chan Event), | ||||
| 		Events:       make(chan Event, sz), | ||||
| 		Errors:       make(chan error), | ||||
| 		done:         make(chan struct{}), | ||||
| 	} | ||||
| @ -197,8 +226,8 @@ func (w *Watcher) sendEvent(e Event) bool { | ||||
| 	case w.Events <- e: | ||||
| 		return true | ||||
| 	case <-w.done: | ||||
| 		return false | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // Returns true if the error was sent, or false if watcher is closed. | ||||
| @ -207,11 +236,11 @@ func (w *Watcher) sendError(err error) bool { | ||||
| 	case w.Errors <- err: | ||||
| 		return true | ||||
| 	case <-w.done: | ||||
| 		return false | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // Close removes all watches and closes the events channel. | ||||
| // Close removes all watches and closes the Events channel. | ||||
| func (w *Watcher) Close() error { | ||||
| 	w.mu.Lock() | ||||
| 	if w.isClosed { | ||||
| @ -239,17 +268,21 @@ func (w *Watcher) Close() error { | ||||
| 
 | ||||
| // Add starts monitoring the path for changes. | ||||
| // | ||||
| // A path can only be watched once; attempting to watch it more than once will | ||||
| // return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // added. A watch will be automatically removed if the path is deleted. | ||||
| // A path can only be watched once; watching it more than once is a no-op and will | ||||
| // not return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // watched. | ||||
| // | ||||
| // A path will remain watched if it gets renamed to somewhere else on the same | ||||
| // filesystem, but the monitor will get removed if the path gets deleted and | ||||
| // re-created, or if it's moved to a different filesystem. | ||||
| // A watch will be automatically removed if the watched path is deleted or | ||||
| // renamed. The exception is the Windows backend, which doesn't remove the | ||||
| // watcher on renames. | ||||
| // | ||||
| // Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special | ||||
| // filesystems (/proc, /sys, etc.) generally don't work. | ||||
| // | ||||
| // Returns [ErrClosed] if [Watcher.Close] was called. | ||||
| // | ||||
| // See [Watcher.AddWith] for a version that allows adding options. | ||||
| // | ||||
| // # Watching directories | ||||
| // | ||||
| // All files in a directory are monitored, including new files that are created | ||||
| @ -259,15 +292,28 @@ func (w *Watcher) Close() error { | ||||
| // # Watching files | ||||
| // | ||||
| // Watching individual files (rather than directories) is generally not | ||||
| // recommended as many tools update files atomically. Instead of "just" writing | ||||
| // to the file a temporary file will be written to first, and if successful the | ||||
| // temporary file is moved to to destination removing the original, or some | ||||
| // variant thereof. The watcher on the original file is now lost, as it no | ||||
| // longer exists. | ||||
| // recommended as many programs (especially editors) update files atomically: it | ||||
| // will write to a temporary file which is then moved to to destination, | ||||
| // overwriting the original (or some variant thereof). The watcher on the | ||||
| // original file is now lost, as that no longer exists. | ||||
| // | ||||
| // Instead, watch the parent directory and use Event.Name to filter out files | ||||
| // you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. | ||||
| func (w *Watcher) Add(name string) error { | ||||
| // The upshot of this is that a power failure or crash won't leave a | ||||
| // half-written file. | ||||
| // | ||||
| // Watch the parent directory and use Event.Name to filter out files you're not | ||||
| // interested in. There is an example of this in cmd/fsnotify/file.go. | ||||
| func (w *Watcher) Add(name string) error { return w.AddWith(name) } | ||||
| 
 | ||||
| // AddWith is like [Watcher.Add], but allows adding options. When using Add() | ||||
| // the defaults described below are used. | ||||
| // | ||||
| // Possible options are: | ||||
| // | ||||
| //   - [WithBufferSize] sets the buffer size for the Windows backend; no-op on | ||||
| //     other platforms. The default is 64K (65536 bytes). | ||||
| func (w *Watcher) AddWith(name string, opts ...addOpt) error { | ||||
| 	_ = getOptions(opts...) | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	w.userWatches[name] = struct{}{} | ||||
| 	w.mu.Unlock() | ||||
| @ -281,9 +327,19 @@ func (w *Watcher) Add(name string) error { | ||||
| // /tmp/dir and /tmp/dir/subdir then you will need to remove both. | ||||
| // | ||||
| // Removing a path that has not yet been added returns [ErrNonExistentWatch]. | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) Remove(name string) error { | ||||
| 	return w.remove(name, true) | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) remove(name string, unwatchFiles bool) error { | ||||
| 	name = filepath.Clean(name) | ||||
| 	w.mu.Lock() | ||||
| 	if w.isClosed { | ||||
| 		w.mu.Unlock() | ||||
| 		return nil | ||||
| 	} | ||||
| 	watchfd, ok := w.watches[name] | ||||
| 	w.mu.Unlock() | ||||
| 	if !ok { | ||||
| @ -315,7 +371,7 @@ func (w *Watcher) Remove(name string) error { | ||||
| 	w.mu.Unlock() | ||||
| 
 | ||||
| 	// Find all watched paths that are in this directory that are not external. | ||||
| 	if isDir { | ||||
| 	if unwatchFiles && isDir { | ||||
| 		var pathsToRemove []string | ||||
| 		w.mu.Lock() | ||||
| 		for fd := range w.watchesByDir[name] { | ||||
| @ -326,20 +382,25 @@ func (w *Watcher) Remove(name string) error { | ||||
| 		} | ||||
| 		w.mu.Unlock() | ||||
| 		for _, name := range pathsToRemove { | ||||
| 			// Since these are internal, not much sense in propagating error | ||||
| 			// to the user, as that will just confuse them with an error about | ||||
| 			// a path they did not explicitly watch themselves. | ||||
| 			// Since these are internal, not much sense in propagating error to | ||||
| 			// the user, as that will just confuse them with an error about a | ||||
| 			// path they did not explicitly watch themselves. | ||||
| 			w.Remove(name) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // WatchList returns all paths added with [Add] (and are not yet removed). | ||||
| // WatchList returns all paths explicitly added with [Watcher.Add] (and are not | ||||
| // yet removed). | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) WatchList() []string { | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 	if w.isClosed { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	entries := make([]string, 0, len(w.userWatches)) | ||||
| 	for pathname := range w.userWatches { | ||||
| @ -352,18 +413,18 @@ func (w *Watcher) WatchList() []string { | ||||
| // Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) | ||||
| const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME | ||||
| 
 | ||||
| // addWatch adds name to the watched file set. | ||||
| // The flags are interpreted as described in kevent(2). | ||||
| // Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. | ||||
| // addWatch adds name to the watched file set; the flags are interpreted as | ||||
| // described in kevent(2). | ||||
| // | ||||
| // Returns the real path to the file which was added, with symlinks resolved. | ||||
| func (w *Watcher) addWatch(name string, flags uint32) (string, error) { | ||||
| 	var isDir bool | ||||
| 	// Make ./name and name equivalent | ||||
| 	name = filepath.Clean(name) | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	if w.isClosed { | ||||
| 		w.mu.Unlock() | ||||
| 		return "", errors.New("kevent instance already closed") | ||||
| 		return "", ErrClosed | ||||
| 	} | ||||
| 	watchfd, alreadyWatching := w.watches[name] | ||||
| 	// We already have a watch, but we can still override flags. | ||||
| @ -383,27 +444,30 @@ func (w *Watcher) addWatch(name string, flags uint32) (string, error) { | ||||
| 			return "", nil | ||||
| 		} | ||||
| 
 | ||||
| 		// Follow Symlinks | ||||
| 		// | ||||
| 		// Linux can add unresolvable symlinks to the watch list without issue, | ||||
| 		// and Windows can't do symlinks period. To maintain consistency, we | ||||
| 		// will act like everything is fine if the link can't be resolved. | ||||
| 		// There will simply be no file events for broken symlinks. Hence the | ||||
| 		// returns of nil on errors. | ||||
| 		// Follow Symlinks. | ||||
| 		if fi.Mode()&os.ModeSymlink == os.ModeSymlink { | ||||
| 			name, err = filepath.EvalSymlinks(name) | ||||
| 			link, err := os.Readlink(name) | ||||
| 			if err != nil { | ||||
| 				// Return nil because Linux can add unresolvable symlinks to the | ||||
| 				// watch list without problems, so maintain consistency with | ||||
| 				// that. There will be no file events for broken symlinks. | ||||
| 				// TODO: more specific check; returns os.PathError; ENOENT? | ||||
| 				return "", nil | ||||
| 			} | ||||
| 
 | ||||
| 			w.mu.Lock() | ||||
| 			_, alreadyWatching = w.watches[name] | ||||
| 			_, alreadyWatching = w.watches[link] | ||||
| 			w.mu.Unlock() | ||||
| 
 | ||||
| 			if alreadyWatching { | ||||
| 				return name, nil | ||||
| 				// Add to watches so we don't get spurious Create events later | ||||
| 				// on when we diff the directories. | ||||
| 				w.watches[name] = 0 | ||||
| 				w.fileExists[name] = struct{}{} | ||||
| 				return link, nil | ||||
| 			} | ||||
| 
 | ||||
| 			name = link | ||||
| 			fi, err = os.Lstat(name) | ||||
| 			if err != nil { | ||||
| 				return "", nil | ||||
| @ -411,7 +475,7 @@ func (w *Watcher) addWatch(name string, flags uint32) (string, error) { | ||||
| 		} | ||||
| 
 | ||||
| 		// Retry on EINTR; open() can return EINTR in practice on macOS. | ||||
| 		// See #354, and go issues 11180 and 39237. | ||||
| 		// See #354, and Go issues 11180 and 39237. | ||||
| 		for { | ||||
| 			watchfd, err = unix.Open(name, openMode, 0) | ||||
| 			if err == nil { | ||||
| @ -444,14 +508,13 @@ func (w *Watcher) addWatch(name string, flags uint32) (string, error) { | ||||
| 			w.watchesByDir[parentName] = watchesByDir | ||||
| 		} | ||||
| 		watchesByDir[watchfd] = struct{}{} | ||||
| 
 | ||||
| 		w.paths[watchfd] = pathInfo{name: name, isDir: isDir} | ||||
| 		w.mu.Unlock() | ||||
| 	} | ||||
| 
 | ||||
| 	if isDir { | ||||
| 		// Watch the directory if it has not been watched before, | ||||
| 		// or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) | ||||
| 		// Watch the directory if it has not been watched before, or if it was | ||||
| 		// watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) | ||||
| 		w.mu.Lock() | ||||
| 
 | ||||
| 		watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && | ||||
| @ -473,13 +536,10 @@ func (w *Watcher) addWatch(name string, flags uint32) (string, error) { | ||||
| // Event values that it sends down the Events channel. | ||||
| func (w *Watcher) readEvents() { | ||||
| 	defer func() { | ||||
| 		err := unix.Close(w.kq) | ||||
| 		if err != nil { | ||||
| 			w.Errors <- err | ||||
| 		} | ||||
| 		unix.Close(w.closepipe[0]) | ||||
| 		close(w.Events) | ||||
| 		close(w.Errors) | ||||
| 		_ = unix.Close(w.kq) | ||||
| 		unix.Close(w.closepipe[0]) | ||||
| 	}() | ||||
| 
 | ||||
| 	eventBuffer := make([]unix.Kevent_t, 10) | ||||
| @ -513,18 +573,8 @@ func (w *Watcher) readEvents() { | ||||
| 
 | ||||
| 			event := w.newEvent(path.name, mask) | ||||
| 
 | ||||
| 			if path.isDir && !event.Has(Remove) { | ||||
| 				// Double check to make sure the directory exists. This can | ||||
| 				// happen when we do a rm -fr on a recursively watched folders | ||||
| 				// and we receive a modification event first but the folder has | ||||
| 				// been deleted and later receive the delete event. | ||||
| 				if _, err := os.Lstat(event.Name); os.IsNotExist(err) { | ||||
| 					event.Op |= Remove | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if event.Has(Rename) || event.Has(Remove) { | ||||
| 				w.Remove(event.Name) | ||||
| 				w.remove(event.Name, false) | ||||
| 				w.mu.Lock() | ||||
| 				delete(w.fileExists, event.Name) | ||||
| 				w.mu.Unlock() | ||||
| @ -540,26 +590,30 @@ func (w *Watcher) readEvents() { | ||||
| 			} | ||||
| 
 | ||||
| 			if event.Has(Remove) { | ||||
| 				// Look for a file that may have overwritten this. | ||||
| 				// For example, mv f1 f2 will delete f2, then create f2. | ||||
| 				// Look for a file that may have overwritten this; for example, | ||||
| 				// mv f1 f2 will delete f2, then create f2. | ||||
| 				if path.isDir { | ||||
| 					fileDir := filepath.Clean(event.Name) | ||||
| 					w.mu.Lock() | ||||
| 					_, found := w.watches[fileDir] | ||||
| 					w.mu.Unlock() | ||||
| 					if found { | ||||
| 						// make sure the directory exists before we watch for changes. When we | ||||
| 						// do a recursive watch and perform rm -fr, the parent directory might | ||||
| 						// have gone missing, ignore the missing directory and let the | ||||
| 						// upcoming delete event remove the watch from the parent directory. | ||||
| 						if _, err := os.Lstat(fileDir); err == nil { | ||||
| 							w.sendDirectoryChangeEvents(fileDir) | ||||
| 						err := w.sendDirectoryChangeEvents(fileDir) | ||||
| 						if err != nil { | ||||
| 							if !w.sendError(err) { | ||||
| 								closed = true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} else { | ||||
| 					filePath := filepath.Clean(event.Name) | ||||
| 					if fileInfo, err := os.Lstat(filePath); err == nil { | ||||
| 						w.sendFileCreatedEventIfNew(filePath, fileInfo) | ||||
| 					if fi, err := os.Lstat(filePath); err == nil { | ||||
| 						err := w.sendFileCreatedEventIfNew(filePath, fi) | ||||
| 						if err != nil { | ||||
| 							if !w.sendError(err) { | ||||
| 								closed = true | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| @ -582,21 +636,31 @@ func (w *Watcher) newEvent(name string, mask uint32) Event { | ||||
| 	if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { | ||||
| 		e.Op |= Chmod | ||||
| 	} | ||||
| 	// No point sending a write and delete event at the same time: if it's gone, | ||||
| 	// then it's gone. | ||||
| 	if e.Op.Has(Write) && e.Op.Has(Remove) { | ||||
| 		e.Op &^= Write | ||||
| 	} | ||||
| 	return e | ||||
| } | ||||
| 
 | ||||
| // watchDirectoryFiles to mimic inotify when adding a watch on a directory | ||||
| func (w *Watcher) watchDirectoryFiles(dirPath string) error { | ||||
| 	// Get all files | ||||
| 	files, err := ioutil.ReadDir(dirPath) | ||||
| 	files, err := os.ReadDir(dirPath) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	for _, fileInfo := range files { | ||||
| 		path := filepath.Join(dirPath, fileInfo.Name()) | ||||
| 	for _, f := range files { | ||||
| 		path := filepath.Join(dirPath, f.Name()) | ||||
| 
 | ||||
| 		cleanPath, err := w.internalWatch(path, fileInfo) | ||||
| 		fi, err := f.Info() | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("%q: %w", path, err) | ||||
| 		} | ||||
| 
 | ||||
| 		cleanPath, err := w.internalWatch(path, fi) | ||||
| 		if err != nil { | ||||
| 			// No permission to read the file; that's not a problem: just skip. | ||||
| 			// But do add it to w.fileExists to prevent it from being picked up | ||||
| @ -606,7 +670,7 @@ func (w *Watcher) watchDirectoryFiles(dirPath string) error { | ||||
| 			case errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM): | ||||
| 				cleanPath = filepath.Clean(path) | ||||
| 			default: | ||||
| 				return fmt.Errorf("%q: %w", filepath.Join(dirPath, fileInfo.Name()), err) | ||||
| 				return fmt.Errorf("%q: %w", path, err) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| @ -622,26 +686,37 @@ func (w *Watcher) watchDirectoryFiles(dirPath string) error { | ||||
| // | ||||
| // This functionality is to have the BSD watcher match the inotify, which sends | ||||
| // a create event for files created in a watched directory. | ||||
| func (w *Watcher) sendDirectoryChangeEvents(dir string) { | ||||
| 	// Get all files | ||||
| 	files, err := ioutil.ReadDir(dir) | ||||
| func (w *Watcher) sendDirectoryChangeEvents(dir string) error { | ||||
| 	files, err := os.ReadDir(dir) | ||||
| 	if err != nil { | ||||
| 		if !w.sendError(fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err)) { | ||||
| 			return | ||||
| 		// Directory no longer exists: we can ignore this safely. kqueue will | ||||
| 		// still give us the correct events. | ||||
| 		if errors.Is(err, os.ErrNotExist) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Search for new files | ||||
| 	for _, fi := range files { | ||||
| 		err := w.sendFileCreatedEventIfNew(filepath.Join(dir, fi.Name()), fi) | ||||
| 	for _, f := range files { | ||||
| 		fi, err := f.Info() | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 			return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err) | ||||
| 		} | ||||
| 
 | ||||
| 		err = w.sendFileCreatedEventIfNew(filepath.Join(dir, fi.Name()), fi) | ||||
| 		if err != nil { | ||||
| 			// Don't need to send an error if this file isn't readable. | ||||
| 			if errors.Is(err, unix.EACCES) || errors.Is(err, unix.EPERM) { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return fmt.Errorf("fsnotify.sendDirectoryChangeEvents: %w", err) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // sendFileCreatedEvent sends a create event if the file isn't already being tracked. | ||||
| func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { | ||||
| func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fi os.FileInfo) (err error) { | ||||
| 	w.mu.Lock() | ||||
| 	_, doesExist := w.fileExists[filePath] | ||||
| 	w.mu.Unlock() | ||||
| @ -652,7 +727,7 @@ func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInf | ||||
| 	} | ||||
| 
 | ||||
| 	// like watchDirectoryFiles (but without doing another ReadDir) | ||||
| 	filePath, err = w.internalWatch(filePath, fileInfo) | ||||
| 	filePath, err = w.internalWatch(filePath, fi) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @ -664,10 +739,10 @@ func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInf | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { | ||||
| 	if fileInfo.IsDir() { | ||||
| 		// mimic Linux providing delete events for subdirectories | ||||
| 		// but preserve the flags used if currently watching subdirectory | ||||
| func (w *Watcher) internalWatch(name string, fi os.FileInfo) (string, error) { | ||||
| 	if fi.IsDir() { | ||||
| 		// mimic Linux providing delete events for subdirectories, but preserve | ||||
| 		// the flags used if currently watching subdirectory | ||||
| 		w.mu.Lock() | ||||
| 		flags := w.dirFlags[name] | ||||
| 		w.mu.Unlock() | ||||
|  | ||||
							
								
								
									
										203
									
								
								vendor/github.com/fsnotify/fsnotify/backend_other.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										203
									
								
								vendor/github.com/fsnotify/fsnotify/backend_other.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,39 +1,169 @@ | ||||
| //go:build !darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows | ||||
| // +build !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows | ||||
| //go:build appengine || (!darwin && !dragonfly && !freebsd && !openbsd && !linux && !netbsd && !solaris && !windows) | ||||
| // +build appengine !darwin,!dragonfly,!freebsd,!openbsd,!linux,!netbsd,!solaris,!windows | ||||
| 
 | ||||
| // Note: the documentation on the Watcher type and methods is generated from | ||||
| // mkdoc.zsh | ||||
| 
 | ||||
| package fsnotify | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"runtime" | ||||
| ) | ||||
| import "errors" | ||||
| 
 | ||||
| // Watcher watches a set of files, delivering events to a channel. | ||||
| type Watcher struct{} | ||||
| // Watcher watches a set of paths, delivering events on a channel. | ||||
| // | ||||
| // A watcher should not be copied (e.g. pass it by pointer, rather than by | ||||
| // value). | ||||
| // | ||||
| // # Linux notes | ||||
| // | ||||
| // When a file is removed a Remove event won't be emitted until all file | ||||
| // descriptors are closed, and deletes will always emit a Chmod. For example: | ||||
| // | ||||
| //	fp := os.Open("file") | ||||
| //	os.Remove("file")        // Triggers Chmod | ||||
| //	fp.Close()               // Triggers Remove | ||||
| // | ||||
| // This is the event that inotify sends, so not much can be changed about this. | ||||
| // | ||||
| // The fs.inotify.max_user_watches sysctl variable specifies the upper limit | ||||
| // for the number of watches per user, and fs.inotify.max_user_instances | ||||
| // specifies the maximum number of inotify instances per user. Every Watcher you | ||||
| // create is an "instance", and every path you add is a "watch". | ||||
| // | ||||
| // These are also exposed in /proc as /proc/sys/fs/inotify/max_user_watches and | ||||
| // /proc/sys/fs/inotify/max_user_instances | ||||
| // | ||||
| // To increase them you can use sysctl or write the value to the /proc file: | ||||
| // | ||||
| //	# Default values on Linux 5.18 | ||||
| //	sysctl fs.inotify.max_user_watches=124983 | ||||
| //	sysctl fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // To make the changes persist on reboot edit /etc/sysctl.conf or | ||||
| // /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check | ||||
| // your distro's documentation): | ||||
| // | ||||
| //	fs.inotify.max_user_watches=124983 | ||||
| //	fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // Reaching the limit will result in a "no space left on device" or "too many open | ||||
| // files" error. | ||||
| // | ||||
| // # kqueue notes (macOS, BSD) | ||||
| // | ||||
| // kqueue requires opening a file descriptor for every file that's being watched; | ||||
| // so if you're watching a directory with five files then that's six file | ||||
| // descriptors. You will run in to your system's "max open files" limit faster on | ||||
| // these platforms. | ||||
| // | ||||
| // The sysctl variables kern.maxfiles and kern.maxfilesperproc can be used to | ||||
| // control the maximum number of open files, as well as /etc/login.conf on BSD | ||||
| // systems. | ||||
| // | ||||
| // # Windows notes | ||||
| // | ||||
| // Paths can be added as "C:\path\to\dir", but forward slashes | ||||
| // ("C:/path/to/dir") will also work. | ||||
| // | ||||
| // When a watched directory is removed it will always send an event for the | ||||
| // directory itself, but may not send events for all files in that directory. | ||||
| // Sometimes it will send events for all times, sometimes it will send no | ||||
| // events, and often only for some files. | ||||
| // | ||||
| // The default ReadDirectoryChangesW() buffer size is 64K, which is the largest | ||||
| // value that is guaranteed to work with SMB filesystems. If you have many | ||||
| // events in quick succession this may not be enough, and you will have to use | ||||
| // [WithBufferSize] to increase the value. | ||||
| type Watcher struct { | ||||
| 	// Events sends the filesystem change events. | ||||
| 	// | ||||
| 	// fsnotify can send the following events; a "path" here can refer to a | ||||
| 	// file, directory, symbolic link, or special file like a FIFO. | ||||
| 	// | ||||
| 	//   fsnotify.Create    A new path was created; this may be followed by one | ||||
| 	//                      or more Write events if data also gets written to a | ||||
| 	//                      file. | ||||
| 	// | ||||
| 	//   fsnotify.Remove    A path was removed. | ||||
| 	// | ||||
| 	//   fsnotify.Rename    A path was renamed. A rename is always sent with the | ||||
| 	//                      old path as Event.Name, and a Create event will be | ||||
| 	//                      sent with the new name. Renames are only sent for | ||||
| 	//                      paths that are currently watched; e.g. moving an | ||||
| 	//                      unmonitored file into a monitored directory will | ||||
| 	//                      show up as just a Create. Similarly, renaming a file | ||||
| 	//                      to outside a monitored directory will show up as | ||||
| 	//                      only a Rename. | ||||
| 	// | ||||
| 	//   fsnotify.Write     A file or named pipe was written to. A Truncate will | ||||
| 	//                      also trigger a Write. A single "write action" | ||||
| 	//                      initiated by the user may show up as one or multiple | ||||
| 	//                      writes, depending on when the system syncs things to | ||||
| 	//                      disk. For example when compiling a large Go program | ||||
| 	//                      you may get hundreds of Write events, and you may | ||||
| 	//                      want to wait until you've stopped receiving them | ||||
| 	//                      (see the dedup example in cmd/fsnotify). | ||||
| 	// | ||||
| 	//                      Some systems may send Write event for directories | ||||
| 	//                      when the directory content changes. | ||||
| 	// | ||||
| 	//   fsnotify.Chmod     Attributes were changed. On Linux this is also sent | ||||
| 	//                      when a file is removed (or more accurately, when a | ||||
| 	//                      link to an inode is removed). On kqueue it's sent | ||||
| 	//                      when a file is truncated. On Windows it's never | ||||
| 	//                      sent. | ||||
| 	Events chan Event | ||||
| 
 | ||||
| 	// Errors sends any errors. | ||||
| 	// | ||||
| 	// ErrEventOverflow is used to indicate there are too many events: | ||||
| 	// | ||||
| 	//  - inotify:      There are too many queued events (fs.inotify.max_queued_events sysctl) | ||||
| 	//  - windows:      The buffer size is too small; WithBufferSize() can be used to increase it. | ||||
| 	//  - kqueue, fen:  Not used. | ||||
| 	Errors chan error | ||||
| } | ||||
| 
 | ||||
| // NewWatcher creates a new Watcher. | ||||
| func NewWatcher() (*Watcher, error) { | ||||
| 	return nil, fmt.Errorf("fsnotify not supported on %s", runtime.GOOS) | ||||
| 	return nil, errors.New("fsnotify not supported on the current platform") | ||||
| } | ||||
| 
 | ||||
| // Close removes all watches and closes the events channel. | ||||
| func (w *Watcher) Close() error { | ||||
| 	return nil | ||||
| } | ||||
| // NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events | ||||
| // channel. | ||||
| // | ||||
| // The main use case for this is situations with a very large number of events | ||||
| // where the kernel buffer size can't be increased (e.g. due to lack of | ||||
| // permissions). An unbuffered Watcher will perform better for almost all use | ||||
| // cases, and whenever possible you will be better off increasing the kernel | ||||
| // buffers instead of adding a large userspace buffer. | ||||
| func NewBufferedWatcher(sz uint) (*Watcher, error) { return NewWatcher() } | ||||
| 
 | ||||
| // Close removes all watches and closes the Events channel. | ||||
| func (w *Watcher) Close() error { return nil } | ||||
| 
 | ||||
| // WatchList returns all paths explicitly added with [Watcher.Add] (and are not | ||||
| // yet removed). | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) WatchList() []string { return nil } | ||||
| 
 | ||||
| // Add starts monitoring the path for changes. | ||||
| // | ||||
| // A path can only be watched once; attempting to watch it more than once will | ||||
| // return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // added. A watch will be automatically removed if the path is deleted. | ||||
| // A path can only be watched once; watching it more than once is a no-op and will | ||||
| // not return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // watched. | ||||
| // | ||||
| // A path will remain watched if it gets renamed to somewhere else on the same | ||||
| // filesystem, but the monitor will get removed if the path gets deleted and | ||||
| // re-created, or if it's moved to a different filesystem. | ||||
| // A watch will be automatically removed if the watched path is deleted or | ||||
| // renamed. The exception is the Windows backend, which doesn't remove the | ||||
| // watcher on renames. | ||||
| // | ||||
| // Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special | ||||
| // filesystems (/proc, /sys, etc.) generally don't work. | ||||
| // | ||||
| // Returns [ErrClosed] if [Watcher.Close] was called. | ||||
| // | ||||
| // See [Watcher.AddWith] for a version that allows adding options. | ||||
| // | ||||
| // # Watching directories | ||||
| // | ||||
| // All files in a directory are monitored, including new files that are created | ||||
| @ -43,17 +173,26 @@ func (w *Watcher) Close() error { | ||||
| // # Watching files | ||||
| // | ||||
| // Watching individual files (rather than directories) is generally not | ||||
| // recommended as many tools update files atomically. Instead of "just" writing | ||||
| // to the file a temporary file will be written to first, and if successful the | ||||
| // temporary file is moved to to destination removing the original, or some | ||||
| // variant thereof. The watcher on the original file is now lost, as it no | ||||
| // longer exists. | ||||
| // recommended as many programs (especially editors) update files atomically: it | ||||
| // will write to a temporary file which is then moved to to destination, | ||||
| // overwriting the original (or some variant thereof). The watcher on the | ||||
| // original file is now lost, as that no longer exists. | ||||
| // | ||||
| // Instead, watch the parent directory and use Event.Name to filter out files | ||||
| // you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. | ||||
| func (w *Watcher) Add(name string) error { | ||||
| 	return nil | ||||
| } | ||||
| // The upshot of this is that a power failure or crash won't leave a | ||||
| // half-written file. | ||||
| // | ||||
| // Watch the parent directory and use Event.Name to filter out files you're not | ||||
| // interested in. There is an example of this in cmd/fsnotify/file.go. | ||||
| func (w *Watcher) Add(name string) error { return nil } | ||||
| 
 | ||||
| // AddWith is like [Watcher.Add], but allows adding options. When using Add() | ||||
| // the defaults described below are used. | ||||
| // | ||||
| // Possible options are: | ||||
| // | ||||
| //   - [WithBufferSize] sets the buffer size for the Windows backend; no-op on | ||||
| //     other platforms. The default is 64K (65536 bytes). | ||||
| func (w *Watcher) AddWith(name string, opts ...addOpt) error { return nil } | ||||
| 
 | ||||
| // Remove stops monitoring the path for changes. | ||||
| // | ||||
| @ -61,6 +200,6 @@ func (w *Watcher) Add(name string) error { | ||||
| // /tmp/dir and /tmp/dir/subdir then you will need to remove both. | ||||
| // | ||||
| // Removing a path that has not yet been added returns [ErrNonExistentWatch]. | ||||
| func (w *Watcher) Remove(name string) error { | ||||
| 	return nil | ||||
| } | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) Remove(name string) error { return nil } | ||||
|  | ||||
							
								
								
									
										245
									
								
								vendor/github.com/fsnotify/fsnotify/backend_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										245
									
								
								vendor/github.com/fsnotify/fsnotify/backend_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,6 +1,13 @@ | ||||
| //go:build windows | ||||
| // +build windows | ||||
| 
 | ||||
| // Windows backend based on ReadDirectoryChangesW() | ||||
| // | ||||
| // https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw | ||||
| // | ||||
| // Note: the documentation on the Watcher type and methods is generated from | ||||
| // mkdoc.zsh | ||||
| 
 | ||||
| package fsnotify | ||||
| 
 | ||||
| import ( | ||||
| @ -27,9 +34,9 @@ import ( | ||||
| // When a file is removed a Remove event won't be emitted until all file | ||||
| // descriptors are closed, and deletes will always emit a Chmod. For example: | ||||
| // | ||||
| //     fp := os.Open("file") | ||||
| //     os.Remove("file")        // Triggers Chmod | ||||
| //     fp.Close()               // Triggers Remove | ||||
| //	fp := os.Open("file") | ||||
| //	os.Remove("file")        // Triggers Chmod | ||||
| //	fp.Close()               // Triggers Remove | ||||
| // | ||||
| // This is the event that inotify sends, so not much can be changed about this. | ||||
| // | ||||
| @ -43,16 +50,16 @@ import ( | ||||
| // | ||||
| // To increase them you can use sysctl or write the value to the /proc file: | ||||
| // | ||||
| //     # Default values on Linux 5.18 | ||||
| //     sysctl fs.inotify.max_user_watches=124983 | ||||
| //     sysctl fs.inotify.max_user_instances=128 | ||||
| //	# Default values on Linux 5.18 | ||||
| //	sysctl fs.inotify.max_user_watches=124983 | ||||
| //	sysctl fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // To make the changes persist on reboot edit /etc/sysctl.conf or | ||||
| // /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check | ||||
| // your distro's documentation): | ||||
| // | ||||
| //     fs.inotify.max_user_watches=124983 | ||||
| //     fs.inotify.max_user_instances=128 | ||||
| //	fs.inotify.max_user_watches=124983 | ||||
| //	fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // Reaching the limit will result in a "no space left on device" or "too many open | ||||
| // files" error. | ||||
| @ -68,14 +75,20 @@ import ( | ||||
| // control the maximum number of open files, as well as /etc/login.conf on BSD | ||||
| // systems. | ||||
| // | ||||
| // # macOS notes | ||||
| // # Windows notes | ||||
| // | ||||
| // Spotlight indexing on macOS can result in multiple events (see [#15]). A | ||||
| // temporary workaround is to add your folder(s) to the "Spotlight Privacy | ||||
| // Settings" until we have a native FSEvents implementation (see [#11]). | ||||
| // Paths can be added as "C:\path\to\dir", but forward slashes | ||||
| // ("C:/path/to/dir") will also work. | ||||
| // | ||||
| // [#11]: https://github.com/fsnotify/fsnotify/issues/11 | ||||
| // [#15]: https://github.com/fsnotify/fsnotify/issues/15 | ||||
| // When a watched directory is removed it will always send an event for the | ||||
| // directory itself, but may not send events for all files in that directory. | ||||
| // Sometimes it will send events for all times, sometimes it will send no | ||||
| // events, and often only for some files. | ||||
| // | ||||
| // The default ReadDirectoryChangesW() buffer size is 64K, which is the largest | ||||
| // value that is guaranteed to work with SMB filesystems. If you have many | ||||
| // events in quick succession this may not be enough, and you will have to use | ||||
| // [WithBufferSize] to increase the value. | ||||
| type Watcher struct { | ||||
| 	// Events sends the filesystem change events. | ||||
| 	// | ||||
| @ -102,31 +115,52 @@ type Watcher struct { | ||||
| 	//                      initiated by the user may show up as one or multiple | ||||
| 	//                      writes, depending on when the system syncs things to | ||||
| 	//                      disk. For example when compiling a large Go program | ||||
| 	//                      you may get hundreds of Write events, so you | ||||
| 	//                      probably want to wait until you've stopped receiving | ||||
| 	//                      them (see the dedup example in cmd/fsnotify). | ||||
| 	//                      you may get hundreds of Write events, and you may | ||||
| 	//                      want to wait until you've stopped receiving them | ||||
| 	//                      (see the dedup example in cmd/fsnotify). | ||||
| 	// | ||||
| 	//                      Some systems may send Write event for directories | ||||
| 	//                      when the directory content changes. | ||||
| 	// | ||||
| 	//   fsnotify.Chmod     Attributes were changed. On Linux this is also sent | ||||
| 	//                      when a file is removed (or more accurately, when a | ||||
| 	//                      link to an inode is removed). On kqueue it's sent | ||||
| 	//                      and on kqueue when a file is truncated. On Windows | ||||
| 	//                      it's never sent. | ||||
| 	//                      when a file is truncated. On Windows it's never | ||||
| 	//                      sent. | ||||
| 	Events chan Event | ||||
| 
 | ||||
| 	// Errors sends any errors. | ||||
| 	// | ||||
| 	// ErrEventOverflow is used to indicate there are too many events: | ||||
| 	// | ||||
| 	//  - inotify:      There are too many queued events (fs.inotify.max_queued_events sysctl) | ||||
| 	//  - windows:      The buffer size is too small; WithBufferSize() can be used to increase it. | ||||
| 	//  - kqueue, fen:  Not used. | ||||
| 	Errors chan error | ||||
| 
 | ||||
| 	port  windows.Handle // Handle to completion port | ||||
| 	input chan *input    // Inputs to the reader are sent on this channel | ||||
| 	quit  chan chan<- error | ||||
| 
 | ||||
| 	mu       sync.Mutex // Protects access to watches, isClosed | ||||
| 	watches  watchMap   // Map of watches (key: i-number) | ||||
| 	isClosed bool       // Set to true when Close() is first called | ||||
| 	mu      sync.Mutex // Protects access to watches, closed | ||||
| 	watches watchMap   // Map of watches (key: i-number) | ||||
| 	closed  bool       // Set to true when Close() is first called | ||||
| } | ||||
| 
 | ||||
| // NewWatcher creates a new Watcher. | ||||
| func NewWatcher() (*Watcher, error) { | ||||
| 	return NewBufferedWatcher(50) | ||||
| } | ||||
| 
 | ||||
| // NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events | ||||
| // channel. | ||||
| // | ||||
| // The main use case for this is situations with a very large number of events | ||||
| // where the kernel buffer size can't be increased (e.g. due to lack of | ||||
| // permissions). An unbuffered Watcher will perform better for almost all use | ||||
| // cases, and whenever possible you will be better off increasing the kernel | ||||
| // buffers instead of adding a large userspace buffer. | ||||
| func NewBufferedWatcher(sz uint) (*Watcher, error) { | ||||
| 	port, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0) | ||||
| 	if err != nil { | ||||
| 		return nil, os.NewSyscallError("CreateIoCompletionPort", err) | ||||
| @ -135,7 +169,7 @@ func NewWatcher() (*Watcher, error) { | ||||
| 		port:    port, | ||||
| 		watches: make(watchMap), | ||||
| 		input:   make(chan *input, 1), | ||||
| 		Events:  make(chan Event, 50), | ||||
| 		Events:  make(chan Event, sz), | ||||
| 		Errors:  make(chan error), | ||||
| 		quit:    make(chan chan<- error, 1), | ||||
| 	} | ||||
| @ -143,6 +177,12 @@ func NewWatcher() (*Watcher, error) { | ||||
| 	return w, nil | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) isClosed() bool { | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 	return w.closed | ||||
| } | ||||
| 
 | ||||
| func (w *Watcher) sendEvent(name string, mask uint64) bool { | ||||
| 	if mask == 0 { | ||||
| 		return false | ||||
| @ -167,14 +207,14 @@ func (w *Watcher) sendError(err error) bool { | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // Close removes all watches and closes the events channel. | ||||
| // Close removes all watches and closes the Events channel. | ||||
| func (w *Watcher) Close() error { | ||||
| 	w.mu.Lock() | ||||
| 	if w.isClosed { | ||||
| 		w.mu.Unlock() | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 	w.isClosed = true | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	w.closed = true | ||||
| 	w.mu.Unlock() | ||||
| 
 | ||||
| 	// Send "quit" message to the reader goroutine | ||||
| @ -188,17 +228,21 @@ func (w *Watcher) Close() error { | ||||
| 
 | ||||
| // Add starts monitoring the path for changes. | ||||
| // | ||||
| // A path can only be watched once; attempting to watch it more than once will | ||||
| // return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // added. A watch will be automatically removed if the path is deleted. | ||||
| // A path can only be watched once; watching it more than once is a no-op and will | ||||
| // not return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // watched. | ||||
| // | ||||
| // A path will remain watched if it gets renamed to somewhere else on the same | ||||
| // filesystem, but the monitor will get removed if the path gets deleted and | ||||
| // re-created, or if it's moved to a different filesystem. | ||||
| // A watch will be automatically removed if the watched path is deleted or | ||||
| // renamed. The exception is the Windows backend, which doesn't remove the | ||||
| // watcher on renames. | ||||
| // | ||||
| // Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special | ||||
| // filesystems (/proc, /sys, etc.) generally don't work. | ||||
| // | ||||
| // Returns [ErrClosed] if [Watcher.Close] was called. | ||||
| // | ||||
| // See [Watcher.AddWith] for a version that allows adding options. | ||||
| // | ||||
| // # Watching directories | ||||
| // | ||||
| // All files in a directory are monitored, including new files that are created | ||||
| @ -208,27 +252,41 @@ func (w *Watcher) Close() error { | ||||
| // # Watching files | ||||
| // | ||||
| // Watching individual files (rather than directories) is generally not | ||||
| // recommended as many tools update files atomically. Instead of "just" writing | ||||
| // to the file a temporary file will be written to first, and if successful the | ||||
| // temporary file is moved to to destination removing the original, or some | ||||
| // variant thereof. The watcher on the original file is now lost, as it no | ||||
| // longer exists. | ||||
| // recommended as many programs (especially editors) update files atomically: it | ||||
| // will write to a temporary file which is then moved to to destination, | ||||
| // overwriting the original (or some variant thereof). The watcher on the | ||||
| // original file is now lost, as that no longer exists. | ||||
| // | ||||
| // Instead, watch the parent directory and use Event.Name to filter out files | ||||
| // you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. | ||||
| func (w *Watcher) Add(name string) error { | ||||
| 	w.mu.Lock() | ||||
| 	if w.isClosed { | ||||
| 		w.mu.Unlock() | ||||
| 		return errors.New("watcher already closed") | ||||
| // The upshot of this is that a power failure or crash won't leave a | ||||
| // half-written file. | ||||
| // | ||||
| // Watch the parent directory and use Event.Name to filter out files you're not | ||||
| // interested in. There is an example of this in cmd/fsnotify/file.go. | ||||
| func (w *Watcher) Add(name string) error { return w.AddWith(name) } | ||||
| 
 | ||||
| // AddWith is like [Watcher.Add], but allows adding options. When using Add() | ||||
| // the defaults described below are used. | ||||
| // | ||||
| // Possible options are: | ||||
| // | ||||
| //   - [WithBufferSize] sets the buffer size for the Windows backend; no-op on | ||||
| //     other platforms. The default is 64K (65536 bytes). | ||||
| func (w *Watcher) AddWith(name string, opts ...addOpt) error { | ||||
| 	if w.isClosed() { | ||||
| 		return ErrClosed | ||||
| 	} | ||||
| 
 | ||||
| 	with := getOptions(opts...) | ||||
| 	if with.bufsize < 4096 { | ||||
| 		return fmt.Errorf("fsnotify.WithBufferSize: buffer size cannot be smaller than 4096 bytes") | ||||
| 	} | ||||
| 	w.mu.Unlock() | ||||
| 
 | ||||
| 	in := &input{ | ||||
| 		op:    opAddWatch, | ||||
| 		path:  filepath.Clean(name), | ||||
| 		flags: sysFSALLEVENTS, | ||||
| 		reply: make(chan error), | ||||
| 		op:      opAddWatch, | ||||
| 		path:    filepath.Clean(name), | ||||
| 		flags:   sysFSALLEVENTS, | ||||
| 		reply:   make(chan error), | ||||
| 		bufsize: with.bufsize, | ||||
| 	} | ||||
| 	w.input <- in | ||||
| 	if err := w.wakeupReader(); err != nil { | ||||
| @ -243,7 +301,13 @@ func (w *Watcher) Add(name string) error { | ||||
| // /tmp/dir and /tmp/dir/subdir then you will need to remove both. | ||||
| // | ||||
| // Removing a path that has not yet been added returns [ErrNonExistentWatch]. | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) Remove(name string) error { | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	in := &input{ | ||||
| 		op:    opRemoveWatch, | ||||
| 		path:  filepath.Clean(name), | ||||
| @ -256,8 +320,15 @@ func (w *Watcher) Remove(name string) error { | ||||
| 	return <-in.reply | ||||
| } | ||||
| 
 | ||||
| // WatchList returns all paths added with [Add] (and are not yet removed). | ||||
| // WatchList returns all paths explicitly added with [Watcher.Add] (and are not | ||||
| // yet removed). | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| func (w *Watcher) WatchList() []string { | ||||
| 	if w.isClosed() { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	w.mu.Lock() | ||||
| 	defer w.mu.Unlock() | ||||
| 
 | ||||
| @ -279,7 +350,6 @@ func (w *Watcher) WatchList() []string { | ||||
| // This should all be removed at some point, and just use windows.FILE_NOTIFY_* | ||||
| const ( | ||||
| 	sysFSALLEVENTS  = 0xfff | ||||
| 	sysFSATTRIB     = 0x4 | ||||
| 	sysFSCREATE     = 0x100 | ||||
| 	sysFSDELETE     = 0x200 | ||||
| 	sysFSDELETESELF = 0x400 | ||||
| @ -305,9 +375,6 @@ func (w *Watcher) newEvent(name string, mask uint32) Event { | ||||
| 	if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { | ||||
| 		e.Op |= Rename | ||||
| 	} | ||||
| 	if mask&sysFSATTRIB == sysFSATTRIB { | ||||
| 		e.Op |= Chmod | ||||
| 	} | ||||
| 	return e | ||||
| } | ||||
| 
 | ||||
| @ -321,10 +388,11 @@ const ( | ||||
| ) | ||||
| 
 | ||||
| type input struct { | ||||
| 	op    int | ||||
| 	path  string | ||||
| 	flags uint32 | ||||
| 	reply chan error | ||||
| 	op      int | ||||
| 	path    string | ||||
| 	flags   uint32 | ||||
| 	bufsize int | ||||
| 	reply   chan error | ||||
| } | ||||
| 
 | ||||
| type inode struct { | ||||
| @ -334,13 +402,14 @@ type inode struct { | ||||
| } | ||||
| 
 | ||||
| type watch struct { | ||||
| 	ov     windows.Overlapped | ||||
| 	ino    *inode            // i-number | ||||
| 	path   string            // Directory path | ||||
| 	mask   uint64            // Directory itself is being watched with these notify flags | ||||
| 	names  map[string]uint64 // Map of names being watched and their notify flags | ||||
| 	rename string            // Remembers the old name while renaming a file | ||||
| 	buf    [65536]byte       // 64K buffer | ||||
| 	ov      windows.Overlapped | ||||
| 	ino     *inode            // i-number | ||||
| 	recurse bool              // Recursive watch? | ||||
| 	path    string            // Directory path | ||||
| 	mask    uint64            // Directory itself is being watched with these notify flags | ||||
| 	names   map[string]uint64 // Map of names being watched and their notify flags | ||||
| 	rename  string            // Remembers the old name while renaming a file | ||||
| 	buf     []byte            // buffer, allocated later | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| @ -413,7 +482,10 @@ func (m watchMap) set(ino *inode, watch *watch) { | ||||
| } | ||||
| 
 | ||||
| // Must run within the I/O thread. | ||||
| func (w *Watcher) addWatch(pathname string, flags uint64) error { | ||||
| func (w *Watcher) addWatch(pathname string, flags uint64, bufsize int) error { | ||||
| 	//pathname, recurse := recursivePath(pathname) | ||||
| 	recurse := false | ||||
| 
 | ||||
| 	dir, err := w.getDir(pathname) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @ -433,9 +505,11 @@ func (w *Watcher) addWatch(pathname string, flags uint64) error { | ||||
| 			return os.NewSyscallError("CreateIoCompletionPort", err) | ||||
| 		} | ||||
| 		watchEntry = &watch{ | ||||
| 			ino:   ino, | ||||
| 			path:  dir, | ||||
| 			names: make(map[string]uint64), | ||||
| 			ino:     ino, | ||||
| 			path:    dir, | ||||
| 			names:   make(map[string]uint64), | ||||
| 			recurse: recurse, | ||||
| 			buf:     make([]byte, bufsize), | ||||
| 		} | ||||
| 		w.mu.Lock() | ||||
| 		w.watches.set(ino, watchEntry) | ||||
| @ -465,6 +539,8 @@ func (w *Watcher) addWatch(pathname string, flags uint64) error { | ||||
| 
 | ||||
| // Must run within the I/O thread. | ||||
| func (w *Watcher) remWatch(pathname string) error { | ||||
| 	pathname, recurse := recursivePath(pathname) | ||||
| 
 | ||||
| 	dir, err := w.getDir(pathname) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| @ -478,6 +554,10 @@ func (w *Watcher) remWatch(pathname string) error { | ||||
| 	watch := w.watches.get(ino) | ||||
| 	w.mu.Unlock() | ||||
| 
 | ||||
| 	if recurse && !watch.recurse { | ||||
| 		return fmt.Errorf("can't use \\... with non-recursive watch %q", pathname) | ||||
| 	} | ||||
| 
 | ||||
| 	err = windows.CloseHandle(ino.handle) | ||||
| 	if err != nil { | ||||
| 		w.sendError(os.NewSyscallError("CloseHandle", err)) | ||||
| @ -535,8 +615,11 @@ func (w *Watcher) startRead(watch *watch) error { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	rdErr := windows.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], | ||||
| 		uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) | ||||
| 	// We need to pass the array, rather than the slice. | ||||
| 	hdr := (*reflect.SliceHeader)(unsafe.Pointer(&watch.buf)) | ||||
| 	rdErr := windows.ReadDirectoryChanges(watch.ino.handle, | ||||
| 		(*byte)(unsafe.Pointer(hdr.Data)), uint32(hdr.Len), | ||||
| 		watch.recurse, mask, nil, &watch.ov, 0) | ||||
| 	if rdErr != nil { | ||||
| 		err := os.NewSyscallError("ReadDirectoryChanges", rdErr) | ||||
| 		if rdErr == windows.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { | ||||
| @ -563,9 +646,8 @@ func (w *Watcher) readEvents() { | ||||
| 	runtime.LockOSThread() | ||||
| 
 | ||||
| 	for { | ||||
| 		// This error is handled after the watch == nil check below. | ||||
| 		qErr := windows.GetQueuedCompletionStatus(w.port, &n, &key, &ov, windows.INFINITE) | ||||
| 		// This error is handled after the watch == nil check below. NOTE: this | ||||
| 		// seems odd, note sure if it's correct. | ||||
| 
 | ||||
| 		watch := (*watch)(unsafe.Pointer(ov)) | ||||
| 		if watch == nil { | ||||
| @ -595,7 +677,7 @@ func (w *Watcher) readEvents() { | ||||
| 			case in := <-w.input: | ||||
| 				switch in.op { | ||||
| 				case opAddWatch: | ||||
| 					in.reply <- w.addWatch(in.path, uint64(in.flags)) | ||||
| 					in.reply <- w.addWatch(in.path, uint64(in.flags), in.bufsize) | ||||
| 				case opRemoveWatch: | ||||
| 					in.reply <- w.remWatch(in.path) | ||||
| 				} | ||||
| @ -605,6 +687,8 @@ func (w *Watcher) readEvents() { | ||||
| 		} | ||||
| 
 | ||||
| 		switch qErr { | ||||
| 		case nil: | ||||
| 			// No error | ||||
| 		case windows.ERROR_MORE_DATA: | ||||
| 			if watch == nil { | ||||
| 				w.sendError(errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")) | ||||
| @ -626,13 +710,12 @@ func (w *Watcher) readEvents() { | ||||
| 		default: | ||||
| 			w.sendError(os.NewSyscallError("GetQueuedCompletionPort", qErr)) | ||||
| 			continue | ||||
| 		case nil: | ||||
| 		} | ||||
| 
 | ||||
| 		var offset uint32 | ||||
| 		for { | ||||
| 			if n == 0 { | ||||
| 				w.sendError(errors.New("short read in readEvents()")) | ||||
| 				w.sendError(ErrEventOverflow) | ||||
| 				break | ||||
| 			} | ||||
| 
 | ||||
| @ -703,8 +786,9 @@ func (w *Watcher) readEvents() { | ||||
| 
 | ||||
| 			// Error! | ||||
| 			if offset >= n { | ||||
| 				//lint:ignore ST1005 Windows should be capitalized | ||||
| 				w.sendError(errors.New( | ||||
| 					"Windows system assumed buffer larger than it is, events have likely been missed.")) | ||||
| 					"Windows system assumed buffer larger than it is, events have likely been missed")) | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| @ -720,9 +804,6 @@ func (w *Watcher) toWindowsFlags(mask uint64) uint32 { | ||||
| 	if mask&sysFSMODIFY != 0 { | ||||
| 		m |= windows.FILE_NOTIFY_CHANGE_LAST_WRITE | ||||
| 	} | ||||
| 	if mask&sysFSATTRIB != 0 { | ||||
| 		m |= windows.FILE_NOTIFY_CHANGE_ATTRIBUTES | ||||
| 	} | ||||
| 	if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { | ||||
| 		m |= windows.FILE_NOTIFY_CHANGE_FILE_NAME | windows.FILE_NOTIFY_CHANGE_DIR_NAME | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										91
									
								
								vendor/github.com/fsnotify/fsnotify/fsnotify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										91
									
								
								vendor/github.com/fsnotify/fsnotify/fsnotify.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,13 +1,18 @@ | ||||
| //go:build !plan9 | ||||
| // +build !plan9 | ||||
| 
 | ||||
| // Package fsnotify provides a cross-platform interface for file system | ||||
| // notifications. | ||||
| // | ||||
| // Currently supported systems: | ||||
| // | ||||
| //	Linux 2.6.32+    via inotify | ||||
| //	BSD, macOS       via kqueue | ||||
| //	Windows          via ReadDirectoryChangesW | ||||
| //	illumos          via FEN | ||||
| package fsnotify | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| @ -33,34 +38,52 @@ type Op uint32 | ||||
| // The operations fsnotify can trigger; see the documentation on [Watcher] for a | ||||
| // full description, and check them with [Event.Has]. | ||||
| const ( | ||||
| 	// A new pathname was created. | ||||
| 	Create Op = 1 << iota | ||||
| 
 | ||||
| 	// The pathname was written to; this does *not* mean the write has finished, | ||||
| 	// and a write can be followed by more writes. | ||||
| 	Write | ||||
| 
 | ||||
| 	// The path was removed; any watches on it will be removed. Some "remove" | ||||
| 	// operations may trigger a Rename if the file is actually moved (for | ||||
| 	// example "remove to trash" is often a rename). | ||||
| 	Remove | ||||
| 
 | ||||
| 	// The path was renamed to something else; any watched on it will be | ||||
| 	// removed. | ||||
| 	Rename | ||||
| 
 | ||||
| 	// File attributes were changed. | ||||
| 	// | ||||
| 	// It's generally not recommended to take action on this event, as it may | ||||
| 	// get triggered very frequently by some software. For example, Spotlight | ||||
| 	// indexing on macOS, anti-virus software, backup software, etc. | ||||
| 	Chmod | ||||
| ) | ||||
| 
 | ||||
| // Common errors that can be reported by a watcher | ||||
| // Common errors that can be reported. | ||||
| var ( | ||||
| 	ErrNonExistentWatch = errors.New("can't remove non-existent watcher") | ||||
| 	ErrEventOverflow    = errors.New("fsnotify queue overflow") | ||||
| 	ErrNonExistentWatch = errors.New("fsnotify: can't remove non-existent watch") | ||||
| 	ErrEventOverflow    = errors.New("fsnotify: queue or buffer overflow") | ||||
| 	ErrClosed           = errors.New("fsnotify: watcher already closed") | ||||
| ) | ||||
| 
 | ||||
| func (op Op) String() string { | ||||
| func (o Op) String() string { | ||||
| 	var b strings.Builder | ||||
| 	if op.Has(Create) { | ||||
| 	if o.Has(Create) { | ||||
| 		b.WriteString("|CREATE") | ||||
| 	} | ||||
| 	if op.Has(Remove) { | ||||
| 	if o.Has(Remove) { | ||||
| 		b.WriteString("|REMOVE") | ||||
| 	} | ||||
| 	if op.Has(Write) { | ||||
| 	if o.Has(Write) { | ||||
| 		b.WriteString("|WRITE") | ||||
| 	} | ||||
| 	if op.Has(Rename) { | ||||
| 	if o.Has(Rename) { | ||||
| 		b.WriteString("|RENAME") | ||||
| 	} | ||||
| 	if op.Has(Chmod) { | ||||
| 	if o.Has(Chmod) { | ||||
| 		b.WriteString("|CHMOD") | ||||
| 	} | ||||
| 	if b.Len() == 0 { | ||||
| @ -70,7 +93,7 @@ func (op Op) String() string { | ||||
| } | ||||
| 
 | ||||
| // Has reports if this operation has the given operation. | ||||
| func (o Op) Has(h Op) bool { return o&h == h } | ||||
| func (o Op) Has(h Op) bool { return o&h != 0 } | ||||
| 
 | ||||
| // Has reports if this event has the given operation. | ||||
| func (e Event) Has(op Op) bool { return e.Op.Has(op) } | ||||
| @ -79,3 +102,45 @@ func (e Event) Has(op Op) bool { return e.Op.Has(op) } | ||||
| func (e Event) String() string { | ||||
| 	return fmt.Sprintf("%-13s %q", e.Op.String(), e.Name) | ||||
| } | ||||
| 
 | ||||
| type ( | ||||
| 	addOpt   func(opt *withOpts) | ||||
| 	withOpts struct { | ||||
| 		bufsize int | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| var defaultOpts = withOpts{ | ||||
| 	bufsize: 65536, // 64K | ||||
| } | ||||
| 
 | ||||
| func getOptions(opts ...addOpt) withOpts { | ||||
| 	with := defaultOpts | ||||
| 	for _, o := range opts { | ||||
| 		o(&with) | ||||
| 	} | ||||
| 	return with | ||||
| } | ||||
| 
 | ||||
| // WithBufferSize sets the [ReadDirectoryChangesW] buffer size. | ||||
| // | ||||
| // This only has effect on Windows systems, and is a no-op for other backends. | ||||
| // | ||||
| // The default value is 64K (65536 bytes) which is the highest value that works | ||||
| // on all filesystems and should be enough for most applications, but if you | ||||
| // have a large burst of events it may not be enough. You can increase it if | ||||
| // you're hitting "queue or buffer overflow" errors ([ErrEventOverflow]). | ||||
| // | ||||
| // [ReadDirectoryChangesW]: https://learn.microsoft.com/en-gb/windows/win32/api/winbase/nf-winbase-readdirectorychangesw | ||||
| func WithBufferSize(bytes int) addOpt { | ||||
| 	return func(opt *withOpts) { opt.bufsize = bytes } | ||||
| } | ||||
| 
 | ||||
| // Check if this path is recursive (ends with "/..." or "\..."), and return the | ||||
| // path with the /... stripped. | ||||
| func recursivePath(path string) (string, bool) { | ||||
| 	if filepath.Base(path) == "..." { | ||||
| 		return filepath.Dir(path), true | ||||
| 	} | ||||
| 	return path, false | ||||
| } | ||||
|  | ||||
							
								
								
									
										123
									
								
								vendor/github.com/fsnotify/fsnotify/mkdoc.zsh
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										123
									
								
								vendor/github.com/fsnotify/fsnotify/mkdoc.zsh
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,8 +2,8 @@ | ||||
| [ "${ZSH_VERSION:-}" = "" ] && echo >&2 "Only works with zsh" && exit 1 | ||||
| setopt err_exit no_unset pipefail extended_glob | ||||
| 
 | ||||
| # Simple script to update the godoc comments on all watchers. Probably took me | ||||
| # more time to write this than doing it manually, but ah well 🙃 | ||||
| # Simple script to update the godoc comments on all watchers so you don't need | ||||
| # to update the same comment 5 times. | ||||
| 
 | ||||
| watcher=$(<<EOF | ||||
| // Watcher watches a set of paths, delivering events on a channel. | ||||
| @ -16,9 +16,9 @@ watcher=$(<<EOF | ||||
| // When a file is removed a Remove event won't be emitted until all file | ||||
| // descriptors are closed, and deletes will always emit a Chmod. For example: | ||||
| // | ||||
| //     fp := os.Open("file") | ||||
| //     os.Remove("file")        // Triggers Chmod | ||||
| //     fp.Close()               // Triggers Remove | ||||
| //	fp := os.Open("file") | ||||
| //	os.Remove("file")        // Triggers Chmod | ||||
| //	fp.Close()               // Triggers Remove | ||||
| // | ||||
| // This is the event that inotify sends, so not much can be changed about this. | ||||
| // | ||||
| @ -32,16 +32,16 @@ watcher=$(<<EOF | ||||
| // | ||||
| // To increase them you can use sysctl or write the value to the /proc file: | ||||
| // | ||||
| //     # Default values on Linux 5.18 | ||||
| //     sysctl fs.inotify.max_user_watches=124983 | ||||
| //     sysctl fs.inotify.max_user_instances=128 | ||||
| //	# Default values on Linux 5.18 | ||||
| //	sysctl fs.inotify.max_user_watches=124983 | ||||
| //	sysctl fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // To make the changes persist on reboot edit /etc/sysctl.conf or | ||||
| // /usr/lib/sysctl.d/50-default.conf (details differ per Linux distro; check | ||||
| // your distro's documentation): | ||||
| // | ||||
| //     fs.inotify.max_user_watches=124983 | ||||
| //     fs.inotify.max_user_instances=128 | ||||
| //	fs.inotify.max_user_watches=124983 | ||||
| //	fs.inotify.max_user_instances=128 | ||||
| // | ||||
| // Reaching the limit will result in a "no space left on device" or "too many open | ||||
| // files" error. | ||||
| @ -57,14 +57,20 @@ watcher=$(<<EOF | ||||
| // control the maximum number of open files, as well as /etc/login.conf on BSD | ||||
| // systems. | ||||
| // | ||||
| // # macOS notes | ||||
| // # Windows notes | ||||
| // | ||||
| // Spotlight indexing on macOS can result in multiple events (see [#15]). A | ||||
| // temporary workaround is to add your folder(s) to the "Spotlight Privacy | ||||
| // Settings" until we have a native FSEvents implementation (see [#11]). | ||||
| // Paths can be added as "C:\\path\\to\\dir", but forward slashes | ||||
| // ("C:/path/to/dir") will also work. | ||||
| // | ||||
| // [#11]: https://github.com/fsnotify/fsnotify/issues/11 | ||||
| // [#15]: https://github.com/fsnotify/fsnotify/issues/15 | ||||
| // When a watched directory is removed it will always send an event for the | ||||
| // directory itself, but may not send events for all files in that directory. | ||||
| // Sometimes it will send events for all times, sometimes it will send no | ||||
| // events, and often only for some files. | ||||
| // | ||||
| // The default ReadDirectoryChangesW() buffer size is 64K, which is the largest | ||||
| // value that is guaranteed to work with SMB filesystems. If you have many | ||||
| // events in quick succession this may not be enough, and you will have to use | ||||
| // [WithBufferSize] to increase the value. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| @ -73,20 +79,36 @@ new=$(<<EOF | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| newbuffered=$(<<EOF | ||||
| // NewBufferedWatcher creates a new Watcher with a buffered Watcher.Events | ||||
| // channel. | ||||
| // | ||||
| // The main use case for this is situations with a very large number of events | ||||
| // where the kernel buffer size can't be increased (e.g. due to lack of | ||||
| // permissions). An unbuffered Watcher will perform better for almost all use | ||||
| // cases, and whenever possible you will be better off increasing the kernel | ||||
| // buffers instead of adding a large userspace buffer. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| add=$(<<EOF | ||||
| // Add starts monitoring the path for changes. | ||||
| // | ||||
| // A path can only be watched once; attempting to watch it more than once will | ||||
| // return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // added. A watch will be automatically removed if the path is deleted. | ||||
| // A path can only be watched once; watching it more than once is a no-op and will | ||||
| // not return an error. Paths that do not yet exist on the filesystem cannot be | ||||
| // watched. | ||||
| // | ||||
| // A path will remain watched if it gets renamed to somewhere else on the same | ||||
| // filesystem, but the monitor will get removed if the path gets deleted and | ||||
| // re-created, or if it's moved to a different filesystem. | ||||
| // A watch will be automatically removed if the watched path is deleted or | ||||
| // renamed. The exception is the Windows backend, which doesn't remove the | ||||
| // watcher on renames. | ||||
| // | ||||
| // Notifications on network filesystems (NFS, SMB, FUSE, etc.) or special | ||||
| // filesystems (/proc, /sys, etc.) generally don't work. | ||||
| // | ||||
| // Returns [ErrClosed] if [Watcher.Close] was called. | ||||
| // | ||||
| // See [Watcher.AddWith] for a version that allows adding options. | ||||
| // | ||||
| // # Watching directories | ||||
| // | ||||
| // All files in a directory are monitored, including new files that are created | ||||
| @ -96,14 +118,27 @@ add=$(<<EOF | ||||
| // # Watching files | ||||
| // | ||||
| // Watching individual files (rather than directories) is generally not | ||||
| // recommended as many tools update files atomically. Instead of "just" writing | ||||
| // to the file a temporary file will be written to first, and if successful the | ||||
| // temporary file is moved to to destination removing the original, or some | ||||
| // variant thereof. The watcher on the original file is now lost, as it no | ||||
| // longer exists. | ||||
| // recommended as many programs (especially editors) update files atomically: it | ||||
| // will write to a temporary file which is then moved to to destination, | ||||
| // overwriting the original (or some variant thereof). The watcher on the | ||||
| // original file is now lost, as that no longer exists. | ||||
| // | ||||
| // Instead, watch the parent directory and use Event.Name to filter out files | ||||
| // you're not interested in. There is an example of this in [cmd/fsnotify/file.go]. | ||||
| // The upshot of this is that a power failure or crash won't leave a | ||||
| // half-written file. | ||||
| // | ||||
| // Watch the parent directory and use Event.Name to filter out files you're not | ||||
| // interested in. There is an example of this in cmd/fsnotify/file.go. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| addwith=$(<<EOF | ||||
| // AddWith is like [Watcher.Add], but allows adding options. When using Add() | ||||
| // the defaults described below are used. | ||||
| // | ||||
| // Possible options are: | ||||
| // | ||||
| //   - [WithBufferSize] sets the buffer size for the Windows backend; no-op on | ||||
| //     other platforms. The default is 64K (65536 bytes). | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| @ -114,16 +149,21 @@ remove=$(<<EOF | ||||
| // /tmp/dir and /tmp/dir/subdir then you will need to remove both. | ||||
| // | ||||
| // Removing a path that has not yet been added returns [ErrNonExistentWatch]. | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| close=$(<<EOF | ||||
| // Close removes all watches and closes the events channel. | ||||
| // Close removes all watches and closes the Events channel. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| watchlist=$(<<EOF | ||||
| // WatchList returns all paths added with [Add] (and are not yet removed). | ||||
| // WatchList returns all paths explicitly added with [Watcher.Add] (and are not | ||||
| // yet removed). | ||||
| // | ||||
| // Returns nil if [Watcher.Close] was called. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| @ -153,20 +193,29 @@ events=$(<<EOF | ||||
| 	//                      initiated by the user may show up as one or multiple | ||||
| 	//                      writes, depending on when the system syncs things to | ||||
| 	//                      disk. For example when compiling a large Go program | ||||
| 	//                      you may get hundreds of Write events, so you | ||||
| 	//                      probably want to wait until you've stopped receiving | ||||
| 	//                      them (see the dedup example in cmd/fsnotify). | ||||
| 	//                      you may get hundreds of Write events, and you may | ||||
| 	//                      want to wait until you've stopped receiving them | ||||
| 	//                      (see the dedup example in cmd/fsnotify). | ||||
| 	// | ||||
| 	//                      Some systems may send Write event for directories | ||||
| 	//                      when the directory content changes. | ||||
| 	// | ||||
| 	//   fsnotify.Chmod     Attributes were changed. On Linux this is also sent | ||||
| 	//                      when a file is removed (or more accurately, when a | ||||
| 	//                      link to an inode is removed). On kqueue it's sent | ||||
| 	//                      and on kqueue when a file is truncated. On Windows | ||||
| 	//                      it's never sent. | ||||
| 	//                      when a file is truncated. On Windows it's never | ||||
| 	//                      sent. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| errors=$(<<EOF | ||||
| 	// Errors sends any errors. | ||||
| 	// | ||||
| 	// ErrEventOverflow is used to indicate there are too many events: | ||||
| 	// | ||||
| 	//  - inotify:      There are too many queued events (fs.inotify.max_queued_events sysctl) | ||||
| 	//  - windows:      The buffer size is too small; WithBufferSize() can be used to increase it. | ||||
| 	//  - kqueue, fen:  Not used. | ||||
| EOF | ||||
| ) | ||||
| 
 | ||||
| @ -200,7 +249,9 @@ set-cmt() { | ||||
| 
 | ||||
| set-cmt '^type Watcher struct '             $watcher | ||||
| set-cmt '^func NewWatcher('                 $new | ||||
| set-cmt '^func NewBufferedWatcher('         $newbuffered | ||||
| set-cmt '^func (w \*Watcher) Add('          $add | ||||
| set-cmt '^func (w \*Watcher) AddWith('      $addwith | ||||
| set-cmt '^func (w \*Watcher) Remove('       $remove | ||||
| set-cmt '^func (w \*Watcher) Close('        $close | ||||
| set-cmt '^func (w \*Watcher) WatchList('    $watchlist | ||||
|  | ||||
							
								
								
									
										128
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										128
									
								
								vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -12,6 +12,31 @@ import ( | ||||
| 
 | ||||
| // Symbols defined in public import of google/protobuf/descriptor.proto. | ||||
| 
 | ||||
| type Edition = descriptorpb.Edition | ||||
| 
 | ||||
| const Edition_EDITION_UNKNOWN = descriptorpb.Edition_EDITION_UNKNOWN | ||||
| const Edition_EDITION_PROTO2 = descriptorpb.Edition_EDITION_PROTO2 | ||||
| const Edition_EDITION_PROTO3 = descriptorpb.Edition_EDITION_PROTO3 | ||||
| const Edition_EDITION_2023 = descriptorpb.Edition_EDITION_2023 | ||||
| const Edition_EDITION_2024 = descriptorpb.Edition_EDITION_2024 | ||||
| const Edition_EDITION_1_TEST_ONLY = descriptorpb.Edition_EDITION_1_TEST_ONLY | ||||
| const Edition_EDITION_2_TEST_ONLY = descriptorpb.Edition_EDITION_2_TEST_ONLY | ||||
| const Edition_EDITION_99997_TEST_ONLY = descriptorpb.Edition_EDITION_99997_TEST_ONLY | ||||
| const Edition_EDITION_99998_TEST_ONLY = descriptorpb.Edition_EDITION_99998_TEST_ONLY | ||||
| const Edition_EDITION_99999_TEST_ONLY = descriptorpb.Edition_EDITION_99999_TEST_ONLY | ||||
| const Edition_EDITION_MAX = descriptorpb.Edition_EDITION_MAX | ||||
| 
 | ||||
| var Edition_name = descriptorpb.Edition_name | ||||
| var Edition_value = descriptorpb.Edition_value | ||||
| 
 | ||||
| type ExtensionRangeOptions_VerificationState = descriptorpb.ExtensionRangeOptions_VerificationState | ||||
| 
 | ||||
| const ExtensionRangeOptions_DECLARATION = descriptorpb.ExtensionRangeOptions_DECLARATION | ||||
| const ExtensionRangeOptions_UNVERIFIED = descriptorpb.ExtensionRangeOptions_UNVERIFIED | ||||
| 
 | ||||
| var ExtensionRangeOptions_VerificationState_name = descriptorpb.ExtensionRangeOptions_VerificationState_name | ||||
| var ExtensionRangeOptions_VerificationState_value = descriptorpb.ExtensionRangeOptions_VerificationState_value | ||||
| 
 | ||||
| type FieldDescriptorProto_Type = descriptorpb.FieldDescriptorProto_Type | ||||
| 
 | ||||
| const FieldDescriptorProto_TYPE_DOUBLE = descriptorpb.FieldDescriptorProto_TYPE_DOUBLE | ||||
| @ -39,8 +64,8 @@ var FieldDescriptorProto_Type_value = descriptorpb.FieldDescriptorProto_Type_val | ||||
| type FieldDescriptorProto_Label = descriptorpb.FieldDescriptorProto_Label | ||||
| 
 | ||||
| const FieldDescriptorProto_LABEL_OPTIONAL = descriptorpb.FieldDescriptorProto_LABEL_OPTIONAL | ||||
| const FieldDescriptorProto_LABEL_REQUIRED = descriptorpb.FieldDescriptorProto_LABEL_REQUIRED | ||||
| const FieldDescriptorProto_LABEL_REPEATED = descriptorpb.FieldDescriptorProto_LABEL_REPEATED | ||||
| const FieldDescriptorProto_LABEL_REQUIRED = descriptorpb.FieldDescriptorProto_LABEL_REQUIRED | ||||
| 
 | ||||
| var FieldDescriptorProto_Label_name = descriptorpb.FieldDescriptorProto_Label_name | ||||
| var FieldDescriptorProto_Label_value = descriptorpb.FieldDescriptorProto_Label_value | ||||
| @ -72,6 +97,31 @@ const FieldOptions_JS_NUMBER = descriptorpb.FieldOptions_JS_NUMBER | ||||
| var FieldOptions_JSType_name = descriptorpb.FieldOptions_JSType_name | ||||
| var FieldOptions_JSType_value = descriptorpb.FieldOptions_JSType_value | ||||
| 
 | ||||
| type FieldOptions_OptionRetention = descriptorpb.FieldOptions_OptionRetention | ||||
| 
 | ||||
| const FieldOptions_RETENTION_UNKNOWN = descriptorpb.FieldOptions_RETENTION_UNKNOWN | ||||
| const FieldOptions_RETENTION_RUNTIME = descriptorpb.FieldOptions_RETENTION_RUNTIME | ||||
| const FieldOptions_RETENTION_SOURCE = descriptorpb.FieldOptions_RETENTION_SOURCE | ||||
| 
 | ||||
| var FieldOptions_OptionRetention_name = descriptorpb.FieldOptions_OptionRetention_name | ||||
| var FieldOptions_OptionRetention_value = descriptorpb.FieldOptions_OptionRetention_value | ||||
| 
 | ||||
| type FieldOptions_OptionTargetType = descriptorpb.FieldOptions_OptionTargetType | ||||
| 
 | ||||
| const FieldOptions_TARGET_TYPE_UNKNOWN = descriptorpb.FieldOptions_TARGET_TYPE_UNKNOWN | ||||
| const FieldOptions_TARGET_TYPE_FILE = descriptorpb.FieldOptions_TARGET_TYPE_FILE | ||||
| const FieldOptions_TARGET_TYPE_EXTENSION_RANGE = descriptorpb.FieldOptions_TARGET_TYPE_EXTENSION_RANGE | ||||
| const FieldOptions_TARGET_TYPE_MESSAGE = descriptorpb.FieldOptions_TARGET_TYPE_MESSAGE | ||||
| const FieldOptions_TARGET_TYPE_FIELD = descriptorpb.FieldOptions_TARGET_TYPE_FIELD | ||||
| const FieldOptions_TARGET_TYPE_ONEOF = descriptorpb.FieldOptions_TARGET_TYPE_ONEOF | ||||
| const FieldOptions_TARGET_TYPE_ENUM = descriptorpb.FieldOptions_TARGET_TYPE_ENUM | ||||
| const FieldOptions_TARGET_TYPE_ENUM_ENTRY = descriptorpb.FieldOptions_TARGET_TYPE_ENUM_ENTRY | ||||
| const FieldOptions_TARGET_TYPE_SERVICE = descriptorpb.FieldOptions_TARGET_TYPE_SERVICE | ||||
| const FieldOptions_TARGET_TYPE_METHOD = descriptorpb.FieldOptions_TARGET_TYPE_METHOD | ||||
| 
 | ||||
| var FieldOptions_OptionTargetType_name = descriptorpb.FieldOptions_OptionTargetType_name | ||||
| var FieldOptions_OptionTargetType_value = descriptorpb.FieldOptions_OptionTargetType_value | ||||
| 
 | ||||
| type MethodOptions_IdempotencyLevel = descriptorpb.MethodOptions_IdempotencyLevel | ||||
| 
 | ||||
| const MethodOptions_IDEMPOTENCY_UNKNOWN = descriptorpb.MethodOptions_IDEMPOTENCY_UNKNOWN | ||||
| @ -81,10 +131,77 @@ const MethodOptions_IDEMPOTENT = descriptorpb.MethodOptions_IDEMPOTENT | ||||
| var MethodOptions_IdempotencyLevel_name = descriptorpb.MethodOptions_IdempotencyLevel_name | ||||
| var MethodOptions_IdempotencyLevel_value = descriptorpb.MethodOptions_IdempotencyLevel_value | ||||
| 
 | ||||
| type FeatureSet_FieldPresence = descriptorpb.FeatureSet_FieldPresence | ||||
| 
 | ||||
| const FeatureSet_FIELD_PRESENCE_UNKNOWN = descriptorpb.FeatureSet_FIELD_PRESENCE_UNKNOWN | ||||
| const FeatureSet_EXPLICIT = descriptorpb.FeatureSet_EXPLICIT | ||||
| const FeatureSet_IMPLICIT = descriptorpb.FeatureSet_IMPLICIT | ||||
| const FeatureSet_LEGACY_REQUIRED = descriptorpb.FeatureSet_LEGACY_REQUIRED | ||||
| 
 | ||||
| var FeatureSet_FieldPresence_name = descriptorpb.FeatureSet_FieldPresence_name | ||||
| var FeatureSet_FieldPresence_value = descriptorpb.FeatureSet_FieldPresence_value | ||||
| 
 | ||||
| type FeatureSet_EnumType = descriptorpb.FeatureSet_EnumType | ||||
| 
 | ||||
| const FeatureSet_ENUM_TYPE_UNKNOWN = descriptorpb.FeatureSet_ENUM_TYPE_UNKNOWN | ||||
| const FeatureSet_OPEN = descriptorpb.FeatureSet_OPEN | ||||
| const FeatureSet_CLOSED = descriptorpb.FeatureSet_CLOSED | ||||
| 
 | ||||
| var FeatureSet_EnumType_name = descriptorpb.FeatureSet_EnumType_name | ||||
| var FeatureSet_EnumType_value = descriptorpb.FeatureSet_EnumType_value | ||||
| 
 | ||||
| type FeatureSet_RepeatedFieldEncoding = descriptorpb.FeatureSet_RepeatedFieldEncoding | ||||
| 
 | ||||
| const FeatureSet_REPEATED_FIELD_ENCODING_UNKNOWN = descriptorpb.FeatureSet_REPEATED_FIELD_ENCODING_UNKNOWN | ||||
| const FeatureSet_PACKED = descriptorpb.FeatureSet_PACKED | ||||
| const FeatureSet_EXPANDED = descriptorpb.FeatureSet_EXPANDED | ||||
| 
 | ||||
| var FeatureSet_RepeatedFieldEncoding_name = descriptorpb.FeatureSet_RepeatedFieldEncoding_name | ||||
| var FeatureSet_RepeatedFieldEncoding_value = descriptorpb.FeatureSet_RepeatedFieldEncoding_value | ||||
| 
 | ||||
| type FeatureSet_Utf8Validation = descriptorpb.FeatureSet_Utf8Validation | ||||
| 
 | ||||
| const FeatureSet_UTF8_VALIDATION_UNKNOWN = descriptorpb.FeatureSet_UTF8_VALIDATION_UNKNOWN | ||||
| const FeatureSet_VERIFY = descriptorpb.FeatureSet_VERIFY | ||||
| const FeatureSet_NONE = descriptorpb.FeatureSet_NONE | ||||
| 
 | ||||
| var FeatureSet_Utf8Validation_name = descriptorpb.FeatureSet_Utf8Validation_name | ||||
| var FeatureSet_Utf8Validation_value = descriptorpb.FeatureSet_Utf8Validation_value | ||||
| 
 | ||||
| type FeatureSet_MessageEncoding = descriptorpb.FeatureSet_MessageEncoding | ||||
| 
 | ||||
| const FeatureSet_MESSAGE_ENCODING_UNKNOWN = descriptorpb.FeatureSet_MESSAGE_ENCODING_UNKNOWN | ||||
| const FeatureSet_LENGTH_PREFIXED = descriptorpb.FeatureSet_LENGTH_PREFIXED | ||||
| const FeatureSet_DELIMITED = descriptorpb.FeatureSet_DELIMITED | ||||
| 
 | ||||
| var FeatureSet_MessageEncoding_name = descriptorpb.FeatureSet_MessageEncoding_name | ||||
| var FeatureSet_MessageEncoding_value = descriptorpb.FeatureSet_MessageEncoding_value | ||||
| 
 | ||||
| type FeatureSet_JsonFormat = descriptorpb.FeatureSet_JsonFormat | ||||
| 
 | ||||
| const FeatureSet_JSON_FORMAT_UNKNOWN = descriptorpb.FeatureSet_JSON_FORMAT_UNKNOWN | ||||
| const FeatureSet_ALLOW = descriptorpb.FeatureSet_ALLOW | ||||
| const FeatureSet_LEGACY_BEST_EFFORT = descriptorpb.FeatureSet_LEGACY_BEST_EFFORT | ||||
| 
 | ||||
| var FeatureSet_JsonFormat_name = descriptorpb.FeatureSet_JsonFormat_name | ||||
| var FeatureSet_JsonFormat_value = descriptorpb.FeatureSet_JsonFormat_value | ||||
| 
 | ||||
| type GeneratedCodeInfo_Annotation_Semantic = descriptorpb.GeneratedCodeInfo_Annotation_Semantic | ||||
| 
 | ||||
| const GeneratedCodeInfo_Annotation_NONE = descriptorpb.GeneratedCodeInfo_Annotation_NONE | ||||
| const GeneratedCodeInfo_Annotation_SET = descriptorpb.GeneratedCodeInfo_Annotation_SET | ||||
| const GeneratedCodeInfo_Annotation_ALIAS = descriptorpb.GeneratedCodeInfo_Annotation_ALIAS | ||||
| 
 | ||||
| var GeneratedCodeInfo_Annotation_Semantic_name = descriptorpb.GeneratedCodeInfo_Annotation_Semantic_name | ||||
| var GeneratedCodeInfo_Annotation_Semantic_value = descriptorpb.GeneratedCodeInfo_Annotation_Semantic_value | ||||
| 
 | ||||
| type FileDescriptorSet = descriptorpb.FileDescriptorSet | ||||
| type FileDescriptorProto = descriptorpb.FileDescriptorProto | ||||
| type DescriptorProto = descriptorpb.DescriptorProto | ||||
| type ExtensionRangeOptions = descriptorpb.ExtensionRangeOptions | ||||
| 
 | ||||
| const Default_ExtensionRangeOptions_Verification = descriptorpb.Default_ExtensionRangeOptions_Verification | ||||
| 
 | ||||
| type FieldDescriptorProto = descriptorpb.FieldDescriptorProto | ||||
| type OneofDescriptorProto = descriptorpb.OneofDescriptorProto | ||||
| type EnumDescriptorProto = descriptorpb.EnumDescriptorProto | ||||
| @ -103,7 +220,6 @@ const Default_FileOptions_OptimizeFor = descriptorpb.Default_FileOptions_Optimiz | ||||
| const Default_FileOptions_CcGenericServices = descriptorpb.Default_FileOptions_CcGenericServices | ||||
| const Default_FileOptions_JavaGenericServices = descriptorpb.Default_FileOptions_JavaGenericServices | ||||
| const Default_FileOptions_PyGenericServices = descriptorpb.Default_FileOptions_PyGenericServices | ||||
| const Default_FileOptions_PhpGenericServices = descriptorpb.Default_FileOptions_PhpGenericServices | ||||
| const Default_FileOptions_Deprecated = descriptorpb.Default_FileOptions_Deprecated | ||||
| const Default_FileOptions_CcEnableArenas = descriptorpb.Default_FileOptions_CcEnableArenas | ||||
| 
 | ||||
| @ -118,8 +234,10 @@ type FieldOptions = descriptorpb.FieldOptions | ||||
| const Default_FieldOptions_Ctype = descriptorpb.Default_FieldOptions_Ctype | ||||
| const Default_FieldOptions_Jstype = descriptorpb.Default_FieldOptions_Jstype | ||||
| const Default_FieldOptions_Lazy = descriptorpb.Default_FieldOptions_Lazy | ||||
| const Default_FieldOptions_UnverifiedLazy = descriptorpb.Default_FieldOptions_UnverifiedLazy | ||||
| const Default_FieldOptions_Deprecated = descriptorpb.Default_FieldOptions_Deprecated | ||||
| const Default_FieldOptions_Weak = descriptorpb.Default_FieldOptions_Weak | ||||
| const Default_FieldOptions_DebugRedact = descriptorpb.Default_FieldOptions_DebugRedact | ||||
| 
 | ||||
| type OneofOptions = descriptorpb.OneofOptions | ||||
| type EnumOptions = descriptorpb.EnumOptions | ||||
| @ -129,6 +247,7 @@ const Default_EnumOptions_Deprecated = descriptorpb.Default_EnumOptions_Deprecat | ||||
| type EnumValueOptions = descriptorpb.EnumValueOptions | ||||
| 
 | ||||
| const Default_EnumValueOptions_Deprecated = descriptorpb.Default_EnumValueOptions_Deprecated | ||||
| const Default_EnumValueOptions_DebugRedact = descriptorpb.Default_EnumValueOptions_DebugRedact | ||||
| 
 | ||||
| type ServiceOptions = descriptorpb.ServiceOptions | ||||
| 
 | ||||
| @ -140,12 +259,17 @@ const Default_MethodOptions_Deprecated = descriptorpb.Default_MethodOptions_Depr | ||||
| const Default_MethodOptions_IdempotencyLevel = descriptorpb.Default_MethodOptions_IdempotencyLevel | ||||
| 
 | ||||
| type UninterpretedOption = descriptorpb.UninterpretedOption | ||||
| type FeatureSet = descriptorpb.FeatureSet | ||||
| type FeatureSetDefaults = descriptorpb.FeatureSetDefaults | ||||
| type SourceCodeInfo = descriptorpb.SourceCodeInfo | ||||
| type GeneratedCodeInfo = descriptorpb.GeneratedCodeInfo | ||||
| type DescriptorProto_ExtensionRange = descriptorpb.DescriptorProto_ExtensionRange | ||||
| type DescriptorProto_ReservedRange = descriptorpb.DescriptorProto_ReservedRange | ||||
| type ExtensionRangeOptions_Declaration = descriptorpb.ExtensionRangeOptions_Declaration | ||||
| type EnumDescriptorProto_EnumReservedRange = descriptorpb.EnumDescriptorProto_EnumReservedRange | ||||
| type FieldOptions_EditionDefault = descriptorpb.FieldOptions_EditionDefault | ||||
| type UninterpretedOption_NamePart = descriptorpb.UninterpretedOption_NamePart | ||||
| type FeatureSetDefaults_FeatureSetEditionDefault = descriptorpb.FeatureSetDefaults_FeatureSetEditionDefault | ||||
| type SourceCodeInfo_Location = descriptorpb.SourceCodeInfo_Location | ||||
| type GeneratedCodeInfo_Annotation = descriptorpb.GeneratedCodeInfo_Annotation | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										12
									
								
								vendor/github.com/gomarkdown/markdown/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/gomarkdown/markdown/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -9,11 +9,11 @@ It's very fast and supports common extensions. | ||||
| Tutorial: https://blog.kowalczyk.info/article/cxn3/advanced-markdown-processing-in-go.html | ||||
| 
 | ||||
| Code examples: | ||||
| * https://onlinetool.io/goplayground/#txO7hJ-ibeU : basic markdown => HTML | ||||
| * https://onlinetool.io/goplayground/#yFRIWRiu-KL : customize HTML renderer | ||||
| * https://onlinetool.io/goplayground/#2yV5-HDKBUV : modify AST | ||||
| * https://onlinetool.io/goplayground/#9fqKwRbuJ04 : customize parser | ||||
| * https://onlinetool.io/goplayground/#Bk0zTvrzUDR : syntax highlight | ||||
| * https://tools.arslexis.io/goplayground/#txO7hJ-ibeU : basic markdown => HTML | ||||
| * https://tools.arslexis.io/goplayground/#yFRIWRiu-KL : customize HTML renderer | ||||
| * https://tools.arslexis.io/goplayground/#2yV5-HDKBUV : modify AST | ||||
| * https://tools.arslexis.io/goplayground/#9fqKwRbuJ04 : customize parser | ||||
| * https://tools.arslexis.io/goplayground/#Bk0zTvrzUDR : syntax highlight | ||||
| 
 | ||||
| Those examples are also in [examples](./examples) directory. | ||||
| 
 | ||||
| @ -226,7 +226,7 @@ implements the following extensions: | ||||
| - **Hard line breaks**. With this extension enabled newlines in the input | ||||
|   translates into line breaks in the output. This extension is off by default. | ||||
| 
 | ||||
| - **Non blocking space**. With this extension enabled spaces preceeded by a backslash | ||||
| - **Non blocking space**. With this extension enabled spaces preceded by a backslash | ||||
|   in the input translates non-blocking spaces in the output. This extension is off by default. | ||||
| 
 | ||||
| - **Smart quotes**. Smartypants-style punctuation substitution is | ||||
|  | ||||
							
								
								
									
										7
									
								
								vendor/github.com/gomarkdown/markdown/parser/block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/gomarkdown/markdown/parser/block.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -191,6 +191,11 @@ func (p *Parser) Block(data []byte) { | ||||
| 		// <div> | ||||
| 		//     ... | ||||
| 		// </div> | ||||
| 
 | ||||
| 		if len(data) == 0 { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		if data[0] == '<' { | ||||
| 			if i := p.html(data, true); i > 0 { | ||||
| 				data = data[i:] | ||||
| @ -393,7 +398,7 @@ func (p *Parser) AddBlock(n ast.Node) ast.Node { | ||||
| } | ||||
| 
 | ||||
| func (p *Parser) isPrefixHeading(data []byte) bool { | ||||
| 	if data[0] != '#' { | ||||
| 	if len(data) > 0 && data[0] != '#' { | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										5
									
								
								vendor/github.com/gomarkdown/markdown/parser/citation.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/gomarkdown/markdown/parser/citation.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -65,6 +65,11 @@ func citation(p *Parser, data []byte, offset int) (int, ast.Node) { | ||||
| 		} | ||||
| 
 | ||||
| 		citeType := ast.CitationTypeInformative | ||||
| 
 | ||||
| 		if len(citation) < 2 { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		j = 1 | ||||
| 		switch citation[j] { | ||||
| 		case '!': | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/gomarkdown/markdown/parser/inline.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/gomarkdown/markdown/parser/inline.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -736,7 +736,7 @@ func leftAngle(p *Parser, data []byte, offset int) (int, ast.Node) { | ||||
| } | ||||
| 
 | ||||
| // '\\' backslash escape | ||||
| var escapeChars = []byte("\\`*_{}[]()#+-.!:|&<>~^") | ||||
| var escapeChars = []byte("\\`*_{}[]()#+-.!:|&<>~^$") | ||||
| 
 | ||||
| func escape(p *Parser, data []byte, offset int) (int, ast.Node) { | ||||
| 	data = data[offset:] | ||||
|  | ||||
							
								
								
									
										13
									
								
								vendor/github.com/gomarkdown/markdown/parser/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/gomarkdown/markdown/parser/parser.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -56,7 +56,7 @@ const ( | ||||
| ) | ||||
| 
 | ||||
| // for each character that triggers a response when parsing inline data. | ||||
| type inlineParser func(p *Parser, data []byte, offset int) (int, ast.Node) | ||||
| type InlineParser func(p *Parser, data []byte, offset int) (int, ast.Node) | ||||
| 
 | ||||
| // ReferenceOverrideFunc is expected to be called with a reference string and | ||||
| // return either a valid Reference type that the reference string maps to or | ||||
| @ -98,7 +98,7 @@ type Parser struct { | ||||
| 
 | ||||
| 	refs           map[string]*reference | ||||
| 	refsRecord     map[string]struct{} | ||||
| 	inlineCallback [256]inlineParser | ||||
| 	inlineCallback [256]InlineParser | ||||
| 	nesting        int | ||||
| 	maxNesting     int | ||||
| 	insideLink     bool | ||||
| @ -181,6 +181,12 @@ func NewWithExtensions(extension Extensions) *Parser { | ||||
| 	return &p | ||||
| } | ||||
| 
 | ||||
| func (p *Parser) RegisterInline(n byte, fn InlineParser) InlineParser { | ||||
| 	prev := p.inlineCallback[n] | ||||
| 	p.inlineCallback[n] = fn | ||||
| 	return prev | ||||
| } | ||||
| 
 | ||||
| func (p *Parser) getRef(refid string) (ref *reference, found bool) { | ||||
| 	if p.ReferenceOverride != nil { | ||||
| 		r, overridden := p.ReferenceOverride(refid) | ||||
| @ -901,6 +907,9 @@ func isListItem(d ast.Node) bool { | ||||
| } | ||||
| 
 | ||||
| func NormalizeNewlines(d []byte) []byte { | ||||
| 	res := make([]byte, len(d)) | ||||
| 	copy(res, d) | ||||
| 	d = res | ||||
| 	wi := 0 | ||||
| 	n := len(d) | ||||
| 	for i := 0; i < n; i++ { | ||||
|  | ||||
							
								
								
									
										9
									
								
								vendor/github.com/google/uuid/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/google/uuid/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,9 +0,0 @@ | ||||
| language: go | ||||
| 
 | ||||
| go: | ||||
|   - 1.4.3 | ||||
|   - 1.5.3 | ||||
|   - tip | ||||
| 
 | ||||
| script: | ||||
|   - go test -v ./... | ||||
							
								
								
									
										41
									
								
								vendor/github.com/google/uuid/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/google/uuid/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| # Changelog | ||||
| 
 | ||||
| ## [1.6.0](https://github.com/google/uuid/compare/v1.5.0...v1.6.0) (2024-01-16) | ||||
| 
 | ||||
| 
 | ||||
| ### Features | ||||
| 
 | ||||
| * add Max UUID constant ([#149](https://github.com/google/uuid/issues/149)) ([c58770e](https://github.com/google/uuid/commit/c58770eb495f55fe2ced6284f93c5158a62e53e3)) | ||||
| 
 | ||||
| 
 | ||||
| ### Bug Fixes | ||||
| 
 | ||||
| * fix typo in version 7 uuid documentation ([#153](https://github.com/google/uuid/issues/153)) ([016b199](https://github.com/google/uuid/commit/016b199544692f745ffc8867b914129ecb47ef06)) | ||||
| * Monotonicity in UUIDv7 ([#150](https://github.com/google/uuid/issues/150)) ([a2b2b32](https://github.com/google/uuid/commit/a2b2b32373ff0b1a312b7fdf6d38a977099698a6)) | ||||
| 
 | ||||
| ## [1.5.0](https://github.com/google/uuid/compare/v1.4.0...v1.5.0) (2023-12-12) | ||||
| 
 | ||||
| 
 | ||||
| ### Features | ||||
| 
 | ||||
| * Validate UUID without creating new UUID ([#141](https://github.com/google/uuid/issues/141)) ([9ee7366](https://github.com/google/uuid/commit/9ee7366e66c9ad96bab89139418a713dc584ae29)) | ||||
| 
 | ||||
| ## [1.4.0](https://github.com/google/uuid/compare/v1.3.1...v1.4.0) (2023-10-26) | ||||
| 
 | ||||
| 
 | ||||
| ### Features | ||||
| 
 | ||||
| * UUIDs slice type with Strings() convenience method ([#133](https://github.com/google/uuid/issues/133)) ([cd5fbbd](https://github.com/google/uuid/commit/cd5fbbdd02f3e3467ac18940e07e062be1f864b4)) | ||||
| 
 | ||||
| ### Fixes | ||||
| 
 | ||||
| * Clarify that Parse's job is to parse but not necessarily validate strings. (Documents current behavior) | ||||
| 
 | ||||
| ## [1.3.1](https://github.com/google/uuid/compare/v1.3.0...v1.3.1) (2023-08-18) | ||||
| 
 | ||||
| 
 | ||||
| ### Bug Fixes | ||||
| 
 | ||||
| * Use .EqualFold() to parse urn prefixed UUIDs ([#118](https://github.com/google/uuid/issues/118)) ([574e687](https://github.com/google/uuid/commit/574e6874943741fb99d41764c705173ada5293f0)) | ||||
| 
 | ||||
| ## Changelog | ||||
							
								
								
									
										16
									
								
								vendor/github.com/google/uuid/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/google/uuid/CONTRIBUTING.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -2,6 +2,22 @@ | ||||
| 
 | ||||
| We definitely welcome patches and contribution to this project! | ||||
| 
 | ||||
| ### Tips | ||||
| 
 | ||||
| Commits must be formatted according to the [Conventional Commits Specification](https://www.conventionalcommits.org). | ||||
| 
 | ||||
| Always try to include a test case! If it is not possible or not necessary, | ||||
| please explain why in the pull request description. | ||||
| 
 | ||||
| ### Releasing | ||||
| 
 | ||||
| Commits that would precipitate a SemVer change, as described in the Conventional | ||||
| Commits Specification, will trigger [`release-please`](https://github.com/google-github-actions/release-please-action) | ||||
| to create a release candidate pull request. Once submitted, `release-please` | ||||
| will create a release. | ||||
| 
 | ||||
| For tips on how to work with `release-please`, see its documentation. | ||||
| 
 | ||||
| ### Legal requirements | ||||
| 
 | ||||
| In order to protect both you and ourselves, you will need to sign the | ||||
|  | ||||
							
								
								
									
										10
									
								
								vendor/github.com/google/uuid/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/google/uuid/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,6 +1,6 @@ | ||||
| # uuid  | ||||
| # uuid | ||||
| The uuid package generates and inspects UUIDs based on | ||||
| [RFC 4122](http://tools.ietf.org/html/rfc4122) | ||||
| [RFC 4122](https://datatracker.ietf.org/doc/html/rfc4122) | ||||
| and DCE 1.1: Authentication and Security Services.  | ||||
| 
 | ||||
| This package is based on the github.com/pborman/uuid package (previously named | ||||
| @ -9,10 +9,12 @@ a UUID is a 16 byte array rather than a byte slice.  One loss due to this | ||||
| change is the ability to represent an invalid UUID (vs a NIL UUID). | ||||
| 
 | ||||
| ###### Install | ||||
| `go get github.com/google/uuid` | ||||
| ```sh | ||||
| go get github.com/google/uuid | ||||
| ``` | ||||
| 
 | ||||
| ###### Documentation  | ||||
| [](http://godoc.org/github.com/google/uuid) | ||||
| [](https://pkg.go.dev/github.com/google/uuid) | ||||
| 
 | ||||
| Full `go doc` style documentation for the package can be viewed online without | ||||
| installing this package by using the GoDoc site here:  | ||||
|  | ||||
							
								
								
									
										6
									
								
								vendor/github.com/google/uuid/hash.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/google/uuid/hash.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -17,6 +17,12 @@ var ( | ||||
| 	NameSpaceOID  = Must(Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) | ||||
| 	NameSpaceX500 = Must(Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) | ||||
| 	Nil           UUID // empty UUID, all zeros | ||||
| 
 | ||||
| 	// The Max UUID is special form of UUID that is specified to have all 128 bits set to 1. | ||||
| 	Max = UUID{ | ||||
| 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
| 		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, | ||||
| 	} | ||||
| ) | ||||
| 
 | ||||
| // NewHash returns a new UUID derived from the hash of space concatenated with | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/google/uuid/node_js.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/google/uuid/node_js.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -7,6 +7,6 @@ | ||||
| package uuid | ||||
| 
 | ||||
| // getHardwareInterface returns nil values for the JS version of the code. | ||||
| // This remvoves the "net" dependency, because it is not used in the browser. | ||||
| // This removes the "net" dependency, because it is not used in the browser. | ||||
| // Using the "net" library inflates the size of the transpiled JS code by 673k bytes. | ||||
| func getHardwareInterface(name string) (string, []byte) { return "", nil } | ||||
|  | ||||
							
								
								
									
										21
									
								
								vendor/github.com/google/uuid/time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/google/uuid/time.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -108,12 +108,23 @@ func setClockSequence(seq int) { | ||||
| } | ||||
| 
 | ||||
| // Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in | ||||
| // uuid.  The time is only defined for version 1 and 2 UUIDs. | ||||
| // uuid.  The time is only defined for version 1, 2, 6 and 7 UUIDs. | ||||
| func (uuid UUID) Time() Time { | ||||
| 	time := int64(binary.BigEndian.Uint32(uuid[0:4])) | ||||
| 	time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 | ||||
| 	time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 | ||||
| 	return Time(time) | ||||
| 	var t Time | ||||
| 	switch uuid.Version() { | ||||
| 	case 6: | ||||
| 		time := binary.BigEndian.Uint64(uuid[:8]) // Ignore uuid[6] version b0110 | ||||
| 		t = Time(time) | ||||
| 	case 7: | ||||
| 		time := binary.BigEndian.Uint64(uuid[:8]) | ||||
| 		t = Time((time>>16)*10000 + g1582ns100) | ||||
| 	default: // forward compatible | ||||
| 		time := int64(binary.BigEndian.Uint32(uuid[0:4])) | ||||
| 		time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 | ||||
| 		time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 | ||||
| 		t = Time(time) | ||||
| 	} | ||||
| 	return t | ||||
| } | ||||
| 
 | ||||
| // ClockSequence returns the clock sequence encoded in uuid. | ||||
|  | ||||
							
								
								
									
										89
									
								
								vendor/github.com/google/uuid/uuid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										89
									
								
								vendor/github.com/google/uuid/uuid.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -56,11 +56,15 @@ func IsInvalidLengthError(err error) bool { | ||||
| 	return ok | ||||
| } | ||||
| 
 | ||||
| // Parse decodes s into a UUID or returns an error.  Both the standard UUID | ||||
| // forms of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and | ||||
| // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded as well as the | ||||
| // Microsoft encoding {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} and the raw hex | ||||
| // encoding: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx. | ||||
| // Parse decodes s into a UUID or returns an error if it cannot be parsed.  Both | ||||
| // the standard UUID forms defined in RFC 4122 | ||||
| // (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and | ||||
| // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) are decoded.  In addition, | ||||
| // Parse accepts non-standard strings such as the raw hex encoding | ||||
| // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx and 38 byte "Microsoft style" encodings, | ||||
| // e.g.  {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.  Only the middle 36 bytes are | ||||
| // examined in the latter case.  Parse should not be used to validate strings as | ||||
| // it parses non-standard encodings as indicated above. | ||||
| func Parse(s string) (UUID, error) { | ||||
| 	var uuid UUID | ||||
| 	switch len(s) { | ||||
| @ -69,7 +73,7 @@ func Parse(s string) (UUID, error) { | ||||
| 
 | ||||
| 	// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||
| 	case 36 + 9: | ||||
| 		if strings.ToLower(s[:9]) != "urn:uuid:" { | ||||
| 		if !strings.EqualFold(s[:9], "urn:uuid:") { | ||||
| 			return uuid, fmt.Errorf("invalid urn prefix: %q", s[:9]) | ||||
| 		} | ||||
| 		s = s[9:] | ||||
| @ -101,7 +105,8 @@ func Parse(s string) (UUID, error) { | ||||
| 		9, 11, | ||||
| 		14, 16, | ||||
| 		19, 21, | ||||
| 		24, 26, 28, 30, 32, 34} { | ||||
| 		24, 26, 28, 30, 32, 34, | ||||
| 	} { | ||||
| 		v, ok := xtob(s[x], s[x+1]) | ||||
| 		if !ok { | ||||
| 			return uuid, errors.New("invalid UUID format") | ||||
| @ -117,7 +122,7 @@ func ParseBytes(b []byte) (UUID, error) { | ||||
| 	switch len(b) { | ||||
| 	case 36: // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||
| 	case 36 + 9: // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||
| 		if !bytes.Equal(bytes.ToLower(b[:9]), []byte("urn:uuid:")) { | ||||
| 		if !bytes.EqualFold(b[:9], []byte("urn:uuid:")) { | ||||
| 			return uuid, fmt.Errorf("invalid urn prefix: %q", b[:9]) | ||||
| 		} | ||||
| 		b = b[9:] | ||||
| @ -145,7 +150,8 @@ func ParseBytes(b []byte) (UUID, error) { | ||||
| 		9, 11, | ||||
| 		14, 16, | ||||
| 		19, 21, | ||||
| 		24, 26, 28, 30, 32, 34} { | ||||
| 		24, 26, 28, 30, 32, 34, | ||||
| 	} { | ||||
| 		v, ok := xtob(b[x], b[x+1]) | ||||
| 		if !ok { | ||||
| 			return uuid, errors.New("invalid UUID format") | ||||
| @ -180,6 +186,59 @@ func Must(uuid UUID, err error) UUID { | ||||
| 	return uuid | ||||
| } | ||||
| 
 | ||||
| // Validate returns an error if s is not a properly formatted UUID in one of the following formats: | ||||
| //   xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||
| //   urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||
| //   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | ||||
| //   {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} | ||||
| // It returns an error if the format is invalid, otherwise nil. | ||||
| func Validate(s string) error { | ||||
| 	switch len(s) { | ||||
| 	// Standard UUID format | ||||
| 	case 36: | ||||
| 
 | ||||
| 	// UUID with "urn:uuid:" prefix | ||||
| 	case 36 + 9: | ||||
| 		if !strings.EqualFold(s[:9], "urn:uuid:") { | ||||
| 			return fmt.Errorf("invalid urn prefix: %q", s[:9]) | ||||
| 		} | ||||
| 		s = s[9:] | ||||
| 
 | ||||
| 	// UUID enclosed in braces | ||||
| 	case 36 + 2: | ||||
| 		if s[0] != '{' || s[len(s)-1] != '}' { | ||||
| 			return fmt.Errorf("invalid bracketed UUID format") | ||||
| 		} | ||||
| 		s = s[1 : len(s)-1] | ||||
| 
 | ||||
| 	// UUID without hyphens | ||||
| 	case 32: | ||||
| 		for i := 0; i < len(s); i += 2 { | ||||
| 			_, ok := xtob(s[i], s[i+1]) | ||||
| 			if !ok { | ||||
| 				return errors.New("invalid UUID format") | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 	default: | ||||
| 		return invalidLengthError{len(s)} | ||||
| 	} | ||||
| 
 | ||||
| 	// Check for standard UUID format | ||||
| 	if len(s) == 36 { | ||||
| 		if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { | ||||
| 			return errors.New("invalid UUID format") | ||||
| 		} | ||||
| 		for _, x := range []int{0, 2, 4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 28, 30, 32, 34} { | ||||
| 			if _, ok := xtob(s[x], s[x+1]); !ok { | ||||
| 				return errors.New("invalid UUID format") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||
| // , or "" if uuid is invalid. | ||||
| func (uuid UUID) String() string { | ||||
| @ -292,3 +351,15 @@ func DisableRandPool() { | ||||
| 	poolMu.Lock() | ||||
| 	poolPos = randPoolSize | ||||
| } | ||||
| 
 | ||||
| // UUIDs is a slice of UUID types. | ||||
| type UUIDs []UUID | ||||
| 
 | ||||
| // Strings returns a string slice containing the string form of each UUID in uuids. | ||||
| func (uuids UUIDs) Strings() []string { | ||||
| 	var uuidStrs = make([]string, len(uuids)) | ||||
| 	for i, uuid := range uuids { | ||||
| 		uuidStrs[i] = uuid.String() | ||||
| 	} | ||||
| 	return uuidStrs | ||||
| } | ||||
|  | ||||
							
								
								
									
										56
									
								
								vendor/github.com/google/uuid/version6.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/google/uuid/version6.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| // Copyright 2023 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| package uuid | ||||
| 
 | ||||
| import "encoding/binary" | ||||
| 
 | ||||
| // UUID version 6 is a field-compatible version of UUIDv1, reordered for improved DB locality. | ||||
| // It is expected that UUIDv6 will primarily be used in contexts where there are existing v1 UUIDs. | ||||
| // Systems that do not involve legacy UUIDv1 SHOULD consider using UUIDv7 instead. | ||||
| // | ||||
| // see https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#uuidv6 | ||||
| // | ||||
| // NewV6 returns a Version 6 UUID based on the current NodeID and clock | ||||
| // sequence, and the current time. If the NodeID has not been set by SetNodeID | ||||
| // or SetNodeInterface then it will be set automatically. If the NodeID cannot | ||||
| // be set NewV6 set NodeID is random bits automatically . If clock sequence has not been set by | ||||
| // SetClockSequence then it will be set automatically. If GetTime fails to | ||||
| // return the current NewV6 returns Nil and an error. | ||||
| func NewV6() (UUID, error) { | ||||
| 	var uuid UUID | ||||
| 	now, seq, err := GetTime() | ||||
| 	if err != nil { | ||||
| 		return uuid, err | ||||
| 	} | ||||
| 
 | ||||
| 	/* | ||||
| 	    0                   1                   2                   3 | ||||
| 	    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| 	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 	   |                           time_high                           | | ||||
| 	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 	   |           time_mid            |      time_low_and_version     | | ||||
| 	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 	   |clk_seq_hi_res |  clk_seq_low  |         node (0-1)            | | ||||
| 	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 	   |                         node (2-5)                            | | ||||
| 	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 	*/ | ||||
| 
 | ||||
| 	binary.BigEndian.PutUint64(uuid[0:], uint64(now)) | ||||
| 	binary.BigEndian.PutUint16(uuid[8:], seq) | ||||
| 
 | ||||
| 	uuid[6] = 0x60 | (uuid[6] & 0x0F) | ||||
| 	uuid[8] = 0x80 | (uuid[8] & 0x3F) | ||||
| 
 | ||||
| 	nodeMu.Lock() | ||||
| 	if nodeID == zeroID { | ||||
| 		setNodeInterface("") | ||||
| 	} | ||||
| 	copy(uuid[10:], nodeID[:]) | ||||
| 	nodeMu.Unlock() | ||||
| 
 | ||||
| 	return uuid, nil | ||||
| } | ||||
							
								
								
									
										104
									
								
								vendor/github.com/google/uuid/version7.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								vendor/github.com/google/uuid/version7.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,104 @@ | ||||
| // Copyright 2023 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
| 
 | ||||
| package uuid | ||||
| 
 | ||||
| import ( | ||||
| 	"io" | ||||
| ) | ||||
| 
 | ||||
| // UUID version 7 features a time-ordered value field derived from the widely | ||||
| // implemented and well known Unix Epoch timestamp source, | ||||
| // the number of milliseconds seconds since midnight 1 Jan 1970 UTC, leap seconds excluded. | ||||
| // As well as improved entropy characteristics over versions 1 or 6. | ||||
| // | ||||
| // see https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03#name-uuid-version-7 | ||||
| // | ||||
| // Implementations SHOULD utilize UUID version 7 over UUID version 1 and 6 if possible. | ||||
| // | ||||
| // NewV7 returns a Version 7 UUID based on the current time(Unix Epoch). | ||||
| // Uses the randomness pool if it was enabled with EnableRandPool. | ||||
| // On error, NewV7 returns Nil and an error | ||||
| func NewV7() (UUID, error) { | ||||
| 	uuid, err := NewRandom() | ||||
| 	if err != nil { | ||||
| 		return uuid, err | ||||
| 	} | ||||
| 	makeV7(uuid[:]) | ||||
| 	return uuid, nil | ||||
| } | ||||
| 
 | ||||
| // NewV7FromReader returns a Version 7 UUID based on the current time(Unix Epoch). | ||||
| // it use NewRandomFromReader fill random bits. | ||||
| // On error, NewV7FromReader returns Nil and an error. | ||||
| func NewV7FromReader(r io.Reader) (UUID, error) { | ||||
| 	uuid, err := NewRandomFromReader(r) | ||||
| 	if err != nil { | ||||
| 		return uuid, err | ||||
| 	} | ||||
| 
 | ||||
| 	makeV7(uuid[:]) | ||||
| 	return uuid, nil | ||||
| } | ||||
| 
 | ||||
| // makeV7 fill 48 bits time (uuid[0] - uuid[5]), set version b0111 (uuid[6]) | ||||
| // uuid[8] already has the right version number (Variant is 10) | ||||
| // see function NewV7 and NewV7FromReader | ||||
| func makeV7(uuid []byte) { | ||||
| 	/* | ||||
| 		 0                   1                   2                   3 | ||||
| 		 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
| 		+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 		|                           unix_ts_ms                          | | ||||
| 		+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 		|          unix_ts_ms           |  ver  |  rand_a (12 bit seq)  | | ||||
| 		+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 		|var|                        rand_b                             | | ||||
| 		+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 		|                            rand_b                             | | ||||
| 		+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| 	*/ | ||||
| 	_ = uuid[15] // bounds check | ||||
| 
 | ||||
| 	t, s := getV7Time() | ||||
| 
 | ||||
| 	uuid[0] = byte(t >> 40) | ||||
| 	uuid[1] = byte(t >> 32) | ||||
| 	uuid[2] = byte(t >> 24) | ||||
| 	uuid[3] = byte(t >> 16) | ||||
| 	uuid[4] = byte(t >> 8) | ||||
| 	uuid[5] = byte(t) | ||||
| 
 | ||||
| 	uuid[6] = 0x70 | (0x0F & byte(s>>8)) | ||||
| 	uuid[7] = byte(s) | ||||
| } | ||||
| 
 | ||||
| // lastV7time is the last time we returned stored as: | ||||
| // | ||||
| //	52 bits of time in milliseconds since epoch | ||||
| //	12 bits of (fractional nanoseconds) >> 8 | ||||
| var lastV7time int64 | ||||
| 
 | ||||
| const nanoPerMilli = 1000000 | ||||
| 
 | ||||
| // getV7Time returns the time in milliseconds and nanoseconds / 256. | ||||
| // The returned (milli << 12 + seq) is guarenteed to be greater than | ||||
| // (milli << 12 + seq) returned by any previous call to getV7Time. | ||||
| func getV7Time() (milli, seq int64) { | ||||
| 	timeMu.Lock() | ||||
| 	defer timeMu.Unlock() | ||||
| 
 | ||||
| 	nano := timeNow().UnixNano() | ||||
| 	milli = nano / nanoPerMilli | ||||
| 	// Sequence number is between 0 and 3906 (nanoPerMilli>>8) | ||||
| 	seq = (nano - milli*nanoPerMilli) >> 8 | ||||
| 	now := milli<<12 + seq | ||||
| 	if now <= lastV7time { | ||||
| 		now = lastV7time + 1 | ||||
| 		milli = now >> 12 | ||||
| 		seq = now & 0xfff | ||||
| 	} | ||||
| 	lastV7time = now | ||||
| 	return milli, seq | ||||
| } | ||||
							
								
								
									
										20
									
								
								vendor/github.com/gorilla/schema/.editorconfig
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/gorilla/schema/.editorconfig
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| ; https://editorconfig.org/ | ||||
| 
 | ||||
| root = true | ||||
| 
 | ||||
| [*] | ||||
| insert_final_newline = true | ||||
| charset = utf-8 | ||||
| trim_trailing_whitespace = true | ||||
| indent_style = space | ||||
| indent_size = 2 | ||||
| 
 | ||||
| [{Makefile,go.mod,go.sum,*.go,.gitmodules}] | ||||
| indent_style = tab | ||||
| indent_size = 4 | ||||
| 
 | ||||
| [*.md] | ||||
| indent_size = 4 | ||||
| trim_trailing_whitespace = false | ||||
| 
 | ||||
| eclint_indent_style = unset | ||||
							
								
								
									
										1
									
								
								vendor/github.com/gorilla/schema/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/gorilla/schema/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| coverage.coverprofile | ||||
							
								
								
									
										2
									
								
								vendor/github.com/gorilla/schema/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/gorilla/schema/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,4 +1,4 @@ | ||||
| Copyright (c) 2012 Rodrigo Moraes. All rights reserved. | ||||
| Copyright (c) 2023 The Gorilla Authors. All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are | ||||
|  | ||||
							
								
								
									
										34
									
								
								vendor/github.com/gorilla/schema/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/gorilla/schema/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| GO_LINT=$(shell which golangci-lint 2> /dev/null || echo '') | ||||
| GO_LINT_URI=github.com/golangci/golangci-lint/cmd/golangci-lint@latest | ||||
| 
 | ||||
| GO_SEC=$(shell which gosec 2> /dev/null || echo '') | ||||
| GO_SEC_URI=github.com/securego/gosec/v2/cmd/gosec@latest | ||||
| 
 | ||||
| GO_VULNCHECK=$(shell which govulncheck 2> /dev/null || echo '') | ||||
| GO_VULNCHECK_URI=golang.org/x/vuln/cmd/govulncheck@latest | ||||
| 
 | ||||
| .PHONY: golangci-lint | ||||
| golangci-lint: | ||||
| 	$(if $(GO_LINT), ,go install $(GO_LINT_URI)) | ||||
| 	@echo "##### Running golangci-lint" | ||||
| 	golangci-lint run -v | ||||
| 	 | ||||
| .PHONY: gosec | ||||
| gosec: | ||||
| 	$(if $(GO_SEC), ,go install $(GO_SEC_URI)) | ||||
| 	@echo "##### Running gosec" | ||||
| 	gosec ./... | ||||
| 
 | ||||
| .PHONY: govulncheck | ||||
| govulncheck: | ||||
| 	$(if $(GO_VULNCHECK), ,go install $(GO_VULNCHECK_URI)) | ||||
| 	@echo "##### Running govulncheck" | ||||
| 	govulncheck ./... | ||||
| 
 | ||||
| .PHONY: verify | ||||
| verify: golangci-lint gosec govulncheck | ||||
| 
 | ||||
| .PHONY: test | ||||
| test: | ||||
| 	@echo "##### Running tests" | ||||
| 	go test -race -cover -coverprofile=coverage.coverprofile -covermode=atomic -v ./... | ||||
							
								
								
									
										39
									
								
								vendor/github.com/gorilla/schema/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								vendor/github.com/gorilla/schema/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,8 +1,12 @@ | ||||
| schema | ||||
| ====== | ||||
| [](https://godoc.org/github.com/gorilla/schema) [](https://travis-ci.org/gorilla/schema) | ||||
| [](https://sourcegraph.com/github.com/gorilla/schema?badge) | ||||
| # gorilla/schema | ||||
| 
 | ||||
|  | ||||
| [](https://codecov.io/github/gorilla/schema) | ||||
| [](https://godoc.org/github.com/gorilla/schema) | ||||
| [](https://sourcegraph.com/github.com/gorilla/schema?badge) | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| Package gorilla/schema converts structs to and from form values. | ||||
| 
 | ||||
| @ -83,7 +87,32 @@ The supported field types in the struct are: | ||||
| 
 | ||||
| Unsupported types are simply ignored, however custom types can be registered to be converted. | ||||
| 
 | ||||
| More examples are available on the Gorilla website: https://www.gorillatoolkit.org/pkg/schema | ||||
| ## Setting Defaults | ||||
| 
 | ||||
| It is possible to set default values when encoding/decoding by using the `default` tag option. The value of `default` is applied when a field has a zero value, a pointer has a nil value, or a slice is empty. | ||||
| 
 | ||||
| ```go | ||||
| type Person struct { | ||||
|     Phone string `schema:"phone,default:+123456"`          // custom name | ||||
|     Age int     `schema:"age,default:21"` | ||||
| 	Admin bool    `schema:"admin,default:false"` | ||||
| 	Balance float64 `schema:"balance,default:10.0"` | ||||
|     Friends []string `schema:friends,default:john|bob` | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| The `default` tag option is supported for the following types: | ||||
| 
 | ||||
| * bool | ||||
| * float variants (float32, float64) | ||||
| * int variants (int, int8, int16, int32, int64) | ||||
| * uint variants (uint, uint8, uint16, uint32, uint64) | ||||
| * string | ||||
| * a slice of the above types. As shown in the example above, `|` should be used to separate between slice items.  | ||||
| * a pointer to one of the above types (pointer to slice and slice of pointers are not supported). | ||||
| 
 | ||||
| > [!NOTE]   | ||||
| > Because primitive types like int, float, bool, unint and their variants have their default (or zero) values set by Golang, it is not possible to distinguish them from a provided value when decoding/encoding form values. In this case, the value provided by the `default` option tag will be always applied. For example, let's assume that the value submitted in the form for `balance` is `0.0` then the default of `10.0` will be applied, even if `0.0` is part of the form data for the `balance` field. In such cases, it is highly recommended to use pointers to allow schema to distinguish between when a form field has no provided value and when a form has a value equal to the corresponding default set by Golang for a particular type. If the type of the `Balance` field above is changed to `*float64`, then the zero value would be `nil`. In this case, if the form data value for `balance` is `0.0`, then the default will not be applied. | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										28
									
								
								vendor/github.com/gorilla/schema/cache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/gorilla/schema/cache.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -12,7 +12,7 @@ import ( | ||||
| 	"sync" | ||||
| ) | ||||
| 
 | ||||
| var invalidPath = errors.New("schema: invalid path") | ||||
| var errInvalidPath = errors.New("schema: invalid path") | ||||
| 
 | ||||
| // newCache returns a new cache. | ||||
| func newCache() *cache { | ||||
| @ -53,13 +53,13 @@ func (c *cache) parsePath(p string, t reflect.Type) ([]pathPart, error) { | ||||
| 	keys := strings.Split(p, ".") | ||||
| 	for i := 0; i < len(keys); i++ { | ||||
| 		if t.Kind() != reflect.Struct { | ||||
| 			return nil, invalidPath | ||||
| 			return nil, errInvalidPath | ||||
| 		} | ||||
| 		if struc = c.get(t); struc == nil { | ||||
| 			return nil, invalidPath | ||||
| 			return nil, errInvalidPath | ||||
| 		} | ||||
| 		if field = struc.get(keys[i]); field == nil { | ||||
| 			return nil, invalidPath | ||||
| 			return nil, errInvalidPath | ||||
| 		} | ||||
| 		// Valid field. Append index. | ||||
| 		path = append(path, field.name) | ||||
| @ -72,10 +72,10 @@ func (c *cache) parsePath(p string, t reflect.Type) ([]pathPart, error) { | ||||
| 			// So checking i+2 is not necessary anymore. | ||||
| 			i++ | ||||
| 			if i+1 > len(keys) { | ||||
| 				return nil, invalidPath | ||||
| 				return nil, errInvalidPath | ||||
| 			} | ||||
| 			if index64, err = strconv.ParseInt(keys[i], 10, 0); err != nil { | ||||
| 				return nil, invalidPath | ||||
| 				return nil, errInvalidPath | ||||
| 			} | ||||
| 			parts = append(parts, pathPart{ | ||||
| 				path:  path, | ||||
| @ -197,6 +197,7 @@ func (c *cache) createField(field reflect.StructField, parentAlias string) *fiel | ||||
| 		isSliceOfStructs: isSlice && isStruct, | ||||
| 		isAnonymous:      field.Anonymous, | ||||
| 		isRequired:       options.Contains("required"), | ||||
| 		defaultValue:     options.getDefaultOptionValue(), | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -246,8 +247,9 @@ type fieldInfo struct { | ||||
| 	// isSliceOfStructs indicates if the field type is a slice of structs. | ||||
| 	isSliceOfStructs bool | ||||
| 	// isAnonymous indicates whether the field is embedded in the struct. | ||||
| 	isAnonymous bool | ||||
| 	isRequired  bool | ||||
| 	isAnonymous  bool | ||||
| 	isRequired   bool | ||||
| 	defaultValue string | ||||
| } | ||||
| 
 | ||||
| func (f *fieldInfo) paths(prefix string) []string { | ||||
| @ -303,3 +305,13 @@ func (o tagOptions) Contains(option string) bool { | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| func (o tagOptions) getDefaultOptionValue() string { | ||||
| 	for _, s := range o { | ||||
| 		if strings.HasPrefix(s, "default:") { | ||||
| 			return strings.Split(s, ":")[1] | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
							
								
								
									
										77
									
								
								vendor/github.com/gorilla/schema/converter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								vendor/github.com/gorilla/schema/converter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -143,3 +143,80 @@ func convertUint64(value string) reflect.Value { | ||||
| 	} | ||||
| 	return invalidValue | ||||
| } | ||||
| 
 | ||||
| func convertPointer(k reflect.Kind, value string) reflect.Value { | ||||
| 	switch k { | ||||
| 	case boolType: | ||||
| 		if v := convertBool(value); v.IsValid() { | ||||
| 			converted := v.Bool() | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case float32Type: | ||||
| 		if v := convertFloat32(value); v.IsValid() { | ||||
| 			converted := float32(v.Float()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case float64Type: | ||||
| 		if v := convertFloat64(value); v.IsValid() { | ||||
| 			converted := float64(v.Float()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case intType: | ||||
| 		if v := convertInt(value); v.IsValid() { | ||||
| 			converted := int(v.Int()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case int8Type: | ||||
| 		if v := convertInt8(value); v.IsValid() { | ||||
| 			converted := int8(v.Int()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case int16Type: | ||||
| 		if v := convertInt16(value); v.IsValid() { | ||||
| 			converted := int16(v.Int()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case int32Type: | ||||
| 		if v := convertInt32(value); v.IsValid() { | ||||
| 			converted := int32(v.Int()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case int64Type: | ||||
| 		if v := convertInt64(value); v.IsValid() { | ||||
| 			converted := int64(v.Int()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case stringType: | ||||
| 		if v := convertString(value); v.IsValid() { | ||||
| 			converted := v.String() | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case uintType: | ||||
| 		if v := convertUint(value); v.IsValid() { | ||||
| 			converted := uint(v.Uint()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case uint8Type: | ||||
| 		if v := convertUint8(value); v.IsValid() { | ||||
| 			converted := uint8(v.Uint()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case uint16Type: | ||||
| 		if v := convertUint16(value); v.IsValid() { | ||||
| 			converted := uint16(v.Uint()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case uint32Type: | ||||
| 		if v := convertUint32(value); v.IsValid() { | ||||
| 			converted := uint32(v.Uint()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	case uint64Type: | ||||
| 		if v := convertUint64(value); v.IsValid() { | ||||
| 			converted := uint64(v.Uint()) | ||||
| 			return reflect.ValueOf(&converted) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return invalidValue | ||||
| } | ||||
|  | ||||
							
								
								
									
										73
									
								
								vendor/github.com/gorilla/schema/decoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										73
									
								
								vendor/github.com/gorilla/schema/decoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -84,6 +84,7 @@ func (d *Decoder) Decode(dst interface{}, src map[string][]string) error { | ||||
| 			errors[path] = UnknownKeyError{Key: path} | ||||
| 		} | ||||
| 	} | ||||
| 	errors.merge(d.setDefaults(t, v)) | ||||
| 	errors.merge(d.checkRequired(t, src)) | ||||
| 	if len(errors) > 0 { | ||||
| 		return errors | ||||
| @ -91,6 +92,76 @@ func (d *Decoder) Decode(dst interface{}, src map[string][]string) error { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| //setDefaults sets the default values when the `default` tag is specified, | ||||
| //default is supported on basic/primitive types and their pointers, | ||||
| //nested structs can also have default tags | ||||
| func (d *Decoder) setDefaults(t reflect.Type, v reflect.Value) MultiError { | ||||
| 	struc := d.cache.get(t) | ||||
| 	if struc == nil { | ||||
| 		// unexpect, cache.get never return nil | ||||
| 		return MultiError{"default-" + t.Name(): errors.New("cache fail")} | ||||
| 	} | ||||
| 
 | ||||
| 	errs := MultiError{} | ||||
| 
 | ||||
| 	for _, f := range struc.fields { | ||||
| 		vCurrent := v.FieldByName(f.name) | ||||
| 
 | ||||
| 		if vCurrent.Type().Kind() == reflect.Struct && f.defaultValue == "" { | ||||
| 			errs.merge(d.setDefaults(vCurrent.Type(), vCurrent)) | ||||
| 		} else if isPointerToStruct(vCurrent) && f.defaultValue == "" { | ||||
| 			errs.merge(d.setDefaults(vCurrent.Elem().Type(), vCurrent.Elem())) | ||||
| 		} | ||||
| 
 | ||||
| 		if f.defaultValue != "" && f.isRequired { | ||||
| 			errs.merge(MultiError{"default-" + f.name: errors.New("required fields cannot have a default value")}) | ||||
| 		} else if f.defaultValue != "" && vCurrent.IsZero() && !f.isRequired { | ||||
| 			if f.typ.Kind() == reflect.Struct { | ||||
| 				errs.merge(MultiError{"default-" + f.name: errors.New("default option is supported only on: bool, float variants, string, unit variants types or their corresponding pointers or slices")}) | ||||
| 			} else if f.typ.Kind() == reflect.Slice { | ||||
| 				vals := strings.Split(f.defaultValue, "|") | ||||
| 
 | ||||
| 				//check if slice has one of the supported types for defaults | ||||
| 				if _, ok := builtinConverters[f.typ.Elem().Kind()]; !ok { | ||||
| 					errs.merge(MultiError{"default-" + f.name: errors.New("default option is supported only on: bool, float variants, string, unit variants types or their corresponding pointers or slices")}) | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				defaultSlice := reflect.MakeSlice(f.typ, 0, cap(vals)) | ||||
| 				for _, val := range vals { | ||||
| 					//this check is to handle if the wrong value is provided | ||||
| 					if convertedVal := builtinConverters[f.typ.Elem().Kind()](val); convertedVal.IsValid() { | ||||
| 						defaultSlice = reflect.Append(defaultSlice, convertedVal) | ||||
| 					} | ||||
| 				} | ||||
| 				vCurrent.Set(defaultSlice) | ||||
| 			} else if f.typ.Kind() == reflect.Ptr { | ||||
| 				t1 := f.typ.Elem() | ||||
| 
 | ||||
| 				if t1.Kind() == reflect.Struct || t1.Kind() == reflect.Slice { | ||||
| 					errs.merge(MultiError{"default-" + f.name: errors.New("default option is supported only on: bool, float variants, string, unit variants types or their corresponding pointers or slices")}) | ||||
| 				} | ||||
| 
 | ||||
| 				//this check is to handle if the wrong value is provided | ||||
| 				if convertedVal := convertPointer(t1.Kind(), f.defaultValue); convertedVal.IsValid() { | ||||
| 					vCurrent.Set(convertedVal) | ||||
| 				} | ||||
| 			} else { | ||||
| 				//this check is to handle if the wrong value is provided | ||||
| 				if convertedVal := builtinConverters[f.typ.Kind()](f.defaultValue); convertedVal.IsValid() { | ||||
| 					vCurrent.Set(builtinConverters[f.typ.Kind()](f.defaultValue)) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return errs | ||||
| } | ||||
| 
 | ||||
| func isPointerToStruct(v reflect.Value) bool { | ||||
| 	return !v.IsZero() && v.Type().Kind() == reflect.Ptr && v.Elem().Type().Kind() == reflect.Struct | ||||
| } | ||||
| 
 | ||||
| // checkRequired checks whether required fields are empty | ||||
| // | ||||
| // check type t recursively if t has struct fields. | ||||
| @ -193,7 +264,7 @@ func (d *Decoder) decode(v reflect.Value, path string, parts []pathPart, values | ||||
| 		if v.Type().Kind() == reflect.Struct { | ||||
| 			for i := 0; i < v.NumField(); i++ { | ||||
| 				field := v.Field(i) | ||||
| 				if field.Type().Kind() == reflect.Ptr && field.IsNil() && v.Type().Field(i).Anonymous == true { | ||||
| 				if field.Type().Kind() == reflect.Ptr && field.IsNil() && v.Type().Field(i).Anonymous { | ||||
| 					field.Set(reflect.New(field.Type().Elem())) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
							
								
								
									
										17
									
								
								vendor/github.com/gorilla/schema/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/gorilla/schema/encoder.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -93,8 +93,11 @@ func (e *Encoder) encode(v reflect.Value, dst map[string][]string) error { | ||||
| 		} | ||||
| 
 | ||||
| 		// Encode struct pointer types if the field is a valid pointer and a struct. | ||||
| 		if isValidStructPointer(v.Field(i)) { | ||||
| 			e.encode(v.Field(i).Elem(), dst) | ||||
| 		if isValidStructPointer(v.Field(i)) && !e.hasCustomEncoder(v.Field(i).Type()) { | ||||
| 			err := e.encode(v.Field(i).Elem(), dst) | ||||
| 			if err != nil { | ||||
| 				errors[v.Field(i).Elem().Type().String()] = err | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| @ -112,7 +115,10 @@ func (e *Encoder) encode(v reflect.Value, dst map[string][]string) error { | ||||
| 		} | ||||
| 
 | ||||
| 		if v.Field(i).Type().Kind() == reflect.Struct { | ||||
| 			e.encode(v.Field(i), dst) | ||||
| 			err := e.encode(v.Field(i), dst) | ||||
| 			if err != nil { | ||||
| 				errors[v.Field(i).Type().String()] = err | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| @ -142,6 +148,11 @@ func (e *Encoder) encode(v reflect.Value, dst map[string][]string) error { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (e *Encoder) hasCustomEncoder(t reflect.Type) bool { | ||||
| 	_, exists := e.regenc[t] | ||||
| 	return exists | ||||
| } | ||||
| 
 | ||||
| func typeEncoder(t reflect.Type, reg map[reflect.Type]encoderFunc) encoderFunc { | ||||
| 	if f, ok := reg[t]; ok { | ||||
| 		return f | ||||
|  | ||||
| @ -20,5 +20,4 @@ _cgo_export.* | ||||
| _testmain.go | ||||
| 
 | ||||
| *.exe | ||||
| *.bench | ||||
| go.sum | ||||
| *.test | ||||
							
								
								
									
										46
									
								
								vendor/github.com/hashicorp/golang-lru/v2/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/hashicorp/golang-lru/v2/.golangci.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| # Copyright (c) HashiCorp, Inc. | ||||
| # SPDX-License-Identifier: MPL-2.0 | ||||
| 
 | ||||
| linters: | ||||
|   fast: false | ||||
|   disable-all: true | ||||
|   enable: | ||||
|     - revive | ||||
|     - megacheck | ||||
|     - govet | ||||
|     - unconvert | ||||
|     - gas | ||||
|     - gocyclo | ||||
|     - dupl | ||||
|     - misspell | ||||
|     - unparam | ||||
|     - unused | ||||
|     - typecheck | ||||
|     - ineffassign | ||||
|     # - stylecheck | ||||
|     - exportloopref | ||||
|     - gocritic | ||||
|     - nakedret | ||||
|     - gosimple | ||||
|     - prealloc | ||||
| 
 | ||||
| # golangci-lint configuration file | ||||
| linters-settings: | ||||
|   revive: | ||||
|     ignore-generated-header: true | ||||
|     severity: warning | ||||
|     rules: | ||||
|       - name: package-comments | ||||
|         severity: warning | ||||
|         disabled: true | ||||
|       - name: exported | ||||
|         severity: warning | ||||
|         disabled: false | ||||
|         arguments: ["checkPrivateReceivers", "disableStutteringCheck"] | ||||
| 
 | ||||
| issues: | ||||
|   exclude-use-default: false | ||||
|   exclude-rules: | ||||
|     - path: _test\.go | ||||
|       linters: | ||||
|         - dupl | ||||
							
								
								
									
										267
									
								
								vendor/github.com/hashicorp/golang-lru/v2/2q.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								vendor/github.com/hashicorp/golang-lru/v2/2q.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,267 @@ | ||||
| // Copyright (c) HashiCorp, Inc. | ||||
| // SPDX-License-Identifier: MPL-2.0 | ||||
| 
 | ||||
| package lru | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/hashicorp/golang-lru/v2/simplelru" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// Default2QRecentRatio is the ratio of the 2Q cache dedicated | ||||
| 	// to recently added entries that have only been accessed once. | ||||
| 	Default2QRecentRatio = 0.25 | ||||
| 
 | ||||
| 	// Default2QGhostEntries is the default ratio of ghost | ||||
| 	// entries kept to track entries recently evicted | ||||
| 	Default2QGhostEntries = 0.50 | ||||
| ) | ||||
| 
 | ||||
| // TwoQueueCache is a thread-safe fixed size 2Q cache. | ||||
| // 2Q is an enhancement over the standard LRU cache | ||||
| // in that it tracks both frequently and recently used | ||||
| // entries separately. This avoids a burst in access to new | ||||
| // entries from evicting frequently used entries. It adds some | ||||
| // additional tracking overhead to the standard LRU cache, and is | ||||
| // computationally about 2x the cost, and adds some metadata over | ||||
| // head. The ARCCache is similar, but does not require setting any | ||||
| // parameters. | ||||
| type TwoQueueCache[K comparable, V any] struct { | ||||
| 	size        int | ||||
| 	recentSize  int | ||||
| 	recentRatio float64 | ||||
| 	ghostRatio  float64 | ||||
| 
 | ||||
| 	recent      simplelru.LRUCache[K, V] | ||||
| 	frequent    simplelru.LRUCache[K, V] | ||||
| 	recentEvict simplelru.LRUCache[K, struct{}] | ||||
| 	lock        sync.RWMutex | ||||
| } | ||||
| 
 | ||||
| // New2Q creates a new TwoQueueCache using the default | ||||
| // values for the parameters. | ||||
| func New2Q[K comparable, V any](size int) (*TwoQueueCache[K, V], error) { | ||||
| 	return New2QParams[K, V](size, Default2QRecentRatio, Default2QGhostEntries) | ||||
| } | ||||
| 
 | ||||
| // New2QParams creates a new TwoQueueCache using the provided | ||||
| // parameter values. | ||||
| func New2QParams[K comparable, V any](size int, recentRatio, ghostRatio float64) (*TwoQueueCache[K, V], error) { | ||||
| 	if size <= 0 { | ||||
| 		return nil, errors.New("invalid size") | ||||
| 	} | ||||
| 	if recentRatio < 0.0 || recentRatio > 1.0 { | ||||
| 		return nil, errors.New("invalid recent ratio") | ||||
| 	} | ||||
| 	if ghostRatio < 0.0 || ghostRatio > 1.0 { | ||||
| 		return nil, errors.New("invalid ghost ratio") | ||||
| 	} | ||||
| 
 | ||||
| 	// Determine the sub-sizes | ||||
| 	recentSize := int(float64(size) * recentRatio) | ||||
| 	evictSize := int(float64(size) * ghostRatio) | ||||
| 
 | ||||
| 	// Allocate the LRUs | ||||
| 	recent, err := simplelru.NewLRU[K, V](size, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	frequent, err := simplelru.NewLRU[K, V](size, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	recentEvict, err := simplelru.NewLRU[K, struct{}](evictSize, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	// Initialize the cache | ||||
| 	c := &TwoQueueCache[K, V]{ | ||||
| 		size:        size, | ||||
| 		recentSize:  recentSize, | ||||
| 		recentRatio: recentRatio, | ||||
| 		ghostRatio:  ghostRatio, | ||||
| 		recent:      recent, | ||||
| 		frequent:    frequent, | ||||
| 		recentEvict: recentEvict, | ||||
| 	} | ||||
| 	return c, nil | ||||
| } | ||||
| 
 | ||||
| // Get looks up a key's value from the cache. | ||||
| func (c *TwoQueueCache[K, V]) Get(key K) (value V, ok bool) { | ||||
| 	c.lock.Lock() | ||||
| 	defer c.lock.Unlock() | ||||
| 
 | ||||
| 	// Check if this is a frequent value | ||||
| 	if val, ok := c.frequent.Get(key); ok { | ||||
| 		return val, ok | ||||
| 	} | ||||
| 
 | ||||
| 	// If the value is contained in recent, then we | ||||
| 	// promote it to frequent | ||||
| 	if val, ok := c.recent.Peek(key); ok { | ||||
| 		c.recent.Remove(key) | ||||
| 		c.frequent.Add(key, val) | ||||
| 		return val, ok | ||||
| 	} | ||||
| 
 | ||||
| 	// No hit | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Add adds a value to the cache. | ||||
| func (c *TwoQueueCache[K, V]) Add(key K, value V) { | ||||
| 	c.lock.Lock() | ||||
| 	defer c.lock.Unlock() | ||||
| 
 | ||||
| 	// Check if the value is frequently used already, | ||||
| 	// and just update the value | ||||
| 	if c.frequent.Contains(key) { | ||||
| 		c.frequent.Add(key, value) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Check if the value is recently used, and promote | ||||
| 	// the value into the frequent list | ||||
| 	if c.recent.Contains(key) { | ||||
| 		c.recent.Remove(key) | ||||
| 		c.frequent.Add(key, value) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// If the value was recently evicted, add it to the | ||||
| 	// frequently used list | ||||
| 	if c.recentEvict.Contains(key) { | ||||
| 		c.ensureSpace(true) | ||||
| 		c.recentEvict.Remove(key) | ||||
| 		c.frequent.Add(key, value) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Add to the recently seen list | ||||
| 	c.ensureSpace(false) | ||||
| 	c.recent.Add(key, value) | ||||
| } | ||||
| 
 | ||||
| // ensureSpace is used to ensure we have space in the cache | ||||
| func (c *TwoQueueCache[K, V]) ensureSpace(recentEvict bool) { | ||||
| 	// If we have space, nothing to do | ||||
| 	recentLen := c.recent.Len() | ||||
| 	freqLen := c.frequent.Len() | ||||
| 	if recentLen+freqLen < c.size { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// If the recent buffer is larger than | ||||
| 	// the target, evict from there | ||||
| 	if recentLen > 0 && (recentLen > c.recentSize || (recentLen == c.recentSize && !recentEvict)) { | ||||
| 		k, _, _ := c.recent.RemoveOldest() | ||||
| 		c.recentEvict.Add(k, struct{}{}) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	// Remove from the frequent list otherwise | ||||
| 	c.frequent.RemoveOldest() | ||||
| } | ||||
| 
 | ||||
| // Len returns the number of items in the cache. | ||||
| func (c *TwoQueueCache[K, V]) Len() int { | ||||
| 	c.lock.RLock() | ||||
| 	defer c.lock.RUnlock() | ||||
| 	return c.recent.Len() + c.frequent.Len() | ||||
| } | ||||
| 
 | ||||
| // Resize changes the cache size. | ||||
| func (c *TwoQueueCache[K, V]) Resize(size int) (evicted int) { | ||||
| 	c.lock.Lock() | ||||
| 	defer c.lock.Unlock() | ||||
| 
 | ||||
| 	// Recalculate the sub-sizes | ||||
| 	recentSize := int(float64(size) * c.recentRatio) | ||||
| 	evictSize := int(float64(size) * c.ghostRatio) | ||||
| 	c.size = size | ||||
| 	c.recentSize = recentSize | ||||
| 
 | ||||
| 	// ensureSpace | ||||
| 	diff := c.recent.Len() + c.frequent.Len() - size | ||||
| 	if diff < 0 { | ||||
| 		diff = 0 | ||||
| 	} | ||||
| 	for i := 0; i < diff; i++ { | ||||
| 		c.ensureSpace(true) | ||||
| 	} | ||||
| 
 | ||||
| 	// Reallocate the LRUs | ||||
| 	c.recent.Resize(size) | ||||
| 	c.frequent.Resize(size) | ||||
| 	c.recentEvict.Resize(evictSize) | ||||
| 
 | ||||
| 	return diff | ||||
| } | ||||
| 
 | ||||
| // Keys returns a slice of the keys in the cache. | ||||
| // The frequently used keys are first in the returned slice. | ||||
| func (c *TwoQueueCache[K, V]) Keys() []K { | ||||
| 	c.lock.RLock() | ||||
| 	defer c.lock.RUnlock() | ||||
| 	k1 := c.frequent.Keys() | ||||
| 	k2 := c.recent.Keys() | ||||
| 	return append(k1, k2...) | ||||
| } | ||||
| 
 | ||||
| // Values returns a slice of the values in the cache. | ||||
| // The frequently used values are first in the returned slice. | ||||
| func (c *TwoQueueCache[K, V]) Values() []V { | ||||
| 	c.lock.RLock() | ||||
| 	defer c.lock.RUnlock() | ||||
| 	v1 := c.frequent.Values() | ||||
| 	v2 := c.recent.Values() | ||||
| 	return append(v1, v2...) | ||||
| } | ||||
| 
 | ||||
| // Remove removes the provided key from the cache. | ||||
| func (c *TwoQueueCache[K, V]) Remove(key K) { | ||||
| 	c.lock.Lock() | ||||
| 	defer c.lock.Unlock() | ||||
| 	if c.frequent.Remove(key) { | ||||
| 		return | ||||
| 	} | ||||
| 	if c.recent.Remove(key) { | ||||
| 		return | ||||
| 	} | ||||
| 	if c.recentEvict.Remove(key) { | ||||
| 		return | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Purge is used to completely clear the cache. | ||||
| func (c *TwoQueueCache[K, V]) Purge() { | ||||
| 	c.lock.Lock() | ||||
| 	defer c.lock.Unlock() | ||||
| 	c.recent.Purge() | ||||
| 	c.frequent.Purge() | ||||
| 	c.recentEvict.Purge() | ||||
| } | ||||
| 
 | ||||
| // Contains is used to check if the cache contains a key | ||||
| // without updating recency or frequency. | ||||
| func (c *TwoQueueCache[K, V]) Contains(key K) bool { | ||||
| 	c.lock.RLock() | ||||
| 	defer c.lock.RUnlock() | ||||
| 	return c.frequent.Contains(key) || c.recent.Contains(key) | ||||
| } | ||||
| 
 | ||||
| // Peek is used to inspect the cache value of a key | ||||
| // without updating recency or frequency. | ||||
| func (c *TwoQueueCache[K, V]) Peek(key K) (value V, ok bool) { | ||||
| 	c.lock.RLock() | ||||
| 	defer c.lock.RUnlock() | ||||
| 	if val, ok := c.frequent.Peek(key); ok { | ||||
| 		return val, ok | ||||
| 	} | ||||
| 	return c.recent.Peek(key) | ||||
| } | ||||
							
								
								
									
										364
									
								
								vendor/github.com/hashicorp/golang-lru/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										364
									
								
								vendor/github.com/hashicorp/golang-lru/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,364 @@ | ||||
| Copyright (c) 2014 HashiCorp, Inc. | ||||
| 
 | ||||
| Mozilla Public License, version 2.0 | ||||
| 
 | ||||
| 1. Definitions | ||||
| 
 | ||||
| 1.1. "Contributor" | ||||
| 
 | ||||
|      means each individual or legal entity that creates, contributes to the | ||||
|      creation of, or owns Covered Software. | ||||
| 
 | ||||
| 1.2. "Contributor Version" | ||||
| 
 | ||||
|      means the combination of the Contributions of others (if any) used by a | ||||
|      Contributor and that particular Contributor's Contribution. | ||||
| 
 | ||||
| 1.3. "Contribution" | ||||
| 
 | ||||
|      means Covered Software of a particular Contributor. | ||||
| 
 | ||||
| 1.4. "Covered Software" | ||||
| 
 | ||||
|      means Source Code Form to which the initial Contributor has attached the | ||||
|      notice in Exhibit A, the Executable Form of such Source Code Form, and | ||||
|      Modifications of such Source Code Form, in each case including portions | ||||
|      thereof. | ||||
| 
 | ||||
| 1.5. "Incompatible With Secondary Licenses" | ||||
|      means | ||||
| 
 | ||||
|      a. that the initial Contributor has attached the notice described in | ||||
|         Exhibit B to the Covered Software; or | ||||
| 
 | ||||
|      b. that the Covered Software was made available under the terms of | ||||
|         version 1.1 or earlier of the License, but not also under the terms of | ||||
|         a Secondary License. | ||||
| 
 | ||||
| 1.6. "Executable Form" | ||||
| 
 | ||||
|      means any form of the work other than Source Code Form. | ||||
| 
 | ||||
| 1.7. "Larger Work" | ||||
| 
 | ||||
|      means a work that combines Covered Software with other material, in a | ||||
|      separate file or files, that is not Covered Software. | ||||
| 
 | ||||
| 1.8. "License" | ||||
| 
 | ||||
|      means this document. | ||||
| 
 | ||||
| 1.9. "Licensable" | ||||
| 
 | ||||
|      means having the right to grant, to the maximum extent possible, whether | ||||
|      at the time of the initial grant or subsequently, any and all of the | ||||
|      rights conveyed by this License. | ||||
| 
 | ||||
| 1.10. "Modifications" | ||||
| 
 | ||||
|      means any of the following: | ||||
| 
 | ||||
|      a. any file in Source Code Form that results from an addition to, | ||||
|         deletion from, or modification of the contents of Covered Software; or | ||||
| 
 | ||||
|      b. any new file in Source Code Form that contains any Covered Software. | ||||
| 
 | ||||
| 1.11. "Patent Claims" of a Contributor | ||||
| 
 | ||||
|       means any patent claim(s), including without limitation, method, | ||||
|       process, and apparatus claims, in any patent Licensable by such | ||||
|       Contributor that would be infringed, but for the grant of the License, | ||||
|       by the making, using, selling, offering for sale, having made, import, | ||||
|       or transfer of either its Contributions or its Contributor Version. | ||||
| 
 | ||||
| 1.12. "Secondary License" | ||||
| 
 | ||||
|       means either the GNU General Public License, Version 2.0, the GNU Lesser | ||||
|       General Public License, Version 2.1, the GNU Affero General Public | ||||
|       License, Version 3.0, or any later versions of those licenses. | ||||
| 
 | ||||
| 1.13. "Source Code Form" | ||||
| 
 | ||||
|       means the form of the work preferred for making modifications. | ||||
| 
 | ||||
| 1.14. "You" (or "Your") | ||||
| 
 | ||||
|       means an individual or a legal entity exercising rights under this | ||||
|       License. For legal entities, "You" includes any entity that controls, is | ||||
|       controlled by, or is under common control with You. For purposes of this | ||||
|       definition, "control" means (a) the power, direct or indirect, to cause | ||||
|       the direction or management of such entity, whether by contract or | ||||
|       otherwise, or (b) ownership of more than fifty percent (50%) of the | ||||
|       outstanding shares or beneficial ownership of such entity. | ||||
| 
 | ||||
| 
 | ||||
| 2. License Grants and Conditions | ||||
| 
 | ||||
| 2.1. Grants | ||||
| 
 | ||||
|      Each Contributor hereby grants You a world-wide, royalty-free, | ||||
|      non-exclusive license: | ||||
| 
 | ||||
|      a. under intellectual property rights (other than patent or trademark) | ||||
|         Licensable by such Contributor to use, reproduce, make available, | ||||
|         modify, display, perform, distribute, and otherwise exploit its | ||||
|         Contributions, either on an unmodified basis, with Modifications, or | ||||
|         as part of a Larger Work; and | ||||
| 
 | ||||
|      b. under Patent Claims of such Contributor to make, use, sell, offer for | ||||
|         sale, have made, import, and otherwise transfer either its | ||||
|         Contributions or its Contributor Version. | ||||
| 
 | ||||
| 2.2. Effective Date | ||||
| 
 | ||||
|      The licenses granted in Section 2.1 with respect to any Contribution | ||||
|      become effective for each Contribution on the date the Contributor first | ||||
|      distributes such Contribution. | ||||
| 
 | ||||
| 2.3. Limitations on Grant Scope | ||||
| 
 | ||||
|      The licenses granted in this Section 2 are the only rights granted under | ||||
|      this License. No additional rights or licenses will be implied from the | ||||
|      distribution or licensing of Covered Software under this License. | ||||
|      Notwithstanding Section 2.1(b) above, no patent license is granted by a | ||||
|      Contributor: | ||||
| 
 | ||||
|      a. for any code that a Contributor has removed from Covered Software; or | ||||
| 
 | ||||
|      b. for infringements caused by: (i) Your and any other third party's | ||||
|         modifications of Covered Software, or (ii) the combination of its | ||||
|         Contributions with other software (except as part of its Contributor | ||||
|         Version); or | ||||
| 
 | ||||
|      c. under Patent Claims infringed by Covered Software in the absence of | ||||
|         its Contributions. | ||||
| 
 | ||||
|      This License does not grant any rights in the trademarks, service marks, | ||||
|      or logos of any Contributor (except as may be necessary to comply with | ||||
|      the notice requirements in Section 3.4). | ||||
| 
 | ||||
| 2.4. Subsequent Licenses | ||||
| 
 | ||||
|      No Contributor makes additional grants as a result of Your choice to | ||||
|      distribute the Covered Software under a subsequent version of this | ||||
|      License (see Section 10.2) or under the terms of a Secondary License (if | ||||
|      permitted under the terms of Section 3.3). | ||||
| 
 | ||||
| 2.5. Representation | ||||
| 
 | ||||
|      Each Contributor represents that the Contributor believes its | ||||
|      Contributions are its original creation(s) or it has sufficient rights to | ||||
|      grant the rights to its Contributions conveyed by this License. | ||||
| 
 | ||||
| 2.6. Fair Use | ||||
| 
 | ||||
|      This License is not intended to limit any rights You have under | ||||
|      applicable copyright doctrines of fair use, fair dealing, or other | ||||
|      equivalents. | ||||
| 
 | ||||
| 2.7. Conditions | ||||
| 
 | ||||
|      Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in | ||||
|      Section 2.1. | ||||
| 
 | ||||
| 
 | ||||
| 3. Responsibilities | ||||
| 
 | ||||
| 3.1. Distribution of Source Form | ||||
| 
 | ||||
|      All distribution of Covered Software in Source Code Form, including any | ||||
|      Modifications that You create or to which You contribute, must be under | ||||
|      the terms of this License. You must inform recipients that the Source | ||||
|      Code Form of the Covered Software is governed by the terms of this | ||||
|      License, and how they can obtain a copy of this License. You may not | ||||
|      attempt to alter or restrict the recipients' rights in the Source Code | ||||
|      Form. | ||||
| 
 | ||||
| 3.2. Distribution of Executable Form | ||||
| 
 | ||||
|      If You distribute Covered Software in Executable Form then: | ||||
| 
 | ||||
|      a. such Covered Software must also be made available in Source Code Form, | ||||
|         as described in Section 3.1, and You must inform recipients of the | ||||
|         Executable Form how they can obtain a copy of such Source Code Form by | ||||
|         reasonable means in a timely manner, at a charge no more than the cost | ||||
|         of distribution to the recipient; and | ||||
| 
 | ||||
|      b. You may distribute such Executable Form under the terms of this | ||||
|         License, or sublicense it under different terms, provided that the | ||||
|         license for the Executable Form does not attempt to limit or alter the | ||||
|         recipients' rights in the Source Code Form under this License. | ||||
| 
 | ||||
| 3.3. Distribution of a Larger Work | ||||
| 
 | ||||
|      You may create and distribute a Larger Work under terms of Your choice, | ||||
|      provided that You also comply with the requirements of this License for | ||||
|      the Covered Software. If the Larger Work is a combination of Covered | ||||
|      Software with a work governed by one or more Secondary Licenses, and the | ||||
|      Covered Software is not Incompatible With Secondary Licenses, this | ||||
|      License permits You to additionally distribute such Covered Software | ||||
|      under the terms of such Secondary License(s), so that the recipient of | ||||
|      the Larger Work may, at their option, further distribute the Covered | ||||
|      Software under the terms of either this License or such Secondary | ||||
|      License(s). | ||||
| 
 | ||||
| 3.4. Notices | ||||
| 
 | ||||
|      You may not remove or alter the substance of any license notices | ||||
|      (including copyright notices, patent notices, disclaimers of warranty, or | ||||
|      limitations of liability) contained within the Source Code Form of the | ||||
|      Covered Software, except that You may alter any license notices to the | ||||
|      extent required to remedy known factual inaccuracies. | ||||
| 
 | ||||
| 3.5. Application of Additional Terms | ||||
| 
 | ||||
|      You may choose to offer, and to charge a fee for, warranty, support, | ||||
|      indemnity or liability obligations to one or more recipients of Covered | ||||
|      Software. However, You may do so only on Your own behalf, and not on | ||||
|      behalf of any Contributor. You must make it absolutely clear that any | ||||
|      such warranty, support, indemnity, or liability obligation is offered by | ||||
|      You alone, and You hereby agree to indemnify every Contributor for any | ||||
|      liability incurred by such Contributor as a result of warranty, support, | ||||
|      indemnity or liability terms You offer. You may include additional | ||||
|      disclaimers of warranty and limitations of liability specific to any | ||||
|      jurisdiction. | ||||
| 
 | ||||
| 4. Inability to Comply Due to Statute or Regulation | ||||
| 
 | ||||
|    If it is impossible for You to comply with any of the terms of this License | ||||
|    with respect to some or all of the Covered Software due to statute, | ||||
|    judicial order, or regulation then You must: (a) comply with the terms of | ||||
|    this License to the maximum extent possible; and (b) describe the | ||||
|    limitations and the code they affect. Such description must be placed in a | ||||
|    text file included with all distributions of the Covered Software under | ||||
|    this License. Except to the extent prohibited by statute or regulation, | ||||
|    such description must be sufficiently detailed for a recipient of ordinary | ||||
|    skill to be able to understand it. | ||||
| 
 | ||||
| 5. Termination | ||||
| 
 | ||||
| 5.1. The rights granted under this License will terminate automatically if You | ||||
|      fail to comply with any of its terms. However, if You become compliant, | ||||
|      then the rights granted under this License from a particular Contributor | ||||
|      are reinstated (a) provisionally, unless and until such Contributor | ||||
|      explicitly and finally terminates Your grants, and (b) on an ongoing | ||||
|      basis, if such Contributor fails to notify You of the non-compliance by | ||||
|      some reasonable means prior to 60 days after You have come back into | ||||
|      compliance. Moreover, Your grants from a particular Contributor are | ||||
|      reinstated on an ongoing basis if such Contributor notifies You of the | ||||
|      non-compliance by some reasonable means, this is the first time You have | ||||
|      received notice of non-compliance with this License from such | ||||
|      Contributor, and You become compliant prior to 30 days after Your receipt | ||||
|      of the notice. | ||||
| 
 | ||||
| 5.2. If You initiate litigation against any entity by asserting a patent | ||||
|      infringement claim (excluding declaratory judgment actions, | ||||
|      counter-claims, and cross-claims) alleging that a Contributor Version | ||||
|      directly or indirectly infringes any patent, then the rights granted to | ||||
|      You by any and all Contributors for the Covered Software under Section | ||||
|      2.1 of this License shall terminate. | ||||
| 
 | ||||
| 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user | ||||
|      license agreements (excluding distributors and resellers) which have been | ||||
|      validly granted by You or Your distributors under this License prior to | ||||
|      termination shall survive termination. | ||||
| 
 | ||||
| 6. Disclaimer of Warranty | ||||
| 
 | ||||
|    Covered Software is provided under this License on an "as is" basis, | ||||
|    without warranty of any kind, either expressed, implied, or statutory, | ||||
|    including, without limitation, warranties that the Covered Software is free | ||||
|    of defects, merchantable, fit for a particular purpose or non-infringing. | ||||
|    The entire risk as to the quality and performance of the Covered Software | ||||
|    is with You. Should any Covered Software prove defective in any respect, | ||||
|    You (not any Contributor) assume the cost of any necessary servicing, | ||||
|    repair, or correction. This disclaimer of warranty constitutes an essential | ||||
|    part of this License. No use of  any Covered Software is authorized under | ||||
|    this License except under this disclaimer. | ||||
| 
 | ||||
| 7. Limitation of Liability | ||||
| 
 | ||||
|    Under no circumstances and under no legal theory, whether tort (including | ||||
|    negligence), contract, or otherwise, shall any Contributor, or anyone who | ||||
|    distributes Covered Software as permitted above, be liable to You for any | ||||
|    direct, indirect, special, incidental, or consequential damages of any | ||||
|    character including, without limitation, damages for lost profits, loss of | ||||
|    goodwill, work stoppage, computer failure or malfunction, or any and all | ||||
|    other commercial damages or losses, even if such party shall have been | ||||
|    informed of the possibility of such damages. This limitation of liability | ||||
|    shall not apply to liability for death or personal injury resulting from | ||||
|    such party's negligence to the extent applicable law prohibits such | ||||
|    limitation. Some jurisdictions do not allow the exclusion or limitation of | ||||
|    incidental or consequential damages, so this exclusion and limitation may | ||||
|    not apply to You. | ||||
| 
 | ||||
| 8. Litigation | ||||
| 
 | ||||
|    Any litigation relating to this License may be brought only in the courts | ||||
|    of a jurisdiction where the defendant maintains its principal place of | ||||
|    business and such litigation shall be governed by laws of that | ||||
|    jurisdiction, without reference to its conflict-of-law provisions. Nothing | ||||
|    in this Section shall prevent a party's ability to bring cross-claims or | ||||
|    counter-claims. | ||||
| 
 | ||||
| 9. Miscellaneous | ||||
| 
 | ||||
|    This License represents the complete agreement concerning the subject | ||||
|    matter hereof. If any provision of this License is held to be | ||||
|    unenforceable, such provision shall be reformed only to the extent | ||||
|    necessary to make it enforceable. Any law or regulation which provides that | ||||
|    the language of a contract shall be construed against the drafter shall not | ||||
|    be used to construe this License against a Contributor. | ||||
| 
 | ||||
| 
 | ||||
| 10. Versions of the License | ||||
| 
 | ||||
| 10.1. New Versions | ||||
| 
 | ||||
|       Mozilla Foundation is the license steward. Except as provided in Section | ||||
|       10.3, no one other than the license steward has the right to modify or | ||||
|       publish new versions of this License. Each version will be given a | ||||
|       distinguishing version number. | ||||
| 
 | ||||
| 10.2. Effect of New Versions | ||||
| 
 | ||||
|       You may distribute the Covered Software under the terms of the version | ||||
|       of the License under which You originally received the Covered Software, | ||||
|       or under the terms of any subsequent version published by the license | ||||
|       steward. | ||||
| 
 | ||||
| 10.3. Modified Versions | ||||
| 
 | ||||
|       If you create software not governed by this License, and you want to | ||||
|       create a new license for such software, you may create and use a | ||||
|       modified version of this License if you rename the license and remove | ||||
|       any references to the name of the license steward (except to note that | ||||
|       such modified license differs from this License). | ||||
| 
 | ||||
| 10.4. Distributing Source Code Form that is Incompatible With Secondary | ||||
|       Licenses If You choose to distribute Source Code Form that is | ||||
|       Incompatible With Secondary Licenses under the terms of this version of | ||||
|       the License, the notice described in Exhibit B of this License must be | ||||
|       attached. | ||||
| 
 | ||||
| Exhibit A - Source Code Form License Notice | ||||
| 
 | ||||
|       This Source Code Form is subject to the | ||||
|       terms of the Mozilla Public License, v. | ||||
|       2.0. If a copy of the MPL was not | ||||
|       distributed with this file, You can | ||||
|       obtain one at | ||||
|       http://mozilla.org/MPL/2.0/. | ||||
| 
 | ||||
| If it is not possible or desirable to put the notice in a particular file, | ||||
| then You may include the notice in a location (such as a LICENSE file in a | ||||
| relevant directory) where a recipient would be likely to look for such a | ||||
| notice. | ||||
| 
 | ||||
| You may add additional accurate notices of copyright ownership. | ||||
| 
 | ||||
| Exhibit B - "Incompatible With Secondary Licenses" Notice | ||||
| 
 | ||||
|       This Source Code Form is "Incompatible | ||||
|       With Secondary Licenses", as defined by | ||||
|       the Mozilla Public License, v. 2.0. | ||||
							
								
								
									
										79
									
								
								vendor/github.com/hashicorp/golang-lru/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								vendor/github.com/hashicorp/golang-lru/v2/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | ||||
| golang-lru | ||||
| ========== | ||||
| 
 | ||||
| This provides the `lru` package which implements a fixed-size | ||||
| thread safe LRU cache. It is based on the cache in Groupcache. | ||||
| 
 | ||||
| Documentation | ||||
| ============= | ||||
| 
 | ||||
| Full docs are available on [Go Packages](https://pkg.go.dev/github.com/hashicorp/golang-lru/v2) | ||||
| 
 | ||||
| LRU cache example | ||||
| ================= | ||||
| 
 | ||||
| ```go | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/hashicorp/golang-lru/v2" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	l, _ := lru.New[int, any](128) | ||||
| 	for i := 0; i < 256; i++ { | ||||
| 		l.Add(i, nil) | ||||
| 	} | ||||
| 	if l.Len() != 128 { | ||||
| 		panic(fmt.Sprintf("bad len: %v", l.Len())) | ||||
| 	} | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| Expirable LRU cache example | ||||
| =========================== | ||||
| 
 | ||||
| ```go | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/hashicorp/golang-lru/v2/expirable" | ||||
| ) | ||||
| 
 | ||||
| func main() { | ||||
| 	// make cache with 10ms TTL and 5 max keys | ||||
| 	cache := expirable.NewLRU[string, string](5, nil, time.Millisecond*10) | ||||
| 
 | ||||
| 
 | ||||
| 	// set value under key1. | ||||
| 	cache.Add("key1", "val1") | ||||
| 
 | ||||
| 	// get value under key1 | ||||
| 	r, ok := cache.Get("key1") | ||||
| 
 | ||||
| 	// check for OK value | ||||
| 	if ok { | ||||
| 		fmt.Printf("value before expiration is found: %v, value: %q\n", ok, r) | ||||
| 	} | ||||
| 
 | ||||
| 	// wait for cache to expire | ||||
| 	time.Sleep(time.Millisecond * 12) | ||||
| 
 | ||||
| 	// get value under key1 after key expiration | ||||
| 	r, ok = cache.Get("key1") | ||||
| 	fmt.Printf("value after expiration is found: %v, value: %q\n", ok, r) | ||||
| 
 | ||||
| 	// set value under key2, would evict old entry because it is already expired. | ||||
| 	cache.Add("key2", "val2") | ||||
| 
 | ||||
| 	fmt.Printf("Cache len: %d\n", cache.Len()) | ||||
| 	// Output: | ||||
| 	// value before expiration is found: true, value: "val1" | ||||
| 	// value after expiration is found: false, value: "" | ||||
| 	// Cache len: 1 | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										24
									
								
								vendor/github.com/hashicorp/golang-lru/v2/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/hashicorp/golang-lru/v2/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| // Copyright (c) HashiCorp, Inc. | ||||
| // SPDX-License-Identifier: MPL-2.0 | ||||
| 
 | ||||
| // Package lru provides three different LRU caches of varying sophistication. | ||||
| // | ||||
| // Cache is a simple LRU cache. It is based on the LRU implementation in | ||||
| // groupcache: https://github.com/golang/groupcache/tree/master/lru | ||||
| // | ||||
| // TwoQueueCache tracks frequently used and recently used entries separately. | ||||
| // This avoids a burst of accesses from taking out frequently used entries, at | ||||
| // the cost of about 2x computational overhead and some extra bookkeeping. | ||||
| // | ||||
| // ARCCache is an adaptive replacement cache. It tracks recent evictions as well | ||||
| // as recent usage in both the frequent and recent caches. Its computational | ||||
| // overhead is comparable to TwoQueueCache, but the memory overhead is linear | ||||
| // with the size of the cache. | ||||
| // | ||||
| // ARC has been patented by IBM, so do not use it if that is problematic for | ||||
| // your program. For this reason, it is in a separate go module contained within | ||||
| // this repository. | ||||
| // | ||||
| // All caches in this package take locks while operating, and are therefore | ||||
| // thread-safe for consumers. | ||||
| package lru | ||||
							
								
								
									
										142
									
								
								vendor/github.com/hashicorp/golang-lru/v2/internal/list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								vendor/github.com/hashicorp/golang-lru/v2/internal/list.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,142 @@ | ||||
| // Copyright 2009 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_list file. | ||||
| 
 | ||||
| package internal | ||||
| 
 | ||||
| import "time" | ||||
| 
 | ||||
| // Entry is an LRU Entry | ||||
| type Entry[K comparable, V any] struct { | ||||
| 	// Next and previous pointers in the doubly-linked list of elements. | ||||
| 	// To simplify the implementation, internally a list l is implemented | ||||
| 	// as a ring, such that &l.root is both the next element of the last | ||||
| 	// list element (l.Back()) and the previous element of the first list | ||||
| 	// element (l.Front()). | ||||
| 	next, prev *Entry[K, V] | ||||
| 
 | ||||
| 	// The list to which this element belongs. | ||||
| 	list *LruList[K, V] | ||||
| 
 | ||||
| 	// The LRU Key of this element. | ||||
| 	Key K | ||||
| 
 | ||||
| 	// The Value stored with this element. | ||||
| 	Value V | ||||
| 
 | ||||
| 	// The time this element would be cleaned up, optional | ||||
| 	ExpiresAt time.Time | ||||
| 
 | ||||
| 	// The expiry bucket item was put in, optional | ||||
| 	ExpireBucket uint8 | ||||
| } | ||||
| 
 | ||||
| // PrevEntry returns the previous list element or nil. | ||||
| func (e *Entry[K, V]) PrevEntry() *Entry[K, V] { | ||||
| 	if p := e.prev; e.list != nil && p != &e.list.root { | ||||
| 		return p | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // LruList represents a doubly linked list. | ||||
| // The zero Value for LruList is an empty list ready to use. | ||||
| type LruList[K comparable, V any] struct { | ||||
| 	root Entry[K, V] // sentinel list element, only &root, root.prev, and root.next are used | ||||
| 	len  int         // current list Length excluding (this) sentinel element | ||||
| } | ||||
| 
 | ||||
| // Init initializes or clears list l. | ||||
| func (l *LruList[K, V]) Init() *LruList[K, V] { | ||||
| 	l.root.next = &l.root | ||||
| 	l.root.prev = &l.root | ||||
| 	l.len = 0 | ||||
| 	return l | ||||
| } | ||||
| 
 | ||||
| // NewList returns an initialized list. | ||||
| func NewList[K comparable, V any]() *LruList[K, V] { return new(LruList[K, V]).Init() } | ||||
| 
 | ||||
| // Length returns the number of elements of list l. | ||||
| // The complexity is O(1). | ||||
| func (l *LruList[K, V]) Length() int { return l.len } | ||||
| 
 | ||||
| // Back returns the last element of list l or nil if the list is empty. | ||||
| func (l *LruList[K, V]) Back() *Entry[K, V] { | ||||
| 	if l.len == 0 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	return l.root.prev | ||||
| } | ||||
| 
 | ||||
| // lazyInit lazily initializes a zero List Value. | ||||
| func (l *LruList[K, V]) lazyInit() { | ||||
| 	if l.root.next == nil { | ||||
| 		l.Init() | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // insert inserts e after at, increments l.len, and returns e. | ||||
| func (l *LruList[K, V]) insert(e, at *Entry[K, V]) *Entry[K, V] { | ||||
| 	e.prev = at | ||||
| 	e.next = at.next | ||||
| 	e.prev.next = e | ||||
| 	e.next.prev = e | ||||
| 	e.list = l | ||||
| 	l.len++ | ||||
| 	return e | ||||
| } | ||||
| 
 | ||||
| // insertValue is a convenience wrapper for insert(&Entry{Value: v, ExpiresAt: ExpiresAt}, at). | ||||
| func (l *LruList[K, V]) insertValue(k K, v V, expiresAt time.Time, at *Entry[K, V]) *Entry[K, V] { | ||||
| 	return l.insert(&Entry[K, V]{Value: v, Key: k, ExpiresAt: expiresAt}, at) | ||||
| } | ||||
| 
 | ||||
| // Remove removes e from its list, decrements l.len | ||||
| func (l *LruList[K, V]) Remove(e *Entry[K, V]) V { | ||||
| 	e.prev.next = e.next | ||||
| 	e.next.prev = e.prev | ||||
| 	e.next = nil // avoid memory leaks | ||||
| 	e.prev = nil // avoid memory leaks | ||||
| 	e.list = nil | ||||
| 	l.len-- | ||||
| 
 | ||||
| 	return e.Value | ||||
| } | ||||
| 
 | ||||
| // move moves e to next to at. | ||||
| func (l *LruList[K, V]) move(e, at *Entry[K, V]) { | ||||
| 	if e == at { | ||||
| 		return | ||||
| 	} | ||||
| 	e.prev.next = e.next | ||||
| 	e.next.prev = e.prev | ||||
| 
 | ||||
| 	e.prev = at | ||||
| 	e.next = at.next | ||||
| 	e.prev.next = e | ||||
| 	e.next.prev = e | ||||
| } | ||||
| 
 | ||||
| // PushFront inserts a new element e with value v at the front of list l and returns e. | ||||
| func (l *LruList[K, V]) PushFront(k K, v V) *Entry[K, V] { | ||||
| 	l.lazyInit() | ||||
| 	return l.insertValue(k, v, time.Time{}, &l.root) | ||||
| } | ||||
| 
 | ||||
| // PushFrontExpirable inserts a new expirable element e with Value v at the front of list l and returns e. | ||||
| func (l *LruList[K, V]) PushFrontExpirable(k K, v V, expiresAt time.Time) *Entry[K, V] { | ||||
| 	l.lazyInit() | ||||
| 	return l.insertValue(k, v, expiresAt, &l.root) | ||||
| } | ||||
| 
 | ||||
| // MoveToFront moves element e to the front of list l. | ||||
| // If e is not an element of l, the list is not modified. | ||||
| // The element must not be nil. | ||||
| func (l *LruList[K, V]) MoveToFront(e *Entry[K, V]) { | ||||
| 	if e.list != l || l.root.next == e { | ||||
| 		return | ||||
| 	} | ||||
| 	// see comment in List.Remove about initialization of l | ||||
| 	l.move(e, &l.root) | ||||
| } | ||||
							
								
								
									
										250
									
								
								vendor/github.com/hashicorp/golang-lru/v2/lru.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								vendor/github.com/hashicorp/golang-lru/v2/lru.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,250 @@ | ||||
| // Copyright (c) HashiCorp, Inc. | ||||
| // SPDX-License-Identifier: MPL-2.0 | ||||
| 
 | ||||
| package lru | ||||
| 
 | ||||
| import ( | ||||
| 	"sync" | ||||
| 
 | ||||
| 	"github.com/hashicorp/golang-lru/v2/simplelru" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	// DefaultEvictedBufferSize defines the default buffer size to store evicted key/val | ||||
| 	DefaultEvictedBufferSize = 16 | ||||
| ) | ||||
| 
 | ||||
| // Cache is a thread-safe fixed size LRU cache. | ||||
| type Cache[K comparable, V any] struct { | ||||
| 	lru         *simplelru.LRU[K, V] | ||||
| 	evictedKeys []K | ||||
| 	evictedVals []V | ||||
| 	onEvictedCB func(k K, v V) | ||||
| 	lock        sync.RWMutex | ||||
| } | ||||
| 
 | ||||
| // New creates an LRU of the given size. | ||||
| func New[K comparable, V any](size int) (*Cache[K, V], error) { | ||||
| 	return NewWithEvict[K, V](size, nil) | ||||
| } | ||||
| 
 | ||||
| // NewWithEvict constructs a fixed size cache with the given eviction | ||||
| // callback. | ||||
| func NewWithEvict[K comparable, V any](size int, onEvicted func(key K, value V)) (c *Cache[K, V], err error) { | ||||
| 	// create a cache with default settings | ||||
| 	c = &Cache[K, V]{ | ||||
| 		onEvictedCB: onEvicted, | ||||
| 	} | ||||
| 	if onEvicted != nil { | ||||
| 		c.initEvictBuffers() | ||||
| 		onEvicted = c.onEvicted | ||||
| 	} | ||||
| 	c.lru, err = simplelru.NewLRU(size, onEvicted) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func (c *Cache[K, V]) initEvictBuffers() { | ||||
| 	c.evictedKeys = make([]K, 0, DefaultEvictedBufferSize) | ||||
| 	c.evictedVals = make([]V, 0, DefaultEvictedBufferSize) | ||||
| } | ||||
| 
 | ||||
| // onEvicted save evicted key/val and sent in externally registered callback | ||||
| // outside of critical section | ||||
| func (c *Cache[K, V]) onEvicted(k K, v V) { | ||||
| 	c.evictedKeys = append(c.evictedKeys, k) | ||||
| 	c.evictedVals = append(c.evictedVals, v) | ||||
| } | ||||
| 
 | ||||
| // Purge is used to completely clear the cache. | ||||
| func (c *Cache[K, V]) Purge() { | ||||
| 	var ks []K | ||||
| 	var vs []V | ||||
| 	c.lock.Lock() | ||||
| 	c.lru.Purge() | ||||
| 	if c.onEvictedCB != nil && len(c.evictedKeys) > 0 { | ||||
| 		ks, vs = c.evictedKeys, c.evictedVals | ||||
| 		c.initEvictBuffers() | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 	// invoke callback outside of critical section | ||||
| 	if c.onEvictedCB != nil { | ||||
| 		for i := 0; i < len(ks); i++ { | ||||
| 			c.onEvictedCB(ks[i], vs[i]) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Add adds a value to the cache. Returns true if an eviction occurred. | ||||
| func (c *Cache[K, V]) Add(key K, value V) (evicted bool) { | ||||
| 	var k K | ||||
| 	var v V | ||||
| 	c.lock.Lock() | ||||
| 	evicted = c.lru.Add(key, value) | ||||
| 	if c.onEvictedCB != nil && evicted { | ||||
| 		k, v = c.evictedKeys[0], c.evictedVals[0] | ||||
| 		c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 	if c.onEvictedCB != nil && evicted { | ||||
| 		c.onEvictedCB(k, v) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Get looks up a key's value from the cache. | ||||
| func (c *Cache[K, V]) Get(key K) (value V, ok bool) { | ||||
| 	c.lock.Lock() | ||||
| 	value, ok = c.lru.Get(key) | ||||
| 	c.lock.Unlock() | ||||
| 	return value, ok | ||||
| } | ||||
| 
 | ||||
| // Contains checks if a key is in the cache, without updating the | ||||
| // recent-ness or deleting it for being stale. | ||||
| func (c *Cache[K, V]) Contains(key K) bool { | ||||
| 	c.lock.RLock() | ||||
| 	containKey := c.lru.Contains(key) | ||||
| 	c.lock.RUnlock() | ||||
| 	return containKey | ||||
| } | ||||
| 
 | ||||
| // Peek returns the key value (or undefined if not found) without updating | ||||
| // the "recently used"-ness of the key. | ||||
| func (c *Cache[K, V]) Peek(key K) (value V, ok bool) { | ||||
| 	c.lock.RLock() | ||||
| 	value, ok = c.lru.Peek(key) | ||||
| 	c.lock.RUnlock() | ||||
| 	return value, ok | ||||
| } | ||||
| 
 | ||||
| // ContainsOrAdd checks if a key is in the cache without updating the | ||||
| // recent-ness or deleting it for being stale, and if not, adds the value. | ||||
| // Returns whether found and whether an eviction occurred. | ||||
| func (c *Cache[K, V]) ContainsOrAdd(key K, value V) (ok, evicted bool) { | ||||
| 	var k K | ||||
| 	var v V | ||||
| 	c.lock.Lock() | ||||
| 	if c.lru.Contains(key) { | ||||
| 		c.lock.Unlock() | ||||
| 		return true, false | ||||
| 	} | ||||
| 	evicted = c.lru.Add(key, value) | ||||
| 	if c.onEvictedCB != nil && evicted { | ||||
| 		k, v = c.evictedKeys[0], c.evictedVals[0] | ||||
| 		c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 	if c.onEvictedCB != nil && evicted { | ||||
| 		c.onEvictedCB(k, v) | ||||
| 	} | ||||
| 	return false, evicted | ||||
| } | ||||
| 
 | ||||
| // PeekOrAdd checks if a key is in the cache without updating the | ||||
| // recent-ness or deleting it for being stale, and if not, adds the value. | ||||
| // Returns whether found and whether an eviction occurred. | ||||
| func (c *Cache[K, V]) PeekOrAdd(key K, value V) (previous V, ok, evicted bool) { | ||||
| 	var k K | ||||
| 	var v V | ||||
| 	c.lock.Lock() | ||||
| 	previous, ok = c.lru.Peek(key) | ||||
| 	if ok { | ||||
| 		c.lock.Unlock() | ||||
| 		return previous, true, false | ||||
| 	} | ||||
| 	evicted = c.lru.Add(key, value) | ||||
| 	if c.onEvictedCB != nil && evicted { | ||||
| 		k, v = c.evictedKeys[0], c.evictedVals[0] | ||||
| 		c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 	if c.onEvictedCB != nil && evicted { | ||||
| 		c.onEvictedCB(k, v) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Remove removes the provided key from the cache. | ||||
| func (c *Cache[K, V]) Remove(key K) (present bool) { | ||||
| 	var k K | ||||
| 	var v V | ||||
| 	c.lock.Lock() | ||||
| 	present = c.lru.Remove(key) | ||||
| 	if c.onEvictedCB != nil && present { | ||||
| 		k, v = c.evictedKeys[0], c.evictedVals[0] | ||||
| 		c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 	if c.onEvictedCB != nil && present { | ||||
| 		c.onEvictedCB(k, v) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Resize changes the cache size. | ||||
| func (c *Cache[K, V]) Resize(size int) (evicted int) { | ||||
| 	var ks []K | ||||
| 	var vs []V | ||||
| 	c.lock.Lock() | ||||
| 	evicted = c.lru.Resize(size) | ||||
| 	if c.onEvictedCB != nil && evicted > 0 { | ||||
| 		ks, vs = c.evictedKeys, c.evictedVals | ||||
| 		c.initEvictBuffers() | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 	if c.onEvictedCB != nil && evicted > 0 { | ||||
| 		for i := 0; i < len(ks); i++ { | ||||
| 			c.onEvictedCB(ks[i], vs[i]) | ||||
| 		} | ||||
| 	} | ||||
| 	return evicted | ||||
| } | ||||
| 
 | ||||
| // RemoveOldest removes the oldest item from the cache. | ||||
| func (c *Cache[K, V]) RemoveOldest() (key K, value V, ok bool) { | ||||
| 	var k K | ||||
| 	var v V | ||||
| 	c.lock.Lock() | ||||
| 	key, value, ok = c.lru.RemoveOldest() | ||||
| 	if c.onEvictedCB != nil && ok { | ||||
| 		k, v = c.evictedKeys[0], c.evictedVals[0] | ||||
| 		c.evictedKeys, c.evictedVals = c.evictedKeys[:0], c.evictedVals[:0] | ||||
| 	} | ||||
| 	c.lock.Unlock() | ||||
| 	if c.onEvictedCB != nil && ok { | ||||
| 		c.onEvictedCB(k, v) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // GetOldest returns the oldest entry | ||||
| func (c *Cache[K, V]) GetOldest() (key K, value V, ok bool) { | ||||
| 	c.lock.RLock() | ||||
| 	key, value, ok = c.lru.GetOldest() | ||||
| 	c.lock.RUnlock() | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Keys returns a slice of the keys in the cache, from oldest to newest. | ||||
| func (c *Cache[K, V]) Keys() []K { | ||||
| 	c.lock.RLock() | ||||
| 	keys := c.lru.Keys() | ||||
| 	c.lock.RUnlock() | ||||
| 	return keys | ||||
| } | ||||
| 
 | ||||
| // Values returns a slice of the values in the cache, from oldest to newest. | ||||
| func (c *Cache[K, V]) Values() []V { | ||||
| 	c.lock.RLock() | ||||
| 	values := c.lru.Values() | ||||
| 	c.lock.RUnlock() | ||||
| 	return values | ||||
| } | ||||
| 
 | ||||
| // Len returns the number of items in the cache. | ||||
| func (c *Cache[K, V]) Len() int { | ||||
| 	c.lock.RLock() | ||||
| 	length := c.lru.Len() | ||||
| 	c.lock.RUnlock() | ||||
| 	return length | ||||
| } | ||||
| @ -1,4 +1,6 @@ | ||||
| Copyright (c) 2017 The CC Authors. All rights reserved. | ||||
| This license applies to simplelru/list.go | ||||
| 
 | ||||
| Copyright (c) 2009 The Go Authors. All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are | ||||
| @ -10,7 +12,7 @@ notice, this list of conditions and the following disclaimer. | ||||
| copyright notice, this list of conditions and the following disclaimer | ||||
| in the documentation and/or other materials provided with the | ||||
| distribution. | ||||
|    * Neither the names of the authors nor the names of the | ||||
|    * Neither the name of Google Inc. nor the names of its | ||||
| contributors may be used to endorse or promote products derived from | ||||
| this software without specific prior written permission. | ||||
| 
 | ||||
							
								
								
									
										177
									
								
								vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,177 @@ | ||||
| // Copyright (c) HashiCorp, Inc. | ||||
| // SPDX-License-Identifier: MPL-2.0 | ||||
| 
 | ||||
| package simplelru | ||||
| 
 | ||||
| import ( | ||||
| 	"errors" | ||||
| 
 | ||||
| 	"github.com/hashicorp/golang-lru/v2/internal" | ||||
| ) | ||||
| 
 | ||||
| // EvictCallback is used to get a callback when a cache entry is evicted | ||||
| type EvictCallback[K comparable, V any] func(key K, value V) | ||||
| 
 | ||||
| // LRU implements a non-thread safe fixed size LRU cache | ||||
| type LRU[K comparable, V any] struct { | ||||
| 	size      int | ||||
| 	evictList *internal.LruList[K, V] | ||||
| 	items     map[K]*internal.Entry[K, V] | ||||
| 	onEvict   EvictCallback[K, V] | ||||
| } | ||||
| 
 | ||||
| // NewLRU constructs an LRU of the given size | ||||
| func NewLRU[K comparable, V any](size int, onEvict EvictCallback[K, V]) (*LRU[K, V], error) { | ||||
| 	if size <= 0 { | ||||
| 		return nil, errors.New("must provide a positive size") | ||||
| 	} | ||||
| 
 | ||||
| 	c := &LRU[K, V]{ | ||||
| 		size:      size, | ||||
| 		evictList: internal.NewList[K, V](), | ||||
| 		items:     make(map[K]*internal.Entry[K, V]), | ||||
| 		onEvict:   onEvict, | ||||
| 	} | ||||
| 	return c, nil | ||||
| } | ||||
| 
 | ||||
| // Purge is used to completely clear the cache. | ||||
| func (c *LRU[K, V]) Purge() { | ||||
| 	for k, v := range c.items { | ||||
| 		if c.onEvict != nil { | ||||
| 			c.onEvict(k, v.Value) | ||||
| 		} | ||||
| 		delete(c.items, k) | ||||
| 	} | ||||
| 	c.evictList.Init() | ||||
| } | ||||
| 
 | ||||
| // Add adds a value to the cache.  Returns true if an eviction occurred. | ||||
| func (c *LRU[K, V]) Add(key K, value V) (evicted bool) { | ||||
| 	// Check for existing item | ||||
| 	if ent, ok := c.items[key]; ok { | ||||
| 		c.evictList.MoveToFront(ent) | ||||
| 		ent.Value = value | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	// Add new item | ||||
| 	ent := c.evictList.PushFront(key, value) | ||||
| 	c.items[key] = ent | ||||
| 
 | ||||
| 	evict := c.evictList.Length() > c.size | ||||
| 	// Verify size not exceeded | ||||
| 	if evict { | ||||
| 		c.removeOldest() | ||||
| 	} | ||||
| 	return evict | ||||
| } | ||||
| 
 | ||||
| // Get looks up a key's value from the cache. | ||||
| func (c *LRU[K, V]) Get(key K) (value V, ok bool) { | ||||
| 	if ent, ok := c.items[key]; ok { | ||||
| 		c.evictList.MoveToFront(ent) | ||||
| 		return ent.Value, true | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Contains checks if a key is in the cache, without updating the recent-ness | ||||
| // or deleting it for being stale. | ||||
| func (c *LRU[K, V]) Contains(key K) (ok bool) { | ||||
| 	_, ok = c.items[key] | ||||
| 	return ok | ||||
| } | ||||
| 
 | ||||
| // Peek returns the key value (or undefined if not found) without updating | ||||
| // the "recently used"-ness of the key. | ||||
| func (c *LRU[K, V]) Peek(key K) (value V, ok bool) { | ||||
| 	var ent *internal.Entry[K, V] | ||||
| 	if ent, ok = c.items[key]; ok { | ||||
| 		return ent.Value, true | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Remove removes the provided key from the cache, returning if the | ||||
| // key was contained. | ||||
| func (c *LRU[K, V]) Remove(key K) (present bool) { | ||||
| 	if ent, ok := c.items[key]; ok { | ||||
| 		c.removeElement(ent) | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // RemoveOldest removes the oldest item from the cache. | ||||
| func (c *LRU[K, V]) RemoveOldest() (key K, value V, ok bool) { | ||||
| 	if ent := c.evictList.Back(); ent != nil { | ||||
| 		c.removeElement(ent) | ||||
| 		return ent.Key, ent.Value, true | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // GetOldest returns the oldest entry | ||||
| func (c *LRU[K, V]) GetOldest() (key K, value V, ok bool) { | ||||
| 	if ent := c.evictList.Back(); ent != nil { | ||||
| 		return ent.Key, ent.Value, true | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Keys returns a slice of the keys in the cache, from oldest to newest. | ||||
| func (c *LRU[K, V]) Keys() []K { | ||||
| 	keys := make([]K, c.evictList.Length()) | ||||
| 	i := 0 | ||||
| 	for ent := c.evictList.Back(); ent != nil; ent = ent.PrevEntry() { | ||||
| 		keys[i] = ent.Key | ||||
| 		i++ | ||||
| 	} | ||||
| 	return keys | ||||
| } | ||||
| 
 | ||||
| // Values returns a slice of the values in the cache, from oldest to newest. | ||||
| func (c *LRU[K, V]) Values() []V { | ||||
| 	values := make([]V, len(c.items)) | ||||
| 	i := 0 | ||||
| 	for ent := c.evictList.Back(); ent != nil; ent = ent.PrevEntry() { | ||||
| 		values[i] = ent.Value | ||||
| 		i++ | ||||
| 	} | ||||
| 	return values | ||||
| } | ||||
| 
 | ||||
| // Len returns the number of items in the cache. | ||||
| func (c *LRU[K, V]) Len() int { | ||||
| 	return c.evictList.Length() | ||||
| } | ||||
| 
 | ||||
| // Resize changes the cache size. | ||||
| func (c *LRU[K, V]) Resize(size int) (evicted int) { | ||||
| 	diff := c.Len() - size | ||||
| 	if diff < 0 { | ||||
| 		diff = 0 | ||||
| 	} | ||||
| 	for i := 0; i < diff; i++ { | ||||
| 		c.removeOldest() | ||||
| 	} | ||||
| 	c.size = size | ||||
| 	return diff | ||||
| } | ||||
| 
 | ||||
| // removeOldest removes the oldest item from the cache. | ||||
| func (c *LRU[K, V]) removeOldest() { | ||||
| 	if ent := c.evictList.Back(); ent != nil { | ||||
| 		c.removeElement(ent) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // removeElement is used to remove a given list element from the cache | ||||
| func (c *LRU[K, V]) removeElement(e *internal.Entry[K, V]) { | ||||
| 	c.evictList.Remove(e) | ||||
| 	delete(c.items, e.Key) | ||||
| 	if c.onEvict != nil { | ||||
| 		c.onEvict(e.Key, e.Value) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										46
									
								
								vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru_interface.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/hashicorp/golang-lru/v2/simplelru/lru_interface.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| // Copyright (c) HashiCorp, Inc. | ||||
| // SPDX-License-Identifier: MPL-2.0 | ||||
| 
 | ||||
| // Package simplelru provides simple LRU implementation based on build-in container/list. | ||||
| package simplelru | ||||
| 
 | ||||
| // LRUCache is the interface for simple LRU cache. | ||||
| type LRUCache[K comparable, V any] interface { | ||||
| 	// Adds a value to the cache, returns true if an eviction occurred and | ||||
| 	// updates the "recently used"-ness of the key. | ||||
| 	Add(key K, value V) bool | ||||
| 
 | ||||
| 	// Returns key's value from the cache and | ||||
| 	// updates the "recently used"-ness of the key. #value, isFound | ||||
| 	Get(key K) (value V, ok bool) | ||||
| 
 | ||||
| 	// Checks if a key exists in cache without updating the recent-ness. | ||||
| 	Contains(key K) (ok bool) | ||||
| 
 | ||||
| 	// Returns key's value without updating the "recently used"-ness of the key. | ||||
| 	Peek(key K) (value V, ok bool) | ||||
| 
 | ||||
| 	// Removes a key from the cache. | ||||
| 	Remove(key K) bool | ||||
| 
 | ||||
| 	// Removes the oldest entry from cache. | ||||
| 	RemoveOldest() (K, V, bool) | ||||
| 
 | ||||
| 	// Returns the oldest entry from the cache. #key, value, isFound | ||||
| 	GetOldest() (K, V, bool) | ||||
| 
 | ||||
| 	// Returns a slice of the keys in the cache, from oldest to newest. | ||||
| 	Keys() []K | ||||
| 
 | ||||
| 	// Values returns a slice of the values in the cache, from oldest to newest. | ||||
| 	Values() []V | ||||
| 
 | ||||
| 	// Returns the number of items in the cache. | ||||
| 	Len() int | ||||
| 
 | ||||
| 	// Clears all cache entries. | ||||
| 	Purge() | ||||
| 
 | ||||
| 	// Resizes cache, returning number evicted | ||||
| 	Resize(int) int | ||||
| } | ||||
							
								
								
									
										19
									
								
								vendor/github.com/kballard/go-shellquote/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/kballard/go-shellquote/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,19 +0,0 @@ | ||||
| Copyright (C) 2014 Kevin Ballard | ||||
| 
 | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of this software and associated documentation files (the "Software"), | ||||
| to deal in the Software without restriction, including without limitation | ||||
| the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
| and/or sell copies of the Software, and to permit persons to whom the | ||||
| Software is furnished to do so, subject to the following conditions: | ||||
| 
 | ||||
| The above copyright notice and this permission notice shall be included | ||||
| in all copies or substantial portions of the Software. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||||
| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||||
| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | ||||
| DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||||
| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | ||||
| OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
							
								
								
									
										36
									
								
								vendor/github.com/kballard/go-shellquote/README
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								vendor/github.com/kballard/go-shellquote/README
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,36 +0,0 @@ | ||||
| PACKAGE | ||||
| 
 | ||||
| package shellquote | ||||
|     import "github.com/kballard/go-shellquote" | ||||
| 
 | ||||
|     Shellquote provides utilities for joining/splitting strings using sh's | ||||
|     word-splitting rules. | ||||
| 
 | ||||
| VARIABLES | ||||
| 
 | ||||
| var ( | ||||
|     UnterminatedSingleQuoteError = errors.New("Unterminated single-quoted string") | ||||
|     UnterminatedDoubleQuoteError = errors.New("Unterminated double-quoted string") | ||||
|     UnterminatedEscapeError      = errors.New("Unterminated backslash-escape") | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| FUNCTIONS | ||||
| 
 | ||||
| func Join(args ...string) string | ||||
|     Join quotes each argument and joins them with a space. If passed to | ||||
|     /bin/sh, the resulting string will be split back into the original | ||||
|     arguments. | ||||
| 
 | ||||
| func Split(input string) (words []string, err error) | ||||
|     Split splits a string according to /bin/sh's word-splitting rules. It | ||||
|     supports backslash-escapes, single-quotes, and double-quotes. Notably it | ||||
|     does not support the $'' style of quoting. It also doesn't attempt to | ||||
|     perform any other sort of expansion, including brace expansion, shell | ||||
|     expansion, or pathname expansion. | ||||
| 
 | ||||
|     If the given input has an unterminated quoted string or ends in a | ||||
|     backslash-escape, one of UnterminatedSingleQuoteError, | ||||
|     UnterminatedDoubleQuoteError, or UnterminatedEscapeError is returned. | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										3
									
								
								vendor/github.com/kballard/go-shellquote/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/kballard/go-shellquote/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | ||||
| // Shellquote provides utilities for joining/splitting strings using sh's | ||||
| // word-splitting rules. | ||||
| package shellquote | ||||
							
								
								
									
										102
									
								
								vendor/github.com/kballard/go-shellquote/quote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										102
									
								
								vendor/github.com/kballard/go-shellquote/quote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,102 +0,0 @@ | ||||
| package shellquote | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
| ) | ||||
| 
 | ||||
| // Join quotes each argument and joins them with a space. | ||||
| // If passed to /bin/sh, the resulting string will be split back into the | ||||
| // original arguments. | ||||
| func Join(args ...string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	for i, arg := range args { | ||||
| 		if i != 0 { | ||||
| 			buf.WriteByte(' ') | ||||
| 		} | ||||
| 		quote(arg, &buf) | ||||
| 	} | ||||
| 	return buf.String() | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	specialChars      = "\\'\"`${[|&;<>()*?!" | ||||
| 	extraSpecialChars = " \t\n" | ||||
| 	prefixChars       = "~" | ||||
| ) | ||||
| 
 | ||||
| func quote(word string, buf *bytes.Buffer) { | ||||
| 	// We want to try to produce a "nice" output. As such, we will | ||||
| 	// backslash-escape most characters, but if we encounter a space, or if we | ||||
| 	// encounter an extra-special char (which doesn't work with | ||||
| 	// backslash-escaping) we switch over to quoting the whole word. We do this | ||||
| 	// with a space because it's typically easier for people to read multi-word | ||||
| 	// arguments when quoted with a space rather than with ugly backslashes | ||||
| 	// everywhere. | ||||
| 	origLen := buf.Len() | ||||
| 
 | ||||
| 	if len(word) == 0 { | ||||
| 		// oops, no content | ||||
| 		buf.WriteString("''") | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	cur, prev := word, word | ||||
| 	atStart := true | ||||
| 	for len(cur) > 0 { | ||||
| 		c, l := utf8.DecodeRuneInString(cur) | ||||
| 		cur = cur[l:] | ||||
| 		if strings.ContainsRune(specialChars, c) || (atStart && strings.ContainsRune(prefixChars, c)) { | ||||
| 			// copy the non-special chars up to this point | ||||
| 			if len(cur) < len(prev) { | ||||
| 				buf.WriteString(prev[0 : len(prev)-len(cur)-l]) | ||||
| 			} | ||||
| 			buf.WriteByte('\\') | ||||
| 			buf.WriteRune(c) | ||||
| 			prev = cur | ||||
| 		} else if strings.ContainsRune(extraSpecialChars, c) { | ||||
| 			// start over in quote mode | ||||
| 			buf.Truncate(origLen) | ||||
| 			goto quote | ||||
| 		} | ||||
| 		atStart = false | ||||
| 	} | ||||
| 	if len(prev) > 0 { | ||||
| 		buf.WriteString(prev) | ||||
| 	} | ||||
| 	return | ||||
| 
 | ||||
| quote: | ||||
| 	// quote mode | ||||
| 	// Use single-quotes, but if we find a single-quote in the word, we need | ||||
| 	// to terminate the string, emit an escaped quote, and start the string up | ||||
| 	// again | ||||
| 	inQuote := false | ||||
| 	for len(word) > 0 { | ||||
| 		i := strings.IndexRune(word, '\'') | ||||
| 		if i == -1 { | ||||
| 			break | ||||
| 		} | ||||
| 		if i > 0 { | ||||
| 			if !inQuote { | ||||
| 				buf.WriteByte('\'') | ||||
| 				inQuote = true | ||||
| 			} | ||||
| 			buf.WriteString(word[0:i]) | ||||
| 		} | ||||
| 		word = word[i+1:] | ||||
| 		if inQuote { | ||||
| 			buf.WriteByte('\'') | ||||
| 			inQuote = false | ||||
| 		} | ||||
| 		buf.WriteString("\\'") | ||||
| 	} | ||||
| 	if len(word) > 0 { | ||||
| 		if !inQuote { | ||||
| 			buf.WriteByte('\'') | ||||
| 		} | ||||
| 		buf.WriteString(word) | ||||
| 		buf.WriteByte('\'') | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										156
									
								
								vendor/github.com/kballard/go-shellquote/unquote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										156
									
								
								vendor/github.com/kballard/go-shellquote/unquote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,156 +0,0 @@ | ||||
| package shellquote | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	UnterminatedSingleQuoteError = errors.New("Unterminated single-quoted string") | ||||
| 	UnterminatedDoubleQuoteError = errors.New("Unterminated double-quoted string") | ||||
| 	UnterminatedEscapeError      = errors.New("Unterminated backslash-escape") | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	splitChars        = " \n\t" | ||||
| 	singleChar        = '\'' | ||||
| 	doubleChar        = '"' | ||||
| 	escapeChar        = '\\' | ||||
| 	doubleEscapeChars = "$`\"\n\\" | ||||
| ) | ||||
| 
 | ||||
| // Split splits a string according to /bin/sh's word-splitting rules. It | ||||
| // supports backslash-escapes, single-quotes, and double-quotes. Notably it does | ||||
| // not support the $'' style of quoting. It also doesn't attempt to perform any | ||||
| // other sort of expansion, including brace expansion, shell expansion, or | ||||
| // pathname expansion. | ||||
| // | ||||
| // If the given input has an unterminated quoted string or ends in a | ||||
| // backslash-escape, one of UnterminatedSingleQuoteError, | ||||
| // UnterminatedDoubleQuoteError, or UnterminatedEscapeError is returned. | ||||
| func Split(input string) (words []string, err error) { | ||||
| 	var buf bytes.Buffer | ||||
| 	words = make([]string, 0) | ||||
| 
 | ||||
| 	for len(input) > 0 { | ||||
| 		// skip any splitChars at the start | ||||
| 		c, l := utf8.DecodeRuneInString(input) | ||||
| 		if strings.ContainsRune(splitChars, c) { | ||||
| 			input = input[l:] | ||||
| 			continue | ||||
| 		} else if c == escapeChar { | ||||
| 			// Look ahead for escaped newline so we can skip over it | ||||
| 			next := input[l:] | ||||
| 			if len(next) == 0 { | ||||
| 				err = UnterminatedEscapeError | ||||
| 				return | ||||
| 			} | ||||
| 			c2, l2 := utf8.DecodeRuneInString(next) | ||||
| 			if c2 == '\n' { | ||||
| 				input = next[l2:] | ||||
| 				continue | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		var word string | ||||
| 		word, input, err = splitWord(input, &buf) | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		words = append(words, word) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| func splitWord(input string, buf *bytes.Buffer) (word string, remainder string, err error) { | ||||
| 	buf.Reset() | ||||
| 
 | ||||
| raw: | ||||
| 	{ | ||||
| 		cur := input | ||||
| 		for len(cur) > 0 { | ||||
| 			c, l := utf8.DecodeRuneInString(cur) | ||||
| 			cur = cur[l:] | ||||
| 			if c == singleChar { | ||||
| 				buf.WriteString(input[0 : len(input)-len(cur)-l]) | ||||
| 				input = cur | ||||
| 				goto single | ||||
| 			} else if c == doubleChar { | ||||
| 				buf.WriteString(input[0 : len(input)-len(cur)-l]) | ||||
| 				input = cur | ||||
| 				goto double | ||||
| 			} else if c == escapeChar { | ||||
| 				buf.WriteString(input[0 : len(input)-len(cur)-l]) | ||||
| 				input = cur | ||||
| 				goto escape | ||||
| 			} else if strings.ContainsRune(splitChars, c) { | ||||
| 				buf.WriteString(input[0 : len(input)-len(cur)-l]) | ||||
| 				return buf.String(), cur, nil | ||||
| 			} | ||||
| 		} | ||||
| 		if len(input) > 0 { | ||||
| 			buf.WriteString(input) | ||||
| 			input = "" | ||||
| 		} | ||||
| 		goto done | ||||
| 	} | ||||
| 
 | ||||
| escape: | ||||
| 	{ | ||||
| 		if len(input) == 0 { | ||||
| 			return "", "", UnterminatedEscapeError | ||||
| 		} | ||||
| 		c, l := utf8.DecodeRuneInString(input) | ||||
| 		if c == '\n' { | ||||
| 			// a backslash-escaped newline is elided from the output entirely | ||||
| 		} else { | ||||
| 			buf.WriteString(input[:l]) | ||||
| 		} | ||||
| 		input = input[l:] | ||||
| 	} | ||||
| 	goto raw | ||||
| 
 | ||||
| single: | ||||
| 	{ | ||||
| 		i := strings.IndexRune(input, singleChar) | ||||
| 		if i == -1 { | ||||
| 			return "", "", UnterminatedSingleQuoteError | ||||
| 		} | ||||
| 		buf.WriteString(input[0:i]) | ||||
| 		input = input[i+1:] | ||||
| 		goto raw | ||||
| 	} | ||||
| 
 | ||||
| double: | ||||
| 	{ | ||||
| 		cur := input | ||||
| 		for len(cur) > 0 { | ||||
| 			c, l := utf8.DecodeRuneInString(cur) | ||||
| 			cur = cur[l:] | ||||
| 			if c == doubleChar { | ||||
| 				buf.WriteString(input[0 : len(input)-len(cur)-l]) | ||||
| 				input = cur | ||||
| 				goto raw | ||||
| 			} else if c == escapeChar { | ||||
| 				// bash only supports certain escapes in double-quoted strings | ||||
| 				c2, l2 := utf8.DecodeRuneInString(cur) | ||||
| 				cur = cur[l2:] | ||||
| 				if strings.ContainsRune(doubleEscapeChars, c2) { | ||||
| 					buf.WriteString(input[0 : len(input)-len(cur)-l-l2]) | ||||
| 					if c2 == '\n' { | ||||
| 						// newline is special, skip the backslash entirely | ||||
| 					} else { | ||||
| 						buf.WriteRune(c2) | ||||
| 					} | ||||
| 					input = cur | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		return "", "", UnterminatedDoubleQuoteError | ||||
| 	} | ||||
| 
 | ||||
| done: | ||||
| 	return buf.String(), input, nil | ||||
| } | ||||
							
								
								
									
										20
									
								
								vendor/github.com/klauspost/compress/.goreleaser.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/github.com/klauspost/compress/.goreleaser.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -3,7 +3,7 @@ | ||||
| before: | ||||
|   hooks: | ||||
|     - ./gen.sh | ||||
|     - go install mvdan.cc/garble@v0.9.3 | ||||
|     - go install mvdan.cc/garble@v0.10.1 | ||||
| 
 | ||||
| builds: | ||||
|   - | ||||
| @ -92,16 +92,7 @@ builds: | ||||
| archives: | ||||
|   - | ||||
|     id: s2-binaries | ||||
|     name_template: "s2-{{ .Os }}_{{ .Arch }}_{{ .Version }}" | ||||
|     replacements: | ||||
|       aix: AIX | ||||
|       darwin: OSX | ||||
|       linux: Linux | ||||
|       windows: Windows | ||||
|       386: i386 | ||||
|       amd64: x86_64 | ||||
|       freebsd: FreeBSD | ||||
|       netbsd: NetBSD | ||||
|     name_template: "s2-{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" | ||||
|     format_overrides: | ||||
|       - goos: windows | ||||
|         format: zip | ||||
| @ -125,7 +116,7 @@ changelog: | ||||
| 
 | ||||
| nfpms: | ||||
|   - | ||||
|     file_name_template: "s2_package_{{ .Version }}_{{ .Os }}_{{ .Arch }}" | ||||
|     file_name_template: "s2_package__{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" | ||||
|     vendor: Klaus Post | ||||
|     homepage: https://github.com/klauspost/compress | ||||
|     maintainer: Klaus Post <klauspost@gmail.com> | ||||
| @ -134,8 +125,3 @@ nfpms: | ||||
|     formats: | ||||
|       - deb | ||||
|       - rpm | ||||
|     replacements: | ||||
|       darwin: Darwin | ||||
|       linux: Linux | ||||
|       freebsd: FreeBSD | ||||
|       amd64: x86_64 | ||||
|  | ||||
							
								
								
									
										46
									
								
								vendor/github.com/klauspost/compress/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/klauspost/compress/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -16,6 +16,47 @@ This package provides various compression algorithms. | ||||
| 
 | ||||
| # changelog | ||||
| 
 | ||||
| * July 1st, 2023 - [v1.16.7](https://github.com/klauspost/compress/releases/tag/v1.16.7) | ||||
| 	* zstd: Fix default level first dictionary encode https://github.com/klauspost/compress/pull/829 | ||||
| 	* s2: add GetBufferCapacity() method by @GiedriusS in https://github.com/klauspost/compress/pull/832 | ||||
| 
 | ||||
| * June 13, 2023 - [v1.16.6](https://github.com/klauspost/compress/releases/tag/v1.16.6) | ||||
| 	* zstd: correctly ignore WithEncoderPadding(1) by @ianlancetaylor in https://github.com/klauspost/compress/pull/806 | ||||
| 	* zstd: Add amd64 match length assembly https://github.com/klauspost/compress/pull/824 | ||||
| 	* gzhttp: Handle informational headers by @rtribotte in https://github.com/klauspost/compress/pull/815 | ||||
| 	* s2: Improve Better compression slightly https://github.com/klauspost/compress/pull/663 | ||||
| 
 | ||||
| * Apr 16, 2023 - [v1.16.5](https://github.com/klauspost/compress/releases/tag/v1.16.5) | ||||
| 	* zstd: readByte needs to use io.ReadFull by @jnoxon in https://github.com/klauspost/compress/pull/802 | ||||
| 	* gzip: Fix WriterTo after initial read https://github.com/klauspost/compress/pull/804 | ||||
| 
 | ||||
| * Apr 5, 2023 - [v1.16.4](https://github.com/klauspost/compress/releases/tag/v1.16.4) | ||||
| 	* zstd: Improve zstd best efficiency by @greatroar and @klauspost in https://github.com/klauspost/compress/pull/784 | ||||
| 	* zstd: Respect WithAllLitEntropyCompression https://github.com/klauspost/compress/pull/792 | ||||
| 	* zstd: Fix amd64 not always detecting corrupt data https://github.com/klauspost/compress/pull/785 | ||||
| 	* zstd: Various minor improvements by @greatroar in https://github.com/klauspost/compress/pull/788 https://github.com/klauspost/compress/pull/794 https://github.com/klauspost/compress/pull/795 | ||||
| 	* s2: Fix huge block overflow https://github.com/klauspost/compress/pull/779 | ||||
| 	* s2: Allow CustomEncoder fallback https://github.com/klauspost/compress/pull/780 | ||||
| 	* gzhttp: Suppport ResponseWriter Unwrap() in gzhttp handler by @jgimenez in https://github.com/klauspost/compress/pull/799 | ||||
| 
 | ||||
| * Mar 13, 2023 - [v1.16.1](https://github.com/klauspost/compress/releases/tag/v1.16.1) | ||||
| 	* zstd: Speed up + improve best encoder by @greatroar in https://github.com/klauspost/compress/pull/776 | ||||
| 	* gzhttp: Add optional [BREACH mitigation](https://github.com/klauspost/compress/tree/master/gzhttp#breach-mitigation). https://github.com/klauspost/compress/pull/762 https://github.com/klauspost/compress/pull/768 https://github.com/klauspost/compress/pull/769 https://github.com/klauspost/compress/pull/770 https://github.com/klauspost/compress/pull/767 | ||||
| 	* s2: Add Intel LZ4s converter https://github.com/klauspost/compress/pull/766 | ||||
| 	* zstd: Minor bug fixes https://github.com/klauspost/compress/pull/771 https://github.com/klauspost/compress/pull/772 https://github.com/klauspost/compress/pull/773 | ||||
| 	* huff0: Speed up compress1xDo by @greatroar in https://github.com/klauspost/compress/pull/774 | ||||
| 
 | ||||
| * Feb 26, 2023 - [v1.16.0](https://github.com/klauspost/compress/releases/tag/v1.16.0) | ||||
| 	* s2: Add [Dictionary](https://github.com/klauspost/compress/tree/master/s2#dictionaries) support.  https://github.com/klauspost/compress/pull/685 | ||||
| 	* s2: Add Compression Size Estimate.  https://github.com/klauspost/compress/pull/752 | ||||
| 	* s2: Add support for custom stream encoder. https://github.com/klauspost/compress/pull/755 | ||||
| 	* s2: Add LZ4 block converter. https://github.com/klauspost/compress/pull/748 | ||||
| 	* s2: Support io.ReaderAt in ReadSeeker. https://github.com/klauspost/compress/pull/747 | ||||
| 	* s2c/s2sx: Use concurrent decoding. https://github.com/klauspost/compress/pull/746 | ||||
| 
 | ||||
| <details> | ||||
| 	<summary>See changes to v1.15.x</summary> | ||||
| 	 | ||||
| * Jan 21st, 2023 (v1.15.15) | ||||
| 	* deflate: Improve level 7-9 by @klauspost in https://github.com/klauspost/compress/pull/739 | ||||
| 	* zstd: Add delta encoding support by @greatroar in https://github.com/klauspost/compress/pull/728 | ||||
| @ -142,6 +183,8 @@ Stream decompression is now faster on asynchronous, since the goroutine allocati | ||||
| 
 | ||||
| While the release has been extensively tested, it is recommended to testing when upgrading. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
| 	<summary>See changes to v1.14.x</summary> | ||||
| 	 | ||||
| @ -600,6 +643,9 @@ Here are other packages of good quality and pure Go (no cgo wrappers or autoconv | ||||
| * [github.com/pierrec/lz4](https://github.com/pierrec/lz4) - strong multithreaded LZ4 compression. | ||||
| * [github.com/cosnicolaou/pbzip2](https://github.com/cosnicolaou/pbzip2) - multithreaded bzip2 decompression. | ||||
| * [github.com/dsnet/compress](https://github.com/dsnet/compress) - brotli decompression, bzip2 writer. | ||||
| * [github.com/ronanh/intcomp](https://github.com/ronanh/intcomp) - Integer compression. | ||||
| * [github.com/spenczar/fpc](https://github.com/spenczar/fpc) - Float compression. | ||||
| * [github.com/minio/zipindex](https://github.com/minio/zipindex) - External ZIP directory index. | ||||
| 
 | ||||
| # license | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										25
									
								
								vendor/github.com/klauspost/compress/SECURITY.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/klauspost/compress/SECURITY.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| # Security Policy | ||||
| 
 | ||||
| ## Supported Versions | ||||
| 
 | ||||
| Security updates are applied only to the latest release. | ||||
| 
 | ||||
| ## Vulnerability Definition | ||||
| 
 | ||||
| A security vulnerability is a bug that with certain input triggers a crash or an infinite loop. Most calls will have varying execution time and only in rare cases will slow operation be considered a security vulnerability. | ||||
| 
 | ||||
| Corrupted output generally is not considered a security vulnerability, unless independent operations are able to affect each other. Note that not all functionality is re-entrant and safe to use concurrently. | ||||
| 
 | ||||
| Out-of-memory crashes only applies if the en/decoder uses an abnormal amount of memory, with appropriate options applied, to limit maximum window size, concurrency, etc. However, if you are in doubt you are welcome to file a security issue. | ||||
| 
 | ||||
| It is assumed that all callers are trusted, meaning internal data exposed through reflection or inspection of returned data structures is not considered a vulnerability. | ||||
| 
 | ||||
| Vulnerabilities resulting from compiler/assembler errors should be reported upstream. Depending on the severity this package may or may not implement a workaround. | ||||
| 
 | ||||
| ## Reporting a Vulnerability | ||||
| 
 | ||||
| If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. | ||||
| 
 | ||||
| Please disclose it at [security advisory](https://github.com/klauspost/compress/security/advisories/new). If possible please provide a minimal reproducer. If the issue only applies to a single platform, it would be helpful to provide access to that. | ||||
| 
 | ||||
| This project is maintained by a team of volunteers on a reasonable-effort basis. As such, vulnerabilities will be disclosed in a best effort base. | ||||
							
								
								
									
										3
									
								
								vendor/github.com/klauspost/compress/fse/bitwriter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/klauspost/compress/fse/bitwriter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -152,12 +152,11 @@ func (b *bitWriter) flushAlign() { | ||||
| 
 | ||||
| // close will write the alignment bit and write the final byte(s) | ||||
| // to the output. | ||||
| func (b *bitWriter) close() error { | ||||
| func (b *bitWriter) close() { | ||||
| 	// End mark | ||||
| 	b.addBits16Clean(1, 1) | ||||
| 	// flush until next byte. | ||||
| 	b.flushAlign() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // reset and continue writing by appending to out. | ||||
|  | ||||
							
								
								
									
										3
									
								
								vendor/github.com/klauspost/compress/fse/compress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/klauspost/compress/fse/compress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -199,7 +199,8 @@ func (s *Scratch) compress(src []byte) error { | ||||
| 	c2.flush(s.actualTableLog) | ||||
| 	c1.flush(s.actualTableLog) | ||||
| 
 | ||||
| 	return s.bw.close() | ||||
| 	s.bw.close() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // writeCount will write the normalized histogram count to header. | ||||
|  | ||||
							
								
								
									
										4
									
								
								vendor/github.com/klauspost/compress/fse/decompress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/klauspost/compress/fse/decompress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -260,7 +260,9 @@ func (s *Scratch) buildDtable() error { | ||||
| // If the buffer is over-read an error is returned. | ||||
| func (s *Scratch) decompress() error { | ||||
| 	br := &s.bits | ||||
| 	br.init(s.br.unread()) | ||||
| 	if err := br.init(s.br.unread()); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	var s1, s2 decoder | ||||
| 	// Initialize and decode first state and symbol. | ||||
|  | ||||
							
								
								
									
										27
									
								
								vendor/github.com/klauspost/compress/huff0/bitwriter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/klauspost/compress/huff0/bitwriter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -13,14 +13,6 @@ type bitWriter struct { | ||||
| 	out          []byte | ||||
| } | ||||
| 
 | ||||
| // bitMask16 is bitmasks. Has extra to avoid bounds check. | ||||
| var bitMask16 = [32]uint16{ | ||||
| 	0, 1, 3, 7, 0xF, 0x1F, | ||||
| 	0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, | ||||
| 	0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0xFFFF, | ||||
| 	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||||
| 	0xFFFF, 0xFFFF} /* up to 16 bits */ | ||||
| 
 | ||||
| // addBits16Clean will add up to 16 bits. value may not contain more set bits than indicated. | ||||
| // It will not check if there is space for them, so the caller must ensure that it has flushed recently. | ||||
| func (b *bitWriter) addBits16Clean(value uint16, bits uint8) { | ||||
| @ -60,6 +52,22 @@ func (b *bitWriter) encTwoSymbols(ct cTable, av, bv byte) { | ||||
| 	b.nBits += encA.nBits + encB.nBits | ||||
| } | ||||
| 
 | ||||
| // encFourSymbols adds up to 32 bits from four symbols. | ||||
| // It will not check if there is space for them, | ||||
| // so the caller must ensure that b has been flushed recently. | ||||
| func (b *bitWriter) encFourSymbols(encA, encB, encC, encD cTableEntry) { | ||||
| 	bitsA := encA.nBits | ||||
| 	bitsB := bitsA + encB.nBits | ||||
| 	bitsC := bitsB + encC.nBits | ||||
| 	bitsD := bitsC + encD.nBits | ||||
| 	combined := uint64(encA.val) | | ||||
| 		(uint64(encB.val) << (bitsA & 63)) | | ||||
| 		(uint64(encC.val) << (bitsB & 63)) | | ||||
| 		(uint64(encD.val) << (bitsC & 63)) | ||||
| 	b.bitContainer |= combined << (b.nBits & 63) | ||||
| 	b.nBits += bitsD | ||||
| } | ||||
| 
 | ||||
| // flush32 will flush out, so there are at least 32 bits available for writing. | ||||
| func (b *bitWriter) flush32() { | ||||
| 	if b.nBits < 32 { | ||||
| @ -86,10 +94,9 @@ func (b *bitWriter) flushAlign() { | ||||
| 
 | ||||
| // close will write the alignment bit and write the final byte(s) | ||||
| // to the output. | ||||
| func (b *bitWriter) close() error { | ||||
| func (b *bitWriter) close() { | ||||
| 	// End mark | ||||
| 	b.addBits16Clean(1, 1) | ||||
| 	// flush until next byte. | ||||
| 	b.flushAlign() | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
							
								
								
									
										23
									
								
								vendor/github.com/klauspost/compress/huff0/compress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/klauspost/compress/huff0/compress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -227,10 +227,10 @@ func EstimateSizes(in []byte, s *Scratch) (tableSz, dataSz, reuseSz int, err err | ||||
| } | ||||
| 
 | ||||
| func (s *Scratch) compress1X(src []byte) ([]byte, error) { | ||||
| 	return s.compress1xDo(s.Out, src) | ||||
| 	return s.compress1xDo(s.Out, src), nil | ||||
| } | ||||
| 
 | ||||
| func (s *Scratch) compress1xDo(dst, src []byte) ([]byte, error) { | ||||
| func (s *Scratch) compress1xDo(dst, src []byte) []byte { | ||||
| 	var bw = bitWriter{out: dst} | ||||
| 
 | ||||
| 	// N is length divisible by 4. | ||||
| @ -248,8 +248,7 @@ func (s *Scratch) compress1xDo(dst, src []byte) ([]byte, error) { | ||||
| 			tmp := src[n : n+4] | ||||
| 			// tmp should be len 4 | ||||
| 			bw.flush32() | ||||
| 			bw.encTwoSymbols(cTable, tmp[3], tmp[2]) | ||||
| 			bw.encTwoSymbols(cTable, tmp[1], tmp[0]) | ||||
| 			bw.encFourSymbols(cTable[tmp[3]], cTable[tmp[2]], cTable[tmp[1]], cTable[tmp[0]]) | ||||
| 		} | ||||
| 	} else { | ||||
| 		for ; n >= 0; n -= 4 { | ||||
| @ -261,8 +260,8 @@ func (s *Scratch) compress1xDo(dst, src []byte) ([]byte, error) { | ||||
| 			bw.encTwoSymbols(cTable, tmp[1], tmp[0]) | ||||
| 		} | ||||
| 	} | ||||
| 	err := bw.close() | ||||
| 	return bw.out, err | ||||
| 	bw.close() | ||||
| 	return bw.out | ||||
| } | ||||
| 
 | ||||
| var sixZeros [6]byte | ||||
| @ -284,12 +283,8 @@ func (s *Scratch) compress4X(src []byte) ([]byte, error) { | ||||
| 		} | ||||
| 		src = src[len(toDo):] | ||||
| 
 | ||||
| 		var err error | ||||
| 		idx := len(s.Out) | ||||
| 		s.Out, err = s.compress1xDo(s.Out, toDo) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		s.Out = s.compress1xDo(s.Out, toDo) | ||||
| 		if len(s.Out)-idx > math.MaxUint16 { | ||||
| 			// We cannot store the size in the jump table | ||||
| 			return nil, ErrIncompressible | ||||
| @ -316,7 +311,6 @@ func (s *Scratch) compress4Xp(src []byte) ([]byte, error) { | ||||
| 
 | ||||
| 	segmentSize := (len(src) + 3) / 4 | ||||
| 	var wg sync.WaitGroup | ||||
| 	var errs [4]error | ||||
| 	wg.Add(4) | ||||
| 	for i := 0; i < 4; i++ { | ||||
| 		toDo := src | ||||
| @ -327,15 +321,12 @@ func (s *Scratch) compress4Xp(src []byte) ([]byte, error) { | ||||
| 
 | ||||
| 		// Separate goroutine for each block. | ||||
| 		go func(i int) { | ||||
| 			s.tmpOut[i], errs[i] = s.compress1xDo(s.tmpOut[i][:0], toDo) | ||||
| 			s.tmpOut[i] = s.compress1xDo(s.tmpOut[i][:0], toDo) | ||||
| 			wg.Done() | ||||
| 		}(i) | ||||
| 	} | ||||
| 	wg.Wait() | ||||
| 	for i := 0; i < 4; i++ { | ||||
| 		if errs[i] != nil { | ||||
| 			return nil, errs[i] | ||||
| 		} | ||||
| 		o := s.tmpOut[i] | ||||
| 		if len(o) > math.MaxUint16 { | ||||
| 			// We cannot store the size in the jump table | ||||
|  | ||||
							
								
								
									
										2
									
								
								vendor/github.com/klauspost/compress/huff0/decompress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/klauspost/compress/huff0/decompress.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -253,7 +253,7 @@ func (d *Decoder) decompress1X8Bit(dst, src []byte) ([]byte, error) { | ||||
| 
 | ||||
| 	switch d.actualTableLog { | ||||
| 	case 8: | ||||
| 		const shift = 8 - 8 | ||||
| 		const shift = 0 | ||||
| 		for br.off >= 4 { | ||||
| 			br.fillFast() | ||||
| 			v := dt[uint8(br.value>>(56+shift))] | ||||
|  | ||||
							
								
								
									
										12
									
								
								vendor/github.com/klauspost/compress/internal/snapref/encode_other.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/klauspost/compress/internal/snapref/encode_other.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -87,18 +87,6 @@ func emitCopy(dst []byte, offset, length int) int { | ||||
| 	return i + 2 | ||||
| } | ||||
| 
 | ||||
| // extendMatch returns the largest k such that k <= len(src) and that | ||||
| // src[i:i+k-j] and src[j:k] have the same contents. | ||||
| // | ||||
| // It assumes that: | ||||
| // | ||||
| //	0 <= i && i < j && j <= len(src) | ||||
| func extendMatch(src []byte, i, j int) int { | ||||
| 	for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { | ||||
| 	} | ||||
| 	return j | ||||
| } | ||||
| 
 | ||||
| func hash(u, shift uint32) uint32 { | ||||
| 	return (u * 0x1e35a7bd) >> shift | ||||
| } | ||||
|  | ||||
							
								
								
									
										1044
									
								
								vendor/github.com/klauspost/compress/s2/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1044
									
								
								vendor/github.com/klauspost/compress/s2/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										19
									
								
								vendor/github.com/klauspost/compress/s2/dict.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/klauspost/compress/s2/dict.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -106,6 +106,25 @@ func MakeDict(data []byte, searchStart []byte) *Dict { | ||||
| 	return &d | ||||
| } | ||||
| 
 | ||||
| // MakeDictManual will create a dictionary. | ||||
| // 'data' must be at least MinDictSize and less than or equal to MaxDictSize. | ||||
| // A manual first repeat index into data must be provided. | ||||
| // It must be less than len(data)-8. | ||||
| func MakeDictManual(data []byte, firstIdx uint16) *Dict { | ||||
| 	if len(data) < MinDictSize || int(firstIdx) >= len(data)-8 || len(data) > MaxDictSize { | ||||
| 		return nil | ||||
| 	} | ||||
| 	var d Dict | ||||
| 	dict := data | ||||
| 	d.dict = dict | ||||
| 	if cap(d.dict) < len(d.dict)+16 { | ||||
| 		d.dict = append(make([]byte, 0, len(d.dict)+16), d.dict...) | ||||
| 	} | ||||
| 
 | ||||
| 	d.repeat = int(firstIdx) | ||||
| 	return &d | ||||
| } | ||||
| 
 | ||||
| // Encode returns the encoded form of src. The returned slice may be a sub- | ||||
| // slice of dst if dst was large enough to hold the entire encoded block. | ||||
| // Otherwise, a newly allocated slice will be returned. | ||||
|  | ||||
							
								
								
									
										1030
									
								
								vendor/github.com/klauspost/compress/s2/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1030
									
								
								vendor/github.com/klauspost/compress/s2/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								vendor/github.com/klauspost/compress/s2/encode_all.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/klauspost/compress/s2/encode_all.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -742,7 +742,6 @@ searchDict: | ||||
| 				x := load64(src, s-2) | ||||
| 				m2Hash := hash6(x, tableBits) | ||||
| 				currHash := hash6(x>>8, tableBits) | ||||
| 				candidate = int(table[currHash]) | ||||
| 				table[m2Hash] = uint32(s - 2) | ||||
| 				table[currHash] = uint32(s - 1) | ||||
| 				cv = load64(src, s) | ||||
|  | ||||
							
								
								
									
										44
									
								
								vendor/github.com/klauspost/compress/s2/encode_better.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/klauspost/compress/s2/encode_better.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -157,7 +157,6 @@ func encodeBlockBetterGo(dst, src []byte) (d int) { | ||||
| 				index0 := base + 1 | ||||
| 				index1 := s - 2 | ||||
| 
 | ||||
| 				cv = load64(src, s) | ||||
| 				for index0 < index1 { | ||||
| 					cv0 := load64(src, index0) | ||||
| 					cv1 := load64(src, index1) | ||||
| @ -269,18 +268,21 @@ func encodeBlockBetterGo(dst, src []byte) (d int) { | ||||
| 		lTable[hash7(cv0, lTableBits)] = uint32(index0) | ||||
| 		sTable[hash4(cv0>>8, sTableBits)] = uint32(index0 + 1) | ||||
| 
 | ||||
| 		// lTable could be postponed, but very minor difference. | ||||
| 		lTable[hash7(cv1, lTableBits)] = uint32(index1) | ||||
| 		sTable[hash4(cv1>>8, sTableBits)] = uint32(index1 + 1) | ||||
| 		index0 += 1 | ||||
| 		index1 -= 1 | ||||
| 		cv = load64(src, s) | ||||
| 
 | ||||
| 		// index every second long in between. | ||||
| 		for index0 < index1 { | ||||
| 		// Index large values sparsely in between. | ||||
| 		// We do two starting from different offsets for speed. | ||||
| 		index2 := (index0 + index1 + 1) >> 1 | ||||
| 		for index2 < index1 { | ||||
| 			lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0) | ||||
| 			lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1) | ||||
| 			lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2) | ||||
| 			index0 += 2 | ||||
| 			index1 -= 2 | ||||
| 			index2 += 2 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -459,12 +461,14 @@ func encodeBlockBetterSnappyGo(dst, src []byte) (d int) { | ||||
| 		index1 -= 1 | ||||
| 		cv = load64(src, s) | ||||
| 
 | ||||
| 		// index every second long in between. | ||||
| 		for index0 < index1 { | ||||
| 		// Index large values sparsely in between. | ||||
| 		// We do two starting from different offsets for speed. | ||||
| 		index2 := (index0 + index1 + 1) >> 1 | ||||
| 		for index2 < index1 { | ||||
| 			lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0) | ||||
| 			lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1) | ||||
| 			lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2) | ||||
| 			index0 += 2 | ||||
| 			index1 -= 2 | ||||
| 			index2 += 2 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -599,7 +603,6 @@ searchDict: | ||||
| 					if s >= sLimit { | ||||
| 						break searchDict | ||||
| 					} | ||||
| 					cv = load64(src, s) | ||||
| 					// Index in-between | ||||
| 					index0 := base + 1 | ||||
| 					index1 := s - 2 | ||||
| @ -865,12 +868,14 @@ searchDict: | ||||
| 		index1 -= 1 | ||||
| 		cv = load64(src, s) | ||||
| 
 | ||||
| 		// index every second long in between. | ||||
| 		for index0 < index1 { | ||||
| 		// Index large values sparsely in between. | ||||
| 		// We do two starting from different offsets for speed. | ||||
| 		index2 := (index0 + index1 + 1) >> 1 | ||||
| 		for index2 < index1 { | ||||
| 			lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0) | ||||
| 			lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1) | ||||
| 			lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2) | ||||
| 			index0 += 2 | ||||
| 			index1 -= 2 | ||||
| 			index2 += 2 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -961,7 +966,6 @@ searchDict: | ||||
| 				index0 := base + 1 | ||||
| 				index1 := s - 2 | ||||
| 
 | ||||
| 				cv = load64(src, s) | ||||
| 				for index0 < index1 { | ||||
| 					cv0 := load64(src, index0) | ||||
| 					cv1 := load64(src, index1) | ||||
| @ -1079,12 +1083,14 @@ searchDict: | ||||
| 		index1 -= 1 | ||||
| 		cv = load64(src, s) | ||||
| 
 | ||||
| 		// index every second long in between. | ||||
| 		for index0 < index1 { | ||||
| 		// Index large values sparsely in between. | ||||
| 		// We do two starting from different offsets for speed. | ||||
| 		index2 := (index0 + index1 + 1) >> 1 | ||||
| 		for index2 < index1 { | ||||
| 			lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0) | ||||
| 			lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1) | ||||
| 			lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2) | ||||
| 			index0 += 2 | ||||
| 			index1 -= 2 | ||||
| 			index2 += 2 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										8
									
								
								vendor/github.com/klauspost/compress/s2/encode_go.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/klauspost/compress/s2/encode_go.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -717,3 +717,11 @@ func cvtLZ4BlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) { | ||||
| func cvtLZ4BlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) { | ||||
| 	panic("cvtLZ4BlockSnappyAsm should be unreachable") | ||||
| } | ||||
| 
 | ||||
| func cvtLZ4sBlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) { | ||||
| 	panic("cvtLZ4sBlockAsm should be unreachable") | ||||
| } | ||||
| 
 | ||||
| func cvtLZ4sBlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) { | ||||
| 	panic("cvtLZ4sBlockSnappyAsm should be unreachable") | ||||
| } | ||||
|  | ||||
							
								
								
									
										12
									
								
								vendor/github.com/klauspost/compress/s2/encodeblock_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/klauspost/compress/s2/encodeblock_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -212,7 +212,17 @@ func matchLen(a []byte, b []byte) int | ||||
| //go:noescape | ||||
| func cvtLZ4BlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) | ||||
| 
 | ||||
| // cvtLZ4Block converts an LZ4 block to S2 | ||||
| // cvtLZ4sBlock converts an LZ4s block to S2 | ||||
| // | ||||
| //go:noescape | ||||
| func cvtLZ4sBlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) | ||||
| 
 | ||||
| // cvtLZ4Block converts an LZ4 block to Snappy | ||||
| // | ||||
| //go:noescape | ||||
| func cvtLZ4BlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) | ||||
| 
 | ||||
| // cvtLZ4sBlock converts an LZ4s block to Snappy | ||||
| // | ||||
| //go:noescape | ||||
| func cvtLZ4sBlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int) | ||||
|  | ||||
							
								
								
									
										4917
									
								
								vendor/github.com/klauspost/compress/s2/encodeblock_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4917
									
								
								vendor/github.com/klauspost/compress/s2/encodeblock_amd64.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Wim
						Wim