mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Bump viper version, fix nobrowser (#1991)
This commit is contained in:
committed by
GitHub
parent
808202ba8a
commit
a7ed0a7004
39
go.mod
39
go.mod
@@ -19,7 +19,7 @@ require (
|
|||||||
github.com/h2non/filetype v1.0.8
|
github.com/h2non/filetype v1.0.8
|
||||||
github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a
|
github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a
|
||||||
github.com/jmoiron/sqlx v1.3.1
|
github.com/jmoiron/sqlx v1.3.1
|
||||||
github.com/json-iterator/go v1.1.9
|
github.com/json-iterator/go v1.1.11
|
||||||
github.com/mattn/go-sqlite3 v1.14.6
|
github.com/mattn/go-sqlite3 v1.14.6
|
||||||
github.com/natefinch/pie v0.0.0-20170715172608-9a0d72014007
|
github.com/natefinch/pie v0.0.0-20170715172608-9a0d72014007
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8
|
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8
|
||||||
@@ -28,31 +28,33 @@ require (
|
|||||||
github.com/rs/cors v1.6.0
|
github.com/rs/cors v1.6.0
|
||||||
github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f
|
github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/spf13/afero v1.2.0 // indirect
|
github.com/spf13/afero v1.6.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.3
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/spf13/viper v1.7.0
|
github.com/spf13/viper v1.9.0
|
||||||
github.com/stretchr/testify v1.6.1
|
github.com/stretchr/testify v1.7.0
|
||||||
github.com/tidwall/gjson v1.9.3
|
github.com/tidwall/gjson v1.9.3
|
||||||
github.com/tidwall/pretty v1.2.0 // indirect
|
github.com/tidwall/pretty v1.2.0 // indirect
|
||||||
github.com/vektra/mockery/v2 v2.2.1
|
github.com/vektra/mockery/v2 v2.2.1
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
|
||||||
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb
|
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb
|
||||||
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023
|
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf
|
||||||
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
|
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
|
||||||
golang.org/x/text v0.3.6
|
golang.org/x/text v0.3.6
|
||||||
golang.org/x/tools v0.1.0 // indirect
|
golang.org/x/tools v0.1.5 // indirect
|
||||||
gopkg.in/sourcemap.v1 v1.0.5 // indirect
|
gopkg.in/sourcemap.v1 v1.0.5 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
require github.com/vektah/gqlparser/v2 v2.0.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/agnivade/levenshtein v1.1.0 // indirect
|
github.com/agnivade/levenshtein v1.1.0 // indirect
|
||||||
github.com/antchfx/xpath v1.1.6 // indirect
|
github.com/antchfx/xpath v1.1.6 // indirect
|
||||||
github.com/chromedp/sysutil v1.0.0 // indirect
|
github.com/chromedp/sysutil v1.0.0 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.4.7 // indirect
|
github.com/fsnotify/fsnotify v1.5.1 // indirect
|
||||||
github.com/gobwas/httphead v0.1.0 // indirect
|
github.com/gobwas/httphead v0.1.0 // indirect
|
||||||
github.com/gobwas/pool v0.2.1 // indirect
|
github.com/gobwas/pool v0.2.1 // indirect
|
||||||
github.com/gobwas/ws v1.1.0-rc.5 // indirect
|
github.com/gobwas/ws v1.1.0-rc.5 // indirect
|
||||||
@@ -63,34 +65,33 @@ require (
|
|||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/magiconair/properties v1.8.1 // indirect
|
github.com/magiconair/properties v1.8.5 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/matryer/moq v0.0.0-20200106131100-75d0ddfc0007 // indirect
|
github.com/matryer/moq v0.0.0-20200106131100-75d0ddfc0007 // indirect
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.1.2 // indirect
|
github.com/mitchellh/mapstructure v1.4.2 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.1 // indirect
|
github.com/modern-go/reflect2 v1.0.1 // indirect
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
|
||||||
github.com/pelletier/go-toml v1.7.0 // indirect
|
github.com/pelletier/go-toml v1.9.4 // indirect
|
||||||
github.com/pkg/errors v0.9.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.0 // indirect
|
||||||
github.com/rs/zerolog v1.18.0 // indirect
|
github.com/rs/zerolog v1.18.0 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.0.1 // indirect
|
github.com/russross/blackfriday/v2 v2.0.1 // indirect
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
||||||
github.com/spf13/cast v1.3.0 // indirect
|
github.com/spf13/cast v1.4.1 // indirect
|
||||||
github.com/spf13/cobra v1.0.0 // indirect
|
github.com/spf13/cobra v1.0.0 // indirect
|
||||||
github.com/spf13/jwalterweatherman v1.0.0 // indirect
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
github.com/stretchr/objx v0.2.0 // indirect
|
github.com/stretchr/objx v0.2.0 // indirect
|
||||||
github.com/subosito/gotenv v1.2.0 // indirect
|
github.com/subosito/gotenv v1.2.0 // indirect
|
||||||
github.com/tidwall/match v1.1.1 // indirect
|
github.com/tidwall/match v1.1.1 // indirect
|
||||||
github.com/urfave/cli/v2 v2.1.1 // indirect
|
github.com/urfave/cli/v2 v2.1.1 // indirect
|
||||||
github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e // indirect
|
github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e // indirect
|
||||||
github.com/vektah/gqlparser/v2 v2.0.1 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/atomic v1.6.0 // indirect
|
golang.org/x/mod v0.4.2 // indirect
|
||||||
golang.org/x/mod v0.4.1 // indirect
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||||
gopkg.in/ini.v1 v1.51.0 // indirect
|
gopkg.in/ini.v1 v1.63.2 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
replace git.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999
|
replace git.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999
|
||||||
|
|||||||
163
go.sum
163
go.sum
@@ -18,6 +18,11 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW
|
|||||||
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
|
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.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
|
||||||
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
|
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
|
||||||
|
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
|
||||||
|
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
|
||||||
|
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
|
||||||
|
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
|
||||||
|
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
@@ -27,6 +32,7 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7
|
|||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
||||||
|
cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU=
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
@@ -50,7 +56,6 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY
|
|||||||
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
|
||||||
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
|
github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
|
||||||
@@ -78,6 +83,7 @@ github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz
|
|||||||
github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0=
|
github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0=
|
||||||
github.com/antchfx/xpath v1.1.6 h1:6sVh6hB5T6phw1pFpHRQ+C4bd8sNI+O58flqtg7h0R0=
|
github.com/antchfx/xpath v1.1.6 h1:6sVh6hB5T6phw1pFpHRQ+C4bd8sNI+O58flqtg7h0R0=
|
||||||
github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
|
github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
|
||||||
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||||
github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0=
|
github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0=
|
||||||
github.com/apache/arrow/go/arrow v0.0.0-20210521153258-78c88a9f517b/go.mod h1:R4hW3Ug0s+n4CUsWHKOj00Pu01ZqU4x/hSF5kXUcXKQ=
|
github.com/apache/arrow/go/arrow v0.0.0-20210521153258-78c88a9f517b/go.mod h1:R4hW3Ug0s+n4CUsWHKOj00Pu01ZqU4x/hSF5kXUcXKQ=
|
||||||
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
|
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
|
||||||
@@ -86,6 +92,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
|
|||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
|
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||||
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8=
|
github.com/aws/aws-sdk-go-v2 v1.3.2/go.mod h1:7OaACgj2SX3XGWnrIjGlJM22h6yD6MEWKvm7levnnM8=
|
||||||
github.com/aws/aws-sdk-go-v2 v1.6.0/go.mod h1:tI4KhsR5VkzlUa2DZAdwx7wCAYGwkZZ1H31PYrBFx1w=
|
github.com/aws/aws-sdk-go-v2 v1.6.0/go.mod h1:tI4KhsR5VkzlUa2DZAdwx7wCAYGwkZZ1H31PYrBFx1w=
|
||||||
@@ -139,6 +146,7 @@ github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h
|
|||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||||
github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM=
|
github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM=
|
||||||
github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
|
||||||
@@ -149,6 +157,7 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
|
|||||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
github.com/corona10/goimagehash v1.0.3 h1:NZM518aKLmoNluluhfHGxT3LGOnrojrxhGn63DR/CZA=
|
github.com/corona10/goimagehash v1.0.3 h1:NZM518aKLmoNluluhfHGxT3LGOnrojrxhGn63DR/CZA=
|
||||||
github.com/corona10/goimagehash v1.0.3/go.mod h1:VkvE0mLn84L4aF8vCb6mafVajEb6QYMHl2ZJLn0mOGI=
|
github.com/corona10/goimagehash v1.0.3/go.mod h1:VkvE0mLn84L4aF8vCb6mafVajEb6QYMHl2ZJLn0mOGI=
|
||||||
@@ -183,12 +192,15 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
|
|||||||
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
|
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
|
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||||
github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
|
||||||
|
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
|
||||||
github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw=
|
github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw=
|
||||||
github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo=
|
github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo=
|
||||||
github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
@@ -240,6 +252,7 @@ github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm
|
|||||||
github.com/gobwas/ws v1.1.0-rc.5 h1:QOAag7FoBaBYYHRqzqkhhd8fq5RTubvI4v3Ft/gDVVQ=
|
github.com/gobwas/ws v1.1.0-rc.5 h1:QOAag7FoBaBYYHRqzqkhhd8fq5RTubvI4v3Ft/gDVVQ=
|
||||||
github.com/gobwas/ws v1.1.0-rc.5/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0=
|
github.com/gobwas/ws v1.1.0-rc.5/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0=
|
||||||
github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=
|
github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
@@ -265,6 +278,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
|
|||||||
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||||
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
|
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
|
||||||
|
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||||
github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
@@ -302,14 +316,16 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
||||||
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-github/v35 v35.2.0/go.mod h1:s0515YVTI+IMrDoy9Y4pHt9ShGpzHvHO8rZ7L7acgvs=
|
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=
|
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
|
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
@@ -321,14 +337,17 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
|
|||||||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/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-20210226084205-cbba55b83ad5/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-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.1.1/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.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.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
|
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
@@ -347,20 +366,25 @@ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/ad
|
|||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
github.com/h2non/filetype v1.0.8 h1:le8gpf+FQA0/DlDABbtisA1KiTS0Xi+YSC/E8yY3Y14=
|
github.com/h2non/filetype v1.0.8 h1:le8gpf+FQA0/DlDABbtisA1KiTS0Xi+YSC/E8yY3Y14=
|
||||||
github.com/h2non/filetype v1.0.8/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU=
|
github.com/h2non/filetype v1.0.8/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||||
|
github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
|
||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||||
|
github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
|
||||||
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
|
github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||||
github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
|
github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
|
||||||
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
|
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
||||||
|
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
@@ -373,8 +397,11 @@ 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/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=
|
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||||
|
github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
|
||||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
||||||
|
github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
|
||||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
||||||
|
github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
|
github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
@@ -439,12 +466,11 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22
|
|||||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
|
github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ=
|
||||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||||
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
||||||
@@ -462,8 +488,10 @@ github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8
|
|||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/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=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
@@ -478,8 +506,9 @@ github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E=
|
|||||||
github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
|
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
|
||||||
|
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
|
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
|
||||||
@@ -498,13 +527,17 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd
|
|||||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||||
|
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||||
|
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||||
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
|
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
|
||||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
||||||
|
github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
|
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
@@ -514,8 +547,9 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu
|
|||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=
|
||||||
|
github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@@ -546,8 +580,9 @@ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKw
|
|||||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pelletier/go-toml v1.7.0 h1:7utD74fnzVc/cpcyy8sjrlFr5vYpypUixARcHIMIGuI=
|
|
||||||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
|
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
|
||||||
|
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
|
||||||
|
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pierrec/lz4/v4 v4.1.4/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
github.com/pierrec/lz4/v4 v4.1.4/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||||
@@ -560,9 +595,11 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
|||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
|
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
@@ -580,6 +617,7 @@ github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qq
|
|||||||
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=
|
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac h1:kYPjbEN6YPYWWHI6ky1J813KzIq/8+Wg4TO4xU7A/KU=
|
||||||
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
|
github.com/robertkrimen/otto v0.0.0-20200922221731-ef014fd054ac/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY=
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
||||||
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
@@ -594,6 +632,7 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0
|
|||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||||
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8=
|
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8=
|
||||||
|
github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE=
|
||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
@@ -615,29 +654,31 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
|
|||||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
|
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
|
||||||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/snowflakedb/gosnowflake v1.4.3/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98=
|
github.com/snowflakedb/gosnowflake v1.4.3/go.mod h1:1kyg2XEduwti88V11PKRHImhXLK5WpGiayY6lFNYb98=
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
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.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
github.com/spf13/afero v1.2.0 h1:O9FblXGxoTc51M+cqr74Bm2Tmt4PvkA5iu/j8HrkNuY=
|
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
|
||||||
github.com/spf13/afero v1.2.0/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
||||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
|
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
|
||||||
|
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
|
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
|
||||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||||
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
|
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
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 v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||||
github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
|
|
||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||||
|
github.com/spf13/viper v1.9.0 h1:yR6EXjTp0y0cLN8OZg1CRZmOBdI88UcGkhgyJhu6nZk=
|
||||||
|
github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
||||||
@@ -648,8 +689,9 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
|
|||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=
|
github.com/tidwall/gjson v1.9.3 h1:hqzS9wAHMO+KVBBkLxYdkEeeFHuqr95GfClRLKlgK0E=
|
||||||
@@ -684,9 +726,13 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
|
|||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
||||||
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
|
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
|
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
||||||
|
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||||
|
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
||||||
go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8=
|
go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8=
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
@@ -695,15 +741,19 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
|||||||
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
||||||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||||
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
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.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
|
|
||||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
|
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||||
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
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.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||||
|
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
||||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
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.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
||||||
|
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
@@ -714,6 +764,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
|
|||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
@@ -721,8 +772,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
|||||||
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
@@ -748,8 +799,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
|
|||||||
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI=
|
|
||||||
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
@@ -759,8 +810,9 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB
|
|||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY=
|
|
||||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
|
||||||
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
@@ -784,6 +836,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
|
|||||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
@@ -808,6 +861,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
||||||
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
|
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE=
|
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE=
|
||||||
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
@@ -824,6 +879,10 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ
|
|||||||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
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-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
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=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -861,7 +920,10 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -870,6 +932,7 @@ golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -897,14 +960,22 @@ golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/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=
|
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
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-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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=
|
||||||
golang.org/x/sys v0.0.0-20210521090106-6ca3eb03dfc2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210521090106-6ca3eb03dfc2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
|
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
|
||||||
|
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE=
|
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE=
|
||||||
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
@@ -945,6 +1016,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
|
|||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
@@ -986,8 +1058,13 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f
|
|||||||
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/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-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
|
|
||||||
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
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=
|
||||||
|
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
|
||||||
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
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-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
@@ -1017,6 +1094,12 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR
|
|||||||
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
|
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
|
||||||
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
|
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
|
||||||
google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA=
|
google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA=
|
||||||
|
google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
|
||||||
|
google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
|
||||||
|
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
|
||||||
|
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
|
||||||
|
google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
|
||||||
|
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
||||||
google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
@@ -1049,6 +1132,7 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG
|
|||||||
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||||
@@ -1069,6 +1153,18 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D
|
|||||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
|
||||||
google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
||||||
google.golang.org/genproto v0.0.0-20210427215850-f767ed18ee4d/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
google.golang.org/genproto v0.0.0-20210427215850-f767ed18ee4d/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
||||||
|
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
|
||||||
|
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||||
|
google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
|
||||||
|
google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
||||||
|
google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
|
||||||
|
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||||
|
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
|
||||||
|
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
|
||||||
|
google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
|
google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
@@ -1084,12 +1180,19 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM
|
|||||||
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
|
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
|
||||||
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||||
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
|
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||||
|
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
|
||||||
|
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||||
|
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
@@ -1102,6 +1205,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
|
|||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
|
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
@@ -1112,8 +1216,9 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
||||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
|
|
||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
|
gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c=
|
||||||
|
gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||||
gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=
|
gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI=
|
||||||
gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
|
gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78=
|
||||||
@@ -1121,14 +1226,16 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
|
|||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg=
|
gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg=
|
||||||
gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
|
gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
|
||||||
gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
|
gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
|
||||||
|
|||||||
@@ -1125,7 +1125,7 @@ func (i *Instance) setDefaultValues(write bool) error {
|
|||||||
// Set generated to the metadata path for backwards compat
|
// Set generated to the metadata path for backwards compat
|
||||||
i.main.SetDefault(Generated, i.main.GetString(Metadata))
|
i.main.SetDefault(Generated, i.main.GetString(Metadata))
|
||||||
|
|
||||||
viper.SetDefault(NoBrowser, NoBrowserDefault)
|
i.main.SetDefault(NoBrowser, NoBrowserDefault)
|
||||||
|
|
||||||
// Set default scrapers and plugins paths
|
// Set default scrapers and plugins paths
|
||||||
i.main.SetDefault(ScrapersPath, defaultScrapersPath)
|
i.main.SetDefault(ScrapersPath, defaultScrapersPath)
|
||||||
|
|||||||
9
vendor/github.com/fsnotify/fsnotify/.editorconfig
generated
vendored
9
vendor/github.com/fsnotify/fsnotify/.editorconfig
generated
vendored
@@ -1,5 +1,12 @@
|
|||||||
root = true
|
root = true
|
||||||
|
|
||||||
[*]
|
[*.go]
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.{yml,yaml}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|||||||
1
vendor/github.com/fsnotify/fsnotify/.gitattributes
generated
vendored
Normal file
1
vendor/github.com/fsnotify/fsnotify/.gitattributes
generated
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
go.sum linguist-generated
|
||||||
2
vendor/github.com/fsnotify/fsnotify/.mailmap
generated
vendored
Normal file
2
vendor/github.com/fsnotify/fsnotify/.mailmap
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Chris Howey <howeyc@gmail.com> <chris@howey.me>
|
||||||
|
Nathan Youngman <git@nathany.com> <4566+nathany@users.noreply.github.com>
|
||||||
30
vendor/github.com/fsnotify/fsnotify/.travis.yml
generated
vendored
30
vendor/github.com/fsnotify/fsnotify/.travis.yml
generated
vendored
@@ -1,30 +0,0 @@
|
|||||||
sudo: false
|
|
||||||
language: go
|
|
||||||
|
|
||||||
go:
|
|
||||||
- 1.8.x
|
|
||||||
- 1.9.x
|
|
||||||
- tip
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
allow_failures:
|
|
||||||
- go: tip
|
|
||||||
fast_finish: true
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- go get -u github.com/golang/lint/golint
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go test -v --race ./...
|
|
||||||
|
|
||||||
after_script:
|
|
||||||
- test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
|
|
||||||
- test -z "$(golint ./... | tee /dev/stderr)"
|
|
||||||
- go vet ./...
|
|
||||||
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
16
vendor/github.com/fsnotify/fsnotify/AUTHORS
generated
vendored
16
vendor/github.com/fsnotify/fsnotify/AUTHORS
generated
vendored
@@ -4,35 +4,44 @@
|
|||||||
|
|
||||||
# You can update this list using the following command:
|
# You can update this list using the following command:
|
||||||
#
|
#
|
||||||
# $ git shortlog -se | awk '{print $2 " " $3 " " $4}'
|
# $ (head -n10 AUTHORS && git shortlog -se | sed -E 's/^\s+[0-9]+\t//') | tee AUTHORS
|
||||||
|
|
||||||
# Please keep the list sorted.
|
# Please keep the list sorted.
|
||||||
|
|
||||||
Aaron L <aaron@bettercoder.net>
|
Aaron L <aaron@bettercoder.net>
|
||||||
Adrien Bustany <adrien@bustany.org>
|
Adrien Bustany <adrien@bustany.org>
|
||||||
|
Alexey Kazakov <alkazako@redhat.com>
|
||||||
Amit Krishnan <amit.krishnan@oracle.com>
|
Amit Krishnan <amit.krishnan@oracle.com>
|
||||||
Anmol Sethi <me@anmol.io>
|
Anmol Sethi <me@anmol.io>
|
||||||
Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
|
Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
|
||||||
|
Brian Goff <cpuguy83@gmail.com>
|
||||||
Bruno Bigras <bigras.bruno@gmail.com>
|
Bruno Bigras <bigras.bruno@gmail.com>
|
||||||
Caleb Spare <cespare@gmail.com>
|
Caleb Spare <cespare@gmail.com>
|
||||||
Case Nelson <case@teammating.com>
|
Case Nelson <case@teammating.com>
|
||||||
Chris Howey <chris@howey.me> <howeyc@gmail.com>
|
Chris Howey <howeyc@gmail.com>
|
||||||
Christoffer Buchholz <christoffer.buchholz@gmail.com>
|
Christoffer Buchholz <christoffer.buchholz@gmail.com>
|
||||||
Daniel Wagner-Hall <dawagner@gmail.com>
|
Daniel Wagner-Hall <dawagner@gmail.com>
|
||||||
Dave Cheney <dave@cheney.net>
|
Dave Cheney <dave@cheney.net>
|
||||||
|
Eric Lin <linxiulei@gmail.com>
|
||||||
Evan Phoenix <evan@fallingsnow.net>
|
Evan Phoenix <evan@fallingsnow.net>
|
||||||
Francisco Souza <f@souza.cc>
|
Francisco Souza <f@souza.cc>
|
||||||
|
Gautam Dey <gautam.dey77@gmail.com>
|
||||||
Hari haran <hariharan.uno@gmail.com>
|
Hari haran <hariharan.uno@gmail.com>
|
||||||
John C Barstow
|
Ichinose Shogo <shogo82148@gmail.com>
|
||||||
|
Johannes Ebke <johannes@ebke.org>
|
||||||
|
John C Barstow <jbowtie@amathaine.com>
|
||||||
Kelvin Fo <vmirage@gmail.com>
|
Kelvin Fo <vmirage@gmail.com>
|
||||||
Ken-ichirou MATSUZAWA <chamas@h4.dion.ne.jp>
|
Ken-ichirou MATSUZAWA <chamas@h4.dion.ne.jp>
|
||||||
Matt Layher <mdlayher@gmail.com>
|
Matt Layher <mdlayher@gmail.com>
|
||||||
|
Matthias Stone <matthias@bellstone.ca>
|
||||||
Nathan Youngman <git@nathany.com>
|
Nathan Youngman <git@nathany.com>
|
||||||
Nickolai Zeldovich <nickolai@csail.mit.edu>
|
Nickolai Zeldovich <nickolai@csail.mit.edu>
|
||||||
|
Oliver Bristow <evilumbrella+github@gmail.com>
|
||||||
Patrick <patrick@dropbox.com>
|
Patrick <patrick@dropbox.com>
|
||||||
Paul Hammond <paul@paulhammond.org>
|
Paul Hammond <paul@paulhammond.org>
|
||||||
Pawel Knap <pawelknap88@gmail.com>
|
Pawel Knap <pawelknap88@gmail.com>
|
||||||
Pieter Droogendijk <pieter@binky.org.uk>
|
Pieter Droogendijk <pieter@binky.org.uk>
|
||||||
|
Pratik Shinde <pratikshinde320@gmail.com>
|
||||||
Pursuit92 <JoshChase@techpursuit.net>
|
Pursuit92 <JoshChase@techpursuit.net>
|
||||||
Riku Voipio <riku.voipio@linaro.org>
|
Riku Voipio <riku.voipio@linaro.org>
|
||||||
Rob Figueiredo <robfig@gmail.com>
|
Rob Figueiredo <robfig@gmail.com>
|
||||||
@@ -41,6 +50,7 @@ Slawek Ligus <root@ooz.ie>
|
|||||||
Soge Zhang <zhssoge@gmail.com>
|
Soge Zhang <zhssoge@gmail.com>
|
||||||
Tiffany Jernigan <tiffany.jernigan@intel.com>
|
Tiffany Jernigan <tiffany.jernigan@intel.com>
|
||||||
Tilak Sharma <tilaks@google.com>
|
Tilak Sharma <tilaks@google.com>
|
||||||
|
Tobias Klauser <tobias.klauser@gmail.com>
|
||||||
Tom Payne <twpayne@gmail.com>
|
Tom Payne <twpayne@gmail.com>
|
||||||
Travis Cline <travis.cline@gmail.com>
|
Travis Cline <travis.cline@gmail.com>
|
||||||
Tudor Golubenco <tudor.g@gmail.com>
|
Tudor Golubenco <tudor.g@gmail.com>
|
||||||
|
|||||||
116
vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
generated
vendored
116
vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
generated
vendored
@@ -1,6 +1,28 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## v1.4.7 / 2018-01-09
|
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]
|
||||||
|
|
||||||
|
## [1.5.1] - 2021-08-24
|
||||||
|
|
||||||
|
* Revert Add AddRaw to not follow symlinks
|
||||||
|
|
||||||
|
## [1.5.0] - 2021-08-20
|
||||||
|
|
||||||
|
* Go: Increase minimum required version to Go 1.12 [#381](https://github.com/fsnotify/fsnotify/pull/381)
|
||||||
|
* Feature: Add AddRaw method which does not follow symlinks when adding a watch [#289](https://github.com/fsnotify/fsnotify/pull/298)
|
||||||
|
* Windows: Follow symlinks by default like on all other systems [#289](https://github.com/fsnotify/fsnotify/pull/289)
|
||||||
|
* CI: Use GitHub Actions for CI and cover go 1.12-1.17
|
||||||
|
[#378](https://github.com/fsnotify/fsnotify/pull/378)
|
||||||
|
[#381](https://github.com/fsnotify/fsnotify/pull/381)
|
||||||
|
[#385](https://github.com/fsnotify/fsnotify/pull/385)
|
||||||
|
* Go 1.14+: Fix unsafe pointer conversion [#325](https://github.com/fsnotify/fsnotify/pull/325)
|
||||||
|
|
||||||
|
## [1.4.7] - 2018-01-09
|
||||||
|
|
||||||
* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine)
|
* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine)
|
||||||
* Tests: Fix missing verb on format string (thanks @rchiossi)
|
* Tests: Fix missing verb on format string (thanks @rchiossi)
|
||||||
@@ -10,62 +32,62 @@
|
|||||||
* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich)
|
* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich)
|
||||||
* Docs: replace references to OS X with macOS
|
* Docs: replace references to OS X with macOS
|
||||||
|
|
||||||
## v1.4.2 / 2016-10-10
|
## [1.4.2] - 2016-10-10
|
||||||
|
|
||||||
* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack)
|
* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack)
|
||||||
|
|
||||||
## v1.4.1 / 2016-10-04
|
## [1.4.1] - 2016-10-04
|
||||||
|
|
||||||
* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack)
|
* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack)
|
||||||
|
|
||||||
## v1.4.0 / 2016-10-01
|
## [1.4.0] - 2016-10-01
|
||||||
|
|
||||||
* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie)
|
* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie)
|
||||||
|
|
||||||
## v1.3.1 / 2016-06-28
|
## [1.3.1] - 2016-06-28
|
||||||
|
|
||||||
* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
|
* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
|
||||||
|
|
||||||
## v1.3.0 / 2016-04-19
|
## [1.3.0] - 2016-04-19
|
||||||
|
|
||||||
* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135)
|
* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135)
|
||||||
|
|
||||||
## v1.2.10 / 2016-03-02
|
## [1.2.10] - 2016-03-02
|
||||||
|
|
||||||
* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj)
|
* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj)
|
||||||
|
|
||||||
## v1.2.9 / 2016-01-13
|
## [1.2.9] - 2016-01-13
|
||||||
|
|
||||||
kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep)
|
kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep)
|
||||||
|
|
||||||
## v1.2.8 / 2015-12-17
|
## [1.2.8] - 2015-12-17
|
||||||
|
|
||||||
* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test)
|
* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test)
|
||||||
* inotify: fix race in test
|
* inotify: fix race in test
|
||||||
* enable race detection for continuous integration (Linux, Mac, Windows)
|
* enable race detection for continuous integration (Linux, Mac, Windows)
|
||||||
|
|
||||||
## v1.2.5 / 2015-10-17
|
## [1.2.5] - 2015-10-17
|
||||||
|
|
||||||
* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
|
* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
|
||||||
* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken)
|
* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken)
|
||||||
* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie)
|
* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie)
|
||||||
* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion)
|
* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion)
|
||||||
|
|
||||||
## v1.2.1 / 2015-10-14
|
## [1.2.1] - 2015-10-14
|
||||||
|
|
||||||
* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx)
|
* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx)
|
||||||
|
|
||||||
## v1.2.0 / 2015-02-08
|
## [1.2.0] - 2015-02-08
|
||||||
|
|
||||||
* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD)
|
* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD)
|
||||||
* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD)
|
* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD)
|
||||||
* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59)
|
* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59)
|
||||||
|
|
||||||
## v1.1.1 / 2015-02-05
|
## [1.1.1] - 2015-02-05
|
||||||
|
|
||||||
* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD)
|
* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD)
|
||||||
|
|
||||||
## v1.1.0 / 2014-12-12
|
## [1.1.0] - 2014-12-12
|
||||||
|
|
||||||
* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43)
|
* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43)
|
||||||
* add low-level functions
|
* add low-level functions
|
||||||
@@ -77,22 +99,22 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
|
|||||||
* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48)
|
* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48)
|
||||||
* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
|
* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
|
||||||
|
|
||||||
## v1.0.4 / 2014-09-07
|
## [1.0.4] - 2014-09-07
|
||||||
|
|
||||||
* kqueue: add dragonfly to the build tags.
|
* kqueue: add dragonfly to the build tags.
|
||||||
* Rename source code files, rearrange code so exported APIs are at the top.
|
* Rename source code files, rearrange code so exported APIs are at the top.
|
||||||
* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang)
|
* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang)
|
||||||
|
|
||||||
## v1.0.3 / 2014-08-19
|
## [1.0.3] - 2014-08-19
|
||||||
|
|
||||||
* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36)
|
* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36)
|
||||||
|
|
||||||
## v1.0.2 / 2014-08-17
|
## [1.0.2] - 2014-08-17
|
||||||
|
|
||||||
* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
|
* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
|
||||||
* [Fix] Make ./path and path equivalent. (thanks @zhsso)
|
* [Fix] Make ./path and path equivalent. (thanks @zhsso)
|
||||||
|
|
||||||
## v1.0.0 / 2014-08-15
|
## [1.0.0] - 2014-08-15
|
||||||
|
|
||||||
* [API] Remove AddWatch on Windows, use Add.
|
* [API] Remove AddWatch on Windows, use Add.
|
||||||
* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30)
|
* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30)
|
||||||
@@ -146,51 +168,51 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
|
|||||||
* no tests for the current implementation
|
* no tests for the current implementation
|
||||||
* not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
|
* not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
|
||||||
|
|
||||||
## v0.9.3 / 2014-12-31
|
## [0.9.3] - 2014-12-31
|
||||||
|
|
||||||
* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
|
* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
|
||||||
|
|
||||||
## v0.9.2 / 2014-08-17
|
## [0.9.2] - 2014-08-17
|
||||||
|
|
||||||
* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
|
* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
|
||||||
|
|
||||||
## v0.9.1 / 2014-06-12
|
## [0.9.1] - 2014-06-12
|
||||||
|
|
||||||
* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
|
* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
|
||||||
|
|
||||||
## v0.9.0 / 2014-01-17
|
## [0.9.0] - 2014-01-17
|
||||||
|
|
||||||
* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
|
* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
|
||||||
* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
|
* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
|
||||||
* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
|
* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
|
||||||
|
|
||||||
## v0.8.12 / 2013-11-13
|
## [0.8.12] - 2013-11-13
|
||||||
|
|
||||||
* [API] Remove FD_SET and friends from Linux adapter
|
* [API] Remove FD_SET and friends from Linux adapter
|
||||||
|
|
||||||
## v0.8.11 / 2013-11-02
|
## [0.8.11] - 2013-11-02
|
||||||
|
|
||||||
* [Doc] Add Changelog [#72][] (thanks @nathany)
|
* [Doc] Add Changelog [#72][] (thanks @nathany)
|
||||||
* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond)
|
* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond)
|
||||||
|
|
||||||
## v0.8.10 / 2013-10-19
|
## [0.8.10] - 2013-10-19
|
||||||
|
|
||||||
* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
|
* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
|
||||||
* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
|
* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
|
||||||
* [Doc] specify OS-specific limits in README (thanks @debrando)
|
* [Doc] specify OS-specific limits in README (thanks @debrando)
|
||||||
|
|
||||||
## v0.8.9 / 2013-09-08
|
## [0.8.9] - 2013-09-08
|
||||||
|
|
||||||
* [Doc] Contributing (thanks @nathany)
|
* [Doc] Contributing (thanks @nathany)
|
||||||
* [Doc] update package path in example code [#63][] (thanks @paulhammond)
|
* [Doc] update package path in example code [#63][] (thanks @paulhammond)
|
||||||
* [Doc] GoCI badge in README (Linux only) [#60][]
|
* [Doc] GoCI badge in README (Linux only) [#60][]
|
||||||
* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany)
|
* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany)
|
||||||
|
|
||||||
## v0.8.8 / 2013-06-17
|
## [0.8.8] - 2013-06-17
|
||||||
|
|
||||||
* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
|
* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
|
||||||
|
|
||||||
## v0.8.7 / 2013-06-03
|
## [0.8.7] - 2013-06-03
|
||||||
|
|
||||||
* [API] Make syscall flags internal
|
* [API] Make syscall flags internal
|
||||||
* [Fix] inotify: ignore event changes
|
* [Fix] inotify: ignore event changes
|
||||||
@@ -198,74 +220,74 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
|
|||||||
* [Fix] tests on Windows
|
* [Fix] tests on Windows
|
||||||
* lower case error messages
|
* lower case error messages
|
||||||
|
|
||||||
## v0.8.6 / 2013-05-23
|
## [0.8.6] - 2013-05-23
|
||||||
|
|
||||||
* kqueue: Use EVT_ONLY flag on Darwin
|
* kqueue: Use EVT_ONLY flag on Darwin
|
||||||
* [Doc] Update README with full example
|
* [Doc] Update README with full example
|
||||||
|
|
||||||
## v0.8.5 / 2013-05-09
|
## [0.8.5] - 2013-05-09
|
||||||
|
|
||||||
* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
|
* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
|
||||||
|
|
||||||
## v0.8.4 / 2013-04-07
|
## [0.8.4] - 2013-04-07
|
||||||
|
|
||||||
* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
|
* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
|
||||||
|
|
||||||
## v0.8.3 / 2013-03-13
|
## [0.8.3] - 2013-03-13
|
||||||
|
|
||||||
* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
|
* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
|
||||||
* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
|
* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
|
||||||
|
|
||||||
## v0.8.2 / 2013-02-07
|
## [0.8.2] - 2013-02-07
|
||||||
|
|
||||||
* [Doc] add Authors
|
* [Doc] add Authors
|
||||||
* [Fix] fix data races for map access [#29][] (thanks @fsouza)
|
* [Fix] fix data races for map access [#29][] (thanks @fsouza)
|
||||||
|
|
||||||
## v0.8.1 / 2013-01-09
|
## [0.8.1] - 2013-01-09
|
||||||
|
|
||||||
* [Fix] Windows path separators
|
* [Fix] Windows path separators
|
||||||
* [Doc] BSD License
|
* [Doc] BSD License
|
||||||
|
|
||||||
## v0.8.0 / 2012-11-09
|
## [0.8.0] - 2012-11-09
|
||||||
|
|
||||||
* kqueue: directory watching improvements (thanks @vmirage)
|
* kqueue: directory watching improvements (thanks @vmirage)
|
||||||
* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
|
* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
|
||||||
* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
|
* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
|
||||||
|
|
||||||
## v0.7.4 / 2012-10-09
|
## [0.7.4] - 2012-10-09
|
||||||
|
|
||||||
* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
|
* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
|
||||||
* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
|
* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
|
||||||
* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
|
* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
|
||||||
* [Fix] kqueue: modify after recreation of file
|
* [Fix] kqueue: modify after recreation of file
|
||||||
|
|
||||||
## v0.7.3 / 2012-09-27
|
## [0.7.3] - 2012-09-27
|
||||||
|
|
||||||
* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
|
* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
|
||||||
* [Fix] kqueue: no longer get duplicate CREATE events
|
* [Fix] kqueue: no longer get duplicate CREATE events
|
||||||
|
|
||||||
## v0.7.2 / 2012-09-01
|
## [0.7.2] - 2012-09-01
|
||||||
|
|
||||||
* kqueue: events for created directories
|
* kqueue: events for created directories
|
||||||
|
|
||||||
## v0.7.1 / 2012-07-14
|
## [0.7.1] - 2012-07-14
|
||||||
|
|
||||||
* [Fix] for renaming files
|
* [Fix] for renaming files
|
||||||
|
|
||||||
## v0.7.0 / 2012-07-02
|
## [0.7.0] - 2012-07-02
|
||||||
|
|
||||||
* [Feature] FSNotify flags
|
* [Feature] FSNotify flags
|
||||||
* [Fix] inotify: Added file name back to event path
|
* [Fix] inotify: Added file name back to event path
|
||||||
|
|
||||||
## v0.6.0 / 2012-06-06
|
## [0.6.0] - 2012-06-06
|
||||||
|
|
||||||
* kqueue: watch files after directory created (thanks @tmc)
|
* kqueue: watch files after directory created (thanks @tmc)
|
||||||
|
|
||||||
## v0.5.1 / 2012-05-22
|
## [0.5.1] - 2012-05-22
|
||||||
|
|
||||||
* [Fix] inotify: remove all watches before Close()
|
* [Fix] inotify: remove all watches before Close()
|
||||||
|
|
||||||
## v0.5.0 / 2012-05-03
|
## [0.5.0] - 2012-05-03
|
||||||
|
|
||||||
* [API] kqueue: return errors during watch instead of sending over channel
|
* [API] kqueue: return errors during watch instead of sending over channel
|
||||||
* kqueue: match symlink behavior on Linux
|
* kqueue: match symlink behavior on Linux
|
||||||
@@ -273,22 +295,22 @@ kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsn
|
|||||||
* [Fix] kqueue: handle EINTR (reported by @robfig)
|
* [Fix] kqueue: handle EINTR (reported by @robfig)
|
||||||
* [Doc] Godoc example [#1][] (thanks @davecheney)
|
* [Doc] Godoc example [#1][] (thanks @davecheney)
|
||||||
|
|
||||||
## v0.4.0 / 2012-03-30
|
## [0.4.0] - 2012-03-30
|
||||||
|
|
||||||
* Go 1 released: build with go tool
|
* Go 1 released: build with go tool
|
||||||
* [Feature] Windows support using winfsnotify
|
* [Feature] Windows support using winfsnotify
|
||||||
* Windows does not have attribute change notifications
|
* Windows does not have attribute change notifications
|
||||||
* Roll attribute notifications into IsModify
|
* Roll attribute notifications into IsModify
|
||||||
|
|
||||||
## v0.3.0 / 2012-02-19
|
## [0.3.0] - 2012-02-19
|
||||||
|
|
||||||
* kqueue: add files when watch directory
|
* kqueue: add files when watch directory
|
||||||
|
|
||||||
## v0.2.0 / 2011-12-30
|
## [0.2.0] - 2011-12-30
|
||||||
|
|
||||||
* update to latest Go weekly code
|
* update to latest Go weekly code
|
||||||
|
|
||||||
## v0.1.0 / 2011-10-19
|
## [0.1.0] - 2011-10-19
|
||||||
|
|
||||||
* kqueue: add watch on file creation to match inotify
|
* kqueue: add watch on file creation to match inotify
|
||||||
* kqueue: create file event
|
* kqueue: create file event
|
||||||
|
|||||||
2
vendor/github.com/fsnotify/fsnotify/LICENSE
generated
vendored
2
vendor/github.com/fsnotify/fsnotify/LICENSE
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
Copyright (c) 2012 The Go Authors. All rights reserved.
|
Copyright (c) 2012 The Go Authors. All rights reserved.
|
||||||
Copyright (c) 2012 fsnotify Authors. All rights reserved.
|
Copyright (c) 2012-2019 fsnotify Authors. All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions are
|
modification, are permitted provided that the following conditions are
|
||||||
|
|||||||
71
vendor/github.com/fsnotify/fsnotify/README.md
generated
vendored
71
vendor/github.com/fsnotify/fsnotify/README.md
generated
vendored
@@ -10,16 +10,16 @@ go get -u golang.org/x/sys/...
|
|||||||
|
|
||||||
Cross platform: Windows, Linux, BSD and macOS.
|
Cross platform: Windows, Linux, BSD and macOS.
|
||||||
|
|
||||||
|Adapter |OS |Status |
|
| Adapter | OS | Status |
|
||||||
|----------|----------|----------|
|
| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|inotify |Linux 2.6.27 or later, Android\*|Supported [](https://travis-ci.org/fsnotify/fsnotify)|
|
| inotify | Linux 2.6.27 or later, Android\* | Supported |
|
||||||
|kqueue |BSD, macOS, iOS\*|Supported [](https://travis-ci.org/fsnotify/fsnotify)|
|
| kqueue | BSD, macOS, iOS\* | Supported |
|
||||||
|ReadDirectoryChangesW|Windows|Supported [](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
|
| ReadDirectoryChangesW | Windows | Supported |
|
||||||
|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)|
|
| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) |
|
||||||
|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)|
|
| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/issues/12) |
|
||||||
|fanotify |Linux 2.6.37+ | |
|
| fanotify | Linux 2.6.37+ | [Planned](https://github.com/fsnotify/fsnotify/issues/114) |
|
||||||
|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)|
|
| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) |
|
||||||
|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)|
|
| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) |
|
||||||
|
|
||||||
\* Android and iOS are untested.
|
\* Android and iOS are untested.
|
||||||
|
|
||||||
@@ -33,6 +33,53 @@ All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based o
|
|||||||
|
|
||||||
Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
|
Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/fsnotify/fsnotify"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
watcher, err := fsnotify.NewWatcher()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer watcher.Close()
|
||||||
|
|
||||||
|
done := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case event, ok := <-watcher.Events:
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Println("event:", event)
|
||||||
|
if event.Op&fsnotify.Write == fsnotify.Write {
|
||||||
|
log.Println("modified file:", event.Name)
|
||||||
|
}
|
||||||
|
case err, ok := <-watcher.Errors:
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Println("error:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = watcher.Add("/tmp/foo")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
<-done
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Please refer to [CONTRIBUTING][] before opening an issue or pull request.
|
Please refer to [CONTRIBUTING][] before opening an issue or pull request.
|
||||||
@@ -65,6 +112,10 @@ There are OS-specific limits as to how many watches can be created:
|
|||||||
* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
|
* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
|
||||||
* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
|
* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
|
||||||
|
|
||||||
|
**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?**
|
||||||
|
|
||||||
|
fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications.
|
||||||
|
|
||||||
[#62]: https://github.com/howeyc/fsnotify/issues/62
|
[#62]: https://github.com/howeyc/fsnotify/issues/62
|
||||||
[#18]: https://github.com/fsnotify/fsnotify/issues/18
|
[#18]: https://github.com/fsnotify/fsnotify/issues/18
|
||||||
[#11]: https://github.com/fsnotify/fsnotify/issues/11
|
[#11]: https://github.com/fsnotify/fsnotify/issues/11
|
||||||
|
|||||||
1
vendor/github.com/fsnotify/fsnotify/fen.go
generated
vendored
1
vendor/github.com/fsnotify/fsnotify/fen.go
generated
vendored
@@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build solaris
|
||||||
// +build solaris
|
// +build solaris
|
||||||
|
|
||||||
package fsnotify
|
package fsnotify
|
||||||
|
|||||||
5
vendor/github.com/fsnotify/fsnotify/fsnotify.go
generated
vendored
5
vendor/github.com/fsnotify/fsnotify/fsnotify.go
generated
vendored
@@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build !plan9
|
||||||
// +build !plan9
|
// +build !plan9
|
||||||
|
|
||||||
// Package fsnotify provides a platform-independent interface for file system notifications.
|
// Package fsnotify provides a platform-independent interface for file system notifications.
|
||||||
@@ -63,4 +64,6 @@ func (e Event) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Common errors that can be reported by a watcher
|
// Common errors that can be reported by a watcher
|
||||||
var ErrEventOverflow = errors.New("fsnotify queue overflow")
|
var (
|
||||||
|
ErrEventOverflow = errors.New("fsnotify queue overflow")
|
||||||
|
)
|
||||||
|
|||||||
3
vendor/github.com/fsnotify/fsnotify/inotify.go
generated
vendored
3
vendor/github.com/fsnotify/fsnotify/inotify.go
generated
vendored
@@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build linux
|
||||||
// +build linux
|
// +build linux
|
||||||
|
|
||||||
package fsnotify
|
package fsnotify
|
||||||
@@ -272,7 +273,7 @@ func (w *Watcher) readEvents() {
|
|||||||
|
|
||||||
if nameLen > 0 {
|
if nameLen > 0 {
|
||||||
// Point "bytes" at the first byte of the filename
|
// Point "bytes" at the first byte of the filename
|
||||||
bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))
|
bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))[:nameLen:nameLen]
|
||||||
// The filename is padded with NULL bytes. TrimRight() gets rid of those.
|
// The filename is padded with NULL bytes. TrimRight() gets rid of those.
|
||||||
name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
|
name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
|
||||||
}
|
}
|
||||||
|
|||||||
5
vendor/github.com/fsnotify/fsnotify/inotify_poller.go
generated
vendored
5
vendor/github.com/fsnotify/fsnotify/inotify_poller.go
generated
vendored
@@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build linux
|
||||||
// +build linux
|
// +build linux
|
||||||
|
|
||||||
package fsnotify
|
package fsnotify
|
||||||
@@ -40,12 +41,12 @@ func newFdPoller(fd int) (*fdPoller, error) {
|
|||||||
poller.fd = fd
|
poller.fd = fd
|
||||||
|
|
||||||
// Create epoll fd
|
// Create epoll fd
|
||||||
poller.epfd, errno = unix.EpollCreate1(0)
|
poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC)
|
||||||
if poller.epfd == -1 {
|
if poller.epfd == -1 {
|
||||||
return nil, errno
|
return nil, errno
|
||||||
}
|
}
|
||||||
// Create pipe; pipe[0] is the read end, pipe[1] the write end.
|
// Create pipe; pipe[0] is the read end, pipe[1] the write end.
|
||||||
errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK)
|
errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC)
|
||||||
if errno != nil {
|
if errno != nil {
|
||||||
return nil, errno
|
return nil, errno
|
||||||
}
|
}
|
||||||
|
|||||||
1
vendor/github.com/fsnotify/fsnotify/kqueue.go
generated
vendored
1
vendor/github.com/fsnotify/fsnotify/kqueue.go
generated
vendored
@@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build freebsd || openbsd || netbsd || dragonfly || darwin
|
||||||
// +build freebsd openbsd netbsd dragonfly darwin
|
// +build freebsd openbsd netbsd dragonfly darwin
|
||||||
|
|
||||||
package fsnotify
|
package fsnotify
|
||||||
|
|||||||
3
vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
generated
vendored
3
vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
generated
vendored
@@ -2,10 +2,11 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build freebsd || openbsd || netbsd || dragonfly
|
||||||
// +build freebsd openbsd netbsd dragonfly
|
// +build freebsd openbsd netbsd dragonfly
|
||||||
|
|
||||||
package fsnotify
|
package fsnotify
|
||||||
|
|
||||||
import "golang.org/x/sys/unix"
|
import "golang.org/x/sys/unix"
|
||||||
|
|
||||||
const openMode = unix.O_NONBLOCK | unix.O_RDONLY
|
const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC
|
||||||
|
|||||||
3
vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
generated
vendored
3
vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
generated
vendored
@@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build darwin
|
||||||
// +build darwin
|
// +build darwin
|
||||||
|
|
||||||
package fsnotify
|
package fsnotify
|
||||||
@@ -9,4 +10,4 @@ package fsnotify
|
|||||||
import "golang.org/x/sys/unix"
|
import "golang.org/x/sys/unix"
|
||||||
|
|
||||||
// note: this constant is not defined on BSD
|
// note: this constant is not defined on BSD
|
||||||
const openMode = unix.O_EVTONLY
|
const openMode = unix.O_EVTONLY | unix.O_CLOEXEC
|
||||||
|
|||||||
1
vendor/github.com/fsnotify/fsnotify/windows.go
generated
vendored
1
vendor/github.com/fsnotify/fsnotify/windows.go
generated
vendored
@@ -2,6 +2,7 @@
|
|||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//go:build windows
|
||||||
// +build windows
|
// +build windows
|
||||||
|
|
||||||
package fsnotify
|
package fsnotify
|
||||||
|
|||||||
32
vendor/github.com/json-iterator/go/README.md
generated
vendored
32
vendor/github.com/json-iterator/go/README.md
generated
vendored
@@ -1,5 +1,5 @@
|
|||||||
[](https://sourcegraph.com/github.com/json-iterator/go?badge)
|
[](https://sourcegraph.com/github.com/json-iterator/go?badge)
|
||||||
[](http://godoc.org/github.com/json-iterator/go)
|
[](https://pkg.go.dev/github.com/json-iterator/go)
|
||||||
[](https://travis-ci.org/json-iterator/go)
|
[](https://travis-ci.org/json-iterator/go)
|
||||||
[](https://codecov.io/gh/json-iterator/go)
|
[](https://codecov.io/gh/json-iterator/go)
|
||||||
[](https://goreportcard.com/report/github.com/json-iterator/go)
|
[](https://goreportcard.com/report/github.com/json-iterator/go)
|
||||||
@@ -18,14 +18,14 @@ Source code: https://github.com/json-iterator/go-benchmark/blob/master/src/githu
|
|||||||
|
|
||||||
Raw Result (easyjson requires static code generation)
|
Raw Result (easyjson requires static code generation)
|
||||||
|
|
||||||
| | ns/op | allocation bytes | allocation times |
|
| | ns/op | allocation bytes | allocation times |
|
||||||
| --- | --- | --- | --- |
|
| --------------- | ----------- | ---------------- | ---------------- |
|
||||||
| std decode | 35510 ns/op | 1960 B/op | 99 allocs/op |
|
| std decode | 35510 ns/op | 1960 B/op | 99 allocs/op |
|
||||||
| easyjson decode | 8499 ns/op | 160 B/op | 4 allocs/op |
|
| easyjson decode | 8499 ns/op | 160 B/op | 4 allocs/op |
|
||||||
| jsoniter decode | 5623 ns/op | 160 B/op | 3 allocs/op |
|
| jsoniter decode | 5623 ns/op | 160 B/op | 3 allocs/op |
|
||||||
| std encode | 2213 ns/op | 712 B/op | 5 allocs/op |
|
| std encode | 2213 ns/op | 712 B/op | 5 allocs/op |
|
||||||
| easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op |
|
| easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op |
|
||||||
| jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op |
|
| jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op |
|
||||||
|
|
||||||
Always benchmark with your own workload.
|
Always benchmark with your own workload.
|
||||||
The result depends heavily on the data input.
|
The result depends heavily on the data input.
|
||||||
@@ -44,7 +44,7 @@ json.Marshal(&data)
|
|||||||
with
|
with
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "github.com/json-iterator/go"
|
import jsoniter "github.com/json-iterator/go"
|
||||||
|
|
||||||
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||||
json.Marshal(&data)
|
json.Marshal(&data)
|
||||||
@@ -60,7 +60,7 @@ json.Unmarshal(input, &data)
|
|||||||
with
|
with
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import "github.com/json-iterator/go"
|
import jsoniter "github.com/json-iterator/go"
|
||||||
|
|
||||||
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||||
json.Unmarshal(input, &data)
|
json.Unmarshal(input, &data)
|
||||||
@@ -78,10 +78,10 @@ go get github.com/json-iterator/go
|
|||||||
|
|
||||||
Contributors
|
Contributors
|
||||||
|
|
||||||
* [thockin](https://github.com/thockin)
|
- [thockin](https://github.com/thockin)
|
||||||
* [mattn](https://github.com/mattn)
|
- [mattn](https://github.com/mattn)
|
||||||
* [cch123](https://github.com/cch123)
|
- [cch123](https://github.com/cch123)
|
||||||
* [Oleg Shaldybin](https://github.com/olegshaldybin)
|
- [Oleg Shaldybin](https://github.com/olegshaldybin)
|
||||||
* [Jason Toffaletti](https://github.com/toffaletti)
|
- [Jason Toffaletti](https://github.com/toffaletti)
|
||||||
|
|
||||||
Report issue or pull request, or email taowen@gmail.com, or [](https://gitter.im/json-iterator/Lobby)
|
Report issue or pull request, or email taowen@gmail.com, or [](https://gitter.im/json-iterator/Lobby)
|
||||||
|
|||||||
4
vendor/github.com/json-iterator/go/any_str.go
generated
vendored
4
vendor/github.com/json-iterator/go/any_str.go
generated
vendored
@@ -64,7 +64,6 @@ func (any *stringAny) ToInt64() int64 {
|
|||||||
|
|
||||||
flag := 1
|
flag := 1
|
||||||
startPos := 0
|
startPos := 0
|
||||||
endPos := 0
|
|
||||||
if any.val[0] == '+' || any.val[0] == '-' {
|
if any.val[0] == '+' || any.val[0] == '-' {
|
||||||
startPos = 1
|
startPos = 1
|
||||||
}
|
}
|
||||||
@@ -73,6 +72,7 @@ func (any *stringAny) ToInt64() int64 {
|
|||||||
flag = -1
|
flag = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
endPos := startPos
|
||||||
for i := startPos; i < len(any.val); i++ {
|
for i := startPos; i < len(any.val); i++ {
|
||||||
if any.val[i] >= '0' && any.val[i] <= '9' {
|
if any.val[i] >= '0' && any.val[i] <= '9' {
|
||||||
endPos = i + 1
|
endPos = i + 1
|
||||||
@@ -98,7 +98,6 @@ func (any *stringAny) ToUint64() uint64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
startPos := 0
|
startPos := 0
|
||||||
endPos := 0
|
|
||||||
|
|
||||||
if any.val[0] == '-' {
|
if any.val[0] == '-' {
|
||||||
return 0
|
return 0
|
||||||
@@ -107,6 +106,7 @@ func (any *stringAny) ToUint64() uint64 {
|
|||||||
startPos = 1
|
startPos = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
endPos := startPos
|
||||||
for i := startPos; i < len(any.val); i++ {
|
for i := startPos; i < len(any.val); i++ {
|
||||||
if any.val[i] >= '0' && any.val[i] <= '9' {
|
if any.val[i] >= '0' && any.val[i] <= '9' {
|
||||||
endPos = i + 1
|
endPos = i + 1
|
||||||
|
|||||||
4
vendor/github.com/json-iterator/go/config.go
generated
vendored
4
vendor/github.com/json-iterator/go/config.go
generated
vendored
@@ -183,11 +183,11 @@ func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) {
|
|||||||
encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) {
|
encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) {
|
||||||
rawMessage := *(*json.RawMessage)(ptr)
|
rawMessage := *(*json.RawMessage)(ptr)
|
||||||
iter := cfg.BorrowIterator([]byte(rawMessage))
|
iter := cfg.BorrowIterator([]byte(rawMessage))
|
||||||
|
defer cfg.ReturnIterator(iter)
|
||||||
iter.Read()
|
iter.Read()
|
||||||
if iter.Error != nil {
|
if iter.Error != nil && iter.Error != io.EOF {
|
||||||
stream.WriteRaw("null")
|
stream.WriteRaw("null")
|
||||||
} else {
|
} else {
|
||||||
cfg.ReturnIterator(iter)
|
|
||||||
stream.WriteRaw(string(rawMessage))
|
stream.WriteRaw(string(rawMessage))
|
||||||
}
|
}
|
||||||
}, func(ptr unsafe.Pointer) bool {
|
}, func(ptr unsafe.Pointer) bool {
|
||||||
|
|||||||
3
vendor/github.com/json-iterator/go/iter_float.go
generated
vendored
3
vendor/github.com/json-iterator/go/iter_float.go
generated
vendored
@@ -288,6 +288,9 @@ non_decimal_loop:
|
|||||||
return iter.readFloat64SlowPath()
|
return iter.readFloat64SlowPath()
|
||||||
}
|
}
|
||||||
value = (value << 3) + (value << 1) + uint64(ind)
|
value = (value << 3) + (value << 1) + uint64(ind)
|
||||||
|
if value > maxFloat64 {
|
||||||
|
return iter.readFloat64SlowPath()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return iter.readFloat64SlowPath()
|
return iter.readFloat64SlowPath()
|
||||||
|
|||||||
3
vendor/github.com/json-iterator/go/iter_int.go
generated
vendored
3
vendor/github.com/json-iterator/go/iter_int.go
generated
vendored
@@ -9,6 +9,7 @@ var intDigits []int8
|
|||||||
|
|
||||||
const uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 1
|
const uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 1
|
||||||
const uint64SafeToMultiple10 = uint64(0xffffffffffffffff)/10 - 1
|
const uint64SafeToMultiple10 = uint64(0xffffffffffffffff)/10 - 1
|
||||||
|
const maxFloat64 = 1<<53 - 1
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
intDigits = make([]int8, 256)
|
intDigits = make([]int8, 256)
|
||||||
@@ -339,7 +340,7 @@ func (iter *Iterator) readUint64(c byte) (ret uint64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (iter *Iterator) assertInteger() {
|
func (iter *Iterator) assertInteger() {
|
||||||
if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' {
|
if iter.head < iter.tail && iter.buf[iter.head] == '.' {
|
||||||
iter.ReportError("assertInteger", "can not decode float as int")
|
iter.ReportError("assertInteger", "can not decode float as int")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
vendor/github.com/json-iterator/go/iter_object.go
generated
vendored
4
vendor/github.com/json-iterator/go/iter_object.go
generated
vendored
@@ -150,7 +150,7 @@ func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool {
|
|||||||
if c == '}' {
|
if c == '}' {
|
||||||
return iter.decrementDepth()
|
return iter.decrementDepth()
|
||||||
}
|
}
|
||||||
iter.ReportError("ReadObjectCB", `expect " after }, but found `+string([]byte{c}))
|
iter.ReportError("ReadObjectCB", `expect " after {, but found `+string([]byte{c}))
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -206,7 +206,7 @@ func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool {
|
|||||||
if c == '}' {
|
if c == '}' {
|
||||||
return iter.decrementDepth()
|
return iter.decrementDepth()
|
||||||
}
|
}
|
||||||
iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c}))
|
iter.ReportError("ReadMapCB", `expect " after {, but found `+string([]byte{c}))
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
2
vendor/github.com/json-iterator/go/reflect.go
generated
vendored
2
vendor/github.com/json-iterator/go/reflect.go
generated
vendored
@@ -65,7 +65,7 @@ func (iter *Iterator) ReadVal(obj interface{}) {
|
|||||||
decoder := iter.cfg.getDecoderFromCache(cacheKey)
|
decoder := iter.cfg.getDecoderFromCache(cacheKey)
|
||||||
if decoder == nil {
|
if decoder == nil {
|
||||||
typ := reflect2.TypeOf(obj)
|
typ := reflect2.TypeOf(obj)
|
||||||
if typ.Kind() != reflect.Ptr {
|
if typ == nil || typ.Kind() != reflect.Ptr {
|
||||||
iter.ReportError("ReadVal", "can only unmarshal into pointer")
|
iter.ReportError("ReadVal", "can only unmarshal into pointer")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
2
vendor/github.com/json-iterator/go/reflect_extension.go
generated
vendored
2
vendor/github.com/json-iterator/go/reflect_extension.go
generated
vendored
@@ -475,7 +475,7 @@ func calcFieldNames(originalFieldName string, tagProvidedFieldName string, whole
|
|||||||
fieldNames = []string{tagProvidedFieldName}
|
fieldNames = []string{tagProvidedFieldName}
|
||||||
}
|
}
|
||||||
// private?
|
// private?
|
||||||
isNotExported := unicode.IsLower(rune(originalFieldName[0]))
|
isNotExported := unicode.IsLower(rune(originalFieldName[0])) || originalFieldName[0] == '_'
|
||||||
if isNotExported {
|
if isNotExported {
|
||||||
fieldNames = []string{}
|
fieldNames = []string{}
|
||||||
}
|
}
|
||||||
|
|||||||
24
vendor/github.com/json-iterator/go/reflect_json_raw_message.go
generated
vendored
24
vendor/github.com/json-iterator/go/reflect_json_raw_message.go
generated
vendored
@@ -33,11 +33,19 @@ type jsonRawMessageCodec struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
*((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes())
|
if iter.ReadNil() {
|
||||||
|
*((*json.RawMessage)(ptr)) = nil
|
||||||
|
} else {
|
||||||
|
*((*json.RawMessage)(ptr)) = iter.SkipAndReturnBytes()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
||||||
stream.WriteRaw(string(*((*json.RawMessage)(ptr))))
|
if *((*json.RawMessage)(ptr)) == nil {
|
||||||
|
stream.WriteNil()
|
||||||
|
} else {
|
||||||
|
stream.WriteRaw(string(*((*json.RawMessage)(ptr))))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
||||||
@@ -48,11 +56,19 @@ type jsoniterRawMessageCodec struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
*((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes())
|
if iter.ReadNil() {
|
||||||
|
*((*RawMessage)(ptr)) = nil
|
||||||
|
} else {
|
||||||
|
*((*RawMessage)(ptr)) = iter.SkipAndReturnBytes()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
||||||
stream.WriteRaw(string(*((*RawMessage)(ptr))))
|
if *((*RawMessage)(ptr)) == nil {
|
||||||
|
stream.WriteNil()
|
||||||
|
} else {
|
||||||
|
stream.WriteRaw(string(*((*RawMessage)(ptr))))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
||||||
|
|||||||
80
vendor/github.com/json-iterator/go/reflect_map.go
generated
vendored
80
vendor/github.com/json-iterator/go/reflect_map.go
generated
vendored
@@ -49,6 +49,33 @@ func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
|
|||||||
return decoder
|
return decoder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ptrType := reflect2.PtrTo(typ)
|
||||||
|
if ptrType.Implements(unmarshalerType) {
|
||||||
|
return &referenceDecoder{
|
||||||
|
&unmarshalerDecoder{
|
||||||
|
valType: ptrType,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if typ.Implements(unmarshalerType) {
|
||||||
|
return &unmarshalerDecoder{
|
||||||
|
valType: typ,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ptrType.Implements(textUnmarshalerType) {
|
||||||
|
return &referenceDecoder{
|
||||||
|
&textUnmarshalerDecoder{
|
||||||
|
valType: ptrType,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if typ.Implements(textUnmarshalerType) {
|
||||||
|
return &textUnmarshalerDecoder{
|
||||||
|
valType: typ,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch typ.Kind() {
|
switch typ.Kind() {
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
||||||
@@ -63,31 +90,6 @@ func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
|
|||||||
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
||||||
return &numericMapKeyDecoder{decoderOfType(ctx, typ)}
|
return &numericMapKeyDecoder{decoderOfType(ctx, typ)}
|
||||||
default:
|
default:
|
||||||
ptrType := reflect2.PtrTo(typ)
|
|
||||||
if ptrType.Implements(unmarshalerType) {
|
|
||||||
return &referenceDecoder{
|
|
||||||
&unmarshalerDecoder{
|
|
||||||
valType: ptrType,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typ.Implements(unmarshalerType) {
|
|
||||||
return &unmarshalerDecoder{
|
|
||||||
valType: typ,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ptrType.Implements(textUnmarshalerType) {
|
|
||||||
return &referenceDecoder{
|
|
||||||
&textUnmarshalerDecoder{
|
|
||||||
valType: ptrType,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typ.Implements(textUnmarshalerType) {
|
|
||||||
return &textUnmarshalerDecoder{
|
|
||||||
valType: typ,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
|
return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,6 +105,19 @@ func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
|
|||||||
return encoder
|
return encoder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if typ == textMarshalerType {
|
||||||
|
return &directTextMarshalerEncoder{
|
||||||
|
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if typ.Implements(textMarshalerType) {
|
||||||
|
return &textMarshalerEncoder{
|
||||||
|
valType: typ,
|
||||||
|
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch typ.Kind() {
|
switch typ.Kind() {
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
||||||
@@ -117,17 +132,6 @@ func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
|
|||||||
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
||||||
return &numericMapKeyEncoder{encoderOfType(ctx, typ)}
|
return &numericMapKeyEncoder{encoderOfType(ctx, typ)}
|
||||||
default:
|
default:
|
||||||
if typ == textMarshalerType {
|
|
||||||
return &directTextMarshalerEncoder{
|
|
||||||
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typ.Implements(textMarshalerType) {
|
|
||||||
return &textMarshalerEncoder{
|
|
||||||
valType: typ,
|
|
||||||
stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if typ.Kind() == reflect.Interface {
|
if typ.Kind() == reflect.Interface {
|
||||||
return &dynamicMapKeyEncoder{ctx, typ}
|
return &dynamicMapKeyEncoder{ctx, typ}
|
||||||
}
|
}
|
||||||
@@ -163,10 +167,6 @@ func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
|||||||
if c == '}' {
|
if c == '}' {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if c != '"' {
|
|
||||||
iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c}))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
iter.unreadByte()
|
iter.unreadByte()
|
||||||
key := decoder.keyType.UnsafeNew()
|
key := decoder.keyType.UnsafeNew()
|
||||||
decoder.keyDecoder.Decode(key, iter)
|
decoder.keyDecoder.Decode(key, iter)
|
||||||
|
|||||||
4
vendor/github.com/json-iterator/go/reflect_optional.go
generated
vendored
4
vendor/github.com/json-iterator/go/reflect_optional.go
generated
vendored
@@ -2,7 +2,6 @@ package jsoniter
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/modern-go/reflect2"
|
"github.com/modern-go/reflect2"
|
||||||
"reflect"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -10,9 +9,6 @@ func decoderOfOptional(ctx *ctx, typ reflect2.Type) ValDecoder {
|
|||||||
ptrType := typ.(*reflect2.UnsafePtrType)
|
ptrType := typ.(*reflect2.UnsafePtrType)
|
||||||
elemType := ptrType.Elem()
|
elemType := ptrType.Elem()
|
||||||
decoder := decoderOfType(ctx, elemType)
|
decoder := decoderOfType(ctx, elemType)
|
||||||
if ctx.prefix == "" && elemType.Kind() == reflect.Ptr {
|
|
||||||
return &dereferenceDecoder{elemType, decoder}
|
|
||||||
}
|
|
||||||
return &OptionalDecoder{elemType, decoder}
|
return &OptionalDecoder{elemType, decoder}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
27
vendor/github.com/json-iterator/go/reflect_struct_decoder.go
generated
vendored
27
vendor/github.com/json-iterator/go/reflect_struct_decoder.go
generated
vendored
@@ -507,7 +507,7 @@ func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator)
|
|||||||
for c = ','; c == ','; c = iter.nextToken() {
|
for c = ','; c == ','; c = iter.nextToken() {
|
||||||
decoder.decodeOneField(ptr, iter)
|
decoder.decodeOneField(ptr, iter)
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
if c != '}' {
|
if c != '}' {
|
||||||
@@ -588,7 +588,7 @@ func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator)
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -622,7 +622,7 @@ func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -660,7 +660,7 @@ func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -702,7 +702,7 @@ func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -748,7 +748,7 @@ func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -798,7 +798,7 @@ func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -852,7 +852,7 @@ func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -910,7 +910,7 @@ func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -972,7 +972,7 @@ func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -1038,7 +1038,7 @@ func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if iter.Error != nil && iter.Error != io.EOF {
|
if iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {
|
||||||
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error())
|
||||||
}
|
}
|
||||||
iter.decrementDepth()
|
iter.decrementDepth()
|
||||||
@@ -1075,6 +1075,11 @@ type stringModeNumberDecoder struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
|
if iter.WhatIsNext() == NilValue {
|
||||||
|
decoder.elemDecoder.Decode(ptr, iter)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
if c != '"' {
|
if c != '"' {
|
||||||
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
|
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
|
||||||
|
|||||||
5
vendor/github.com/json-iterator/go/stream.go
generated
vendored
5
vendor/github.com/json-iterator/go/stream.go
generated
vendored
@@ -103,14 +103,14 @@ func (stream *Stream) Flush() error {
|
|||||||
if stream.Error != nil {
|
if stream.Error != nil {
|
||||||
return stream.Error
|
return stream.Error
|
||||||
}
|
}
|
||||||
n, err := stream.out.Write(stream.buf)
|
_, err := stream.out.Write(stream.buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if stream.Error == nil {
|
if stream.Error == nil {
|
||||||
stream.Error = err
|
stream.Error = err
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
stream.buf = stream.buf[n:]
|
stream.buf = stream.buf[:0]
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,7 +177,6 @@ func (stream *Stream) WriteEmptyObject() {
|
|||||||
func (stream *Stream) WriteMore() {
|
func (stream *Stream) WriteMore() {
|
||||||
stream.writeByte(',')
|
stream.writeByte(',')
|
||||||
stream.writeIndention(0)
|
stream.writeIndention(0)
|
||||||
stream.Flush()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteArrayStart write [ with possible indention
|
// WriteArrayStart write [ with possible indention
|
||||||
|
|||||||
5
vendor/github.com/magiconair/properties/.travis.yml
generated
vendored
5
vendor/github.com/magiconair/properties/.travis.yml
generated
vendored
@@ -1,5 +1,6 @@
|
|||||||
language: go
|
language: go
|
||||||
go:
|
go:
|
||||||
|
- 1.3.x
|
||||||
- 1.4.x
|
- 1.4.x
|
||||||
- 1.5.x
|
- 1.5.x
|
||||||
- 1.6.x
|
- 1.6.x
|
||||||
@@ -9,4 +10,8 @@ go:
|
|||||||
- "1.10.x"
|
- "1.10.x"
|
||||||
- "1.11.x"
|
- "1.11.x"
|
||||||
- "1.12.x"
|
- "1.12.x"
|
||||||
|
- "1.13.x"
|
||||||
|
- "1.14.x"
|
||||||
|
- "1.15.x"
|
||||||
|
- "1.16.x"
|
||||||
- tip
|
- tip
|
||||||
|
|||||||
23
vendor/github.com/magiconair/properties/CHANGELOG.md
generated
vendored
23
vendor/github.com/magiconair/properties/CHANGELOG.md
generated
vendored
@@ -1,8 +1,29 @@
|
|||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### [1.8.2](https://github.com/magiconair/properties/tree/v1.8.2) - 25 Aug 2020
|
||||||
|
|
||||||
|
* [PR #36](https://github.com/magiconair/properties/pull/36): Escape backslash on write
|
||||||
|
|
||||||
|
This patch ensures that backslashes are escaped on write. Existing applications which
|
||||||
|
rely on the old behavior may need to be updated.
|
||||||
|
|
||||||
|
Thanks to [@apesternikov](https://github.com/apesternikov) for the patch.
|
||||||
|
|
||||||
|
* [PR #42](https://github.com/magiconair/properties/pull/42): Made Content-Type check whitespace agnostic in LoadURL()
|
||||||
|
|
||||||
|
Thanks to [@aliras1](https://github.com/aliras1) for the patch.
|
||||||
|
|
||||||
|
* [PR #41](https://github.com/magiconair/properties/pull/41): Make key/value separator configurable on Write()
|
||||||
|
|
||||||
|
Thanks to [@mkjor](https://github.com/mkjor) for the patch.
|
||||||
|
|
||||||
|
* [PR #40](https://github.com/magiconair/properties/pull/40): Add method to return a sorted list of keys
|
||||||
|
|
||||||
|
Thanks to [@mkjor](https://github.com/mkjor) for the patch.
|
||||||
|
|
||||||
### [1.8.1](https://github.com/magiconair/properties/tree/v1.8.1) - 10 May 2019
|
### [1.8.1](https://github.com/magiconair/properties/tree/v1.8.1) - 10 May 2019
|
||||||
|
|
||||||
* [PR #26](https://github.com/magiconair/properties/pull/35): Close body always after request
|
* [PR #35](https://github.com/magiconair/properties/pull/35): Close body always after request
|
||||||
|
|
||||||
This patch ensures that in `LoadURL` the response body is always closed.
|
This patch ensures that in `LoadURL` the response body is always closed.
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
goproperties - properties file decoder for Go
|
Copyright (c) 2013-2020, Frank Schroeder
|
||||||
|
|
||||||
Copyright (c) 2013-2018 - Frank Schroeder
|
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions are met:
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
list of conditions and the following disclaimer.
|
list of conditions and the following disclaimer.
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
this list of conditions and the following disclaimer in the documentation
|
this list of conditions and the following disclaimer in the documentation
|
||||||
and/or other materials provided with the distribution.
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
1
vendor/github.com/magiconair/properties/README.md
generated
vendored
1
vendor/github.com/magiconair/properties/README.md
generated
vendored
@@ -1,6 +1,5 @@
|
|||||||
[](https://github.com/magiconair/properties/releases)
|
[](https://github.com/magiconair/properties/releases)
|
||||||
[](https://travis-ci.org/magiconair/properties)
|
[](https://travis-ci.org/magiconair/properties)
|
||||||
[](https://circleci.com/gh/magiconair/properties)
|
|
||||||
[](https://raw.githubusercontent.com/magiconair/properties/master/LICENSE)
|
[](https://raw.githubusercontent.com/magiconair/properties/master/LICENSE)
|
||||||
[](http://godoc.org/github.com/magiconair/properties)
|
[](http://godoc.org/github.com/magiconair/properties)
|
||||||
|
|
||||||
|
|||||||
5
vendor/github.com/magiconair/properties/load.go
generated
vendored
5
vendor/github.com/magiconair/properties/load.go
generated
vendored
@@ -132,11 +132,12 @@ func (l *Loader) LoadURL(url string) (*Properties, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ct := resp.Header.Get("Content-Type")
|
ct := resp.Header.Get("Content-Type")
|
||||||
|
ct = strings.Join(strings.Fields(ct), "")
|
||||||
var enc Encoding
|
var enc Encoding
|
||||||
switch strings.ToLower(ct) {
|
switch strings.ToLower(ct) {
|
||||||
case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1":
|
case "text/plain", "text/plain;charset=iso-8859-1", "text/plain;charset=latin1":
|
||||||
enc = ISO_8859_1
|
enc = ISO_8859_1
|
||||||
case "", "text/plain; charset=utf-8":
|
case "", "text/plain;charset=utf-8":
|
||||||
enc = UTF8
|
enc = UTF8
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("properties: invalid content type %s", ct)
|
return nil, fmt.Errorf("properties: invalid content type %s", ct)
|
||||||
|
|||||||
31
vendor/github.com/magiconair/properties/properties.go
generated
vendored
31
vendor/github.com/magiconair/properties/properties.go
generated
vendored
@@ -8,11 +8,13 @@ package properties
|
|||||||
// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used.
|
// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -69,6 +71,9 @@ type Properties struct {
|
|||||||
|
|
||||||
// Stores the keys in order of appearance.
|
// Stores the keys in order of appearance.
|
||||||
k []string
|
k []string
|
||||||
|
|
||||||
|
// WriteSeparator specifies the separator of key and value while writing the properties.
|
||||||
|
WriteSeparator string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewProperties creates a new Properties struct with the default
|
// NewProperties creates a new Properties struct with the default
|
||||||
@@ -111,7 +116,7 @@ func (p *Properties) Get(key string) (value string, ok bool) {
|
|||||||
// circular references and malformed expressions
|
// circular references and malformed expressions
|
||||||
// so we panic if we still get an error here.
|
// so we panic if we still get an error here.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ErrorHandler(fmt.Errorf("%s in %q", err, key+" = "+v))
|
ErrorHandler(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return expanded, true
|
return expanded, true
|
||||||
@@ -586,6 +591,12 @@ func (p *Properties) String() string {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sort sorts the properties keys in alphabetical order.
|
||||||
|
// This is helpfully before writing the properties.
|
||||||
|
func (p *Properties) Sort() {
|
||||||
|
sort.Strings(p.k)
|
||||||
|
}
|
||||||
|
|
||||||
// Write writes all unexpanded 'key = value' pairs to the given writer.
|
// Write writes all unexpanded 'key = value' pairs to the given writer.
|
||||||
// Write returns the number of bytes written and any write error encountered.
|
// Write returns the number of bytes written and any write error encountered.
|
||||||
func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) {
|
func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) {
|
||||||
@@ -626,7 +637,7 @@ func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n i
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, c := range comments {
|
for _, c := range comments {
|
||||||
x, err = fmt.Fprintf(w, "%s%s\n", prefix, encode(c, "", enc))
|
x, err = fmt.Fprintf(w, "%s%s\n", prefix, c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -635,8 +646,11 @@ func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sep := " = "
|
||||||
x, err = fmt.Fprintf(w, "%s = %s\n", encode(key, " :", enc), encode(value, "", enc))
|
if p.WriteSeparator != "" {
|
||||||
|
sep = p.WriteSeparator
|
||||||
|
}
|
||||||
|
x, err = fmt.Fprintf(w, "%s%s%s\n", encode(key, " :", enc), sep, encode(value, "", enc))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -753,7 +767,12 @@ func expand(s string, keys []string, prefix, postfix string, values map[string]s
|
|||||||
|
|
||||||
for _, k := range keys {
|
for _, k := range keys {
|
||||||
if key == k {
|
if key == k {
|
||||||
return "", fmt.Errorf("circular reference")
|
var b bytes.Buffer
|
||||||
|
b.WriteString("circular reference in:\n")
|
||||||
|
for _, k1 := range keys {
|
||||||
|
fmt.Fprintf(&b, "%s=%s\n", k1, values[k1])
|
||||||
|
}
|
||||||
|
return "", fmt.Errorf(b.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -820,6 +839,8 @@ func escape(r rune, special string) string {
|
|||||||
return "\\r"
|
return "\\r"
|
||||||
case '\t':
|
case '\t':
|
||||||
return "\\t"
|
return "\\t"
|
||||||
|
case '\\':
|
||||||
|
return "\\\\"
|
||||||
default:
|
default:
|
||||||
if strings.ContainsRune(special, r) {
|
if strings.ContainsRune(special, r) {
|
||||||
return "\\" + string(r)
|
return "\\" + string(r)
|
||||||
|
|||||||
8
vendor/github.com/mitchellh/mapstructure/.travis.yml
generated
vendored
8
vendor/github.com/mitchellh/mapstructure/.travis.yml
generated
vendored
@@ -1,8 +0,0 @@
|
|||||||
language: go
|
|
||||||
|
|
||||||
go:
|
|
||||||
- "1.11.x"
|
|
||||||
- tip
|
|
||||||
|
|
||||||
script:
|
|
||||||
- go test
|
|
||||||
58
vendor/github.com/mitchellh/mapstructure/CHANGELOG.md
generated
vendored
58
vendor/github.com/mitchellh/mapstructure/CHANGELOG.md
generated
vendored
@@ -1,3 +1,61 @@
|
|||||||
|
## 1.4.2
|
||||||
|
|
||||||
|
* Custom name matchers to support any sort of casing, formatting, etc. for
|
||||||
|
field names. [GH-250]
|
||||||
|
* Fix possible panic in ComposeDecodeHookFunc [GH-251]
|
||||||
|
|
||||||
|
## 1.4.1
|
||||||
|
|
||||||
|
* Fix regression where `*time.Time` value would be set to empty and not be sent
|
||||||
|
to decode hooks properly [GH-232]
|
||||||
|
|
||||||
|
## 1.4.0
|
||||||
|
|
||||||
|
* A new decode hook type `DecodeHookFuncValue` has been added that has
|
||||||
|
access to the full values. [GH-183]
|
||||||
|
* Squash is now supported with embedded fields that are struct pointers [GH-205]
|
||||||
|
* Empty strings will convert to 0 for all numeric types when weakly decoding [GH-206]
|
||||||
|
|
||||||
|
## 1.3.3
|
||||||
|
|
||||||
|
* Decoding maps from maps creates a settable value for decode hooks [GH-203]
|
||||||
|
|
||||||
|
## 1.3.2
|
||||||
|
|
||||||
|
* Decode into interface type with a struct value is supported [GH-187]
|
||||||
|
|
||||||
|
## 1.3.1
|
||||||
|
|
||||||
|
* Squash should only squash embedded structs. [GH-194]
|
||||||
|
|
||||||
|
## 1.3.0
|
||||||
|
|
||||||
|
* Added `",omitempty"` support. This will ignore zero values in the source
|
||||||
|
structure when encoding. [GH-145]
|
||||||
|
|
||||||
|
## 1.2.3
|
||||||
|
|
||||||
|
* Fix duplicate entries in Keys list with pointer values. [GH-185]
|
||||||
|
|
||||||
|
## 1.2.2
|
||||||
|
|
||||||
|
* Do not add unsettable (unexported) values to the unused metadata key
|
||||||
|
or "remain" value. [GH-150]
|
||||||
|
|
||||||
|
## 1.2.1
|
||||||
|
|
||||||
|
* Go modules checksum mismatch fix
|
||||||
|
|
||||||
|
## 1.2.0
|
||||||
|
|
||||||
|
* Added support to capture unused values in a field using the `",remain"` value
|
||||||
|
in the mapstructure tag. There is an example to showcase usage.
|
||||||
|
* Added `DecoderConfig` option to always squash embedded structs
|
||||||
|
* `json.Number` can decode into `uint` types
|
||||||
|
* Empty slices are preserved and not replaced with nil slices
|
||||||
|
* Fix panic that can occur in when decoding a map into a nil slice of structs
|
||||||
|
* Improved package documentation for godoc
|
||||||
|
|
||||||
## 1.1.2
|
## 1.1.2
|
||||||
|
|
||||||
* Fix error when decode hook decodes interface implementation into interface
|
* Fix error when decode hook decodes interface implementation into interface
|
||||||
|
|||||||
72
vendor/github.com/mitchellh/mapstructure/decode_hooks.go
generated
vendored
72
vendor/github.com/mitchellh/mapstructure/decode_hooks.go
generated
vendored
@@ -1,6 +1,7 @@
|
|||||||
package mapstructure
|
package mapstructure
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
@@ -16,10 +17,11 @@ func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc {
|
|||||||
// Create variables here so we can reference them with the reflect pkg
|
// Create variables here so we can reference them with the reflect pkg
|
||||||
var f1 DecodeHookFuncType
|
var f1 DecodeHookFuncType
|
||||||
var f2 DecodeHookFuncKind
|
var f2 DecodeHookFuncKind
|
||||||
|
var f3 DecodeHookFuncValue
|
||||||
|
|
||||||
// Fill in the variables into this interface and the rest is done
|
// Fill in the variables into this interface and the rest is done
|
||||||
// automatically using the reflect package.
|
// automatically using the reflect package.
|
||||||
potential := []interface{}{f1, f2}
|
potential := []interface{}{f1, f2, f3}
|
||||||
|
|
||||||
v := reflect.ValueOf(h)
|
v := reflect.ValueOf(h)
|
||||||
vt := v.Type()
|
vt := v.Type()
|
||||||
@@ -38,13 +40,15 @@ func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc {
|
|||||||
// that took reflect.Kind instead of reflect.Type.
|
// that took reflect.Kind instead of reflect.Type.
|
||||||
func DecodeHookExec(
|
func DecodeHookExec(
|
||||||
raw DecodeHookFunc,
|
raw DecodeHookFunc,
|
||||||
from reflect.Type, to reflect.Type,
|
from reflect.Value, to reflect.Value) (interface{}, error) {
|
||||||
data interface{}) (interface{}, error) {
|
|
||||||
switch f := typedDecodeHook(raw).(type) {
|
switch f := typedDecodeHook(raw).(type) {
|
||||||
case DecodeHookFuncType:
|
case DecodeHookFuncType:
|
||||||
return f(from, to, data)
|
return f(from.Type(), to.Type(), from.Interface())
|
||||||
case DecodeHookFuncKind:
|
case DecodeHookFuncKind:
|
||||||
return f(from.Kind(), to.Kind(), data)
|
return f(from.Kind(), to.Kind(), from.Interface())
|
||||||
|
case DecodeHookFuncValue:
|
||||||
|
return f(from, to)
|
||||||
default:
|
default:
|
||||||
return nil, errors.New("invalid decode hook signature")
|
return nil, errors.New("invalid decode hook signature")
|
||||||
}
|
}
|
||||||
@@ -56,22 +60,17 @@ func DecodeHookExec(
|
|||||||
// The composed funcs are called in order, with the result of the
|
// The composed funcs are called in order, with the result of the
|
||||||
// previous transformation.
|
// previous transformation.
|
||||||
func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc {
|
func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc {
|
||||||
return func(
|
return func(f reflect.Value, t reflect.Value) (interface{}, error) {
|
||||||
f reflect.Type,
|
|
||||||
t reflect.Type,
|
|
||||||
data interface{}) (interface{}, error) {
|
|
||||||
var err error
|
var err error
|
||||||
|
data := f.Interface()
|
||||||
|
|
||||||
|
newFrom := f
|
||||||
for _, f1 := range fs {
|
for _, f1 := range fs {
|
||||||
data, err = DecodeHookExec(f1, f, t, data)
|
data, err = DecodeHookExec(f1, newFrom, t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
newFrom = reflect.ValueOf(data)
|
||||||
// Modify the from kind to be correct with the new data
|
|
||||||
f = nil
|
|
||||||
if val := reflect.ValueOf(data); val.IsValid() {
|
|
||||||
f = val.Type()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
@@ -215,3 +214,44 @@ func WeaklyTypedHook(
|
|||||||
|
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RecursiveStructToMapHookFunc() DecodeHookFunc {
|
||||||
|
return func(f reflect.Value, t reflect.Value) (interface{}, error) {
|
||||||
|
if f.Kind() != reflect.Struct {
|
||||||
|
return f.Interface(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var i interface{} = struct{}{}
|
||||||
|
if t.Type() != reflect.TypeOf(&i).Elem() {
|
||||||
|
return f.Interface(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
m := make(map[string]interface{})
|
||||||
|
t.Set(reflect.ValueOf(m))
|
||||||
|
|
||||||
|
return f.Interface(), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TextUnmarshallerHookFunc returns a DecodeHookFunc that applies
|
||||||
|
// strings to the UnmarshalText function, when the target type
|
||||||
|
// implements the encoding.TextUnmarshaler interface
|
||||||
|
func TextUnmarshallerHookFunc() DecodeHookFuncType {
|
||||||
|
return func(
|
||||||
|
f reflect.Type,
|
||||||
|
t reflect.Type,
|
||||||
|
data interface{}) (interface{}, error) {
|
||||||
|
if f.Kind() != reflect.String {
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
result := reflect.New(t).Interface()
|
||||||
|
unmarshaller, ok := result.(encoding.TextUnmarshaler)
|
||||||
|
if !ok {
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
if err := unmarshaller.UnmarshalText([]byte(data.(string))); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
492
vendor/github.com/mitchellh/mapstructure/mapstructure.go
generated
vendored
492
vendor/github.com/mitchellh/mapstructure/mapstructure.go
generated
vendored
@@ -1,10 +1,161 @@
|
|||||||
// Package mapstructure exposes functionality to convert an arbitrary
|
// Package mapstructure exposes functionality to convert one arbitrary
|
||||||
// map[string]interface{} into a native Go structure.
|
// Go type into another, typically to convert a map[string]interface{}
|
||||||
|
// into a native Go structure.
|
||||||
//
|
//
|
||||||
// The Go structure can be arbitrarily complex, containing slices,
|
// The Go structure can be arbitrarily complex, containing slices,
|
||||||
// other structs, etc. and the decoder will properly decode nested
|
// other structs, etc. and the decoder will properly decode nested
|
||||||
// maps and so on into the proper structures in the native Go struct.
|
// maps and so on into the proper structures in the native Go struct.
|
||||||
// See the examples to see what the decoder is capable of.
|
// See the examples to see what the decoder is capable of.
|
||||||
|
//
|
||||||
|
// The simplest function to start with is Decode.
|
||||||
|
//
|
||||||
|
// Field Tags
|
||||||
|
//
|
||||||
|
// When decoding to a struct, mapstructure will use the field name by
|
||||||
|
// default to perform the mapping. For example, if a struct has a field
|
||||||
|
// "Username" then mapstructure will look for a key in the source value
|
||||||
|
// of "username" (case insensitive).
|
||||||
|
//
|
||||||
|
// type User struct {
|
||||||
|
// Username string
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// You can change the behavior of mapstructure by using struct tags.
|
||||||
|
// The default struct tag that mapstructure looks for is "mapstructure"
|
||||||
|
// but you can customize it using DecoderConfig.
|
||||||
|
//
|
||||||
|
// Renaming Fields
|
||||||
|
//
|
||||||
|
// To rename the key that mapstructure looks for, use the "mapstructure"
|
||||||
|
// tag and set a value directly. For example, to change the "username" example
|
||||||
|
// above to "user":
|
||||||
|
//
|
||||||
|
// type User struct {
|
||||||
|
// Username string `mapstructure:"user"`
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Embedded Structs and Squashing
|
||||||
|
//
|
||||||
|
// Embedded structs are treated as if they're another field with that name.
|
||||||
|
// By default, the two structs below are equivalent when decoding with
|
||||||
|
// mapstructure:
|
||||||
|
//
|
||||||
|
// type Person struct {
|
||||||
|
// Name string
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// type Friend struct {
|
||||||
|
// Person
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// type Friend struct {
|
||||||
|
// Person Person
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// This would require an input that looks like below:
|
||||||
|
//
|
||||||
|
// map[string]interface{}{
|
||||||
|
// "person": map[string]interface{}{"name": "alice"},
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// If your "person" value is NOT nested, then you can append ",squash" to
|
||||||
|
// your tag value and mapstructure will treat it as if the embedded struct
|
||||||
|
// were part of the struct directly. Example:
|
||||||
|
//
|
||||||
|
// type Friend struct {
|
||||||
|
// Person `mapstructure:",squash"`
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Now the following input would be accepted:
|
||||||
|
//
|
||||||
|
// map[string]interface{}{
|
||||||
|
// "name": "alice",
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// When decoding from a struct to a map, the squash tag squashes the struct
|
||||||
|
// fields into a single map. Using the example structs from above:
|
||||||
|
//
|
||||||
|
// Friend{Person: Person{Name: "alice"}}
|
||||||
|
//
|
||||||
|
// Will be decoded into a map:
|
||||||
|
//
|
||||||
|
// map[string]interface{}{
|
||||||
|
// "name": "alice",
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// DecoderConfig has a field that changes the behavior of mapstructure
|
||||||
|
// to always squash embedded structs.
|
||||||
|
//
|
||||||
|
// Remainder Values
|
||||||
|
//
|
||||||
|
// If there are any unmapped keys in the source value, mapstructure by
|
||||||
|
// default will silently ignore them. You can error by setting ErrorUnused
|
||||||
|
// in DecoderConfig. If you're using Metadata you can also maintain a slice
|
||||||
|
// of the unused keys.
|
||||||
|
//
|
||||||
|
// You can also use the ",remain" suffix on your tag to collect all unused
|
||||||
|
// values in a map. The field with this tag MUST be a map type and should
|
||||||
|
// probably be a "map[string]interface{}" or "map[interface{}]interface{}".
|
||||||
|
// See example below:
|
||||||
|
//
|
||||||
|
// type Friend struct {
|
||||||
|
// Name string
|
||||||
|
// Other map[string]interface{} `mapstructure:",remain"`
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Given the input below, Other would be populated with the other
|
||||||
|
// values that weren't used (everything but "name"):
|
||||||
|
//
|
||||||
|
// map[string]interface{}{
|
||||||
|
// "name": "bob",
|
||||||
|
// "address": "123 Maple St.",
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Omit Empty Values
|
||||||
|
//
|
||||||
|
// When decoding from a struct to any other value, you may use the
|
||||||
|
// ",omitempty" suffix on your tag to omit that value if it equates to
|
||||||
|
// the zero value. The zero value of all types is specified in the Go
|
||||||
|
// specification.
|
||||||
|
//
|
||||||
|
// For example, the zero type of a numeric type is zero ("0"). If the struct
|
||||||
|
// field value is zero and a numeric type, the field is empty, and it won't
|
||||||
|
// be encoded into the destination type.
|
||||||
|
//
|
||||||
|
// type Source {
|
||||||
|
// Age int `mapstructure:",omitempty"`
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Unexported fields
|
||||||
|
//
|
||||||
|
// Since unexported (private) struct fields cannot be set outside the package
|
||||||
|
// where they are defined, the decoder will simply skip them.
|
||||||
|
//
|
||||||
|
// For this output type definition:
|
||||||
|
//
|
||||||
|
// type Exported struct {
|
||||||
|
// private string // this unexported field will be skipped
|
||||||
|
// Public string
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Using this map as input:
|
||||||
|
//
|
||||||
|
// map[string]interface{}{
|
||||||
|
// "private": "I will be ignored",
|
||||||
|
// "Public": "I made it through!",
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// The following struct will be decoded:
|
||||||
|
//
|
||||||
|
// type Exported struct {
|
||||||
|
// private: "" // field is left with an empty string (zero value)
|
||||||
|
// Public: "I made it through!"
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Other Configuration
|
||||||
|
//
|
||||||
|
// mapstructure is highly configurable. See the DecoderConfig struct
|
||||||
|
// for other features and options that are supported.
|
||||||
package mapstructure
|
package mapstructure
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -21,10 +172,11 @@ import (
|
|||||||
// data transformations. See "DecodeHook" in the DecoderConfig
|
// data transformations. See "DecodeHook" in the DecoderConfig
|
||||||
// struct.
|
// struct.
|
||||||
//
|
//
|
||||||
// The type should be DecodeHookFuncType or DecodeHookFuncKind.
|
// The type must be one of DecodeHookFuncType, DecodeHookFuncKind, or
|
||||||
// Either is accepted. Types are a superset of Kinds (Types can return
|
// DecodeHookFuncValue.
|
||||||
// Kinds) and are generally a richer thing to use, but Kinds are simpler
|
// Values are a superset of Types (Values can return types), and Types are a
|
||||||
// if you only need those.
|
// superset of Kinds (Types can return Kinds) and are generally a richer thing
|
||||||
|
// to use, but Kinds are simpler if you only need those.
|
||||||
//
|
//
|
||||||
// The reason DecodeHookFunc is multi-typed is for backwards compatibility:
|
// The reason DecodeHookFunc is multi-typed is for backwards compatibility:
|
||||||
// we started with Kinds and then realized Types were the better solution,
|
// we started with Kinds and then realized Types were the better solution,
|
||||||
@@ -40,15 +192,22 @@ type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface
|
|||||||
// source and target types.
|
// source and target types.
|
||||||
type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error)
|
type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error)
|
||||||
|
|
||||||
|
// DecodeHookFuncValue is a DecodeHookFunc which has complete access to both the source and target
|
||||||
|
// values.
|
||||||
|
type DecodeHookFuncValue func(from reflect.Value, to reflect.Value) (interface{}, error)
|
||||||
|
|
||||||
// DecoderConfig is the configuration that is used to create a new decoder
|
// DecoderConfig is the configuration that is used to create a new decoder
|
||||||
// and allows customization of various aspects of decoding.
|
// and allows customization of various aspects of decoding.
|
||||||
type DecoderConfig struct {
|
type DecoderConfig struct {
|
||||||
// DecodeHook, if set, will be called before any decoding and any
|
// DecodeHook, if set, will be called before any decoding and any
|
||||||
// type conversion (if WeaklyTypedInput is on). This lets you modify
|
// type conversion (if WeaklyTypedInput is on). This lets you modify
|
||||||
// the values before they're set down onto the resulting struct.
|
// the values before they're set down onto the resulting struct. The
|
||||||
|
// DecodeHook is called for every map and value in the input. This means
|
||||||
|
// that if a struct has embedded fields with squash tags the decode hook
|
||||||
|
// is called only once with all of the input data, not once for each
|
||||||
|
// embedded struct.
|
||||||
//
|
//
|
||||||
// If an error is returned, the entire decode will fail with that
|
// If an error is returned, the entire decode will fail with that error.
|
||||||
// error.
|
|
||||||
DecodeHook DecodeHookFunc
|
DecodeHook DecodeHookFunc
|
||||||
|
|
||||||
// If ErrorUnused is true, then it is an error for there to exist
|
// If ErrorUnused is true, then it is an error for there to exist
|
||||||
@@ -80,6 +239,14 @@ type DecoderConfig struct {
|
|||||||
//
|
//
|
||||||
WeaklyTypedInput bool
|
WeaklyTypedInput bool
|
||||||
|
|
||||||
|
// Squash will squash embedded structs. A squash tag may also be
|
||||||
|
// added to an individual struct field using a tag. For example:
|
||||||
|
//
|
||||||
|
// type Parent struct {
|
||||||
|
// Child `mapstructure:",squash"`
|
||||||
|
// }
|
||||||
|
Squash bool
|
||||||
|
|
||||||
// Metadata is the struct that will contain extra metadata about
|
// Metadata is the struct that will contain extra metadata about
|
||||||
// the decoding. If this is nil, then no metadata will be tracked.
|
// the decoding. If this is nil, then no metadata will be tracked.
|
||||||
Metadata *Metadata
|
Metadata *Metadata
|
||||||
@@ -91,6 +258,11 @@ type DecoderConfig struct {
|
|||||||
// The tag name that mapstructure reads for field names. This
|
// The tag name that mapstructure reads for field names. This
|
||||||
// defaults to "mapstructure"
|
// defaults to "mapstructure"
|
||||||
TagName string
|
TagName string
|
||||||
|
|
||||||
|
// MatchName is the function used to match the map key to the struct
|
||||||
|
// field name or tag. Defaults to `strings.EqualFold`. This can be used
|
||||||
|
// to implement case-sensitive tag values, support snake casing, etc.
|
||||||
|
MatchName func(mapKey, fieldName string) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Decoder takes a raw interface value and turns it into structured
|
// A Decoder takes a raw interface value and turns it into structured
|
||||||
@@ -209,6 +381,10 @@ func NewDecoder(config *DecoderConfig) (*Decoder, error) {
|
|||||||
config.TagName = "mapstructure"
|
config.TagName = "mapstructure"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.MatchName == nil {
|
||||||
|
config.MatchName = strings.EqualFold
|
||||||
|
}
|
||||||
|
|
||||||
result := &Decoder{
|
result := &Decoder{
|
||||||
config: config,
|
config: config,
|
||||||
}
|
}
|
||||||
@@ -261,9 +437,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e
|
|||||||
if d.config.DecodeHook != nil {
|
if d.config.DecodeHook != nil {
|
||||||
// We have a DecodeHook, so let's pre-process the input.
|
// We have a DecodeHook, so let's pre-process the input.
|
||||||
var err error
|
var err error
|
||||||
input, err = DecodeHookExec(
|
input, err = DecodeHookExec(d.config.DecodeHook, inputVal, outVal)
|
||||||
d.config.DecodeHook,
|
|
||||||
inputVal.Type(), outVal.Type(), input)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error decoding '%s': %s", name, err)
|
return fmt.Errorf("error decoding '%s': %s", name, err)
|
||||||
}
|
}
|
||||||
@@ -271,6 +445,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e
|
|||||||
|
|
||||||
var err error
|
var err error
|
||||||
outputKind := getKind(outVal)
|
outputKind := getKind(outVal)
|
||||||
|
addMetaKey := true
|
||||||
switch outputKind {
|
switch outputKind {
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
err = d.decodeBool(name, input, outVal)
|
err = d.decodeBool(name, input, outVal)
|
||||||
@@ -289,7 +464,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e
|
|||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
err = d.decodeMap(name, input, outVal)
|
err = d.decodeMap(name, input, outVal)
|
||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
err = d.decodePtr(name, input, outVal)
|
addMetaKey, err = d.decodePtr(name, input, outVal)
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
err = d.decodeSlice(name, input, outVal)
|
err = d.decodeSlice(name, input, outVal)
|
||||||
case reflect.Array:
|
case reflect.Array:
|
||||||
@@ -303,7 +478,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e
|
|||||||
|
|
||||||
// If we reached here, then we successfully decoded SOMETHING, so
|
// If we reached here, then we successfully decoded SOMETHING, so
|
||||||
// mark the key as used if we're tracking metainput.
|
// mark the key as used if we're tracking metainput.
|
||||||
if d.config.Metadata != nil && name != "" {
|
if addMetaKey && d.config.Metadata != nil && name != "" {
|
||||||
d.config.Metadata.Keys = append(d.config.Metadata.Keys, name)
|
d.config.Metadata.Keys = append(d.config.Metadata.Keys, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,7 +489,34 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e
|
|||||||
// value to "data" of that type.
|
// value to "data" of that type.
|
||||||
func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error {
|
func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error {
|
||||||
if val.IsValid() && val.Elem().IsValid() {
|
if val.IsValid() && val.Elem().IsValid() {
|
||||||
return d.decode(name, data, val.Elem())
|
elem := val.Elem()
|
||||||
|
|
||||||
|
// If we can't address this element, then its not writable. Instead,
|
||||||
|
// we make a copy of the value (which is a pointer and therefore
|
||||||
|
// writable), decode into that, and replace the whole value.
|
||||||
|
copied := false
|
||||||
|
if !elem.CanAddr() {
|
||||||
|
copied = true
|
||||||
|
|
||||||
|
// Make *T
|
||||||
|
copy := reflect.New(elem.Type())
|
||||||
|
|
||||||
|
// *T = elem
|
||||||
|
copy.Elem().Set(elem)
|
||||||
|
|
||||||
|
// Set elem so we decode into it
|
||||||
|
elem = copy
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode. If we have an error then return. We also return right
|
||||||
|
// away if we're not a copy because that means we decoded directly.
|
||||||
|
if err := d.decode(name, data, elem); err != nil || !copied {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're a copy, we need to set te final result
|
||||||
|
val.Set(elem.Elem())
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
dataVal := reflect.ValueOf(data)
|
dataVal := reflect.ValueOf(data)
|
||||||
@@ -386,8 +588,8 @@ func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value)
|
|||||||
|
|
||||||
if !converted {
|
if !converted {
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"'%s' expected type '%s', got unconvertible type '%s'",
|
"'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
|
||||||
name, val.Type(), dataVal.Type())
|
name, val.Type(), dataVal.Type(), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -412,7 +614,12 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er
|
|||||||
val.SetInt(0)
|
val.SetInt(0)
|
||||||
}
|
}
|
||||||
case dataKind == reflect.String && d.config.WeaklyTypedInput:
|
case dataKind == reflect.String && d.config.WeaklyTypedInput:
|
||||||
i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits())
|
str := dataVal.String()
|
||||||
|
if str == "" {
|
||||||
|
str = "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
i, err := strconv.ParseInt(str, 0, val.Type().Bits())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
val.SetInt(i)
|
val.SetInt(i)
|
||||||
} else {
|
} else {
|
||||||
@@ -428,8 +635,8 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er
|
|||||||
val.SetInt(i)
|
val.SetInt(i)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"'%s' expected type '%s', got unconvertible type '%s'",
|
"'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
|
||||||
name, val.Type(), dataVal.Type())
|
name, val.Type(), dataVal.Type(), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -438,6 +645,7 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er
|
|||||||
func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error {
|
func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error {
|
||||||
dataVal := reflect.Indirect(reflect.ValueOf(data))
|
dataVal := reflect.Indirect(reflect.ValueOf(data))
|
||||||
dataKind := getKind(dataVal)
|
dataKind := getKind(dataVal)
|
||||||
|
dataType := dataVal.Type()
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case dataKind == reflect.Int:
|
case dataKind == reflect.Int:
|
||||||
@@ -463,16 +671,33 @@ func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) e
|
|||||||
val.SetUint(0)
|
val.SetUint(0)
|
||||||
}
|
}
|
||||||
case dataKind == reflect.String && d.config.WeaklyTypedInput:
|
case dataKind == reflect.String && d.config.WeaklyTypedInput:
|
||||||
i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits())
|
str := dataVal.String()
|
||||||
|
if str == "" {
|
||||||
|
str = "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
i, err := strconv.ParseUint(str, 0, val.Type().Bits())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
val.SetUint(i)
|
val.SetUint(i)
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("cannot parse '%s' as uint: %s", name, err)
|
return fmt.Errorf("cannot parse '%s' as uint: %s", name, err)
|
||||||
}
|
}
|
||||||
|
case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number":
|
||||||
|
jn := data.(json.Number)
|
||||||
|
i, err := jn.Int64()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf(
|
||||||
|
"error decoding json.Number into %s: %s", name, err)
|
||||||
|
}
|
||||||
|
if i < 0 && !d.config.WeaklyTypedInput {
|
||||||
|
return fmt.Errorf("cannot parse '%s', %d overflows uint",
|
||||||
|
name, i)
|
||||||
|
}
|
||||||
|
val.SetUint(uint64(i))
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"'%s' expected type '%s', got unconvertible type '%s'",
|
"'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
|
||||||
name, val.Type(), dataVal.Type())
|
name, val.Type(), dataVal.Type(), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -502,8 +727,8 @@ func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) e
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"'%s' expected type '%s', got unconvertible type '%s'",
|
"'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
|
||||||
name, val.Type(), dataVal.Type())
|
name, val.Type(), dataVal.Type(), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -528,7 +753,12 @@ func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value)
|
|||||||
val.SetFloat(0)
|
val.SetFloat(0)
|
||||||
}
|
}
|
||||||
case dataKind == reflect.String && d.config.WeaklyTypedInput:
|
case dataKind == reflect.String && d.config.WeaklyTypedInput:
|
||||||
f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits())
|
str := dataVal.String()
|
||||||
|
if str == "" {
|
||||||
|
str = "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := strconv.ParseFloat(str, val.Type().Bits())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
val.SetFloat(f)
|
val.SetFloat(f)
|
||||||
} else {
|
} else {
|
||||||
@@ -544,8 +774,8 @@ func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value)
|
|||||||
val.SetFloat(i)
|
val.SetFloat(i)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"'%s' expected type '%s', got unconvertible type '%s'",
|
"'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
|
||||||
name, val.Type(), dataVal.Type())
|
name, val.Type(), dataVal.Type(), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -596,7 +826,7 @@ func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val ref
|
|||||||
|
|
||||||
for i := 0; i < dataVal.Len(); i++ {
|
for i := 0; i < dataVal.Len(); i++ {
|
||||||
err := d.decode(
|
err := d.decode(
|
||||||
fmt.Sprintf("%s[%d]", name, i),
|
name+"["+strconv.Itoa(i)+"]",
|
||||||
dataVal.Index(i).Interface(), val)
|
dataVal.Index(i).Interface(), val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -629,7 +859,7 @@ func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val refle
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, k := range dataVal.MapKeys() {
|
for _, k := range dataVal.MapKeys() {
|
||||||
fieldName := fmt.Sprintf("%s[%s]", name, k)
|
fieldName := name + "[" + k.String() + "]"
|
||||||
|
|
||||||
// First decode the key into the proper type
|
// First decode the key into the proper type
|
||||||
currentKey := reflect.Indirect(reflect.New(valKeyType))
|
currentKey := reflect.Indirect(reflect.New(valKeyType))
|
||||||
@@ -678,27 +908,40 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re
|
|||||||
}
|
}
|
||||||
|
|
||||||
tagValue := f.Tag.Get(d.config.TagName)
|
tagValue := f.Tag.Get(d.config.TagName)
|
||||||
tagParts := strings.Split(tagValue, ",")
|
keyName := f.Name
|
||||||
|
|
||||||
|
// If Squash is set in the config, we squash the field down.
|
||||||
|
squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous
|
||||||
|
|
||||||
// Determine the name of the key in the map
|
// Determine the name of the key in the map
|
||||||
keyName := f.Name
|
if index := strings.Index(tagValue, ","); index != -1 {
|
||||||
if tagParts[0] != "" {
|
if tagValue[:index] == "-" {
|
||||||
if tagParts[0] == "-" {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
keyName = tagParts[0]
|
// If "omitempty" is specified in the tag, it ignores empty values.
|
||||||
}
|
if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) {
|
||||||
|
continue
|
||||||
// If "squash" is specified in the tag, we squash the field down.
|
|
||||||
squash := false
|
|
||||||
for _, tag := range tagParts[1:] {
|
|
||||||
if tag == "squash" {
|
|
||||||
squash = true
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if squash && v.Kind() != reflect.Struct {
|
// If "squash" is specified in the tag, we squash the field down.
|
||||||
return fmt.Errorf("cannot squash non-struct type '%s'", v.Type())
|
squash = !squash && strings.Index(tagValue[index+1:], "squash") != -1
|
||||||
|
if squash {
|
||||||
|
// When squashing, the embedded type can be a pointer to a struct.
|
||||||
|
if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct {
|
||||||
|
v = v.Elem()
|
||||||
|
}
|
||||||
|
|
||||||
|
// The final type must be a struct
|
||||||
|
if v.Kind() != reflect.Struct {
|
||||||
|
return fmt.Errorf("cannot squash non-struct type '%s'", v.Type())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
keyName = tagValue[:index]
|
||||||
|
} else if len(tagValue) > 0 {
|
||||||
|
if tagValue == "-" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
keyName = tagValue
|
||||||
}
|
}
|
||||||
|
|
||||||
switch v.Kind() {
|
switch v.Kind() {
|
||||||
@@ -713,11 +956,22 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re
|
|||||||
mType := reflect.MapOf(vKeyType, vElemType)
|
mType := reflect.MapOf(vKeyType, vElemType)
|
||||||
vMap := reflect.MakeMap(mType)
|
vMap := reflect.MakeMap(mType)
|
||||||
|
|
||||||
err := d.decode(keyName, x.Interface(), vMap)
|
// Creating a pointer to a map so that other methods can completely
|
||||||
|
// overwrite the map if need be (looking at you decodeMapFromMap). The
|
||||||
|
// indirection allows the underlying map to be settable (CanSet() == true)
|
||||||
|
// where as reflect.MakeMap returns an unsettable map.
|
||||||
|
addrVal := reflect.New(vMap.Type())
|
||||||
|
reflect.Indirect(addrVal).Set(vMap)
|
||||||
|
|
||||||
|
err := d.decode(keyName, x.Interface(), reflect.Indirect(addrVal))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the underlying map may have been completely overwritten so pull
|
||||||
|
// it indirectly out of the enclosing value.
|
||||||
|
vMap = reflect.Indirect(addrVal)
|
||||||
|
|
||||||
if squash {
|
if squash {
|
||||||
for _, k := range vMap.MapKeys() {
|
for _, k := range vMap.MapKeys() {
|
||||||
valMap.SetMapIndex(k, vMap.MapIndex(k))
|
valMap.SetMapIndex(k, vMap.MapIndex(k))
|
||||||
@@ -738,7 +992,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error {
|
func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) {
|
||||||
// If the input data is nil, then we want to just set the output
|
// If the input data is nil, then we want to just set the output
|
||||||
// pointer to be nil as well.
|
// pointer to be nil as well.
|
||||||
isNil := data == nil
|
isNil := data == nil
|
||||||
@@ -759,7 +1013,7 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er
|
|||||||
val.Set(nilValue)
|
val.Set(nilValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create an element of the concrete (non pointer) type and decode
|
// Create an element of the concrete (non pointer) type and decode
|
||||||
@@ -773,16 +1027,16 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil {
|
if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil {
|
||||||
return err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
val.Set(realVal)
|
val.Set(realVal)
|
||||||
} else {
|
} else {
|
||||||
if err := d.decode(name, data, reflect.Indirect(val)); err != nil {
|
if err := d.decode(name, data, reflect.Indirect(val)); err != nil {
|
||||||
return err
|
return false, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error {
|
func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error {
|
||||||
@@ -791,8 +1045,8 @@ func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) e
|
|||||||
dataVal := reflect.Indirect(reflect.ValueOf(data))
|
dataVal := reflect.Indirect(reflect.ValueOf(data))
|
||||||
if val.Type() != dataVal.Type() {
|
if val.Type() != dataVal.Type() {
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"'%s' expected type '%s', got unconvertible type '%s'",
|
"'%s' expected type '%s', got unconvertible type '%s', value: '%v'",
|
||||||
name, val.Type(), dataVal.Type())
|
name, val.Type(), dataVal.Type(), data)
|
||||||
}
|
}
|
||||||
val.Set(dataVal)
|
val.Set(dataVal)
|
||||||
return nil
|
return nil
|
||||||
@@ -805,8 +1059,8 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value)
|
|||||||
valElemType := valType.Elem()
|
valElemType := valType.Elem()
|
||||||
sliceType := reflect.SliceOf(valElemType)
|
sliceType := reflect.SliceOf(valElemType)
|
||||||
|
|
||||||
valSlice := val
|
// If we have a non array/slice type then we first attempt to convert.
|
||||||
if valSlice.IsNil() || d.config.ZeroFields {
|
if dataValKind != reflect.Array && dataValKind != reflect.Slice {
|
||||||
if d.config.WeaklyTypedInput {
|
if d.config.WeaklyTypedInput {
|
||||||
switch {
|
switch {
|
||||||
// Slice and array we use the normal logic
|
// Slice and array we use the normal logic
|
||||||
@@ -833,18 +1087,17 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check input type
|
return fmt.Errorf(
|
||||||
if dataValKind != reflect.Array && dataValKind != reflect.Slice {
|
"'%s': source data must be an array or slice, got %s", name, dataValKind)
|
||||||
return fmt.Errorf(
|
}
|
||||||
"'%s': source data must be an array or slice, got %s", name, dataValKind)
|
|
||||||
|
|
||||||
}
|
// If the input value is nil, then don't allocate since empty != nil
|
||||||
|
if dataVal.IsNil() {
|
||||||
// If the input value is empty, then don't allocate since non-nil != nil
|
return nil
|
||||||
if dataVal.Len() == 0 {
|
}
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
|
valSlice := val
|
||||||
|
if valSlice.IsNil() || d.config.ZeroFields {
|
||||||
// Make a new slice to hold our result, same size as the original data.
|
// Make a new slice to hold our result, same size as the original data.
|
||||||
valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len())
|
valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len())
|
||||||
}
|
}
|
||||||
@@ -859,7 +1112,7 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value)
|
|||||||
}
|
}
|
||||||
currentField := valSlice.Index(i)
|
currentField := valSlice.Index(i)
|
||||||
|
|
||||||
fieldName := fmt.Sprintf("%s[%d]", name, i)
|
fieldName := name + "[" + strconv.Itoa(i) + "]"
|
||||||
if err := d.decode(fieldName, currentData, currentField); err != nil {
|
if err := d.decode(fieldName, currentData, currentField); err != nil {
|
||||||
errors = appendErrors(errors, err)
|
errors = appendErrors(errors, err)
|
||||||
}
|
}
|
||||||
@@ -926,7 +1179,7 @@ func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value)
|
|||||||
currentData := dataVal.Index(i).Interface()
|
currentData := dataVal.Index(i).Interface()
|
||||||
currentField := valArray.Index(i)
|
currentField := valArray.Index(i)
|
||||||
|
|
||||||
fieldName := fmt.Sprintf("%s[%d]", name, i)
|
fieldName := name + "[" + strconv.Itoa(i) + "]"
|
||||||
if err := d.decode(fieldName, currentData, currentField); err != nil {
|
if err := d.decode(fieldName, currentData, currentField); err != nil {
|
||||||
errors = appendErrors(errors, err)
|
errors = appendErrors(errors, err)
|
||||||
}
|
}
|
||||||
@@ -962,13 +1215,23 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value)
|
|||||||
// Not the most efficient way to do this but we can optimize later if
|
// Not the most efficient way to do this but we can optimize later if
|
||||||
// we want to. To convert from struct to struct we go to map first
|
// we want to. To convert from struct to struct we go to map first
|
||||||
// as an intermediary.
|
// as an intermediary.
|
||||||
m := make(map[string]interface{})
|
|
||||||
mval := reflect.Indirect(reflect.ValueOf(&m))
|
// Make a new map to hold our result
|
||||||
if err := d.decodeMapFromStruct(name, dataVal, mval, mval); err != nil {
|
mapType := reflect.TypeOf((map[string]interface{})(nil))
|
||||||
|
mval := reflect.MakeMap(mapType)
|
||||||
|
|
||||||
|
// Creating a pointer to a map so that other methods can completely
|
||||||
|
// overwrite the map if need be (looking at you decodeMapFromMap). The
|
||||||
|
// indirection allows the underlying map to be settable (CanSet() == true)
|
||||||
|
// where as reflect.MakeMap returns an unsettable map.
|
||||||
|
addrVal := reflect.New(mval.Type())
|
||||||
|
|
||||||
|
reflect.Indirect(addrVal).Set(mval)
|
||||||
|
if err := d.decodeMapFromStruct(name, dataVal, reflect.Indirect(addrVal), mval); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
result := d.decodeStructFromMap(name, mval, val)
|
result := d.decodeStructFromMap(name, reflect.Indirect(addrVal), val)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -1005,6 +1268,11 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
field reflect.StructField
|
field reflect.StructField
|
||||||
val reflect.Value
|
val reflect.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remainField is set to a valid field set with the "remain" tag if
|
||||||
|
// we are keeping track of remaining values.
|
||||||
|
var remainField *field
|
||||||
|
|
||||||
fields := []field{}
|
fields := []field{}
|
||||||
for len(structs) > 0 {
|
for len(structs) > 0 {
|
||||||
structVal := structs[0]
|
structVal := structs[0]
|
||||||
@@ -1014,30 +1282,47 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
|
|
||||||
for i := 0; i < structType.NumField(); i++ {
|
for i := 0; i < structType.NumField(); i++ {
|
||||||
fieldType := structType.Field(i)
|
fieldType := structType.Field(i)
|
||||||
fieldKind := fieldType.Type.Kind()
|
fieldVal := structVal.Field(i)
|
||||||
|
if fieldVal.Kind() == reflect.Ptr && fieldVal.Elem().Kind() == reflect.Struct {
|
||||||
|
// Handle embedded struct pointers as embedded structs.
|
||||||
|
fieldVal = fieldVal.Elem()
|
||||||
|
}
|
||||||
|
|
||||||
// If "squash" is specified in the tag, we squash the field down.
|
// If "squash" is specified in the tag, we squash the field down.
|
||||||
squash := false
|
squash := d.config.Squash && fieldVal.Kind() == reflect.Struct && fieldType.Anonymous
|
||||||
|
remain := false
|
||||||
|
|
||||||
|
// We always parse the tags cause we're looking for other tags too
|
||||||
tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",")
|
tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",")
|
||||||
for _, tag := range tagParts[1:] {
|
for _, tag := range tagParts[1:] {
|
||||||
if tag == "squash" {
|
if tag == "squash" {
|
||||||
squash = true
|
squash = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if tag == "remain" {
|
||||||
|
remain = true
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if squash {
|
if squash {
|
||||||
if fieldKind != reflect.Struct {
|
if fieldVal.Kind() != reflect.Struct {
|
||||||
errors = appendErrors(errors,
|
errors = appendErrors(errors,
|
||||||
fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldKind))
|
fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldVal.Kind()))
|
||||||
} else {
|
} else {
|
||||||
structs = append(structs, structVal.FieldByName(fieldType.Name))
|
structs = append(structs, fieldVal)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal struct field, store it away
|
// Build our field
|
||||||
fields = append(fields, field{fieldType, structVal.Field(i)})
|
if remain {
|
||||||
|
remainField = &field{fieldType, fieldVal}
|
||||||
|
} else {
|
||||||
|
// Normal struct field, store it away
|
||||||
|
fields = append(fields, field{fieldType, fieldVal})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1064,7 +1349,7 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.EqualFold(mK, fieldName) {
|
if d.config.MatchName(mK, fieldName) {
|
||||||
rawMapKey = dataValKey
|
rawMapKey = dataValKey
|
||||||
rawMapVal = dataVal.MapIndex(dataValKey)
|
rawMapVal = dataVal.MapIndex(dataValKey)
|
||||||
break
|
break
|
||||||
@@ -1078,9 +1363,6 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete the key we're using from the unused map so we stop tracking
|
|
||||||
delete(dataValKeysUnused, rawMapKey.Interface())
|
|
||||||
|
|
||||||
if !fieldValue.IsValid() {
|
if !fieldValue.IsValid() {
|
||||||
// This should never happen
|
// This should never happen
|
||||||
panic("field is not valid")
|
panic("field is not valid")
|
||||||
@@ -1092,10 +1374,13 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete the key we're using from the unused map so we stop tracking
|
||||||
|
delete(dataValKeysUnused, rawMapKey.Interface())
|
||||||
|
|
||||||
// If the name is empty string, then we're at the root, and we
|
// If the name is empty string, then we're at the root, and we
|
||||||
// don't dot-join the fields.
|
// don't dot-join the fields.
|
||||||
if name != "" {
|
if name != "" {
|
||||||
fieldName = fmt.Sprintf("%s.%s", name, fieldName)
|
fieldName = name + "." + fieldName
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil {
|
if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil {
|
||||||
@@ -1103,6 +1388,25 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we have a "remain"-tagged field and we have unused keys then
|
||||||
|
// we put the unused keys directly into the remain field.
|
||||||
|
if remainField != nil && len(dataValKeysUnused) > 0 {
|
||||||
|
// Build a map of only the unused values
|
||||||
|
remain := map[interface{}]interface{}{}
|
||||||
|
for key := range dataValKeysUnused {
|
||||||
|
remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode it as-if we were just decoding this map onto our map.
|
||||||
|
if err := d.decodeMap(name, remain, remainField.val); err != nil {
|
||||||
|
errors = appendErrors(errors, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the map to nil so we have none so that the next check will
|
||||||
|
// not error (ErrorUnused)
|
||||||
|
dataValKeysUnused = nil
|
||||||
|
}
|
||||||
|
|
||||||
if d.config.ErrorUnused && len(dataValKeysUnused) > 0 {
|
if d.config.ErrorUnused && len(dataValKeysUnused) > 0 {
|
||||||
keys := make([]string, 0, len(dataValKeysUnused))
|
keys := make([]string, 0, len(dataValKeysUnused))
|
||||||
for rawKey := range dataValKeysUnused {
|
for rawKey := range dataValKeysUnused {
|
||||||
@@ -1123,7 +1427,7 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
for rawKey := range dataValKeysUnused {
|
for rawKey := range dataValKeysUnused {
|
||||||
key := rawKey.(string)
|
key := rawKey.(string)
|
||||||
if name != "" {
|
if name != "" {
|
||||||
key = fmt.Sprintf("%s.%s", name, key)
|
key = name + "." + key
|
||||||
}
|
}
|
||||||
|
|
||||||
d.config.Metadata.Unused = append(d.config.Metadata.Unused, key)
|
d.config.Metadata.Unused = append(d.config.Metadata.Unused, key)
|
||||||
@@ -1133,6 +1437,24 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isEmptyValue(v reflect.Value) bool {
|
||||||
|
switch getKind(v) {
|
||||||
|
case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
|
||||||
|
return v.Len() == 0
|
||||||
|
case reflect.Bool:
|
||||||
|
return !v.Bool()
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
return v.Int() == 0
|
||||||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||||
|
return v.Uint() == 0
|
||||||
|
case reflect.Float32, reflect.Float64:
|
||||||
|
return v.Float() == 0
|
||||||
|
case reflect.Interface, reflect.Ptr:
|
||||||
|
return v.IsNil()
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func getKind(val reflect.Value) reflect.Kind {
|
func getKind(val reflect.Value) reflect.Kind {
|
||||||
kind := val.Kind()
|
kind := val.Kind()
|
||||||
|
|
||||||
|
|||||||
4
vendor/github.com/pelletier/go-toml/CONTRIBUTING.md
generated
vendored
4
vendor/github.com/pelletier/go-toml/CONTRIBUTING.md
generated
vendored
@@ -28,7 +28,7 @@ improve the documentation. Fix a typo, clarify an interface, add an
|
|||||||
example, anything goes!
|
example, anything goes!
|
||||||
|
|
||||||
The documentation is present in the [README][readme] and thorough the
|
The documentation is present in the [README][readme] and thorough the
|
||||||
source code. On release, it gets updated on [GoDoc][godoc]. To make a
|
source code. On release, it gets updated on [pkg.go.dev][pkg.go.dev]. To make a
|
||||||
change to the documentation, create a pull request with your proposed
|
change to the documentation, create a pull request with your proposed
|
||||||
changes. For simple changes like that, the easiest way to go is probably
|
changes. For simple changes like that, the easiest way to go is probably
|
||||||
the "Fork this project and edit the file" button on Github, displayed at
|
the "Fork this project and edit the file" button on Github, displayed at
|
||||||
@@ -123,7 +123,7 @@ Checklist:
|
|||||||
|
|
||||||
[issues-tracker]: https://github.com/pelletier/go-toml/issues
|
[issues-tracker]: https://github.com/pelletier/go-toml/issues
|
||||||
[bug-report]: https://github.com/pelletier/go-toml/issues/new?template=bug_report.md
|
[bug-report]: https://github.com/pelletier/go-toml/issues/new?template=bug_report.md
|
||||||
[godoc]: https://godoc.org/github.com/pelletier/go-toml
|
[pkg.go.dev]: https://pkg.go.dev/github.com/pelletier/go-toml
|
||||||
[readme]: ./README.md
|
[readme]: ./README.md
|
||||||
[fork]: https://help.github.com/articles/fork-a-repo
|
[fork]: https://help.github.com/articles/fork-a-repo
|
||||||
[pull-request]: https://help.github.com/en/articles/creating-a-pull-request
|
[pull-request]: https://help.github.com/en/articles/creating-a-pull-request
|
||||||
|
|||||||
228
vendor/github.com/pelletier/go-toml/LICENSE
generated
vendored
228
vendor/github.com/pelletier/go-toml/LICENSE
generated
vendored
@@ -1,6 +1,16 @@
|
|||||||
|
The bulk of github.com/pelletier/go-toml is distributed under the MIT license
|
||||||
|
(see below), with the exception of localtime.go and localtime.test.go.
|
||||||
|
Those two files have been copied over from Google's civil library at revision
|
||||||
|
ed46f5086358513cf8c25f8e3f022cb838a49d66, and are distributed under the Apache
|
||||||
|
2.0 license (see below).
|
||||||
|
|
||||||
|
|
||||||
|
github.com/pelletier/go-toml:
|
||||||
|
|
||||||
|
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton
|
Copyright (c) 2013 - 2021 Thomas Pelletier, Eric Anderton
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -19,3 +29,219 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
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
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
localtime.go, localtime_test.go:
|
||||||
|
|
||||||
|
Originals:
|
||||||
|
https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/civil/civil.go
|
||||||
|
https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/civil/civil_test.go
|
||||||
|
Changes:
|
||||||
|
* Renamed files from civil* to localtime*.
|
||||||
|
* Package changed from civil to toml.
|
||||||
|
* 'Local' prefix added to all structs.
|
||||||
|
License:
|
||||||
|
https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/LICENSE
|
||||||
|
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|||||||
45
vendor/github.com/pelletier/go-toml/README.md
generated
vendored
45
vendor/github.com/pelletier/go-toml/README.md
generated
vendored
@@ -1,24 +1,49 @@
|
|||||||
# go-toml
|
# go-toml
|
||||||
|
|
||||||
Go library for the [TOML](https://github.com/mojombo/toml) format.
|
Go library for the [TOML](https://toml.io/) format.
|
||||||
|
|
||||||
This library supports TOML version
|
This library supports TOML version
|
||||||
[v0.5.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.5.0.md)
|
[v1.0.0-rc.3](https://toml.io/en/v1.0.0-rc.3)
|
||||||
|
|
||||||
[](http://godoc.org/github.com/pelletier/go-toml)
|
[](https://pkg.go.dev/github.com/pelletier/go-toml)
|
||||||
[](https://github.com/pelletier/go-toml/blob/master/LICENSE)
|
[](https://github.com/pelletier/go-toml/blob/master/LICENSE)
|
||||||
[](https://dev.azure.com/pelletierthomas/go-toml-ci/_build/latest?definitionId=1&branchName=master)
|
[](https://dev.azure.com/pelletierthomas/go-toml-ci/_build/latest?definitionId=1&branchName=master)
|
||||||
[](https://codecov.io/gh/pelletier/go-toml)
|
[](https://codecov.io/gh/pelletier/go-toml)
|
||||||
[](https://goreportcard.com/report/github.com/pelletier/go-toml)
|
[](https://goreportcard.com/report/github.com/pelletier/go-toml)
|
||||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml?ref=badge_shield)
|
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml?ref=badge_shield)
|
||||||
|
|
||||||
|
|
||||||
|
## Development status
|
||||||
|
|
||||||
|
**ℹ️ Consider go-toml v2!**
|
||||||
|
|
||||||
|
The next version of go-toml is in [active development][v2-dev], and
|
||||||
|
[nearing completion][v2-map].
|
||||||
|
|
||||||
|
Though technically in beta, v2 is already more tested, [fixes bugs][v1-bugs],
|
||||||
|
and [much faster][v2-bench]. If you only need reading and writing TOML documents
|
||||||
|
(majority of cases), those features are implemented and the API unlikely to
|
||||||
|
change.
|
||||||
|
|
||||||
|
The remaining features (Document structure editing and tooling) will be added
|
||||||
|
shortly. While pull-requests are welcome on v1, no active development is
|
||||||
|
expected on it. When v2.0.0 is released, v1 will be deprecated.
|
||||||
|
|
||||||
|
👉 [go-toml v2][v2]
|
||||||
|
|
||||||
|
[v2]: https://github.com/pelletier/go-toml/tree/v2
|
||||||
|
[v2-map]: https://github.com/pelletier/go-toml/discussions/506
|
||||||
|
[v2-dev]: https://github.com/pelletier/go-toml/tree/v2
|
||||||
|
[v1-bugs]: https://github.com/pelletier/go-toml/issues?q=is%3Aissue+is%3Aopen+label%3Av2-fixed
|
||||||
|
[v2-bench]: https://github.com/pelletier/go-toml/tree/v2#benchmarks
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
Go-toml provides the following features for using data parsed from TOML documents:
|
Go-toml provides the following features for using data parsed from TOML documents:
|
||||||
|
|
||||||
* Load TOML documents from files and string data
|
* Load TOML documents from files and string data
|
||||||
* Easily navigate TOML structure using Tree
|
* Easily navigate TOML structure using Tree
|
||||||
* Mashaling and unmarshaling to and from data structures
|
* Marshaling and unmarshaling to and from data structures
|
||||||
* Line & column position data for all parsed elements
|
* Line & column position data for all parsed elements
|
||||||
* [Query support similar to JSON-Path](query/)
|
* [Query support similar to JSON-Path](query/)
|
||||||
* Syntax errors contain line and column numbers
|
* Syntax errors contain line and column numbers
|
||||||
@@ -74,20 +99,20 @@ Or use a query:
|
|||||||
q, _ := query.Compile("$..[user,password]")
|
q, _ := query.Compile("$..[user,password]")
|
||||||
results := q.Execute(config)
|
results := q.Execute(config)
|
||||||
for ii, item := range results.Values() {
|
for ii, item := range results.Values() {
|
||||||
fmt.Println("Query result %d: %v", ii, item)
|
fmt.Printf("Query result %d: %v\n", ii, item)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The documentation and additional examples are available at
|
The documentation and additional examples are available at
|
||||||
[godoc.org](http://godoc.org/github.com/pelletier/go-toml).
|
[pkg.go.dev](https://pkg.go.dev/github.com/pelletier/go-toml).
|
||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
Go-toml provides two handy command line tools:
|
Go-toml provides three handy command line tools:
|
||||||
|
|
||||||
* `tomll`: Reads TOML files and lint them.
|
* `tomll`: Reads TOML files and lints them.
|
||||||
|
|
||||||
```
|
```
|
||||||
go install github.com/pelletier/go-toml/cmd/tomll
|
go install github.com/pelletier/go-toml/cmd/tomll
|
||||||
@@ -109,7 +134,7 @@ Go-toml provides two handy command line tools:
|
|||||||
|
|
||||||
### Docker image
|
### Docker image
|
||||||
|
|
||||||
Those tools are also availble as a Docker image from
|
Those tools are also available as a Docker image from
|
||||||
[dockerhub](https://hub.docker.com/r/pelletier/go-toml). For example, to
|
[dockerhub](https://hub.docker.com/r/pelletier/go-toml). For example, to
|
||||||
use `tomljson`:
|
use `tomljson`:
|
||||||
|
|
||||||
@@ -148,4 +173,4 @@ this document. The last two major versions of Go are supported
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
The MIT License (MIT). Read [LICENSE](LICENSE).
|
The MIT License (MIT) + Apache 2.0. Read [LICENSE](LICENSE).
|
||||||
|
|||||||
80
vendor/github.com/pelletier/go-toml/azure-pipelines.yml
generated
vendored
80
vendor/github.com/pelletier/go-toml/azure-pipelines.yml
generated
vendored
@@ -2,30 +2,6 @@ trigger:
|
|||||||
- master
|
- master
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- stage: fuzzit
|
|
||||||
displayName: "Run Fuzzit"
|
|
||||||
dependsOn: []
|
|
||||||
condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master'))
|
|
||||||
jobs:
|
|
||||||
- job: submit
|
|
||||||
displayName: "Submit"
|
|
||||||
pool:
|
|
||||||
vmImage: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- task: GoTool@0
|
|
||||||
displayName: "Install Go 1.14"
|
|
||||||
inputs:
|
|
||||||
version: "1.14"
|
|
||||||
- script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/"
|
|
||||||
- script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml
|
|
||||||
- script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml
|
|
||||||
- task: Bash@3
|
|
||||||
inputs:
|
|
||||||
filePath: './fuzzit.sh'
|
|
||||||
env:
|
|
||||||
TYPE: fuzzing
|
|
||||||
FUZZIT_API_KEY: $(FUZZIT_API_KEY)
|
|
||||||
|
|
||||||
- stage: run_checks
|
- stage: run_checks
|
||||||
displayName: "Check"
|
displayName: "Check"
|
||||||
dependsOn: []
|
dependsOn: []
|
||||||
@@ -36,9 +12,9 @@ stages:
|
|||||||
vmImage: ubuntu-latest
|
vmImage: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- task: GoTool@0
|
- task: GoTool@0
|
||||||
displayName: "Install Go 1.14"
|
displayName: "Install Go 1.16"
|
||||||
inputs:
|
inputs:
|
||||||
version: "1.14"
|
version: "1.16"
|
||||||
- task: Go@0
|
- task: Go@0
|
||||||
displayName: "go fmt ./..."
|
displayName: "go fmt ./..."
|
||||||
inputs:
|
inputs:
|
||||||
@@ -51,9 +27,9 @@ stages:
|
|||||||
vmImage: ubuntu-latest
|
vmImage: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- task: GoTool@0
|
- task: GoTool@0
|
||||||
displayName: "Install Go 1.14"
|
displayName: "Install Go 1.16"
|
||||||
inputs:
|
inputs:
|
||||||
version: "1.14"
|
version: "1.16"
|
||||||
- task: Go@0
|
- task: Go@0
|
||||||
displayName: "Generate coverage"
|
displayName: "Generate coverage"
|
||||||
inputs:
|
inputs:
|
||||||
@@ -71,54 +47,36 @@ stages:
|
|||||||
vmImage: ubuntu-latest
|
vmImage: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- task: GoTool@0
|
- task: GoTool@0
|
||||||
displayName: "Install Go 1.14"
|
displayName: "Install Go 1.16"
|
||||||
inputs:
|
inputs:
|
||||||
version: "1.14"
|
version: "1.16"
|
||||||
- script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/"
|
- script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/"
|
||||||
- task: Bash@3
|
- task: Bash@3
|
||||||
inputs:
|
inputs:
|
||||||
filePath: './benchmark.sh'
|
filePath: './benchmark.sh'
|
||||||
arguments: "master $(Build.Repository.Uri)"
|
arguments: "master $(Build.Repository.Uri)"
|
||||||
|
|
||||||
- job: fuzzing
|
|
||||||
displayName: "fuzzing"
|
|
||||||
pool:
|
|
||||||
vmImage: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- task: GoTool@0
|
|
||||||
displayName: "Install Go 1.14"
|
|
||||||
inputs:
|
|
||||||
version: "1.14"
|
|
||||||
- script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/"
|
|
||||||
- script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml
|
|
||||||
- script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml
|
|
||||||
- task: Bash@3
|
|
||||||
inputs:
|
|
||||||
filePath: './fuzzit.sh'
|
|
||||||
env:
|
|
||||||
TYPE: local-regression
|
|
||||||
|
|
||||||
- job: go_unit_tests
|
- job: go_unit_tests
|
||||||
displayName: "unit tests"
|
displayName: "unit tests"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
linux 1.14:
|
linux 1.16:
|
||||||
goVersion: '1.14'
|
goVersion: '1.16'
|
||||||
imageName: 'ubuntu-latest'
|
imageName: 'ubuntu-latest'
|
||||||
mac 1.14:
|
mac 1.16:
|
||||||
goVersion: '1.14'
|
goVersion: '1.16'
|
||||||
imageName: 'macOS-latest'
|
imageName: 'macOS-latest'
|
||||||
windows 1.14:
|
windows 1.16:
|
||||||
goVersion: '1.14'
|
goVersion: '1.16'
|
||||||
imageName: 'windows-latest'
|
imageName: 'windows-latest'
|
||||||
linux 1.13:
|
linux 1.15:
|
||||||
goVersion: '1.13'
|
goVersion: '1.15'
|
||||||
imageName: 'ubuntu-latest'
|
imageName: 'ubuntu-latest'
|
||||||
mac 1.13:
|
mac 1.15:
|
||||||
goVersion: '1.13'
|
goVersion: '1.15'
|
||||||
imageName: 'macOS-latest'
|
imageName: 'macOS-latest'
|
||||||
windows 1.13:
|
windows 1.15:
|
||||||
goVersion: '1.13'
|
goVersion: '1.15'
|
||||||
imageName: 'windows-latest'
|
imageName: 'windows-latest'
|
||||||
pool:
|
pool:
|
||||||
vmImage: $(imageName)
|
vmImage: $(imageName)
|
||||||
@@ -155,7 +113,7 @@ stages:
|
|||||||
- task: GoTool@0
|
- task: GoTool@0
|
||||||
displayName: "Install Go"
|
displayName: "Install Go"
|
||||||
inputs:
|
inputs:
|
||||||
version: 1.14
|
version: 1.16
|
||||||
- task: Bash@3
|
- task: Bash@3
|
||||||
inputs:
|
inputs:
|
||||||
targetType: inline
|
targetType: inline
|
||||||
|
|||||||
164
vendor/github.com/pelletier/go-toml/benchmark.json
generated
vendored
164
vendor/github.com/pelletier/go-toml/benchmark.json
generated
vendored
@@ -1,164 +0,0 @@
|
|||||||
{
|
|
||||||
"array": {
|
|
||||||
"key1": [
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
3
|
|
||||||
],
|
|
||||||
"key2": [
|
|
||||||
"red",
|
|
||||||
"yellow",
|
|
||||||
"green"
|
|
||||||
],
|
|
||||||
"key3": [
|
|
||||||
[
|
|
||||||
1,
|
|
||||||
2
|
|
||||||
],
|
|
||||||
[
|
|
||||||
3,
|
|
||||||
4,
|
|
||||||
5
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"key4": [
|
|
||||||
[
|
|
||||||
1,
|
|
||||||
2
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"a",
|
|
||||||
"b",
|
|
||||||
"c"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"key5": [
|
|
||||||
1,
|
|
||||||
2,
|
|
||||||
3
|
|
||||||
],
|
|
||||||
"key6": [
|
|
||||||
1,
|
|
||||||
2
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"boolean": {
|
|
||||||
"False": false,
|
|
||||||
"True": true
|
|
||||||
},
|
|
||||||
"datetime": {
|
|
||||||
"key1": "1979-05-27T07:32:00Z",
|
|
||||||
"key2": "1979-05-27T00:32:00-07:00",
|
|
||||||
"key3": "1979-05-27T00:32:00.999999-07:00"
|
|
||||||
},
|
|
||||||
"float": {
|
|
||||||
"both": {
|
|
||||||
"key": 6.626e-34
|
|
||||||
},
|
|
||||||
"exponent": {
|
|
||||||
"key1": 5e+22,
|
|
||||||
"key2": 1000000,
|
|
||||||
"key3": -0.02
|
|
||||||
},
|
|
||||||
"fractional": {
|
|
||||||
"key1": 1,
|
|
||||||
"key2": 3.1415,
|
|
||||||
"key3": -0.01
|
|
||||||
},
|
|
||||||
"underscores": {
|
|
||||||
"key1": 9224617.445991227,
|
|
||||||
"key2": 1e+100
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fruit": [{
|
|
||||||
"name": "apple",
|
|
||||||
"physical": {
|
|
||||||
"color": "red",
|
|
||||||
"shape": "round"
|
|
||||||
},
|
|
||||||
"variety": [{
|
|
||||||
"name": "red delicious"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "granny smith"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "banana",
|
|
||||||
"variety": [{
|
|
||||||
"name": "plantain"
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"integer": {
|
|
||||||
"key1": 99,
|
|
||||||
"key2": 42,
|
|
||||||
"key3": 0,
|
|
||||||
"key4": -17,
|
|
||||||
"underscores": {
|
|
||||||
"key1": 1000,
|
|
||||||
"key2": 5349221,
|
|
||||||
"key3": 12345
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"products": [{
|
|
||||||
"name": "Hammer",
|
|
||||||
"sku": 738594937
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
"color": "gray",
|
|
||||||
"name": "Nail",
|
|
||||||
"sku": 284758393
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"string": {
|
|
||||||
"basic": {
|
|
||||||
"basic": "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF."
|
|
||||||
},
|
|
||||||
"literal": {
|
|
||||||
"multiline": {
|
|
||||||
"lines": "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n",
|
|
||||||
"regex2": "I [dw]on't need \\d{2} apples"
|
|
||||||
},
|
|
||||||
"quoted": "Tom \"Dubs\" Preston-Werner",
|
|
||||||
"regex": "\u003c\\i\\c*\\s*\u003e",
|
|
||||||
"winpath": "C:\\Users\\nodejs\\templates",
|
|
||||||
"winpath2": "\\\\ServerX\\admin$\\system32\\"
|
|
||||||
},
|
|
||||||
"multiline": {
|
|
||||||
"continued": {
|
|
||||||
"key1": "The quick brown fox jumps over the lazy dog.",
|
|
||||||
"key2": "The quick brown fox jumps over the lazy dog.",
|
|
||||||
"key3": "The quick brown fox jumps over the lazy dog."
|
|
||||||
},
|
|
||||||
"key1": "One\nTwo",
|
|
||||||
"key2": "One\nTwo",
|
|
||||||
"key3": "One\nTwo"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"table": {
|
|
||||||
"inline": {
|
|
||||||
"name": {
|
|
||||||
"first": "Tom",
|
|
||||||
"last": "Preston-Werner"
|
|
||||||
},
|
|
||||||
"point": {
|
|
||||||
"x": 1,
|
|
||||||
"y": 2
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"key": "value",
|
|
||||||
"subtable": {
|
|
||||||
"key": "another value"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"x": {
|
|
||||||
"y": {
|
|
||||||
"z": {
|
|
||||||
"w": {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
4
vendor/github.com/pelletier/go-toml/benchmark.sh
generated
vendored
4
vendor/github.com/pelletier/go-toml/benchmark.sh
generated
vendored
@@ -20,11 +20,15 @@ git clone ${reference_git} ${ref_tempdir} >/dev/null 2>/dev/null
|
|||||||
pushd ${ref_tempdir} >/dev/null
|
pushd ${ref_tempdir} >/dev/null
|
||||||
git checkout ${reference_ref} >/dev/null 2>/dev/null
|
git checkout ${reference_ref} >/dev/null 2>/dev/null
|
||||||
go test -bench=. -benchmem | tee ${ref_benchmark}
|
go test -bench=. -benchmem | tee ${ref_benchmark}
|
||||||
|
cd benchmark
|
||||||
|
go test -bench=. -benchmem | tee -a ${ref_benchmark}
|
||||||
popd >/dev/null
|
popd >/dev/null
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== local"
|
echo "=== local"
|
||||||
go test -bench=. -benchmem | tee ${local_benchmark}
|
go test -bench=. -benchmem | tee ${local_benchmark}
|
||||||
|
cd benchmark
|
||||||
|
go test -bench=. -benchmem | tee -a ${local_benchmark}
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== diff"
|
echo "=== diff"
|
||||||
|
|||||||
244
vendor/github.com/pelletier/go-toml/benchmark.toml
generated
vendored
244
vendor/github.com/pelletier/go-toml/benchmark.toml
generated
vendored
@@ -1,244 +0,0 @@
|
|||||||
################################################################################
|
|
||||||
## Comment
|
|
||||||
|
|
||||||
# Speak your mind with the hash symbol. They go from the symbol to the end of
|
|
||||||
# the line.
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Table
|
|
||||||
|
|
||||||
# Tables (also known as hash tables or dictionaries) are collections of
|
|
||||||
# key/value pairs. They appear in square brackets on a line by themselves.
|
|
||||||
|
|
||||||
[table]
|
|
||||||
|
|
||||||
key = "value" # Yeah, you can do this.
|
|
||||||
|
|
||||||
# Nested tables are denoted by table names with dots in them. Name your tables
|
|
||||||
# whatever crap you please, just don't use #, ., [ or ].
|
|
||||||
|
|
||||||
[table.subtable]
|
|
||||||
|
|
||||||
key = "another value"
|
|
||||||
|
|
||||||
# You don't need to specify all the super-tables if you don't want to. TOML
|
|
||||||
# knows how to do it for you.
|
|
||||||
|
|
||||||
# [x] you
|
|
||||||
# [x.y] don't
|
|
||||||
# [x.y.z] need these
|
|
||||||
[x.y.z.w] # for this to work
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Inline Table
|
|
||||||
|
|
||||||
# Inline tables provide a more compact syntax for expressing tables. They are
|
|
||||||
# especially useful for grouped data that can otherwise quickly become verbose.
|
|
||||||
# Inline tables are enclosed in curly braces `{` and `}`. No newlines are
|
|
||||||
# allowed between the curly braces unless they are valid within a value.
|
|
||||||
|
|
||||||
[table.inline]
|
|
||||||
|
|
||||||
name = { first = "Tom", last = "Preston-Werner" }
|
|
||||||
point = { x = 1, y = 2 }
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## String
|
|
||||||
|
|
||||||
# There are four ways to express strings: basic, multi-line basic, literal, and
|
|
||||||
# multi-line literal. All strings must contain only valid UTF-8 characters.
|
|
||||||
|
|
||||||
[string.basic]
|
|
||||||
|
|
||||||
basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."
|
|
||||||
|
|
||||||
[string.multiline]
|
|
||||||
|
|
||||||
# The following strings are byte-for-byte equivalent:
|
|
||||||
key1 = "One\nTwo"
|
|
||||||
key2 = """One\nTwo"""
|
|
||||||
key3 = """
|
|
||||||
One
|
|
||||||
Two"""
|
|
||||||
|
|
||||||
[string.multiline.continued]
|
|
||||||
|
|
||||||
# The following strings are byte-for-byte equivalent:
|
|
||||||
key1 = "The quick brown fox jumps over the lazy dog."
|
|
||||||
|
|
||||||
key2 = """
|
|
||||||
The quick brown \
|
|
||||||
|
|
||||||
|
|
||||||
fox jumps over \
|
|
||||||
the lazy dog."""
|
|
||||||
|
|
||||||
key3 = """\
|
|
||||||
The quick brown \
|
|
||||||
fox jumps over \
|
|
||||||
the lazy dog.\
|
|
||||||
"""
|
|
||||||
|
|
||||||
[string.literal]
|
|
||||||
|
|
||||||
# What you see is what you get.
|
|
||||||
winpath = 'C:\Users\nodejs\templates'
|
|
||||||
winpath2 = '\\ServerX\admin$\system32\'
|
|
||||||
quoted = 'Tom "Dubs" Preston-Werner'
|
|
||||||
regex = '<\i\c*\s*>'
|
|
||||||
|
|
||||||
|
|
||||||
[string.literal.multiline]
|
|
||||||
|
|
||||||
regex2 = '''I [dw]on't need \d{2} apples'''
|
|
||||||
lines = '''
|
|
||||||
The first newline is
|
|
||||||
trimmed in raw strings.
|
|
||||||
All other whitespace
|
|
||||||
is preserved.
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Integer
|
|
||||||
|
|
||||||
# Integers are whole numbers. Positive numbers may be prefixed with a plus sign.
|
|
||||||
# Negative numbers are prefixed with a minus sign.
|
|
||||||
|
|
||||||
[integer]
|
|
||||||
|
|
||||||
key1 = +99
|
|
||||||
key2 = 42
|
|
||||||
key3 = 0
|
|
||||||
key4 = -17
|
|
||||||
|
|
||||||
[integer.underscores]
|
|
||||||
|
|
||||||
# For large numbers, you may use underscores to enhance readability. Each
|
|
||||||
# underscore must be surrounded by at least one digit.
|
|
||||||
key1 = 1_000
|
|
||||||
key2 = 5_349_221
|
|
||||||
key3 = 1_2_3_4_5 # valid but inadvisable
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Float
|
|
||||||
|
|
||||||
# A float consists of an integer part (which may be prefixed with a plus or
|
|
||||||
# minus sign) followed by a fractional part and/or an exponent part.
|
|
||||||
|
|
||||||
[float.fractional]
|
|
||||||
|
|
||||||
key1 = +1.0
|
|
||||||
key2 = 3.1415
|
|
||||||
key3 = -0.01
|
|
||||||
|
|
||||||
[float.exponent]
|
|
||||||
|
|
||||||
key1 = 5e+22
|
|
||||||
key2 = 1e6
|
|
||||||
key3 = -2E-2
|
|
||||||
|
|
||||||
[float.both]
|
|
||||||
|
|
||||||
key = 6.626e-34
|
|
||||||
|
|
||||||
[float.underscores]
|
|
||||||
|
|
||||||
key1 = 9_224_617.445_991_228_313
|
|
||||||
key2 = 1e1_00
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Boolean
|
|
||||||
|
|
||||||
# Booleans are just the tokens you're used to. Always lowercase.
|
|
||||||
|
|
||||||
[boolean]
|
|
||||||
|
|
||||||
True = true
|
|
||||||
False = false
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Datetime
|
|
||||||
|
|
||||||
# Datetimes are RFC 3339 dates.
|
|
||||||
|
|
||||||
[datetime]
|
|
||||||
|
|
||||||
key1 = 1979-05-27T07:32:00Z
|
|
||||||
key2 = 1979-05-27T00:32:00-07:00
|
|
||||||
key3 = 1979-05-27T00:32:00.999999-07:00
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Array
|
|
||||||
|
|
||||||
# Arrays are square brackets with other primitives inside. Whitespace is
|
|
||||||
# ignored. Elements are separated by commas. Data types may not be mixed.
|
|
||||||
|
|
||||||
[array]
|
|
||||||
|
|
||||||
key1 = [ 1, 2, 3 ]
|
|
||||||
key2 = [ "red", "yellow", "green" ]
|
|
||||||
key3 = [ [ 1, 2 ], [3, 4, 5] ]
|
|
||||||
#key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok
|
|
||||||
|
|
||||||
# Arrays can also be multiline. So in addition to ignoring whitespace, arrays
|
|
||||||
# also ignore newlines between the brackets. Terminating commas are ok before
|
|
||||||
# the closing bracket.
|
|
||||||
|
|
||||||
key5 = [
|
|
||||||
1, 2, 3
|
|
||||||
]
|
|
||||||
key6 = [
|
|
||||||
1,
|
|
||||||
2, # this is ok
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
## Array of Tables
|
|
||||||
|
|
||||||
# These can be expressed by using a table name in double brackets. Each table
|
|
||||||
# with the same double bracketed name will be an element in the array. The
|
|
||||||
# tables are inserted in the order encountered.
|
|
||||||
|
|
||||||
[[products]]
|
|
||||||
|
|
||||||
name = "Hammer"
|
|
||||||
sku = 738594937
|
|
||||||
|
|
||||||
[[products]]
|
|
||||||
|
|
||||||
[[products]]
|
|
||||||
|
|
||||||
name = "Nail"
|
|
||||||
sku = 284758393
|
|
||||||
color = "gray"
|
|
||||||
|
|
||||||
|
|
||||||
# You can create nested arrays of tables as well.
|
|
||||||
|
|
||||||
[[fruit]]
|
|
||||||
name = "apple"
|
|
||||||
|
|
||||||
[fruit.physical]
|
|
||||||
color = "red"
|
|
||||||
shape = "round"
|
|
||||||
|
|
||||||
[[fruit.variety]]
|
|
||||||
name = "red delicious"
|
|
||||||
|
|
||||||
[[fruit.variety]]
|
|
||||||
name = "granny smith"
|
|
||||||
|
|
||||||
[[fruit]]
|
|
||||||
name = "banana"
|
|
||||||
|
|
||||||
[[fruit.variety]]
|
|
||||||
name = "plantain"
|
|
||||||
121
vendor/github.com/pelletier/go-toml/benchmark.yml
generated
vendored
121
vendor/github.com/pelletier/go-toml/benchmark.yml
generated
vendored
@@ -1,121 +0,0 @@
|
|||||||
---
|
|
||||||
array:
|
|
||||||
key1:
|
|
||||||
- 1
|
|
||||||
- 2
|
|
||||||
- 3
|
|
||||||
key2:
|
|
||||||
- red
|
|
||||||
- yellow
|
|
||||||
- green
|
|
||||||
key3:
|
|
||||||
- - 1
|
|
||||||
- 2
|
|
||||||
- - 3
|
|
||||||
- 4
|
|
||||||
- 5
|
|
||||||
key4:
|
|
||||||
- - 1
|
|
||||||
- 2
|
|
||||||
- - a
|
|
||||||
- b
|
|
||||||
- c
|
|
||||||
key5:
|
|
||||||
- 1
|
|
||||||
- 2
|
|
||||||
- 3
|
|
||||||
key6:
|
|
||||||
- 1
|
|
||||||
- 2
|
|
||||||
boolean:
|
|
||||||
'False': false
|
|
||||||
'True': true
|
|
||||||
datetime:
|
|
||||||
key1: '1979-05-27T07:32:00Z'
|
|
||||||
key2: '1979-05-27T00:32:00-07:00'
|
|
||||||
key3: '1979-05-27T00:32:00.999999-07:00'
|
|
||||||
float:
|
|
||||||
both:
|
|
||||||
key: 6.626e-34
|
|
||||||
exponent:
|
|
||||||
key1: 5.0e+22
|
|
||||||
key2: 1000000
|
|
||||||
key3: -0.02
|
|
||||||
fractional:
|
|
||||||
key1: 1
|
|
||||||
key2: 3.1415
|
|
||||||
key3: -0.01
|
|
||||||
underscores:
|
|
||||||
key1: 9224617.445991227
|
|
||||||
key2: 1.0e+100
|
|
||||||
fruit:
|
|
||||||
- name: apple
|
|
||||||
physical:
|
|
||||||
color: red
|
|
||||||
shape: round
|
|
||||||
variety:
|
|
||||||
- name: red delicious
|
|
||||||
- name: granny smith
|
|
||||||
- name: banana
|
|
||||||
variety:
|
|
||||||
- name: plantain
|
|
||||||
integer:
|
|
||||||
key1: 99
|
|
||||||
key2: 42
|
|
||||||
key3: 0
|
|
||||||
key4: -17
|
|
||||||
underscores:
|
|
||||||
key1: 1000
|
|
||||||
key2: 5349221
|
|
||||||
key3: 12345
|
|
||||||
products:
|
|
||||||
- name: Hammer
|
|
||||||
sku: 738594937
|
|
||||||
- {}
|
|
||||||
- color: gray
|
|
||||||
name: Nail
|
|
||||||
sku: 284758393
|
|
||||||
string:
|
|
||||||
basic:
|
|
||||||
basic: "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF."
|
|
||||||
literal:
|
|
||||||
multiline:
|
|
||||||
lines: |
|
|
||||||
The first newline is
|
|
||||||
trimmed in raw strings.
|
|
||||||
All other whitespace
|
|
||||||
is preserved.
|
|
||||||
regex2: I [dw]on't need \d{2} apples
|
|
||||||
quoted: Tom "Dubs" Preston-Werner
|
|
||||||
regex: "<\\i\\c*\\s*>"
|
|
||||||
winpath: C:\Users\nodejs\templates
|
|
||||||
winpath2: "\\\\ServerX\\admin$\\system32\\"
|
|
||||||
multiline:
|
|
||||||
continued:
|
|
||||||
key1: The quick brown fox jumps over the lazy dog.
|
|
||||||
key2: The quick brown fox jumps over the lazy dog.
|
|
||||||
key3: The quick brown fox jumps over the lazy dog.
|
|
||||||
key1: |-
|
|
||||||
One
|
|
||||||
Two
|
|
||||||
key2: |-
|
|
||||||
One
|
|
||||||
Two
|
|
||||||
key3: |-
|
|
||||||
One
|
|
||||||
Two
|
|
||||||
table:
|
|
||||||
inline:
|
|
||||||
name:
|
|
||||||
first: Tom
|
|
||||||
last: Preston-Werner
|
|
||||||
point:
|
|
||||||
x: 1
|
|
||||||
y: 2
|
|
||||||
key: value
|
|
||||||
subtable:
|
|
||||||
key: another value
|
|
||||||
x:
|
|
||||||
y:
|
|
||||||
z:
|
|
||||||
w: {}
|
|
||||||
1
vendor/github.com/pelletier/go-toml/example-crlf.toml
generated
vendored
1
vendor/github.com/pelletier/go-toml/example-crlf.toml
generated
vendored
@@ -27,3 +27,4 @@ enabled = true
|
|||||||
|
|
||||||
[clients]
|
[clients]
|
||||||
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
|
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
|
||||||
|
score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported
|
||||||
1
vendor/github.com/pelletier/go-toml/example.toml
generated
vendored
1
vendor/github.com/pelletier/go-toml/example.toml
generated
vendored
@@ -27,3 +27,4 @@ enabled = true
|
|||||||
|
|
||||||
[clients]
|
[clients]
|
||||||
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
|
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
|
||||||
|
score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported
|
||||||
26
vendor/github.com/pelletier/go-toml/fuzzit.sh
generated
vendored
26
vendor/github.com/pelletier/go-toml/fuzzit.sh
generated
vendored
@@ -1,26 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
# go-fuzz doesn't support modules yet, so ensure we do everything
|
|
||||||
# in the old style GOPATH way
|
|
||||||
export GO111MODULE="off"
|
|
||||||
|
|
||||||
# install go-fuzz
|
|
||||||
go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build
|
|
||||||
|
|
||||||
# target name can only contain lower-case letters (a-z), digits (0-9) and a dash (-)
|
|
||||||
# to add another target, make sure to create it with `fuzzit create target`
|
|
||||||
# before using `fuzzit create job`
|
|
||||||
TARGET=toml-fuzzer
|
|
||||||
|
|
||||||
go-fuzz-build -libfuzzer -o ${TARGET}.a github.com/pelletier/go-toml
|
|
||||||
clang -fsanitize=fuzzer ${TARGET}.a -o ${TARGET}
|
|
||||||
|
|
||||||
# install fuzzit for talking to fuzzit.dev service
|
|
||||||
# or latest version:
|
|
||||||
# https://github.com/fuzzitdev/fuzzit/releases/latest/download/fuzzit_Linux_x86_64
|
|
||||||
wget -q -O fuzzit https://github.com/fuzzitdev/fuzzit/releases/download/v2.4.52/fuzzit_Linux_x86_64
|
|
||||||
chmod a+x fuzzit
|
|
||||||
|
|
||||||
# TODO: change kkowalczyk to go-toml and create toml-fuzzer target there
|
|
||||||
./fuzzit create job --type $TYPE go-toml/${TARGET} ${TARGET}
|
|
||||||
3
vendor/github.com/pelletier/go-toml/keysparsing.go
generated
vendored
3
vendor/github.com/pelletier/go-toml/keysparsing.go
generated
vendored
@@ -5,7 +5,6 @@ package toml
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"unicode"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Convert the bare key group string to an array.
|
// Convert the bare key group string to an array.
|
||||||
@@ -109,5 +108,5 @@ func parseKey(key string) ([]string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isValidBareChar(r rune) bool {
|
func isValidBareChar(r rune) bool {
|
||||||
return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r)
|
return isAlphanumeric(r) || r == '-' || isDigit(r)
|
||||||
}
|
}
|
||||||
|
|||||||
427
vendor/github.com/pelletier/go-toml/lexer.go
generated
vendored
427
vendor/github.com/pelletier/go-toml/lexer.go
generated
vendored
@@ -9,13 +9,10 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var dateRegexp *regexp.Regexp
|
|
||||||
|
|
||||||
// Define state functions
|
// Define state functions
|
||||||
type tomlLexStateFn func() tomlLexStateFn
|
type tomlLexStateFn func() tomlLexStateFn
|
||||||
|
|
||||||
@@ -26,7 +23,7 @@ type tomlLexer struct {
|
|||||||
currentTokenStart int
|
currentTokenStart int
|
||||||
currentTokenStop int
|
currentTokenStop int
|
||||||
tokens []token
|
tokens []token
|
||||||
depth int
|
brackets []rune
|
||||||
line int
|
line int
|
||||||
col int
|
col int
|
||||||
endbufferLine int
|
endbufferLine int
|
||||||
@@ -123,6 +120,8 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn {
|
|||||||
for {
|
for {
|
||||||
next := l.peek()
|
next := l.peek()
|
||||||
switch next {
|
switch next {
|
||||||
|
case '}': // after '{'
|
||||||
|
return l.lexRightCurlyBrace
|
||||||
case '[':
|
case '[':
|
||||||
return l.lexTableKey
|
return l.lexTableKey
|
||||||
case '#':
|
case '#':
|
||||||
@@ -140,10 +139,6 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn {
|
|||||||
l.skip()
|
l.skip()
|
||||||
}
|
}
|
||||||
|
|
||||||
if l.depth > 0 {
|
|
||||||
return l.lexRvalue
|
|
||||||
}
|
|
||||||
|
|
||||||
if isKeyStartChar(next) {
|
if isKeyStartChar(next) {
|
||||||
return l.lexKey
|
return l.lexKey
|
||||||
}
|
}
|
||||||
@@ -167,10 +162,8 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn {
|
|||||||
case '=':
|
case '=':
|
||||||
return l.lexEqual
|
return l.lexEqual
|
||||||
case '[':
|
case '[':
|
||||||
l.depth++
|
|
||||||
return l.lexLeftBracket
|
return l.lexLeftBracket
|
||||||
case ']':
|
case ']':
|
||||||
l.depth--
|
|
||||||
return l.lexRightBracket
|
return l.lexRightBracket
|
||||||
case '{':
|
case '{':
|
||||||
return l.lexLeftCurlyBrace
|
return l.lexLeftCurlyBrace
|
||||||
@@ -188,12 +181,10 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn {
|
|||||||
fallthrough
|
fallthrough
|
||||||
case '\n':
|
case '\n':
|
||||||
l.skip()
|
l.skip()
|
||||||
if l.depth == 0 {
|
if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '[' {
|
||||||
return l.lexVoid
|
return l.lexRvalue
|
||||||
}
|
}
|
||||||
return l.lexRvalue
|
return l.lexVoid
|
||||||
case '_':
|
|
||||||
return l.errorf("cannot start number with underscore")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if l.follow("true") {
|
if l.follow("true") {
|
||||||
@@ -222,22 +213,12 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
possibleDate := l.peekString(35)
|
if next == '+' || next == '-' {
|
||||||
dateSubmatches := dateRegexp.FindStringSubmatch(possibleDate)
|
|
||||||
if dateSubmatches != nil && dateSubmatches[0] != "" {
|
|
||||||
l.fastForward(len(dateSubmatches[0]))
|
|
||||||
if dateSubmatches[2] == "" { // no timezone information => local date
|
|
||||||
return l.lexLocalDate
|
|
||||||
}
|
|
||||||
return l.lexDate
|
|
||||||
}
|
|
||||||
|
|
||||||
if next == '+' || next == '-' || isDigit(next) {
|
|
||||||
return l.lexNumber
|
return l.lexNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
if isAlphanumeric(next) {
|
if isDigit(next) {
|
||||||
return l.lexKey
|
return l.lexDateTimeOrNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
return l.errorf("no value can start with %c", next)
|
return l.errorf("no value can start with %c", next)
|
||||||
@@ -247,28 +228,290 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *tomlLexer) lexDateTimeOrNumber() tomlLexStateFn {
|
||||||
|
// Could be either a date/time, or a digit.
|
||||||
|
// The options for date/times are:
|
||||||
|
// YYYY-... => date or date-time
|
||||||
|
// HH:... => time
|
||||||
|
// Anything else should be a number.
|
||||||
|
|
||||||
|
lookAhead := l.peekString(5)
|
||||||
|
if len(lookAhead) < 3 {
|
||||||
|
return l.lexNumber()
|
||||||
|
}
|
||||||
|
|
||||||
|
for idx, r := range lookAhead {
|
||||||
|
if !isDigit(r) {
|
||||||
|
if idx == 2 && r == ':' {
|
||||||
|
return l.lexDateTimeOrTime()
|
||||||
|
}
|
||||||
|
if idx == 4 && r == '-' {
|
||||||
|
return l.lexDateTimeOrTime()
|
||||||
|
}
|
||||||
|
return l.lexNumber()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l.lexNumber()
|
||||||
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn {
|
func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn {
|
||||||
l.next()
|
l.next()
|
||||||
l.emit(tokenLeftCurlyBrace)
|
l.emit(tokenLeftCurlyBrace)
|
||||||
|
l.brackets = append(l.brackets, '{')
|
||||||
return l.lexVoid
|
return l.lexVoid
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn {
|
func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn {
|
||||||
l.next()
|
l.next()
|
||||||
l.emit(tokenRightCurlyBrace)
|
l.emit(tokenRightCurlyBrace)
|
||||||
|
if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '{' {
|
||||||
|
return l.errorf("cannot have '}' here")
|
||||||
|
}
|
||||||
|
l.brackets = l.brackets[:len(l.brackets)-1]
|
||||||
return l.lexRvalue
|
return l.lexRvalue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) lexDate() tomlLexStateFn {
|
func (l *tomlLexer) lexDateTimeOrTime() tomlLexStateFn {
|
||||||
l.emit(tokenDate)
|
// Example matches:
|
||||||
return l.lexRvalue
|
// 1979-05-27T07:32:00Z
|
||||||
|
// 1979-05-27T00:32:00-07:00
|
||||||
|
// 1979-05-27T00:32:00.999999-07:00
|
||||||
|
// 1979-05-27 07:32:00Z
|
||||||
|
// 1979-05-27 00:32:00-07:00
|
||||||
|
// 1979-05-27 00:32:00.999999-07:00
|
||||||
|
// 1979-05-27T07:32:00
|
||||||
|
// 1979-05-27T00:32:00.999999
|
||||||
|
// 1979-05-27 07:32:00
|
||||||
|
// 1979-05-27 00:32:00.999999
|
||||||
|
// 1979-05-27
|
||||||
|
// 07:32:00
|
||||||
|
// 00:32:00.999999
|
||||||
|
|
||||||
|
// we already know those two are digits
|
||||||
|
l.next()
|
||||||
|
l.next()
|
||||||
|
|
||||||
|
// Got 2 digits. At that point it could be either a time or a date(-time).
|
||||||
|
|
||||||
|
r := l.next()
|
||||||
|
if r == ':' {
|
||||||
|
return l.lexTime()
|
||||||
|
}
|
||||||
|
|
||||||
|
return l.lexDateTime()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) lexLocalDate() tomlLexStateFn {
|
func (l *tomlLexer) lexDateTime() tomlLexStateFn {
|
||||||
|
// This state accepts an offset date-time, a local date-time, or a local date.
|
||||||
|
//
|
||||||
|
// v--- cursor
|
||||||
|
// 1979-05-27T07:32:00Z
|
||||||
|
// 1979-05-27T00:32:00-07:00
|
||||||
|
// 1979-05-27T00:32:00.999999-07:00
|
||||||
|
// 1979-05-27 07:32:00Z
|
||||||
|
// 1979-05-27 00:32:00-07:00
|
||||||
|
// 1979-05-27 00:32:00.999999-07:00
|
||||||
|
// 1979-05-27T07:32:00
|
||||||
|
// 1979-05-27T00:32:00.999999
|
||||||
|
// 1979-05-27 07:32:00
|
||||||
|
// 1979-05-27 00:32:00.999999
|
||||||
|
// 1979-05-27
|
||||||
|
|
||||||
|
// date
|
||||||
|
|
||||||
|
// already checked by lexRvalue
|
||||||
|
l.next() // digit
|
||||||
|
l.next() // -
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid month digit in date: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r := l.next()
|
||||||
|
if r != '-' {
|
||||||
|
return l.errorf("expected - to separate month of a date, not %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid day digit in date: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
l.emit(tokenLocalDate)
|
l.emit(tokenLocalDate)
|
||||||
|
|
||||||
|
r = l.peek()
|
||||||
|
|
||||||
|
if r == eof {
|
||||||
|
|
||||||
|
return l.lexRvalue
|
||||||
|
}
|
||||||
|
|
||||||
|
if r != ' ' && r != 'T' {
|
||||||
|
return l.errorf("incorrect date/time separation character: %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r == ' ' {
|
||||||
|
lookAhead := l.peekString(3)[1:]
|
||||||
|
if len(lookAhead) < 2 {
|
||||||
|
return l.lexRvalue
|
||||||
|
}
|
||||||
|
for _, r := range lookAhead {
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.lexRvalue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l.skip() // skip the T or ' '
|
||||||
|
|
||||||
|
// time
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid hour digit in time: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = l.next()
|
||||||
|
if r != ':' {
|
||||||
|
return l.errorf("time hour/minute separator should be :, not %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid minute digit in time: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = l.next()
|
||||||
|
if r != ':' {
|
||||||
|
return l.errorf("time minute/second separator should be :, not %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid second digit in time: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = l.peek()
|
||||||
|
if r == '.' {
|
||||||
|
l.next()
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("expected at least one digit in time's fraction, not %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
r := l.peek()
|
||||||
|
if !isDigit(r) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
l.next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l.emit(tokenLocalTime)
|
||||||
|
|
||||||
|
return l.lexTimeOffset
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *tomlLexer) lexTimeOffset() tomlLexStateFn {
|
||||||
|
// potential offset
|
||||||
|
|
||||||
|
// Z
|
||||||
|
// -07:00
|
||||||
|
// +07:00
|
||||||
|
// nothing
|
||||||
|
|
||||||
|
r := l.peek()
|
||||||
|
|
||||||
|
if r == 'Z' {
|
||||||
|
l.next()
|
||||||
|
l.emit(tokenTimeOffset)
|
||||||
|
} else if r == '+' || r == '-' {
|
||||||
|
l.next()
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid hour digit in time offset: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = l.next()
|
||||||
|
if r != ':' {
|
||||||
|
return l.errorf("time offset hour/minute separator should be :, not %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid minute digit in time offset: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l.emit(tokenTimeOffset)
|
||||||
|
}
|
||||||
|
|
||||||
return l.lexRvalue
|
return l.lexRvalue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *tomlLexer) lexTime() tomlLexStateFn {
|
||||||
|
// v--- cursor
|
||||||
|
// 07:32:00
|
||||||
|
// 00:32:00.999999
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid minute digit in time: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r := l.next()
|
||||||
|
if r != ':' {
|
||||||
|
return l.errorf("time minute/second separator should be :, not %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("invalid second digit in time: %c", r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
r = l.peek()
|
||||||
|
if r == '.' {
|
||||||
|
l.next()
|
||||||
|
r := l.next()
|
||||||
|
if !isDigit(r) {
|
||||||
|
return l.errorf("expected at least one digit in time's fraction, not %c", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
r := l.peek()
|
||||||
|
if !isDigit(r) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
l.next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l.emit(tokenLocalTime)
|
||||||
|
return l.lexRvalue
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) lexTrue() tomlLexStateFn {
|
func (l *tomlLexer) lexTrue() tomlLexStateFn {
|
||||||
l.fastForward(4)
|
l.fastForward(4)
|
||||||
l.emit(tokenTrue)
|
l.emit(tokenTrue)
|
||||||
@@ -302,13 +545,16 @@ func (l *tomlLexer) lexEqual() tomlLexStateFn {
|
|||||||
func (l *tomlLexer) lexComma() tomlLexStateFn {
|
func (l *tomlLexer) lexComma() tomlLexStateFn {
|
||||||
l.next()
|
l.next()
|
||||||
l.emit(tokenComma)
|
l.emit(tokenComma)
|
||||||
|
if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '{' {
|
||||||
|
return l.lexVoid
|
||||||
|
}
|
||||||
return l.lexRvalue
|
return l.lexRvalue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse the key and emits its value without escape sequences.
|
// Parse the key and emits its value without escape sequences.
|
||||||
// bare keys, basic string keys and literal string keys are supported.
|
// bare keys, basic string keys and literal string keys are supported.
|
||||||
func (l *tomlLexer) lexKey() tomlLexStateFn {
|
func (l *tomlLexer) lexKey() tomlLexStateFn {
|
||||||
growingString := ""
|
var sb strings.Builder
|
||||||
|
|
||||||
for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() {
|
for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() {
|
||||||
if r == '"' {
|
if r == '"' {
|
||||||
@@ -317,7 +563,9 @@ func (l *tomlLexer) lexKey() tomlLexStateFn {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return l.errorf(err.Error())
|
return l.errorf(err.Error())
|
||||||
}
|
}
|
||||||
growingString += "\"" + str + "\""
|
sb.WriteString("\"")
|
||||||
|
sb.WriteString(str)
|
||||||
|
sb.WriteString("\"")
|
||||||
l.next()
|
l.next()
|
||||||
continue
|
continue
|
||||||
} else if r == '\'' {
|
} else if r == '\'' {
|
||||||
@@ -326,22 +574,45 @@ func (l *tomlLexer) lexKey() tomlLexStateFn {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return l.errorf(err.Error())
|
return l.errorf(err.Error())
|
||||||
}
|
}
|
||||||
growingString += "'" + str + "'"
|
sb.WriteString("'")
|
||||||
|
sb.WriteString(str)
|
||||||
|
sb.WriteString("'")
|
||||||
l.next()
|
l.next()
|
||||||
continue
|
continue
|
||||||
} else if r == '\n' {
|
} else if r == '\n' {
|
||||||
return l.errorf("keys cannot contain new lines")
|
return l.errorf("keys cannot contain new lines")
|
||||||
} else if isSpace(r) {
|
} else if isSpace(r) {
|
||||||
break
|
var str strings.Builder
|
||||||
|
str.WriteString(" ")
|
||||||
|
|
||||||
|
// skip trailing whitespace
|
||||||
|
l.next()
|
||||||
|
for r = l.peek(); isSpace(r); r = l.peek() {
|
||||||
|
str.WriteRune(r)
|
||||||
|
l.next()
|
||||||
|
}
|
||||||
|
// break loop if not a dot
|
||||||
|
if r != '.' {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
str.WriteString(".")
|
||||||
|
// skip trailing whitespace after dot
|
||||||
|
l.next()
|
||||||
|
for r = l.peek(); isSpace(r); r = l.peek() {
|
||||||
|
str.WriteRune(r)
|
||||||
|
l.next()
|
||||||
|
}
|
||||||
|
sb.WriteString(str.String())
|
||||||
|
continue
|
||||||
} else if r == '.' {
|
} else if r == '.' {
|
||||||
// skip
|
// skip
|
||||||
} else if !isValidBareChar(r) {
|
} else if !isValidBareChar(r) {
|
||||||
return l.errorf("keys cannot contain %c character", r)
|
return l.errorf("keys cannot contain %c character", r)
|
||||||
}
|
}
|
||||||
growingString += string(r)
|
sb.WriteRune(r)
|
||||||
l.next()
|
l.next()
|
||||||
}
|
}
|
||||||
l.emitWithValue(tokenKey, growingString)
|
l.emitWithValue(tokenKey, sb.String())
|
||||||
return l.lexVoid
|
return l.lexVoid
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,11 +632,12 @@ func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn {
|
|||||||
func (l *tomlLexer) lexLeftBracket() tomlLexStateFn {
|
func (l *tomlLexer) lexLeftBracket() tomlLexStateFn {
|
||||||
l.next()
|
l.next()
|
||||||
l.emit(tokenLeftBracket)
|
l.emit(tokenLeftBracket)
|
||||||
|
l.brackets = append(l.brackets, '[')
|
||||||
return l.lexRvalue
|
return l.lexRvalue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) {
|
func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) {
|
||||||
growingString := ""
|
var sb strings.Builder
|
||||||
|
|
||||||
if discardLeadingNewLine {
|
if discardLeadingNewLine {
|
||||||
if l.follow("\r\n") {
|
if l.follow("\r\n") {
|
||||||
@@ -379,14 +651,14 @@ func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNe
|
|||||||
// find end of string
|
// find end of string
|
||||||
for {
|
for {
|
||||||
if l.follow(terminator) {
|
if l.follow(terminator) {
|
||||||
return growingString, nil
|
return sb.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
next := l.peek()
|
next := l.peek()
|
||||||
if next == eof {
|
if next == eof {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
growingString += string(l.next())
|
sb.WriteRune(l.next())
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", errors.New("unclosed string")
|
return "", errors.New("unclosed string")
|
||||||
@@ -420,7 +692,7 @@ func (l *tomlLexer) lexLiteralString() tomlLexStateFn {
|
|||||||
// Terminator is the substring indicating the end of the token.
|
// Terminator is the substring indicating the end of the token.
|
||||||
// The resulting string does not include the terminator.
|
// The resulting string does not include the terminator.
|
||||||
func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) {
|
func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) {
|
||||||
growingString := ""
|
var sb strings.Builder
|
||||||
|
|
||||||
if discardLeadingNewLine {
|
if discardLeadingNewLine {
|
||||||
if l.follow("\r\n") {
|
if l.follow("\r\n") {
|
||||||
@@ -433,7 +705,7 @@ func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine,
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
if l.follow(terminator) {
|
if l.follow(terminator) {
|
||||||
return growingString, nil
|
return sb.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if l.follow("\\") {
|
if l.follow("\\") {
|
||||||
@@ -451,72 +723,72 @@ func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine,
|
|||||||
l.next()
|
l.next()
|
||||||
}
|
}
|
||||||
case '"':
|
case '"':
|
||||||
growingString += "\""
|
sb.WriteString("\"")
|
||||||
l.next()
|
l.next()
|
||||||
case 'n':
|
case 'n':
|
||||||
growingString += "\n"
|
sb.WriteString("\n")
|
||||||
l.next()
|
l.next()
|
||||||
case 'b':
|
case 'b':
|
||||||
growingString += "\b"
|
sb.WriteString("\b")
|
||||||
l.next()
|
l.next()
|
||||||
case 'f':
|
case 'f':
|
||||||
growingString += "\f"
|
sb.WriteString("\f")
|
||||||
l.next()
|
l.next()
|
||||||
case '/':
|
case '/':
|
||||||
growingString += "/"
|
sb.WriteString("/")
|
||||||
l.next()
|
l.next()
|
||||||
case 't':
|
case 't':
|
||||||
growingString += "\t"
|
sb.WriteString("\t")
|
||||||
l.next()
|
l.next()
|
||||||
case 'r':
|
case 'r':
|
||||||
growingString += "\r"
|
sb.WriteString("\r")
|
||||||
l.next()
|
l.next()
|
||||||
case '\\':
|
case '\\':
|
||||||
growingString += "\\"
|
sb.WriteString("\\")
|
||||||
l.next()
|
l.next()
|
||||||
case 'u':
|
case 'u':
|
||||||
l.next()
|
l.next()
|
||||||
code := ""
|
var code strings.Builder
|
||||||
for i := 0; i < 4; i++ {
|
for i := 0; i < 4; i++ {
|
||||||
c := l.peek()
|
c := l.peek()
|
||||||
if !isHexDigit(c) {
|
if !isHexDigit(c) {
|
||||||
return "", errors.New("unfinished unicode escape")
|
return "", errors.New("unfinished unicode escape")
|
||||||
}
|
}
|
||||||
l.next()
|
l.next()
|
||||||
code = code + string(c)
|
code.WriteRune(c)
|
||||||
}
|
}
|
||||||
intcode, err := strconv.ParseInt(code, 16, 32)
|
intcode, err := strconv.ParseInt(code.String(), 16, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.New("invalid unicode escape: \\u" + code)
|
return "", errors.New("invalid unicode escape: \\u" + code.String())
|
||||||
}
|
}
|
||||||
growingString += string(rune(intcode))
|
sb.WriteRune(rune(intcode))
|
||||||
case 'U':
|
case 'U':
|
||||||
l.next()
|
l.next()
|
||||||
code := ""
|
var code strings.Builder
|
||||||
for i := 0; i < 8; i++ {
|
for i := 0; i < 8; i++ {
|
||||||
c := l.peek()
|
c := l.peek()
|
||||||
if !isHexDigit(c) {
|
if !isHexDigit(c) {
|
||||||
return "", errors.New("unfinished unicode escape")
|
return "", errors.New("unfinished unicode escape")
|
||||||
}
|
}
|
||||||
l.next()
|
l.next()
|
||||||
code = code + string(c)
|
code.WriteRune(c)
|
||||||
}
|
}
|
||||||
intcode, err := strconv.ParseInt(code, 16, 64)
|
intcode, err := strconv.ParseInt(code.String(), 16, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.New("invalid unicode escape: \\U" + code)
|
return "", errors.New("invalid unicode escape: \\U" + code.String())
|
||||||
}
|
}
|
||||||
growingString += string(rune(intcode))
|
sb.WriteRune(rune(intcode))
|
||||||
default:
|
default:
|
||||||
return "", errors.New("invalid escape sequence: \\" + string(l.peek()))
|
return "", errors.New("invalid escape sequence: \\" + string(l.peek()))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
r := l.peek()
|
r := l.peek()
|
||||||
|
|
||||||
if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) {
|
if 0x00 <= r && r <= 0x1F && r != '\t' && !(acceptNewLines && (r == '\n' || r == '\r')) {
|
||||||
return "", fmt.Errorf("unescaped control character %U", r)
|
return "", fmt.Errorf("unescaped control character %U", r)
|
||||||
}
|
}
|
||||||
l.next()
|
l.next()
|
||||||
growingString += string(r)
|
sb.WriteRune(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
if l.peek() == eof {
|
if l.peek() == eof {
|
||||||
@@ -543,7 +815,6 @@ func (l *tomlLexer) lexString() tomlLexStateFn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines)
|
str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return l.errorf(err.Error())
|
return l.errorf(err.Error())
|
||||||
}
|
}
|
||||||
@@ -615,6 +886,10 @@ func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn {
|
|||||||
func (l *tomlLexer) lexRightBracket() tomlLexStateFn {
|
func (l *tomlLexer) lexRightBracket() tomlLexStateFn {
|
||||||
l.next()
|
l.next()
|
||||||
l.emit(tokenRightBracket)
|
l.emit(tokenRightBracket)
|
||||||
|
if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '[' {
|
||||||
|
return l.errorf("cannot have ']' here")
|
||||||
|
}
|
||||||
|
l.brackets = l.brackets[:len(l.brackets)-1]
|
||||||
return l.lexRvalue
|
return l.lexRvalue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -740,30 +1015,6 @@ func (l *tomlLexer) run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
// Regexp for all date/time formats supported by TOML.
|
|
||||||
// Group 1: nano precision
|
|
||||||
// Group 2: timezone
|
|
||||||
//
|
|
||||||
// /!\ also matches the empty string
|
|
||||||
//
|
|
||||||
// Example matches:
|
|
||||||
//1979-05-27T07:32:00Z
|
|
||||||
//1979-05-27T00:32:00-07:00
|
|
||||||
//1979-05-27T00:32:00.999999-07:00
|
|
||||||
//1979-05-27 07:32:00Z
|
|
||||||
//1979-05-27 00:32:00-07:00
|
|
||||||
//1979-05-27 00:32:00.999999-07:00
|
|
||||||
//1979-05-27T07:32:00
|
|
||||||
//1979-05-27T00:32:00.999999
|
|
||||||
//1979-05-27 07:32:00
|
|
||||||
//1979-05-27 00:32:00.999999
|
|
||||||
//1979-05-27
|
|
||||||
//07:32:00
|
|
||||||
//00:32:00.999999
|
|
||||||
dateRegexp = regexp.MustCompile(`^(?:\d{1,4}-\d{2}-\d{2})?(?:[T ]?\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})?)?`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Entry point
|
// Entry point
|
||||||
func lexToml(inputBytes []byte) []token {
|
func lexToml(inputBytes []byte) []token {
|
||||||
runes := bytes.Runes(inputBytes)
|
runes := bytes.Runes(inputBytes)
|
||||||
|
|||||||
10
vendor/github.com/pelletier/go-toml/localtime.go
generated
vendored
10
vendor/github.com/pelletier/go-toml/localtime.go
generated
vendored
@@ -1,6 +1,12 @@
|
|||||||
// Implementation of TOML's local date/time.
|
// Implementation of TOML's local date/time.
|
||||||
// Copied over from https://github.com/googleapis/google-cloud-go/blob/master/civil/civil.go
|
//
|
||||||
// to avoid pulling all the Google dependencies.
|
// Copied over from Google's civil to avoid pulling all the Google dependencies.
|
||||||
|
// Originals:
|
||||||
|
// https://raw.githubusercontent.com/googleapis/google-cloud-go/ed46f5086358513cf8c25f8e3f022cb838a49d66/civil/civil.go
|
||||||
|
// Changes:
|
||||||
|
// * Renamed files from civil* to localtime*.
|
||||||
|
// * Package changed from civil to toml.
|
||||||
|
// * 'Local' prefix added to all structs.
|
||||||
//
|
//
|
||||||
// Copyright 2016 Google LLC
|
// Copyright 2016 Google LLC
|
||||||
//
|
//
|
||||||
|
|||||||
518
vendor/github.com/pelletier/go-toml/marshal.go
generated
vendored
518
vendor/github.com/pelletier/go-toml/marshal.go
generated
vendored
@@ -2,6 +2,7 @@ package toml
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -17,14 +18,17 @@ const (
|
|||||||
tagFieldComment = "comment"
|
tagFieldComment = "comment"
|
||||||
tagCommented = "commented"
|
tagCommented = "commented"
|
||||||
tagMultiline = "multiline"
|
tagMultiline = "multiline"
|
||||||
|
tagLiteral = "literal"
|
||||||
tagDefault = "default"
|
tagDefault = "default"
|
||||||
)
|
)
|
||||||
|
|
||||||
type tomlOpts struct {
|
type tomlOpts struct {
|
||||||
name string
|
name string
|
||||||
|
nameFromTag bool
|
||||||
comment string
|
comment string
|
||||||
commented bool
|
commented bool
|
||||||
multiline bool
|
multiline bool
|
||||||
|
literal bool
|
||||||
include bool
|
include bool
|
||||||
omitempty bool
|
omitempty bool
|
||||||
defaultValue string
|
defaultValue string
|
||||||
@@ -44,6 +48,7 @@ type annotation struct {
|
|||||||
comment string
|
comment string
|
||||||
commented string
|
commented string
|
||||||
multiline string
|
multiline string
|
||||||
|
literal string
|
||||||
defaultValue string
|
defaultValue string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,15 +57,16 @@ var annotationDefault = annotation{
|
|||||||
comment: tagFieldComment,
|
comment: tagFieldComment,
|
||||||
commented: tagCommented,
|
commented: tagCommented,
|
||||||
multiline: tagMultiline,
|
multiline: tagMultiline,
|
||||||
|
literal: tagLiteral,
|
||||||
defaultValue: tagDefault,
|
defaultValue: tagDefault,
|
||||||
}
|
}
|
||||||
|
|
||||||
type marshalOrder int
|
type MarshalOrder int
|
||||||
|
|
||||||
// Orders the Encoder can write the fields to the output stream.
|
// Orders the Encoder can write the fields to the output stream.
|
||||||
const (
|
const (
|
||||||
// Sort fields alphabetically.
|
// Sort fields alphabetically.
|
||||||
OrderAlphabetical marshalOrder = iota + 1
|
OrderAlphabetical MarshalOrder = iota + 1
|
||||||
// Preserve the order the fields are encountered. For example, the order of fields in
|
// Preserve the order the fields are encountered. For example, the order of fields in
|
||||||
// a struct.
|
// a struct.
|
||||||
OrderPreserve
|
OrderPreserve
|
||||||
@@ -68,9 +74,13 @@ const (
|
|||||||
|
|
||||||
var timeType = reflect.TypeOf(time.Time{})
|
var timeType = reflect.TypeOf(time.Time{})
|
||||||
var marshalerType = reflect.TypeOf(new(Marshaler)).Elem()
|
var marshalerType = reflect.TypeOf(new(Marshaler)).Elem()
|
||||||
|
var unmarshalerType = reflect.TypeOf(new(Unmarshaler)).Elem()
|
||||||
|
var textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem()
|
||||||
|
var textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem()
|
||||||
var localDateType = reflect.TypeOf(LocalDate{})
|
var localDateType = reflect.TypeOf(LocalDate{})
|
||||||
var localTimeType = reflect.TypeOf(LocalTime{})
|
var localTimeType = reflect.TypeOf(LocalTime{})
|
||||||
var localDateTimeType = reflect.TypeOf(LocalDateTime{})
|
var localDateTimeType = reflect.TypeOf(LocalDateTime{})
|
||||||
|
var mapStringInterfaceType = reflect.TypeOf(map[string]interface{}{})
|
||||||
|
|
||||||
// Check if the given marshal type maps to a Tree primitive
|
// Check if the given marshal type maps to a Tree primitive
|
||||||
func isPrimitive(mtype reflect.Type) bool {
|
func isPrimitive(mtype reflect.Type) bool {
|
||||||
@@ -88,12 +98,16 @@ func isPrimitive(mtype reflect.Type) bool {
|
|||||||
case reflect.String:
|
case reflect.String:
|
||||||
return true
|
return true
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType || isCustomMarshaler(mtype)
|
return isTimeType(mtype)
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isTimeType(mtype reflect.Type) bool {
|
||||||
|
return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType
|
||||||
|
}
|
||||||
|
|
||||||
// Check if the given marshal type maps to a Tree slice or array
|
// Check if the given marshal type maps to a Tree slice or array
|
||||||
func isTreeSequence(mtype reflect.Type) bool {
|
func isTreeSequence(mtype reflect.Type) bool {
|
||||||
switch mtype.Kind() {
|
switch mtype.Kind() {
|
||||||
@@ -106,6 +120,30 @@ func isTreeSequence(mtype reflect.Type) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if the given marshal type maps to a slice or array of a custom marshaler type
|
||||||
|
func isCustomMarshalerSequence(mtype reflect.Type) bool {
|
||||||
|
switch mtype.Kind() {
|
||||||
|
case reflect.Ptr:
|
||||||
|
return isCustomMarshalerSequence(mtype.Elem())
|
||||||
|
case reflect.Slice, reflect.Array:
|
||||||
|
return isCustomMarshaler(mtype.Elem()) || isCustomMarshaler(reflect.New(mtype.Elem()).Type())
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the given marshal type maps to a slice or array of a text marshaler type
|
||||||
|
func isTextMarshalerSequence(mtype reflect.Type) bool {
|
||||||
|
switch mtype.Kind() {
|
||||||
|
case reflect.Ptr:
|
||||||
|
return isTextMarshalerSequence(mtype.Elem())
|
||||||
|
case reflect.Slice, reflect.Array:
|
||||||
|
return isTextMarshaler(mtype.Elem()) || isTextMarshaler(reflect.New(mtype.Elem()).Type())
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check if the given marshal type maps to a non-Tree slice or array
|
// Check if the given marshal type maps to a non-Tree slice or array
|
||||||
func isOtherSequence(mtype reflect.Type) bool {
|
func isOtherSequence(mtype reflect.Type) bool {
|
||||||
switch mtype.Kind() {
|
switch mtype.Kind() {
|
||||||
@@ -140,12 +178,42 @@ func callCustomMarshaler(mval reflect.Value) ([]byte, error) {
|
|||||||
return mval.Interface().(Marshaler).MarshalTOML()
|
return mval.Interface().(Marshaler).MarshalTOML()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isTextMarshaler(mtype reflect.Type) bool {
|
||||||
|
return mtype.Implements(textMarshalerType) && !isTimeType(mtype)
|
||||||
|
}
|
||||||
|
|
||||||
|
func callTextMarshaler(mval reflect.Value) ([]byte, error) {
|
||||||
|
return mval.Interface().(encoding.TextMarshaler).MarshalText()
|
||||||
|
}
|
||||||
|
|
||||||
|
func isCustomUnmarshaler(mtype reflect.Type) bool {
|
||||||
|
return mtype.Implements(unmarshalerType)
|
||||||
|
}
|
||||||
|
|
||||||
|
func callCustomUnmarshaler(mval reflect.Value, tval interface{}) error {
|
||||||
|
return mval.Interface().(Unmarshaler).UnmarshalTOML(tval)
|
||||||
|
}
|
||||||
|
|
||||||
|
func isTextUnmarshaler(mtype reflect.Type) bool {
|
||||||
|
return mtype.Implements(textUnmarshalerType)
|
||||||
|
}
|
||||||
|
|
||||||
|
func callTextUnmarshaler(mval reflect.Value, text []byte) error {
|
||||||
|
return mval.Interface().(encoding.TextUnmarshaler).UnmarshalText(text)
|
||||||
|
}
|
||||||
|
|
||||||
// Marshaler is the interface implemented by types that
|
// Marshaler is the interface implemented by types that
|
||||||
// can marshal themselves into valid TOML.
|
// can marshal themselves into valid TOML.
|
||||||
type Marshaler interface {
|
type Marshaler interface {
|
||||||
MarshalTOML() ([]byte, error)
|
MarshalTOML() ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unmarshaler is the interface implemented by types that
|
||||||
|
// can unmarshal a TOML description of themselves.
|
||||||
|
type Unmarshaler interface {
|
||||||
|
UnmarshalTOML(interface{}) error
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Marshal returns the TOML encoding of v. Behavior is similar to the Go json
|
Marshal returns the TOML encoding of v. Behavior is similar to the Go json
|
||||||
encoder, except that there is no concept of a Marshaler interface or MarshalTOML
|
encoder, except that there is no concept of a Marshaler interface or MarshalTOML
|
||||||
@@ -190,20 +258,24 @@ type Encoder struct {
|
|||||||
w io.Writer
|
w io.Writer
|
||||||
encOpts
|
encOpts
|
||||||
annotation
|
annotation
|
||||||
line int
|
line int
|
||||||
col int
|
col int
|
||||||
order marshalOrder
|
order MarshalOrder
|
||||||
|
promoteAnon bool
|
||||||
|
compactComments bool
|
||||||
|
indentation string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEncoder returns a new encoder that writes to w.
|
// NewEncoder returns a new encoder that writes to w.
|
||||||
func NewEncoder(w io.Writer) *Encoder {
|
func NewEncoder(w io.Writer) *Encoder {
|
||||||
return &Encoder{
|
return &Encoder{
|
||||||
w: w,
|
w: w,
|
||||||
encOpts: encOptsDefaults,
|
encOpts: encOptsDefaults,
|
||||||
annotation: annotationDefault,
|
annotation: annotationDefault,
|
||||||
line: 0,
|
line: 0,
|
||||||
col: 1,
|
col: 1,
|
||||||
order: OrderAlphabetical,
|
order: OrderAlphabetical,
|
||||||
|
indentation: " ",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,11 +322,17 @@ func (e *Encoder) ArraysWithOneElementPerLine(v bool) *Encoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Order allows to change in which order fields will be written to the output stream.
|
// Order allows to change in which order fields will be written to the output stream.
|
||||||
func (e *Encoder) Order(ord marshalOrder) *Encoder {
|
func (e *Encoder) Order(ord MarshalOrder) *Encoder {
|
||||||
e.order = ord
|
e.order = ord
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Indentation allows to change indentation when marshalling.
|
||||||
|
func (e *Encoder) Indentation(indent string) *Encoder {
|
||||||
|
e.indentation = indent
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
// SetTagName allows changing default tag "toml"
|
// SetTagName allows changing default tag "toml"
|
||||||
func (e *Encoder) SetTagName(v string) *Encoder {
|
func (e *Encoder) SetTagName(v string) *Encoder {
|
||||||
e.tag = v
|
e.tag = v
|
||||||
@@ -279,8 +357,37 @@ func (e *Encoder) SetTagMultiline(v string) *Encoder {
|
|||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PromoteAnonymous allows to change how anonymous struct fields are marshaled.
|
||||||
|
// Usually, they are marshaled as if the inner exported fields were fields in
|
||||||
|
// the outer struct. However, if an anonymous struct field is given a name in
|
||||||
|
// its TOML tag, it is treated like a regular struct field with that name.
|
||||||
|
// rather than being anonymous.
|
||||||
|
//
|
||||||
|
// In case anonymous promotion is enabled, all anonymous structs are promoted
|
||||||
|
// and treated like regular struct fields.
|
||||||
|
func (e *Encoder) PromoteAnonymous(promote bool) *Encoder {
|
||||||
|
e.promoteAnon = promote
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompactComments removes the new line before each comment in the tree.
|
||||||
|
func (e *Encoder) CompactComments(cc bool) *Encoder {
|
||||||
|
e.compactComments = cc
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
func (e *Encoder) marshal(v interface{}) ([]byte, error) {
|
func (e *Encoder) marshal(v interface{}) ([]byte, error) {
|
||||||
|
// Check if indentation is valid
|
||||||
|
for _, char := range e.indentation {
|
||||||
|
if !isSpace(char) {
|
||||||
|
return []byte{}, fmt.Errorf("invalid indentation: must only contains space or tab characters")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mtype := reflect.TypeOf(v)
|
mtype := reflect.TypeOf(v)
|
||||||
|
if mtype == nil {
|
||||||
|
return []byte{}, errors.New("nil cannot be marshaled to TOML")
|
||||||
|
}
|
||||||
|
|
||||||
switch mtype.Kind() {
|
switch mtype.Kind() {
|
||||||
case reflect.Struct, reflect.Map:
|
case reflect.Struct, reflect.Map:
|
||||||
@@ -288,6 +395,9 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) {
|
|||||||
if mtype.Elem().Kind() != reflect.Struct {
|
if mtype.Elem().Kind() != reflect.Struct {
|
||||||
return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML")
|
return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML")
|
||||||
}
|
}
|
||||||
|
if reflect.ValueOf(v).IsNil() {
|
||||||
|
return []byte{}, errors.New("nil pointer cannot be marshaled to TOML")
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return []byte{}, errors.New("Only a struct or map can be marshaled to TOML")
|
return []byte{}, errors.New("Only a struct or map can be marshaled to TOML")
|
||||||
}
|
}
|
||||||
@@ -296,13 +406,16 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) {
|
|||||||
if isCustomMarshaler(mtype) {
|
if isCustomMarshaler(mtype) {
|
||||||
return callCustomMarshaler(sval)
|
return callCustomMarshaler(sval)
|
||||||
}
|
}
|
||||||
|
if isTextMarshaler(mtype) {
|
||||||
|
return callTextMarshaler(sval)
|
||||||
|
}
|
||||||
t, err := e.valueToTree(mtype, sval)
|
t, err := e.valueToTree(mtype, sval)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []byte{}, err
|
return []byte{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
_, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order, false)
|
_, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order, e.indentation, e.compactComments, false)
|
||||||
|
|
||||||
return buf.Bytes(), err
|
return buf.Bytes(), err
|
||||||
}
|
}
|
||||||
@@ -332,12 +445,17 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if tree, ok := val.(*Tree); ok && mtypef.Anonymous && !opts.nameFromTag && !e.promoteAnon {
|
||||||
tval.SetWithOptions(opts.name, SetOptions{
|
e.appendTree(tval, tree)
|
||||||
Comment: opts.comment,
|
} else {
|
||||||
Commented: opts.commented,
|
val = e.wrapTomlValue(val, tval)
|
||||||
Multiline: opts.multiline,
|
tval.SetPathWithOptions([]string{opts.name}, SetOptions{
|
||||||
}, val)
|
Comment: opts.comment,
|
||||||
|
Commented: opts.commented,
|
||||||
|
Multiline: opts.multiline,
|
||||||
|
Literal: opts.literal,
|
||||||
|
}, val)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -370,14 +488,15 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
val = e.wrapTomlValue(val, tval)
|
||||||
if e.quoteMapKeys {
|
if e.quoteMapKeys {
|
||||||
keyStr, err := tomlValueStringRepresentation(key.String(), "", "", e.arraysOneElementPerLine)
|
keyStr, err := tomlValueStringRepresentation(key.String(), "", "", e.order, e.arraysOneElementPerLine)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
tval.SetPath([]string{keyStr}, val)
|
tval.SetPath([]string{keyStr}, val)
|
||||||
} else {
|
} else {
|
||||||
tval.Set(key.String(), val)
|
tval.SetPath([]string{key.String()}, val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -399,9 +518,6 @@ func (e *Encoder) valueToTreeSlice(mtype reflect.Type, mval reflect.Value) ([]*T
|
|||||||
|
|
||||||
// Convert given marshal slice to slice of toml values
|
// Convert given marshal slice to slice of toml values
|
||||||
func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (interface{}, error) {
|
func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (interface{}, error) {
|
||||||
if mtype.Elem().Kind() == reflect.Interface {
|
|
||||||
return nil, fmt.Errorf("marshal can't handle []interface{}")
|
|
||||||
}
|
|
||||||
tval := make([]interface{}, mval.Len(), mval.Len())
|
tval := make([]interface{}, mval.Len(), mval.Len())
|
||||||
for i := 0; i < mval.Len(); i++ {
|
for i := 0; i < mval.Len(); i++ {
|
||||||
val, err := e.valueToToml(mtype.Elem(), mval.Index(i))
|
val, err := e.valueToToml(mtype.Elem(), mval.Index(i))
|
||||||
@@ -415,9 +531,16 @@ func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (int
|
|||||||
|
|
||||||
// Convert given marshal value to toml value
|
// Convert given marshal value to toml value
|
||||||
func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) {
|
func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) {
|
||||||
e.line++
|
|
||||||
if mtype.Kind() == reflect.Ptr {
|
if mtype.Kind() == reflect.Ptr {
|
||||||
return e.valueToToml(mtype.Elem(), mval.Elem())
|
switch {
|
||||||
|
case isCustomMarshaler(mtype):
|
||||||
|
return callCustomMarshaler(mval)
|
||||||
|
case isTextMarshaler(mtype):
|
||||||
|
b, err := callTextMarshaler(mval)
|
||||||
|
return string(b), err
|
||||||
|
default:
|
||||||
|
return e.valueToToml(mtype.Elem(), mval.Elem())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if mtype.Kind() == reflect.Interface {
|
if mtype.Kind() == reflect.Interface {
|
||||||
return e.valueToToml(mval.Elem().Type(), mval.Elem())
|
return e.valueToToml(mval.Elem().Type(), mval.Elem())
|
||||||
@@ -425,12 +548,15 @@ func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface
|
|||||||
switch {
|
switch {
|
||||||
case isCustomMarshaler(mtype):
|
case isCustomMarshaler(mtype):
|
||||||
return callCustomMarshaler(mval)
|
return callCustomMarshaler(mval)
|
||||||
|
case isTextMarshaler(mtype):
|
||||||
|
b, err := callTextMarshaler(mval)
|
||||||
|
return string(b), err
|
||||||
case isTree(mtype):
|
case isTree(mtype):
|
||||||
return e.valueToTree(mtype, mval)
|
return e.valueToTree(mtype, mval)
|
||||||
|
case isOtherSequence(mtype), isCustomMarshalerSequence(mtype), isTextMarshalerSequence(mtype):
|
||||||
|
return e.valueToOtherSlice(mtype, mval)
|
||||||
case isTreeSequence(mtype):
|
case isTreeSequence(mtype):
|
||||||
return e.valueToTreeSlice(mtype, mval)
|
return e.valueToTreeSlice(mtype, mval)
|
||||||
case isOtherSequence(mtype):
|
|
||||||
return e.valueToOtherSlice(mtype, mval)
|
|
||||||
default:
|
default:
|
||||||
switch mtype.Kind() {
|
switch mtype.Kind() {
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
@@ -454,6 +580,39 @@ func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *Encoder) appendTree(t, o *Tree) error {
|
||||||
|
for key, value := range o.values {
|
||||||
|
if _, ok := t.values[key]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if tomlValue, ok := value.(*tomlValue); ok {
|
||||||
|
tomlValue.position.Col = t.position.Col
|
||||||
|
}
|
||||||
|
t.values[key] = value
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a toml value with the current line number as the position line
|
||||||
|
func (e *Encoder) wrapTomlValue(val interface{}, parent *Tree) interface{} {
|
||||||
|
_, isTree := val.(*Tree)
|
||||||
|
_, isTreeS := val.([]*Tree)
|
||||||
|
if isTree || isTreeS {
|
||||||
|
e.line++
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := &tomlValue{
|
||||||
|
value: val,
|
||||||
|
position: Position{
|
||||||
|
e.line,
|
||||||
|
parent.position.Col,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
e.line++
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
// Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v.
|
// Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v.
|
||||||
// Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for
|
// Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for
|
||||||
// sub-structs, and only definite types can be unmarshaled.
|
// sub-structs, and only definite types can be unmarshaled.
|
||||||
@@ -506,6 +665,8 @@ type Decoder struct {
|
|||||||
tval *Tree
|
tval *Tree
|
||||||
encOpts
|
encOpts
|
||||||
tagName string
|
tagName string
|
||||||
|
strict bool
|
||||||
|
visitor visitorState
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDecoder returns a new decoder that reads from r.
|
// NewDecoder returns a new decoder that reads from r.
|
||||||
@@ -536,8 +697,18 @@ func (d *Decoder) SetTagName(v string) *Decoder {
|
|||||||
return d
|
return d
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Strict allows changing to strict decoding. Any fields that are found in the
|
||||||
|
// input data and do not have a corresponding struct member cause an error.
|
||||||
|
func (d *Decoder) Strict(strict bool) *Decoder {
|
||||||
|
d.strict = strict
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Decoder) unmarshal(v interface{}) error {
|
func (d *Decoder) unmarshal(v interface{}) error {
|
||||||
mtype := reflect.TypeOf(v)
|
mtype := reflect.TypeOf(v)
|
||||||
|
if mtype == nil {
|
||||||
|
return errors.New("nil cannot be unmarshaled from TOML")
|
||||||
|
}
|
||||||
if mtype.Kind() != reflect.Ptr {
|
if mtype.Kind() != reflect.Ptr {
|
||||||
return errors.New("only a pointer to struct or map can be unmarshaled from TOML")
|
return errors.New("only a pointer to struct or map can be unmarshaled from TOML")
|
||||||
}
|
}
|
||||||
@@ -546,16 +717,29 @@ func (d *Decoder) unmarshal(v interface{}) error {
|
|||||||
|
|
||||||
switch elem.Kind() {
|
switch elem.Kind() {
|
||||||
case reflect.Struct, reflect.Map:
|
case reflect.Struct, reflect.Map:
|
||||||
|
case reflect.Interface:
|
||||||
|
elem = mapStringInterfaceType
|
||||||
default:
|
default:
|
||||||
return errors.New("only a pointer to struct or map can be unmarshaled from TOML")
|
return errors.New("only a pointer to struct or map can be unmarshaled from TOML")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if reflect.ValueOf(v).IsNil() {
|
||||||
|
return errors.New("nil pointer cannot be unmarshaled from TOML")
|
||||||
|
}
|
||||||
|
|
||||||
vv := reflect.ValueOf(v).Elem()
|
vv := reflect.ValueOf(v).Elem()
|
||||||
|
|
||||||
|
if d.strict {
|
||||||
|
d.visitor = newVisitorState(d.tval)
|
||||||
|
}
|
||||||
|
|
||||||
sval, err := d.valueFromTree(elem, d.tval, &vv)
|
sval, err := d.valueFromTree(elem, d.tval, &vv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := d.visitor.validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
reflect.ValueOf(v).Elem().Set(sval)
|
reflect.ValueOf(v).Elem().Set(sval)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -566,6 +750,21 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V
|
|||||||
if mtype.Kind() == reflect.Ptr {
|
if mtype.Kind() == reflect.Ptr {
|
||||||
return d.unwrapPointer(mtype, tval, mval1)
|
return d.unwrapPointer(mtype, tval, mval1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if pointer to value implements the Unmarshaler interface.
|
||||||
|
if mvalPtr := reflect.New(mtype); isCustomUnmarshaler(mvalPtr.Type()) {
|
||||||
|
d.visitor.visitAll()
|
||||||
|
|
||||||
|
if tval == nil {
|
||||||
|
return mvalPtr.Elem(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := callCustomUnmarshaler(mvalPtr, tval.ToMap()); err != nil {
|
||||||
|
return reflect.ValueOf(nil), fmt.Errorf("unmarshal toml: %v", err)
|
||||||
|
}
|
||||||
|
return mvalPtr.Elem(), nil
|
||||||
|
}
|
||||||
|
|
||||||
var mval reflect.Value
|
var mval reflect.Value
|
||||||
switch mtype.Kind() {
|
switch mtype.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
@@ -597,18 +796,21 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V
|
|||||||
found := false
|
found := false
|
||||||
if tval != nil {
|
if tval != nil {
|
||||||
for _, key := range keysToTry {
|
for _, key := range keysToTry {
|
||||||
exists := tval.Has(key)
|
exists := tval.HasPath([]string{key})
|
||||||
if !exists {
|
if !exists {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val := tval.Get(key)
|
|
||||||
|
d.visitor.push(key)
|
||||||
|
val := tval.GetPath([]string{key})
|
||||||
fval := mval.Field(i)
|
fval := mval.Field(i)
|
||||||
mvalf, err := d.valueFromToml(mtypef.Type, val, &fval)
|
mvalf, err := d.valueFromToml(mtypef.Type, val, &fval)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mval, formatError(err, tval.GetPosition(key))
|
return mval, formatError(err, tval.GetPositionPath([]string{key}))
|
||||||
}
|
}
|
||||||
mval.Field(i).Set(mvalf)
|
mval.Field(i).Set(mvalf)
|
||||||
found = true
|
found = true
|
||||||
|
d.visitor.pop()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -618,32 +820,56 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V
|
|||||||
var val interface{}
|
var val interface{}
|
||||||
var err error
|
var err error
|
||||||
switch mvalf.Kind() {
|
switch mvalf.Kind() {
|
||||||
case reflect.Bool:
|
|
||||||
val, err = strconv.ParseBool(opts.defaultValue)
|
|
||||||
if err != nil {
|
|
||||||
return mval.Field(i), err
|
|
||||||
}
|
|
||||||
case reflect.Int:
|
|
||||||
val, err = strconv.Atoi(opts.defaultValue)
|
|
||||||
if err != nil {
|
|
||||||
return mval.Field(i), err
|
|
||||||
}
|
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
val = opts.defaultValue
|
val = opts.defaultValue
|
||||||
|
case reflect.Bool:
|
||||||
|
val, err = strconv.ParseBool(opts.defaultValue)
|
||||||
|
case reflect.Uint:
|
||||||
|
val, err = strconv.ParseUint(opts.defaultValue, 10, 0)
|
||||||
|
case reflect.Uint8:
|
||||||
|
val, err = strconv.ParseUint(opts.defaultValue, 10, 8)
|
||||||
|
case reflect.Uint16:
|
||||||
|
val, err = strconv.ParseUint(opts.defaultValue, 10, 16)
|
||||||
|
case reflect.Uint32:
|
||||||
|
val, err = strconv.ParseUint(opts.defaultValue, 10, 32)
|
||||||
|
case reflect.Uint64:
|
||||||
|
val, err = strconv.ParseUint(opts.defaultValue, 10, 64)
|
||||||
|
case reflect.Int:
|
||||||
|
val, err = strconv.ParseInt(opts.defaultValue, 10, 0)
|
||||||
|
case reflect.Int8:
|
||||||
|
val, err = strconv.ParseInt(opts.defaultValue, 10, 8)
|
||||||
|
case reflect.Int16:
|
||||||
|
val, err = strconv.ParseInt(opts.defaultValue, 10, 16)
|
||||||
|
case reflect.Int32:
|
||||||
|
val, err = strconv.ParseInt(opts.defaultValue, 10, 32)
|
||||||
case reflect.Int64:
|
case reflect.Int64:
|
||||||
val, err = strconv.ParseInt(opts.defaultValue, 10, 64)
|
// Check if the provided number has a non-numeric extension.
|
||||||
if err != nil {
|
var hasExtension bool
|
||||||
return mval.Field(i), err
|
if len(opts.defaultValue) > 0 {
|
||||||
|
lastChar := opts.defaultValue[len(opts.defaultValue)-1]
|
||||||
|
if lastChar < '0' || lastChar > '9' {
|
||||||
|
hasExtension = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// If the value is a time.Duration with extension, parse as duration.
|
||||||
|
// If the value is an int64 or a time.Duration without extension, parse as number.
|
||||||
|
if hasExtension && mvalf.Type().String() == "time.Duration" {
|
||||||
|
val, err = time.ParseDuration(opts.defaultValue)
|
||||||
|
} else {
|
||||||
|
val, err = strconv.ParseInt(opts.defaultValue, 10, 64)
|
||||||
|
}
|
||||||
|
case reflect.Float32:
|
||||||
|
val, err = strconv.ParseFloat(opts.defaultValue, 32)
|
||||||
case reflect.Float64:
|
case reflect.Float64:
|
||||||
val, err = strconv.ParseFloat(opts.defaultValue, 64)
|
val, err = strconv.ParseFloat(opts.defaultValue, 64)
|
||||||
if err != nil {
|
|
||||||
return mval.Field(i), err
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return mval.Field(i), fmt.Errorf("unsuported field type for default option")
|
return mvalf, fmt.Errorf("unsupported field type for default option")
|
||||||
}
|
}
|
||||||
mval.Field(i).Set(reflect.ValueOf(val))
|
|
||||||
|
if err != nil {
|
||||||
|
return mvalf, err
|
||||||
|
}
|
||||||
|
mvalf.Set(reflect.ValueOf(val).Convert(mvalf.Type()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// save the old behavior above and try to check structs
|
// save the old behavior above and try to check structs
|
||||||
@@ -652,7 +878,8 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V
|
|||||||
if !mtypef.Anonymous {
|
if !mtypef.Anonymous {
|
||||||
tmpTval = nil
|
tmpTval = nil
|
||||||
}
|
}
|
||||||
v, err := d.valueFromTree(mtypef.Type, tmpTval, nil)
|
fval := mval.Field(i)
|
||||||
|
v, err := d.valueFromTree(mtypef.Type, tmpTval, &fval)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return v, err
|
return v, err
|
||||||
}
|
}
|
||||||
@@ -663,13 +890,15 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V
|
|||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
mval = reflect.MakeMap(mtype)
|
mval = reflect.MakeMap(mtype)
|
||||||
for _, key := range tval.Keys() {
|
for _, key := range tval.Keys() {
|
||||||
|
d.visitor.push(key)
|
||||||
// TODO: path splits key
|
// TODO: path splits key
|
||||||
val := tval.GetPath([]string{key})
|
val := tval.GetPath([]string{key})
|
||||||
mvalf, err := d.valueFromToml(mtype.Elem(), val, nil)
|
mvalf, err := d.valueFromToml(mtype.Elem(), val, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mval, formatError(err, tval.GetPosition(key))
|
return mval, formatError(err, tval.GetPositionPath([]string{key}))
|
||||||
}
|
}
|
||||||
mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf)
|
mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf)
|
||||||
|
d.visitor.pop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mval, nil
|
return mval, nil
|
||||||
@@ -677,22 +906,52 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.V
|
|||||||
|
|
||||||
// Convert toml value to marshal struct/map slice, using marshal type
|
// Convert toml value to marshal struct/map slice, using marshal type
|
||||||
func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) {
|
func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) {
|
||||||
mval := reflect.MakeSlice(mtype, len(tval), len(tval))
|
mval, err := makeSliceOrArray(mtype, len(tval))
|
||||||
|
if err != nil {
|
||||||
|
return mval, err
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < len(tval); i++ {
|
for i := 0; i < len(tval); i++ {
|
||||||
|
d.visitor.push(strconv.Itoa(i))
|
||||||
val, err := d.valueFromTree(mtype.Elem(), tval[i], nil)
|
val, err := d.valueFromTree(mtype.Elem(), tval[i], nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mval, err
|
return mval, err
|
||||||
}
|
}
|
||||||
mval.Index(i).Set(val)
|
mval.Index(i).Set(val)
|
||||||
|
d.visitor.pop()
|
||||||
|
}
|
||||||
|
return mval, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert toml value to marshal primitive slice, using marshal type
|
||||||
|
func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) {
|
||||||
|
mval, err := makeSliceOrArray(mtype, len(tval))
|
||||||
|
if err != nil {
|
||||||
|
return mval, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < len(tval); i++ {
|
||||||
|
val, err := d.valueFromToml(mtype.Elem(), tval[i], nil)
|
||||||
|
if err != nil {
|
||||||
|
return mval, err
|
||||||
|
}
|
||||||
|
mval.Index(i).Set(val)
|
||||||
}
|
}
|
||||||
return mval, nil
|
return mval, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert toml value to marshal primitive slice, using marshal type
|
// Convert toml value to marshal primitive slice, using marshal type
|
||||||
func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) {
|
func (d *Decoder) valueFromOtherSliceI(mtype reflect.Type, tval interface{}) (reflect.Value, error) {
|
||||||
mval := reflect.MakeSlice(mtype, len(tval), len(tval))
|
val := reflect.ValueOf(tval)
|
||||||
for i := 0; i < len(tval); i++ {
|
length := val.Len()
|
||||||
val, err := d.valueFromToml(mtype.Elem(), tval[i], nil)
|
|
||||||
|
mval, err := makeSliceOrArray(mtype, length)
|
||||||
|
if err != nil {
|
||||||
|
return mval, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < length; i++ {
|
||||||
|
val, err := d.valueFromToml(mtype.Elem(), val.Index(i).Interface(), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mval, err
|
return mval, err
|
||||||
}
|
}
|
||||||
@@ -701,6 +960,21 @@ func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (r
|
|||||||
return mval, nil
|
return mval, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a new slice or a new array with specified length
|
||||||
|
func makeSliceOrArray(mtype reflect.Type, tLength int) (reflect.Value, error) {
|
||||||
|
var mval reflect.Value
|
||||||
|
switch mtype.Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
mval = reflect.MakeSlice(mtype, tLength, tLength)
|
||||||
|
case reflect.Array:
|
||||||
|
mval = reflect.New(reflect.ArrayOf(mtype.Len(), mtype.Elem())).Elem()
|
||||||
|
if tLength > mtype.Len() {
|
||||||
|
return mval, fmt.Errorf("unmarshal: TOML array length (%v) exceeds destination array length (%v)", tLength, mtype.Len())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mval, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Convert toml value to marshal value, using marshal type. When mval1 is non-nil
|
// Convert toml value to marshal value, using marshal type. When mval1 is non-nil
|
||||||
// and the given type is a struct value, merge fields into it.
|
// and the given type is a struct value, merge fields into it.
|
||||||
func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) {
|
func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) {
|
||||||
@@ -742,6 +1016,7 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *ref
|
|||||||
}
|
}
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval)
|
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval)
|
||||||
case []interface{}:
|
case []interface{}:
|
||||||
|
d.visitor.visit()
|
||||||
if isOtherSequence(mtype) {
|
if isOtherSequence(mtype) {
|
||||||
return d.valueFromOtherSlice(mtype, t)
|
return d.valueFromOtherSlice(mtype, t)
|
||||||
}
|
}
|
||||||
@@ -755,6 +1030,25 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *ref
|
|||||||
}
|
}
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval)
|
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval)
|
||||||
default:
|
default:
|
||||||
|
d.visitor.visit()
|
||||||
|
mvalPtr := reflect.New(mtype)
|
||||||
|
|
||||||
|
// Check if pointer to value implements the Unmarshaler interface.
|
||||||
|
if isCustomUnmarshaler(mvalPtr.Type()) {
|
||||||
|
if err := callCustomUnmarshaler(mvalPtr, tval); err != nil {
|
||||||
|
return reflect.ValueOf(nil), fmt.Errorf("unmarshal toml: %v", err)
|
||||||
|
}
|
||||||
|
return mvalPtr.Elem(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if pointer to value implements the encoding.TextUnmarshaler.
|
||||||
|
if isTextUnmarshaler(mvalPtr.Type()) && !isTimeType(mtype) {
|
||||||
|
if err := d.unmarshalText(tval, mvalPtr); err != nil {
|
||||||
|
return reflect.ValueOf(nil), fmt.Errorf("unmarshal text: %v", err)
|
||||||
|
}
|
||||||
|
return mvalPtr.Elem(), nil
|
||||||
|
}
|
||||||
|
|
||||||
switch mtype.Kind() {
|
switch mtype.Kind() {
|
||||||
case reflect.Bool, reflect.Struct:
|
case reflect.Bool, reflect.Struct:
|
||||||
val := reflect.ValueOf(tval)
|
val := reflect.ValueOf(tval)
|
||||||
@@ -805,34 +1099,34 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *ref
|
|||||||
}
|
}
|
||||||
return reflect.ValueOf(d), nil
|
return reflect.ValueOf(d), nil
|
||||||
}
|
}
|
||||||
if !val.Type().ConvertibleTo(mtype) {
|
if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 {
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
|
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
|
||||||
}
|
}
|
||||||
if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(mtype).Int()) {
|
if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(reflect.TypeOf(int64(0))).Int()) {
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
|
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
return val.Convert(mtype), nil
|
return val.Convert(mtype), nil
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
||||||
val := reflect.ValueOf(tval)
|
val := reflect.ValueOf(tval)
|
||||||
if !val.Type().ConvertibleTo(mtype) {
|
if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 {
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
|
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
if val.Convert(reflect.TypeOf(int(1))).Int() < 0 {
|
if val.Convert(reflect.TypeOf(int(1))).Int() < 0 {
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String())
|
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String())
|
||||||
}
|
}
|
||||||
if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Convert(mtype).Uint())) {
|
if reflect.Indirect(reflect.New(mtype)).OverflowUint(val.Convert(reflect.TypeOf(uint64(0))).Uint()) {
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
|
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
return val.Convert(mtype), nil
|
return val.Convert(mtype), nil
|
||||||
case reflect.Float32, reflect.Float64:
|
case reflect.Float32, reflect.Float64:
|
||||||
val := reflect.ValueOf(tval)
|
val := reflect.ValueOf(tval)
|
||||||
if !val.Type().ConvertibleTo(mtype) {
|
if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 {
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
|
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
|
||||||
}
|
}
|
||||||
if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(mtype).Float()) {
|
if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(reflect.TypeOf(float64(0))).Float()) {
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
|
return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -844,6 +1138,11 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *ref
|
|||||||
ival := mval1.Elem()
|
ival := mval1.Elem()
|
||||||
return d.valueFromToml(mval1.Elem().Type(), t, &ival)
|
return d.valueFromToml(mval1.Elem().Type(), t, &ival)
|
||||||
}
|
}
|
||||||
|
case reflect.Slice, reflect.Array:
|
||||||
|
if isOtherSequence(mtype) && isOtherSequence(reflect.TypeOf(t)) {
|
||||||
|
return d.valueFromOtherSliceI(mtype, t)
|
||||||
|
}
|
||||||
|
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind())
|
||||||
default:
|
default:
|
||||||
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind())
|
return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind())
|
||||||
}
|
}
|
||||||
@@ -867,6 +1166,12 @@ func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}, mval1 *ref
|
|||||||
return mval, nil
|
return mval, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Decoder) unmarshalText(tval interface{}, mval reflect.Value) error {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
fmt.Fprint(&buf, tval)
|
||||||
|
return callTextUnmarshaler(mval, buf.Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
func tomlOptions(vf reflect.StructField, an annotation) tomlOpts {
|
func tomlOptions(vf reflect.StructField, an annotation) tomlOpts {
|
||||||
tag := vf.Tag.Get(an.tag)
|
tag := vf.Tag.Get(an.tag)
|
||||||
parse := strings.Split(tag, ",")
|
parse := strings.Split(tag, ",")
|
||||||
@@ -876,12 +1181,15 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts {
|
|||||||
}
|
}
|
||||||
commented, _ := strconv.ParseBool(vf.Tag.Get(an.commented))
|
commented, _ := strconv.ParseBool(vf.Tag.Get(an.commented))
|
||||||
multiline, _ := strconv.ParseBool(vf.Tag.Get(an.multiline))
|
multiline, _ := strconv.ParseBool(vf.Tag.Get(an.multiline))
|
||||||
|
literal, _ := strconv.ParseBool(vf.Tag.Get(an.literal))
|
||||||
defaultValue := vf.Tag.Get(tagDefault)
|
defaultValue := vf.Tag.Get(tagDefault)
|
||||||
result := tomlOpts{
|
result := tomlOpts{
|
||||||
name: vf.Name,
|
name: vf.Name,
|
||||||
|
nameFromTag: false,
|
||||||
comment: comment,
|
comment: comment,
|
||||||
commented: commented,
|
commented: commented,
|
||||||
multiline: multiline,
|
multiline: multiline,
|
||||||
|
literal: literal,
|
||||||
include: true,
|
include: true,
|
||||||
omitempty: false,
|
omitempty: false,
|
||||||
defaultValue: defaultValue,
|
defaultValue: defaultValue,
|
||||||
@@ -891,6 +1199,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts {
|
|||||||
result.include = false
|
result.include = false
|
||||||
} else {
|
} else {
|
||||||
result.name = strings.Trim(parse[0], " ")
|
result.name = strings.Trim(parse[0], " ")
|
||||||
|
result.nameFromTag = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if vf.PkgPath != "" {
|
if vf.PkgPath != "" {
|
||||||
@@ -907,11 +1216,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts {
|
|||||||
|
|
||||||
func isZero(val reflect.Value) bool {
|
func isZero(val reflect.Value) bool {
|
||||||
switch val.Type().Kind() {
|
switch val.Type().Kind() {
|
||||||
case reflect.Map:
|
case reflect.Slice, reflect.Array, reflect.Map:
|
||||||
fallthrough
|
|
||||||
case reflect.Array:
|
|
||||||
fallthrough
|
|
||||||
case reflect.Slice:
|
|
||||||
return val.Len() == 0
|
return val.Len() == 0
|
||||||
default:
|
default:
|
||||||
return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface())
|
return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface())
|
||||||
@@ -924,3 +1229,80 @@ func formatError(err error, pos Position) error {
|
|||||||
}
|
}
|
||||||
return fmt.Errorf("%s: %s", pos, err)
|
return fmt.Errorf("%s: %s", pos, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// visitorState keeps track of which keys were unmarshaled.
|
||||||
|
type visitorState struct {
|
||||||
|
tree *Tree
|
||||||
|
path []string
|
||||||
|
keys map[string]struct{}
|
||||||
|
active bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newVisitorState(tree *Tree) visitorState {
|
||||||
|
path, result := []string{}, map[string]struct{}{}
|
||||||
|
insertKeys(path, result, tree)
|
||||||
|
return visitorState{
|
||||||
|
tree: tree,
|
||||||
|
path: path[:0],
|
||||||
|
keys: result,
|
||||||
|
active: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *visitorState) push(key string) {
|
||||||
|
if s.active {
|
||||||
|
s.path = append(s.path, key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *visitorState) pop() {
|
||||||
|
if s.active {
|
||||||
|
s.path = s.path[:len(s.path)-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *visitorState) visit() {
|
||||||
|
if s.active {
|
||||||
|
delete(s.keys, strings.Join(s.path, "."))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *visitorState) visitAll() {
|
||||||
|
if s.active {
|
||||||
|
for k := range s.keys {
|
||||||
|
if strings.HasPrefix(k, strings.Join(s.path, ".")) {
|
||||||
|
delete(s.keys, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *visitorState) validate() error {
|
||||||
|
if !s.active {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
undecoded := make([]string, 0, len(s.keys))
|
||||||
|
for key := range s.keys {
|
||||||
|
undecoded = append(undecoded, key)
|
||||||
|
}
|
||||||
|
sort.Strings(undecoded)
|
||||||
|
if len(undecoded) > 0 {
|
||||||
|
return fmt.Errorf("undecoded keys: %q", undecoded)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func insertKeys(path []string, m map[string]struct{}, tree *Tree) {
|
||||||
|
for k, v := range tree.values {
|
||||||
|
switch node := v.(type) {
|
||||||
|
case []*Tree:
|
||||||
|
for i, item := range node {
|
||||||
|
insertKeys(append(path, k, strconv.Itoa(i)), m, item)
|
||||||
|
}
|
||||||
|
case *Tree:
|
||||||
|
insertKeys(append(path, k), m, node)
|
||||||
|
case *tomlValue:
|
||||||
|
m[strings.Join(append(path, k), ".")] = struct{}{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
117
vendor/github.com/pelletier/go-toml/parser.go
generated
vendored
117
vendor/github.com/pelletier/go-toml/parser.go
generated
vendored
@@ -7,7 +7,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -158,6 +157,11 @@ func (p *tomlParser) parseGroup() tomlParserStateFn {
|
|||||||
if err := p.tree.createSubTree(keys, startToken.Position); err != nil {
|
if err := p.tree.createSubTree(keys, startToken.Position); err != nil {
|
||||||
p.raiseError(key, "%s", err)
|
p.raiseError(key, "%s", err)
|
||||||
}
|
}
|
||||||
|
destTree := p.tree.GetPath(keys)
|
||||||
|
if target, ok := destTree.(*Tree); ok && target != nil && target.inline {
|
||||||
|
p.raiseError(key, "could not re-define exist inline table or its sub-table : %s",
|
||||||
|
strings.Join(keys, "."))
|
||||||
|
}
|
||||||
p.assume(tokenRightBracket)
|
p.assume(tokenRightBracket)
|
||||||
p.currentTable = keys
|
p.currentTable = keys
|
||||||
return p.parseStart
|
return p.parseStart
|
||||||
@@ -201,6 +205,11 @@ func (p *tomlParser) parseAssign() tomlParserStateFn {
|
|||||||
strings.Join(tableKey, "."))
|
strings.Join(tableKey, "."))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if targetNode.inline {
|
||||||
|
p.raiseError(key, "could not add key or sub-table to exist inline table or its sub-table : %s",
|
||||||
|
strings.Join(tableKey, "."))
|
||||||
|
}
|
||||||
|
|
||||||
// assign value to the found table
|
// assign value to the found table
|
||||||
keyVal := parsedKey[len(parsedKey)-1]
|
keyVal := parsedKey[len(parsedKey)-1]
|
||||||
localKey := []string{keyVal}
|
localKey := []string{keyVal}
|
||||||
@@ -221,19 +230,38 @@ func (p *tomlParser) parseAssign() tomlParserStateFn {
|
|||||||
return p.parseStart
|
return p.parseStart
|
||||||
}
|
}
|
||||||
|
|
||||||
var numberUnderscoreInvalidRegexp *regexp.Regexp
|
var errInvalidUnderscore = errors.New("invalid use of _ in number")
|
||||||
var hexNumberUnderscoreInvalidRegexp *regexp.Regexp
|
|
||||||
|
|
||||||
func numberContainsInvalidUnderscore(value string) error {
|
func numberContainsInvalidUnderscore(value string) error {
|
||||||
if numberUnderscoreInvalidRegexp.MatchString(value) {
|
// For large numbers, you may use underscores between digits to enhance
|
||||||
return errors.New("invalid use of _ in number")
|
// readability. Each underscore must be surrounded by at least one digit on
|
||||||
|
// each side.
|
||||||
|
|
||||||
|
hasBefore := false
|
||||||
|
for idx, r := range value {
|
||||||
|
if r == '_' {
|
||||||
|
if !hasBefore || idx+1 >= len(value) {
|
||||||
|
// can't end with an underscore
|
||||||
|
return errInvalidUnderscore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hasBefore = isDigit(r)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var errInvalidUnderscoreHex = errors.New("invalid use of _ in hex number")
|
||||||
|
|
||||||
func hexNumberContainsInvalidUnderscore(value string) error {
|
func hexNumberContainsInvalidUnderscore(value string) error {
|
||||||
if hexNumberUnderscoreInvalidRegexp.MatchString(value) {
|
hasBefore := false
|
||||||
return errors.New("invalid use of _ in hex number")
|
for idx, r := range value {
|
||||||
|
if r == '_' {
|
||||||
|
if !hasBefore || idx+1 >= len(value) {
|
||||||
|
// can't end with an underscore
|
||||||
|
return errInvalidUnderscoreHex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hasBefore = isHexDigit(r)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -312,42 +340,44 @@ func (p *tomlParser) parseRvalue() interface{} {
|
|||||||
p.raiseError(tok, "%s", err)
|
p.raiseError(tok, "%s", err)
|
||||||
}
|
}
|
||||||
return val
|
return val
|
||||||
case tokenDate:
|
case tokenLocalTime:
|
||||||
layout := time.RFC3339Nano
|
val, err := ParseLocalTime(tok.val)
|
||||||
if !strings.Contains(tok.val, "T") {
|
|
||||||
layout = strings.Replace(layout, "T", " ", 1)
|
|
||||||
}
|
|
||||||
val, err := time.ParseInLocation(layout, tok.val, time.UTC)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.raiseError(tok, "%s", err)
|
p.raiseError(tok, "%s", err)
|
||||||
}
|
}
|
||||||
return val
|
return val
|
||||||
case tokenLocalDate:
|
case tokenLocalDate:
|
||||||
v := strings.Replace(tok.val, " ", "T", -1)
|
// a local date may be followed by:
|
||||||
isDateTime := false
|
// * nothing: this is a local date
|
||||||
isTime := false
|
// * a local time: this is a local date-time
|
||||||
for _, c := range v {
|
|
||||||
if c == 'T' || c == 't' {
|
next := p.peek()
|
||||||
isDateTime = true
|
if next == nil || next.typ != tokenLocalTime {
|
||||||
break
|
val, err := ParseLocalDate(tok.val)
|
||||||
}
|
if err != nil {
|
||||||
if c == ':' {
|
p.raiseError(tok, "%s", err)
|
||||||
isTime = true
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
var val interface{}
|
localDate := tok
|
||||||
var err error
|
localTime := p.getToken()
|
||||||
|
|
||||||
if isDateTime {
|
next = p.peek()
|
||||||
val, err = ParseLocalDateTime(v)
|
if next == nil || next.typ != tokenTimeOffset {
|
||||||
} else if isTime {
|
v := localDate.val + "T" + localTime.val
|
||||||
val, err = ParseLocalTime(v)
|
val, err := ParseLocalDateTime(v)
|
||||||
} else {
|
if err != nil {
|
||||||
val, err = ParseLocalDate(v)
|
p.raiseError(tok, "%s", err)
|
||||||
|
}
|
||||||
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
offset := p.getToken()
|
||||||
|
|
||||||
|
layout := time.RFC3339Nano
|
||||||
|
v := localDate.val + "T" + localTime.val + offset.val
|
||||||
|
val, err := time.ParseInLocation(layout, v, time.UTC)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
p.raiseError(tok, "%s", err)
|
p.raiseError(tok, "%s", err)
|
||||||
}
|
}
|
||||||
@@ -360,10 +390,10 @@ func (p *tomlParser) parseRvalue() interface{} {
|
|||||||
p.raiseError(tok, "cannot have multiple equals for the same key")
|
p.raiseError(tok, "cannot have multiple equals for the same key")
|
||||||
case tokenError:
|
case tokenError:
|
||||||
p.raiseError(tok, "%s", tok)
|
p.raiseError(tok, "%s", tok)
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("unhandled token: %v", tok))
|
||||||
}
|
}
|
||||||
|
|
||||||
p.raiseError(tok, "never reached")
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,12 +441,13 @@ Loop:
|
|||||||
if tokenIsComma(previous) {
|
if tokenIsComma(previous) {
|
||||||
p.raiseError(previous, "trailing comma at the end of inline table")
|
p.raiseError(previous, "trailing comma at the end of inline table")
|
||||||
}
|
}
|
||||||
|
tree.inline = true
|
||||||
return tree
|
return tree
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *tomlParser) parseArray() interface{} {
|
func (p *tomlParser) parseArray() interface{} {
|
||||||
var array []interface{}
|
var array []interface{}
|
||||||
arrayType := reflect.TypeOf(nil)
|
arrayType := reflect.TypeOf(newTree())
|
||||||
for {
|
for {
|
||||||
follow := p.peek()
|
follow := p.peek()
|
||||||
if follow == nil || follow.typ == tokenEOF {
|
if follow == nil || follow.typ == tokenEOF {
|
||||||
@@ -427,11 +458,8 @@ func (p *tomlParser) parseArray() interface{} {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
val := p.parseRvalue()
|
val := p.parseRvalue()
|
||||||
if arrayType == nil {
|
|
||||||
arrayType = reflect.TypeOf(val)
|
|
||||||
}
|
|
||||||
if reflect.TypeOf(val) != arrayType {
|
if reflect.TypeOf(val) != arrayType {
|
||||||
p.raiseError(follow, "mixed types in array")
|
arrayType = nil
|
||||||
}
|
}
|
||||||
array = append(array, val)
|
array = append(array, val)
|
||||||
follow = p.peek()
|
follow = p.peek()
|
||||||
@@ -445,6 +473,12 @@ func (p *tomlParser) parseArray() interface{} {
|
|||||||
p.getToken()
|
p.getToken()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the array is a mixed-type array or its length is 0,
|
||||||
|
// don't convert it to a table array
|
||||||
|
if len(array) <= 0 {
|
||||||
|
arrayType = nil
|
||||||
|
}
|
||||||
// An array of Trees is actually an array of inline
|
// An array of Trees is actually an array of inline
|
||||||
// tables, which is a shorthand for a table array. If the
|
// tables, which is a shorthand for a table array. If the
|
||||||
// array was not converted from []interface{} to []*Tree,
|
// array was not converted from []interface{} to []*Tree,
|
||||||
@@ -472,8 +506,3 @@ func parseToml(flow []token) *Tree {
|
|||||||
parser.run()
|
parser.run()
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
numberUnderscoreInvalidRegexp = regexp.MustCompile(`([^\d]_|_[^\d])|_$|^_`)
|
|
||||||
hexNumberUnderscoreInvalidRegexp = regexp.MustCompile(`(^0x_)|([^\da-f]_|_[^\da-f])|_$|^_`)
|
|
||||||
}
|
|
||||||
|
|||||||
15
vendor/github.com/pelletier/go-toml/token.go
generated
vendored
15
vendor/github.com/pelletier/go-toml/token.go
generated
vendored
@@ -1,9 +1,6 @@
|
|||||||
package toml
|
package toml
|
||||||
|
|
||||||
import (
|
import "fmt"
|
||||||
"fmt"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Define tokens
|
// Define tokens
|
||||||
type tokenType int
|
type tokenType int
|
||||||
@@ -33,8 +30,9 @@ const (
|
|||||||
tokenRightParen
|
tokenRightParen
|
||||||
tokenDoubleLeftBracket
|
tokenDoubleLeftBracket
|
||||||
tokenDoubleRightBracket
|
tokenDoubleRightBracket
|
||||||
tokenDate
|
|
||||||
tokenLocalDate
|
tokenLocalDate
|
||||||
|
tokenLocalTime
|
||||||
|
tokenTimeOffset
|
||||||
tokenKeyGroup
|
tokenKeyGroup
|
||||||
tokenKeyGroupArray
|
tokenKeyGroupArray
|
||||||
tokenComma
|
tokenComma
|
||||||
@@ -69,7 +67,8 @@ var tokenTypeNames = []string{
|
|||||||
"]]",
|
"]]",
|
||||||
"[[",
|
"[[",
|
||||||
"LocalDate",
|
"LocalDate",
|
||||||
"LocalDate",
|
"LocalTime",
|
||||||
|
"TimeOffset",
|
||||||
"KeyGroup",
|
"KeyGroup",
|
||||||
"KeyGroupArray",
|
"KeyGroupArray",
|
||||||
",",
|
",",
|
||||||
@@ -112,7 +111,7 @@ func isSpace(r rune) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isAlphanumeric(r rune) bool {
|
func isAlphanumeric(r rune) bool {
|
||||||
return unicode.IsLetter(r) || r == '_'
|
return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || r == '_'
|
||||||
}
|
}
|
||||||
|
|
||||||
func isKeyChar(r rune) bool {
|
func isKeyChar(r rune) bool {
|
||||||
@@ -127,7 +126,7 @@ func isKeyStartChar(r rune) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isDigit(r rune) bool {
|
func isDigit(r rune) bool {
|
||||||
return unicode.IsNumber(r)
|
return '0' <= r && r <= '9'
|
||||||
}
|
}
|
||||||
|
|
||||||
func isHexDigit(r rune) bool {
|
func isHexDigit(r rune) bool {
|
||||||
|
|||||||
138
vendor/github.com/pelletier/go-toml/toml.go
generated
vendored
138
vendor/github.com/pelletier/go-toml/toml.go
generated
vendored
@@ -15,6 +15,7 @@ type tomlValue struct {
|
|||||||
comment string
|
comment string
|
||||||
commented bool
|
commented bool
|
||||||
multiline bool
|
multiline bool
|
||||||
|
literal bool
|
||||||
position Position
|
position Position
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,6 +24,7 @@ type Tree struct {
|
|||||||
values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree
|
values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree
|
||||||
comment string
|
comment string
|
||||||
commented bool
|
commented bool
|
||||||
|
inline bool
|
||||||
position Position
|
position Position
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,6 +123,89 @@ func (t *Tree) GetPath(keys []string) interface{} {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetArray returns the value at key in the Tree.
|
||||||
|
// It returns []string, []int64, etc type if key has homogeneous lists
|
||||||
|
// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings.
|
||||||
|
// Returns nil if the path does not exist in the tree.
|
||||||
|
// If keys is of length zero, the current tree is returned.
|
||||||
|
func (t *Tree) GetArray(key string) interface{} {
|
||||||
|
if key == "" {
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
return t.GetArrayPath(strings.Split(key, "."))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetArrayPath returns the element in the tree indicated by 'keys'.
|
||||||
|
// If keys is of length zero, the current tree is returned.
|
||||||
|
func (t *Tree) GetArrayPath(keys []string) interface{} {
|
||||||
|
if len(keys) == 0 {
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
subtree := t
|
||||||
|
for _, intermediateKey := range keys[:len(keys)-1] {
|
||||||
|
value, exists := subtree.values[intermediateKey]
|
||||||
|
if !exists {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
switch node := value.(type) {
|
||||||
|
case *Tree:
|
||||||
|
subtree = node
|
||||||
|
case []*Tree:
|
||||||
|
// go to most recent element
|
||||||
|
if len(node) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
subtree = node[len(node)-1]
|
||||||
|
default:
|
||||||
|
return nil // cannot navigate through other node types
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// branch based on final node type
|
||||||
|
switch node := subtree.values[keys[len(keys)-1]].(type) {
|
||||||
|
case *tomlValue:
|
||||||
|
switch n := node.value.(type) {
|
||||||
|
case []interface{}:
|
||||||
|
return getArray(n)
|
||||||
|
default:
|
||||||
|
return node.value
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if homogeneous array, then return slice type object over []interface{}
|
||||||
|
func getArray(n []interface{}) interface{} {
|
||||||
|
var s []string
|
||||||
|
var i64 []int64
|
||||||
|
var f64 []float64
|
||||||
|
var bl []bool
|
||||||
|
for _, value := range n {
|
||||||
|
switch v := value.(type) {
|
||||||
|
case string:
|
||||||
|
s = append(s, v)
|
||||||
|
case int64:
|
||||||
|
i64 = append(i64, v)
|
||||||
|
case float64:
|
||||||
|
f64 = append(f64, v)
|
||||||
|
case bool:
|
||||||
|
bl = append(bl, v)
|
||||||
|
default:
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(s) == len(n) {
|
||||||
|
return s
|
||||||
|
} else if len(i64) == len(n) {
|
||||||
|
return i64
|
||||||
|
} else if len(f64) == len(n) {
|
||||||
|
return f64
|
||||||
|
} else if len(bl) == len(n) {
|
||||||
|
return bl
|
||||||
|
}
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
// GetPosition returns the position of the given key.
|
// GetPosition returns the position of the given key.
|
||||||
func (t *Tree) GetPosition(key string) Position {
|
func (t *Tree) GetPosition(key string) Position {
|
||||||
if key == "" {
|
if key == "" {
|
||||||
@@ -129,6 +214,50 @@ func (t *Tree) GetPosition(key string) Position {
|
|||||||
return t.GetPositionPath(strings.Split(key, "."))
|
return t.GetPositionPath(strings.Split(key, "."))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetPositionPath sets the position of element in the tree indicated by 'keys'.
|
||||||
|
// If keys is of length zero, the current tree position is set.
|
||||||
|
func (t *Tree) SetPositionPath(keys []string, pos Position) {
|
||||||
|
if len(keys) == 0 {
|
||||||
|
t.position = pos
|
||||||
|
return
|
||||||
|
}
|
||||||
|
subtree := t
|
||||||
|
for _, intermediateKey := range keys[:len(keys)-1] {
|
||||||
|
value, exists := subtree.values[intermediateKey]
|
||||||
|
if !exists {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch node := value.(type) {
|
||||||
|
case *Tree:
|
||||||
|
subtree = node
|
||||||
|
case []*Tree:
|
||||||
|
// go to most recent element
|
||||||
|
if len(node) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
subtree = node[len(node)-1]
|
||||||
|
default:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// branch based on final node type
|
||||||
|
switch node := subtree.values[keys[len(keys)-1]].(type) {
|
||||||
|
case *tomlValue:
|
||||||
|
node.position = pos
|
||||||
|
return
|
||||||
|
case *Tree:
|
||||||
|
node.position = pos
|
||||||
|
return
|
||||||
|
case []*Tree:
|
||||||
|
// go to most recent element
|
||||||
|
if len(node) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
node[len(node)-1].position = pos
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GetPositionPath returns the element in the tree indicated by 'keys'.
|
// GetPositionPath returns the element in the tree indicated by 'keys'.
|
||||||
// If keys is of length zero, the current tree is returned.
|
// If keys is of length zero, the current tree is returned.
|
||||||
func (t *Tree) GetPositionPath(keys []string) Position {
|
func (t *Tree) GetPositionPath(keys []string) Position {
|
||||||
@@ -186,6 +315,7 @@ type SetOptions struct {
|
|||||||
Comment string
|
Comment string
|
||||||
Commented bool
|
Commented bool
|
||||||
Multiline bool
|
Multiline bool
|
||||||
|
Literal bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetWithOptions is the same as Set, but allows you to provide formatting
|
// SetWithOptions is the same as Set, but allows you to provide formatting
|
||||||
@@ -211,7 +341,8 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac
|
|||||||
// go to most recent element
|
// go to most recent element
|
||||||
if len(node) == 0 {
|
if len(node) == 0 {
|
||||||
// create element if it does not exist
|
// create element if it does not exist
|
||||||
subtree.values[intermediateKey] = append(node, newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}))
|
node = append(node, newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}))
|
||||||
|
subtree.values[intermediateKey] = node
|
||||||
}
|
}
|
||||||
subtree = node[len(node)-1]
|
subtree = node[len(node)-1]
|
||||||
}
|
}
|
||||||
@@ -231,12 +362,16 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac
|
|||||||
toInsert = value
|
toInsert = value
|
||||||
case *tomlValue:
|
case *tomlValue:
|
||||||
v.comment = opts.Comment
|
v.comment = opts.Comment
|
||||||
|
v.commented = opts.Commented
|
||||||
|
v.multiline = opts.Multiline
|
||||||
|
v.literal = opts.Literal
|
||||||
toInsert = v
|
toInsert = v
|
||||||
default:
|
default:
|
||||||
toInsert = &tomlValue{value: value,
|
toInsert = &tomlValue{value: value,
|
||||||
comment: opts.Comment,
|
comment: opts.Comment,
|
||||||
commented: opts.Commented,
|
commented: opts.Commented,
|
||||||
multiline: opts.Multiline,
|
multiline: opts.Multiline,
|
||||||
|
literal: opts.Literal,
|
||||||
position: Position{Line: subtree.position.Line + len(subtree.values) + 1, Col: subtree.position.Col}}
|
position: Position{Line: subtree.position.Line + len(subtree.values) + 1, Col: subtree.position.Col}}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,6 +446,7 @@ func (t *Tree) createSubTree(keys []string, pos Position) error {
|
|||||||
if !exists {
|
if !exists {
|
||||||
tree := newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col})
|
tree := newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col})
|
||||||
tree.position = pos
|
tree.position = pos
|
||||||
|
tree.inline = subtree.inline
|
||||||
subtree.values[intermediateKey] = tree
|
subtree.values[intermediateKey] = tree
|
||||||
nextTree = tree
|
nextTree = tree
|
||||||
}
|
}
|
||||||
|
|||||||
71
vendor/github.com/pelletier/go-toml/tomlpub.go
generated
vendored
Normal file
71
vendor/github.com/pelletier/go-toml/tomlpub.go
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
package toml
|
||||||
|
|
||||||
|
// PubTOMLValue wrapping tomlValue in order to access all properties from outside.
|
||||||
|
type PubTOMLValue = tomlValue
|
||||||
|
|
||||||
|
func (ptv *PubTOMLValue) Value() interface{} {
|
||||||
|
return ptv.value
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) Comment() string {
|
||||||
|
return ptv.comment
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) Commented() bool {
|
||||||
|
return ptv.commented
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) Multiline() bool {
|
||||||
|
return ptv.multiline
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) Position() Position {
|
||||||
|
return ptv.position
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ptv *PubTOMLValue) SetValue(v interface{}) {
|
||||||
|
ptv.value = v
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) SetComment(s string) {
|
||||||
|
ptv.comment = s
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) SetCommented(c bool) {
|
||||||
|
ptv.commented = c
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) SetMultiline(m bool) {
|
||||||
|
ptv.multiline = m
|
||||||
|
}
|
||||||
|
func (ptv *PubTOMLValue) SetPosition(p Position) {
|
||||||
|
ptv.position = p
|
||||||
|
}
|
||||||
|
|
||||||
|
// PubTree wrapping Tree in order to access all properties from outside.
|
||||||
|
type PubTree = Tree
|
||||||
|
|
||||||
|
func (pt *PubTree) Values() map[string]interface{} {
|
||||||
|
return pt.values
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pt *PubTree) Comment() string {
|
||||||
|
return pt.comment
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pt *PubTree) Commented() bool {
|
||||||
|
return pt.commented
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pt *PubTree) Inline() bool {
|
||||||
|
return pt.inline
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pt *PubTree) SetValues(v map[string]interface{}) {
|
||||||
|
pt.values = v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pt *PubTree) SetComment(c string) {
|
||||||
|
pt.comment = c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pt *PubTree) SetCommented(c bool) {
|
||||||
|
pt.commented = c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pt *PubTree) SetInline(i bool) {
|
||||||
|
pt.inline = i
|
||||||
|
}
|
||||||
13
vendor/github.com/pelletier/go-toml/tomltree_create.go
generated
vendored
13
vendor/github.com/pelletier/go-toml/tomltree_create.go
generated
vendored
@@ -57,6 +57,19 @@ func simpleValueCoercion(object interface{}) (interface{}, error) {
|
|||||||
return float64(original), nil
|
return float64(original), nil
|
||||||
case fmt.Stringer:
|
case fmt.Stringer:
|
||||||
return original.String(), nil
|
return original.String(), nil
|
||||||
|
case []interface{}:
|
||||||
|
value := reflect.ValueOf(original)
|
||||||
|
length := value.Len()
|
||||||
|
arrayValue := reflect.MakeSlice(value.Type(), 0, length)
|
||||||
|
for i := 0; i < length; i++ {
|
||||||
|
val := value.Index(i).Interface()
|
||||||
|
simpleValue, err := simpleValueCoercion(val)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue))
|
||||||
|
}
|
||||||
|
return arrayValue.Interface(), nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("cannot convert type %T to Tree", object)
|
return nil, fmt.Errorf("cannot convert type %T to Tree", object)
|
||||||
}
|
}
|
||||||
|
|||||||
103
vendor/github.com/pelletier/go-toml/tomltree_write.go
generated
vendored
103
vendor/github.com/pelletier/go-toml/tomltree_write.go
generated
vendored
@@ -30,9 +30,15 @@ type sortNode struct {
|
|||||||
// are preserved. Quotation marks and backslashes are also not escaped.
|
// are preserved. Quotation marks and backslashes are also not escaped.
|
||||||
func encodeMultilineTomlString(value string, commented string) string {
|
func encodeMultilineTomlString(value string, commented string) string {
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
|
adjacentQuoteCount := 0
|
||||||
|
|
||||||
b.WriteString(commented)
|
b.WriteString(commented)
|
||||||
for _, rr := range value {
|
for i, rr := range value {
|
||||||
|
if rr != '"' {
|
||||||
|
adjacentQuoteCount = 0
|
||||||
|
} else {
|
||||||
|
adjacentQuoteCount++
|
||||||
|
}
|
||||||
switch rr {
|
switch rr {
|
||||||
case '\b':
|
case '\b':
|
||||||
b.WriteString(`\b`)
|
b.WriteString(`\b`)
|
||||||
@@ -45,7 +51,12 @@ func encodeMultilineTomlString(value string, commented string) string {
|
|||||||
case '\r':
|
case '\r':
|
||||||
b.WriteString("\r")
|
b.WriteString("\r")
|
||||||
case '"':
|
case '"':
|
||||||
b.WriteString(`"`)
|
if adjacentQuoteCount >= 3 || i == len(value)-1 {
|
||||||
|
adjacentQuoteCount = 0
|
||||||
|
b.WriteString(`\"`)
|
||||||
|
} else {
|
||||||
|
b.WriteString(`"`)
|
||||||
|
}
|
||||||
case '\\':
|
case '\\':
|
||||||
b.WriteString(`\`)
|
b.WriteString(`\`)
|
||||||
default:
|
default:
|
||||||
@@ -92,7 +103,30 @@ func encodeTomlString(value string) string {
|
|||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func tomlValueStringRepresentation(v interface{}, commented string, indent string, arraysOneElementPerLine bool) (string, error) {
|
func tomlTreeStringRepresentation(t *Tree, ord MarshalOrder) (string, error) {
|
||||||
|
var orderedVals []sortNode
|
||||||
|
switch ord {
|
||||||
|
case OrderPreserve:
|
||||||
|
orderedVals = sortByLines(t)
|
||||||
|
default:
|
||||||
|
orderedVals = sortAlphabetical(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
var values []string
|
||||||
|
for _, node := range orderedVals {
|
||||||
|
k := node.key
|
||||||
|
v := t.values[k]
|
||||||
|
|
||||||
|
repr, err := tomlValueStringRepresentation(v, "", "", ord, false)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
values = append(values, quoteKeyIfNeeded(k)+" = "+repr)
|
||||||
|
}
|
||||||
|
return "{ " + strings.Join(values, ", ") + " }", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func tomlValueStringRepresentation(v interface{}, commented string, indent string, ord MarshalOrder, arraysOneElementPerLine bool) (string, error) {
|
||||||
// this interface check is added to dereference the change made in the writeTo function.
|
// this interface check is added to dereference the change made in the writeTo function.
|
||||||
// That change was made to allow this function to see formatting options.
|
// That change was made to allow this function to see formatting options.
|
||||||
tv, ok := v.(*tomlValue)
|
tv, ok := v.(*tomlValue)
|
||||||
@@ -124,12 +158,20 @@ func tomlValueStringRepresentation(v interface{}, commented string, indent strin
|
|||||||
return strings.ToLower(strconv.FormatFloat(value, 'f', -1, bits)), nil
|
return strings.ToLower(strconv.FormatFloat(value, 'f', -1, bits)), nil
|
||||||
case string:
|
case string:
|
||||||
if tv.multiline {
|
if tv.multiline {
|
||||||
return "\"\"\"\n" + encodeMultilineTomlString(value, commented) + "\"\"\"", nil
|
if tv.literal {
|
||||||
|
b := strings.Builder{}
|
||||||
|
b.WriteString("'''\n")
|
||||||
|
b.Write([]byte(value))
|
||||||
|
b.WriteString("\n'''")
|
||||||
|
return b.String(), nil
|
||||||
|
} else {
|
||||||
|
return "\"\"\"\n" + encodeMultilineTomlString(value, commented) + "\"\"\"", nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return "\"" + encodeTomlString(value) + "\"", nil
|
return "\"" + encodeTomlString(value) + "\"", nil
|
||||||
case []byte:
|
case []byte:
|
||||||
b, _ := v.([]byte)
|
b, _ := v.([]byte)
|
||||||
return tomlValueStringRepresentation(string(b), commented, indent, arraysOneElementPerLine)
|
return string(b), nil
|
||||||
case bool:
|
case bool:
|
||||||
if value {
|
if value {
|
||||||
return "true", nil
|
return "true", nil
|
||||||
@@ -143,6 +185,8 @@ func tomlValueStringRepresentation(v interface{}, commented string, indent strin
|
|||||||
return value.String(), nil
|
return value.String(), nil
|
||||||
case LocalTime:
|
case LocalTime:
|
||||||
return value.String(), nil
|
return value.String(), nil
|
||||||
|
case *Tree:
|
||||||
|
return tomlTreeStringRepresentation(value, ord)
|
||||||
case nil:
|
case nil:
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
@@ -153,7 +197,7 @@ func tomlValueStringRepresentation(v interface{}, commented string, indent strin
|
|||||||
var values []string
|
var values []string
|
||||||
for i := 0; i < rv.Len(); i++ {
|
for i := 0; i < rv.Len(); i++ {
|
||||||
item := rv.Index(i).Interface()
|
item := rv.Index(i).Interface()
|
||||||
itemRepr, err := tomlValueStringRepresentation(item, commented, indent, arraysOneElementPerLine)
|
itemRepr, err := tomlValueStringRepresentation(item, commented, indent, ord, arraysOneElementPerLine)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -176,13 +220,15 @@ func tomlValueStringRepresentation(v interface{}, commented string, indent strin
|
|||||||
|
|
||||||
return stringBuffer.String(), nil
|
return stringBuffer.String(), nil
|
||||||
}
|
}
|
||||||
return "[" + strings.Join(values, ",") + "]", nil
|
return "[" + strings.Join(values, ", ") + "]", nil
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("unsupported value type %T: %v", v, v)
|
return "", fmt.Errorf("unsupported value type %T: %v", v, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getTreeArrayLine(trees []*Tree) (line int) {
|
func getTreeArrayLine(trees []*Tree) (line int) {
|
||||||
// get lowest line number that is not 0
|
// Prevent returning 0 for empty trees
|
||||||
|
line = int(^uint(0) >> 1)
|
||||||
|
// get lowest line number >= 0
|
||||||
for _, tv := range trees {
|
for _, tv := range trees {
|
||||||
if tv.position.Line < line || line == 0 {
|
if tv.position.Line < line || line == 0 {
|
||||||
line = tv.position.Line
|
line = tv.position.Line
|
||||||
@@ -271,10 +317,10 @@ func sortAlphabetical(t *Tree) (vals []sortNode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) {
|
func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) {
|
||||||
return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical, false)
|
return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical, " ", false, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder, parentCommented bool) (int64, error) {
|
func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord MarshalOrder, indentString string, compactComments, parentCommented bool) (int64, error) {
|
||||||
var orderedVals []sortNode
|
var orderedVals []sortNode
|
||||||
|
|
||||||
switch ord {
|
switch ord {
|
||||||
@@ -290,7 +336,7 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i
|
|||||||
k := node.key
|
k := node.key
|
||||||
v := t.values[k]
|
v := t.values[k]
|
||||||
|
|
||||||
combinedKey := k
|
combinedKey := quoteKeyIfNeeded(k)
|
||||||
if keyspace != "" {
|
if keyspace != "" {
|
||||||
combinedKey = keyspace + "." + combinedKey
|
combinedKey = keyspace + "." + combinedKey
|
||||||
}
|
}
|
||||||
@@ -324,7 +370,7 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return bytesCount, err
|
return bytesCount, err
|
||||||
}
|
}
|
||||||
bytesCount, err = node.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord, parentCommented || t.commented || tv.commented)
|
bytesCount, err = node.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, compactComments, parentCommented || t.commented || tv.commented)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return bytesCount, err
|
return bytesCount, err
|
||||||
}
|
}
|
||||||
@@ -340,7 +386,7 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i
|
|||||||
return bytesCount, err
|
return bytesCount, err
|
||||||
}
|
}
|
||||||
|
|
||||||
bytesCount, err = subTree.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord, parentCommented || t.commented || subTree.commented)
|
bytesCount, err = subTree.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, compactComments, parentCommented || t.commented || subTree.commented)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return bytesCount, err
|
return bytesCount, err
|
||||||
}
|
}
|
||||||
@@ -357,7 +403,7 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i
|
|||||||
if parentCommented || t.commented || v.commented {
|
if parentCommented || t.commented || v.commented {
|
||||||
commented = "# "
|
commented = "# "
|
||||||
}
|
}
|
||||||
repr, err := tomlValueStringRepresentation(v, commented, indent, arraysOneElementPerLine)
|
repr, err := tomlValueStringRepresentation(v, commented, indent, ord, arraysOneElementPerLine)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return bytesCount, err
|
return bytesCount, err
|
||||||
}
|
}
|
||||||
@@ -368,7 +414,14 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i
|
|||||||
if strings.HasPrefix(comment, "#") {
|
if strings.HasPrefix(comment, "#") {
|
||||||
start = ""
|
start = ""
|
||||||
}
|
}
|
||||||
writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment, "\n")
|
if !compactComments {
|
||||||
|
writtenBytesCountComment, errc := writeStrings(w, "\n")
|
||||||
|
bytesCount += int64(writtenBytesCountComment)
|
||||||
|
if errc != nil {
|
||||||
|
return bytesCount, errc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writtenBytesCountComment, errc := writeStrings(w, indent, start, comment, "\n")
|
||||||
bytesCount += int64(writtenBytesCountComment)
|
bytesCount += int64(writtenBytesCountComment)
|
||||||
if errc != nil {
|
if errc != nil {
|
||||||
return bytesCount, errc
|
return bytesCount, errc
|
||||||
@@ -474,8 +527,26 @@ func (t *Tree) ToMap() map[string]interface{} {
|
|||||||
case *Tree:
|
case *Tree:
|
||||||
result[k] = node.ToMap()
|
result[k] = node.ToMap()
|
||||||
case *tomlValue:
|
case *tomlValue:
|
||||||
result[k] = node.value
|
result[k] = tomlValueToGo(node.value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tomlValueToGo(v interface{}) interface{} {
|
||||||
|
if tree, ok := v.(*Tree); ok {
|
||||||
|
return tree.ToMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
rv := reflect.ValueOf(v)
|
||||||
|
|
||||||
|
if rv.Kind() != reflect.Slice {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
values := make([]interface{}, rv.Len())
|
||||||
|
for i := 0; i < rv.Len(); i++ {
|
||||||
|
item := rv.Index(i).Interface()
|
||||||
|
values[i] = tomlValueToGo(item)
|
||||||
|
}
|
||||||
|
return values
|
||||||
|
}
|
||||||
|
|||||||
6
vendor/github.com/pelletier/go-toml/tomltree_writepub.go
generated
vendored
Normal file
6
vendor/github.com/pelletier/go-toml/tomltree_writepub.go
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package toml
|
||||||
|
|
||||||
|
// ValueStringRepresentation transforms an interface{} value into its toml string representation.
|
||||||
|
func ValueStringRepresentation(v interface{}, commented string, indent string, ord MarshalOrder, arraysOneElementPerLine bool) (string, error) {
|
||||||
|
return tomlValueStringRepresentation(v, commented, indent, ord, arraysOneElementPerLine)
|
||||||
|
}
|
||||||
2
vendor/github.com/spf13/afero/.gitignore
generated
vendored
Normal file
2
vendor/github.com/spf13/afero/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
sftpfs/file1
|
||||||
|
sftpfs/test/
|
||||||
15
vendor/github.com/spf13/afero/.travis.yml
generated
vendored
15
vendor/github.com/spf13/afero/.travis.yml
generated
vendored
@@ -1,9 +1,13 @@
|
|||||||
sudo: false
|
sudo: false
|
||||||
language: go
|
language: go
|
||||||
|
arch:
|
||||||
|
- amd64
|
||||||
|
- ppc64e
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.9
|
- "1.14"
|
||||||
- "1.10"
|
- "1.15"
|
||||||
|
- "1.16"
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
os:
|
os:
|
||||||
@@ -16,6 +20,7 @@ matrix:
|
|||||||
fast_finish: true
|
fast_finish: true
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- go build
|
- go build -v ./...
|
||||||
- go test -race -v ./...
|
- go test -count=1 -cover -race -v ./...
|
||||||
|
- go vet ./...
|
||||||
|
- FILES=$(gofmt -s -l . zipfs sftpfs mem tarfs); if [[ -n "${FILES}" ]]; then echo "You have go format errors; gofmt your changes"; exit 1; fi
|
||||||
|
|||||||
42
vendor/github.com/spf13/afero/README.md
generated
vendored
42
vendor/github.com/spf13/afero/README.md
generated
vendored
@@ -6,7 +6,7 @@ A FileSystem Abstraction System for Go
|
|||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
Afero is an filesystem framework providing a simple, uniform and universal API
|
Afero is a filesystem framework providing a simple, uniform and universal API
|
||||||
interacting with any filesystem, as an abstraction layer providing interfaces,
|
interacting with any filesystem, as an abstraction layer providing interfaces,
|
||||||
types and methods. Afero has an exceptionally clean interface and simple design
|
types and methods. Afero has an exceptionally clean interface and simple design
|
||||||
without needless constructors or initialization methods.
|
without needless constructors or initialization methods.
|
||||||
@@ -18,7 +18,7 @@ and benefit of the os and ioutil packages.
|
|||||||
Afero provides significant improvements over using the os package alone, most
|
Afero provides significant improvements over using the os package alone, most
|
||||||
notably the ability to create mock and testing filesystems without relying on the disk.
|
notably the ability to create mock and testing filesystems without relying on the disk.
|
||||||
|
|
||||||
It is suitable for use in a any situation where you would consider using the OS
|
It is suitable for use in any situation where you would consider using the OS
|
||||||
package as it provides an additional abstraction that makes it easy to use a
|
package as it provides an additional abstraction that makes it easy to use a
|
||||||
memory backed file system during testing. It also adds support for the http
|
memory backed file system during testing. It also adds support for the http
|
||||||
filesystem for full interoperability.
|
filesystem for full interoperability.
|
||||||
@@ -33,7 +33,7 @@ filesystem for full interoperability.
|
|||||||
* Support for compositional (union) file systems by combining multiple file systems acting as one
|
* Support for compositional (union) file systems by combining multiple file systems acting as one
|
||||||
* Specialized backends which modify existing filesystems (Read Only, Regexp filtered)
|
* Specialized backends which modify existing filesystems (Read Only, Regexp filtered)
|
||||||
* A set of utility functions ported from io, ioutil & hugo to be afero aware
|
* A set of utility functions ported from io, ioutil & hugo to be afero aware
|
||||||
|
* Wrapper for go 1.16 filesystem abstraction `io/fs.FS`
|
||||||
|
|
||||||
# Using Afero
|
# Using Afero
|
||||||
|
|
||||||
@@ -41,8 +41,8 @@ Afero is easy to use and easier to adopt.
|
|||||||
|
|
||||||
A few different ways you could use Afero:
|
A few different ways you could use Afero:
|
||||||
|
|
||||||
* Use the interfaces alone to define you own file system.
|
* Use the interfaces alone to define your own file system.
|
||||||
* Wrap for the OS packages.
|
* Wrapper for the OS packages.
|
||||||
* Define different filesystems for different parts of your application.
|
* Define different filesystems for different parts of your application.
|
||||||
* Use Afero for mock filesystems while testing
|
* Use Afero for mock filesystems while testing
|
||||||
|
|
||||||
@@ -94,6 +94,7 @@ AppFs.Open('/tmp/foo')
|
|||||||
File System Methods Available:
|
File System Methods Available:
|
||||||
```go
|
```go
|
||||||
Chmod(name string, mode os.FileMode) : error
|
Chmod(name string, mode os.FileMode) : error
|
||||||
|
Chown(name string, uid, gid int) : error
|
||||||
Chtimes(name string, atime time.Time, mtime time.Time) : error
|
Chtimes(name string, atime time.Time, mtime time.Time) : error
|
||||||
Create(name string) : File, error
|
Create(name string) : File, error
|
||||||
Mkdir(name string, perm os.FileMode) : error
|
Mkdir(name string, perm os.FileMode) : error
|
||||||
@@ -227,7 +228,7 @@ operation and a mock filesystem during testing or as needed.
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
appfs := afero.NewOsFs()
|
appfs := afero.NewOsFs()
|
||||||
appfs.MkdirAll("src/a", 0755))
|
appfs.MkdirAll("src/a", 0755)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Memory Backed Storage
|
## Memory Backed Storage
|
||||||
@@ -241,7 +242,7 @@ safely.
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
mm := afero.NewMemMapFs()
|
mm := afero.NewMemMapFs()
|
||||||
mm.MkdirAll("src/a", 0755))
|
mm.MkdirAll("src/a", 0755)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### InMemoryFile
|
#### InMemoryFile
|
||||||
@@ -306,7 +307,7 @@ Any Afero FileSystem can be used as an httpFs.
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
httpFs := afero.NewHttpFs(<ExistingFS>)
|
httpFs := afero.NewHttpFs(<ExistingFS>)
|
||||||
fileserver := http.FileServer(httpFs.Dir(<PATH>)))
|
fileserver := http.FileServer(httpFs.Dir(<PATH>))
|
||||||
http.Handle("/", fileserver)
|
http.Handle("/", fileserver)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -380,8 +381,6 @@ The following is a short list of possible backends we hope someone will
|
|||||||
implement:
|
implement:
|
||||||
|
|
||||||
* SSH
|
* SSH
|
||||||
* ZIP
|
|
||||||
* TAR
|
|
||||||
* S3
|
* S3
|
||||||
|
|
||||||
# About the project
|
# About the project
|
||||||
@@ -406,28 +405,7 @@ Googles very well.
|
|||||||
|
|
||||||
## Release Notes
|
## Release Notes
|
||||||
|
|
||||||
* **0.10.0** 2015.12.10
|
See the [Releases Page](https://github.com/spf13/afero/releases).
|
||||||
* Full compatibility with Windows
|
|
||||||
* Introduction of afero utilities
|
|
||||||
* Test suite rewritten to work cross platform
|
|
||||||
* Normalize paths for MemMapFs
|
|
||||||
* Adding Sync to the file interface
|
|
||||||
* **Breaking Change** Walk and ReadDir have changed parameter order
|
|
||||||
* Moving types used by MemMapFs to a subpackage
|
|
||||||
* General bugfixes and improvements
|
|
||||||
* **0.9.0** 2015.11.05
|
|
||||||
* New Walk function similar to filepath.Walk
|
|
||||||
* MemMapFs.OpenFile handles O_CREATE, O_APPEND, O_TRUNC
|
|
||||||
* MemMapFs.Remove now really deletes the file
|
|
||||||
* InMemoryFile.Readdir and Readdirnames work correctly
|
|
||||||
* InMemoryFile functions lock it for concurrent access
|
|
||||||
* Test suite improvements
|
|
||||||
* **0.8.0** 2014.10.28
|
|
||||||
* First public version
|
|
||||||
* Interfaces feel ready for people to build using
|
|
||||||
* Interfaces satisfy all known uses
|
|
||||||
* MemMapFs passes the majority of the OS test suite
|
|
||||||
* OsFs passes the majority of the OS test suite
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|||||||
5
vendor/github.com/spf13/afero/afero.go
generated
vendored
5
vendor/github.com/spf13/afero/afero.go
generated
vendored
@@ -91,9 +91,12 @@ type Fs interface {
|
|||||||
// The name of this FileSystem
|
// The name of this FileSystem
|
||||||
Name() string
|
Name() string
|
||||||
|
|
||||||
//Chmod changes the mode of the named file to mode.
|
// Chmod changes the mode of the named file to mode.
|
||||||
Chmod(name string, mode os.FileMode) error
|
Chmod(name string, mode os.FileMode) error
|
||||||
|
|
||||||
|
// Chown changes the uid and gid of the named file.
|
||||||
|
Chown(name string, uid, gid int) error
|
||||||
|
|
||||||
//Chtimes changes the access and modification times of the named file
|
//Chtimes changes the access and modification times of the named file
|
||||||
Chtimes(name string, atime time.Time, mtime time.Time) error
|
Chtimes(name string, atime time.Time, mtime time.Time) error
|
||||||
}
|
}
|
||||||
|
|||||||
4
vendor/github.com/spf13/afero/appveyor.yml
generated
vendored
4
vendor/github.com/spf13/afero/appveyor.yml
generated
vendored
@@ -10,6 +10,6 @@ build_script:
|
|||||||
|
|
||||||
go get -v github.com/spf13/afero/...
|
go get -v github.com/spf13/afero/...
|
||||||
|
|
||||||
go build github.com/spf13/afero
|
go build -v github.com/spf13/afero/...
|
||||||
test_script:
|
test_script:
|
||||||
- cmd: go test -race -v github.com/spf13/afero/...
|
- cmd: go test -count=1 -cover -race -v github.com/spf13/afero/...
|
||||||
|
|||||||
33
vendor/github.com/spf13/afero/basepath.go
generated
vendored
33
vendor/github.com/spf13/afero/basepath.go
generated
vendored
@@ -83,6 +83,13 @@ func (b *BasePathFs) Chmod(name string, mode os.FileMode) (err error) {
|
|||||||
return b.source.Chmod(name, mode)
|
return b.source.Chmod(name, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *BasePathFs) Chown(name string, uid, gid int) (err error) {
|
||||||
|
if name, err = b.RealPath(name); err != nil {
|
||||||
|
return &os.PathError{Op: "chown", Path: name, Err: err}
|
||||||
|
}
|
||||||
|
return b.source.Chown(name, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *BasePathFs) Name() string {
|
func (b *BasePathFs) Name() string {
|
||||||
return "BasePathFs"
|
return "BasePathFs"
|
||||||
}
|
}
|
||||||
@@ -177,4 +184,28 @@ func (b *BasePathFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
|
|||||||
return fi, false, err
|
return fi, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// vim: ts=4 sw=4 noexpandtab nolist syn=go
|
func (b *BasePathFs) SymlinkIfPossible(oldname, newname string) error {
|
||||||
|
oldname, err := b.RealPath(oldname)
|
||||||
|
if err != nil {
|
||||||
|
return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err}
|
||||||
|
}
|
||||||
|
newname, err = b.RealPath(newname)
|
||||||
|
if err != nil {
|
||||||
|
return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err}
|
||||||
|
}
|
||||||
|
if linker, ok := b.source.(Linker); ok {
|
||||||
|
return linker.SymlinkIfPossible(oldname, newname)
|
||||||
|
}
|
||||||
|
return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *BasePathFs) ReadlinkIfPossible(name string) (string, error) {
|
||||||
|
name, err := b.RealPath(name)
|
||||||
|
if err != nil {
|
||||||
|
return "", &os.PathError{Op: "readlink", Path: name, Err: err}
|
||||||
|
}
|
||||||
|
if reader, ok := b.source.(LinkReader); ok {
|
||||||
|
return reader.ReadlinkIfPossible(name)
|
||||||
|
}
|
||||||
|
return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink}
|
||||||
|
}
|
||||||
|
|||||||
21
vendor/github.com/spf13/afero/cacheOnReadFs.go
generated
vendored
21
vendor/github.com/spf13/afero/cacheOnReadFs.go
generated
vendored
@@ -117,6 +117,27 @@ func (u *CacheOnReadFs) Chmod(name string, mode os.FileMode) error {
|
|||||||
return u.layer.Chmod(name, mode)
|
return u.layer.Chmod(name, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *CacheOnReadFs) Chown(name string, uid, gid int) error {
|
||||||
|
st, _, err := u.cacheStatus(name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
switch st {
|
||||||
|
case cacheLocal:
|
||||||
|
case cacheHit:
|
||||||
|
err = u.base.Chown(name, uid, gid)
|
||||||
|
case cacheStale, cacheMiss:
|
||||||
|
if err := u.copyToLayer(name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = u.base.Chown(name, uid, gid)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return u.layer.Chown(name, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
func (u *CacheOnReadFs) Stat(name string) (os.FileInfo, error) {
|
func (u *CacheOnReadFs) Stat(name string) (os.FileInfo, error) {
|
||||||
st, fi, err := u.cacheStatus(name)
|
st, fi, err := u.cacheStatus(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
2
vendor/github.com/spf13/afero/const_bsds.go
generated
vendored
2
vendor/github.com/spf13/afero/const_bsds.go
generated
vendored
@@ -11,7 +11,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
// +build darwin openbsd freebsd netbsd dragonfly
|
// +build aix darwin openbsd freebsd netbsd dragonfly
|
||||||
|
|
||||||
package afero
|
package afero
|
||||||
|
|
||||||
|
|||||||
1
vendor/github.com/spf13/afero/const_win_unix.go
generated
vendored
1
vendor/github.com/spf13/afero/const_win_unix.go
generated
vendored
@@ -15,6 +15,7 @@
|
|||||||
// +build !freebsd
|
// +build !freebsd
|
||||||
// +build !dragonfly
|
// +build !dragonfly
|
||||||
// +build !netbsd
|
// +build !netbsd
|
||||||
|
// +build !aix
|
||||||
|
|
||||||
package afero
|
package afero
|
||||||
|
|
||||||
|
|||||||
35
vendor/github.com/spf13/afero/copyOnWriteFs.go
generated
vendored
35
vendor/github.com/spf13/afero/copyOnWriteFs.go
generated
vendored
@@ -14,7 +14,7 @@ var _ Lstater = (*CopyOnWriteFs)(nil)
|
|||||||
// a possibly writeable layer on top. Changes to the file system will only
|
// a possibly writeable layer on top. Changes to the file system will only
|
||||||
// be made in the overlay: Changing an existing file in the base layer which
|
// be made in the overlay: Changing an existing file in the base layer which
|
||||||
// is not present in the overlay will copy the file to the overlay ("changing"
|
// is not present in the overlay will copy the file to the overlay ("changing"
|
||||||
// includes also calls to e.g. Chtimes() and Chmod()).
|
// includes also calls to e.g. Chtimes(), Chmod() and Chown()).
|
||||||
//
|
//
|
||||||
// Reading directories is currently only supported via Open(), not OpenFile().
|
// Reading directories is currently only supported via Open(), not OpenFile().
|
||||||
type CopyOnWriteFs struct {
|
type CopyOnWriteFs struct {
|
||||||
@@ -75,6 +75,19 @@ func (u *CopyOnWriteFs) Chmod(name string, mode os.FileMode) error {
|
|||||||
return u.layer.Chmod(name, mode)
|
return u.layer.Chmod(name, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *CopyOnWriteFs) Chown(name string, uid, gid int) error {
|
||||||
|
b, err := u.isBaseFile(name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if b {
|
||||||
|
if err := u.copyToLayer(name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return u.layer.Chown(name, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
func (u *CopyOnWriteFs) Stat(name string) (os.FileInfo, error) {
|
func (u *CopyOnWriteFs) Stat(name string) (os.FileInfo, error) {
|
||||||
fi, err := u.layer.Stat(name)
|
fi, err := u.layer.Stat(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -117,6 +130,26 @@ func (u *CopyOnWriteFs) LstatIfPossible(name string) (os.FileInfo, bool, error)
|
|||||||
return fi, false, err
|
return fi, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *CopyOnWriteFs) SymlinkIfPossible(oldname, newname string) error {
|
||||||
|
if slayer, ok := u.layer.(Linker); ok {
|
||||||
|
return slayer.SymlinkIfPossible(oldname, newname)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *CopyOnWriteFs) ReadlinkIfPossible(name string) (string, error) {
|
||||||
|
if rlayer, ok := u.layer.(LinkReader); ok {
|
||||||
|
return rlayer.ReadlinkIfPossible(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if rbase, ok := u.base.(LinkReader); ok {
|
||||||
|
return rbase.ReadlinkIfPossible(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink}
|
||||||
|
}
|
||||||
|
|
||||||
func (u *CopyOnWriteFs) isNotExist(err error) bool {
|
func (u *CopyOnWriteFs) isNotExist(err error) bool {
|
||||||
if e, ok := err.(*os.PathError); ok {
|
if e, ok := err.(*os.PathError); ok {
|
||||||
err = e.Err
|
err = e.Err
|
||||||
|
|||||||
4
vendor/github.com/spf13/afero/httpFs.go
generated
vendored
4
vendor/github.com/spf13/afero/httpFs.go
generated
vendored
@@ -67,6 +67,10 @@ func (h HttpFs) Chmod(name string, mode os.FileMode) error {
|
|||||||
return h.source.Chmod(name, mode)
|
return h.source.Chmod(name, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h HttpFs) Chown(name string, uid, gid int) error {
|
||||||
|
return h.source.Chown(name, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
func (h HttpFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
func (h HttpFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
||||||
return h.source.Chtimes(name, atime, mtime)
|
return h.source.Chtimes(name, atime, mtime)
|
||||||
}
|
}
|
||||||
|
|||||||
288
vendor/github.com/spf13/afero/iofs.go
generated
vendored
Normal file
288
vendor/github.com/spf13/afero/iofs.go
generated
vendored
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
// +build go1.16
|
||||||
|
|
||||||
|
package afero
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// IOFS adopts afero.Fs to stdlib io/fs.FS
|
||||||
|
type IOFS struct {
|
||||||
|
Fs
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewIOFS(fs Fs) IOFS {
|
||||||
|
return IOFS{Fs: fs}
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ fs.FS = IOFS{}
|
||||||
|
_ fs.GlobFS = IOFS{}
|
||||||
|
_ fs.ReadDirFS = IOFS{}
|
||||||
|
_ fs.ReadFileFS = IOFS{}
|
||||||
|
_ fs.StatFS = IOFS{}
|
||||||
|
_ fs.SubFS = IOFS{}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (iofs IOFS) Open(name string) (fs.File, error) {
|
||||||
|
const op = "open"
|
||||||
|
|
||||||
|
// by convention for fs.FS implementations we should perform this check
|
||||||
|
if !fs.ValidPath(name) {
|
||||||
|
return nil, iofs.wrapError(op, name, fs.ErrInvalid)
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := iofs.Fs.Open(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, iofs.wrapError(op, name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// file should implement fs.ReadDirFile
|
||||||
|
if _, ok := file.(fs.ReadDirFile); !ok {
|
||||||
|
file = readDirFile{file}
|
||||||
|
}
|
||||||
|
|
||||||
|
return file, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iofs IOFS) Glob(pattern string) ([]string, error) {
|
||||||
|
const op = "glob"
|
||||||
|
|
||||||
|
// afero.Glob does not perform this check but it's required for implementations
|
||||||
|
if _, err := path.Match(pattern, ""); err != nil {
|
||||||
|
return nil, iofs.wrapError(op, pattern, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
items, err := Glob(iofs.Fs, pattern)
|
||||||
|
if err != nil {
|
||||||
|
return nil, iofs.wrapError(op, pattern, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return items, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iofs IOFS) ReadDir(name string) ([]fs.DirEntry, error) {
|
||||||
|
items, err := ReadDir(iofs.Fs, name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, iofs.wrapError("readdir", name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := make([]fs.DirEntry, len(items))
|
||||||
|
for i := range items {
|
||||||
|
ret[i] = dirEntry{items[i]}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iofs IOFS) ReadFile(name string) ([]byte, error) {
|
||||||
|
const op = "readfile"
|
||||||
|
|
||||||
|
if !fs.ValidPath(name) {
|
||||||
|
return nil, iofs.wrapError(op, name, fs.ErrInvalid)
|
||||||
|
}
|
||||||
|
|
||||||
|
bytes, err := ReadFile(iofs.Fs, name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, iofs.wrapError(op, name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (iofs IOFS) Sub(dir string) (fs.FS, error) { return IOFS{NewBasePathFs(iofs.Fs, dir)}, nil }
|
||||||
|
|
||||||
|
func (IOFS) wrapError(op, path string, err error) error {
|
||||||
|
if _, ok := err.(*fs.PathError); ok {
|
||||||
|
return err // don't need to wrap again
|
||||||
|
}
|
||||||
|
|
||||||
|
return &fs.PathError{
|
||||||
|
Op: op,
|
||||||
|
Path: path,
|
||||||
|
Err: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// dirEntry provides adapter from os.FileInfo to fs.DirEntry
|
||||||
|
type dirEntry struct {
|
||||||
|
fs.FileInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ fs.DirEntry = dirEntry{}
|
||||||
|
|
||||||
|
func (d dirEntry) Type() fs.FileMode { return d.FileInfo.Mode().Type() }
|
||||||
|
|
||||||
|
func (d dirEntry) Info() (fs.FileInfo, error) { return d.FileInfo, nil }
|
||||||
|
|
||||||
|
// readDirFile provides adapter from afero.File to fs.ReadDirFile needed for correct Open
|
||||||
|
type readDirFile struct {
|
||||||
|
File
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ fs.ReadDirFile = readDirFile{}
|
||||||
|
|
||||||
|
func (r readDirFile) ReadDir(n int) ([]fs.DirEntry, error) {
|
||||||
|
items, err := r.File.Readdir(n)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := make([]fs.DirEntry, len(items))
|
||||||
|
for i := range items {
|
||||||
|
ret[i] = dirEntry{items[i]}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// FromIOFS adopts io/fs.FS to use it as afero.Fs
|
||||||
|
// Note that io/fs.FS is read-only so all mutating methods will return fs.PathError with fs.ErrPermission
|
||||||
|
// To store modifications you may use afero.CopyOnWriteFs
|
||||||
|
type FromIOFS struct {
|
||||||
|
fs.FS
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ Fs = FromIOFS{}
|
||||||
|
|
||||||
|
func (f FromIOFS) Create(name string) (File, error) { return nil, notImplemented("create", name) }
|
||||||
|
|
||||||
|
func (f FromIOFS) Mkdir(name string, perm os.FileMode) error { return notImplemented("mkdir", name) }
|
||||||
|
|
||||||
|
func (f FromIOFS) MkdirAll(path string, perm os.FileMode) error {
|
||||||
|
return notImplemented("mkdirall", path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) Open(name string) (File, error) {
|
||||||
|
file, err := f.FS.Open(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return fromIOFSFile{File: file, name: name}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
|
||||||
|
return f.Open(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) Remove(name string) error {
|
||||||
|
return notImplemented("remove", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) RemoveAll(path string) error {
|
||||||
|
return notImplemented("removeall", path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) Rename(oldname, newname string) error {
|
||||||
|
return notImplemented("rename", oldname)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) Stat(name string) (os.FileInfo, error) { return fs.Stat(f.FS, name) }
|
||||||
|
|
||||||
|
func (f FromIOFS) Name() string { return "fromiofs" }
|
||||||
|
|
||||||
|
func (f FromIOFS) Chmod(name string, mode os.FileMode) error {
|
||||||
|
return notImplemented("chmod", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) Chown(name string, uid, gid int) error {
|
||||||
|
return notImplemented("chown", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FromIOFS) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
||||||
|
return notImplemented("chtimes", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
type fromIOFSFile struct {
|
||||||
|
fs.File
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) ReadAt(p []byte, off int64) (n int, err error) {
|
||||||
|
readerAt, ok := f.File.(io.ReaderAt)
|
||||||
|
if !ok {
|
||||||
|
return -1, notImplemented("readat", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return readerAt.ReadAt(p, off)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) Seek(offset int64, whence int) (int64, error) {
|
||||||
|
seeker, ok := f.File.(io.Seeker)
|
||||||
|
if !ok {
|
||||||
|
return -1, notImplemented("seek", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return seeker.Seek(offset, whence)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) Write(p []byte) (n int, err error) {
|
||||||
|
return -1, notImplemented("write", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) WriteAt(p []byte, off int64) (n int, err error) {
|
||||||
|
return -1, notImplemented("writeat", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) Name() string { return f.name }
|
||||||
|
|
||||||
|
func (f fromIOFSFile) Readdir(count int) ([]os.FileInfo, error) {
|
||||||
|
rdfile, ok := f.File.(fs.ReadDirFile)
|
||||||
|
if !ok {
|
||||||
|
return nil, notImplemented("readdir", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
entries, err := rdfile.ReadDir(count)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := make([]os.FileInfo, len(entries))
|
||||||
|
for i := range entries {
|
||||||
|
ret[i], err = entries[i].Info()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) Readdirnames(n int) ([]string, error) {
|
||||||
|
rdfile, ok := f.File.(fs.ReadDirFile)
|
||||||
|
if !ok {
|
||||||
|
return nil, notImplemented("readdir", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
entries, err := rdfile.ReadDir(n)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := make([]string, len(entries))
|
||||||
|
for i := range entries {
|
||||||
|
ret[i] = entries[i].Name()
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) Sync() error { return nil }
|
||||||
|
|
||||||
|
func (f fromIOFSFile) Truncate(size int64) error {
|
||||||
|
return notImplemented("truncate", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f fromIOFSFile) WriteString(s string) (ret int, err error) {
|
||||||
|
return -1, notImplemented("writestring", f.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func notImplemented(op, path string) error {
|
||||||
|
return &fs.PathError{Op: op, Path: path, Err: fs.ErrPermission}
|
||||||
|
}
|
||||||
32
vendor/github.com/spf13/afero/ioutil.go
generated
vendored
32
vendor/github.com/spf13/afero/ioutil.go
generated
vendored
@@ -22,6 +22,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -147,7 +148,7 @@ func reseed() uint32 {
|
|||||||
return uint32(time.Now().UnixNano() + int64(os.Getpid()))
|
return uint32(time.Now().UnixNano() + int64(os.Getpid()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func nextSuffix() string {
|
func nextRandom() string {
|
||||||
randmu.Lock()
|
randmu.Lock()
|
||||||
r := rand
|
r := rand
|
||||||
if r == 0 {
|
if r == 0 {
|
||||||
@@ -159,27 +160,36 @@ func nextSuffix() string {
|
|||||||
return strconv.Itoa(int(1e9 + r%1e9))[1:]
|
return strconv.Itoa(int(1e9 + r%1e9))[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
// TempFile creates a new temporary file in the directory dir
|
// TempFile creates a new temporary file in the directory dir,
|
||||||
// with a name beginning with prefix, opens the file for reading
|
// opens the file for reading and writing, and returns the resulting *os.File.
|
||||||
// and writing, and returns the resulting *File.
|
// The filename is generated by taking pattern and adding a random
|
||||||
|
// string to the end. If pattern includes a "*", the random string
|
||||||
|
// replaces the last "*".
|
||||||
// If dir is the empty string, TempFile uses the default directory
|
// If dir is the empty string, TempFile uses the default directory
|
||||||
// for temporary files (see os.TempDir).
|
// for temporary files (see os.TempDir).
|
||||||
// Multiple programs calling TempFile simultaneously
|
// Multiple programs calling TempFile simultaneously
|
||||||
// will not choose the same file. The caller can use f.Name()
|
// will not choose the same file. The caller can use f.Name()
|
||||||
// to find the pathname of the file. It is the caller's responsibility
|
// to find the pathname of the file. It is the caller's responsibility
|
||||||
// to remove the file when no longer needed.
|
// to remove the file when no longer needed.
|
||||||
func (a Afero) TempFile(dir, prefix string) (f File, err error) {
|
func (a Afero) TempFile(dir, pattern string) (f File, err error) {
|
||||||
return TempFile(a.Fs, dir, prefix)
|
return TempFile(a.Fs, dir, pattern)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TempFile(fs Fs, dir, prefix string) (f File, err error) {
|
func TempFile(fs Fs, dir, pattern string) (f File, err error) {
|
||||||
if dir == "" {
|
if dir == "" {
|
||||||
dir = os.TempDir()
|
dir = os.TempDir()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var prefix, suffix string
|
||||||
|
if pos := strings.LastIndex(pattern, "*"); pos != -1 {
|
||||||
|
prefix, suffix = pattern[:pos], pattern[pos+1:]
|
||||||
|
} else {
|
||||||
|
prefix = pattern
|
||||||
|
}
|
||||||
|
|
||||||
nconflict := 0
|
nconflict := 0
|
||||||
for i := 0; i < 10000; i++ {
|
for i := 0; i < 10000; i++ {
|
||||||
name := filepath.Join(dir, prefix+nextSuffix())
|
name := filepath.Join(dir, prefix+nextRandom()+suffix)
|
||||||
f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
|
f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
|
||||||
if os.IsExist(err) {
|
if os.IsExist(err) {
|
||||||
if nconflict++; nconflict > 10 {
|
if nconflict++; nconflict > 10 {
|
||||||
@@ -211,7 +221,7 @@ func TempDir(fs Fs, dir, prefix string) (name string, err error) {
|
|||||||
|
|
||||||
nconflict := 0
|
nconflict := 0
|
||||||
for i := 0; i < 10000; i++ {
|
for i := 0; i < 10000; i++ {
|
||||||
try := filepath.Join(dir, prefix+nextSuffix())
|
try := filepath.Join(dir, prefix+nextRandom())
|
||||||
err = fs.Mkdir(try, 0700)
|
err = fs.Mkdir(try, 0700)
|
||||||
if os.IsExist(err) {
|
if os.IsExist(err) {
|
||||||
if nconflict++; nconflict > 10 {
|
if nconflict++; nconflict > 10 {
|
||||||
|
|||||||
2
vendor/github.com/spf13/afero/match.go
generated
vendored
2
vendor/github.com/spf13/afero/match.go
generated
vendored
@@ -106,5 +106,5 @@ func glob(fs Fs, dir, pattern string, matches []string) (m []string, e error) {
|
|||||||
// recognized by Match.
|
// recognized by Match.
|
||||||
func hasMeta(path string) bool {
|
func hasMeta(path string) bool {
|
||||||
// TODO(niemeyer): Should other magic characters be added here?
|
// TODO(niemeyer): Should other magic characters be added here?
|
||||||
return strings.IndexAny(path, "*?[") >= 0
|
return strings.ContainsAny(path, "*?[")
|
||||||
}
|
}
|
||||||
|
|||||||
39
vendor/github.com/spf13/afero/mem/file.go
generated
vendored
39
vendor/github.com/spf13/afero/mem/file.go
generated
vendored
@@ -22,10 +22,9 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
const FilePathSeparator = string(filepath.Separator)
|
const FilePathSeparator = string(filepath.Separator)
|
||||||
|
|
||||||
type File struct {
|
type File struct {
|
||||||
@@ -57,6 +56,8 @@ type FileData struct {
|
|||||||
dir bool
|
dir bool
|
||||||
mode os.FileMode
|
mode os.FileMode
|
||||||
modtime time.Time
|
modtime time.Time
|
||||||
|
uid int
|
||||||
|
gid int
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *FileData) Name() string {
|
func (d *FileData) Name() string {
|
||||||
@@ -95,6 +96,18 @@ func setModTime(f *FileData, mtime time.Time) {
|
|||||||
f.modtime = mtime
|
f.modtime = mtime
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetUID(f *FileData, uid int) {
|
||||||
|
f.Lock()
|
||||||
|
f.uid = uid
|
||||||
|
f.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetGID(f *FileData, gid int) {
|
||||||
|
f.Lock()
|
||||||
|
f.gid = gid
|
||||||
|
f.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
func GetFileInfo(f *FileData) *FileInfo {
|
func GetFileInfo(f *FileData) *FileInfo {
|
||||||
return &FileInfo{f}
|
return &FileInfo{f}
|
||||||
}
|
}
|
||||||
@@ -193,8 +206,11 @@ func (f *File) Read(b []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *File) ReadAt(b []byte, off int64) (n int, err error) {
|
func (f *File) ReadAt(b []byte, off int64) (n int, err error) {
|
||||||
|
prev := atomic.LoadInt64(&f.at)
|
||||||
atomic.StoreInt64(&f.at, off)
|
atomic.StoreInt64(&f.at, off)
|
||||||
return f.Read(b)
|
n, err = f.Read(b)
|
||||||
|
atomic.StoreInt64(&f.at, prev)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *File) Truncate(size int64) error {
|
func (f *File) Truncate(size int64) error {
|
||||||
@@ -207,6 +223,8 @@ func (f *File) Truncate(size int64) error {
|
|||||||
if size < 0 {
|
if size < 0 {
|
||||||
return ErrOutOfRange
|
return ErrOutOfRange
|
||||||
}
|
}
|
||||||
|
f.fileData.Lock()
|
||||||
|
defer f.fileData.Unlock()
|
||||||
if size > int64(len(f.fileData.data)) {
|
if size > int64(len(f.fileData.data)) {
|
||||||
diff := size - int64(len(f.fileData.data))
|
diff := size - int64(len(f.fileData.data))
|
||||||
f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{00}, int(diff))...)
|
f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{00}, int(diff))...)
|
||||||
@@ -222,17 +240,20 @@ func (f *File) Seek(offset int64, whence int) (int64, error) {
|
|||||||
return 0, ErrFileClosed
|
return 0, ErrFileClosed
|
||||||
}
|
}
|
||||||
switch whence {
|
switch whence {
|
||||||
case 0:
|
case io.SeekStart:
|
||||||
atomic.StoreInt64(&f.at, offset)
|
atomic.StoreInt64(&f.at, offset)
|
||||||
case 1:
|
case io.SeekCurrent:
|
||||||
atomic.AddInt64(&f.at, int64(offset))
|
atomic.AddInt64(&f.at, offset)
|
||||||
case 2:
|
case io.SeekEnd:
|
||||||
atomic.StoreInt64(&f.at, int64(len(f.fileData.data))+offset)
|
atomic.StoreInt64(&f.at, int64(len(f.fileData.data))+offset)
|
||||||
}
|
}
|
||||||
return f.at, nil
|
return f.at, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *File) Write(b []byte) (n int, err error) {
|
func (f *File) Write(b []byte) (n int, err error) {
|
||||||
|
if f.closed == true {
|
||||||
|
return 0, ErrFileClosed
|
||||||
|
}
|
||||||
if f.readOnly {
|
if f.readOnly {
|
||||||
return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")}
|
return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")}
|
||||||
}
|
}
|
||||||
@@ -246,7 +267,7 @@ func (f *File) Write(b []byte) (n int, err error) {
|
|||||||
tail = f.fileData.data[n+int(cur):]
|
tail = f.fileData.data[n+int(cur):]
|
||||||
}
|
}
|
||||||
if diff > 0 {
|
if diff > 0 {
|
||||||
f.fileData.data = append(bytes.Repeat([]byte{00}, int(diff)), b...)
|
f.fileData.data = append(f.fileData.data, append(bytes.Repeat([]byte{00}, int(diff)), b...)...)
|
||||||
f.fileData.data = append(f.fileData.data, tail...)
|
f.fileData.data = append(f.fileData.data, tail...)
|
||||||
} else {
|
} else {
|
||||||
f.fileData.data = append(f.fileData.data[:cur], b...)
|
f.fileData.data = append(f.fileData.data[:cur], b...)
|
||||||
@@ -254,7 +275,7 @@ func (f *File) Write(b []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
setModTime(f.fileData, time.Now())
|
setModTime(f.fileData, time.Now())
|
||||||
|
|
||||||
atomic.StoreInt64(&f.at, int64(len(f.fileData.data)))
|
atomic.AddInt64(&f.at, int64(n))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
75
vendor/github.com/spf13/afero/memmap.go
generated
vendored
75
vendor/github.com/spf13/afero/memmap.go
generated
vendored
@@ -25,6 +25,8 @@ import (
|
|||||||
"github.com/spf13/afero/mem"
|
"github.com/spf13/afero/mem"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const chmodBits = os.ModePerm | os.ModeSetuid | os.ModeSetgid | os.ModeSticky // Only a subset of bits are allowed to be changed. Documented under os.Chmod()
|
||||||
|
|
||||||
type MemMapFs struct {
|
type MemMapFs struct {
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
data map[string]*mem.FileData
|
data map[string]*mem.FileData
|
||||||
@@ -40,7 +42,9 @@ func (m *MemMapFs) getData() map[string]*mem.FileData {
|
|||||||
m.data = make(map[string]*mem.FileData)
|
m.data = make(map[string]*mem.FileData)
|
||||||
// Root should always exist, right?
|
// Root should always exist, right?
|
||||||
// TODO: what about windows?
|
// TODO: what about windows?
|
||||||
m.data[FilePathSeparator] = mem.CreateDir(FilePathSeparator)
|
root := mem.CreateDir(FilePathSeparator)
|
||||||
|
mem.SetMode(root, os.ModeDir|0755)
|
||||||
|
m.data[FilePathSeparator] = root
|
||||||
})
|
})
|
||||||
return m.data
|
return m.data
|
||||||
}
|
}
|
||||||
@@ -52,7 +56,7 @@ func (m *MemMapFs) Create(name string) (File, error) {
|
|||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
file := mem.CreateFile(name)
|
file := mem.CreateFile(name)
|
||||||
m.getData()[name] = file
|
m.getData()[name] = file
|
||||||
m.registerWithParent(file)
|
m.registerWithParent(file, 0)
|
||||||
m.mu.Unlock()
|
m.mu.Unlock()
|
||||||
return mem.NewFileHandle(file), nil
|
return mem.NewFileHandle(file), nil
|
||||||
}
|
}
|
||||||
@@ -83,14 +87,14 @@ func (m *MemMapFs) findParent(f *mem.FileData) *mem.FileData {
|
|||||||
return pfile
|
return pfile
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MemMapFs) registerWithParent(f *mem.FileData) {
|
func (m *MemMapFs) registerWithParent(f *mem.FileData, perm os.FileMode) {
|
||||||
if f == nil {
|
if f == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
parent := m.findParent(f)
|
parent := m.findParent(f)
|
||||||
if parent == nil {
|
if parent == nil {
|
||||||
pdir := filepath.Dir(filepath.Clean(f.Name()))
|
pdir := filepath.Dir(filepath.Clean(f.Name()))
|
||||||
err := m.lockfreeMkdir(pdir, 0777)
|
err := m.lockfreeMkdir(pdir, perm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
//log.Println("Mkdir error:", err)
|
//log.Println("Mkdir error:", err)
|
||||||
return
|
return
|
||||||
@@ -119,13 +123,15 @@ func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
item := mem.CreateDir(name)
|
item := mem.CreateDir(name)
|
||||||
|
mem.SetMode(item, os.ModeDir|perm)
|
||||||
m.getData()[name] = item
|
m.getData()[name] = item
|
||||||
m.registerWithParent(item)
|
m.registerWithParent(item, perm)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
|
func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
|
||||||
|
perm &= chmodBits
|
||||||
name = normalizePath(name)
|
name = normalizePath(name)
|
||||||
|
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
@@ -137,13 +143,12 @@ func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
|
|||||||
|
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
item := mem.CreateDir(name)
|
item := mem.CreateDir(name)
|
||||||
|
mem.SetMode(item, os.ModeDir|perm)
|
||||||
m.getData()[name] = item
|
m.getData()[name] = item
|
||||||
m.registerWithParent(item)
|
m.registerWithParent(item, perm)
|
||||||
m.mu.Unlock()
|
m.mu.Unlock()
|
||||||
|
|
||||||
m.Chmod(name, perm|os.ModeDir)
|
return m.setFileMode(name, perm|os.ModeDir)
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error {
|
func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error {
|
||||||
@@ -210,8 +215,12 @@ func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
|
func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
|
||||||
|
perm &= chmodBits
|
||||||
chmod := false
|
chmod := false
|
||||||
file, err := m.openWrite(name)
|
file, err := m.openWrite(name)
|
||||||
|
if err == nil && (flag&os.O_EXCL > 0) {
|
||||||
|
return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileExists}
|
||||||
|
}
|
||||||
if os.IsNotExist(err) && (flag&os.O_CREATE > 0) {
|
if os.IsNotExist(err) && (flag&os.O_CREATE > 0) {
|
||||||
file, err = m.Create(name)
|
file, err = m.Create(name)
|
||||||
chmod = true
|
chmod = true
|
||||||
@@ -237,7 +246,7 @@ func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, erro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if chmod {
|
if chmod {
|
||||||
m.Chmod(name, perm)
|
return file, m.setFileMode(name, perm)
|
||||||
}
|
}
|
||||||
return file, nil
|
return file, nil
|
||||||
}
|
}
|
||||||
@@ -269,7 +278,7 @@ func (m *MemMapFs) RemoveAll(path string) error {
|
|||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
for p, _ := range m.getData() {
|
for p := range m.getData() {
|
||||||
if strings.HasPrefix(p, path) {
|
if strings.HasPrefix(p, path) {
|
||||||
m.mu.RUnlock()
|
m.mu.RUnlock()
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
@@ -299,7 +308,7 @@ func (m *MemMapFs) Rename(oldname, newname string) error {
|
|||||||
delete(m.getData(), oldname)
|
delete(m.getData(), oldname)
|
||||||
mem.ChangeFileName(fileData, newname)
|
mem.ChangeFileName(fileData, newname)
|
||||||
m.getData()[newname] = fileData
|
m.getData()[newname] = fileData
|
||||||
m.registerWithParent(fileData)
|
m.registerWithParent(fileData, 0)
|
||||||
m.mu.Unlock()
|
m.mu.Unlock()
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
} else {
|
} else {
|
||||||
@@ -308,6 +317,11 @@ func (m *MemMapFs) Rename(oldname, newname string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *MemMapFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
|
||||||
|
fileInfo, err := m.Stat(name)
|
||||||
|
return fileInfo, false, err
|
||||||
|
}
|
||||||
|
|
||||||
func (m *MemMapFs) Stat(name string) (os.FileInfo, error) {
|
func (m *MemMapFs) Stat(name string) (os.FileInfo, error) {
|
||||||
f, err := m.Open(name)
|
f, err := m.Open(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -318,6 +332,21 @@ func (m *MemMapFs) Stat(name string) (os.FileInfo, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *MemMapFs) Chmod(name string, mode os.FileMode) error {
|
func (m *MemMapFs) Chmod(name string, mode os.FileMode) error {
|
||||||
|
mode &= chmodBits
|
||||||
|
|
||||||
|
m.mu.RLock()
|
||||||
|
f, ok := m.getData()[name]
|
||||||
|
m.mu.RUnlock()
|
||||||
|
if !ok {
|
||||||
|
return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound}
|
||||||
|
}
|
||||||
|
prevOtherBits := mem.GetFileInfo(f).Mode() & ^chmodBits
|
||||||
|
|
||||||
|
mode = prevOtherBits | mode
|
||||||
|
return m.setFileMode(name, mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MemMapFs) setFileMode(name string, mode os.FileMode) error {
|
||||||
name = normalizePath(name)
|
name = normalizePath(name)
|
||||||
|
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
@@ -334,6 +363,22 @@ func (m *MemMapFs) Chmod(name string, mode os.FileMode) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *MemMapFs) Chown(name string, uid, gid int) error {
|
||||||
|
name = normalizePath(name)
|
||||||
|
|
||||||
|
m.mu.RLock()
|
||||||
|
f, ok := m.getData()[name]
|
||||||
|
m.mu.RUnlock()
|
||||||
|
if !ok {
|
||||||
|
return &os.PathError{Op: "chown", Path: name, Err: ErrFileNotFound}
|
||||||
|
}
|
||||||
|
|
||||||
|
mem.SetUID(f, uid)
|
||||||
|
mem.SetGID(f, gid)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
||||||
name = normalizePath(name)
|
name = normalizePath(name)
|
||||||
|
|
||||||
@@ -357,9 +402,3 @@ func (m *MemMapFs) List() {
|
|||||||
fmt.Println(x.Name(), y.Size())
|
fmt.Println(x.Name(), y.Size())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// func debugMemMapList(fs Fs) {
|
|
||||||
// if x, ok := fs.(*MemMapFs); ok {
|
|
||||||
// x.List()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|||||||
12
vendor/github.com/spf13/afero/os.go
generated
vendored
12
vendor/github.com/spf13/afero/os.go
generated
vendored
@@ -91,6 +91,10 @@ func (OsFs) Chmod(name string, mode os.FileMode) error {
|
|||||||
return os.Chmod(name, mode)
|
return os.Chmod(name, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (OsFs) Chown(name string, uid, gid int) error {
|
||||||
|
return os.Chown(name, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
func (OsFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
func (OsFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
|
||||||
return os.Chtimes(name, atime, mtime)
|
return os.Chtimes(name, atime, mtime)
|
||||||
}
|
}
|
||||||
@@ -99,3 +103,11 @@ func (OsFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
|
|||||||
fi, err := os.Lstat(name)
|
fi, err := os.Lstat(name)
|
||||||
return fi, true, err
|
return fi, true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (OsFs) SymlinkIfPossible(oldname, newname string) error {
|
||||||
|
return os.Symlink(oldname, newname)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (OsFs) ReadlinkIfPossible(name string) (string, error) {
|
||||||
|
return os.Readlink(name)
|
||||||
|
}
|
||||||
|
|||||||
16
vendor/github.com/spf13/afero/readonlyfs.go
generated
vendored
16
vendor/github.com/spf13/afero/readonlyfs.go
generated
vendored
@@ -28,6 +28,10 @@ func (r *ReadOnlyFs) Chmod(n string, m os.FileMode) error {
|
|||||||
return syscall.EPERM
|
return syscall.EPERM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *ReadOnlyFs) Chown(n string, uid, gid int) error {
|
||||||
|
return syscall.EPERM
|
||||||
|
}
|
||||||
|
|
||||||
func (r *ReadOnlyFs) Name() string {
|
func (r *ReadOnlyFs) Name() string {
|
||||||
return "ReadOnlyFilter"
|
return "ReadOnlyFilter"
|
||||||
}
|
}
|
||||||
@@ -44,6 +48,18 @@ func (r *ReadOnlyFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
|
|||||||
return fi, false, err
|
return fi, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *ReadOnlyFs) SymlinkIfPossible(oldname, newname string) error {
|
||||||
|
return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ReadOnlyFs) ReadlinkIfPossible(name string) (string, error) {
|
||||||
|
if srdr, ok := r.source.(LinkReader); ok {
|
||||||
|
return srdr.ReadlinkIfPossible(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink}
|
||||||
|
}
|
||||||
|
|
||||||
func (r *ReadOnlyFs) Rename(o, n string) error {
|
func (r *ReadOnlyFs) Rename(o, n string) error {
|
||||||
return syscall.EPERM
|
return syscall.EPERM
|
||||||
}
|
}
|
||||||
|
|||||||
10
vendor/github.com/spf13/afero/regexpfs.go
generated
vendored
10
vendor/github.com/spf13/afero/regexpfs.go
generated
vendored
@@ -60,6 +60,13 @@ func (r *RegexpFs) Chmod(name string, mode os.FileMode) error {
|
|||||||
return r.source.Chmod(name, mode)
|
return r.source.Chmod(name, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *RegexpFs) Chown(name string, uid, gid int) error {
|
||||||
|
if err := r.dirOrMatches(name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return r.source.Chown(name, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
func (r *RegexpFs) Name() string {
|
func (r *RegexpFs) Name() string {
|
||||||
return "RegexpFs"
|
return "RegexpFs"
|
||||||
}
|
}
|
||||||
@@ -126,6 +133,9 @@ func (r *RegexpFs) Open(name string) (File, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
f, err := r.source.Open(name)
|
f, err := r.source.Open(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return &RegexpFile{f: f, re: r.re}, nil
|
return &RegexpFile{f: f, re: r.re}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
55
vendor/github.com/spf13/afero/symlink.go
generated
vendored
Normal file
55
vendor/github.com/spf13/afero/symlink.go
generated
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
// Copyright © 2018 Steve Francia <spf@spf13.com>.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package afero
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Symlinker is an optional interface in Afero. It is only implemented by the
|
||||||
|
// filesystems saying so.
|
||||||
|
// It indicates support for 3 symlink related interfaces that implement the
|
||||||
|
// behaviors of the os methods:
|
||||||
|
// - Lstat
|
||||||
|
// - Symlink, and
|
||||||
|
// - Readlink
|
||||||
|
type Symlinker interface {
|
||||||
|
Lstater
|
||||||
|
Linker
|
||||||
|
LinkReader
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linker is an optional interface in Afero. It is only implemented by the
|
||||||
|
// filesystems saying so.
|
||||||
|
// It will call Symlink if the filesystem itself is, or it delegates to, the os filesystem,
|
||||||
|
// or the filesystem otherwise supports Symlink's.
|
||||||
|
type Linker interface {
|
||||||
|
SymlinkIfPossible(oldname, newname string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrNoSymlink is the error that will be wrapped in an os.LinkError if a file system
|
||||||
|
// does not support Symlink's either directly or through its delegated filesystem.
|
||||||
|
// As expressed by support for the Linker interface.
|
||||||
|
var ErrNoSymlink = errors.New("symlink not supported")
|
||||||
|
|
||||||
|
// LinkReader is an optional interface in Afero. It is only implemented by the
|
||||||
|
// filesystems saying so.
|
||||||
|
type LinkReader interface {
|
||||||
|
ReadlinkIfPossible(name string) (string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrNoReadlink is the error that will be wrapped in an os.Path if a file system
|
||||||
|
// does not support the readlink operation either directly or through its delegated filesystem.
|
||||||
|
// As expressed by support for the LinkReader interface.
|
||||||
|
var ErrNoReadlink = errors.New("readlink not supported")
|
||||||
20
vendor/github.com/spf13/afero/unionFile.go
generated
vendored
20
vendor/github.com/spf13/afero/unionFile.go
generated
vendored
@@ -155,7 +155,8 @@ var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Readdir will weave the two directories together and
|
// Readdir will weave the two directories together and
|
||||||
// return a single view of the overlayed directories
|
// return a single view of the overlayed directories.
|
||||||
|
// At the end of the directory view, the error is io.EOF if c > 0.
|
||||||
func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
|
func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
|
||||||
var merge DirsMerger = f.Merger
|
var merge DirsMerger = f.Merger
|
||||||
if merge == nil {
|
if merge == nil {
|
||||||
@@ -185,11 +186,22 @@ func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
|
|||||||
}
|
}
|
||||||
f.files = append(f.files, merged...)
|
f.files = append(f.files, merged...)
|
||||||
}
|
}
|
||||||
if c == -1 {
|
files := f.files[f.off:]
|
||||||
return f.files[f.off:], nil
|
|
||||||
|
if c <= 0 {
|
||||||
|
return files, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(files) == 0 {
|
||||||
|
return nil, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
if c > len(files) {
|
||||||
|
c = len(files)
|
||||||
|
}
|
||||||
|
|
||||||
defer func() { f.off += c }()
|
defer func() { f.off += c }()
|
||||||
return f.files[f.off:c], nil
|
return files[:c], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *UnionFile) Readdirnames(c int) ([]string, error) {
|
func (f *UnionFile) Readdirnames(c int) ([]string, error) {
|
||||||
|
|||||||
15
vendor/github.com/spf13/cast/.travis.yml
generated
vendored
15
vendor/github.com/spf13/cast/.travis.yml
generated
vendored
@@ -1,15 +0,0 @@
|
|||||||
language: go
|
|
||||||
env:
|
|
||||||
- GO111MODULE=on
|
|
||||||
sudo: required
|
|
||||||
go:
|
|
||||||
- "1.11.x"
|
|
||||||
- tip
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
matrix:
|
|
||||||
allow_failures:
|
|
||||||
- go: tip
|
|
||||||
fast_finish: true
|
|
||||||
script:
|
|
||||||
- make check
|
|
||||||
4
vendor/github.com/spf13/cast/Makefile
generated
vendored
4
vendor/github.com/spf13/cast/Makefile
generated
vendored
@@ -1,4 +1,4 @@
|
|||||||
# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
|
GOVERSION := $(shell go version | cut -d ' ' -f 3 | cut -d '.' -f 2)
|
||||||
|
|
||||||
.PHONY: check fmt lint test test-race vet test-cover-html help
|
.PHONY: check fmt lint test test-race vet test-cover-html help
|
||||||
.DEFAULT_GOAL := help
|
.DEFAULT_GOAL := help
|
||||||
@@ -12,11 +12,13 @@ test-race: ## Run tests with race detector
|
|||||||
go test -race ./...
|
go test -race ./...
|
||||||
|
|
||||||
fmt: ## Run gofmt linter
|
fmt: ## Run gofmt linter
|
||||||
|
ifeq "$(GOVERSION)" "12"
|
||||||
@for d in `go list` ; do \
|
@for d in `go list` ; do \
|
||||||
if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \
|
if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \
|
||||||
echo "^ improperly formatted go files" && echo && exit 1; \
|
echo "^ improperly formatted go files" && echo && exit 1; \
|
||||||
fi \
|
fi \
|
||||||
done
|
done
|
||||||
|
endif
|
||||||
|
|
||||||
lint: ## Run golint linter
|
lint: ## Run golint linter
|
||||||
@for d in `go list` ; do \
|
@for d in `go list` ; do \
|
||||||
|
|||||||
2
vendor/github.com/spf13/cast/README.md
generated
vendored
2
vendor/github.com/spf13/cast/README.md
generated
vendored
@@ -1,7 +1,7 @@
|
|||||||
cast
|
cast
|
||||||
====
|
====
|
||||||
[](https://godoc.org/github.com/spf13/cast)
|
[](https://godoc.org/github.com/spf13/cast)
|
||||||
[](https://travis-ci.org/spf13/cast)
|
[](https://github.com/spf13/cast/actions/workflows/go.yml)
|
||||||
[](https://goreportcard.com/report/github.com/spf13/cast)
|
[](https://goreportcard.com/report/github.com/spf13/cast)
|
||||||
|
|
||||||
Easy and safe casting from one type to another in Go
|
Easy and safe casting from one type to another in Go
|
||||||
|
|||||||
5
vendor/github.com/spf13/cast/cast.go
generated
vendored
5
vendor/github.com/spf13/cast/cast.go
generated
vendored
@@ -20,6 +20,11 @@ func ToTime(i interface{}) time.Time {
|
|||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ToTimeInDefaultLocation(i interface{}, location *time.Location) time.Time {
|
||||||
|
v, _ := ToTimeInDefaultLocationE(i, location)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
// ToDuration casts an interface to a time.Duration type.
|
// ToDuration casts an interface to a time.Duration type.
|
||||||
func ToDuration(i interface{}) time.Duration {
|
func ToDuration(i interface{}) time.Duration {
|
||||||
v, _ := ToDurationE(i)
|
v, _ := ToDurationE(i)
|
||||||
|
|||||||
158
vendor/github.com/spf13/cast/caste.go
generated
vendored
158
vendor/github.com/spf13/cast/caste.go
generated
vendored
@@ -20,13 +20,20 @@ var errNegativeNotAllowed = errors.New("unable to cast negative value")
|
|||||||
|
|
||||||
// ToTimeE casts an interface to a time.Time type.
|
// ToTimeE casts an interface to a time.Time type.
|
||||||
func ToTimeE(i interface{}) (tim time.Time, err error) {
|
func ToTimeE(i interface{}) (tim time.Time, err error) {
|
||||||
|
return ToTimeInDefaultLocationE(i, time.UTC)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToTimeInDefaultLocationE casts an empty interface to time.Time,
|
||||||
|
// interpreting inputs without a timezone to be in the given location,
|
||||||
|
// or the local timezone if nil.
|
||||||
|
func ToTimeInDefaultLocationE(i interface{}, location *time.Location) (tim time.Time, err error) {
|
||||||
i = indirect(i)
|
i = indirect(i)
|
||||||
|
|
||||||
switch v := i.(type) {
|
switch v := i.(type) {
|
||||||
case time.Time:
|
case time.Time:
|
||||||
return v, nil
|
return v, nil
|
||||||
case string:
|
case string:
|
||||||
return StringToDate(v)
|
return StringToDateInDefaultLocation(v, location)
|
||||||
case int:
|
case int:
|
||||||
return time.Unix(int64(v), 0), nil
|
return time.Unix(int64(v), 0), nil
|
||||||
case int64:
|
case int64:
|
||||||
@@ -819,15 +826,15 @@ func ToStringE(i interface{}) (string, error) {
|
|||||||
case int8:
|
case int8:
|
||||||
return strconv.FormatInt(int64(s), 10), nil
|
return strconv.FormatInt(int64(s), 10), nil
|
||||||
case uint:
|
case uint:
|
||||||
return strconv.FormatInt(int64(s), 10), nil
|
return strconv.FormatUint(uint64(s), 10), nil
|
||||||
case uint64:
|
case uint64:
|
||||||
return strconv.FormatInt(int64(s), 10), nil
|
return strconv.FormatUint(uint64(s), 10), nil
|
||||||
case uint32:
|
case uint32:
|
||||||
return strconv.FormatInt(int64(s), 10), nil
|
return strconv.FormatUint(uint64(s), 10), nil
|
||||||
case uint16:
|
case uint16:
|
||||||
return strconv.FormatInt(int64(s), 10), nil
|
return strconv.FormatUint(uint64(s), 10), nil
|
||||||
case uint8:
|
case uint8:
|
||||||
return strconv.FormatInt(int64(s), 10), nil
|
return strconv.FormatUint(uint64(s), 10), nil
|
||||||
case []byte:
|
case []byte:
|
||||||
return string(s), nil
|
return string(s), nil
|
||||||
case template.HTML:
|
case template.HTML:
|
||||||
@@ -1129,8 +1136,43 @@ func ToStringSliceE(i interface{}) ([]string, error) {
|
|||||||
return a, nil
|
return a, nil
|
||||||
case []string:
|
case []string:
|
||||||
return v, nil
|
return v, nil
|
||||||
|
case []int8:
|
||||||
|
for _, u := range v {
|
||||||
|
a = append(a, ToString(u))
|
||||||
|
}
|
||||||
|
return a, nil
|
||||||
|
case []int:
|
||||||
|
for _, u := range v {
|
||||||
|
a = append(a, ToString(u))
|
||||||
|
}
|
||||||
|
return a, nil
|
||||||
|
case []int32:
|
||||||
|
for _, u := range v {
|
||||||
|
a = append(a, ToString(u))
|
||||||
|
}
|
||||||
|
return a, nil
|
||||||
|
case []int64:
|
||||||
|
for _, u := range v {
|
||||||
|
a = append(a, ToString(u))
|
||||||
|
}
|
||||||
|
return a, nil
|
||||||
|
case []float32:
|
||||||
|
for _, u := range v {
|
||||||
|
a = append(a, ToString(u))
|
||||||
|
}
|
||||||
|
return a, nil
|
||||||
|
case []float64:
|
||||||
|
for _, u := range v {
|
||||||
|
a = append(a, ToString(u))
|
||||||
|
}
|
||||||
|
return a, nil
|
||||||
case string:
|
case string:
|
||||||
return strings.Fields(v), nil
|
return strings.Fields(v), nil
|
||||||
|
case []error:
|
||||||
|
for _, err := range i.([]error) {
|
||||||
|
a = append(a, err.Error())
|
||||||
|
}
|
||||||
|
return a, nil
|
||||||
case interface{}:
|
case interface{}:
|
||||||
str, err := ToStringE(v)
|
str, err := ToStringE(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1204,37 +1246,83 @@ func ToDurationSliceE(i interface{}) ([]time.Duration, error) {
|
|||||||
// predefined list of formats. If no suitable format is found, an error is
|
// predefined list of formats. If no suitable format is found, an error is
|
||||||
// returned.
|
// returned.
|
||||||
func StringToDate(s string) (time.Time, error) {
|
func StringToDate(s string) (time.Time, error) {
|
||||||
return parseDateWith(s, []string{
|
return parseDateWith(s, time.UTC, timeFormats)
|
||||||
time.RFC3339,
|
|
||||||
"2006-01-02T15:04:05", // iso8601 without timezone
|
|
||||||
time.RFC1123Z,
|
|
||||||
time.RFC1123,
|
|
||||||
time.RFC822Z,
|
|
||||||
time.RFC822,
|
|
||||||
time.RFC850,
|
|
||||||
time.ANSIC,
|
|
||||||
time.UnixDate,
|
|
||||||
time.RubyDate,
|
|
||||||
"2006-01-02 15:04:05.999999999 -0700 MST", // Time.String()
|
|
||||||
"2006-01-02",
|
|
||||||
"02 Jan 2006",
|
|
||||||
"2006-01-02T15:04:05-0700", // RFC3339 without timezone hh:mm colon
|
|
||||||
"2006-01-02 15:04:05 -07:00",
|
|
||||||
"2006-01-02 15:04:05 -0700",
|
|
||||||
"2006-01-02 15:04:05Z07:00", // RFC3339 without T
|
|
||||||
"2006-01-02 15:04:05Z0700", // RFC3339 without T or timezone hh:mm colon
|
|
||||||
"2006-01-02 15:04:05",
|
|
||||||
time.Kitchen,
|
|
||||||
time.Stamp,
|
|
||||||
time.StampMilli,
|
|
||||||
time.StampMicro,
|
|
||||||
time.StampNano,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseDateWith(s string, dates []string) (d time.Time, e error) {
|
// StringToDateInDefaultLocation casts an empty interface to a time.Time,
|
||||||
for _, dateType := range dates {
|
// interpreting inputs without a timezone to be in the given location,
|
||||||
if d, e = time.Parse(dateType, s); e == nil {
|
// or the local timezone if nil.
|
||||||
|
func StringToDateInDefaultLocation(s string, location *time.Location) (time.Time, error) {
|
||||||
|
return parseDateWith(s, location, timeFormats)
|
||||||
|
}
|
||||||
|
|
||||||
|
type timeFormatType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
timeFormatNoTimezone timeFormatType = iota
|
||||||
|
timeFormatNamedTimezone
|
||||||
|
timeFormatNumericTimezone
|
||||||
|
timeFormatNumericAndNamedTimezone
|
||||||
|
timeFormatTimeOnly
|
||||||
|
)
|
||||||
|
|
||||||
|
type timeFormat struct {
|
||||||
|
format string
|
||||||
|
typ timeFormatType
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f timeFormat) hasTimezone() bool {
|
||||||
|
// We don't include the formats with only named timezones, see
|
||||||
|
// https://github.com/golang/go/issues/19694#issuecomment-289103522
|
||||||
|
return f.typ >= timeFormatNumericTimezone && f.typ <= timeFormatNumericAndNamedTimezone
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
timeFormats = []timeFormat{
|
||||||
|
timeFormat{time.RFC3339, timeFormatNumericTimezone},
|
||||||
|
timeFormat{"2006-01-02T15:04:05", timeFormatNoTimezone}, // iso8601 without timezone
|
||||||
|
timeFormat{time.RFC1123Z, timeFormatNumericTimezone},
|
||||||
|
timeFormat{time.RFC1123, timeFormatNamedTimezone},
|
||||||
|
timeFormat{time.RFC822Z, timeFormatNumericTimezone},
|
||||||
|
timeFormat{time.RFC822, timeFormatNamedTimezone},
|
||||||
|
timeFormat{time.RFC850, timeFormatNamedTimezone},
|
||||||
|
timeFormat{"2006-01-02 15:04:05.999999999 -0700 MST", timeFormatNumericAndNamedTimezone}, // Time.String()
|
||||||
|
timeFormat{"2006-01-02T15:04:05-0700", timeFormatNumericTimezone}, // RFC3339 without timezone hh:mm colon
|
||||||
|
timeFormat{"2006-01-02 15:04:05Z0700", timeFormatNumericTimezone}, // RFC3339 without T or timezone hh:mm colon
|
||||||
|
timeFormat{"2006-01-02 15:04:05", timeFormatNoTimezone},
|
||||||
|
timeFormat{time.ANSIC, timeFormatNoTimezone},
|
||||||
|
timeFormat{time.UnixDate, timeFormatNamedTimezone},
|
||||||
|
timeFormat{time.RubyDate, timeFormatNumericTimezone},
|
||||||
|
timeFormat{"2006-01-02 15:04:05Z07:00", timeFormatNumericTimezone},
|
||||||
|
timeFormat{"2006-01-02", timeFormatNoTimezone},
|
||||||
|
timeFormat{"02 Jan 2006", timeFormatNoTimezone},
|
||||||
|
timeFormat{"2006-01-02 15:04:05 -07:00", timeFormatNumericTimezone},
|
||||||
|
timeFormat{"2006-01-02 15:04:05 -0700", timeFormatNumericTimezone},
|
||||||
|
timeFormat{time.Kitchen, timeFormatTimeOnly},
|
||||||
|
timeFormat{time.Stamp, timeFormatTimeOnly},
|
||||||
|
timeFormat{time.StampMilli, timeFormatTimeOnly},
|
||||||
|
timeFormat{time.StampMicro, timeFormatTimeOnly},
|
||||||
|
timeFormat{time.StampNano, timeFormatTimeOnly},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func parseDateWith(s string, location *time.Location, formats []timeFormat) (d time.Time, e error) {
|
||||||
|
|
||||||
|
for _, format := range formats {
|
||||||
|
if d, e = time.Parse(format.format, s); e == nil {
|
||||||
|
|
||||||
|
// Some time formats have a zone name, but no offset, so it gets
|
||||||
|
// put in that zone name (not the default one passed in to us), but
|
||||||
|
// without that zone's offset. So set the location manually.
|
||||||
|
if format.typ <= timeFormatNamedTimezone {
|
||||||
|
if location == nil {
|
||||||
|
location = time.Local
|
||||||
|
}
|
||||||
|
year, month, day := d.Date()
|
||||||
|
hour, min, sec := d.Clock()
|
||||||
|
d = time.Date(year, month, day, hour, min, sec, d.Nanosecond(), location)
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
27
vendor/github.com/spf13/cast/timeformattype_string.go
generated
vendored
Normal file
27
vendor/github.com/spf13/cast/timeformattype_string.go
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
// Code generated by "stringer -type timeFormatType"; DO NOT EDIT.
|
||||||
|
|
||||||
|
package cast
|
||||||
|
|
||||||
|
import "strconv"
|
||||||
|
|
||||||
|
func _() {
|
||||||
|
// An "invalid array index" compiler error signifies that the constant values have changed.
|
||||||
|
// Re-run the stringer command to generate them again.
|
||||||
|
var x [1]struct{}
|
||||||
|
_ = x[timeFormatNoTimezone-0]
|
||||||
|
_ = x[timeFormatNamedTimezone-1]
|
||||||
|
_ = x[timeFormatNumericTimezone-2]
|
||||||
|
_ = x[timeFormatNumericAndNamedTimezone-3]
|
||||||
|
_ = x[timeFormatTimeOnly-4]
|
||||||
|
}
|
||||||
|
|
||||||
|
const _timeFormatType_name = "timeFormatNoTimezonetimeFormatNamedTimezonetimeFormatNumericTimezonetimeFormatNumericAndNamedTimezonetimeFormatTimeOnly"
|
||||||
|
|
||||||
|
var _timeFormatType_index = [...]uint8{0, 20, 43, 68, 101, 119}
|
||||||
|
|
||||||
|
func (i timeFormatType) String() string {
|
||||||
|
if i < 0 || i >= timeFormatType(len(_timeFormatType_index)-1) {
|
||||||
|
return "timeFormatType(" + strconv.FormatInt(int64(i), 10) + ")"
|
||||||
|
}
|
||||||
|
return _timeFormatType_name[_timeFormatType_index[i]:_timeFormatType_index[i+1]]
|
||||||
|
}
|
||||||
2
vendor/github.com/spf13/jwalterweatherman/.gitignore
generated
vendored
2
vendor/github.com/spf13/jwalterweatherman/.gitignore
generated
vendored
@@ -20,3 +20,5 @@ _cgo_export.*
|
|||||||
_testmain.go
|
_testmain.go
|
||||||
|
|
||||||
*.exe
|
*.exe
|
||||||
|
*.bench
|
||||||
|
go.sum
|
||||||
30
vendor/github.com/spf13/jwalterweatherman/default_notepad.go
generated
vendored
30
vendor/github.com/spf13/jwalterweatherman/default_notepad.go
generated
vendored
@@ -64,6 +64,13 @@ func SetStdoutThreshold(threshold Threshold) {
|
|||||||
reloadDefaultNotepad()
|
reloadDefaultNotepad()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetStdoutOutput set the stdout output for the default notepad. Default is stdout.
|
||||||
|
func SetStdoutOutput(handle io.Writer) {
|
||||||
|
defaultNotepad.outHandle = handle
|
||||||
|
defaultNotepad.init()
|
||||||
|
reloadDefaultNotepad()
|
||||||
|
}
|
||||||
|
|
||||||
// SetPrefix set the prefix for the default logger. Empty by default.
|
// SetPrefix set the prefix for the default logger. Empty by default.
|
||||||
func SetPrefix(prefix string) {
|
func SetPrefix(prefix string) {
|
||||||
defaultNotepad.SetPrefix(prefix)
|
defaultNotepad.SetPrefix(prefix)
|
||||||
@@ -76,6 +83,13 @@ func SetFlags(flags int) {
|
|||||||
reloadDefaultNotepad()
|
reloadDefaultNotepad()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetLogListeners configures the default logger with one or more log listeners.
|
||||||
|
func SetLogListeners(l ...LogListener) {
|
||||||
|
defaultNotepad.logListeners = l
|
||||||
|
defaultNotepad.init()
|
||||||
|
reloadDefaultNotepad()
|
||||||
|
}
|
||||||
|
|
||||||
// Level returns the current global log threshold.
|
// Level returns the current global log threshold.
|
||||||
func LogThreshold() Threshold {
|
func LogThreshold() Threshold {
|
||||||
return defaultNotepad.logThreshold
|
return defaultNotepad.logThreshold
|
||||||
@@ -95,19 +109,3 @@ func GetLogThreshold() Threshold {
|
|||||||
func GetStdoutThreshold() Threshold {
|
func GetStdoutThreshold() Threshold {
|
||||||
return defaultNotepad.GetStdoutThreshold()
|
return defaultNotepad.GetStdoutThreshold()
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogCountForLevel returns the number of log invocations for a given threshold.
|
|
||||||
func LogCountForLevel(l Threshold) uint64 {
|
|
||||||
return defaultNotepad.LogCountForLevel(l)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations
|
|
||||||
// greater than or equal to a given threshold.
|
|
||||||
func LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 {
|
|
||||||
return defaultNotepad.LogCountForLevelsGreaterThanorEqualTo(threshold)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResetLogCounters resets the invocation counters for all levels.
|
|
||||||
func ResetLogCounters() {
|
|
||||||
defaultNotepad.ResetLogCounters()
|
|
||||||
}
|
|
||||||
|
|||||||
51
vendor/github.com/spf13/jwalterweatherman/log_counter.go
generated
vendored
51
vendor/github.com/spf13/jwalterweatherman/log_counter.go
generated
vendored
@@ -6,50 +6,41 @@
|
|||||||
package jwalterweatherman
|
package jwalterweatherman
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
)
|
)
|
||||||
|
|
||||||
type logCounter struct {
|
// Counter is an io.Writer that increments a counter on Write.
|
||||||
counter uint64
|
type Counter struct {
|
||||||
|
count uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *logCounter) incr() {
|
func (c *Counter) incr() {
|
||||||
atomic.AddUint64(&c.counter, 1)
|
atomic.AddUint64(&c.count, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *logCounter) resetCounter() {
|
// Reset resets the counter.
|
||||||
atomic.StoreUint64(&c.counter, 0)
|
func (c *Counter) Reset() {
|
||||||
|
atomic.StoreUint64(&c.count, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *logCounter) getCount() uint64 {
|
// Count returns the current count.
|
||||||
return atomic.LoadUint64(&c.counter)
|
func (c *Counter) Count() uint64 {
|
||||||
|
return atomic.LoadUint64(&c.count)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *logCounter) Write(p []byte) (n int, err error) {
|
func (c *Counter) Write(p []byte) (n int, err error) {
|
||||||
c.incr()
|
c.incr()
|
||||||
return len(p), nil
|
return len(p), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogCountForLevel returns the number of log invocations for a given threshold.
|
// LogCounter creates a LogListener that counts log statements >= the given threshold.
|
||||||
func (n *Notepad) LogCountForLevel(l Threshold) uint64 {
|
func LogCounter(counter *Counter, t1 Threshold) LogListener {
|
||||||
return n.logCounters[l].getCount()
|
return func(t2 Threshold) io.Writer {
|
||||||
}
|
if t2 < t1 {
|
||||||
|
// Not interested in this threshold.
|
||||||
// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations
|
return nil
|
||||||
// greater than or equal to a given threshold.
|
}
|
||||||
func (n *Notepad) LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 {
|
return counter
|
||||||
var cnt uint64
|
|
||||||
|
|
||||||
for i := int(threshold); i < len(n.logCounters); i++ {
|
|
||||||
cnt += n.LogCountForLevel(Threshold(i))
|
|
||||||
}
|
|
||||||
|
|
||||||
return cnt
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResetLogCounters resets the invocation counters for all levels.
|
|
||||||
func (n *Notepad) ResetLogCounters() {
|
|
||||||
for _, np := range n.logCounters {
|
|
||||||
np.resetCounter()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
57
vendor/github.com/spf13/jwalterweatherman/notepad.go
generated
vendored
57
vendor/github.com/spf13/jwalterweatherman/notepad.go
generated
vendored
@@ -8,6 +8,7 @@ package jwalterweatherman
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -58,13 +59,28 @@ type Notepad struct {
|
|||||||
prefix string
|
prefix string
|
||||||
flags int
|
flags int
|
||||||
|
|
||||||
// One per Threshold
|
logListeners []LogListener
|
||||||
logCounters [7]*logCounter
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNotepad create a new notepad.
|
// A LogListener can ble supplied to a Notepad to listen on log writes for a given
|
||||||
func NewNotepad(outThreshold Threshold, logThreshold Threshold, outHandle, logHandle io.Writer, prefix string, flags int) *Notepad {
|
// threshold. This can be used to capture log events in unit tests and similar.
|
||||||
n := &Notepad{}
|
// Note that this function will be invoked once for each log threshold. If
|
||||||
|
// the given threshold is not of interest to you, return nil.
|
||||||
|
// Note that these listeners will receive log events for a given threshold, even
|
||||||
|
// if the current configuration says not to log it. That way you can count ERRORs even
|
||||||
|
// if you don't print them to the console.
|
||||||
|
type LogListener func(t Threshold) io.Writer
|
||||||
|
|
||||||
|
// NewNotepad creates a new Notepad.
|
||||||
|
func NewNotepad(
|
||||||
|
outThreshold Threshold,
|
||||||
|
logThreshold Threshold,
|
||||||
|
outHandle, logHandle io.Writer,
|
||||||
|
prefix string, flags int,
|
||||||
|
logListeners ...LogListener,
|
||||||
|
) *Notepad {
|
||||||
|
|
||||||
|
n := &Notepad{logListeners: logListeners}
|
||||||
|
|
||||||
n.loggers = [7]**log.Logger{&n.TRACE, &n.DEBUG, &n.INFO, &n.WARN, &n.ERROR, &n.CRITICAL, &n.FATAL}
|
n.loggers = [7]**log.Logger{&n.TRACE, &n.DEBUG, &n.INFO, &n.WARN, &n.ERROR, &n.CRITICAL, &n.FATAL}
|
||||||
n.outHandle = outHandle
|
n.outHandle = outHandle
|
||||||
@@ -95,28 +111,43 @@ func (n *Notepad) init() {
|
|||||||
|
|
||||||
for t, logger := range n.loggers {
|
for t, logger := range n.loggers {
|
||||||
threshold := Threshold(t)
|
threshold := Threshold(t)
|
||||||
counter := &logCounter{}
|
|
||||||
n.logCounters[t] = counter
|
|
||||||
prefix := n.prefix + threshold.String() + " "
|
prefix := n.prefix + threshold.String() + " "
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case threshold >= n.logThreshold && threshold >= n.stdoutThreshold:
|
case threshold >= n.logThreshold && threshold >= n.stdoutThreshold:
|
||||||
*logger = log.New(io.MultiWriter(counter, logAndOut), prefix, n.flags)
|
*logger = log.New(n.createLogWriters(threshold, logAndOut), prefix, n.flags)
|
||||||
|
|
||||||
case threshold >= n.logThreshold:
|
case threshold >= n.logThreshold:
|
||||||
*logger = log.New(io.MultiWriter(counter, n.logHandle), prefix, n.flags)
|
*logger = log.New(n.createLogWriters(threshold, n.logHandle), prefix, n.flags)
|
||||||
|
|
||||||
case threshold >= n.stdoutThreshold:
|
case threshold >= n.stdoutThreshold:
|
||||||
*logger = log.New(io.MultiWriter(counter, n.outHandle), prefix, n.flags)
|
*logger = log.New(n.createLogWriters(threshold, n.outHandle), prefix, n.flags)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// counter doesn't care about prefix and flags, so don't use them
|
*logger = log.New(n.createLogWriters(threshold, ioutil.Discard), prefix, n.flags)
|
||||||
// for performance.
|
|
||||||
*logger = log.New(counter, "", 0)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n *Notepad) createLogWriters(t Threshold, handle io.Writer) io.Writer {
|
||||||
|
if len(n.logListeners) == 0 {
|
||||||
|
return handle
|
||||||
|
}
|
||||||
|
writers := []io.Writer{handle}
|
||||||
|
for _, l := range n.logListeners {
|
||||||
|
w := l(t)
|
||||||
|
if w != nil {
|
||||||
|
writers = append(writers, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(writers) == 1 {
|
||||||
|
return handle
|
||||||
|
}
|
||||||
|
|
||||||
|
return io.MultiWriter(writers...)
|
||||||
|
}
|
||||||
|
|
||||||
// SetLogThreshold changes the threshold above which messages are written to the
|
// SetLogThreshold changes the threshold above which messages are written to the
|
||||||
// log file.
|
// log file.
|
||||||
func (n *Notepad) SetLogThreshold(threshold Threshold) {
|
func (n *Notepad) SetLogThreshold(threshold Threshold) {
|
||||||
|
|||||||
7
vendor/github.com/spf13/pflag/.travis.yml
generated
vendored
7
vendor/github.com/spf13/pflag/.travis.yml
generated
vendored
@@ -3,8 +3,9 @@ sudo: false
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.7.3
|
- 1.9.x
|
||||||
- 1.8.1
|
- 1.10.x
|
||||||
|
- 1.11.x
|
||||||
- tip
|
- tip
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
@@ -12,7 +13,7 @@ matrix:
|
|||||||
- go: tip
|
- go: tip
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- go get github.com/golang/lint/golint
|
- go get golang.org/x/lint/golint
|
||||||
- export PATH=$GOPATH/bin:$PATH
|
- export PATH=$GOPATH/bin:$PATH
|
||||||
- go install ./...
|
- go install ./...
|
||||||
|
|
||||||
|
|||||||
4
vendor/github.com/spf13/pflag/README.md
generated
vendored
4
vendor/github.com/spf13/pflag/README.md
generated
vendored
@@ -86,8 +86,8 @@ fmt.Println("ip has value ", *ip)
|
|||||||
fmt.Println("flagvar has value ", flagvar)
|
fmt.Println("flagvar has value ", flagvar)
|
||||||
```
|
```
|
||||||
|
|
||||||
There are helpers function to get values later if you have the FlagSet but
|
There are helper functions available to get the value stored in a Flag if you have a FlagSet but find
|
||||||
it was difficult to keep up with all of the flag pointers in your code.
|
it difficult to keep up with all of the pointers in your code.
|
||||||
If you have a pflag.FlagSet with a flag called 'flagname' of type int you
|
If you have a pflag.FlagSet with a flag called 'flagname' of type int you
|
||||||
can use GetInt() to get the int value. But notice that 'flagname' must exist
|
can use GetInt() to get the int value. But notice that 'flagname' must exist
|
||||||
and it must be an int. GetString("flagname") will fail.
|
and it must be an int. GetString("flagname") will fail.
|
||||||
|
|||||||
38
vendor/github.com/spf13/pflag/bool_slice.go
generated
vendored
38
vendor/github.com/spf13/pflag/bool_slice.go
generated
vendored
@@ -71,6 +71,44 @@ func (s *boolSliceValue) String() string {
|
|||||||
return "[" + out + "]"
|
return "[" + out + "]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *boolSliceValue) fromString(val string) (bool, error) {
|
||||||
|
return strconv.ParseBool(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *boolSliceValue) toString(val bool) string {
|
||||||
|
return strconv.FormatBool(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *boolSliceValue) Append(val string) error {
|
||||||
|
i, err := s.fromString(val)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*s.value = append(*s.value, i)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *boolSliceValue) Replace(val []string) error {
|
||||||
|
out := make([]bool, len(val))
|
||||||
|
for i, d := range val {
|
||||||
|
var err error
|
||||||
|
out[i], err = s.fromString(d)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*s.value = out
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *boolSliceValue) GetSlice() []string {
|
||||||
|
out := make([]string, len(*s.value))
|
||||||
|
for i, d := range *s.value {
|
||||||
|
out[i] = s.toString(d)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
func boolSliceConv(val string) (interface{}, error) {
|
func boolSliceConv(val string) (interface{}, error) {
|
||||||
val = strings.Trim(val, "[]")
|
val = strings.Trim(val, "[]")
|
||||||
// Empty string would cause a slice with one (empty) entry
|
// Empty string would cause a slice with one (empty) entry
|
||||||
|
|||||||
4
vendor/github.com/spf13/pflag/count.go
generated
vendored
4
vendor/github.com/spf13/pflag/count.go
generated
vendored
@@ -46,7 +46,7 @@ func (f *FlagSet) GetCount(name string) (int, error) {
|
|||||||
|
|
||||||
// CountVar defines a count flag with specified name, default value, and usage string.
|
// CountVar defines a count flag with specified name, default value, and usage string.
|
||||||
// The argument p points to an int variable in which to store the value of the flag.
|
// The argument p points to an int variable in which to store the value of the flag.
|
||||||
// A count flag will add 1 to its value evey time it is found on the command line
|
// A count flag will add 1 to its value every time it is found on the command line
|
||||||
func (f *FlagSet) CountVar(p *int, name string, usage string) {
|
func (f *FlagSet) CountVar(p *int, name string, usage string) {
|
||||||
f.CountVarP(p, name, "", usage)
|
f.CountVarP(p, name, "", usage)
|
||||||
}
|
}
|
||||||
@@ -69,7 +69,7 @@ func CountVarP(p *int, name, shorthand string, usage string) {
|
|||||||
|
|
||||||
// Count defines a count flag with specified name, default value, and usage string.
|
// Count defines a count flag with specified name, default value, and usage string.
|
||||||
// The return value is the address of an int variable that stores the value of the flag.
|
// The return value is the address of an int variable that stores the value of the flag.
|
||||||
// A count flag will add 1 to its value evey time it is found on the command line
|
// A count flag will add 1 to its value every time it is found on the command line
|
||||||
func (f *FlagSet) Count(name string, usage string) *int {
|
func (f *FlagSet) Count(name string, usage string) *int {
|
||||||
p := new(int)
|
p := new(int)
|
||||||
f.CountVarP(p, name, "", usage)
|
f.CountVarP(p, name, "", usage)
|
||||||
|
|||||||
38
vendor/github.com/spf13/pflag/duration_slice.go
generated
vendored
38
vendor/github.com/spf13/pflag/duration_slice.go
generated
vendored
@@ -51,6 +51,44 @@ func (s *durationSliceValue) String() string {
|
|||||||
return "[" + strings.Join(out, ",") + "]"
|
return "[" + strings.Join(out, ",") + "]"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *durationSliceValue) fromString(val string) (time.Duration, error) {
|
||||||
|
return time.ParseDuration(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *durationSliceValue) toString(val time.Duration) string {
|
||||||
|
return fmt.Sprintf("%s", val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *durationSliceValue) Append(val string) error {
|
||||||
|
i, err := s.fromString(val)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*s.value = append(*s.value, i)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *durationSliceValue) Replace(val []string) error {
|
||||||
|
out := make([]time.Duration, len(val))
|
||||||
|
for i, d := range val {
|
||||||
|
var err error
|
||||||
|
out[i], err = s.fromString(d)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*s.value = out
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *durationSliceValue) GetSlice() []string {
|
||||||
|
out := make([]string, len(*s.value))
|
||||||
|
for i, d := range *s.value {
|
||||||
|
out[i] = s.toString(d)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
func durationSliceConv(val string) (interface{}, error) {
|
func durationSliceConv(val string) (interface{}, error) {
|
||||||
val = strings.Trim(val, "[]")
|
val = strings.Trim(val, "[]")
|
||||||
// Empty string would cause a slice with one (empty) entry
|
// Empty string would cause a slice with one (empty) entry
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user