mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-12-23 00:46:30 +00:00
Update deps (#789)
* update github.com/docker/cli * update github.com/docker/distribution * update github.com/docker/docker * update github.com/gin-gonic/gin * update github.com/golang-jwt/jwt/v4 * update github.com/golangci/golangci-lint * update github.com/gorilla/securecookie * update github.com/mattn/go-sqlite3 * update github.com/moby/moby * update github.com/prometheus/client_golang * update github.com/xanzy/go-gitlab
This commit is contained in:
parent
505cf8c09a
commit
56a854fe14
624 changed files with 32400 additions and 14470 deletions
32
go.mod
32
go.mod
|
@ -7,35 +7,33 @@ require (
|
|||
github.com/Microsoft/go-winio v0.5.1 // indirect
|
||||
github.com/bmatcuk/doublestar/v4 v4.0.2
|
||||
github.com/containerd/containerd v1.5.9 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
|
||||
github.com/docker/cli v20.10.10+incompatible
|
||||
github.com/docker/distribution v2.7.1+incompatible
|
||||
github.com/docker/docker v20.10.10+incompatible
|
||||
github.com/docker/cli v20.10.12+incompatible
|
||||
github.com/docker/distribution v2.8.0+incompatible
|
||||
github.com/docker/docker v20.10.12+incompatible
|
||||
github.com/docker/docker-credential-helpers v0.6.4 // indirect
|
||||
github.com/docker/go-connections v0.4.0 // indirect
|
||||
github.com/docker/go-units v0.4.0
|
||||
github.com/drone/envsubst v1.0.3
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568
|
||||
github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf
|
||||
github.com/gin-gonic/gin v1.7.4
|
||||
github.com/go-playground/validator/v10 v10.9.0 // indirect
|
||||
github.com/gin-gonic/gin v1.7.7
|
||||
github.com/go-playground/validator/v10 v10.10.0 // indirect
|
||||
github.com/go-sql-driver/mysql v1.6.0
|
||||
github.com/gogits/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
|
||||
github.com/golang-jwt/jwt/v4 v4.1.0
|
||||
github.com/golangci/golangci-lint v1.43.0
|
||||
github.com/golang-jwt/jwt/v4 v4.3.0
|
||||
github.com/golangci/golangci-lint v1.44.2
|
||||
github.com/google/go-github/v39 v39.2.0
|
||||
github.com/gorilla/securecookie v1.1.1
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||
github.com/hashicorp/go-retryablehttp v0.7.0 // indirect
|
||||
github.com/joho/godotenv v1.4.0
|
||||
github.com/lib/pq v1.10.4
|
||||
github.com/mattn/go-sqlite3 v1.14.9
|
||||
github.com/moby/moby v20.10.10+incompatible
|
||||
github.com/mattn/go-sqlite3 v1.14.11
|
||||
github.com/moby/moby v20.10.12+incompatible
|
||||
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6
|
||||
github.com/morikuni/aec v1.0.0 // indirect
|
||||
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/prometheus/client_golang v1.12.0
|
||||
github.com/prometheus/client_golang v1.12.1
|
||||
github.com/rs/zerolog v1.26.1
|
||||
github.com/stretchr/objx v0.3.0 // indirect
|
||||
github.com/stretchr/testify v1.7.0
|
||||
|
@ -43,15 +41,15 @@ require (
|
|||
github.com/ugorji/go v1.2.6 // indirect
|
||||
github.com/urfave/cli/v2 v2.3.0
|
||||
github.com/woodpecker-ci/expr v0.0.0-20210628233344-164b8b3d0915
|
||||
github.com/xanzy/go-gitlab v0.52.2
|
||||
github.com/xanzy/go-gitlab v0.55.1
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||
github.com/xeipuuv/gojsonschema v1.2.0
|
||||
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
|
||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect
|
||||
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 // indirect
|
||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
|
||||
google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350 // indirect
|
||||
google.golang.org/grpc v1.44.0
|
||||
google.golang.org/protobuf v1.27.1
|
||||
|
|
348
go.sum
348
go.sum
|
@ -28,6 +28,10 @@ cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSU
|
|||
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 v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
|
||||
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
|
||||
cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM=
|
||||
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
|
||||
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.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||
|
@ -36,8 +40,8 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g
|
|||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||
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/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/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
|
||||
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.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||
|
@ -75,9 +79,10 @@ github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935
|
|||
github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
|
||||
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
|
||||
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
|
||||
github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM=
|
||||
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
|
@ -110,14 +115,13 @@ github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5
|
|||
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
|
||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us=
|
||||
github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
|
||||
github.com/OpenPeeDeeP/depguard v1.1.0 h1:pjK9nLPS1FwQYGGpPxoMYpe7qACHOhAWQMQzV71i49o=
|
||||
github.com/OpenPeeDeeP/depguard v1.1.0/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc=
|
||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
|
||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
|
@ -138,14 +142,15 @@ github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb
|
|||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
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.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
|
||||
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/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
|
||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
|
||||
github.com/ashanbrown/forbidigo v1.2.0 h1:RMlEFupPCxQ1IogYOQUnIQwGEUGK8g5vAPMRyJoSxbc=
|
||||
github.com/ashanbrown/forbidigo v1.2.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI=
|
||||
github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde h1:YOsoVXsZQPA9aOTy1g0lAJv5VzZUvwQuZqug8XPeqfM=
|
||||
github.com/ashanbrown/makezero v0.0.0-20210520155254-b6261585ddde/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU=
|
||||
github.com/ashanbrown/forbidigo v1.3.0 h1:VkYIwb/xxdireGAdJNZoo24O4lmnEWkactplBlWTShc=
|
||||
github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI=
|
||||
github.com/ashanbrown/makezero v1.1.0 h1:b2FVq4dTlBpy9f6qxhbyWH+6zy56IETE9cFbBGtDqs8=
|
||||
github.com/ashanbrown/makezero v1.1.0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU=
|
||||
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
|
||||
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
|
||||
github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
|
@ -161,20 +166,21 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
|
|||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
|
||||
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
|
||||
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
|
||||
github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A=
|
||||
github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI=
|
||||
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||
github.com/blizzy78/varnamelen v0.3.0 h1:80mYO7Y5ppeEefg1Jzu+NBg16iwToOQVnDnNIoWSShs=
|
||||
github.com/blizzy78/varnamelen v0.3.0/go.mod h1:hbwRdBvoBqxk34XyQ6HA0UH3G0/1TKuv5AC4eaBT0Ec=
|
||||
github.com/blizzy78/varnamelen v0.6.0 h1:TOIDk9qRIMspALZKX8x+5hQfAjuvAFogppnxtvuNmBo=
|
||||
github.com/blizzy78/varnamelen v0.6.0/go.mod h1:zy2Eic4qWqjrxa60jG34cfL0VXcSwzUrIx68eJPb4Q8=
|
||||
github.com/bmatcuk/doublestar/v4 v4.0.2 h1:X0krlUVAVmtr2cRoTqR8aDMrDqnB36ht8wpWTiQ3jsA=
|
||||
github.com/bmatcuk/doublestar/v4 v4.0.2/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
|
||||
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||
github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM=
|
||||
github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
|
||||
github.com/breml/bidichk v0.1.1 h1:Qpy8Rmgos9qdJxhka0K7ADEE5bQZX9PQUthkgggHpFM=
|
||||
github.com/breml/bidichk v0.1.1/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso=
|
||||
github.com/breml/bidichk v0.2.2 h1:w7QXnpH0eCBJm55zGCTJveZEkQBt6Fs5zThIdA6qQ9Y=
|
||||
github.com/breml/bidichk v0.2.2/go.mod h1:zbfeitpevDUGI7V91Uzzuwrn4Vls8MoBMrwtt78jmso=
|
||||
github.com/breml/errchkjson v0.2.3 h1:97eGTmR/w0paL2SwfRPI1jaAZHaH/fXnxWTw2eEIqE0=
|
||||
github.com/breml/errchkjson v0.2.3/go.mod h1:jZEATw/jF69cL1iy7//Yih8yp/mXp2CBoBr9GJwCAsY=
|
||||
github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
|
||||
github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
|
||||
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
||||
|
@ -186,6 +192,7 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n
|
|||
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
|
||||
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
|
@ -205,6 +212,8 @@ github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLI
|
|||
github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
|
||||
github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
|
||||
github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
|
||||
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
||||
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
||||
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
|
@ -214,7 +223,9 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP
|
|||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
|
@ -335,8 +346,8 @@ github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1S
|
|||
github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
|
||||
github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8=
|
||||
github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I=
|
||||
github.com/daixiang0/gci v0.2.9 h1:iwJvwQpBZmMg31w+QQ6jsyZ54KEATn6/nfARbBNW294=
|
||||
github.com/daixiang0/gci v0.2.9/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc=
|
||||
github.com/daixiang0/gci v0.3.1-0.20220208004058-76d765e3ab48 h1:9rJGqaC5do9zkvKrtRdx0HJoxj7Jd6vDa0O2eBU0AbU=
|
||||
github.com/daixiang0/gci v0.3.1-0.20220208004058-76d765e3ab48/go.mod h1:jaASoJmv/ykO9dAAPy31iJnreV19248qKDdVWf3QgC4=
|
||||
github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg=
|
||||
github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
@ -350,14 +361,15 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11
|
|||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||
github.com/docker/cli v20.10.10+incompatible h1:kcbwdgWbrBOH8QwQzaJmyriHwF7XIl4HT1qh0HTRys4=
|
||||
github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/cli v20.10.12+incompatible h1:lZlz0uzG+GH+c0plStMUdF/qk3ppmgnswpR5EbqzVGA=
|
||||
github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
|
||||
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
|
||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v20.10.10+incompatible h1:GKkP0T7U4ks6X3lmmHKC2QDprnpRJor2Z5a8m62R9ZM=
|
||||
github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY=
|
||||
github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U=
|
||||
github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o=
|
||||
github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c=
|
||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
||||
|
@ -391,10 +403,12 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
|
|||
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/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||
github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/esimonov/ifshort v1.0.3 h1:JD6x035opqGec5fZ0TLjXeROD2p5H7oLGn8MKfy9HTM=
|
||||
github.com/esimonov/ifshort v1.0.3/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
|
||||
github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA=
|
||||
github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0=
|
||||
github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw=
|
||||
github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY=
|
||||
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||
|
@ -413,23 +427,25 @@ github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf h1:NrF81UtW8gG2LBGk
|
|||
github.com/franela/goblin v0.0.0-20211003143422-0a4f594942bf/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo=
|
||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
|
||||
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
|
||||
github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss=
|
||||
github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
|
||||
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
|
||||
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
|
||||
github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM=
|
||||
github.com/fzipp/gocyclo v0.3.1 h1:A9UeX3HJSXTBzvHzhqoYVuE0eAhe+aM8XBCCwsPMZOc=
|
||||
github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E=
|
||||
github.com/fzipp/gocyclo v0.4.0 h1:IykTnjwh2YLyYkGa0y92iTTEQcnyAz0r9zOo15EbJ7k=
|
||||
github.com/fzipp/gocyclo v0.4.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
|
||||
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-gonic/gin v1.7.4 h1:QmUZXrvJ9qZ3GfWvQ+2wnW/1ePrTEJqPKMYEU3lD/DM=
|
||||
github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
|
||||
github.com/go-critic/go-critic v0.6.1 h1:lS8B9LH/VVsvQQP7Ao5TJyQqteVKVs3E4dXiHMyubtI=
|
||||
github.com/go-critic/go-critic v0.6.1/go.mod h1:SdNCfU0yF3UBjtaZGw6586/WocupMOJuiqgom5DsQxM=
|
||||
github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs=
|
||||
github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
|
||||
github.com/go-critic/go-critic v0.6.2 h1:L5SDut1N4ZfsWZY0sH4DCrsHLHnhuuWak2wa165t9gs=
|
||||
github.com/go-critic/go-critic v0.6.2/go.mod h1:td1s27kfmLpe5G/DPjlnFI7o1UCzePptwU7Az0V5iCM=
|
||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
|
@ -443,7 +459,6 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
|
|||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
|
||||
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
|
||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
|
||||
|
@ -461,8 +476,8 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+
|
|||
github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho=
|
||||
github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
|
||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
||||
github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A=
|
||||
github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
||||
github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0=
|
||||
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
||||
github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
|
@ -479,14 +494,12 @@ github.com/go-toolsmith/astequal v1.0.1 h1:JbSszi42Jiqu36Gnf363HWS9MTEAz67vTQLpo
|
|||
github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw=
|
||||
github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
|
||||
github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
|
||||
github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
|
||||
github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
|
||||
github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
|
||||
github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg=
|
||||
github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
|
||||
github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o=
|
||||
github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM=
|
||||
github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
|
||||
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
|
||||
github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
|
||||
github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk=
|
||||
github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
|
||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
|
||||
|
@ -517,8 +530,8 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
|
|||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0=
|
||||
github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
|
||||
github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
|
@ -526,6 +539,7 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er
|
|||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
|
@ -565,8 +579,8 @@ github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZB
|
|||
github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
|
||||
github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks=
|
||||
github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
|
||||
github.com/golangci/golangci-lint v1.43.0 h1:SLwZFEmDgopqZpfP495zCtV9REUf551JJlJ51Ql7NZA=
|
||||
github.com/golangci/golangci-lint v1.43.0/go.mod h1:VIFlUqidx5ggxDfQagdvd9E67UjMXtTHBkBQ7sHoC5Q=
|
||||
github.com/golangci/golangci-lint v1.44.2 h1:MzvkDt1j1OHkv42/feNJVNNXRFACPp7aAWBWDo5aYQw=
|
||||
github.com/golangci/golangci-lint v1.44.2/go.mod h1:KjBgkLvsTWDkhfu12iCrv0gwL1kON5KNhbyjQ6qN7Jo=
|
||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA=
|
||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
|
||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
|
||||
|
@ -592,11 +606,11 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
|
||||
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||
github.com/google/go-github/v39 v39.2.0 h1:rNNM311XtPOz5rDdsJXAp2o8F67X9FnROXTvto3aSnQ=
|
||||
github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE=
|
||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
|
||||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
||||
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
|
@ -617,6 +631,7 @@ 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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
|
@ -631,12 +646,13 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
|
|||
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.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
||||
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
|
||||
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
|
||||
github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ=
|
||||
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
|
||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||
github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
|
||||
github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 h1:Nb2aRlC404yz7gQIfRZxX9/MLvQiqXyiBTJtgAy6yrI=
|
||||
github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw=
|
||||
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 h1:PVRE9d4AQKmbelZ7emNig1+NT27DUmKZn5qXxfio54U=
|
||||
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0=
|
||||
github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA=
|
||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
||||
|
@ -661,8 +677,8 @@ github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnq
|
|||
github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado=
|
||||
github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q=
|
||||
github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM=
|
||||
github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5 h1:rx8127mFPqXXsfPSo8BwnIU97MKFZc89WHAHt8PwDVY=
|
||||
github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak=
|
||||
github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70=
|
||||
github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak=
|
||||
github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk=
|
||||
github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A=
|
||||
github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M=
|
||||
|
@ -678,28 +694,32 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
|
|||
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
||||
github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
|
||||
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/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
|
||||
github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=
|
||||
github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
||||
github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
|
||||
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
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/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
|
||||
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
|
||||
github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM=
|
||||
github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
|
||||
github.com/hashicorp/go-hclog v1.0.0 h1:bkKf0BeBXcSYa7f5Fyi9gMuQ8gNsxeiNpZjR6VxNZeo=
|
||||
github.com/hashicorp/go-hclog v1.0.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.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
||||
github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
|
||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||
github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
|
||||
github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4=
|
||||
github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
|
||||
|
@ -721,14 +741,20 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
|
|||
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.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
|
||||
github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
|
||||
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/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
|
||||
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/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
|
||||
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
|
||||
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
|
||||
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.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4=
|
||||
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
|
||||
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
|
@ -821,8 +847,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV
|
|||
github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
|
||||
github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d h1:XeSMXURZPtUffuWAaq90o6kLgZdgu+QA8wk4MPC8ikI=
|
||||
github.com/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
|
||||
github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY=
|
||||
github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0=
|
||||
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
|
@ -853,8 +879,8 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
|||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/kulti/thelper v0.4.0 h1:2Nx7XbdbE/BYZeoip2mURKUdtHQRuy6Ug+wR7K9ywNM=
|
||||
github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U=
|
||||
github.com/kulti/thelper v0.5.1 h1:Uf4CUekH0OvzQTFPrWkstJvXgm6pnNEtQu3HiqEkpB0=
|
||||
github.com/kulti/thelper v0.5.1/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U=
|
||||
github.com/kunwardeep/paralleltest v1.0.3 h1:UdKIkImEAXjR1chUWLn+PNXqWUGs//7tzMeWuP7NhmI=
|
||||
github.com/kunwardeep/paralleltest v1.0.3/go.mod h1:vLydzomDFpk7yu5UX02RmP0H8QfRPOV/oFhWN85Mjb4=
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
|
@ -862,11 +888,13 @@ github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77
|
|||
github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg=
|
||||
github.com/ldez/gomoddirectives v0.2.2 h1:p9/sXuNFArS2RLc+UpYZSI4KQwGMEDWC/LbtF5OPFVg=
|
||||
github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0=
|
||||
github.com/ldez/tagliatelle v0.2.0 h1:693V8Bf1NdShJ8eu/s84QySA0J2VWBanVBa2WwXD/Wk=
|
||||
github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88=
|
||||
github.com/ldez/tagliatelle v0.3.1 h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM=
|
||||
github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88=
|
||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
||||
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
||||
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
||||
github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg=
|
||||
github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY=
|
||||
github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag=
|
||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
|
@ -875,13 +903,13 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
|||
github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk=
|
||||
github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
|
||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
|
||||
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
||||
github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
|
||||
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
|
||||
|
@ -903,8 +931,8 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc
|
|||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs=
|
||||
github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
|
||||
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
|
||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||
|
@ -925,9 +953,8 @@ github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq
|
|||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mattn/go-sqlite3 v1.14.9 h1:10HX2Td0ocZpYEjhilsuo6WWtUqttj2Kb0KtD86/KYA=
|
||||
github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
|
||||
github.com/mattn/go-sqlite3 v1.14.11 h1:gt+cp9c0XGqe9S/wAHTL3n/7MqY+siPWgWJgqdsFrzQ=
|
||||
github.com/mattn/go-sqlite3 v1.14.11/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.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||
|
@ -935,11 +962,12 @@ github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwg
|
|||
github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc=
|
||||
github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0=
|
||||
github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
|
||||
github.com/mgechev/revive v1.1.2 h1:MiYA/o9M7REjvOF20QN43U8OtXDDHQFKLCtJnxLGLog=
|
||||
github.com/mgechev/revive v1.1.2/go.mod h1:bnXsMr+ZTH09V5rssEI+jHAZ4z+ZdyhgO/zsy3EhK+0=
|
||||
github.com/mgechev/revive v1.1.4 h1:sZOjY6GU35Kr9jKa/wsKSHgrFz8eASIB5i3tqWZMp0A=
|
||||
github.com/mgechev/revive v1.1.4/go.mod h1:ZZq2bmyssGh8MSPz3VVziqRNIMYTJXzP8MUKG90vZ9A=
|
||||
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/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
|
||||
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
|
||||
github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
||||
|
@ -955,15 +983,15 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4
|
|||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
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/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
|
||||
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
|
||||
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
|
||||
github.com/moby/moby v20.10.10+incompatible h1:KriJ8Zcm+NrFlaI0HNi2GtbfsT6J33o+XHmpAWZ6E7M=
|
||||
github.com/moby/moby v20.10.10+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
|
||||
github.com/moby/moby v20.10.12+incompatible h1:MJVrdG0tIQqVJQBTdtooPuZQFIgski5pYTXlcW8ToE0=
|
||||
github.com/moby/moby v20.10.12+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
|
||||
github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
|
||||
github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
|
||||
github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
|
||||
|
@ -1007,8 +1035,8 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6Fx
|
|||
github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8=
|
||||
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/nishanths/exhaustive v0.2.3 h1:+ANTMqRNrqwInnP9aszg/0jDo+zbXa4x66U19Bx/oTk=
|
||||
github.com/nishanths/exhaustive v0.2.3/go.mod h1:bhIX678Nx8inLM9PbpvK1yv6oGtoP8BfaIeMzgBNKvc=
|
||||
github.com/nishanths/exhaustive v0.7.11 h1:xV/WU3Vdwh5BUH4N06JNUznb6d5zhRPOnlgCrpNYNKA=
|
||||
github.com/nishanths/exhaustive v0.7.11/go.mod h1:gX+MP7DWMKJmNa1HfMozK+u04hQd3na9i0hyqf3/dOI=
|
||||
github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ=
|
||||
github.com/nishanths/predeclared v0.2.1 h1:1TXtjmy4f3YCFjTxRd8zcFHOmoUir+gp0ESzjFzG2sw=
|
||||
github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE=
|
||||
|
@ -1033,6 +1061,8 @@ github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
|
|||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
|
||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||
github.com/onsi/ginkgo/v2 v2.0.0 h1:CcuG/HvWNkkaqCUpJifQY8z7qEMBJya6aLPx6ftGyjQ=
|
||||
github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
|
@ -1040,8 +1070,8 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
|
|||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||
github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c=
|
||||
github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE=
|
||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
|
@ -1085,10 +1115,10 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9
|
|||
github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
|
||||
github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
|
||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
|
||||
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||
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/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
|
||||
|
@ -1108,10 +1138,11 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ
|
|||
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
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/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349 h1:Kq/3kL0k033ds3tyez5lFPrfQ74fNJ+OqCclRipubwA=
|
||||
github.com/polyfloyd/go-errorlint v0.0.0-20210722154253-910bb7978349/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
|
||||
github.com/polyfloyd/go-errorlint v0.0.0-20211125173453-6d6d39c5bb8b h1:/BDyEJWLnDUYKGWdlNx/82qSaVu2bUok/EvPUtIGuvw=
|
||||
github.com/polyfloyd/go-errorlint v0.0.0-20211125173453-6d6d39c5bb8b/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw=
|
||||
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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
|
@ -1120,10 +1151,11 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
|
|||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
||||
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
|
||||
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
|
||||
github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg=
|
||||
github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||
github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
|
||||
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
|
||||
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
|
@ -1139,6 +1171,7 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
|
|||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
|
||||
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
|
||||
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
|
||||
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
|
||||
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
|
||||
|
@ -1160,14 +1193,17 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
|
|||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA=
|
||||
github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q=
|
||||
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
|
||||
github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30=
|
||||
github.com/quasilyte/go-ruleguard v0.3.13 h1:O1G41cq1jUr3cJmqp7vOUT0SokqjzmS9aESWJuIDRaY=
|
||||
github.com/quasilyte/go-ruleguard v0.3.13/go.mod h1:Ul8wwdqR6kBVOCt2dipDBkE+T6vAV/iixkrKuRTN1oQ=
|
||||
github.com/quasilyte/go-ruleguard v0.3.15 h1:iWYzp1z72IlXTioET0+XI6SjQdPfMGfuAiZiKznOt7g=
|
||||
github.com/quasilyte/go-ruleguard v0.3.15/go.mod h1:NhuWhnlVEM1gT1A4VJHYfy9MuYSxxwHgxWoPsn9llB4=
|
||||
github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
||||
github.com/quasilyte/go-ruleguard/dsl v0.3.10/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
||||
github.com/quasilyte/go-ruleguard/dsl v0.3.12-0.20220101150716-969a394a9451/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
||||
github.com/quasilyte/go-ruleguard/dsl v0.3.12/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
||||
github.com/quasilyte/go-ruleguard/dsl v0.3.17/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU=
|
||||
github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc=
|
||||
github.com/quasilyte/go-ruleguard/rules v0.0.0-20210428214800-545e0d2e0bf7/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50=
|
||||
github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50=
|
||||
github.com/quasilyte/gogrep v0.0.0-20220103110004-ffaa07af02e3 h1:P4QPNn+TK49zJjXKERt/vyPbv/mCHB/zQ4flDYOMN+M=
|
||||
github.com/quasilyte/gogrep v0.0.0-20220103110004-ffaa07af02e3/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM=
|
||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY=
|
||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
|
@ -1177,9 +1213,9 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
|
|||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
|
||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||
github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
|
||||
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
|
||||
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
|
||||
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||
|
@ -1199,18 +1235,20 @@ github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0K
|
|||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
||||
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
|
||||
github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE=
|
||||
github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
|
||||
github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM=
|
||||
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
|
||||
github.com/sanposhiho/wastedassign/v2 v2.0.6 h1:+6/hQIHKNJAUixEj6EmOngGIisyeI+T3335lYTyxRoA=
|
||||
github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI=
|
||||
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/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
|
||||
github.com/securego/gosec/v2 v2.9.1 h1:anHKLS/ApTYU6NZkKa/5cQqqcbKZURjvc+MtR++S4EQ=
|
||||
github.com/securego/gosec/v2 v2.9.1/go.mod h1:oDcDLcatOJxkCGaCaq8lua1jTnYf6Sou4wdiJ1n4iHc=
|
||||
github.com/securego/gosec/v2 v2.9.6 h1:ysfvgQBp2zmTgXQl65UkqEkYlQGbnVSRUGpCrJiiR4c=
|
||||
github.com/securego/gosec/v2 v2.9.6/go.mod h1:EESY9Ywxo/Zc5NyF/qIj6Cop+4PSWM0F0OfGD7FdIXc=
|
||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=
|
||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
|
||||
github.com/shirou/gopsutil/v3 v3.21.10/go.mod h1:t75NhzCZ/dYyPQjyQmrAYP6c8+LCdFANeBMdLPCNnew=
|
||||
github.com/shirou/gopsutil/v3 v3.22.1/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY=
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||
github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
|
@ -1226,6 +1264,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf
|
|||
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/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/sivchari/containedctx v1.0.1 h1:fJq44cX+tD+uT5xGrsg25GwiaY61NGybQk9WWKij3Uo=
|
||||
github.com/sivchari/containedctx v1.0.1/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw=
|
||||
github.com/sivchari/tenv v1.4.7 h1:FdTpgRlTue5eb5nXIYgS/lyVXSjugU8UUVDwhP1NLU8=
|
||||
github.com/sivchari/tenv v1.4.7/go.mod h1:5nF+bITvkebQVanjU6IuMbvIot/7ReNsUV7I5NbprB0=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
|
@ -1240,18 +1280,18 @@ github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag07
|
|||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
|
||||
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
|
||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cast v1.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.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||
github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw=
|
||||
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
|
||||
github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0=
|
||||
github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
|
||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
|
||||
|
@ -1263,9 +1303,10 @@ 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.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
|
||||
github.com/spf13/viper v1.9.0 h1:yR6EXjTp0y0cLN8OZg1CRZmOBdI88UcGkhgyJhu6nZk=
|
||||
github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4=
|
||||
github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
|
||||
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
|
||||
github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU=
|
||||
github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0=
|
||||
github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
|
||||
github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8=
|
||||
|
@ -1298,8 +1339,8 @@ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG
|
|||
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
|
||||
github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b h1:HxLVTlqcHhFAz3nWUcuvpH7WuOMv8LQoCWmruLfFH2U=
|
||||
github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
|
||||
github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A=
|
||||
github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
|
||||
github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA=
|
||||
github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0=
|
||||
github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag=
|
||||
|
@ -1308,8 +1349,8 @@ github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw=
|
|||
github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8=
|
||||
github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA=
|
||||
github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg=
|
||||
github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 h1:ig99OeTyDwQWhPe2iw9lwfQVF1KB3Q4fpP3X7/2VBG8=
|
||||
github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
|
||||
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro=
|
||||
github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
|
||||
github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=
|
||||
github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
|
@ -1318,8 +1359,9 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1
|
|||
github.com/tomarrell/wrapcheck/v2 v2.4.0 h1:mU4H9KsqqPZUALOUbVOpjy8qNQbWLoLI9fV68/1tq30=
|
||||
github.com/tomarrell/wrapcheck/v2 v2.4.0/go.mod h1:68bQ/eJg55BROaRTbMjC7vuhL2OgfoG8bLp9ZyoBfyY=
|
||||
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4=
|
||||
github.com/tommy-muehle/go-mnd/v2 v2.4.0 h1:1t0f8Uiaq+fqKteUR4N9Umr6E99R+lDnLnq7PwX2PPE=
|
||||
github.com/tommy-muehle/go-mnd/v2 v2.4.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
|
||||
github.com/tommy-muehle/go-mnd/v2 v2.5.0 h1:iAj0a8e6+dXSL7Liq0aXPox36FiN1dBbjA6lt9fl65s=
|
||||
github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw=
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E=
|
||||
|
@ -1330,8 +1372,8 @@ github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ
|
|||
github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
|
||||
github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA=
|
||||
github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
|
||||
github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg=
|
||||
github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
|
||||
github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI=
|
||||
github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
|
||||
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
|
@ -1356,8 +1398,8 @@ github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT
|
|||
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
|
||||
github.com/woodpecker-ci/expr v0.0.0-20210628233344-164b8b3d0915 h1:9zBOoKSR9CBeYoKQv6LFIuImg8lorCjh8XzK72bJMRg=
|
||||
github.com/woodpecker-ci/expr v0.0.0-20210628233344-164b8b3d0915/go.mod h1:PbzlZ93HrA1cf16OUP1vckAPq57gtF+ccnwZeDkmC9s=
|
||||
github.com/xanzy/go-gitlab v0.52.2 h1:gkgg1z4ON70sphibtD86Bfmt1qV3mZ0pU0CBBCFAEvQ=
|
||||
github.com/xanzy/go-gitlab v0.52.2/go.mod h1:Q+hQhV508bDPoBijv7YjK/Lvlb4PhVhJdKqXVQrUoAE=
|
||||
github.com/xanzy/go-gitlab v0.55.1 h1:IgX/DS9buV0AUz8fuJPQkdl0fQGfBiAsAHxpun8sNhg=
|
||||
github.com/xanzy/go-gitlab v0.55.1/go.mod h1:F0QEXwmqiBUxCgJm8fE9S+1veX4XC9Z4cfaAbqwk4YM=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
|
||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||
|
@ -1369,8 +1411,10 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ
|
|||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
github.com/yeya24/promlinter v0.1.0 h1:goWULN0jH5Yajmu/K+v1xCqIREeB+48OiJ2uu2ssc7U=
|
||||
github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc=
|
||||
github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM=
|
||||
github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk=
|
||||
github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1 h1:YAaOqqMTstELMMGblt6yJ/fcOt4owSYuw3IttMnKfAM=
|
||||
github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc=
|
||||
github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
|
||||
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
|
||||
github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=
|
||||
|
@ -1380,11 +1424,15 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
|
|||
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/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
|
||||
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
|
||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
|
||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
||||
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
|
||||
gitlab.com/bosi/decorder v0.2.1 h1:ehqZe8hI4w7O4b1vgsDZw1YU1PE7iJXrQWFMsocbQ1w=
|
||||
gitlab.com/bosi/decorder v0.2.1/go.mod h1:6C/nhLSbF6qZbYD8bRmISBwc6vcWdNsiIBkRvjJFrH0=
|
||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||
|
@ -1393,8 +1441,11 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI
|
|||
go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k=
|
||||
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
|
||||
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
|
||||
go.etcd.io/etcd/api/v3 v3.5.1/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/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
|
||||
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
|
||||
go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs=
|
||||
go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o=
|
||||
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
|
||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
|
||||
|
@ -1450,10 +1501,10 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5
|
|||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
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/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
|
||||
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed h1:YoWVYYAfvQ4ddHv3OKmIvX7NCAhFGTj62VP2l2kfBbA=
|
||||
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
|
||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
|
@ -1490,8 +1541,9 @@ 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.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q=
|
||||
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
|
||||
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
@ -1545,11 +1597,14 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
|
|||
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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
|
||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
|
@ -1565,13 +1620,14 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ
|
|||
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/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-20210402161424-2e8d93401602/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/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
|
||||
golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
|
||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
||||
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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -1664,11 +1720,13 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/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-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -1687,15 +1745,23 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211213223007-03aa0b5f6827/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
|
||||
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 h1:BXxu8t6QN0G1uff4bzZzSkpsax8+ALqTGUtz08QrV00=
|
||||
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
|
@ -1715,14 +1781,13 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
|
|||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M=
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
|
||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4=
|
||||
|
@ -1753,7 +1818,6 @@ golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtn
|
|||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
|
@ -1806,14 +1870,11 @@ golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4f
|
|||
golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
|
||||
|
@ -1824,9 +1885,11 @@ 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/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
|
||||
golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
|
||||
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
|
||||
golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||
golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||
golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8=
|
||||
golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
@ -1858,13 +1921,18 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q
|
|||
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
|
||||
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.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
|
||||
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.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
||||
google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
|
||||
google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
|
||||
google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU=
|
||||
google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
|
||||
google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw=
|
||||
google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
|
@ -1939,6 +2007,17 @@ google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKr
|
|||
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/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||
google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||
google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
|
||||
google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350 h1:YxHp5zqIcAShDEvRr5/0rVESVS+njYF68PSdazrNLJo=
|
||||
google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||
|
@ -1975,6 +2054,9 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ
|
|||
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 v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc v1.44.0 h1:weqSxi/TMs1SqFRMHCtBgXRs8k3X39QIDEZ0pRcttUg=
|
||||
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||
|
@ -2009,9 +2091,9 @@ gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
|
|||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
||||
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/ini.v1 v1.62.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/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
|
||||
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
||||
gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
||||
|
@ -2047,8 +2129,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
|
|||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
honnef.co/go/tools v0.2.1 h1:/EPr//+UMMXwMTkXvCCoaJDq8cpjMO80Ou+L4PDo2mY=
|
||||
honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY=
|
||||
honnef.co/go/tools v0.2.2 h1:MNh1AVMyVX23VUHE2O27jm6lNj3vjO5DexS4A1xvnzk=
|
||||
honnef.co/go/tools v0.2.2/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY=
|
||||
k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
|
||||
k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
|
||||
k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
|
||||
|
@ -2101,14 +2183,14 @@ modernc.org/tcl v1.5.5/go.mod h1:ADkaTUuwukkrlhqwERyq0SM8OvyXo7+TjFz7yAF56EI=
|
|||
modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk=
|
||||
modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
|
||||
modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA=
|
||||
mvdan.cc/gofumpt v0.1.1 h1:bi/1aS/5W00E2ny5q65w9SnKpWEF/UIOqDYBILpo9rA=
|
||||
mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48=
|
||||
mvdan.cc/gofumpt v0.2.1 h1:7jakRGkQcLAJdT+C8Bwc9d0BANkVPSkHZkzNv07pJAs=
|
||||
mvdan.cc/gofumpt v0.2.1/go.mod h1:a/rvZPhsNaedOJBzqRD9omnwVwHZsBdJirXHa9Gh9Ig=
|
||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
|
||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
|
||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
|
||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
|
||||
mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7 h1:HT3e4Krq+IE44tiN36RvVEb6tvqeIdtsVSsxmNPqlFU=
|
||||
mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE=
|
||||
mvdan.cc/unparam v0.0.0-20211214103731-d0ef000c54e5 h1:Jh3LAeMt1eGpxomyu3jVkmVZWW2MxZ1qIIV2TZ/nRio=
|
||||
mvdan.cc/unparam v0.0.0-20211214103731-d0ef000c54e5/go.mod h1:b8RRCBm0eeiWR8cfN88xeq2G5SG3VKGO+5UPWi5FSOY=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||
|
|
41
vendor/github.com/BurntSushi/toml/README.md
generated
vendored
41
vendor/github.com/BurntSushi/toml/README.md
generated
vendored
|
@ -1,10 +1,6 @@
|
|||
## TOML parser and encoder for Go with reflection
|
||||
|
||||
TOML stands for Tom's Obvious, Minimal Language. This Go package provides a
|
||||
reflection interface similar to Go's standard library `json` and `xml`
|
||||
packages. This package also supports the `encoding.TextUnmarshaler` and
|
||||
`encoding.TextMarshaler` interfaces so that you can define custom data
|
||||
representations. (There is an example of this below.)
|
||||
packages.
|
||||
|
||||
Compatible with TOML version [v1.0.0](https://toml.io/en/v1.0.0).
|
||||
|
||||
|
@ -16,26 +12,25 @@ v0.4.0`).
|
|||
|
||||
This library requires Go 1.13 or newer; install it with:
|
||||
|
||||
$ go get github.com/BurntSushi/toml
|
||||
% go get github.com/BurntSushi/toml@latest
|
||||
|
||||
It also comes with a TOML validator CLI tool:
|
||||
|
||||
$ go get github.com/BurntSushi/toml/cmd/tomlv
|
||||
$ tomlv some-toml-file.toml
|
||||
% go install github.com/BurntSushi/toml/cmd/tomlv@latest
|
||||
% tomlv some-toml-file.toml
|
||||
|
||||
### Testing
|
||||
This package passes all tests in [toml-test] for both the decoder and the
|
||||
encoder.
|
||||
|
||||
This package passes all tests in
|
||||
[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder
|
||||
and the encoder.
|
||||
[toml-test]: https://github.com/BurntSushi/toml-test
|
||||
|
||||
### Examples
|
||||
This package works similar to how the Go standard library handles XML and JSON.
|
||||
Namely, data is loaded into Go values via reflection.
|
||||
|
||||
This package works similarly to how the Go standard library handles XML and
|
||||
JSON. Namely, data is loaded into Go values via reflection.
|
||||
|
||||
For the simplest example, consider some TOML file as just a list of keys
|
||||
and values:
|
||||
For the simplest example, consider some TOML file as just a list of keys and
|
||||
values:
|
||||
|
||||
```toml
|
||||
Age = 25
|
||||
|
@ -61,9 +56,8 @@ And then decoded with:
|
|||
|
||||
```go
|
||||
var conf Config
|
||||
if _, err := toml.Decode(tomlData, &conf); err != nil {
|
||||
// handle error
|
||||
}
|
||||
err := toml.Decode(tomlData, &conf)
|
||||
// handle error
|
||||
```
|
||||
|
||||
You can also use struct tags if your struct field name doesn't map to a TOML
|
||||
|
@ -75,15 +69,14 @@ some_key_NAME = "wat"
|
|||
|
||||
```go
|
||||
type TOML struct {
|
||||
ObscureKey string `toml:"some_key_NAME"`
|
||||
ObscureKey string `toml:"some_key_NAME"`
|
||||
}
|
||||
```
|
||||
|
||||
Beware that like other most other decoders **only exported fields** are
|
||||
considered when encoding and decoding; private fields are silently ignored.
|
||||
|
||||
### Using the `encoding.TextUnmarshaler` interface
|
||||
|
||||
### Using the `Marshaler` and `encoding.TextUnmarshaler` interfaces
|
||||
Here's an example that automatically parses duration strings into
|
||||
`time.Duration` values:
|
||||
|
||||
|
@ -136,7 +129,6 @@ To target TOML specifically you can implement `UnmarshalTOML` TOML interface in
|
|||
a similar way.
|
||||
|
||||
### More complex usage
|
||||
|
||||
Here's an example of how to load the example from the official spec page:
|
||||
|
||||
```toml
|
||||
|
@ -216,5 +208,4 @@ type clients struct {
|
|||
Note that a case insensitive match will be tried if an exact match can't be
|
||||
found.
|
||||
|
||||
A working example of the above can be found in `_examples/example.{go,toml}`.
|
||||
|
||||
A working example of the above can be found in `_example/example.{go,toml}`.
|
||||
|
|
133
vendor/github.com/BurntSushi/toml/decode.go
generated
vendored
133
vendor/github.com/BurntSushi/toml/decode.go
generated
vendored
|
@ -9,7 +9,6 @@ import (
|
|||
"os"
|
||||
"reflect"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Unmarshaler is the interface implemented by objects that can unmarshal a
|
||||
|
@ -40,6 +39,13 @@ type Primitive struct {
|
|||
context Key
|
||||
}
|
||||
|
||||
// The significand precision for float32 and float64 is 24 and 53 bits; this is
|
||||
// the range a natural number can be stored in a float without loss of data.
|
||||
const (
|
||||
maxSafeFloat32Int = 16777215 // 2^24-1
|
||||
maxSafeFloat64Int = 9007199254740991 // 2^53-1
|
||||
)
|
||||
|
||||
// PrimitiveDecode is just like the other `Decode*` functions, except it
|
||||
// decodes a TOML value that has already been parsed. Valid primitive values
|
||||
// can *only* be obtained from values filled by the decoder functions,
|
||||
|
@ -100,18 +106,38 @@ func NewDecoder(r io.Reader) *Decoder {
|
|||
return &Decoder{r: r}
|
||||
}
|
||||
|
||||
var (
|
||||
unmarshalToml = reflect.TypeOf((*Unmarshaler)(nil)).Elem()
|
||||
unmarshalText = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
|
||||
)
|
||||
|
||||
// Decode TOML data in to the pointer `v`.
|
||||
func (dec *Decoder) Decode(v interface{}) (MetaData, error) {
|
||||
rv := reflect.ValueOf(v)
|
||||
if rv.Kind() != reflect.Ptr {
|
||||
return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v))
|
||||
s := "%q"
|
||||
if reflect.TypeOf(v) == nil {
|
||||
s = "%v"
|
||||
}
|
||||
|
||||
return MetaData{}, e("cannot decode to non-pointer "+s, reflect.TypeOf(v))
|
||||
}
|
||||
if rv.IsNil() {
|
||||
return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v))
|
||||
return MetaData{}, e("cannot decode to nil value of %q", reflect.TypeOf(v))
|
||||
}
|
||||
|
||||
// TODO: have parser should read from io.Reader? Or at the very least, make
|
||||
// it read from []byte rather than string
|
||||
// Check if this is a supported type: struct, map, interface{}, or something
|
||||
// that implements UnmarshalTOML or UnmarshalText.
|
||||
rv = indirect(rv)
|
||||
rt := rv.Type()
|
||||
if rv.Kind() != reflect.Struct && rv.Kind() != reflect.Map &&
|
||||
!(rv.Kind() == reflect.Interface && rv.NumMethod() == 0) &&
|
||||
!rt.Implements(unmarshalToml) && !rt.Implements(unmarshalText) {
|
||||
return MetaData{}, e("cannot decode to type %s", rt)
|
||||
}
|
||||
|
||||
// TODO: parser should read from io.Reader? Or at the very least, make it
|
||||
// read from []byte rather than string
|
||||
data, err := ioutil.ReadAll(dec.r)
|
||||
if err != nil {
|
||||
return MetaData{}, err
|
||||
|
@ -121,11 +147,15 @@ func (dec *Decoder) Decode(v interface{}) (MetaData, error) {
|
|||
if err != nil {
|
||||
return MetaData{}, err
|
||||
}
|
||||
|
||||
md := MetaData{
|
||||
p.mapping, p.types, p.ordered,
|
||||
make(map[string]bool, len(p.ordered)), nil,
|
||||
mapping: p.mapping,
|
||||
types: p.types,
|
||||
keys: p.ordered,
|
||||
decoded: make(map[string]struct{}, len(p.ordered)),
|
||||
context: nil,
|
||||
}
|
||||
return md, md.unify(p.mapping, indirect(rv))
|
||||
return md, md.unify(p.mapping, rv)
|
||||
}
|
||||
|
||||
// Decode the TOML data in to the pointer v.
|
||||
|
@ -218,9 +248,7 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
|
|||
return e("unsupported type %s", rv.Type())
|
||||
}
|
||||
return md.unifyAnything(data, rv)
|
||||
case reflect.Float32:
|
||||
fallthrough
|
||||
case reflect.Float64:
|
||||
case reflect.Float32, reflect.Float64:
|
||||
return md.unifyFloat64(data, rv)
|
||||
}
|
||||
return e("unsupported type %s", rv.Kind())
|
||||
|
@ -254,17 +282,17 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
|
|||
for _, i := range f.index {
|
||||
subv = indirect(subv.Field(i))
|
||||
}
|
||||
|
||||
if isUnifiable(subv) {
|
||||
md.decoded[md.context.add(key).String()] = true
|
||||
md.decoded[md.context.add(key).String()] = struct{}{}
|
||||
md.context = append(md.context, key)
|
||||
if err := md.unify(datum, subv); err != nil {
|
||||
err := md.unify(datum, subv)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
md.context = md.context[0 : len(md.context)-1]
|
||||
} else if f.name != "" {
|
||||
// Bad user! No soup for you!
|
||||
return e("cannot write unexported field %s.%s",
|
||||
rv.Type().String(), f.name)
|
||||
return e("cannot write unexported field %s.%s", rv.Type().String(), f.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -283,22 +311,22 @@ func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error {
|
|||
if tmap == nil {
|
||||
return nil
|
||||
}
|
||||
return badtype("map", mapping)
|
||||
return md.badtype("map", mapping)
|
||||
}
|
||||
if rv.IsNil() {
|
||||
rv.Set(reflect.MakeMap(rv.Type()))
|
||||
}
|
||||
for k, v := range tmap {
|
||||
md.decoded[md.context.add(k).String()] = true
|
||||
md.decoded[md.context.add(k).String()] = struct{}{}
|
||||
md.context = append(md.context, k)
|
||||
|
||||
rvkey := indirect(reflect.New(rv.Type().Key()))
|
||||
rvval := reflect.Indirect(reflect.New(rv.Type().Elem()))
|
||||
if err := md.unify(v, rvval); err != nil {
|
||||
return err
|
||||
}
|
||||
md.context = md.context[0 : len(md.context)-1]
|
||||
|
||||
rvkey := indirect(reflect.New(rv.Type().Key()))
|
||||
rvkey.SetString(k)
|
||||
rv.SetMapIndex(rvkey, rvval)
|
||||
}
|
||||
|
@ -311,7 +339,7 @@ func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error {
|
|||
if !datav.IsValid() {
|
||||
return nil
|
||||
}
|
||||
return badtype("slice", data)
|
||||
return md.badtype("slice", data)
|
||||
}
|
||||
if l := datav.Len(); l != rv.Len() {
|
||||
return e("expected array length %d; got TOML array of length %d", rv.Len(), l)
|
||||
|
@ -325,7 +353,7 @@ func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error {
|
|||
if !datav.IsValid() {
|
||||
return nil
|
||||
}
|
||||
return badtype("slice", data)
|
||||
return md.badtype("slice", data)
|
||||
}
|
||||
n := datav.Len()
|
||||
if rv.IsNil() || rv.Cap() < n {
|
||||
|
@ -346,26 +374,21 @@ func (md *MetaData) unifySliceArray(data, rv reflect.Value) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error {
|
||||
if _, ok := data.(time.Time); ok {
|
||||
rv.Set(reflect.ValueOf(data))
|
||||
return nil
|
||||
}
|
||||
return badtype("time.Time", data)
|
||||
}
|
||||
|
||||
func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error {
|
||||
if s, ok := data.(string); ok {
|
||||
rv.SetString(s)
|
||||
return nil
|
||||
}
|
||||
return badtype("string", data)
|
||||
return md.badtype("string", data)
|
||||
}
|
||||
|
||||
func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error {
|
||||
if num, ok := data.(float64); ok {
|
||||
switch rv.Kind() {
|
||||
case reflect.Float32:
|
||||
if num < -math.MaxFloat32 || num > math.MaxFloat32 {
|
||||
return e("value %f is out of range for float32", num)
|
||||
}
|
||||
fallthrough
|
||||
case reflect.Float64:
|
||||
rv.SetFloat(num)
|
||||
|
@ -374,7 +397,26 @@ func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
return badtype("float", data)
|
||||
|
||||
if num, ok := data.(int64); ok {
|
||||
switch rv.Kind() {
|
||||
case reflect.Float32:
|
||||
if num < -maxSafeFloat32Int || num > maxSafeFloat32Int {
|
||||
return e("value %d is out of range for float32", num)
|
||||
}
|
||||
fallthrough
|
||||
case reflect.Float64:
|
||||
if num < -maxSafeFloat64Int || num > maxSafeFloat64Int {
|
||||
return e("value %d is out of range for float64", num)
|
||||
}
|
||||
rv.SetFloat(float64(num))
|
||||
default:
|
||||
panic("bug")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
return md.badtype("float", data)
|
||||
}
|
||||
|
||||
func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error {
|
||||
|
@ -421,7 +463,7 @@ func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
return badtype("integer", data)
|
||||
return md.badtype("integer", data)
|
||||
}
|
||||
|
||||
func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error {
|
||||
|
@ -429,7 +471,7 @@ func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error {
|
|||
rv.SetBool(b)
|
||||
return nil
|
||||
}
|
||||
return badtype("boolean", data)
|
||||
return md.badtype("boolean", data)
|
||||
}
|
||||
|
||||
func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error {
|
||||
|
@ -440,6 +482,12 @@ func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error {
|
|||
func (md *MetaData) unifyText(data interface{}, v encoding.TextUnmarshaler) error {
|
||||
var s string
|
||||
switch sdata := data.(type) {
|
||||
case Marshaler:
|
||||
text, err := sdata.MarshalTOML()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s = string(text)
|
||||
case TextMarshaler:
|
||||
text, err := sdata.MarshalText()
|
||||
if err != nil {
|
||||
|
@ -457,7 +505,7 @@ func (md *MetaData) unifyText(data interface{}, v encoding.TextUnmarshaler) erro
|
|||
case float64:
|
||||
s = fmt.Sprintf("%f", sdata)
|
||||
default:
|
||||
return badtype("primitive (string-like)", data)
|
||||
return md.badtype("primitive (string-like)", data)
|
||||
}
|
||||
if err := v.UnmarshalText([]byte(s)); err != nil {
|
||||
return err
|
||||
|
@ -465,17 +513,22 @@ func (md *MetaData) unifyText(data interface{}, v encoding.TextUnmarshaler) erro
|
|||
return nil
|
||||
}
|
||||
|
||||
func (md *MetaData) badtype(dst string, data interface{}) error {
|
||||
return e("incompatible types: TOML key %q has type %T; destination has type %s", md.context, data, dst)
|
||||
}
|
||||
|
||||
// rvalue returns a reflect.Value of `v`. All pointers are resolved.
|
||||
func rvalue(v interface{}) reflect.Value {
|
||||
return indirect(reflect.ValueOf(v))
|
||||
}
|
||||
|
||||
// indirect returns the value pointed to by a pointer.
|
||||
// Pointers are followed until the value is not a pointer.
|
||||
// New values are allocated for each nil pointer.
|
||||
//
|
||||
// An exception to this rule is if the value satisfies an interface of
|
||||
// interest to us (like encoding.TextUnmarshaler).
|
||||
// Pointers are followed until the value is not a pointer. New values are
|
||||
// allocated for each nil pointer.
|
||||
//
|
||||
// An exception to this rule is if the value satisfies an interface of interest
|
||||
// to us (like encoding.TextUnmarshaler).
|
||||
func indirect(v reflect.Value) reflect.Value {
|
||||
if v.Kind() != reflect.Ptr {
|
||||
if v.CanSet() {
|
||||
|
@ -505,7 +558,3 @@ func isUnifiable(rv reflect.Value) bool {
|
|||
func e(format string, args ...interface{}) error {
|
||||
return fmt.Errorf("toml: "+format, args...)
|
||||
}
|
||||
|
||||
func badtype(expected string, data interface{}) error {
|
||||
return e("cannot load TOML value of type %T into a Go %s", data, expected)
|
||||
}
|
||||
|
|
1
vendor/github.com/BurntSushi/toml/decode_go116.go
generated
vendored
1
vendor/github.com/BurntSushi/toml/decode_go116.go
generated
vendored
|
@ -1,3 +1,4 @@
|
|||
//go:build go1.16
|
||||
// +build go1.16
|
||||
|
||||
package toml
|
||||
|
|
24
vendor/github.com/BurntSushi/toml/deprecated.go
generated
vendored
24
vendor/github.com/BurntSushi/toml/deprecated.go
generated
vendored
|
@ -5,29 +5,17 @@ import (
|
|||
"io"
|
||||
)
|
||||
|
||||
// DEPRECATED!
|
||||
//
|
||||
// Use the identical encoding.TextMarshaler instead. It is defined here to
|
||||
// support Go 1.1 and older.
|
||||
// Deprecated: use encoding.TextMarshaler
|
||||
type TextMarshaler encoding.TextMarshaler
|
||||
|
||||
// DEPRECATED!
|
||||
//
|
||||
// Use the identical encoding.TextUnmarshaler instead. It is defined here to
|
||||
// support Go 1.1 and older.
|
||||
// Deprecated: use encoding.TextUnmarshaler
|
||||
type TextUnmarshaler encoding.TextUnmarshaler
|
||||
|
||||
// DEPRECATED!
|
||||
//
|
||||
// Use MetaData.PrimitiveDecode instead.
|
||||
// Deprecated: use MetaData.PrimitiveDecode.
|
||||
func PrimitiveDecode(primValue Primitive, v interface{}) error {
|
||||
md := MetaData{decoded: make(map[string]bool)}
|
||||
md := MetaData{decoded: make(map[string]struct{})}
|
||||
return md.unify(primValue.undecoded, rvalue(v))
|
||||
}
|
||||
|
||||
// DEPRECATED!
|
||||
//
|
||||
// Use NewDecoder(reader).Decode(&v) instead.
|
||||
func DecodeReader(r io.Reader, v interface{}) (MetaData, error) {
|
||||
return NewDecoder(r).Decode(v)
|
||||
}
|
||||
// Deprecated: use NewDecoder(reader).Decode(&value).
|
||||
func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { return NewDecoder(r).Decode(v) }
|
||||
|
|
150
vendor/github.com/BurntSushi/toml/encode.go
generated
vendored
150
vendor/github.com/BurntSushi/toml/encode.go
generated
vendored
|
@ -21,12 +21,11 @@ type tomlEncodeError struct{ error }
|
|||
var (
|
||||
errArrayNilElement = errors.New("toml: cannot encode array with nil element")
|
||||
errNonString = errors.New("toml: cannot encode a map with non-string key type")
|
||||
errAnonNonStruct = errors.New("toml: cannot encode an anonymous field that is not a struct")
|
||||
errNoKey = errors.New("toml: top-level values must be Go maps or structs")
|
||||
errAnything = errors.New("") // used in testing
|
||||
)
|
||||
|
||||
var quotedReplacer = strings.NewReplacer(
|
||||
var dblQuotedReplacer = strings.NewReplacer(
|
||||
"\"", "\\\"",
|
||||
"\\", "\\\\",
|
||||
"\x00", `\u0000`,
|
||||
|
@ -64,13 +63,22 @@ var quotedReplacer = strings.NewReplacer(
|
|||
"\x7f", `\u007f`,
|
||||
)
|
||||
|
||||
// Marshaler is the interface implemented by types that can marshal themselves
|
||||
// into valid TOML.
|
||||
type Marshaler interface {
|
||||
MarshalTOML() ([]byte, error)
|
||||
}
|
||||
|
||||
// Encoder encodes a Go to a TOML document.
|
||||
//
|
||||
// The mapping between Go values and TOML values should be precisely the same as
|
||||
// for the Decode* functions. Similarly, the TextMarshaler interface is
|
||||
// supported by encoding the resulting bytes as strings. If you want to write
|
||||
// arbitrary binary data then you will need to use something like base64 since
|
||||
// TOML does not have any binary types.
|
||||
// for the Decode* functions.
|
||||
//
|
||||
// The toml.Marshaler and encoder.TextMarshaler interfaces are supported to
|
||||
// encoding the value as custom TOML.
|
||||
//
|
||||
// If you want to write arbitrary binary data then you will need to use
|
||||
// something like base64 since TOML does not have any binary types.
|
||||
//
|
||||
// When encoding TOML hashes (Go maps or structs), keys without any sub-hashes
|
||||
// are encoded first.
|
||||
|
@ -83,16 +91,14 @@ var quotedReplacer = strings.NewReplacer(
|
|||
// structs. (e.g. [][]map[string]string is not allowed but []map[string]string
|
||||
// is okay, as is []map[string][]string).
|
||||
//
|
||||
// NOTE: Only exported keys are encoded due to the use of reflection. Unexported
|
||||
// NOTE: only exported keys are encoded due to the use of reflection. Unexported
|
||||
// keys are silently discarded.
|
||||
type Encoder struct {
|
||||
// The string to use for a single indentation level. The default is two
|
||||
// spaces.
|
||||
// String to use for a single indentation level; default is two spaces.
|
||||
Indent string
|
||||
|
||||
// hasWritten is whether we have written any output to w yet.
|
||||
hasWritten bool
|
||||
w *bufio.Writer
|
||||
hasWritten bool // written any output to w yet?
|
||||
}
|
||||
|
||||
// NewEncoder create a new Encoder.
|
||||
|
@ -130,12 +136,13 @@ func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) {
|
|||
}
|
||||
|
||||
func (enc *Encoder) encode(key Key, rv reflect.Value) {
|
||||
// Special case. Time needs to be in ISO8601 format.
|
||||
// Special case. If we can marshal the type to text, then we used that.
|
||||
// Basically, this prevents the encoder for handling these types as
|
||||
// generic structs (or whatever the underlying type of a TextMarshaler is).
|
||||
// Special case: time needs to be in ISO8601 format.
|
||||
//
|
||||
// Special case: if we can marshal the type to text, then we used that. This
|
||||
// prevents the encoder for handling these types as generic structs (or
|
||||
// whatever the underlying type of a TextMarshaler is).
|
||||
switch t := rv.Interface().(type) {
|
||||
case time.Time, encoding.TextMarshaler:
|
||||
case time.Time, encoding.TextMarshaler, Marshaler:
|
||||
enc.writeKeyValue(key, rv, false)
|
||||
return
|
||||
// TODO: #76 would make this superfluous after implemented.
|
||||
|
@ -200,13 +207,19 @@ func (enc *Encoder) eElement(rv reflect.Value) {
|
|||
enc.wf(v.In(time.UTC).Format(format))
|
||||
}
|
||||
return
|
||||
case encoding.TextMarshaler:
|
||||
// Use text marshaler if it's available for this value.
|
||||
if s, err := v.MarshalText(); err != nil {
|
||||
case Marshaler:
|
||||
s, err := v.MarshalTOML()
|
||||
if err != nil {
|
||||
encPanic(err)
|
||||
} else {
|
||||
enc.writeQuoted(string(s))
|
||||
}
|
||||
enc.writeQuoted(string(s))
|
||||
return
|
||||
case encoding.TextMarshaler:
|
||||
s, err := v.MarshalText()
|
||||
if err != nil {
|
||||
encPanic(err)
|
||||
}
|
||||
enc.writeQuoted(string(s))
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -260,7 +273,7 @@ func floatAddDecimal(fstr string) string {
|
|||
}
|
||||
|
||||
func (enc *Encoder) writeQuoted(s string) {
|
||||
enc.wf("\"%s\"", quotedReplacer.Replace(s))
|
||||
enc.wf("\"%s\"", dblQuotedReplacer.Replace(s))
|
||||
}
|
||||
|
||||
func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) {
|
||||
|
@ -286,7 +299,7 @@ func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) {
|
|||
continue
|
||||
}
|
||||
enc.newline()
|
||||
enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll())
|
||||
enc.wf("%s[[%s]]", enc.indentStr(key), key)
|
||||
enc.newline()
|
||||
enc.eMapOrStruct(key, trv, false)
|
||||
}
|
||||
|
@ -299,7 +312,7 @@ func (enc *Encoder) eTable(key Key, rv reflect.Value) {
|
|||
enc.newline()
|
||||
}
|
||||
if len(key) > 0 {
|
||||
enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll())
|
||||
enc.wf("%s[%s]", enc.indentStr(key), key)
|
||||
enc.newline()
|
||||
}
|
||||
enc.eMapOrStruct(key, rv, false)
|
||||
|
@ -328,7 +341,7 @@ func (enc *Encoder) eMap(key Key, rv reflect.Value, inline bool) {
|
|||
var mapKeysDirect, mapKeysSub []string
|
||||
for _, mapKey := range rv.MapKeys() {
|
||||
k := mapKey.String()
|
||||
if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) {
|
||||
if typeIsTable(tomlTypeOfGo(rv.MapIndex(mapKey))) {
|
||||
mapKeysSub = append(mapKeysSub, k)
|
||||
} else {
|
||||
mapKeysDirect = append(mapKeysDirect, k)
|
||||
|
@ -364,6 +377,8 @@ func (enc *Encoder) eMap(key Key, rv reflect.Value, inline bool) {
|
|||
}
|
||||
}
|
||||
|
||||
const is32Bit = (32 << (^uint(0) >> 63)) == 32
|
||||
|
||||
func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
|
||||
// Write keys for fields directly under this key first, because if we write
|
||||
// a field that creates a new table then all keys under it will be in that
|
||||
|
@ -408,10 +423,20 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
|
|||
}
|
||||
}
|
||||
|
||||
if typeIsHash(tomlTypeOfGo(frv)) {
|
||||
if typeIsTable(tomlTypeOfGo(frv)) {
|
||||
fieldsSub = append(fieldsSub, append(start, f.Index...))
|
||||
} else {
|
||||
fieldsDirect = append(fieldsDirect, append(start, f.Index...))
|
||||
// Copy so it works correct on 32bit archs; not clear why this
|
||||
// is needed. See #314, and https://www.reddit.com/r/golang/comments/pnx8v4
|
||||
// This also works fine on 64bit, but 32bit archs are somewhat
|
||||
// rare and this is a wee bit faster.
|
||||
if is32Bit {
|
||||
copyStart := make([]int, len(start))
|
||||
copy(copyStart, start)
|
||||
fieldsDirect = append(fieldsDirect, append(copyStart, f.Index...))
|
||||
} else {
|
||||
fieldsDirect = append(fieldsDirect, append(start, f.Index...))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -462,13 +487,13 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
|
|||
}
|
||||
}
|
||||
|
||||
// tomlTypeName returns the TOML type name of the Go value's type. It is
|
||||
// used to determine whether the types of array elements are mixed (which is
|
||||
// forbidden). If the Go value is nil, then it is illegal for it to be an array
|
||||
// element, and valueIsNil is returned as true.
|
||||
|
||||
// Returns the TOML type of a Go value. The type may be `nil`, which means
|
||||
// no concrete TOML type could be found.
|
||||
// tomlTypeOfGo returns the TOML type name of the Go value's type.
|
||||
//
|
||||
// It is used to determine whether the types of array elements are mixed (which
|
||||
// is forbidden). If the Go value is nil, then it is illegal for it to be an
|
||||
// array element, and valueIsNil is returned as true.
|
||||
//
|
||||
// The type may be `nil`, which means no concrete TOML type could be found.
|
||||
func tomlTypeOfGo(rv reflect.Value) tomlType {
|
||||
if isNil(rv) || !rv.IsValid() {
|
||||
return nil
|
||||
|
@ -495,32 +520,43 @@ func tomlTypeOfGo(rv reflect.Value) tomlType {
|
|||
case reflect.Map:
|
||||
return tomlHash
|
||||
case reflect.Struct:
|
||||
switch rv.Interface().(type) {
|
||||
case time.Time:
|
||||
if _, ok := rv.Interface().(time.Time); ok {
|
||||
return tomlDatetime
|
||||
case encoding.TextMarshaler:
|
||||
return tomlString
|
||||
default:
|
||||
// Someone used a pointer receiver: we can make it work for pointer
|
||||
// values.
|
||||
if rv.CanAddr() {
|
||||
_, ok := rv.Addr().Interface().(encoding.TextMarshaler)
|
||||
if ok {
|
||||
return tomlString
|
||||
}
|
||||
}
|
||||
return tomlHash
|
||||
}
|
||||
if isMarshaler(rv) {
|
||||
return tomlString
|
||||
}
|
||||
return tomlHash
|
||||
default:
|
||||
_, ok := rv.Interface().(encoding.TextMarshaler)
|
||||
if ok {
|
||||
if isMarshaler(rv) {
|
||||
return tomlString
|
||||
}
|
||||
|
||||
encPanic(errors.New("unsupported type: " + rv.Kind().String()))
|
||||
panic("") // Need *some* return value
|
||||
panic("unreachable")
|
||||
}
|
||||
}
|
||||
|
||||
func isMarshaler(rv reflect.Value) bool {
|
||||
switch rv.Interface().(type) {
|
||||
case encoding.TextMarshaler:
|
||||
return true
|
||||
case Marshaler:
|
||||
return true
|
||||
}
|
||||
|
||||
// Someone used a pointer receiver: we can make it work for pointer values.
|
||||
if rv.CanAddr() {
|
||||
if _, ok := rv.Addr().Interface().(encoding.TextMarshaler); ok {
|
||||
return true
|
||||
}
|
||||
if _, ok := rv.Addr().Interface().(Marshaler); ok {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// tomlArrayType returns the element type of a TOML array. The type returned
|
||||
// may be nil if it cannot be determined (e.g., a nil slice or a zero length
|
||||
// slize). This function may also panic if it finds a type that cannot be
|
||||
|
@ -604,7 +640,14 @@ func (enc *Encoder) newline() {
|
|||
//
|
||||
// key = <any value>
|
||||
//
|
||||
// If inline is true it won't add a newline at the end.
|
||||
// This is also used for "k = v" in inline tables; so something like this will
|
||||
// be written in three calls:
|
||||
//
|
||||
// ┌────────────────────┐
|
||||
// │ ┌───┐ ┌─────┐│
|
||||
// v v v v vv
|
||||
// key = {k = v, k2 = v2}
|
||||
//
|
||||
func (enc *Encoder) writeKeyValue(key Key, val reflect.Value, inline bool) {
|
||||
if len(key) == 0 {
|
||||
encPanic(errNoKey)
|
||||
|
@ -617,7 +660,8 @@ func (enc *Encoder) writeKeyValue(key Key, val reflect.Value, inline bool) {
|
|||
}
|
||||
|
||||
func (enc *Encoder) wf(format string, v ...interface{}) {
|
||||
if _, err := fmt.Fprintf(enc.w, format, v...); err != nil {
|
||||
_, err := fmt.Fprintf(enc.w, format, v...)
|
||||
if err != nil {
|
||||
encPanic(err)
|
||||
}
|
||||
enc.hasWritten = true
|
||||
|
|
229
vendor/github.com/BurntSushi/toml/error.go
generated
vendored
Normal file
229
vendor/github.com/BurntSushi/toml/error.go
generated
vendored
Normal file
|
@ -0,0 +1,229 @@
|
|||
package toml
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ParseError is returned when there is an error parsing the TOML syntax.
|
||||
//
|
||||
// For example invalid syntax, duplicate keys, etc.
|
||||
//
|
||||
// In addition to the error message itself, you can also print detailed location
|
||||
// information with context by using ErrorWithLocation():
|
||||
//
|
||||
// toml: error: Key 'fruit' was already created and cannot be used as an array.
|
||||
//
|
||||
// At line 4, column 2-7:
|
||||
//
|
||||
// 2 | fruit = []
|
||||
// 3 |
|
||||
// 4 | [[fruit]] # Not allowed
|
||||
// ^^^^^
|
||||
//
|
||||
// Furthermore, the ErrorWithUsage() can be used to print the above with some
|
||||
// more detailed usage guidance:
|
||||
//
|
||||
// toml: error: newlines not allowed within inline tables
|
||||
//
|
||||
// At line 1, column 18:
|
||||
//
|
||||
// 1 | x = [{ key = 42 #
|
||||
// ^
|
||||
//
|
||||
// Error help:
|
||||
//
|
||||
// Inline tables must always be on a single line:
|
||||
//
|
||||
// table = {key = 42, second = 43}
|
||||
//
|
||||
// It is invalid to split them over multiple lines like so:
|
||||
//
|
||||
// # INVALID
|
||||
// table = {
|
||||
// key = 42,
|
||||
// second = 43
|
||||
// }
|
||||
//
|
||||
// Use regular for this:
|
||||
//
|
||||
// [table]
|
||||
// key = 42
|
||||
// second = 43
|
||||
type ParseError struct {
|
||||
Message string // Short technical message.
|
||||
Usage string // Longer message with usage guidance; may be blank.
|
||||
Position Position // Position of the error
|
||||
LastKey string // Last parsed key, may be blank.
|
||||
Line int // Line the error occurred. Deprecated: use Position.
|
||||
|
||||
err error
|
||||
input string
|
||||
}
|
||||
|
||||
// Position of an error.
|
||||
type Position struct {
|
||||
Line int // Line number, starting at 1.
|
||||
Start int // Start of error, as byte offset starting at 0.
|
||||
Len int // Lenght in bytes.
|
||||
}
|
||||
|
||||
func (pe ParseError) Error() string {
|
||||
msg := pe.Message
|
||||
if msg == "" { // Error from errorf()
|
||||
msg = pe.err.Error()
|
||||
}
|
||||
|
||||
if pe.LastKey == "" {
|
||||
return fmt.Sprintf("toml: line %d: %s", pe.Position.Line, msg)
|
||||
}
|
||||
return fmt.Sprintf("toml: line %d (last key %q): %s",
|
||||
pe.Position.Line, pe.LastKey, msg)
|
||||
}
|
||||
|
||||
// ErrorWithUsage() returns the error with detailed location context.
|
||||
//
|
||||
// See the documentation on ParseError.
|
||||
func (pe ParseError) ErrorWithPosition() string {
|
||||
if pe.input == "" { // Should never happen, but just in case.
|
||||
return pe.Error()
|
||||
}
|
||||
|
||||
var (
|
||||
lines = strings.Split(pe.input, "\n")
|
||||
col = pe.column(lines)
|
||||
b = new(strings.Builder)
|
||||
)
|
||||
|
||||
msg := pe.Message
|
||||
if msg == "" {
|
||||
msg = pe.err.Error()
|
||||
}
|
||||
|
||||
// TODO: don't show control characters as literals? This may not show up
|
||||
// well everywhere.
|
||||
|
||||
if pe.Position.Len == 1 {
|
||||
fmt.Fprintf(b, "toml: error: %s\n\nAt line %d, column %d:\n\n",
|
||||
msg, pe.Position.Line, col+1)
|
||||
} else {
|
||||
fmt.Fprintf(b, "toml: error: %s\n\nAt line %d, column %d-%d:\n\n",
|
||||
msg, pe.Position.Line, col, col+pe.Position.Len)
|
||||
}
|
||||
if pe.Position.Line > 2 {
|
||||
fmt.Fprintf(b, "% 7d | %s\n", pe.Position.Line-2, lines[pe.Position.Line-3])
|
||||
}
|
||||
if pe.Position.Line > 1 {
|
||||
fmt.Fprintf(b, "% 7d | %s\n", pe.Position.Line-1, lines[pe.Position.Line-2])
|
||||
}
|
||||
fmt.Fprintf(b, "% 7d | %s\n", pe.Position.Line, lines[pe.Position.Line-1])
|
||||
fmt.Fprintf(b, "% 10s%s%s\n", "", strings.Repeat(" ", col), strings.Repeat("^", pe.Position.Len))
|
||||
return b.String()
|
||||
}
|
||||
|
||||
// ErrorWithUsage() returns the error with detailed location context and usage
|
||||
// guidance.
|
||||
//
|
||||
// See the documentation on ParseError.
|
||||
func (pe ParseError) ErrorWithUsage() string {
|
||||
m := pe.ErrorWithPosition()
|
||||
if u, ok := pe.err.(interface{ Usage() string }); ok && u.Usage() != "" {
|
||||
return m + "Error help:\n\n " +
|
||||
strings.ReplaceAll(strings.TrimSpace(u.Usage()), "\n", "\n ") +
|
||||
"\n"
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
func (pe ParseError) column(lines []string) int {
|
||||
var pos, col int
|
||||
for i := range lines {
|
||||
ll := len(lines[i]) + 1 // +1 for the removed newline
|
||||
if pos+ll >= pe.Position.Start {
|
||||
col = pe.Position.Start - pos
|
||||
if col < 0 { // Should never happen, but just in case.
|
||||
col = 0
|
||||
}
|
||||
break
|
||||
}
|
||||
pos += ll
|
||||
}
|
||||
|
||||
return col
|
||||
}
|
||||
|
||||
type (
|
||||
errLexControl struct{ r rune }
|
||||
errLexEscape struct{ r rune }
|
||||
errLexUTF8 struct{ b byte }
|
||||
errLexInvalidNum struct{ v string }
|
||||
errLexInvalidDate struct{ v string }
|
||||
errLexInlineTableNL struct{}
|
||||
errLexStringNL struct{}
|
||||
)
|
||||
|
||||
func (e errLexControl) Error() string {
|
||||
return fmt.Sprintf("TOML files cannot contain control characters: '0x%02x'", e.r)
|
||||
}
|
||||
func (e errLexControl) Usage() string { return "" }
|
||||
|
||||
func (e errLexEscape) Error() string { return fmt.Sprintf(`invalid escape in string '\%c'`, e.r) }
|
||||
func (e errLexEscape) Usage() string { return usageEscape }
|
||||
func (e errLexUTF8) Error() string { return fmt.Sprintf("invalid UTF-8 byte: 0x%02x", e.b) }
|
||||
func (e errLexUTF8) Usage() string { return "" }
|
||||
func (e errLexInvalidNum) Error() string { return fmt.Sprintf("invalid number: %q", e.v) }
|
||||
func (e errLexInvalidNum) Usage() string { return "" }
|
||||
func (e errLexInvalidDate) Error() string { return fmt.Sprintf("invalid date: %q", e.v) }
|
||||
func (e errLexInvalidDate) Usage() string { return "" }
|
||||
func (e errLexInlineTableNL) Error() string { return "newlines not allowed within inline tables" }
|
||||
func (e errLexInlineTableNL) Usage() string { return usageInlineNewline }
|
||||
func (e errLexStringNL) Error() string { return "strings cannot contain newlines" }
|
||||
func (e errLexStringNL) Usage() string { return usageStringNewline }
|
||||
|
||||
const usageEscape = `
|
||||
A '\' inside a "-delimited string is interpreted as an escape character.
|
||||
|
||||
The following escape sequences are supported:
|
||||
\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX
|
||||
|
||||
To prevent a '\' from being recognized as an escape character, use either:
|
||||
|
||||
- a ' or '''-delimited string; escape characters aren't processed in them; or
|
||||
- write two backslashes to get a single backslash: '\\'.
|
||||
|
||||
If you're trying to add a Windows path (e.g. "C:\Users\martin") then using '/'
|
||||
instead of '\' will usually also work: "C:/Users/martin".
|
||||
`
|
||||
|
||||
const usageInlineNewline = `
|
||||
Inline tables must always be on a single line:
|
||||
|
||||
table = {key = 42, second = 43}
|
||||
|
||||
It is invalid to split them over multiple lines like so:
|
||||
|
||||
# INVALID
|
||||
table = {
|
||||
key = 42,
|
||||
second = 43
|
||||
}
|
||||
|
||||
Use regular for this:
|
||||
|
||||
[table]
|
||||
key = 42
|
||||
second = 43
|
||||
`
|
||||
|
||||
const usageStringNewline = `
|
||||
Strings must always be on a single line, and cannot span more than one line:
|
||||
|
||||
# INVALID
|
||||
string = "Hello,
|
||||
world!"
|
||||
|
||||
Instead use """ or ''' to split strings over multiple lines:
|
||||
|
||||
string = """Hello,
|
||||
world!"""
|
||||
`
|
0
vendor/github.com/BurntSushi/toml/go.sum
generated
vendored
0
vendor/github.com/BurntSushi/toml/go.sum
generated
vendored
354
vendor/github.com/BurntSushi/toml/lex.go
generated
vendored
354
vendor/github.com/BurntSushi/toml/lex.go
generated
vendored
|
@ -37,28 +37,14 @@ const (
|
|||
itemInlineTableEnd
|
||||
)
|
||||
|
||||
const (
|
||||
eof = 0
|
||||
comma = ','
|
||||
tableStart = '['
|
||||
tableEnd = ']'
|
||||
arrayTableStart = '['
|
||||
arrayTableEnd = ']'
|
||||
tableSep = '.'
|
||||
keySep = '='
|
||||
arrayStart = '['
|
||||
arrayEnd = ']'
|
||||
commentStart = '#'
|
||||
stringStart = '"'
|
||||
stringEnd = '"'
|
||||
rawStringStart = '\''
|
||||
rawStringEnd = '\''
|
||||
inlineTableStart = '{'
|
||||
inlineTableEnd = '}'
|
||||
)
|
||||
const eof = 0
|
||||
|
||||
type stateFn func(lx *lexer) stateFn
|
||||
|
||||
func (p Position) String() string {
|
||||
return fmt.Sprintf("at line %d; start %d; length %d", p.Line, p.Start, p.Len)
|
||||
}
|
||||
|
||||
type lexer struct {
|
||||
input string
|
||||
start int
|
||||
|
@ -67,26 +53,26 @@ type lexer struct {
|
|||
state stateFn
|
||||
items chan item
|
||||
|
||||
// Allow for backing up up to four runes.
|
||||
// This is necessary because TOML contains 3-rune tokens (""" and ''').
|
||||
// Allow for backing up up to 4 runes. This is necessary because TOML
|
||||
// contains 3-rune tokens (""" and ''').
|
||||
prevWidths [4]int
|
||||
nprev int // how many of prevWidths are in use
|
||||
// If we emit an eof, we can still back up, but it is not OK to call
|
||||
// next again.
|
||||
atEOF bool
|
||||
nprev int // how many of prevWidths are in use
|
||||
atEOF bool // If we emit an eof, we can still back up, but it is not OK to call next again.
|
||||
|
||||
// A stack of state functions used to maintain context.
|
||||
// The idea is to reuse parts of the state machine in various places.
|
||||
// For example, values can appear at the top level or within arbitrarily
|
||||
// nested arrays. The last state on the stack is used after a value has
|
||||
// been lexed. Similarly for comments.
|
||||
//
|
||||
// The idea is to reuse parts of the state machine in various places. For
|
||||
// example, values can appear at the top level or within arbitrarily nested
|
||||
// arrays. The last state on the stack is used after a value has been lexed.
|
||||
// Similarly for comments.
|
||||
stack []stateFn
|
||||
}
|
||||
|
||||
type item struct {
|
||||
typ itemType
|
||||
val string
|
||||
line int
|
||||
typ itemType
|
||||
val string
|
||||
err error
|
||||
pos Position
|
||||
}
|
||||
|
||||
func (lx *lexer) nextItem() item {
|
||||
|
@ -96,7 +82,7 @@ func (lx *lexer) nextItem() item {
|
|||
return item
|
||||
default:
|
||||
lx.state = lx.state(lx)
|
||||
//fmt.Printf(" STATE %-24s current: %-10q stack: %s\n", lx.state, lx.current(), lx.stack)
|
||||
//fmt.Printf(" STATE %-24s current: %-10q stack: %s\n", lx.state, lx.current(), lx.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -105,9 +91,9 @@ func lex(input string) *lexer {
|
|||
lx := &lexer{
|
||||
input: input,
|
||||
state: lexTop,
|
||||
line: 1,
|
||||
items: make(chan item, 10),
|
||||
stack: make([]stateFn, 0, 10),
|
||||
line: 1,
|
||||
}
|
||||
return lx
|
||||
}
|
||||
|
@ -129,13 +115,25 @@ func (lx *lexer) current() string {
|
|||
return lx.input[lx.start:lx.pos]
|
||||
}
|
||||
|
||||
func (lx lexer) getPos() Position {
|
||||
p := Position{
|
||||
Line: lx.line,
|
||||
Start: lx.start,
|
||||
Len: lx.pos - lx.start,
|
||||
}
|
||||
if p.Len <= 0 {
|
||||
p.Len = 1
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
func (lx *lexer) emit(typ itemType) {
|
||||
lx.items <- item{typ, lx.current(), lx.line}
|
||||
lx.items <- item{typ: typ, pos: lx.getPos(), val: lx.current()}
|
||||
lx.start = lx.pos
|
||||
}
|
||||
|
||||
func (lx *lexer) emitTrim(typ itemType) {
|
||||
lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line}
|
||||
lx.items <- item{typ: typ, pos: lx.getPos(), val: strings.TrimSpace(lx.current())}
|
||||
lx.start = lx.pos
|
||||
}
|
||||
|
||||
|
@ -160,7 +158,13 @@ func (lx *lexer) next() (r rune) {
|
|||
|
||||
r, w := utf8.DecodeRuneInString(lx.input[lx.pos:])
|
||||
if r == utf8.RuneError {
|
||||
lx.errorf("invalid UTF-8 byte at position %d (line %d): 0x%02x", lx.pos, lx.line, lx.input[lx.pos])
|
||||
lx.error(errLexUTF8{lx.input[lx.pos]})
|
||||
return utf8.RuneError
|
||||
}
|
||||
|
||||
// Note: don't use peek() here, as this calls next().
|
||||
if isControl(r) || (r == '\r' && (len(lx.input)-1 == lx.pos || lx.input[lx.pos+1] != '\n')) {
|
||||
lx.errorControlChar(r)
|
||||
return utf8.RuneError
|
||||
}
|
||||
|
||||
|
@ -188,6 +192,7 @@ func (lx *lexer) backup() {
|
|||
lx.prevWidths[1] = lx.prevWidths[2]
|
||||
lx.prevWidths[2] = lx.prevWidths[3]
|
||||
lx.nprev--
|
||||
|
||||
lx.pos -= w
|
||||
if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' {
|
||||
lx.line--
|
||||
|
@ -223,18 +228,58 @@ func (lx *lexer) skip(pred func(rune) bool) {
|
|||
}
|
||||
}
|
||||
|
||||
// errorf stops all lexing by emitting an error and returning `nil`.
|
||||
// error stops all lexing by emitting an error and returning `nil`.
|
||||
//
|
||||
// Note that any value that is a character is escaped if it's a special
|
||||
// character (newlines, tabs, etc.).
|
||||
func (lx *lexer) errorf(format string, values ...interface{}) stateFn {
|
||||
lx.items <- item{
|
||||
itemError,
|
||||
fmt.Sprintf(format, values...),
|
||||
lx.line,
|
||||
func (lx *lexer) error(err error) stateFn {
|
||||
if lx.atEOF {
|
||||
return lx.errorPrevLine(err)
|
||||
}
|
||||
lx.items <- item{typ: itemError, pos: lx.getPos(), err: err}
|
||||
return nil
|
||||
}
|
||||
|
||||
// errorfPrevline is like error(), but sets the position to the last column of
|
||||
// the previous line.
|
||||
//
|
||||
// This is so that unexpected EOF or NL errors don't show on a new blank line.
|
||||
func (lx *lexer) errorPrevLine(err error) stateFn {
|
||||
pos := lx.getPos()
|
||||
pos.Line--
|
||||
pos.Len = 1
|
||||
pos.Start = lx.pos - 1
|
||||
lx.items <- item{typ: itemError, pos: pos, err: err}
|
||||
return nil
|
||||
}
|
||||
|
||||
// errorPos is like error(), but allows explicitly setting the position.
|
||||
func (lx *lexer) errorPos(start, length int, err error) stateFn {
|
||||
pos := lx.getPos()
|
||||
pos.Start = start
|
||||
pos.Len = length
|
||||
lx.items <- item{typ: itemError, pos: pos, err: err}
|
||||
return nil
|
||||
}
|
||||
|
||||
// errorf is like error, and creates a new error.
|
||||
func (lx *lexer) errorf(format string, values ...interface{}) stateFn {
|
||||
if lx.atEOF {
|
||||
pos := lx.getPos()
|
||||
pos.Line--
|
||||
pos.Len = 1
|
||||
pos.Start = lx.pos - 1
|
||||
lx.items <- item{typ: itemError, pos: pos, err: fmt.Errorf(format, values...)}
|
||||
return nil
|
||||
}
|
||||
lx.items <- item{typ: itemError, pos: lx.getPos(), err: fmt.Errorf(format, values...)}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (lx *lexer) errorControlChar(cc rune) stateFn {
|
||||
return lx.errorPos(lx.pos-1, 1, errLexControl{cc})
|
||||
}
|
||||
|
||||
// lexTop consumes elements at the top level of TOML data.
|
||||
func lexTop(lx *lexer) stateFn {
|
||||
r := lx.next()
|
||||
|
@ -242,10 +287,10 @@ func lexTop(lx *lexer) stateFn {
|
|||
return lexSkip(lx, lexTop)
|
||||
}
|
||||
switch r {
|
||||
case commentStart:
|
||||
case '#':
|
||||
lx.push(lexTop)
|
||||
return lexCommentStart
|
||||
case tableStart:
|
||||
case '[':
|
||||
return lexTableStart
|
||||
case eof:
|
||||
if lx.pos > lx.start {
|
||||
|
@ -268,7 +313,7 @@ func lexTop(lx *lexer) stateFn {
|
|||
func lexTopEnd(lx *lexer) stateFn {
|
||||
r := lx.next()
|
||||
switch {
|
||||
case r == commentStart:
|
||||
case r == '#':
|
||||
// a comment will read to a newline for us.
|
||||
lx.push(lexTop)
|
||||
return lexCommentStart
|
||||
|
@ -292,7 +337,7 @@ func lexTopEnd(lx *lexer) stateFn {
|
|||
// It also handles the case that this is an item in an array of tables.
|
||||
// e.g., '[[name]]'.
|
||||
func lexTableStart(lx *lexer) stateFn {
|
||||
if lx.peek() == arrayTableStart {
|
||||
if lx.peek() == '[' {
|
||||
lx.next()
|
||||
lx.emit(itemArrayTableStart)
|
||||
lx.push(lexArrayTableEnd)
|
||||
|
@ -309,10 +354,8 @@ func lexTableEnd(lx *lexer) stateFn {
|
|||
}
|
||||
|
||||
func lexArrayTableEnd(lx *lexer) stateFn {
|
||||
if r := lx.next(); r != arrayTableEnd {
|
||||
return lx.errorf(
|
||||
"expected end of table array name delimiter %q, but got %q instead",
|
||||
arrayTableEnd, r)
|
||||
if r := lx.next(); r != ']' {
|
||||
return lx.errorf("expected end of table array name delimiter ']', but got %q instead", r)
|
||||
}
|
||||
lx.emit(itemArrayTableEnd)
|
||||
return lexTopEnd
|
||||
|
@ -321,11 +364,11 @@ func lexArrayTableEnd(lx *lexer) stateFn {
|
|||
func lexTableNameStart(lx *lexer) stateFn {
|
||||
lx.skip(isWhitespace)
|
||||
switch r := lx.peek(); {
|
||||
case r == tableEnd || r == eof:
|
||||
case r == ']' || r == eof:
|
||||
return lx.errorf("unexpected end of table name (table names cannot be empty)")
|
||||
case r == tableSep:
|
||||
case r == '.':
|
||||
return lx.errorf("unexpected table separator (table names cannot be empty)")
|
||||
case r == stringStart || r == rawStringStart:
|
||||
case r == '"' || r == '\'':
|
||||
lx.ignore()
|
||||
lx.push(lexTableNameEnd)
|
||||
return lexQuotedName
|
||||
|
@ -342,10 +385,10 @@ func lexTableNameEnd(lx *lexer) stateFn {
|
|||
switch r := lx.next(); {
|
||||
case isWhitespace(r):
|
||||
return lexTableNameEnd
|
||||
case r == tableSep:
|
||||
case r == '.':
|
||||
lx.ignore()
|
||||
return lexTableNameStart
|
||||
case r == tableEnd:
|
||||
case r == ']':
|
||||
return lx.pop()
|
||||
default:
|
||||
return lx.errorf("expected '.' or ']' to end table name, but got %q instead", r)
|
||||
|
@ -379,10 +422,10 @@ func lexQuotedName(lx *lexer) stateFn {
|
|||
switch {
|
||||
case isWhitespace(r):
|
||||
return lexSkip(lx, lexValue)
|
||||
case r == stringStart:
|
||||
case r == '"':
|
||||
lx.ignore() // ignore the '"'
|
||||
return lexString
|
||||
case r == rawStringStart:
|
||||
case r == '\'':
|
||||
lx.ignore() // ignore the "'"
|
||||
return lexRawString
|
||||
case r == eof:
|
||||
|
@ -400,7 +443,7 @@ func lexKeyStart(lx *lexer) stateFn {
|
|||
return lx.errorf("unexpected '=': key name appears blank")
|
||||
case r == '.':
|
||||
return lx.errorf("unexpected '.': keys cannot start with a '.'")
|
||||
case r == stringStart || r == rawStringStart:
|
||||
case r == '"' || r == '\'':
|
||||
lx.ignore()
|
||||
fallthrough
|
||||
default: // Bare key
|
||||
|
@ -416,7 +459,7 @@ func lexKeyNameStart(lx *lexer) stateFn {
|
|||
return lx.errorf("unexpected '='")
|
||||
case r == '.':
|
||||
return lx.errorf("unexpected '.'")
|
||||
case r == stringStart || r == rawStringStart:
|
||||
case r == '"' || r == '\'':
|
||||
lx.ignore()
|
||||
lx.push(lexKeyEnd)
|
||||
return lexQuotedName
|
||||
|
@ -434,7 +477,7 @@ func lexKeyEnd(lx *lexer) stateFn {
|
|||
case isWhitespace(r):
|
||||
return lexSkip(lx, lexKeyEnd)
|
||||
case r == eof:
|
||||
return lx.errorf("unexpected EOF; expected key separator %q", keySep)
|
||||
return lx.errorf("unexpected EOF; expected key separator '='")
|
||||
case r == '.':
|
||||
lx.ignore()
|
||||
return lexKeyNameStart
|
||||
|
@ -461,17 +504,17 @@ func lexValue(lx *lexer) stateFn {
|
|||
return lexNumberOrDateStart
|
||||
}
|
||||
switch r {
|
||||
case arrayStart:
|
||||
case '[':
|
||||
lx.ignore()
|
||||
lx.emit(itemArray)
|
||||
return lexArrayValue
|
||||
case inlineTableStart:
|
||||
case '{':
|
||||
lx.ignore()
|
||||
lx.emit(itemInlineTableStart)
|
||||
return lexInlineTableValue
|
||||
case stringStart:
|
||||
if lx.accept(stringStart) {
|
||||
if lx.accept(stringStart) {
|
||||
case '"':
|
||||
if lx.accept('"') {
|
||||
if lx.accept('"') {
|
||||
lx.ignore() // Ignore """
|
||||
return lexMultilineString
|
||||
}
|
||||
|
@ -479,9 +522,9 @@ func lexValue(lx *lexer) stateFn {
|
|||
}
|
||||
lx.ignore() // ignore the '"'
|
||||
return lexString
|
||||
case rawStringStart:
|
||||
if lx.accept(rawStringStart) {
|
||||
if lx.accept(rawStringStart) {
|
||||
case '\'':
|
||||
if lx.accept('\'') {
|
||||
if lx.accept('\'') {
|
||||
lx.ignore() // Ignore """
|
||||
return lexMultilineRawString
|
||||
}
|
||||
|
@ -520,14 +563,12 @@ func lexArrayValue(lx *lexer) stateFn {
|
|||
switch {
|
||||
case isWhitespace(r) || isNL(r):
|
||||
return lexSkip(lx, lexArrayValue)
|
||||
case r == commentStart:
|
||||
case r == '#':
|
||||
lx.push(lexArrayValue)
|
||||
return lexCommentStart
|
||||
case r == comma:
|
||||
case r == ',':
|
||||
return lx.errorf("unexpected comma")
|
||||
case r == arrayEnd:
|
||||
// NOTE(caleb): The spec isn't clear about whether you can have
|
||||
// a trailing comma or not, so we'll allow it.
|
||||
case r == ']':
|
||||
return lexArrayEnd
|
||||
}
|
||||
|
||||
|
@ -540,22 +581,20 @@ func lexArrayValue(lx *lexer) stateFn {
|
|||
// the next value (or the end of the array): it ignores whitespace and newlines
|
||||
// and expects either a ',' or a ']'.
|
||||
func lexArrayValueEnd(lx *lexer) stateFn {
|
||||
r := lx.next()
|
||||
switch {
|
||||
switch r := lx.next(); {
|
||||
case isWhitespace(r) || isNL(r):
|
||||
return lexSkip(lx, lexArrayValueEnd)
|
||||
case r == commentStart:
|
||||
case r == '#':
|
||||
lx.push(lexArrayValueEnd)
|
||||
return lexCommentStart
|
||||
case r == comma:
|
||||
case r == ',':
|
||||
lx.ignore()
|
||||
return lexArrayValue // move on to the next value
|
||||
case r == arrayEnd:
|
||||
case r == ']':
|
||||
return lexArrayEnd
|
||||
default:
|
||||
return lx.errorf("expected a comma (',') or array terminator (']'), but got %s", runeOrEOF(r))
|
||||
}
|
||||
return lx.errorf(
|
||||
"expected a comma or array terminator %q, but got %s instead",
|
||||
arrayEnd, runeOrEOF(r))
|
||||
}
|
||||
|
||||
// lexArrayEnd finishes the lexing of an array.
|
||||
|
@ -574,13 +613,13 @@ func lexInlineTableValue(lx *lexer) stateFn {
|
|||
case isWhitespace(r):
|
||||
return lexSkip(lx, lexInlineTableValue)
|
||||
case isNL(r):
|
||||
return lx.errorf("newlines not allowed within inline tables")
|
||||
case r == commentStart:
|
||||
return lx.errorPrevLine(errLexInlineTableNL{})
|
||||
case r == '#':
|
||||
lx.push(lexInlineTableValue)
|
||||
return lexCommentStart
|
||||
case r == comma:
|
||||
case r == ',':
|
||||
return lx.errorf("unexpected comma")
|
||||
case r == inlineTableEnd:
|
||||
case r == '}':
|
||||
return lexInlineTableEnd
|
||||
}
|
||||
lx.backup()
|
||||
|
@ -596,23 +635,21 @@ func lexInlineTableValueEnd(lx *lexer) stateFn {
|
|||
case isWhitespace(r):
|
||||
return lexSkip(lx, lexInlineTableValueEnd)
|
||||
case isNL(r):
|
||||
return lx.errorf("newlines not allowed within inline tables")
|
||||
case r == commentStart:
|
||||
return lx.errorPrevLine(errLexInlineTableNL{})
|
||||
case r == '#':
|
||||
lx.push(lexInlineTableValueEnd)
|
||||
return lexCommentStart
|
||||
case r == comma:
|
||||
case r == ',':
|
||||
lx.ignore()
|
||||
lx.skip(isWhitespace)
|
||||
if lx.peek() == '}' {
|
||||
return lx.errorf("trailing comma not allowed in inline tables")
|
||||
}
|
||||
return lexInlineTableValue
|
||||
case r == inlineTableEnd:
|
||||
case r == '}':
|
||||
return lexInlineTableEnd
|
||||
default:
|
||||
return lx.errorf(
|
||||
"expected a comma or an inline table terminator %q, but got %s instead",
|
||||
inlineTableEnd, runeOrEOF(r))
|
||||
return lx.errorf("expected a comma or an inline table terminator '}', but got %s instead", runeOrEOF(r))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -638,14 +675,12 @@ func lexString(lx *lexer) stateFn {
|
|||
switch {
|
||||
case r == eof:
|
||||
return lx.errorf(`unexpected EOF; expected '"'`)
|
||||
case isControl(r) || r == '\r':
|
||||
return lx.errorf("control characters are not allowed inside strings: '0x%02x'", r)
|
||||
case isNL(r):
|
||||
return lx.errorf("strings cannot contain newlines")
|
||||
return lx.errorPrevLine(errLexStringNL{})
|
||||
case r == '\\':
|
||||
lx.push(lexString)
|
||||
return lexStringEscape
|
||||
case r == stringEnd:
|
||||
case r == '"':
|
||||
lx.backup()
|
||||
lx.emit(itemString)
|
||||
lx.next()
|
||||
|
@ -660,23 +695,20 @@ func lexString(lx *lexer) stateFn {
|
|||
func lexMultilineString(lx *lexer) stateFn {
|
||||
r := lx.next()
|
||||
switch r {
|
||||
default:
|
||||
return lexMultilineString
|
||||
case eof:
|
||||
return lx.errorf(`unexpected EOF; expected '"""'`)
|
||||
case '\r':
|
||||
if lx.peek() != '\n' {
|
||||
return lx.errorf("control characters are not allowed inside strings: '0x%02x'", r)
|
||||
}
|
||||
return lexMultilineString
|
||||
case '\\':
|
||||
return lexMultilineStringEscape
|
||||
case stringEnd:
|
||||
case '"':
|
||||
/// Found " → try to read two more "".
|
||||
if lx.accept(stringEnd) {
|
||||
if lx.accept(stringEnd) {
|
||||
if lx.accept('"') {
|
||||
if lx.accept('"') {
|
||||
/// Peek ahead: the string can contain " and "", including at the
|
||||
/// end: """str"""""
|
||||
/// 6 or more at the end, however, is an error.
|
||||
if lx.peek() == stringEnd {
|
||||
if lx.peek() == '"' {
|
||||
/// Check if we already lexed 5 's; if so we have 6 now, and
|
||||
/// that's just too many man!
|
||||
if strings.HasSuffix(lx.current(), `"""""`) {
|
||||
|
@ -699,12 +731,8 @@ func lexMultilineString(lx *lexer) stateFn {
|
|||
}
|
||||
lx.backup()
|
||||
}
|
||||
return lexMultilineString
|
||||
}
|
||||
|
||||
if isControl(r) {
|
||||
return lx.errorf("control characters are not allowed inside strings: '0x%02x'", r)
|
||||
}
|
||||
return lexMultilineString
|
||||
}
|
||||
|
||||
// lexRawString consumes a raw string. Nothing can be escaped in such a string.
|
||||
|
@ -712,20 +740,19 @@ func lexMultilineString(lx *lexer) stateFn {
|
|||
func lexRawString(lx *lexer) stateFn {
|
||||
r := lx.next()
|
||||
switch {
|
||||
default:
|
||||
return lexRawString
|
||||
case r == eof:
|
||||
return lx.errorf(`unexpected EOF; expected "'"`)
|
||||
case isControl(r) || r == '\r':
|
||||
return lx.errorf("control characters are not allowed inside strings: '0x%02x'", r)
|
||||
case isNL(r):
|
||||
return lx.errorf("strings cannot contain newlines")
|
||||
case r == rawStringEnd:
|
||||
return lx.errorPrevLine(errLexStringNL{})
|
||||
case r == '\'':
|
||||
lx.backup()
|
||||
lx.emit(itemRawString)
|
||||
lx.next()
|
||||
lx.ignore()
|
||||
return lx.pop()
|
||||
}
|
||||
return lexRawString
|
||||
}
|
||||
|
||||
// lexMultilineRawString consumes a raw string. Nothing can be escaped in such
|
||||
|
@ -734,21 +761,18 @@ func lexRawString(lx *lexer) stateFn {
|
|||
func lexMultilineRawString(lx *lexer) stateFn {
|
||||
r := lx.next()
|
||||
switch r {
|
||||
default:
|
||||
return lexMultilineRawString
|
||||
case eof:
|
||||
return lx.errorf(`unexpected EOF; expected "'''"`)
|
||||
case '\r':
|
||||
if lx.peek() != '\n' {
|
||||
return lx.errorf("control characters are not allowed inside strings: '0x%02x'", r)
|
||||
}
|
||||
return lexMultilineRawString
|
||||
case rawStringEnd:
|
||||
case '\'':
|
||||
/// Found ' → try to read two more ''.
|
||||
if lx.accept(rawStringEnd) {
|
||||
if lx.accept(rawStringEnd) {
|
||||
if lx.accept('\'') {
|
||||
if lx.accept('\'') {
|
||||
/// Peek ahead: the string can contain ' and '', including at the
|
||||
/// end: '''str'''''
|
||||
/// 6 or more at the end, however, is an error.
|
||||
if lx.peek() == rawStringEnd {
|
||||
if lx.peek() == '\'' {
|
||||
/// Check if we already lexed 5 's; if so we have 6 now, and
|
||||
/// that's just too many man!
|
||||
if strings.HasSuffix(lx.current(), "'''''") {
|
||||
|
@ -771,12 +795,8 @@ func lexMultilineRawString(lx *lexer) stateFn {
|
|||
}
|
||||
lx.backup()
|
||||
}
|
||||
return lexMultilineRawString
|
||||
}
|
||||
|
||||
if isControl(r) {
|
||||
return lx.errorf("control characters are not allowed inside strings: '0x%02x'", r)
|
||||
}
|
||||
return lexMultilineRawString
|
||||
}
|
||||
|
||||
// lexMultilineStringEscape consumes an escaped character. It assumes that the
|
||||
|
@ -817,8 +837,7 @@ func lexStringEscape(lx *lexer) stateFn {
|
|||
case 'U':
|
||||
return lexLongUnicodeEscape
|
||||
}
|
||||
return lx.errorf("invalid escape character %q; only the following escape characters are allowed: "+
|
||||
`\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r)
|
||||
return lx.error(errLexEscape{r})
|
||||
}
|
||||
|
||||
func lexShortUnicodeEscape(lx *lexer) stateFn {
|
||||
|
@ -1108,8 +1127,6 @@ func lexComment(lx *lexer) stateFn {
|
|||
lx.backup()
|
||||
lx.emit(itemText)
|
||||
return lx.pop()
|
||||
case isControl(r):
|
||||
return lx.errorf("control characters are not allowed inside comments: '0x%02x'", r)
|
||||
default:
|
||||
return lexComment
|
||||
}
|
||||
|
@ -1121,52 +1138,6 @@ func lexSkip(lx *lexer, nextState stateFn) stateFn {
|
|||
return nextState
|
||||
}
|
||||
|
||||
// isWhitespace returns true if `r` is a whitespace character according
|
||||
// to the spec.
|
||||
func isWhitespace(r rune) bool {
|
||||
return r == '\t' || r == ' '
|
||||
}
|
||||
|
||||
func isNL(r rune) bool {
|
||||
return r == '\n' || r == '\r'
|
||||
}
|
||||
|
||||
// Control characters except \n, \t
|
||||
func isControl(r rune) bool {
|
||||
switch r {
|
||||
case '\t', '\r', '\n':
|
||||
return false
|
||||
default:
|
||||
return (r >= 0x00 && r <= 0x1f) || r == 0x7f
|
||||
}
|
||||
}
|
||||
|
||||
func isDigit(r rune) bool {
|
||||
return r >= '0' && r <= '9'
|
||||
}
|
||||
|
||||
func isHexadecimal(r rune) bool {
|
||||
return (r >= '0' && r <= '9') ||
|
||||
(r >= 'a' && r <= 'f') ||
|
||||
(r >= 'A' && r <= 'F')
|
||||
}
|
||||
|
||||
func isOctal(r rune) bool {
|
||||
return r >= '0' && r <= '7'
|
||||
}
|
||||
|
||||
func isBinary(r rune) bool {
|
||||
return r == '0' || r == '1'
|
||||
}
|
||||
|
||||
func isBareKeyChar(r rune) bool {
|
||||
return (r >= 'A' && r <= 'Z') ||
|
||||
(r >= 'a' && r <= 'z') ||
|
||||
(r >= '0' && r <= '9') ||
|
||||
r == '_' ||
|
||||
r == '-'
|
||||
}
|
||||
|
||||
func (s stateFn) String() string {
|
||||
name := runtime.FuncForPC(reflect.ValueOf(s).Pointer()).Name()
|
||||
if i := strings.LastIndexByte(name, '.'); i > -1 {
|
||||
|
@ -1223,3 +1194,26 @@ func (itype itemType) String() string {
|
|||
func (item item) String() string {
|
||||
return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val)
|
||||
}
|
||||
|
||||
func isWhitespace(r rune) bool { return r == '\t' || r == ' ' }
|
||||
func isNL(r rune) bool { return r == '\n' || r == '\r' }
|
||||
func isControl(r rune) bool { // Control characters except \t, \r, \n
|
||||
switch r {
|
||||
case '\t', '\r', '\n':
|
||||
return false
|
||||
default:
|
||||
return (r >= 0x00 && r <= 0x1f) || r == 0x7f
|
||||
}
|
||||
}
|
||||
func isDigit(r rune) bool { return r >= '0' && r <= '9' }
|
||||
func isBinary(r rune) bool { return r == '0' || r == '1' }
|
||||
func isOctal(r rune) bool { return r >= '0' && r <= '7' }
|
||||
func isHexadecimal(r rune) bool {
|
||||
return (r >= '0' && r <= '9') || (r >= 'a' && r <= 'f') || (r >= 'A' && r <= 'F')
|
||||
}
|
||||
func isBareKeyChar(r rune) bool {
|
||||
return (r >= 'A' && r <= 'Z') ||
|
||||
(r >= 'a' && r <= 'z') ||
|
||||
(r >= '0' && r <= '9') ||
|
||||
r == '_' || r == '-'
|
||||
}
|
||||
|
|
105
vendor/github.com/BurntSushi/toml/decode_meta.go → vendor/github.com/BurntSushi/toml/meta.go
generated
vendored
105
vendor/github.com/BurntSushi/toml/decode_meta.go → vendor/github.com/BurntSushi/toml/meta.go
generated
vendored
|
@ -1,34 +1,39 @@
|
|||
package toml
|
||||
|
||||
import "strings"
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// MetaData allows access to meta information about TOML data that may not be
|
||||
// inferable via reflection. In particular, whether a key has been defined and
|
||||
// the TOML type of a key.
|
||||
// MetaData allows access to meta information about TOML data that's not
|
||||
// accessible otherwise.
|
||||
//
|
||||
// It allows checking if a key is defined in the TOML data, whether any keys
|
||||
// were undecoded, and the TOML type of a key.
|
||||
type MetaData struct {
|
||||
context Key // Used only during decoding.
|
||||
|
||||
mapping map[string]interface{}
|
||||
types map[string]tomlType
|
||||
keys []Key
|
||||
decoded map[string]bool
|
||||
context Key // Used only during decoding.
|
||||
decoded map[string]struct{}
|
||||
}
|
||||
|
||||
// IsDefined reports if the key exists in the TOML data.
|
||||
//
|
||||
// The key should be specified hierarchically, for example to access the TOML
|
||||
// key "a.b.c" you would use:
|
||||
// key "a.b.c" you would use IsDefined("a", "b", "c"). Keys are case sensitive.
|
||||
//
|
||||
// IsDefined("a", "b", "c")
|
||||
//
|
||||
// IsDefined will return false if an empty key given. Keys are case sensitive.
|
||||
// Returns false for an empty key.
|
||||
func (md *MetaData) IsDefined(key ...string) bool {
|
||||
if len(key) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
var hash map[string]interface{}
|
||||
var ok bool
|
||||
var hashOrVal interface{} = md.mapping
|
||||
var (
|
||||
hash map[string]interface{}
|
||||
ok bool
|
||||
hashOrVal interface{} = md.mapping
|
||||
)
|
||||
for _, k := range key {
|
||||
if hash, ok = hashOrVal.(map[string]interface{}); !ok {
|
||||
return false
|
||||
|
@ -45,51 +50,12 @@ func (md *MetaData) IsDefined(key ...string) bool {
|
|||
// Type will return the empty string if given an empty key or a key that does
|
||||
// not exist. Keys are case sensitive.
|
||||
func (md *MetaData) Type(key ...string) string {
|
||||
fullkey := strings.Join(key, ".")
|
||||
if typ, ok := md.types[fullkey]; ok {
|
||||
if typ, ok := md.types[Key(key).String()]; ok {
|
||||
return typ.typeString()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// Key represents any TOML key, including key groups. Use (MetaData).Keys to get
|
||||
// values of this type.
|
||||
type Key []string
|
||||
|
||||
func (k Key) String() string { return strings.Join(k, ".") }
|
||||
|
||||
func (k Key) maybeQuotedAll() string {
|
||||
var ss []string
|
||||
for i := range k {
|
||||
ss = append(ss, k.maybeQuoted(i))
|
||||
}
|
||||
return strings.Join(ss, ".")
|
||||
}
|
||||
|
||||
func (k Key) maybeQuoted(i int) string {
|
||||
if k[i] == "" {
|
||||
return `""`
|
||||
}
|
||||
quote := false
|
||||
for _, c := range k[i] {
|
||||
if !isBareKeyChar(c) {
|
||||
quote = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if quote {
|
||||
return `"` + quotedReplacer.Replace(k[i]) + `"`
|
||||
}
|
||||
return k[i]
|
||||
}
|
||||
|
||||
func (k Key) add(piece string) Key {
|
||||
newKey := make(Key, len(k)+1)
|
||||
copy(newKey, k)
|
||||
newKey[len(k)] = piece
|
||||
return newKey
|
||||
}
|
||||
|
||||
// Keys returns a slice of every key in the TOML data, including key groups.
|
||||
//
|
||||
// Each key is itself a slice, where the first element is the top of the
|
||||
|
@ -115,9 +81,40 @@ func (md *MetaData) Keys() []Key {
|
|||
func (md *MetaData) Undecoded() []Key {
|
||||
undecoded := make([]Key, 0, len(md.keys))
|
||||
for _, key := range md.keys {
|
||||
if !md.decoded[key.String()] {
|
||||
if _, ok := md.decoded[key.String()]; !ok {
|
||||
undecoded = append(undecoded, key)
|
||||
}
|
||||
}
|
||||
return undecoded
|
||||
}
|
||||
|
||||
// Key represents any TOML key, including key groups. Use (MetaData).Keys to get
|
||||
// values of this type.
|
||||
type Key []string
|
||||
|
||||
func (k Key) String() string {
|
||||
ss := make([]string, len(k))
|
||||
for i := range k {
|
||||
ss[i] = k.maybeQuoted(i)
|
||||
}
|
||||
return strings.Join(ss, ".")
|
||||
}
|
||||
|
||||
func (k Key) maybeQuoted(i int) string {
|
||||
if k[i] == "" {
|
||||
return `""`
|
||||
}
|
||||
for _, c := range k[i] {
|
||||
if !isBareKeyChar(c) {
|
||||
return `"` + dblQuotedReplacer.Replace(k[i]) + `"`
|
||||
}
|
||||
}
|
||||
return k[i]
|
||||
}
|
||||
|
||||
func (k Key) add(piece string) Key {
|
||||
newKey := make(Key, len(k)+1)
|
||||
copy(newKey, k)
|
||||
newKey[len(k)] = piece
|
||||
return newKey
|
||||
}
|
174
vendor/github.com/BurntSushi/toml/parse.go
generated
vendored
174
vendor/github.com/BurntSushi/toml/parse.go
generated
vendored
|
@ -1,7 +1,6 @@
|
|||
package toml
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
@ -12,35 +11,23 @@ import (
|
|||
)
|
||||
|
||||
type parser struct {
|
||||
mapping map[string]interface{}
|
||||
types map[string]tomlType
|
||||
lx *lexer
|
||||
lx *lexer
|
||||
context Key // Full key for the current hash in scope.
|
||||
currentKey string // Base key name for everything except hashes.
|
||||
pos Position // Current position in the TOML file.
|
||||
|
||||
ordered []Key // List of keys in the order that they appear in the TOML data.
|
||||
context Key // Full key for the current hash in scope.
|
||||
currentKey string // Base key name for everything except hashes.
|
||||
approxLine int // Rough approximation of line number
|
||||
implicits map[string]bool // Record implied keys (e.g. 'key.group.names').
|
||||
}
|
||||
|
||||
// ParseError is used when a file can't be parsed: for example invalid integer
|
||||
// literals, duplicate keys, etc.
|
||||
type ParseError struct {
|
||||
Message string
|
||||
Line int
|
||||
LastKey string
|
||||
}
|
||||
|
||||
func (pe ParseError) Error() string {
|
||||
return fmt.Sprintf("Near line %d (last key parsed '%s'): %s",
|
||||
pe.Line, pe.LastKey, pe.Message)
|
||||
ordered []Key // List of keys in the order that they appear in the TOML data.
|
||||
mapping map[string]interface{} // Map keyname → key value.
|
||||
types map[string]tomlType // Map keyname → TOML type.
|
||||
implicits map[string]struct{} // Record implicit keys (e.g. "key.group.names").
|
||||
}
|
||||
|
||||
func parse(data string) (p *parser, err error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
var ok bool
|
||||
if err, ok = r.(ParseError); ok {
|
||||
if pErr, ok := r.(ParseError); ok {
|
||||
pErr.input = data
|
||||
err = pErr
|
||||
return
|
||||
}
|
||||
panic(r)
|
||||
|
@ -60,8 +47,13 @@ func parse(data string) (p *parser, err error) {
|
|||
if len(data) < 6 {
|
||||
ex = len(data)
|
||||
}
|
||||
if strings.ContainsRune(data[:ex], 0) {
|
||||
return nil, errors.New("files cannot contain NULL bytes; probably using UTF-16; TOML files must be UTF-8")
|
||||
if i := strings.IndexRune(data[:ex], 0); i > -1 {
|
||||
return nil, ParseError{
|
||||
Message: "files cannot contain NULL bytes; probably using UTF-16; TOML files must be UTF-8",
|
||||
Position: Position{Line: 1, Start: i, Len: 1},
|
||||
Line: 1,
|
||||
input: data,
|
||||
}
|
||||
}
|
||||
|
||||
p = &parser{
|
||||
|
@ -69,7 +61,7 @@ func parse(data string) (p *parser, err error) {
|
|||
types: make(map[string]tomlType),
|
||||
lx: lex(data),
|
||||
ordered: make([]Key, 0),
|
||||
implicits: make(map[string]bool),
|
||||
implicits: make(map[string]struct{}),
|
||||
}
|
||||
for {
|
||||
item := p.next()
|
||||
|
@ -82,12 +74,21 @@ func parse(data string) (p *parser, err error) {
|
|||
return p, nil
|
||||
}
|
||||
|
||||
func (p *parser) panicf(format string, v ...interface{}) {
|
||||
msg := fmt.Sprintf(format, v...)
|
||||
func (p *parser) panicItemf(it item, format string, v ...interface{}) {
|
||||
panic(ParseError{
|
||||
Message: msg,
|
||||
Line: p.approxLine,
|
||||
LastKey: p.current(),
|
||||
Message: fmt.Sprintf(format, v...),
|
||||
Position: it.pos,
|
||||
Line: it.pos.Len,
|
||||
LastKey: p.current(),
|
||||
})
|
||||
}
|
||||
|
||||
func (p *parser) panicf(format string, v ...interface{}) {
|
||||
panic(ParseError{
|
||||
Message: fmt.Sprintf(format, v...),
|
||||
Position: p.pos,
|
||||
Line: p.pos.Line,
|
||||
LastKey: p.current(),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -95,11 +96,26 @@ func (p *parser) next() item {
|
|||
it := p.lx.nextItem()
|
||||
//fmt.Printf("ITEM %-18s line %-3d │ %q\n", it.typ, it.line, it.val)
|
||||
if it.typ == itemError {
|
||||
p.panicf("%s", it.val)
|
||||
if it.err != nil {
|
||||
panic(ParseError{
|
||||
Position: it.pos,
|
||||
Line: it.pos.Line,
|
||||
LastKey: p.current(),
|
||||
err: it.err,
|
||||
})
|
||||
}
|
||||
|
||||
p.panicItemf(it, "%s", it.val)
|
||||
}
|
||||
return it
|
||||
}
|
||||
|
||||
func (p *parser) nextPos() item {
|
||||
it := p.next()
|
||||
p.pos = it.pos
|
||||
return it
|
||||
}
|
||||
|
||||
func (p *parser) bug(format string, v ...interface{}) {
|
||||
panic(fmt.Sprintf("BUG: "+format+"\n\n", v...))
|
||||
}
|
||||
|
@ -119,11 +135,9 @@ func (p *parser) assertEqual(expected, got itemType) {
|
|||
func (p *parser) topLevel(item item) {
|
||||
switch item.typ {
|
||||
case itemCommentStart: // # ..
|
||||
p.approxLine = item.line
|
||||
p.expect(itemText)
|
||||
case itemTableStart: // [ .. ]
|
||||
name := p.next()
|
||||
p.approxLine = name.line
|
||||
name := p.nextPos()
|
||||
|
||||
var key Key
|
||||
for ; name.typ != itemTableEnd && name.typ != itemEOF; name = p.next() {
|
||||
|
@ -135,8 +149,7 @@ func (p *parser) topLevel(item item) {
|
|||
p.setType("", tomlHash)
|
||||
p.ordered = append(p.ordered, key)
|
||||
case itemArrayTableStart: // [[ .. ]]
|
||||
name := p.next()
|
||||
p.approxLine = name.line
|
||||
name := p.nextPos()
|
||||
|
||||
var key Key
|
||||
for ; name.typ != itemArrayTableEnd && name.typ != itemEOF; name = p.next() {
|
||||
|
@ -150,8 +163,7 @@ func (p *parser) topLevel(item item) {
|
|||
case itemKeyStart: // key = ..
|
||||
outerContext := p.context
|
||||
/// Read all the key parts (e.g. 'a' and 'b' in 'a.b')
|
||||
k := p.next()
|
||||
p.approxLine = k.line
|
||||
k := p.nextPos()
|
||||
var key Key
|
||||
for ; k.typ != itemKeyEnd && k.typ != itemEOF; k = p.next() {
|
||||
key = append(key, p.keyString(k))
|
||||
|
@ -206,9 +218,9 @@ var datetimeRepl = strings.NewReplacer(
|
|||
func (p *parser) value(it item, parentIsArray bool) (interface{}, tomlType) {
|
||||
switch it.typ {
|
||||
case itemString:
|
||||
return p.replaceEscapes(it.val), p.typeOfPrimitive(it)
|
||||
return p.replaceEscapes(it, it.val), p.typeOfPrimitive(it)
|
||||
case itemMultilineString:
|
||||
return p.replaceEscapes(stripFirstNewline(stripEscapedNewlines(it.val))), p.typeOfPrimitive(it)
|
||||
return p.replaceEscapes(it, stripFirstNewline(stripEscapedNewlines(it.val))), p.typeOfPrimitive(it)
|
||||
case itemRawString:
|
||||
return it.val, p.typeOfPrimitive(it)
|
||||
case itemRawMultilineString:
|
||||
|
@ -240,10 +252,10 @@ func (p *parser) value(it item, parentIsArray bool) (interface{}, tomlType) {
|
|||
|
||||
func (p *parser) valueInteger(it item) (interface{}, tomlType) {
|
||||
if !numUnderscoresOK(it.val) {
|
||||
p.panicf("Invalid integer %q: underscores must be surrounded by digits", it.val)
|
||||
p.panicItemf(it, "Invalid integer %q: underscores must be surrounded by digits", it.val)
|
||||
}
|
||||
if numHasLeadingZero(it.val) {
|
||||
p.panicf("Invalid integer %q: cannot have leading zeroes", it.val)
|
||||
p.panicItemf(it, "Invalid integer %q: cannot have leading zeroes", it.val)
|
||||
}
|
||||
|
||||
num, err := strconv.ParseInt(it.val, 0, 64)
|
||||
|
@ -254,7 +266,7 @@ func (p *parser) valueInteger(it item) (interface{}, tomlType) {
|
|||
// So mark the former as a bug but the latter as a legitimate user
|
||||
// error.
|
||||
if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange {
|
||||
p.panicf("Integer '%s' is out of the range of 64-bit signed integers.", it.val)
|
||||
p.panicItemf(it, "Integer '%s' is out of the range of 64-bit signed integers.", it.val)
|
||||
} else {
|
||||
p.bug("Expected integer value, but got '%s'.", it.val)
|
||||
}
|
||||
|
@ -272,18 +284,18 @@ func (p *parser) valueFloat(it item) (interface{}, tomlType) {
|
|||
})
|
||||
for _, part := range parts {
|
||||
if !numUnderscoresOK(part) {
|
||||
p.panicf("Invalid float %q: underscores must be surrounded by digits", it.val)
|
||||
p.panicItemf(it, "Invalid float %q: underscores must be surrounded by digits", it.val)
|
||||
}
|
||||
}
|
||||
if len(parts) > 0 && numHasLeadingZero(parts[0]) {
|
||||
p.panicf("Invalid float %q: cannot have leading zeroes", it.val)
|
||||
p.panicItemf(it, "Invalid float %q: cannot have leading zeroes", it.val)
|
||||
}
|
||||
if !numPeriodsOK(it.val) {
|
||||
// As a special case, numbers like '123.' or '1.e2',
|
||||
// which are valid as far as Go/strconv are concerned,
|
||||
// must be rejected because TOML says that a fractional
|
||||
// part consists of '.' followed by 1+ digits.
|
||||
p.panicf("Invalid float %q: '.' must be followed by one or more digits", it.val)
|
||||
p.panicItemf(it, "Invalid float %q: '.' must be followed by one or more digits", it.val)
|
||||
}
|
||||
val := strings.Replace(it.val, "_", "", -1)
|
||||
if val == "+nan" || val == "-nan" { // Go doesn't support this, but TOML spec does.
|
||||
|
@ -292,9 +304,9 @@ func (p *parser) valueFloat(it item) (interface{}, tomlType) {
|
|||
num, err := strconv.ParseFloat(val, 64)
|
||||
if err != nil {
|
||||
if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange {
|
||||
p.panicf("Float '%s' is out of the range of 64-bit IEEE-754 floating-point numbers.", it.val)
|
||||
p.panicItemf(it, "Float '%s' is out of the range of 64-bit IEEE-754 floating-point numbers.", it.val)
|
||||
} else {
|
||||
p.panicf("Invalid float value: %q", it.val)
|
||||
p.panicItemf(it, "Invalid float value: %q", it.val)
|
||||
}
|
||||
}
|
||||
return num, p.typeOfPrimitive(it)
|
||||
|
@ -325,7 +337,7 @@ func (p *parser) valueDatetime(it item) (interface{}, tomlType) {
|
|||
}
|
||||
}
|
||||
if !ok {
|
||||
p.panicf("Invalid TOML Datetime: %q.", it.val)
|
||||
p.panicItemf(it, "Invalid TOML Datetime: %q.", it.val)
|
||||
}
|
||||
return t, p.typeOfPrimitive(it)
|
||||
}
|
||||
|
@ -335,8 +347,12 @@ func (p *parser) valueArray(it item) (interface{}, tomlType) {
|
|||
|
||||
// p.setType(p.currentKey, typ)
|
||||
var (
|
||||
array []interface{}
|
||||
types []tomlType
|
||||
|
||||
// Initialize to a non-nil empty slice. This makes it consistent with
|
||||
// how S = [] decodes into a non-nil slice inside something like struct
|
||||
// { S []string }. See #338
|
||||
array = []interface{}{}
|
||||
)
|
||||
for it = p.next(); it.typ != itemArrayEnd; it = p.next() {
|
||||
if it.typ == itemCommentStart {
|
||||
|
@ -347,6 +363,12 @@ func (p *parser) valueArray(it item) (interface{}, tomlType) {
|
|||
val, typ := p.value(it, true)
|
||||
array = append(array, val)
|
||||
types = append(types, typ)
|
||||
|
||||
// XXX: types isn't used here, we need it to record the accurate type
|
||||
// information.
|
||||
//
|
||||
// Not entirely sure how to best store this; could use "key[0]",
|
||||
// "key[1]" notation, or maybe store it on the Array type?
|
||||
}
|
||||
return array, tomlArray
|
||||
}
|
||||
|
@ -373,8 +395,7 @@ func (p *parser) valueInlineTable(it item, parentIsArray bool) (interface{}, tom
|
|||
}
|
||||
|
||||
/// Read all key parts.
|
||||
k := p.next()
|
||||
p.approxLine = k.line
|
||||
k := p.nextPos()
|
||||
var key Key
|
||||
for ; k.typ != itemKeyEnd && k.typ != itemEOF; k = p.next() {
|
||||
key = append(key, p.keyString(k))
|
||||
|
@ -408,7 +429,7 @@ func (p *parser) valueInlineTable(it item, parentIsArray bool) (interface{}, tom
|
|||
// numHasLeadingZero checks if this number has leading zeroes, allowing for '0',
|
||||
// +/- signs, and base prefixes.
|
||||
func numHasLeadingZero(s string) bool {
|
||||
if len(s) > 1 && s[0] == '0' && isDigit(rune(s[1])) { // >1 to allow "0" and isDigit to allow 0x
|
||||
if len(s) > 1 && s[0] == '0' && !(s[1] == 'b' || s[1] == 'o' || s[1] == 'x') { // Allow 0b, 0o, 0x
|
||||
return true
|
||||
}
|
||||
if len(s) > 2 && (s[0] == '-' || s[0] == '+') && s[1] == '0' {
|
||||
|
@ -503,7 +524,7 @@ func (p *parser) addContext(key Key, array bool) {
|
|||
if hash, ok := hashContext[k].([]map[string]interface{}); ok {
|
||||
hashContext[k] = append(hash, make(map[string]interface{}))
|
||||
} else {
|
||||
p.panicf("Key '%s' was already created and cannot be used as an array.", keyContext)
|
||||
p.panicf("Key '%s' was already created and cannot be used as an array.", key)
|
||||
}
|
||||
} else {
|
||||
p.setValue(key[len(key)-1], make(map[string]interface{}))
|
||||
|
@ -513,8 +534,8 @@ func (p *parser) addContext(key Key, array bool) {
|
|||
|
||||
// set calls setValue and setType.
|
||||
func (p *parser) set(key string, val interface{}, typ tomlType) {
|
||||
p.setValue(p.currentKey, val)
|
||||
p.setType(p.currentKey, typ)
|
||||
p.setValue(key, val)
|
||||
p.setType(key, typ)
|
||||
}
|
||||
|
||||
// setValue sets the given key to the given value in the current context.
|
||||
|
@ -573,27 +594,31 @@ func (p *parser) setValue(key string, value interface{}) {
|
|||
hash[key] = value
|
||||
}
|
||||
|
||||
// setType sets the type of a particular value at a given key.
|
||||
// It should be called immediately AFTER setValue.
|
||||
// setType sets the type of a particular value at a given key. It should be
|
||||
// called immediately AFTER setValue.
|
||||
//
|
||||
// Note that if `key` is empty, then the type given will be applied to the
|
||||
// current context (which is either a table or an array of tables).
|
||||
func (p *parser) setType(key string, typ tomlType) {
|
||||
keyContext := make(Key, 0, len(p.context)+1)
|
||||
for _, k := range p.context {
|
||||
keyContext = append(keyContext, k)
|
||||
}
|
||||
keyContext = append(keyContext, p.context...)
|
||||
if len(key) > 0 { // allow type setting for hashes
|
||||
keyContext = append(keyContext, key)
|
||||
}
|
||||
// Special case to make empty keys ("" = 1) work.
|
||||
// Without it it will set "" rather than `""`.
|
||||
// TODO: why is this needed? And why is this only needed here?
|
||||
if len(keyContext) == 0 {
|
||||
keyContext = Key{""}
|
||||
}
|
||||
p.types[keyContext.String()] = typ
|
||||
}
|
||||
|
||||
// Implicit keys need to be created when tables are implied in "a.b.c.d = 1" and
|
||||
// "[a.b.c]" (the "a", "b", and "c" hashes are never created explicitly).
|
||||
func (p *parser) addImplicit(key Key) { p.implicits[key.String()] = true }
|
||||
func (p *parser) removeImplicit(key Key) { p.implicits[key.String()] = false }
|
||||
func (p *parser) isImplicit(key Key) bool { return p.implicits[key.String()] }
|
||||
func (p *parser) addImplicit(key Key) { p.implicits[key.String()] = struct{}{} }
|
||||
func (p *parser) removeImplicit(key Key) { delete(p.implicits, key.String()) }
|
||||
func (p *parser) isImplicit(key Key) bool { _, ok := p.implicits[key.String()]; return ok }
|
||||
func (p *parser) isArray(key Key) bool { return p.types[key.String()] == tomlArray }
|
||||
func (p *parser) addImplicitContext(key Key) {
|
||||
p.addImplicit(key)
|
||||
|
@ -662,8 +687,8 @@ func stripEscapedNewlines(s string) string {
|
|||
return strings.Join(split, "")
|
||||
}
|
||||
|
||||
func (p *parser) replaceEscapes(str string) string {
|
||||
var replaced []rune
|
||||
func (p *parser) replaceEscapes(it item, str string) string {
|
||||
replaced := make([]rune, 0, len(str))
|
||||
s := []byte(str)
|
||||
r := 0
|
||||
for r < len(s) {
|
||||
|
@ -683,7 +708,7 @@ func (p *parser) replaceEscapes(str string) string {
|
|||
p.bug("Expected valid escape code after \\, but got %q.", s[r])
|
||||
return ""
|
||||
case ' ', '\t':
|
||||
p.panicf("invalid escape: '\\%c'", s[r])
|
||||
p.panicItemf(it, "invalid escape: '\\%c'", s[r])
|
||||
return ""
|
||||
case 'b':
|
||||
replaced = append(replaced, rune(0x0008))
|
||||
|
@ -710,14 +735,14 @@ func (p *parser) replaceEscapes(str string) string {
|
|||
// At this point, we know we have a Unicode escape of the form
|
||||
// `uXXXX` at [r, r+5). (Because the lexer guarantees this
|
||||
// for us.)
|
||||
escaped := p.asciiEscapeToUnicode(s[r+1 : r+5])
|
||||
escaped := p.asciiEscapeToUnicode(it, s[r+1:r+5])
|
||||
replaced = append(replaced, escaped)
|
||||
r += 5
|
||||
case 'U':
|
||||
// At this point, we know we have a Unicode escape of the form
|
||||
// `uXXXX` at [r, r+9). (Because the lexer guarantees this
|
||||
// for us.)
|
||||
escaped := p.asciiEscapeToUnicode(s[r+1 : r+9])
|
||||
escaped := p.asciiEscapeToUnicode(it, s[r+1:r+9])
|
||||
replaced = append(replaced, escaped)
|
||||
r += 9
|
||||
}
|
||||
|
@ -725,15 +750,14 @@ func (p *parser) replaceEscapes(str string) string {
|
|||
return string(replaced)
|
||||
}
|
||||
|
||||
func (p *parser) asciiEscapeToUnicode(bs []byte) rune {
|
||||
func (p *parser) asciiEscapeToUnicode(it item, bs []byte) rune {
|
||||
s := string(bs)
|
||||
hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32)
|
||||
if err != nil {
|
||||
p.bug("Could not parse '%s' as a hexadecimal number, but the "+
|
||||
"lexer claims it's OK: %s", s, err)
|
||||
p.bug("Could not parse '%s' as a hexadecimal number, but the lexer claims it's OK: %s", s, err)
|
||||
}
|
||||
if !utf8.ValidRune(rune(hex)) {
|
||||
p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s)
|
||||
p.panicItemf(it, "Escaped character '\\u%s' is not valid UTF-8.", s)
|
||||
}
|
||||
return rune(hex)
|
||||
}
|
||||
|
|
4
vendor/github.com/BurntSushi/toml/type_fields.go
generated
vendored
4
vendor/github.com/BurntSushi/toml/type_fields.go
generated
vendored
|
@ -70,8 +70,8 @@ func typeFields(t reflect.Type) []field {
|
|||
next := []field{{typ: t}}
|
||||
|
||||
// Count of queued names for current level and the next.
|
||||
count := map[reflect.Type]int{}
|
||||
nextCount := map[reflect.Type]int{}
|
||||
var count map[reflect.Type]int
|
||||
var nextCount map[reflect.Type]int
|
||||
|
||||
// Types already visited at an earlier level.
|
||||
visited := map[reflect.Type]bool{}
|
||||
|
|
|
@ -16,7 +16,7 @@ func typeEqual(t1, t2 tomlType) bool {
|
|||
return t1.typeString() == t2.typeString()
|
||||
}
|
||||
|
||||
func typeIsHash(t tomlType) bool {
|
||||
func typeIsTable(t tomlType) bool {
|
||||
return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash)
|
||||
}
|
||||
|
46
vendor/github.com/OpenPeeDeeP/depguard/README.md
generated
vendored
46
vendor/github.com/OpenPeeDeeP/depguard/README.md
generated
vendored
|
@ -1,7 +1,7 @@
|
|||
# Depguard
|
||||
|
||||
Go linter that checks package imports are in a list of acceptable packages. It
|
||||
supports a white list and black list option and can do prefix or glob matching.
|
||||
can also deny a list of packages and can do prefix or glob matching.
|
||||
This allows you to allow imports from a whole organization or only
|
||||
allow specific packages within a repository. It is recommended to use prefix
|
||||
matching as it is faster than glob matching. The fewer glob matches the better.
|
||||
|
@ -24,7 +24,7 @@ The following is an example configuration file.
|
|||
|
||||
```json
|
||||
{
|
||||
"type": "whitelist",
|
||||
"type": "allowlist",
|
||||
"packages": ["github.com/OpenPeeDeeP/depguard"],
|
||||
"packageErrorMessages": {
|
||||
"github.com/OpenPeeDeeP/depguards": "Please use \"github.com/OpenPeeDeeP/depguard\","
|
||||
|
@ -34,14 +34,48 @@ The following is an example configuration file.
|
|||
}
|
||||
```
|
||||
|
||||
- `type` can be either `whitelist` or `blacklist`. This check is case insensitive.
|
||||
If not specified the default is `blacklist`.
|
||||
- `type` can be either `allowlist` or `denylist`. This check is case insensitive.
|
||||
If not specified the default is `denylist`. The values `whitelist` and `blacklist`
|
||||
are also accepted for backwards compatibility.
|
||||
- `packages` is a list of packages for the list type specified.
|
||||
- `packageErrorMessages` is a mapping from packages to the error message to display
|
||||
- `inTests` is a list of packages allowed/disallowed only in test files.
|
||||
- Set `includeGoStdLib` (`includeGoRoot` for backwards compatability) to true if you want to check the list against standard lib.
|
||||
- Set `includeGoStdLib` (`includeGoRoot` for backwards compatibility) to true if you want to check the list against standard lib.
|
||||
If not specified the default is false.
|
||||
|
||||
### Ignore File Rules
|
||||
|
||||
The configuration also allows us to specify rules to ignore certain files considered by the linter. This means that we need not apply package import checks across our entire code base.
|
||||
|
||||
For example, consider the following configuration to block a test package:
|
||||
```json
|
||||
{
|
||||
"type": "denylist",
|
||||
"packages": ["github.com/stretchr/testify"],
|
||||
"inTests": ["github.com/stretchr/testify"]
|
||||
}
|
||||
```
|
||||
|
||||
We can use a `ignoreFileRules` field to write a configuration that only considers test files:
|
||||
```json
|
||||
{
|
||||
"type": "denylist",
|
||||
"packages": ["github.com/stretchr/testify"],
|
||||
"ignoreFileRules": ["!**/*_test.go"]
|
||||
}
|
||||
```
|
||||
|
||||
Or if we wanted to consider only non-test files:
|
||||
```json
|
||||
{
|
||||
"type": "denylist",
|
||||
"packages": ["github.com/stretchr/testify"],
|
||||
"ignoreFileRules": ["**/*_test.go"]
|
||||
}
|
||||
```
|
||||
|
||||
Like the `packages` field, the `ignoreFileRules` field can accept both string prefixes and string glob patterns. Note in the first example above, the use of the `!` character in front of the rule. This is a special character which signals that the linter should negate the rule. This allows for more precise control, but it is only available for glob patterns.
|
||||
|
||||
## Gometalinter
|
||||
|
||||
The binary installation of this linter can be used with
|
||||
|
@ -73,5 +107,5 @@ gometalinter --linter='depguard:depguard -c path/to/config.json:PATH:LINE:COL:ME
|
|||
## Golangci-lint
|
||||
|
||||
This linter was built with
|
||||
[Golangci-lint](https://github.com/golangci/golangci-lint) in mind. It is compatable
|
||||
[Golangci-lint](https://github.com/golangci/golangci-lint) in mind. It is compatible
|
||||
and read their docs to see how to implement all their linters, including this one.
|
||||
|
|
82
vendor/github.com/OpenPeeDeeP/depguard/depguard.go
generated
vendored
82
vendor/github.com/OpenPeeDeeP/depguard/depguard.go
generated
vendored
|
@ -25,6 +25,8 @@ const (
|
|||
// StringToListType makes it easier to turn a string into a ListType.
|
||||
// It assumes that the string representation is lower case.
|
||||
var StringToListType = map[string]ListType{
|
||||
"allowlist": LTWhitelist,
|
||||
"denylist": LTBlacklist,
|
||||
"whitelist": LTWhitelist,
|
||||
"blacklist": LTBlacklist,
|
||||
}
|
||||
|
@ -35,6 +37,12 @@ type Issue struct {
|
|||
Position token.Position
|
||||
}
|
||||
|
||||
// Wrapper for glob patterns that allows for custom negation
|
||||
type negatableGlob struct {
|
||||
g glob.Glob
|
||||
negate bool
|
||||
}
|
||||
|
||||
// Depguard checks imports to make sure they follow the given list and constraints.
|
||||
type Depguard struct {
|
||||
ListType ListType
|
||||
|
@ -48,6 +56,10 @@ type Depguard struct {
|
|||
prefixTestPackages []string
|
||||
globTestPackages []glob.Glob
|
||||
|
||||
IgnoreFileRules []string
|
||||
prefixIgnoreFileRules []string
|
||||
globIgnoreFileRules []negatableGlob
|
||||
|
||||
prefixRoot []string
|
||||
}
|
||||
|
||||
|
@ -69,6 +81,9 @@ func (dg *Depguard) Run(config *loader.Config, prog *loader.Program) ([]*Issue,
|
|||
var issues []*Issue
|
||||
for pkg, positions := range directImports {
|
||||
for _, pos := range positions {
|
||||
if ignoreFile(pos.Filename, dg.prefixIgnoreFileRules, dg.globIgnoreFileRules) {
|
||||
continue
|
||||
}
|
||||
|
||||
prefixList, globList := dg.prefixPackages, dg.globPackages
|
||||
if len(dg.TestPackages) > 0 && strings.Index(pos.Filename, "_test.go") != -1 {
|
||||
|
@ -119,6 +134,32 @@ func (dg *Depguard) initialize(config *loader.Config, prog *loader.Program) erro
|
|||
// Sort the test packages so we can have a faster search in the array
|
||||
sort.Strings(dg.prefixTestPackages)
|
||||
|
||||
// parse ignore file rules
|
||||
for _, rule := range dg.IgnoreFileRules {
|
||||
if strings.ContainsAny(rule, "!?*[]{}") {
|
||||
ng := negatableGlob{}
|
||||
if strings.HasPrefix(rule, "!") {
|
||||
ng.negate = true
|
||||
rule = rule[1:] // Strip out the leading '!'
|
||||
} else {
|
||||
ng.negate = false
|
||||
}
|
||||
|
||||
g, err := glob.Compile(rule, '/')
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ng.g = g
|
||||
|
||||
dg.globIgnoreFileRules = append(dg.globIgnoreFileRules, ng)
|
||||
} else {
|
||||
dg.prefixIgnoreFileRules = append(dg.prefixIgnoreFileRules, rule)
|
||||
}
|
||||
}
|
||||
|
||||
// Sort the rules so we can have a faster search in the array
|
||||
sort.Strings(dg.prefixIgnoreFileRules)
|
||||
|
||||
if !dg.IncludeGoRoot {
|
||||
var err error
|
||||
dg.prefixRoot, err = listRootPrefixs(config.Build)
|
||||
|
@ -158,30 +199,49 @@ func (dg *Depguard) createImportMap(prog *loader.Program) (map[string][]token.Po
|
|||
return importMap, nil
|
||||
}
|
||||
|
||||
func pkgInList(pkg string, prefixList []string, globList []glob.Glob) bool {
|
||||
if pkgInPrefixList(pkg, prefixList) {
|
||||
func ignoreFile(filename string, prefixList []string, negatableGlobList []negatableGlob) bool {
|
||||
if strInPrefixList(filename, prefixList) {
|
||||
return true
|
||||
}
|
||||
return pkgInGlobList(pkg, globList)
|
||||
return strInNegatableGlobList(filename, negatableGlobList)
|
||||
}
|
||||
|
||||
func pkgInPrefixList(pkg string, prefixList []string) bool {
|
||||
// Idx represents where in the package slice the passed in package would go
|
||||
func pkgInList(pkg string, prefixList []string, globList []glob.Glob) bool {
|
||||
if strInPrefixList(pkg, prefixList) {
|
||||
return true
|
||||
}
|
||||
return strInGlobList(pkg, globList)
|
||||
}
|
||||
|
||||
func strInPrefixList(str string, prefixList []string) bool {
|
||||
// Idx represents where in the prefix slice the passed in string would go
|
||||
// when sorted. -1 Just means that it would be at the very front of the slice.
|
||||
idx := sort.Search(len(prefixList), func(i int) bool {
|
||||
return prefixList[i] > pkg
|
||||
return prefixList[i] > str
|
||||
}) - 1
|
||||
// This means that the package passed in has no way to be prefixed by anything
|
||||
// in the package list as it is already smaller then everything
|
||||
// This means that the string passed in has no way to be prefixed by anything
|
||||
// in the prefix list as it is already smaller then everything
|
||||
if idx == -1 {
|
||||
return false
|
||||
}
|
||||
return strings.HasPrefix(pkg, prefixList[idx])
|
||||
return strings.HasPrefix(str, prefixList[idx])
|
||||
}
|
||||
|
||||
func pkgInGlobList(pkg string, globList []glob.Glob) bool {
|
||||
func strInGlobList(str string, globList []glob.Glob) bool {
|
||||
for _, g := range globList {
|
||||
if g.Match(pkg) {
|
||||
if g.Match(str) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func strInNegatableGlobList(str string, negatableGlobList []negatableGlob) bool {
|
||||
for _, ng := range negatableGlobList {
|
||||
// Return true when:
|
||||
// - Match is true and negate is off
|
||||
// - Match is false and negate is on
|
||||
if ng.g.Match(str) != ng.negate {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
|
1
vendor/github.com/OpenPeeDeeP/depguard/go.mod
generated
vendored
1
vendor/github.com/OpenPeeDeeP/depguard/go.mod
generated
vendored
|
@ -5,5 +5,6 @@ go 1.13
|
|||
require (
|
||||
github.com/gobwas/glob v0.2.3
|
||||
github.com/kisielk/gotool v1.0.0
|
||||
github.com/stretchr/testify v1.7.0 // indirect
|
||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b
|
||||
)
|
||||
|
|
10
vendor/github.com/OpenPeeDeeP/depguard/go.sum
generated
vendored
10
vendor/github.com/OpenPeeDeeP/depguard/go.sum
generated
vendored
|
@ -1,6 +1,16 @@
|
|||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b h1:7tibmaEqrQYA+q6ri7NQjuxqSwechjtDHKq6/e85S38=
|
||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
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=
|
||||
|
|
26
vendor/github.com/ashanbrown/forbidigo/forbidigo/forbidigo.go
generated
vendored
26
vendor/github.com/ashanbrown/forbidigo/forbidigo/forbidigo.go
generated
vendored
|
@ -24,10 +24,15 @@ type UsedIssue struct {
|
|||
identifier string
|
||||
pattern string
|
||||
position token.Position
|
||||
customMsg string
|
||||
}
|
||||
|
||||
func (a UsedIssue) Details() string {
|
||||
return fmt.Sprintf("use of `%s` forbidden by pattern `%s`", a.identifier, a.pattern)
|
||||
explanation := fmt.Sprintf(` because %q`, a.customMsg)
|
||||
if a.customMsg == "" {
|
||||
explanation = fmt.Sprintf(" by pattern `%s`", a.pattern)
|
||||
}
|
||||
return fmt.Sprintf("use of `%s` forbidden", a.identifier) + explanation
|
||||
}
|
||||
|
||||
func (a UsedIssue) Position() token.Position {
|
||||
|
@ -36,13 +41,13 @@ func (a UsedIssue) Position() token.Position {
|
|||
|
||||
func (a UsedIssue) String() string { return toString(a) }
|
||||
|
||||
func toString(i Issue) string {
|
||||
func toString(i UsedIssue) string {
|
||||
return fmt.Sprintf("%s at %s", i.Details(), i.Position())
|
||||
}
|
||||
|
||||
type Linter struct {
|
||||
cfg config
|
||||
patterns []*regexp.Regexp
|
||||
patterns []*pattern
|
||||
}
|
||||
|
||||
func DefaultPatterns() []string {
|
||||
|
@ -65,13 +70,13 @@ func NewLinter(patterns []string, options ...Option) (*Linter, error) {
|
|||
if len(patterns) == 0 {
|
||||
patterns = DefaultPatterns()
|
||||
}
|
||||
compiledPatterns := make([]*regexp.Regexp, 0, len(patterns))
|
||||
for _, p := range patterns {
|
||||
re, err := regexp.Compile(p)
|
||||
compiledPatterns := make([]*pattern, 0, len(patterns))
|
||||
for _, ptrn := range patterns {
|
||||
p, err := parse(ptrn)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to compile pattern `%s`: %s", p, err)
|
||||
return nil, err
|
||||
}
|
||||
compiledPatterns = append(compiledPatterns, re)
|
||||
compiledPatterns = append(compiledPatterns, p)
|
||||
}
|
||||
return &Linter{
|
||||
cfg: cfg,
|
||||
|
@ -158,11 +163,12 @@ func (v *visitor) Visit(node ast.Node) ast.Visitor {
|
|||
return v
|
||||
}
|
||||
for _, p := range v.linter.patterns {
|
||||
if p.MatchString(v.textFor(node)) && !v.permit(node) {
|
||||
if p.pattern.MatchString(v.textFor(node)) && !v.permit(node) {
|
||||
v.issues = append(v.issues, UsedIssue{
|
||||
identifier: v.textFor(node),
|
||||
pattern: p.String(),
|
||||
pattern: p.pattern.String(),
|
||||
position: v.fset.Position(node.Pos()),
|
||||
customMsg: p.msg,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
43
vendor/github.com/ashanbrown/forbidigo/forbidigo/patterns.go
generated
vendored
Normal file
43
vendor/github.com/ashanbrown/forbidigo/forbidigo/patterns.go
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
package forbidigo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"regexp/syntax"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type pattern struct {
|
||||
pattern *regexp.Regexp
|
||||
msg string
|
||||
}
|
||||
|
||||
func parse(ptrn string) (*pattern, error) {
|
||||
ptrnRe, err := regexp.Compile(ptrn)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to compile pattern `%s`: %s", ptrn, err)
|
||||
}
|
||||
re, err := syntax.Parse(ptrn, syntax.Perl)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to parse pattern `%s`: %s", ptrn, err)
|
||||
}
|
||||
msg := extractComment(re)
|
||||
return &pattern{pattern: ptrnRe, msg: msg}, nil
|
||||
}
|
||||
|
||||
// Traverse the leaf submatches in the regex tree and extract a comment, if any
|
||||
// is present.
|
||||
func extractComment(re *syntax.Regexp) string {
|
||||
for _, sub := range re.Sub {
|
||||
if len(sub.Sub) > 0 {
|
||||
if comment := extractComment(sub); comment != "" {
|
||||
return comment
|
||||
}
|
||||
}
|
||||
subStr := sub.String()
|
||||
if strings.HasPrefix(subStr, "#") {
|
||||
return strings.TrimSpace(strings.TrimPrefix(subStr, "#"))
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
25
vendor/github.com/ashanbrown/makezero/makezero/makezero.go
generated
vendored
25
vendor/github.com/ashanbrown/makezero/makezero/makezero.go
generated
vendored
|
@ -12,6 +12,13 @@ import (
|
|||
"regexp"
|
||||
)
|
||||
|
||||
// a decl might include multiple var,
|
||||
// so var name with decl make final uniq obj
|
||||
type uniqDecl struct {
|
||||
varName string
|
||||
decl interface{}
|
||||
}
|
||||
|
||||
type Issue interface {
|
||||
Details() string
|
||||
Position() token.Position
|
||||
|
@ -58,7 +65,7 @@ type visitor struct {
|
|||
comments []*ast.CommentGroup // comments to apply during this visit
|
||||
info *types.Info
|
||||
|
||||
nonZeroLengthSliceDecls map[interface{}]struct{}
|
||||
nonZeroLengthSliceDecls map[uniqDecl]struct{}
|
||||
fset *token.FileSet
|
||||
issues []Issue
|
||||
}
|
||||
|
@ -81,7 +88,7 @@ func (l Linter) Run(fset *token.FileSet, info *types.Info, nodes ...ast.Node) ([
|
|||
comments = file.Comments
|
||||
}
|
||||
visitor := visitor{
|
||||
nonZeroLengthSliceDecls: make(map[interface{}]struct{}),
|
||||
nonZeroLengthSliceDecls: make(map[uniqDecl]struct{}),
|
||||
initLenMustBeZero: l.initLenMustBeZero,
|
||||
info: info,
|
||||
fset: fset,
|
||||
|
@ -116,9 +123,9 @@ func (v *visitor) Visit(node ast.Node) ast.Visitor {
|
|||
if len(right.Args) == 2 {
|
||||
// ignore if not a slice or it has explicit zero length
|
||||
if !v.isSlice(right.Args[0]) {
|
||||
break
|
||||
continue
|
||||
} else if lit, ok := right.Args[1].(*ast.BasicLit); ok && lit.Kind == token.INT && lit.Value == "0" {
|
||||
break
|
||||
continue
|
||||
}
|
||||
if v.initLenMustBeZero && !v.hasNoLintOnSameLine(fun) {
|
||||
v.issues = append(v.issues, MustHaveNonZeroInitLenIssue{
|
||||
|
@ -148,7 +155,10 @@ func (v *visitor) hasNonZeroInitialLength(ident *ast.Ident) bool {
|
|||
ident.Name, v.fset.Position(ident.Pos()).String())
|
||||
return false
|
||||
}
|
||||
_, exists := v.nonZeroLengthSliceDecls[ident.Obj.Decl]
|
||||
_, exists := v.nonZeroLengthSliceDecls[uniqDecl{
|
||||
varName: ident.Obj.Name,
|
||||
decl: ident.Obj.Decl,
|
||||
}]
|
||||
return exists
|
||||
}
|
||||
|
||||
|
@ -160,7 +170,10 @@ func (v *visitor) recordNonZeroLengthSlices(node ast.Node) {
|
|||
if ident.Obj == nil {
|
||||
return
|
||||
}
|
||||
v.nonZeroLengthSliceDecls[ident.Obj.Decl] = struct{}{}
|
||||
v.nonZeroLengthSliceDecls[uniqDecl{
|
||||
varName: ident.Obj.Name,
|
||||
decl: ident.Obj.Decl,
|
||||
}] = struct{}{}
|
||||
}
|
||||
|
||||
func (v *visitor) isSlice(node ast.Node) bool {
|
||||
|
|
4
vendor/github.com/blizzy78/varnamelen/.editorconfig
generated
vendored
4
vendor/github.com/blizzy78/varnamelen/.editorconfig
generated
vendored
|
@ -7,3 +7,7 @@ insert_final_newline = true
|
|||
indent_style = tab
|
||||
indent_size = 4
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[**/*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
|
45
vendor/github.com/blizzy78/varnamelen/.golangci.yml
generated
vendored
45
vendor/github.com/blizzy78/varnamelen/.golangci.yml
generated
vendored
|
@ -1,20 +1,55 @@
|
|||
linters:
|
||||
enable:
|
||||
- asciicheck
|
||||
- bodyclose
|
||||
- cyclop
|
||||
- durationcheck
|
||||
- errname
|
||||
- errorlint
|
||||
- exportloopref
|
||||
- forcetypeassert
|
||||
- gocognit
|
||||
- gocritic
|
||||
- gocyclo
|
||||
- goerr113
|
||||
- golint
|
||||
- interfacer
|
||||
- gofmt
|
||||
- goprintffuncname
|
||||
- gosec
|
||||
- ifshort
|
||||
- nakedret
|
||||
- nestif
|
||||
- nilerr
|
||||
- noctx
|
||||
- nolintlint
|
||||
- prealloc
|
||||
- predeclared
|
||||
- promlinter
|
||||
- revive
|
||||
- rowserrcheck
|
||||
- sqlclosecheck
|
||||
- stylecheck
|
||||
- thelper
|
||||
- tparallel
|
||||
- unconvert
|
||||
- unparam
|
||||
- varnamelen
|
||||
- wastedassign
|
||||
- wrapcheck
|
||||
- wsl
|
||||
|
||||
linters-settings:
|
||||
gocognit:
|
||||
min-complexity: 15
|
||||
gocyclo:
|
||||
min-complexity: 10
|
||||
nakedret:
|
||||
max-func-lines: 0
|
||||
nolintlint:
|
||||
allow-unused: false
|
||||
allow-leading-space: false
|
||||
require-explanation: true
|
||||
require-specific: true
|
||||
unused:
|
||||
go: 1.16
|
||||
varnamelen:
|
||||
check-return: true
|
||||
ignore-type-assert-ok: true
|
||||
ignore-map-index-ok: true
|
||||
ignore-chan-recv-ok: true
|
||||
|
|
7
vendor/github.com/blizzy78/varnamelen/.travis.yml
generated
vendored
7
vendor/github.com/blizzy78/varnamelen/.travis.yml
generated
vendored
|
@ -1,7 +0,0 @@
|
|||
language: go
|
||||
go:
|
||||
- "1.15"
|
||||
before_script:
|
||||
- go get github.com/mattn/goveralls
|
||||
after_script:
|
||||
- goveralls -service=travis-ci
|
56
vendor/github.com/blizzy78/varnamelen/README.md
generated
vendored
56
vendor/github.com/blizzy78/varnamelen/README.md
generated
vendored
|
@ -1,4 +1,4 @@
|
|||
[![Build Status](https://api.travis-ci.com/blizzy78/varnamelen.svg?branch=master)](https://app.travis-ci.com/github/blizzy78/varnamelen) [![Coverage Status](https://coveralls.io/repos/github/blizzy78/varnamelen/badge.svg?branch=master)](https://coveralls.io/github/blizzy78/varnamelen?branch=master) [![GoDoc](https://pkg.go.dev/badge/github.com/blizzy78/varnamelen)](https://pkg.go.dev/github.com/blizzy78/varnamelen)
|
||||
[![GoDoc](https://pkg.go.dev/badge/github.com/blizzy78/varnamelen)](https://pkg.go.dev/github.com/blizzy78/varnamelen)
|
||||
|
||||
|
||||
varnamelen
|
||||
|
@ -25,6 +25,48 @@ test.go:6:2: variable name 'i' is too short for the scope of its usage (varnamel
|
|||
```
|
||||
|
||||
|
||||
golangci-lint Integration
|
||||
-------------------------
|
||||
|
||||
varnamelen is integrated into [golangci-lint] (though it may not always be the most recent version.)
|
||||
|
||||
Example configuration for golangci-lint:
|
||||
|
||||
```yaml
|
||||
linters-settings:
|
||||
varnamelen:
|
||||
# The longest distance, in source lines, that is being considered a "small scope." (defaults to 5)
|
||||
# Variables used in at most this many lines will be ignored.
|
||||
max-distance: 5
|
||||
# The minimum length of a variable's name that is considered "long." (defaults to 3)
|
||||
# Variable names that are at least this long will be ignored.
|
||||
min-name-length: 3
|
||||
# Check method receiver names. (defaults to false)
|
||||
check-receiver: false
|
||||
# Check named return values. (defaults to false)
|
||||
check-return: false
|
||||
# Ignore "ok" variables that hold the bool return value of a type assertion. (defaults to false)
|
||||
ignore-type-assert-ok: false
|
||||
# Ignore "ok" variables that hold the bool return value of a map index. (defaults to false)
|
||||
ignore-map-index-ok: false
|
||||
# Ignore "ok" variables that hold the bool return value of a channel receive. (defaults to false)
|
||||
ignore-chan-recv-ok: false
|
||||
# Optional list of variable names that should be ignored completely. (defaults to empty list)
|
||||
ignore-names:
|
||||
- err
|
||||
# Optional list of variable declarations that should be ignored completely. (defaults to empty list)
|
||||
# Entries must be in the form of "<variable name> <type>" or "<variable name> *<type>" for
|
||||
# variables, or "const <name>" for constants.
|
||||
ignore-decls:
|
||||
- c echo.Context
|
||||
- t testing.T
|
||||
- f *foo.Bar
|
||||
- e error
|
||||
- i int
|
||||
- const C
|
||||
```
|
||||
|
||||
|
||||
Standalone Usage
|
||||
----------------
|
||||
|
||||
|
@ -63,8 +105,16 @@ Flags:
|
|||
apply all suggested fixes
|
||||
-flags
|
||||
print analyzer flags in JSON
|
||||
-ignoreChanRecvOk
|
||||
ignore 'ok' variables that hold the bool return value of a channel receive
|
||||
-ignoreDecls value
|
||||
comma-separated list of ignored variable declarations
|
||||
-ignoreMapIndexOk
|
||||
ignore 'ok' variables that hold the bool return value of a map index
|
||||
-ignoreNames value
|
||||
comma-separated list of ignored variable names
|
||||
-ignoreTypeAssertOk
|
||||
ignore 'ok' variables that hold the bool return value of a type assertion
|
||||
-json
|
||||
emit JSON output
|
||||
-maxDistance int
|
||||
|
@ -87,3 +137,7 @@ License
|
|||
-------
|
||||
|
||||
This package is licensed under the MIT license.
|
||||
|
||||
|
||||
|
||||
[golangci-lint]: https://github.com/golangci/golangci-lint
|
||||
|
|
98
vendor/github.com/blizzy78/varnamelen/flags.go
generated
vendored
Normal file
98
vendor/github.com/blizzy78/varnamelen/flags.go
generated
vendored
Normal file
|
@ -0,0 +1,98 @@
|
|||
package varnamelen
|
||||
|
||||
import "strings"
|
||||
|
||||
// stringsValue is the value of a list-of-strings flag.
|
||||
type stringsValue struct {
|
||||
Values []string
|
||||
}
|
||||
|
||||
// declarationsValue is the value of a list-of-declarations flag.
|
||||
type declarationsValue struct {
|
||||
Values []declaration
|
||||
}
|
||||
|
||||
// Set implements Value.
|
||||
func (sv *stringsValue) Set(values string) error {
|
||||
if strings.TrimSpace(values) == "" {
|
||||
sv.Values = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
parts := strings.Split(values, ",")
|
||||
|
||||
sv.Values = make([]string, len(parts))
|
||||
|
||||
for i, part := range parts {
|
||||
sv.Values[i] = strings.TrimSpace(part)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// String implements Value.
|
||||
func (sv *stringsValue) String() string {
|
||||
return strings.Join(sv.Values, ",")
|
||||
}
|
||||
|
||||
// contains returns true if sv contains s.
|
||||
func (sv *stringsValue) contains(s string) bool {
|
||||
for _, v := range sv.Values {
|
||||
if v == s {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Set implements Value.
|
||||
func (dv *declarationsValue) Set(values string) error {
|
||||
if strings.TrimSpace(values) == "" {
|
||||
dv.Values = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
parts := strings.Split(values, ",")
|
||||
|
||||
dv.Values = make([]declaration, len(parts))
|
||||
|
||||
for idx, part := range parts {
|
||||
dv.Values[idx] = parseDeclaration(strings.TrimSpace(part))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// String implements Value.
|
||||
func (dv *declarationsValue) String() string {
|
||||
parts := make([]string, len(dv.Values))
|
||||
|
||||
for idx, val := range dv.Values {
|
||||
parts[idx] = val.name + " " + val.typ
|
||||
}
|
||||
|
||||
return strings.Join(parts, ",")
|
||||
}
|
||||
|
||||
// matchVariable returns true if vari matches any of the declarations in dv.
|
||||
func (dv *declarationsValue) matchVariable(vari variable) bool {
|
||||
for _, decl := range dv.Values {
|
||||
if vari.match(decl) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// matchParameter returns true if param matches any of the declarations in dv.
|
||||
func (dv *declarationsValue) matchParameter(param parameter) bool {
|
||||
for _, decl := range dv.Values {
|
||||
if param.match(decl) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
7
vendor/github.com/blizzy78/varnamelen/go.mod
generated
vendored
7
vendor/github.com/blizzy78/varnamelen/go.mod
generated
vendored
|
@ -1,10 +1,9 @@
|
|||
module github.com/blizzy78/varnamelen
|
||||
|
||||
go 1.15
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/matryer/is v1.4.0
|
||||
golang.org/x/mod v0.5.0 // indirect
|
||||
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 // indirect
|
||||
golang.org/x/tools v0.1.6
|
||||
golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c // indirect
|
||||
golang.org/x/tools v0.1.9
|
||||
)
|
||||
|
|
20
vendor/github.com/blizzy78/varnamelen/go.sum
generated
vendored
20
vendor/github.com/blizzy78/varnamelen/go.sum
generated
vendored
|
@ -1,30 +1,30 @@
|
|||
github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
|
||||
github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
|
||||
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q=
|
||||
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
|
||||
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 h1:J27LZFQBFoihqXoegpscI10HpjZ7B5WQLLKL2FZXQKw=
|
||||
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c h1:+8miTPjMCTXwih7BQmvWwd0PjdBZq2MKp/qQaahSzEM=
|
||||
golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.6 h1:SIasE1FVIQOWz2GEAHFOmoW7xchJcqlucjSULTL0Ag4=
|
||||
golang.org/x/tools v0.1.6/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
|
||||
golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8=
|
||||
golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
|
|
583
vendor/github.com/blizzy78/varnamelen/varnamelen.go
generated
vendored
583
vendor/github.com/blizzy78/varnamelen/varnamelen.go
generated
vendored
|
@ -2,6 +2,8 @@ package varnamelen
|
|||
|
||||
import (
|
||||
"go/ast"
|
||||
"go/token"
|
||||
"go/types"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/tools/go/analysis"
|
||||
|
@ -27,11 +29,18 @@ type varNameLen struct {
|
|||
|
||||
// checkReturn determines whether named return values should be checked.
|
||||
checkReturn bool
|
||||
}
|
||||
|
||||
// stringsValue is the value of a list-of-strings flag.
|
||||
type stringsValue struct {
|
||||
Values []string
|
||||
// ignoreTypeAssertOk determines whether "ok" variables that hold the bool return value of a type assertion should be ignored.
|
||||
ignoreTypeAssertOk bool
|
||||
|
||||
// ignoreMapIndexOk determines whether "ok" variables that hold the bool return value of a map index should be ignored.
|
||||
ignoreMapIndexOk bool
|
||||
|
||||
// ignoreChannelReceiveOk determines whether "ok" variables that hold the bool return value of a channel receive should be ignored.
|
||||
ignoreChannelReceiveOk bool
|
||||
|
||||
// ignoreDeclarations is an optional list of variable declarations that should be ignored completely.
|
||||
ignoreDeclarations declarationsValue
|
||||
}
|
||||
|
||||
// variable represents a declared variable.
|
||||
|
@ -39,8 +48,17 @@ type variable struct {
|
|||
// name is the name of the variable.
|
||||
name string
|
||||
|
||||
// constant is true if the variable is actually a constant.
|
||||
constant bool
|
||||
|
||||
// typ is the type of the variable.
|
||||
typ string
|
||||
|
||||
// assign is the assign statement that declares the variable.
|
||||
assign *ast.AssignStmt
|
||||
|
||||
// valueSpec is the value specification that declares the variable.
|
||||
valueSpec *ast.ValueSpec
|
||||
}
|
||||
|
||||
// parameter represents a declared function or method parameter.
|
||||
|
@ -48,10 +66,39 @@ type parameter struct {
|
|||
// name is the name of the parameter.
|
||||
name string
|
||||
|
||||
// typ is the type of the parameter.
|
||||
typ string
|
||||
|
||||
// field is the declaration of the parameter.
|
||||
field *ast.Field
|
||||
}
|
||||
|
||||
// declaration is a variable declaration.
|
||||
type declaration struct {
|
||||
// name is the name of the variable.
|
||||
name string
|
||||
|
||||
// constant is true if the variable is actually a constant.
|
||||
constant bool
|
||||
|
||||
// typ is the type of the variable. Not used for constants.
|
||||
typ string
|
||||
}
|
||||
|
||||
// importDeclaration is an import declaration.
|
||||
type importDeclaration struct {
|
||||
// name is the short name or alias for the imported package. This is either the package's default name,
|
||||
// or the alias specified in the import statement.
|
||||
// Not used if self is true.
|
||||
name string
|
||||
|
||||
// path is the full path to the imported package.
|
||||
path string
|
||||
|
||||
// self is true when this is an implicit import declaration for the current package.
|
||||
self bool
|
||||
}
|
||||
|
||||
const (
|
||||
// defaultMaxDistance is the default value for the maximum distance between the declaration of a variable and its usage
|
||||
// that is considered a "small scope."
|
||||
|
@ -61,12 +108,23 @@ const (
|
|||
defaultMinNameLength = 3
|
||||
)
|
||||
|
||||
// conventionalDecls is a list of conventional variable declarations.
|
||||
var conventionalDecls = []declaration{
|
||||
parseDeclaration("t *testing.T"),
|
||||
parseDeclaration("b *testing.B"),
|
||||
parseDeclaration("tb testing.TB"),
|
||||
parseDeclaration("pb *testing.PB"),
|
||||
parseDeclaration("m *testing.M"),
|
||||
parseDeclaration("ctx context.Context"),
|
||||
}
|
||||
|
||||
// NewAnalyzer returns a new analyzer that checks variable name length.
|
||||
func NewAnalyzer() *analysis.Analyzer {
|
||||
vnl := varNameLen{
|
||||
maxDistance: defaultMaxDistance,
|
||||
minNameLength: defaultMinNameLength,
|
||||
ignoreNames: stringsValue{},
|
||||
maxDistance: defaultMaxDistance,
|
||||
minNameLength: defaultMinNameLength,
|
||||
ignoreNames: stringsValue{},
|
||||
ignoreDeclarations: declarationsValue{},
|
||||
}
|
||||
|
||||
analyzer := analysis.Analyzer{
|
||||
|
@ -91,6 +149,10 @@ func NewAnalyzer() *analysis.Analyzer {
|
|||
analyzer.Flags.Var(&vnl.ignoreNames, "ignoreNames", "comma-separated list of ignored variable names")
|
||||
analyzer.Flags.BoolVar(&vnl.checkReceiver, "checkReceiver", false, "check method receiver names")
|
||||
analyzer.Flags.BoolVar(&vnl.checkReturn, "checkReturn", false, "check named return values")
|
||||
analyzer.Flags.BoolVar(&vnl.ignoreTypeAssertOk, "ignoreTypeAssertOk", false, "ignore 'ok' variables that hold the bool return value of a type assertion")
|
||||
analyzer.Flags.BoolVar(&vnl.ignoreMapIndexOk, "ignoreMapIndexOk", false, "ignore 'ok' variables that hold the bool return value of a map index")
|
||||
analyzer.Flags.BoolVar(&vnl.ignoreChannelReceiveOk, "ignoreChanRecvOk", false, "ignore 'ok' variables that hold the bool return value of a channel receive")
|
||||
analyzer.Flags.Var(&vnl.ignoreDeclarations, "ignoreDecls", "comma-separated list of ignored variable declarations")
|
||||
|
||||
return &analyzer
|
||||
}
|
||||
|
@ -99,55 +161,132 @@ func NewAnalyzer() *analysis.Analyzer {
|
|||
func (v *varNameLen) run(pass *analysis.Pass) {
|
||||
varToDist, paramToDist, returnToDist := v.distances(pass)
|
||||
|
||||
v.checkVariables(pass, varToDist)
|
||||
v.checkParams(pass, paramToDist)
|
||||
v.checkReturns(pass, returnToDist)
|
||||
}
|
||||
|
||||
// checkVariables applies v to variables in varToDist.
|
||||
func (v *varNameLen) checkVariables(pass *analysis.Pass, varToDist map[variable]int) {
|
||||
for variable, dist := range varToDist {
|
||||
if v.ignoreNames.contains(variable.name) {
|
||||
continue
|
||||
}
|
||||
|
||||
if v.ignoreDeclarations.matchVariable(variable) {
|
||||
continue
|
||||
}
|
||||
|
||||
if v.checkNameAndDistance(variable.name, dist) {
|
||||
continue
|
||||
}
|
||||
pass.Reportf(variable.assign.Pos(), "variable name '%s' is too short for the scope of its usage", variable.name)
|
||||
}
|
||||
|
||||
for param, dist := range paramToDist {
|
||||
if param.isConventional() {
|
||||
if v.checkTypeAssertOk(variable) {
|
||||
continue
|
||||
}
|
||||
if v.checkNameAndDistance(param.name, dist) {
|
||||
continue
|
||||
}
|
||||
pass.Reportf(param.field.Pos(), "parameter name '%s' is too short for the scope of its usage", param.name)
|
||||
}
|
||||
|
||||
for param, dist := range returnToDist {
|
||||
if v.checkNameAndDistance(param.name, dist) {
|
||||
if v.checkMapIndexOk(variable) {
|
||||
continue
|
||||
}
|
||||
pass.Reportf(param.field.Pos(), "return value name '%s' is too short for the scope of its usage", param.name)
|
||||
|
||||
if v.checkChannelReceiveOk(variable) {
|
||||
continue
|
||||
}
|
||||
|
||||
if variable.assign != nil {
|
||||
pass.Reportf(variable.assign.Pos(), "%s name '%s' is too short for the scope of its usage", variable.kindName(), variable.name)
|
||||
continue
|
||||
}
|
||||
|
||||
pass.Reportf(variable.valueSpec.Pos(), "%s name '%s' is too short for the scope of its usage", variable.kindName(), variable.name)
|
||||
}
|
||||
}
|
||||
|
||||
// checkNameAndDistance returns true when name or dist are considered "short", or when name is to be ignored.
|
||||
// checkParams applies v to parameters in paramToDist.
|
||||
func (v *varNameLen) checkParams(pass *analysis.Pass, paramToDist map[parameter]int) {
|
||||
for param, dist := range paramToDist {
|
||||
if v.ignoreNames.contains(param.name) {
|
||||
continue
|
||||
}
|
||||
|
||||
if v.ignoreDeclarations.matchParameter(param) {
|
||||
continue
|
||||
}
|
||||
|
||||
if v.checkNameAndDistance(param.name, dist) {
|
||||
continue
|
||||
}
|
||||
|
||||
if param.isConventional() {
|
||||
continue
|
||||
}
|
||||
|
||||
pass.Reportf(param.field.Pos(), "parameter name '%s' is too short for the scope of its usage", param.name)
|
||||
}
|
||||
}
|
||||
|
||||
// checkReturns applies v to named return values in returnToDist.
|
||||
func (v *varNameLen) checkReturns(pass *analysis.Pass, returnToDist map[parameter]int) {
|
||||
for returnValue, dist := range returnToDist {
|
||||
if v.ignoreNames.contains(returnValue.name) {
|
||||
continue
|
||||
}
|
||||
|
||||
if v.ignoreDeclarations.matchParameter(returnValue) {
|
||||
continue
|
||||
}
|
||||
|
||||
if v.checkNameAndDistance(returnValue.name, dist) {
|
||||
continue
|
||||
}
|
||||
|
||||
pass.Reportf(returnValue.field.Pos(), "return value name '%s' is too short for the scope of its usage", returnValue.name)
|
||||
}
|
||||
}
|
||||
|
||||
// checkNameAndDistance returns true if name or dist are considered "short".
|
||||
func (v *varNameLen) checkNameAndDistance(name string, dist int) bool {
|
||||
if len(name) >= v.minNameLength {
|
||||
return true
|
||||
}
|
||||
|
||||
if dist <= v.maxDistance {
|
||||
return true
|
||||
}
|
||||
if v.ignoreNames.contains(name) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// distances maps of variables or parameters and their longest usage distances.
|
||||
// checkTypeAssertOk returns true if "ok" variables that hold the bool return value of a type assertion
|
||||
// should be ignored, and if vari is such a variable.
|
||||
func (v *varNameLen) checkTypeAssertOk(vari variable) bool {
|
||||
return v.ignoreTypeAssertOk && vari.isTypeAssertOk()
|
||||
}
|
||||
|
||||
// checkMapIndexOk returns true if "ok" variables that hold the bool return value of a map index
|
||||
// should be ignored, and if vari is such a variable.
|
||||
func (v *varNameLen) checkMapIndexOk(vari variable) bool {
|
||||
return v.ignoreMapIndexOk && vari.isMapIndexOk()
|
||||
}
|
||||
|
||||
// checkChannelReceiveOk returns true if "ok" variables that hold the bool return value of a channel receive
|
||||
// should be ignored, and if vari is such a variable.
|
||||
func (v *varNameLen) checkChannelReceiveOk(vari variable) bool {
|
||||
return v.ignoreChannelReceiveOk && vari.isChannelReceiveOk()
|
||||
}
|
||||
|
||||
// distances returns maps of variables, parameters, and return values mapping to their longest usage distances.
|
||||
func (v *varNameLen) distances(pass *analysis.Pass) (map[variable]int, map[parameter]int, map[parameter]int) {
|
||||
assignIdents, paramIdents, returnIdents := v.idents(pass)
|
||||
assignIdents, valueSpecIdents, paramIdents, returnIdents, imports := v.identsAndImports(pass)
|
||||
|
||||
varToDist := map[variable]int{}
|
||||
|
||||
for _, ident := range assignIdents {
|
||||
assign := ident.Obj.Decl.(*ast.AssignStmt)
|
||||
assign := ident.Obj.Decl.(*ast.AssignStmt) //nolint:forcetypeassert // check is done in identsAndImports
|
||||
|
||||
variable := variable{
|
||||
name: ident.Name,
|
||||
typ: shortTypeName(pass.TypesInfo.TypeOf(identAssignExpr(ident, assign)), imports),
|
||||
assign: assign,
|
||||
}
|
||||
|
||||
|
@ -156,12 +295,29 @@ func (v *varNameLen) distances(pass *analysis.Pass) (map[variable]int, map[param
|
|||
varToDist[variable] = useLine - declLine
|
||||
}
|
||||
|
||||
for _, ident := range valueSpecIdents {
|
||||
valueSpec := ident.Obj.Decl.(*ast.ValueSpec) //nolint:forcetypeassert // check is done in identsAndImports
|
||||
|
||||
variable := variable{
|
||||
name: ident.Name,
|
||||
constant: ident.Obj.Kind == ast.Con,
|
||||
typ: shortTypeName(pass.TypesInfo.TypeOf(valueSpec.Type), imports),
|
||||
valueSpec: valueSpec,
|
||||
}
|
||||
|
||||
useLine := pass.Fset.Position(ident.NamePos).Line
|
||||
declLine := pass.Fset.Position(valueSpec.Pos()).Line
|
||||
varToDist[variable] = useLine - declLine
|
||||
}
|
||||
|
||||
paramToDist := map[parameter]int{}
|
||||
|
||||
for _, ident := range paramIdents {
|
||||
field := ident.Obj.Decl.(*ast.Field)
|
||||
field := ident.Obj.Decl.(*ast.Field) //nolint:forcetypeassert // check is done in identsAndImports
|
||||
|
||||
param := parameter{
|
||||
name: ident.Name,
|
||||
typ: shortTypeName(pass.TypesInfo.TypeOf(field.Type), imports),
|
||||
field: field,
|
||||
}
|
||||
|
||||
|
@ -173,9 +329,11 @@ func (v *varNameLen) distances(pass *analysis.Pass) (map[variable]int, map[param
|
|||
returnToDist := map[parameter]int{}
|
||||
|
||||
for _, ident := range returnIdents {
|
||||
field := ident.Obj.Decl.(*ast.Field)
|
||||
field := ident.Obj.Decl.(*ast.Field) //nolint:forcetypeassert // check is done in identsAndImports
|
||||
|
||||
param := parameter{
|
||||
name: ident.Name,
|
||||
typ: shortTypeName(pass.TypesInfo.TypeOf(field.Type), imports),
|
||||
field: field,
|
||||
}
|
||||
|
||||
|
@ -187,61 +345,245 @@ func (v *varNameLen) distances(pass *analysis.Pass) (map[variable]int, map[param
|
|||
return varToDist, paramToDist, returnToDist
|
||||
}
|
||||
|
||||
// idents returns Idents referencing assign statements, parameters, and return values, respectively.
|
||||
func (v *varNameLen) idents(pass *analysis.Pass) ([]*ast.Ident, []*ast.Ident, []*ast.Ident) { //nolint:gocognit
|
||||
inspector := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
|
||||
// identsAndImports returns Idents referencing assign statements, value specifications, parameters, and return values, respectively,
|
||||
// as well as import declarations.
|
||||
func (v *varNameLen) identsAndImports(pass *analysis.Pass) ([]*ast.Ident, []*ast.Ident, []*ast.Ident, []*ast.Ident, []importDeclaration) { //nolint:gocognit,cyclop // this is complex stuff
|
||||
inspector := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) //nolint:forcetypeassert // inspect.Analyzer always returns *inspector.Inspector
|
||||
|
||||
filter := []ast.Node{
|
||||
(*ast.Ident)(nil),
|
||||
(*ast.ImportSpec)(nil),
|
||||
(*ast.FuncDecl)(nil),
|
||||
(*ast.Ident)(nil),
|
||||
}
|
||||
|
||||
funcs := []*ast.FuncDecl{}
|
||||
methods := []*ast.FuncDecl{}
|
||||
|
||||
imports := []importDeclaration{}
|
||||
assignIdents := []*ast.Ident{}
|
||||
valueSpecIdents := []*ast.Ident{}
|
||||
paramIdents := []*ast.Ident{}
|
||||
returnIdents := []*ast.Ident{}
|
||||
|
||||
inspector.Preorder(filter, func(node ast.Node) {
|
||||
if f, ok := node.(*ast.FuncDecl); ok {
|
||||
funcs = append(funcs, f)
|
||||
if f.Recv != nil {
|
||||
methods = append(methods, f)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
ident := node.(*ast.Ident)
|
||||
if ident.Obj == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if _, ok := ident.Obj.Decl.(*ast.AssignStmt); ok {
|
||||
assignIdents = append(assignIdents, ident)
|
||||
return
|
||||
}
|
||||
|
||||
if field, ok := ident.Obj.Decl.(*ast.Field); ok {
|
||||
if isReceiver(field, methods) && !v.checkReceiver {
|
||||
switch node2 := node.(type) {
|
||||
case *ast.ImportSpec:
|
||||
decl, ok := importSpecToDecl(node2, pass.Pkg.Imports())
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
if isReturn(field, funcs) {
|
||||
if !v.checkReturn {
|
||||
imports = append(imports, decl)
|
||||
|
||||
case *ast.FuncDecl:
|
||||
funcs = append(funcs, node2)
|
||||
|
||||
if node2.Recv == nil {
|
||||
return
|
||||
}
|
||||
|
||||
methods = append(methods, node2)
|
||||
|
||||
case *ast.Ident:
|
||||
if node2.Obj == nil {
|
||||
return
|
||||
}
|
||||
|
||||
switch objDecl := node2.Obj.Decl.(type) {
|
||||
case *ast.AssignStmt:
|
||||
assignIdents = append(assignIdents, node2)
|
||||
|
||||
case *ast.ValueSpec:
|
||||
valueSpecIdents = append(valueSpecIdents, node2)
|
||||
|
||||
case *ast.Field:
|
||||
if isReceiver(objDecl, methods) && !v.checkReceiver {
|
||||
return
|
||||
}
|
||||
returnIdents = append(returnIdents, ident)
|
||||
return
|
||||
}
|
||||
|
||||
paramIdents = append(paramIdents, ident)
|
||||
if isReturn(objDecl, funcs) {
|
||||
if !v.checkReturn {
|
||||
return
|
||||
}
|
||||
|
||||
returnIdents = append(returnIdents, node2)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
paramIdents = append(paramIdents, node2)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return assignIdents, paramIdents, returnIdents
|
||||
imports = append(imports, importDeclaration{
|
||||
path: pass.Pkg.Path(),
|
||||
self: true,
|
||||
})
|
||||
|
||||
return assignIdents, valueSpecIdents, paramIdents, returnIdents, imports
|
||||
}
|
||||
|
||||
// isReceiver returns true when field is a receiver parameter of any of the given methods.
|
||||
func importSpecToDecl(spec *ast.ImportSpec, imports []*types.Package) (importDeclaration, bool) {
|
||||
path := strings.TrimSuffix(strings.TrimPrefix(spec.Path.Value, "\""), "\"")
|
||||
|
||||
if spec.Name != nil {
|
||||
return importDeclaration{
|
||||
name: spec.Name.Name,
|
||||
path: path,
|
||||
}, true
|
||||
}
|
||||
|
||||
for _, imp := range imports {
|
||||
if imp.Path() == path {
|
||||
return importDeclaration{
|
||||
name: imp.Name(),
|
||||
path: path,
|
||||
}, true
|
||||
}
|
||||
}
|
||||
|
||||
return importDeclaration{}, false
|
||||
}
|
||||
|
||||
// isTypeAssertOk returns true if v is an "ok" variable that holds the bool return value of a type assertion.
|
||||
func (v variable) isTypeAssertOk() bool {
|
||||
if v.name != "ok" {
|
||||
return false
|
||||
}
|
||||
|
||||
if v.assign == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(v.assign.Lhs) != 2 {
|
||||
return false
|
||||
}
|
||||
|
||||
ident, ok := v.assign.Lhs[1].(*ast.Ident)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
if ident.Name != "ok" {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(v.assign.Rhs) != 1 {
|
||||
return false
|
||||
}
|
||||
|
||||
if _, ok := v.assign.Rhs[0].(*ast.TypeAssertExpr); !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// isMapIndexOk returns true if v is an "ok" variable that holds the bool return value of a map index.
|
||||
func (v variable) isMapIndexOk() bool {
|
||||
if v.name != "ok" {
|
||||
return false
|
||||
}
|
||||
|
||||
if v.assign == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(v.assign.Lhs) != 2 {
|
||||
return false
|
||||
}
|
||||
|
||||
ident, ok := v.assign.Lhs[1].(*ast.Ident)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
if ident.Name != "ok" {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(v.assign.Rhs) != 1 {
|
||||
return false
|
||||
}
|
||||
|
||||
if _, ok := v.assign.Rhs[0].(*ast.IndexExpr); !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// isChannelReceiveOk returns true if v is an "ok" variable that holds the bool return value of a channel receive.
|
||||
func (v variable) isChannelReceiveOk() bool {
|
||||
if v.name != "ok" {
|
||||
return false
|
||||
}
|
||||
|
||||
if v.assign == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(v.assign.Lhs) != 2 {
|
||||
return false
|
||||
}
|
||||
|
||||
ident, ok := v.assign.Lhs[1].(*ast.Ident)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
if ident.Name != "ok" {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(v.assign.Rhs) != 1 {
|
||||
return false
|
||||
}
|
||||
|
||||
unary, ok := v.assign.Rhs[0].(*ast.UnaryExpr)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
if unary.Op != token.ARROW {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// match returns true if v matches decl.
|
||||
func (v variable) match(decl declaration) bool {
|
||||
if v.name != decl.name {
|
||||
return false
|
||||
}
|
||||
|
||||
if v.constant != decl.constant {
|
||||
return false
|
||||
}
|
||||
|
||||
if v.constant {
|
||||
return true
|
||||
}
|
||||
|
||||
if v.typ == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
return decl.matchType(v.typ)
|
||||
}
|
||||
|
||||
// kindName returns "constant" if v.constant==true, else "variable".
|
||||
func (v variable) kindName() string {
|
||||
if v.constant {
|
||||
return "constant"
|
||||
}
|
||||
|
||||
return "variable"
|
||||
}
|
||||
|
||||
// isReceiver returns true if field is a receiver parameter of any of the given methods.
|
||||
func isReceiver(field *ast.Field, methods []*ast.FuncDecl) bool {
|
||||
for _, m := range methods {
|
||||
for _, recv := range m.Recv.List {
|
||||
|
@ -250,93 +592,102 @@ func isReceiver(field *ast.Field, methods []*ast.FuncDecl) bool {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// isReturn returns true when field is a return value of any of the given funcs.
|
||||
// isReturn returns true if field is a return value of any of the given funcs.
|
||||
func isReturn(field *ast.Field, funcs []*ast.FuncDecl) bool {
|
||||
for _, f := range funcs {
|
||||
if f.Type.Results == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, r := range f.Type.Results.List {
|
||||
if r == field {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Set implements Value.
|
||||
func (sv *stringsValue) Set(s string) error {
|
||||
sv.Values = strings.Split(s, ",")
|
||||
return nil
|
||||
}
|
||||
|
||||
// String implements Value.
|
||||
func (sv *stringsValue) String() string {
|
||||
return strings.Join(sv.Values, ",")
|
||||
}
|
||||
|
||||
// contains returns true when sv contains s.
|
||||
func (sv *stringsValue) contains(s string) bool {
|
||||
for _, v := range sv.Values {
|
||||
if v == s {
|
||||
// isConventional returns true if p is a conventional Go parameter, such as "ctx context.Context" or
|
||||
// "t *testing.T".
|
||||
func (p parameter) isConventional() bool {
|
||||
for _, decl := range conventionalDecls {
|
||||
if p.match(decl) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// isConventional returns true when p is a conventional Go parameter, such as "ctx context.Context" or
|
||||
// "t *testing.T".
|
||||
func (p parameter) isConventional() bool { //nolint:gocyclo,gocognit
|
||||
switch {
|
||||
case p.name == "t" && p.isPointerType("testing.T"):
|
||||
return true
|
||||
case p.name == "b" && p.isPointerType("testing.B"):
|
||||
return true
|
||||
case p.name == "tb" && p.isType("testing.TB"):
|
||||
return true
|
||||
case p.name == "pb" && p.isPointerType("testing.PB"):
|
||||
return true
|
||||
case p.name == "m" && p.isPointerType("testing.M"):
|
||||
return true
|
||||
case p.name == "ctx" && p.isType("context.Context"):
|
||||
return true
|
||||
default:
|
||||
// match returns whether p matches decl.
|
||||
func (p parameter) match(decl declaration) bool {
|
||||
if p.name != decl.name {
|
||||
return false
|
||||
}
|
||||
|
||||
return decl.matchType(p.typ)
|
||||
}
|
||||
|
||||
// parseDeclaration parses and returns a variable declaration parsed from decl.
|
||||
func parseDeclaration(decl string) declaration {
|
||||
if strings.HasPrefix(decl, "const ") {
|
||||
return declaration{
|
||||
name: strings.TrimPrefix(decl, "const "),
|
||||
constant: true,
|
||||
}
|
||||
}
|
||||
|
||||
parts := strings.SplitN(decl, " ", 2)
|
||||
|
||||
return declaration{
|
||||
name: parts[0],
|
||||
typ: parts[1],
|
||||
}
|
||||
}
|
||||
|
||||
// isType returns true when p is of type typeName.
|
||||
func (p parameter) isType(typeName string) bool {
|
||||
sel, ok := p.field.Type.(*ast.SelectorExpr)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return isType(sel, typeName)
|
||||
// matchType returns true if typ matches d.typ.
|
||||
func (d declaration) matchType(typ string) bool {
|
||||
return d.typ == typ
|
||||
}
|
||||
|
||||
// isPointerType returns true when p is a pointer type of type typeName.
|
||||
func (p parameter) isPointerType(typeName string) bool {
|
||||
star, ok := p.field.Type.(*ast.StarExpr)
|
||||
if !ok {
|
||||
return false
|
||||
// identAssignExpr returns the expression that is assigned to ident.
|
||||
//
|
||||
// TODO: This currently only works for simple one-to-one assignments without the use of multi-values.
|
||||
func identAssignExpr(_ *ast.Ident, assign *ast.AssignStmt) ast.Expr {
|
||||
if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
|
||||
return nil
|
||||
}
|
||||
sel, ok := star.X.(*ast.SelectorExpr)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
return isType(sel, typeName)
|
||||
|
||||
return assign.Rhs[0]
|
||||
}
|
||||
|
||||
// isType returns true when sel is a selector for type typeName.
|
||||
func isType(sel *ast.SelectorExpr, typeName string) bool {
|
||||
ident, ok := sel.X.(*ast.Ident)
|
||||
if !ok {
|
||||
return false
|
||||
// shortTypeName returns the short name of typ, with respect to imports.
|
||||
// For example, if package github.com/matryer/is is imported with alias "x",
|
||||
// and typ represents []*github.com/matryer/is.I, shortTypeName will return "[]*x.I".
|
||||
// For imports without aliases, the package's default name will be used.
|
||||
func shortTypeName(typ types.Type, imports []importDeclaration) string {
|
||||
if typ == nil {
|
||||
return ""
|
||||
}
|
||||
return typeName == ident.Name+"."+sel.Sel.Name
|
||||
|
||||
typStr := typ.String()
|
||||
|
||||
for _, imp := range imports {
|
||||
prefix := imp.path + "."
|
||||
|
||||
if imp.self {
|
||||
typStr = strings.ReplaceAll(typStr, prefix, "")
|
||||
continue
|
||||
}
|
||||
|
||||
typStr = strings.ReplaceAll(typStr, prefix, imp.name+".")
|
||||
}
|
||||
|
||||
return typStr
|
||||
}
|
||||
|
|
153
vendor/github.com/breml/bidichk/pkg/bidichk/bidichk.go
generated
vendored
153
vendor/github.com/breml/bidichk/pkg/bidichk/bidichk.go
generated
vendored
|
@ -2,21 +2,146 @@ package bidichk
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"flag"
|
||||
"fmt"
|
||||
"go/token"
|
||||
"os"
|
||||
"sort"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"golang.org/x/tools/go/analysis"
|
||||
)
|
||||
|
||||
var Analyzer = &analysis.Analyzer{
|
||||
Name: "bidichk",
|
||||
Doc: "Checks for dangerous unicode character sequences",
|
||||
Run: run,
|
||||
const (
|
||||
doc = "bidichk detects dangerous unicode character sequences"
|
||||
disallowedDoc = `coma separated list of disallowed runes (full name or short name)
|
||||
|
||||
Supported runes
|
||||
|
||||
LEFT-TO-RIGHT-EMBEDDING, LRE (u+202A)
|
||||
RIGHT-TO-LEFT-EMBEDDING, RLE (u+202B)
|
||||
POP-DIRECTIONAL-FORMATTING, PDF (u+202C)
|
||||
LEFT-TO-RIGHT-OVERRIDE, LRO (u+202D)
|
||||
RIGHT-TO-LEFT-OVERRIDE, RLO (u+202E)
|
||||
LEFT-TO-RIGHT-ISOLATE, LRI (u+2066)
|
||||
RIGHT-TO-LEFT-ISOLATE, RLI (u+2067)
|
||||
FIRST-STRONG-ISOLATE, FSI (u+2068)
|
||||
POP-DIRECTIONAL-ISOLATE, PDI (u+2069)
|
||||
`
|
||||
)
|
||||
|
||||
type disallowedRunes map[string]rune
|
||||
|
||||
func (m disallowedRunes) String() string {
|
||||
ss := make([]string, 0, len(m))
|
||||
for s := range m {
|
||||
ss = append(ss, s)
|
||||
}
|
||||
sort.Strings(ss)
|
||||
return strings.Join(ss, ",")
|
||||
}
|
||||
|
||||
func run(pass *analysis.Pass) (interface{}, error) {
|
||||
func (m disallowedRunes) Set(s string) error {
|
||||
ss := strings.FieldsFunc(s, func(c rune) bool { return c == ',' })
|
||||
if len(ss) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
for k := range m {
|
||||
delete(m, k)
|
||||
}
|
||||
|
||||
for _, v := range ss {
|
||||
switch v {
|
||||
case runeShortNameLRE, runeShortNameRLE, runeShortNamePDF,
|
||||
runeShortNameLRO, runeShortNameRLO, runeShortNameLRI,
|
||||
runeShortNameRLI, runeShortNameFSI, runeShortNamePDI:
|
||||
v = shortNameLookup[v]
|
||||
fallthrough
|
||||
case runeNameLRE, runeNameRLE, runeNamePDF,
|
||||
runeNameLRO, runeNameRLO, runeNameLRI,
|
||||
runeNameRLI, runeNameFSI, runeNamePDI:
|
||||
m[v] = runeLookup[v]
|
||||
default:
|
||||
return fmt.Errorf("unknown check name %q (see help for full list)", v)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
const (
|
||||
runeNameLRE = "LEFT-TO-RIGHT-EMBEDDING"
|
||||
runeNameRLE = "RIGHT-TO-LEFT-EMBEDDING"
|
||||
runeNamePDF = "POP-DIRECTIONAL-FORMATTING"
|
||||
runeNameLRO = "LEFT-TO-RIGHT-OVERRIDE"
|
||||
runeNameRLO = "RIGHT-TO-LEFT-OVERRIDE"
|
||||
runeNameLRI = "LEFT-TO-RIGHT-ISOLATE"
|
||||
runeNameRLI = "RIGHT-TO-LEFT-ISOLATE"
|
||||
runeNameFSI = "FIRST-STRONG-ISOLATE"
|
||||
runeNamePDI = "POP-DIRECTIONAL-ISOLATE"
|
||||
|
||||
runeShortNameLRE = "LRE" // LEFT-TO-RIGHT-EMBEDDING
|
||||
runeShortNameRLE = "RLE" // RIGHT-TO-LEFT-EMBEDDING
|
||||
runeShortNamePDF = "PDF" // POP-DIRECTIONAL-FORMATTING
|
||||
runeShortNameLRO = "LRO" // LEFT-TO-RIGHT-OVERRIDE
|
||||
runeShortNameRLO = "RLO" // RIGHT-TO-LEFT-OVERRIDE
|
||||
runeShortNameLRI = "LRI" // LEFT-TO-RIGHT-ISOLATE
|
||||
runeShortNameRLI = "RLI" // RIGHT-TO-LEFT-ISOLATE
|
||||
runeShortNameFSI = "FSI" // FIRST-STRONG-ISOLATE
|
||||
runeShortNamePDI = "PDI" // POP-DIRECTIONAL-ISOLATE
|
||||
)
|
||||
|
||||
var runeLookup = map[string]rune{
|
||||
runeNameLRE: '\u202A', // LEFT-TO-RIGHT-EMBEDDING
|
||||
runeNameRLE: '\u202B', // RIGHT-TO-LEFT-EMBEDDING
|
||||
runeNamePDF: '\u202C', // POP-DIRECTIONAL-FORMATTING
|
||||
runeNameLRO: '\u202D', // LEFT-TO-RIGHT-OVERRIDE
|
||||
runeNameRLO: '\u202E', // RIGHT-TO-LEFT-OVERRIDE
|
||||
runeNameLRI: '\u2066', // LEFT-TO-RIGHT-ISOLATE
|
||||
runeNameRLI: '\u2067', // RIGHT-TO-LEFT-ISOLATE
|
||||
runeNameFSI: '\u2068', // FIRST-STRONG-ISOLATE
|
||||
runeNamePDI: '\u2069', // POP-DIRECTIONAL-ISOLATE
|
||||
}
|
||||
|
||||
var shortNameLookup = map[string]string{
|
||||
runeShortNameLRE: runeNameLRE,
|
||||
runeShortNameRLE: runeNameRLE,
|
||||
runeShortNamePDF: runeNamePDF,
|
||||
runeShortNameLRO: runeNameLRO,
|
||||
runeShortNameRLO: runeNameRLO,
|
||||
runeShortNameLRI: runeNameLRI,
|
||||
runeShortNameRLI: runeNameRLI,
|
||||
runeShortNameFSI: runeNameFSI,
|
||||
runeShortNamePDI: runeNamePDI,
|
||||
}
|
||||
|
||||
type bidichk struct {
|
||||
disallowedRunes disallowedRunes
|
||||
}
|
||||
|
||||
// NewAnalyzer return a new bidichk analyzer.
|
||||
func NewAnalyzer() *analysis.Analyzer {
|
||||
bidichk := bidichk{}
|
||||
bidichk.disallowedRunes = make(map[string]rune, len(runeLookup))
|
||||
for k, v := range runeLookup {
|
||||
bidichk.disallowedRunes[k] = v
|
||||
}
|
||||
|
||||
a := &analysis.Analyzer{
|
||||
Name: "bidichk",
|
||||
Doc: doc,
|
||||
Run: bidichk.run,
|
||||
}
|
||||
|
||||
a.Flags.Init("bidichk", flag.ExitOnError)
|
||||
a.Flags.Var(&bidichk.disallowedRunes, "disallowed-runes", disallowedDoc)
|
||||
a.Flags.Var(versionFlag{}, "V", "print version and exit")
|
||||
|
||||
return a
|
||||
}
|
||||
|
||||
func (b bidichk) run(pass *analysis.Pass) (interface{}, error) {
|
||||
var err error
|
||||
|
||||
pass.Fset.Iterate(func(f *token.File) bool {
|
||||
|
@ -24,31 +149,19 @@ func run(pass *analysis.Pass) (interface{}, error) {
|
|||
return true
|
||||
}
|
||||
|
||||
return check(f.Name(), f.Pos(0), pass) == nil
|
||||
return b.check(f.Name(), f.Pos(0), pass) == nil
|
||||
})
|
||||
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var disallowedRunes = map[string]rune{
|
||||
"LEFT-TO-RIGHT-EMBEDDING": '\u202A',
|
||||
"RIGHT-TO-LEFT-EMBEDDING": '\u202B',
|
||||
"POP-DIRECTIONAL-FORMATTING": '\u202C',
|
||||
"LEFT-TO-RIGHT-OVERRIDE": '\u202D',
|
||||
"RIGHT-TO-LEFT-OVERRIDE": '\u202E',
|
||||
"LEFT-TO-RIGHT-ISOLATE": '\u2066',
|
||||
"RIGHT-TO-LEFT-ISOLATE": '\u2067',
|
||||
"FIRST-STRONG-ISOLATE": '\u2068',
|
||||
"POP-DIRECTIONAL-ISOLATE": '\u2069',
|
||||
}
|
||||
|
||||
func check(filename string, pos token.Pos, pass *analysis.Pass) error {
|
||||
func (b bidichk) check(filename string, pos token.Pos, pass *analysis.Pass) error {
|
||||
body, err := os.ReadFile(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for name, r := range disallowedRunes {
|
||||
for name, r := range b.disallowedRunes {
|
||||
start := 0
|
||||
for {
|
||||
idx := bytes.IndexRune(body[start:], r)
|
||||
|
|
19
vendor/github.com/breml/bidichk/pkg/bidichk/version.go
generated
vendored
Normal file
19
vendor/github.com/breml/bidichk/pkg/bidichk/version.go
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
package bidichk
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
var Version = "bidichk version dev"
|
||||
|
||||
type versionFlag struct{}
|
||||
|
||||
func (versionFlag) IsBoolFlag() bool { return true }
|
||||
func (versionFlag) Get() interface{} { return nil }
|
||||
func (versionFlag) String() string { return "" }
|
||||
func (versionFlag) Set(s string) error {
|
||||
fmt.Println(Version)
|
||||
os.Exit(0)
|
||||
return nil
|
||||
}
|
29
vendor/github.com/breml/errchkjson/.gitignore
generated
vendored
Normal file
29
vendor/github.com/breml/errchkjson/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
/errchkjson
|
||||
/cmd/errchkjson/errchkjson
|
||||
|
||||
# Test binary, build with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
coverage.html
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
|
||||
# Env files
|
||||
.env
|
||||
|
||||
# Exclude todo
|
||||
TODO.md
|
||||
|
||||
# Exclude IDE settings
|
||||
.idea/
|
||||
*.iml
|
||||
.vscode/
|
33
vendor/github.com/breml/errchkjson/.goreleaser.yml
generated
vendored
Normal file
33
vendor/github.com/breml/errchkjson/.goreleaser.yml
generated
vendored
Normal file
|
@ -0,0 +1,33 @@
|
|||
# This is an example .goreleaser.yml file with some sane defaults.
|
||||
# Make sure to check the documentation at http://goreleaser.com
|
||||
before:
|
||||
hooks:
|
||||
# You may remove this if you don't use go modules.
|
||||
- go mod tidy
|
||||
builds:
|
||||
- main: ./cmd/errchkjson
|
||||
binary: errchkjson
|
||||
env:
|
||||
- CGO_ENABLED=0
|
||||
goos:
|
||||
- linux
|
||||
- windows
|
||||
- darwin
|
||||
archives:
|
||||
- name_template: "{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
|
||||
replacements:
|
||||
darwin: Darwin
|
||||
linux: Linux
|
||||
windows: Windows
|
||||
386: i386
|
||||
amd64: x86_64
|
||||
snapshot:
|
||||
name_template: "{{ .Tag }}-next"
|
||||
changelog:
|
||||
skip: true
|
||||
release:
|
||||
github:
|
||||
owner: breml
|
||||
name: errchkjson
|
||||
gomod:
|
||||
proxy: true
|
21
vendor/github.com/breml/errchkjson/LICENSE
generated
vendored
Normal file
21
vendor/github.com/breml/errchkjson/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2019 Lucas Bremgartner
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
125
vendor/github.com/breml/errchkjson/README.md
generated
vendored
Normal file
125
vendor/github.com/breml/errchkjson/README.md
generated
vendored
Normal file
|
@ -0,0 +1,125 @@
|
|||
# errchkjson
|
||||
|
||||
[![Test Status](https://github.com/breml/errchkjson/actions/workflows/ci.yml/badge.svg)](https://github.com/breml/errchkjson/actions/workflows/ci.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/breml/errchkjson)](https://goreportcard.com/report/github.com/breml/errchkjson) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
|
||||
|
||||
Checks types passed to the json encoding functions. Reports unsupported types and reports occations, where the check for the returned error can be omited.
|
||||
|
||||
Consider this [http.Handler](https://pkg.go.dev/net/http#Handler):
|
||||
|
||||
```Go
|
||||
func JSONHelloWorld(w http.ResponseWriter, r *http.Request) {
|
||||
response := struct {
|
||||
Message string
|
||||
Code int
|
||||
}{
|
||||
Message: "Hello World",
|
||||
Code: 200,
|
||||
}
|
||||
|
||||
body, err := json.Marshal(response)
|
||||
if err != nil {
|
||||
panic(err) // unreachable, because json encoding of a struct with just a string and an int will never return an error.
|
||||
}
|
||||
|
||||
w.Write(body)
|
||||
}
|
||||
```
|
||||
|
||||
Because the `panic` is not possible to happen, one might refactor the code like this:
|
||||
|
||||
```Go
|
||||
func JSONHelloWorld(w http.ResponseWriter, r *http.Request) {
|
||||
response := struct {
|
||||
Message string
|
||||
Code int
|
||||
}{
|
||||
Message: "Hello World",
|
||||
Code: 200,
|
||||
}
|
||||
|
||||
body, _ := json.Marshal(response)
|
||||
|
||||
w.Write(body)
|
||||
}
|
||||
```
|
||||
|
||||
This is ok, as long as the struct is not altered in such a way, that could potentially lead
|
||||
to `json.Marshal` returning an error.
|
||||
|
||||
`errchkjson` allows you to lint your code such that the above error returned from `json.Marshal`
|
||||
can be omitted while still staying safe, because as soon as an unsafe type is added to the
|
||||
response type, the linter will warn you.
|
||||
|
||||
## Installation
|
||||
|
||||
Download `errchkjson` from the [releases](https://github.com/breml/errchkjson/releases) or get the latest version from source with:
|
||||
|
||||
```shell
|
||||
go get github.com/breml/errchkjson/cmd/errchkjson
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Shell
|
||||
|
||||
Check everything:
|
||||
|
||||
```shell
|
||||
errchkjson ./...
|
||||
```
|
||||
|
||||
`errchkjson` also recognizes the following command-line options:
|
||||
|
||||
The `-omit-safe` flag disables checking for safe returns of errors from json.Marshal
|
||||
|
||||
## Types
|
||||
|
||||
### Safe
|
||||
|
||||
The following types are safe to use with [json encoding functions](https://pkg.go.dev/encoding/json), that is, the encoding to JSON can not fail:
|
||||
|
||||
Safe basic types:
|
||||
|
||||
* `bool`
|
||||
* `int`, `int8`, `int16`, `int32`, `int64`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `uintptr`
|
||||
* `string`
|
||||
* Pointer type of the above listed basic types
|
||||
|
||||
Composed types (struct, map, slice, array) are safe, if the type of the value is
|
||||
safe. For structs, only exported fields are relevant. For maps, the key needs to be either an integer type or a string.
|
||||
|
||||
### Unsafe
|
||||
|
||||
The following types are unsafe to use with [json encoding functions](https://pkg.go.dev/encoding/json), that is, the encoding to JSON can fail (return an error):
|
||||
|
||||
Unsafe basic types:
|
||||
|
||||
* `float32`, `float64`
|
||||
* `interface{}`
|
||||
* Pointer type of the above listed basic types
|
||||
|
||||
Any composed types (struct, map, slice, array) containing an unsafe basic type.
|
||||
|
||||
If a type implements the `json.Marshaler` or `encoding.TextMarshaler` interface (e.g. `json.Number`).
|
||||
|
||||
### Forbidden
|
||||
|
||||
Forbidden basic types:
|
||||
|
||||
* `complex64`, `complex128`
|
||||
* `chan`
|
||||
* `func`
|
||||
* `unsafe.Pointer`
|
||||
|
||||
Any composed types (struct, map, slice, array) containing a forbidden basic type. Any map
|
||||
using a key with a forbidden type (`bool`, `float32`, `float64`, `struct`).
|
||||
|
||||
## Bugs found during development
|
||||
|
||||
During the development of `errcheckjson`, the following issues in package `encoding/json` of the Go standard library have been found and PR have been merged:
|
||||
|
||||
* [Issue #34154: encoding/json: string option (struct tag) on string field with SetEscapeHTML(false) escapes anyway](https://github.com/golang/go/issues/34154)
|
||||
* [PR #34127: encoding/json: fix and optimize marshal for quoted string](https://github.com/golang/go/pull/34127)
|
||||
* [Issue #34268: encoding/json: wrong encoding for json.Number field with string option (struct tag)](https://github.com/golang/go/issues/34268)
|
||||
* [PR #34269: encoding/json: make Number with the ,string option marshal with quotes](https://github.com/golang/go/pull/34269)
|
||||
* [PR #34272: encoding/json: validate strings when decoding into Number](https://github.com/golang/go/pull/34272)
|
310
vendor/github.com/breml/errchkjson/errchkjson.go
generated
vendored
Normal file
310
vendor/github.com/breml/errchkjson/errchkjson.go
generated
vendored
Normal file
|
@ -0,0 +1,310 @@
|
|||
// Package errchkjson defines an Analyzer that finds places, where it is
|
||||
// safe to omit checking the error returned from json.Marshal.
|
||||
package errchkjson
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/token"
|
||||
"go/types"
|
||||
"reflect"
|
||||
|
||||
"golang.org/x/tools/go/analysis"
|
||||
"golang.org/x/tools/go/types/typeutil"
|
||||
)
|
||||
|
||||
type errchkjson struct {
|
||||
omitSafe bool // -omit-safe flag
|
||||
reportNoExported bool // -report-no-exported flag
|
||||
}
|
||||
|
||||
// NewAnalyzer returns a new errchkjson analyzer.
|
||||
func NewAnalyzer() *analysis.Analyzer {
|
||||
errchkjson := &errchkjson{}
|
||||
|
||||
a := &analysis.Analyzer{
|
||||
Name: "errchkjson",
|
||||
Doc: "Checks types passed to the json encoding functions. Reports unsupported types and reports occations, where the check for the returned error can be omitted.",
|
||||
Run: errchkjson.run,
|
||||
}
|
||||
|
||||
a.Flags.Init("errchkjson", flag.ExitOnError)
|
||||
a.Flags.BoolVar(&errchkjson.omitSafe, "omit-safe", false, "if omit-safe is true, checking of safe returns is omitted")
|
||||
a.Flags.BoolVar(&errchkjson.reportNoExported, "report-no-exported", false, "if report-no-exported is true, encoding a struct without exported fields is reported as issue")
|
||||
a.Flags.Var(versionFlag{}, "V", "print version and exit")
|
||||
|
||||
return a
|
||||
}
|
||||
|
||||
func (e *errchkjson) run(pass *analysis.Pass) (interface{}, error) {
|
||||
for _, file := range pass.Files {
|
||||
ast.Inspect(file, func(n ast.Node) bool {
|
||||
if n == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
// if the error is returned, it is the caller's responsibility to check
|
||||
// the return value.
|
||||
if _, ok := n.(*ast.ReturnStmt); ok {
|
||||
return false
|
||||
}
|
||||
|
||||
ce, ok := n.(*ast.CallExpr)
|
||||
if ok {
|
||||
fn, _ := typeutil.Callee(pass.TypesInfo, ce).(*types.Func)
|
||||
if fn == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
switch fn.FullName() {
|
||||
case "encoding/json.Marshal", "encoding/json.MarshalIndent":
|
||||
e.handleJSONMarshal(pass, ce, fn.FullName(), true)
|
||||
case "(*encoding/json.Encoder).Encode":
|
||||
e.handleJSONMarshal(pass, ce, fn.FullName(), true)
|
||||
default:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
as, ok := n.(*ast.AssignStmt)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
|
||||
ce, ok = as.Rhs[0].(*ast.CallExpr)
|
||||
if !ok {
|
||||
return true
|
||||
}
|
||||
|
||||
fn, _ := typeutil.Callee(pass.TypesInfo, ce).(*types.Func)
|
||||
if fn == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
switch fn.FullName() {
|
||||
case "encoding/json.Marshal", "encoding/json.MarshalIndent":
|
||||
e.handleJSONMarshal(pass, ce, fn.FullName(), blankIdentifier(as.Lhs[1]))
|
||||
case "(*encoding/json.Encoder).Encode":
|
||||
e.handleJSONMarshal(pass, ce, fn.FullName(), blankIdentifier(as.Lhs[0]))
|
||||
default:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func blankIdentifier(n ast.Expr) bool {
|
||||
if errIdent, ok := n.(*ast.Ident); ok {
|
||||
if errIdent.Name == "_" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (e *errchkjson) handleJSONMarshal(pass *analysis.Pass, ce *ast.CallExpr, fnName string, blankIdentifier bool) {
|
||||
t := pass.TypesInfo.TypeOf(ce.Args[0])
|
||||
if t == nil {
|
||||
// Not sure, if this is at all possible
|
||||
if blankIdentifier {
|
||||
pass.Reportf(ce.Pos(), "Type of argument to `%s` could not be evaluated and error return value is not checked", fnName)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if _, ok := t.(*types.Pointer); ok {
|
||||
t = t.(*types.Pointer).Elem()
|
||||
}
|
||||
|
||||
err := e.jsonSafe(t, 0, map[types.Type]struct{}{})
|
||||
if err != nil {
|
||||
if _, ok := err.(unsupported); ok {
|
||||
pass.Reportf(ce.Pos(), "`%s` for %v", fnName, err)
|
||||
return
|
||||
}
|
||||
if _, ok := err.(noexported); ok {
|
||||
pass.Reportf(ce.Pos(), "Error argument passed to `%s` does not contain any exported field", fnName)
|
||||
}
|
||||
// Only care about unsafe types if they are assigned to the blank identifier.
|
||||
if blankIdentifier {
|
||||
pass.Reportf(ce.Pos(), "Error return value of `%s` is not checked: %v", fnName, err)
|
||||
}
|
||||
}
|
||||
if err == nil && !blankIdentifier && !e.omitSafe {
|
||||
pass.Reportf(ce.Pos(), "Error return value of `%s` is checked but passed argument is safe", fnName)
|
||||
}
|
||||
// Report an error, if err for json.Marshal is not checked and safe types are omitted
|
||||
if err == nil && blankIdentifier && e.omitSafe {
|
||||
pass.Reportf(ce.Pos(), "Error return value of `%s` is not checked", fnName)
|
||||
}
|
||||
}
|
||||
|
||||
const (
|
||||
allowedBasicTypes = types.IsBoolean | types.IsInteger | types.IsString
|
||||
allowedMapKeyBasicTypes = types.IsInteger | types.IsString
|
||||
unsupportedBasicTypes = types.IsComplex
|
||||
)
|
||||
|
||||
func (e *errchkjson) jsonSafe(t types.Type, level int, seenTypes map[types.Type]struct{}) error {
|
||||
if _, ok := seenTypes[t]; ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
if types.Implements(t, textMarshalerInterface()) || types.Implements(t, jsonMarshalerInterface()) {
|
||||
return fmt.Errorf("unsafe type `%s` found", t.String())
|
||||
}
|
||||
|
||||
switch ut := t.Underlying().(type) {
|
||||
case *types.Basic:
|
||||
if ut.Info()&allowedBasicTypes > 0 { // bool, int-family, string
|
||||
if ut.Info()&types.IsString > 0 && t.String() == "encoding/json.Number" {
|
||||
return fmt.Errorf("unsafe type `%s` found", t.String())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
if ut.Info()&unsupportedBasicTypes > 0 { // complex64, complex128
|
||||
return newUnsupportedError(fmt.Errorf("unsupported type `%s` found", ut.String()))
|
||||
}
|
||||
switch ut.Kind() {
|
||||
case types.UntypedNil:
|
||||
return nil
|
||||
case types.UnsafePointer:
|
||||
return newUnsupportedError(fmt.Errorf("unsupported type `%s` found", ut.String()))
|
||||
default:
|
||||
// E.g. float32, float64
|
||||
return fmt.Errorf("unsafe type `%s` found", ut.String())
|
||||
}
|
||||
|
||||
case *types.Array:
|
||||
err := e.jsonSafe(ut.Elem(), level+1, seenTypes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
case *types.Slice:
|
||||
err := e.jsonSafe(ut.Elem(), level+1, seenTypes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
case *types.Struct:
|
||||
seenTypes[t] = struct{}{}
|
||||
exported := 0
|
||||
for i := 0; i < ut.NumFields(); i++ {
|
||||
if !ut.Field(i).Exported() {
|
||||
// Unexported fields can be ignored
|
||||
continue
|
||||
}
|
||||
if tag, ok := reflect.StructTag(ut.Tag(i)).Lookup("json"); ok {
|
||||
if tag == "-" {
|
||||
// Fields omitted in json can be ignored
|
||||
continue
|
||||
}
|
||||
}
|
||||
err := e.jsonSafe(ut.Field(i).Type(), level+1, seenTypes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
exported++
|
||||
}
|
||||
if e.reportNoExported && level == 0 && exported == 0 {
|
||||
return newNoexportedError(fmt.Errorf("struct does not export any field"))
|
||||
}
|
||||
return nil
|
||||
|
||||
case *types.Pointer:
|
||||
err := e.jsonSafe(ut.Elem(), level+1, seenTypes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
case *types.Map:
|
||||
err := jsonSafeMapKey(ut.Key())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = e.jsonSafe(ut.Elem(), level+1, seenTypes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
case *types.Chan, *types.Signature:
|
||||
// Types that are not supported for encoding to json:
|
||||
return newUnsupportedError(fmt.Errorf("unsupported type `%s` found", ut.String()))
|
||||
|
||||
default:
|
||||
// Types that are not supported for encoding to json or are not completely safe, like: interfaces
|
||||
return fmt.Errorf("unsafe type `%s` found", t.String())
|
||||
}
|
||||
}
|
||||
|
||||
func jsonSafeMapKey(t types.Type) error {
|
||||
if types.Implements(t, textMarshalerInterface()) || types.Implements(t, jsonMarshalerInterface()) {
|
||||
return fmt.Errorf("unsafe type `%s` as map key found", t.String())
|
||||
}
|
||||
switch ut := t.Underlying().(type) {
|
||||
case *types.Basic:
|
||||
if ut.Info()&types.IsString > 0 && t.String() == "encoding/json.Number" {
|
||||
return fmt.Errorf("unsafe type `%s` as map key found", t.String())
|
||||
}
|
||||
if ut.Info()&allowedMapKeyBasicTypes > 0 { // bool, int-family, string
|
||||
return nil
|
||||
}
|
||||
// E.g. bool, float32, float64, complex64, complex128
|
||||
return newUnsupportedError(fmt.Errorf("unsupported type `%s` as map key found", t.String()))
|
||||
case *types.Interface:
|
||||
return fmt.Errorf("unsafe type `%s` as map key found", t.String())
|
||||
default:
|
||||
// E.g. struct composed solely of basic types, that are comparable
|
||||
return newUnsupportedError(fmt.Errorf("unsupported type `%s` as map key found", t.String()))
|
||||
}
|
||||
}
|
||||
|
||||
// Construct *types.Interface for interface encoding.TextMarshaler
|
||||
// type TextMarshaler interface {
|
||||
// MarshalText() (text []byte, err error)
|
||||
// }
|
||||
//
|
||||
func textMarshalerInterface() *types.Interface {
|
||||
textMarshalerInterface := types.NewInterfaceType([]*types.Func{
|
||||
types.NewFunc(token.NoPos, nil, "MarshalText", types.NewSignature(
|
||||
nil, nil, types.NewTuple(
|
||||
types.NewVar(token.NoPos, nil, "text",
|
||||
types.NewSlice(
|
||||
types.Universe.Lookup("byte").Type())),
|
||||
types.NewVar(token.NoPos, nil, "err", types.Universe.Lookup("error").Type())),
|
||||
false)),
|
||||
}, nil)
|
||||
textMarshalerInterface.Complete()
|
||||
|
||||
return textMarshalerInterface
|
||||
}
|
||||
|
||||
// Construct *types.Interface for interface json.Marshaler
|
||||
// type Marshaler interface {
|
||||
// MarshalJSON() ([]byte, error)
|
||||
// }
|
||||
//
|
||||
func jsonMarshalerInterface() *types.Interface {
|
||||
textMarshalerInterface := types.NewInterfaceType([]*types.Func{
|
||||
types.NewFunc(token.NoPos, nil, "MarshalJSON", types.NewSignature(
|
||||
nil, nil, types.NewTuple(
|
||||
types.NewVar(token.NoPos, nil, "",
|
||||
types.NewSlice(
|
||||
types.Universe.Lookup("byte").Type())),
|
||||
types.NewVar(token.NoPos, nil, "", types.Universe.Lookup("error").Type())),
|
||||
false)),
|
||||
}, nil)
|
||||
textMarshalerInterface.Complete()
|
||||
|
||||
return textMarshalerInterface
|
||||
}
|
5
vendor/github.com/breml/errchkjson/go.mod
generated
vendored
Normal file
5
vendor/github.com/breml/errchkjson/go.mod
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
module github.com/breml/errchkjson
|
||||
|
||||
go 1.16
|
||||
|
||||
require golang.org/x/tools v0.1.7
|
27
vendor/github.com/breml/errchkjson/go.sum
generated
vendored
Normal file
27
vendor/github.com/breml/errchkjson/go.sum
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
|||
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
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-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA=
|
||||
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
|
||||
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
23
vendor/github.com/breml/errchkjson/noexported_error.go
generated
vendored
Normal file
23
vendor/github.com/breml/errchkjson/noexported_error.go
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
package errchkjson
|
||||
|
||||
type noexported interface {
|
||||
noexported()
|
||||
}
|
||||
|
||||
var _ noexported = noexportedError{}
|
||||
|
||||
type noexportedError struct {
|
||||
err error
|
||||
}
|
||||
|
||||
func newNoexportedError(err error) error {
|
||||
return noexportedError{
|
||||
err: err,
|
||||
}
|
||||
}
|
||||
|
||||
func (u noexportedError) noexported() {}
|
||||
|
||||
func (u noexportedError) Error() string {
|
||||
return u.err.Error()
|
||||
}
|
23
vendor/github.com/breml/errchkjson/unsupported_error.go
generated
vendored
Normal file
23
vendor/github.com/breml/errchkjson/unsupported_error.go
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
package errchkjson
|
||||
|
||||
type unsupported interface {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
var _ unsupported = unsupportedError{}
|
||||
|
||||
type unsupportedError struct {
|
||||
err error
|
||||
}
|
||||
|
||||
func newUnsupportedError(err error) error {
|
||||
return unsupportedError{
|
||||
err: err,
|
||||
}
|
||||
}
|
||||
|
||||
func (u unsupportedError) unsupported() {}
|
||||
|
||||
func (u unsupportedError) Error() string {
|
||||
return u.err.Error()
|
||||
}
|
19
vendor/github.com/breml/errchkjson/version.go
generated
vendored
Normal file
19
vendor/github.com/breml/errchkjson/version.go
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
package errchkjson
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
var Version = "errchkjson version dev"
|
||||
|
||||
type versionFlag struct{}
|
||||
|
||||
func (versionFlag) IsBoolFlag() bool { return true }
|
||||
func (versionFlag) Get() interface{} { return nil }
|
||||
func (versionFlag) String() string { return "" }
|
||||
func (versionFlag) Set(s string) error {
|
||||
fmt.Println(Version)
|
||||
os.Exit(0)
|
||||
return nil
|
||||
}
|
131
vendor/github.com/daixiang0/gci/pkg/analyzer/analyzer.go
generated
vendored
Normal file
131
vendor/github.com/daixiang0/gci/pkg/analyzer/analyzer.go
generated
vendored
Normal file
|
@ -0,0 +1,131 @@
|
|||
package analyzer
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"go/token"
|
||||
"strings"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
"github.com/daixiang0/gci/pkg/gci"
|
||||
"github.com/daixiang0/gci/pkg/io"
|
||||
|
||||
"golang.org/x/tools/go/analysis"
|
||||
"golang.org/x/tools/go/analysis/passes/inspect"
|
||||
)
|
||||
|
||||
const (
|
||||
NoInlineCommentsFlag = "noInlineComments"
|
||||
NoPrefixCommentsFlag = "noPrefixComments"
|
||||
SectionsFlag = "Sections"
|
||||
SectionSeparatorsFlag = "SectionSeparators"
|
||||
SectionDelimiter = ";"
|
||||
)
|
||||
|
||||
var (
|
||||
noInlineComments bool
|
||||
noPrefixComments bool
|
||||
sectionsStr string
|
||||
sectionSeparatorsStr string
|
||||
)
|
||||
|
||||
func init() {
|
||||
Analyzer.Flags.BoolVar(&noInlineComments, NoInlineCommentsFlag, false, "If comments in the same line as the input should be present")
|
||||
Analyzer.Flags.BoolVar(&noPrefixComments, NoPrefixCommentsFlag, false, "If comments above an input should be present")
|
||||
Analyzer.Flags.StringVar(§ionsStr, SectionsFlag, "", "Specify the Sections format that should be used to check the file formatting")
|
||||
Analyzer.Flags.StringVar(§ionSeparatorsStr, SectionSeparatorsFlag, "", "Specify the Sections that are inserted as Separators between Sections")
|
||||
}
|
||||
|
||||
var Analyzer = &analysis.Analyzer{
|
||||
Name: "gci",
|
||||
Doc: "A tool that control golang package import order and make it always deterministic.",
|
||||
Requires: []*analysis.Analyzer{inspect.Analyzer},
|
||||
Run: runAnalysis,
|
||||
}
|
||||
|
||||
func runAnalysis(pass *analysis.Pass) (interface{}, error) {
|
||||
// TODO input validation
|
||||
|
||||
var fileReferences []*token.File
|
||||
// extract file references for all files in the analyzer pass
|
||||
for _, pkgFile := range pass.Files {
|
||||
fileForPos := pass.Fset.File(pkgFile.Package)
|
||||
if fileForPos != nil {
|
||||
fileReferences = append(fileReferences, fileForPos)
|
||||
}
|
||||
}
|
||||
expectedNumFiles := len(pass.Files)
|
||||
foundNumFiles := len(fileReferences)
|
||||
if expectedNumFiles != foundNumFiles {
|
||||
return nil, InvalidNumberOfFilesInAnalysis{expectedNumFiles, foundNumFiles}
|
||||
}
|
||||
|
||||
// read configuration options
|
||||
gciCfg, err := parseGciConfiguration()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, file := range fileReferences {
|
||||
filePath := file.Name()
|
||||
unmodifiedFile, formattedFile, err := gci.LoadFormatGoFile(io.File{filePath}, *gciCfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// search for a difference
|
||||
fileRunes := bytes.Runes(unmodifiedFile)
|
||||
formattedRunes := bytes.Runes(formattedFile)
|
||||
diffIdx := compareRunes(fileRunes, formattedRunes)
|
||||
switch diffIdx {
|
||||
case -1:
|
||||
// no difference
|
||||
default:
|
||||
diffPos := file.Position(file.Pos(diffIdx))
|
||||
// prevent invalid access to array
|
||||
fileRune := "nil"
|
||||
formattedRune := "nil"
|
||||
if len(fileRunes)-1 >= diffIdx {
|
||||
fileRune = fmt.Sprintf("%q", fileRunes[diffIdx])
|
||||
}
|
||||
if len(formattedRunes)-1 >= diffIdx {
|
||||
formattedRune = fmt.Sprintf("%q", formattedRunes[diffIdx])
|
||||
}
|
||||
pass.Reportf(file.Pos(diffIdx), "Expected %s, Found %s at %s[line %d,col %d]", formattedRune, fileRune, filePath, diffPos.Line, diffPos.Column)
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func compareRunes(a, b []rune) (differencePos int) {
|
||||
// check shorter rune slice first to prevent invalid array access
|
||||
shorterRune := a
|
||||
if len(b) < len(a) {
|
||||
shorterRune = b
|
||||
}
|
||||
// check for differences up to where the length is identical
|
||||
for idx := 0; idx < len(shorterRune); idx++ {
|
||||
if a[idx] != b[idx] {
|
||||
return idx
|
||||
}
|
||||
}
|
||||
// check that we have compared two equally long rune arrays
|
||||
if len(a) != len(b) {
|
||||
return len(shorterRune) + 1
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func parseGciConfiguration() (*gci.GciConfiguration, error) {
|
||||
fmtCfg := configuration.FormatterConfiguration{noInlineComments, noPrefixComments, false}
|
||||
|
||||
var sectionStrings []string
|
||||
if sectionsStr != "" {
|
||||
sectionStrings = strings.Split(sectionsStr, SectionDelimiter)
|
||||
}
|
||||
|
||||
var sectionSeparatorStrings []string
|
||||
if sectionSeparatorsStr != "" {
|
||||
sectionSeparatorStrings = strings.Split(sectionSeparatorsStr, SectionDelimiter)
|
||||
}
|
||||
return gci.GciStringConfiguration{fmtCfg, sectionStrings, sectionSeparatorStrings}.Parse()
|
||||
}
|
16
vendor/github.com/daixiang0/gci/pkg/analyzer/errors.go
generated
vendored
Normal file
16
vendor/github.com/daixiang0/gci/pkg/analyzer/errors.go
generated
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
package analyzer
|
||||
|
||||
import "fmt"
|
||||
|
||||
type InvalidNumberOfFilesInAnalysis struct {
|
||||
expectedNumFiles, foundNumFiles int
|
||||
}
|
||||
|
||||
func (i InvalidNumberOfFilesInAnalysis) Error() string {
|
||||
return fmt.Sprintf("Expected %d files in Analyzer input, Found %d", i.expectedNumFiles, i.foundNumFiles)
|
||||
}
|
||||
|
||||
func (i InvalidNumberOfFilesInAnalysis) Is(err error) bool {
|
||||
_, ok := err.(InvalidNumberOfFilesInAnalysis)
|
||||
return ok
|
||||
}
|
7
vendor/github.com/daixiang0/gci/pkg/configuration/formatter.go
generated
vendored
Normal file
7
vendor/github.com/daixiang0/gci/pkg/configuration/formatter.go
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
package configuration
|
||||
|
||||
type FormatterConfiguration struct {
|
||||
NoInlineComments bool `yaml:"no-inlineComments"`
|
||||
NoPrefixComments bool `yaml:"no-prefixComments"`
|
||||
Debug bool `yaml:"-"`
|
||||
}
|
16
vendor/github.com/daixiang0/gci/pkg/constants/sequences.go
generated
vendored
Normal file
16
vendor/github.com/daixiang0/gci/pkg/constants/sequences.go
generated
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
package constants
|
||||
|
||||
const (
|
||||
CommentFlag = "//"
|
||||
ImportStartFlag = "\nimport (\n"
|
||||
ImportEndFlag = "\n)"
|
||||
|
||||
Blank = " "
|
||||
Indent = "\t"
|
||||
Linebreak = "\n"
|
||||
|
||||
SectionSeparator = ":"
|
||||
|
||||
ParameterOpeningBrackets = "("
|
||||
ParameterClosingBrackets = ")"
|
||||
)
|
58
vendor/github.com/daixiang0/gci/pkg/gci/configuration.go
generated
vendored
Normal file
58
vendor/github.com/daixiang0/gci/pkg/gci/configuration.go
generated
vendored
Normal file
|
@ -0,0 +1,58 @@
|
|||
package gci
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
sectionsPkg "github.com/daixiang0/gci/pkg/gci/sections"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
type GciConfiguration struct {
|
||||
configuration.FormatterConfiguration
|
||||
Sections SectionList
|
||||
SectionSeparators SectionList
|
||||
}
|
||||
|
||||
type GciStringConfiguration struct {
|
||||
Cfg configuration.FormatterConfiguration `yaml:",inline"`
|
||||
SectionStrings []string `yaml:"sections"`
|
||||
SectionSeparatorStrings []string `yaml:"sectionseparators"`
|
||||
}
|
||||
|
||||
func (g GciStringConfiguration) Parse() (*GciConfiguration, error) {
|
||||
sections := DefaultSections()
|
||||
var err error
|
||||
if len(g.SectionStrings) > 0 {
|
||||
sections, err = sectionsPkg.SectionParserInst.ParseSectionStrings(g.SectionStrings, true, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
sectionSeparators := DefaultSectionSeparators()
|
||||
if len(g.SectionSeparatorStrings) > 0 {
|
||||
sectionSeparators, err = sectionsPkg.SectionParserInst.ParseSectionStrings(g.SectionSeparatorStrings, false, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return &GciConfiguration{g.Cfg, sections, sectionSeparators}, nil
|
||||
}
|
||||
|
||||
func initializeGciConfigFromYAML(filePath string) (*GciConfiguration, error) {
|
||||
yamlCfg := GciStringConfiguration{}
|
||||
yamlData, err := ioutil.ReadFile(filePath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = yaml.Unmarshal(yamlData, &yamlCfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
gciCfg, err := yamlCfg.Parse()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return gciCfg, nil
|
||||
}
|
78
vendor/github.com/daixiang0/gci/pkg/gci/errors.go
generated
vendored
Normal file
78
vendor/github.com/daixiang0/gci/pkg/gci/errors.go
generated
vendored
Normal file
|
@ -0,0 +1,78 @@
|
|||
package gci
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
sectionsPkg "github.com/daixiang0/gci/pkg/gci/sections"
|
||||
)
|
||||
|
||||
type EqualSpecificityMatchError struct {
|
||||
importDef importPkg.ImportDef
|
||||
sectionA, sectionB sectionsPkg.Section
|
||||
}
|
||||
|
||||
func (e EqualSpecificityMatchError) Error() string {
|
||||
return fmt.Sprintf("Import %s matched section %s and %s equally", e.importDef, e.sectionA, e.sectionB)
|
||||
}
|
||||
|
||||
func (e EqualSpecificityMatchError) Is(err error) bool {
|
||||
_, ok := err.(EqualSpecificityMatchError)
|
||||
return ok
|
||||
}
|
||||
|
||||
type NoMatchingSectionForImportError struct {
|
||||
importDef importPkg.ImportDef
|
||||
}
|
||||
|
||||
func (n NoMatchingSectionForImportError) Error() string {
|
||||
return fmt.Sprintf("No section found for Import: %v", n.importDef)
|
||||
}
|
||||
|
||||
func (n NoMatchingSectionForImportError) Is(err error) bool {
|
||||
_, ok := err.(NoMatchingSectionForImportError)
|
||||
return ok
|
||||
}
|
||||
|
||||
type InvalidImportSplitError struct {
|
||||
segments []string
|
||||
}
|
||||
|
||||
func (i InvalidImportSplitError) Error() string {
|
||||
return fmt.Sprintf("seperating the inline comment from the import yielded an invalid number of segments: %v", i.segments)
|
||||
}
|
||||
|
||||
func (i InvalidImportSplitError) Is(err error) bool {
|
||||
_, ok := err.(InvalidImportSplitError)
|
||||
return ok
|
||||
}
|
||||
|
||||
type InvalidAliasSplitError struct {
|
||||
segments []string
|
||||
}
|
||||
|
||||
func (i InvalidAliasSplitError) Error() string {
|
||||
return fmt.Sprintf("seperating the alias from the path yielded an invalid number of segments: %v", i.segments)
|
||||
}
|
||||
|
||||
func (i InvalidAliasSplitError) Is(err error) bool {
|
||||
_, ok := err.(InvalidAliasSplitError)
|
||||
return ok
|
||||
}
|
||||
|
||||
var MissingImportStatementError = FileParsingError{errors.New("no import statement present in File")}
|
||||
var ImportStatementNotClosedError = FileParsingError{errors.New("import statement not closed")}
|
||||
|
||||
type FileParsingError struct {
|
||||
error
|
||||
}
|
||||
|
||||
func (f FileParsingError) Unwrap() error {
|
||||
return f.error
|
||||
}
|
||||
|
||||
func (f FileParsingError) Is(err error) bool {
|
||||
_, ok := err.(FileParsingError)
|
||||
return ok
|
||||
}
|
98
vendor/github.com/daixiang0/gci/pkg/gci/format.go
generated
vendored
Normal file
98
vendor/github.com/daixiang0/gci/pkg/gci/format.go
generated
vendored
Normal file
|
@ -0,0 +1,98 @@
|
|||
package gci
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/constants"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
sectionsPkg "github.com/daixiang0/gci/pkg/gci/sections"
|
||||
"github.com/daixiang0/gci/pkg/gci/specificity"
|
||||
)
|
||||
|
||||
// Formats the import section of a Go file
|
||||
func formatGoFile(input []byte, cfg GciConfiguration) ([]byte, error) {
|
||||
startIndex := bytes.Index(input, []byte(constants.ImportStartFlag))
|
||||
if startIndex < 0 {
|
||||
return nil, MissingImportStatementError
|
||||
}
|
||||
endIndexFromStart := bytes.Index(input[startIndex:], []byte(constants.ImportEndFlag))
|
||||
if endIndexFromStart < 0 {
|
||||
return nil, ImportStatementNotClosedError
|
||||
}
|
||||
endIndex := startIndex + endIndexFromStart
|
||||
|
||||
unformattedImports := input[startIndex+len(constants.ImportStartFlag) : endIndex]
|
||||
formattedImports, err := formatImportBlock(unformattedImports, cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var output []byte
|
||||
output = append(output, input[:startIndex+len(constants.ImportStartFlag)]...)
|
||||
output = append(output, formattedImports...)
|
||||
output = append(output, input[endIndex+1:]...)
|
||||
return output, nil
|
||||
}
|
||||
|
||||
// Takes unsorted imports as byte array and formats them according to the specified sections
|
||||
func formatImportBlock(input []byte, cfg GciConfiguration) ([]byte, error) {
|
||||
//strings.ReplaceAll(input, "\r\n", linebreak)
|
||||
lines := strings.Split(string(input), constants.Linebreak)
|
||||
imports, err := parseToImportDefinitions(lines)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("an error occured while trying to parse imports: %w", err)
|
||||
}
|
||||
if cfg.Debug {
|
||||
log.Println("Parsed imports in file:", imports)
|
||||
}
|
||||
// create mapping between sections and imports
|
||||
sectionMap := make(map[sectionsPkg.Section][]importPkg.ImportDef, len(cfg.Sections))
|
||||
// find matching section for every importSpec
|
||||
for _, i := range imports {
|
||||
// determine match specificity for every available section
|
||||
var bestSection sectionsPkg.Section
|
||||
var bestSectionSpecificity specificity.MatchSpecificity = specificity.MisMatch{}
|
||||
for _, section := range cfg.Sections {
|
||||
sectionSpecificity := section.MatchSpecificity(i)
|
||||
if sectionSpecificity.IsMoreSpecific(specificity.MisMatch{}) && sectionSpecificity.Equal(bestSectionSpecificity) {
|
||||
// specificity is identical
|
||||
return nil, EqualSpecificityMatchError{i, bestSection, section}
|
||||
}
|
||||
if sectionSpecificity.IsMoreSpecific(bestSectionSpecificity) {
|
||||
// better match found
|
||||
bestSectionSpecificity = sectionSpecificity
|
||||
bestSection = section
|
||||
}
|
||||
}
|
||||
if bestSection == nil {
|
||||
return nil, NoMatchingSectionForImportError{i}
|
||||
}
|
||||
if cfg.Debug {
|
||||
log.Printf("Matched import %s to section %s", i, bestSection)
|
||||
}
|
||||
sectionMap[bestSection] = append(sectionMap[bestSection], i)
|
||||
}
|
||||
// format every section to a str
|
||||
var sectionStrings []string
|
||||
for _, section := range cfg.Sections {
|
||||
sectionStr := section.Format(sectionMap[section], cfg.FormatterConfiguration)
|
||||
// prevent adding an empty section which would cause a separator to be inserted
|
||||
if sectionStr != "" {
|
||||
if cfg.Debug {
|
||||
log.Printf("Formatting section %s with imports: %v", section, sectionMap[section])
|
||||
}
|
||||
sectionStrings = append(sectionStrings, sectionStr)
|
||||
}
|
||||
}
|
||||
// format sectionSeparators
|
||||
var sectionSeparatorStr string
|
||||
for _, sectionSep := range cfg.SectionSeparators {
|
||||
sectionSeparatorStr += sectionSep.Format([]importPkg.ImportDef{}, cfg.FormatterConfiguration)
|
||||
}
|
||||
// generate output by joining the sections
|
||||
output := strings.Join(sectionStrings, sectionSeparatorStr)
|
||||
return []byte(output), nil
|
||||
}
|
454
vendor/github.com/daixiang0/gci/pkg/gci/gci.go
generated
vendored
454
vendor/github.com/daixiang0/gci/pkg/gci/gci.go
generated
vendored
|
@ -2,382 +2,126 @@ package gci
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
sectionsPkg "github.com/daixiang0/gci/pkg/gci/sections"
|
||||
"github.com/daixiang0/gci/pkg/io"
|
||||
|
||||
"github.com/hexops/gotextdiff"
|
||||
"github.com/hexops/gotextdiff/myers"
|
||||
"github.com/hexops/gotextdiff/span"
|
||||
"golang.org/x/sync/errgroup"
|
||||
)
|
||||
|
||||
const (
|
||||
// pkg type: standard, remote, local
|
||||
standard int = iota
|
||||
// 3rd-party packages
|
||||
remote
|
||||
local
|
||||
type SectionList []sectionsPkg.Section
|
||||
|
||||
commentFlag = "//"
|
||||
)
|
||||
|
||||
var (
|
||||
importStartFlag = []byte(`
|
||||
import (
|
||||
`)
|
||||
importEndFlag = []byte(`
|
||||
)
|
||||
`)
|
||||
)
|
||||
|
||||
type FlagSet struct {
|
||||
LocalFlag []string
|
||||
DoWrite, DoDiff *bool
|
||||
func (list SectionList) String() []string {
|
||||
var output []string
|
||||
for _, section := range list {
|
||||
output = append(output, section.String())
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
type pkg struct {
|
||||
list map[int][]string
|
||||
comment map[string]string
|
||||
alias map[string]string
|
||||
func DefaultSections() SectionList {
|
||||
return SectionList{sectionsPkg.StandardPackage{}, sectionsPkg.DefaultSection{nil, nil}}
|
||||
}
|
||||
|
||||
// ParseLocalFlag takes a comma-separated list of
|
||||
// package-name-prefixes (as passed to the "-local" flag), and splits
|
||||
// it in to a list. This is different than strings.Split in that it
|
||||
// handles the empty string and empty entries in the list.
|
||||
func ParseLocalFlag(str string) []string {
|
||||
return strings.FieldsFunc(str, func(c rune) bool { return c == ',' })
|
||||
func DefaultSectionSeparators() SectionList {
|
||||
return SectionList{sectionsPkg.NewLine{}}
|
||||
}
|
||||
func LocalFlagsToSections(localFlags []string) SectionList {
|
||||
sections := DefaultSections()
|
||||
// Add all local arguments as ImportPrefix sections
|
||||
for _, prefix := range localFlags {
|
||||
sections = append(sections, sectionsPkg.Prefix{prefix, nil, nil})
|
||||
}
|
||||
return sections
|
||||
}
|
||||
|
||||
func newPkg(data [][]byte, localFlag []string) *pkg {
|
||||
listMap := make(map[int][]string)
|
||||
commentMap := make(map[string]string)
|
||||
aliasMap := make(map[string]string)
|
||||
p := &pkg{
|
||||
list: listMap,
|
||||
comment: commentMap,
|
||||
alias: aliasMap,
|
||||
}
|
||||
|
||||
formatData := make([]string, 0)
|
||||
// remove all empty lines
|
||||
for _, v := range data {
|
||||
if len(v) > 0 {
|
||||
formatData = append(formatData, strings.TrimSpace(string(v)))
|
||||
}
|
||||
}
|
||||
|
||||
n := len(formatData)
|
||||
for i := n - 1; i >= 0; i-- {
|
||||
line := formatData[i]
|
||||
|
||||
// check commentFlag:
|
||||
// 1. one line commentFlag
|
||||
// 2. commentFlag after import path
|
||||
commentIndex := strings.Index(line, commentFlag)
|
||||
if commentIndex == 0 {
|
||||
// comment in the last line is useless, ignore it
|
||||
if i+1 >= n {
|
||||
continue
|
||||
}
|
||||
pkg, _, _ := getPkgInfo(formatData[i+1], strings.Index(formatData[i+1], commentFlag) >= 0)
|
||||
p.comment[pkg] = line
|
||||
continue
|
||||
} else if commentIndex > 0 {
|
||||
pkg, alias, comment := getPkgInfo(line, true)
|
||||
if alias != "" {
|
||||
p.alias[pkg] = alias
|
||||
}
|
||||
|
||||
p.comment[pkg] = comment
|
||||
pkgType := getPkgType(pkg, localFlag)
|
||||
p.list[pkgType] = append(p.list[pkgType], pkg)
|
||||
continue
|
||||
}
|
||||
|
||||
pkg, alias, _ := getPkgInfo(line, false)
|
||||
|
||||
if alias != "" {
|
||||
p.alias[pkg] = alias
|
||||
}
|
||||
|
||||
pkgType := getPkgType(pkg, localFlag)
|
||||
p.list[pkgType] = append(p.list[pkgType], pkg)
|
||||
}
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
// fmt format import pkgs as expected
|
||||
func (p *pkg) fmt() []byte {
|
||||
ret := make([]string, 0, 100)
|
||||
|
||||
for pkgType := range []int{standard, remote, local} {
|
||||
sort.Strings(p.list[pkgType])
|
||||
for _, s := range p.list[pkgType] {
|
||||
if p.comment[s] != "" {
|
||||
l := fmt.Sprintf("%s%s%s%s", linebreak, indent, p.comment[s], linebreak)
|
||||
ret = append(ret, l)
|
||||
}
|
||||
|
||||
if p.alias[s] != "" {
|
||||
s = fmt.Sprintf("%s%s%s%s%s", indent, p.alias[s], blank, s, linebreak)
|
||||
} else {
|
||||
s = fmt.Sprintf("%s%s%s", indent, s, linebreak)
|
||||
}
|
||||
|
||||
ret = append(ret, s)
|
||||
}
|
||||
|
||||
if len(p.list[pkgType]) > 0 {
|
||||
ret = append(ret, linebreak)
|
||||
}
|
||||
}
|
||||
if len(ret) > 0 && ret[len(ret)-1] == linebreak {
|
||||
ret = ret[:len(ret)-1]
|
||||
}
|
||||
|
||||
// remove duplicate empty lines
|
||||
s1 := fmt.Sprintf("%s%s%s%s", linebreak, linebreak, linebreak, indent)
|
||||
s2 := fmt.Sprintf("%s%s%s", linebreak, linebreak, indent)
|
||||
return []byte(strings.ReplaceAll(strings.Join(ret, ""), s1, s2))
|
||||
}
|
||||
|
||||
// getPkgInfo assume line is a import path, and return (path, alias, comment)
|
||||
func getPkgInfo(line string, comment bool) (string, string, string) {
|
||||
if comment {
|
||||
s := strings.Split(line, commentFlag)
|
||||
pkgArray := strings.Split(s[0], blank)
|
||||
if len(pkgArray) > 1 {
|
||||
return pkgArray[1], pkgArray[0], fmt.Sprintf("%s%s%s", commentFlag, blank, strings.TrimSpace(s[1]))
|
||||
} else {
|
||||
return strings.TrimSpace(pkgArray[0]), "", fmt.Sprintf("%s%s%s", commentFlag, blank, strings.TrimSpace(s[1]))
|
||||
}
|
||||
} else {
|
||||
pkgArray := strings.Split(line, blank)
|
||||
if len(pkgArray) > 1 {
|
||||
return pkgArray[1], pkgArray[0], ""
|
||||
} else {
|
||||
return pkgArray[0], "", ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getPkgType(line string, localFlag []string) int {
|
||||
pkgName := strings.Trim(line, "\"\\`")
|
||||
|
||||
for _, localPkg := range localFlag {
|
||||
if strings.HasPrefix(pkgName, localPkg) {
|
||||
return local
|
||||
}
|
||||
}
|
||||
|
||||
if isStandardPackage(pkgName) {
|
||||
return standard
|
||||
}
|
||||
|
||||
return remote
|
||||
}
|
||||
|
||||
const (
|
||||
blank = " "
|
||||
indent = "\t"
|
||||
linebreak = "\n"
|
||||
)
|
||||
|
||||
func diff(b1, b2 []byte, filename string) (data []byte, err error) {
|
||||
f1, err := writeTempFile("", "gci", b1)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer os.Remove(f1)
|
||||
|
||||
f2, err := writeTempFile("", "gci", b2)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer os.Remove(f2)
|
||||
|
||||
cmd := "diff"
|
||||
|
||||
data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
|
||||
if len(data) > 0 {
|
||||
// diff exits with a non-zero status when the files don't match.
|
||||
// Ignore that failure as long as we get output.
|
||||
return replaceTempFilename(data, filename)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func writeTempFile(dir, prefix string, data []byte) (string, error) {
|
||||
file, err := ioutil.TempFile(dir, prefix)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
_, err = file.Write(data)
|
||||
if err1 := file.Close(); err == nil {
|
||||
err = err1
|
||||
}
|
||||
if err != nil {
|
||||
os.Remove(file.Name())
|
||||
return "", err
|
||||
}
|
||||
return file.Name(), nil
|
||||
}
|
||||
|
||||
// replaceTempFilename replaces temporary filenames in diff with actual one.
|
||||
//
|
||||
// --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500
|
||||
// +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500
|
||||
// ...
|
||||
// ->
|
||||
// --- path/to/file.go.orig 2017-02-03 19:13:00.280468375 -0500
|
||||
// +++ path/to/file.go 2017-02-03 19:13:00.280468375 -0500
|
||||
// ...
|
||||
func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
|
||||
bs := bytes.SplitN(diff, []byte{'\n'}, 3)
|
||||
if len(bs) < 3 {
|
||||
return nil, fmt.Errorf("got unexpected diff for %s", filename)
|
||||
}
|
||||
// Preserve timestamps.
|
||||
var t0, t1 []byte
|
||||
if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
|
||||
t0 = bs[0][i:]
|
||||
}
|
||||
if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
|
||||
t1 = bs[1][i:]
|
||||
}
|
||||
// Always print filepath with slash separator.
|
||||
f := filepath.ToSlash(filename)
|
||||
bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
|
||||
bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
|
||||
return bytes.Join(bs, []byte{'\n'}), nil
|
||||
}
|
||||
|
||||
func visitFile(set *FlagSet) filepath.WalkFunc {
|
||||
return func(path string, f os.FileInfo, err error) error {
|
||||
if err == nil && isGoFile(f) {
|
||||
err = processFile(path, os.Stdout, set)
|
||||
}
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
func WalkDir(path string, set *FlagSet) error {
|
||||
return filepath.Walk(path, visitFile(set))
|
||||
}
|
||||
|
||||
func isGoFile(f os.FileInfo) bool {
|
||||
// ignore non-Go files
|
||||
name := f.Name()
|
||||
return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
|
||||
}
|
||||
|
||||
func ProcessFile(filename string, out io.Writer, set *FlagSet) error {
|
||||
return processFile(filename, out, set)
|
||||
}
|
||||
|
||||
func processFile(filename string, out io.Writer, set *FlagSet) error {
|
||||
var err error
|
||||
|
||||
f, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
src, err := ioutil.ReadAll(f)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
ori := make([]byte, len(src))
|
||||
copy(ori, src)
|
||||
start := bytes.Index(src, importStartFlag)
|
||||
// in case no importStartFlag or importStartFlag exist in the commentFlag
|
||||
if start < 0 {
|
||||
fmt.Printf("skip file %s since no import\n", filename)
|
||||
func PrintFormattedFiles(paths []string, cfg GciConfiguration) error {
|
||||
return processStdInAndGoFilesInPaths(paths, cfg, func(filePath string, unmodifiedFile, formattedFile []byte) error {
|
||||
fmt.Print(string(formattedFile))
|
||||
return nil
|
||||
}
|
||||
end := bytes.Index(src[start:], importEndFlag) + start
|
||||
|
||||
ret := bytes.Split(src[start+len(importStartFlag):end], []byte(linebreak))
|
||||
|
||||
p := newPkg(ret, set.LocalFlag)
|
||||
|
||||
res := append(src[:start+len(importStartFlag)], append(p.fmt(), src[end+1:]...)...)
|
||||
|
||||
if !bytes.Equal(ori, res) {
|
||||
if *set.DoWrite {
|
||||
// On Windows, we need to re-set the permissions from the file. See golang/go#38225.
|
||||
var perms os.FileMode
|
||||
if fi, err := os.Stat(filename); err == nil {
|
||||
perms = fi.Mode() & os.ModePerm
|
||||
}
|
||||
err = ioutil.WriteFile(filename, res, perms)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if *set.DoDiff {
|
||||
data, err := diff(ori, res, filename)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to diff: %v", err)
|
||||
}
|
||||
fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
|
||||
if _, err := out.Write(data); err != nil {
|
||||
return fmt.Errorf("failed to write: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
if !*set.DoWrite && !*set.DoDiff {
|
||||
if _, err = out.Write(res); err != nil {
|
||||
return fmt.Errorf("failed to write: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
// Run return source and result in []byte if succeed
|
||||
func Run(filename string, set *FlagSet) ([]byte, []byte, error) {
|
||||
var err error
|
||||
func WriteFormattedFiles(paths []string, cfg GciConfiguration) error {
|
||||
return processGoFilesInPaths(paths, cfg, func(filePath string, unmodifiedFile, formattedFile []byte) error {
|
||||
if bytes.Equal(unmodifiedFile, formattedFile) {
|
||||
log.Printf("Skipping correctly formatted File: %s", filePath)
|
||||
return nil
|
||||
}
|
||||
log.Printf("Writing formatted File: %s", filePath)
|
||||
return os.WriteFile(filePath, formattedFile, 0644)
|
||||
})
|
||||
}
|
||||
|
||||
f, err := os.Open(filename)
|
||||
func DiffFormattedFiles(paths []string, cfg GciConfiguration) error {
|
||||
return processStdInAndGoFilesInPaths(paths, cfg, func(filePath string, unmodifiedFile, formattedFile []byte) error {
|
||||
fileURI := span.URIFromPath(filePath)
|
||||
edits := myers.ComputeEdits(fileURI, string(unmodifiedFile), string(formattedFile))
|
||||
unifiedEdits := gotextdiff.ToUnified(filePath, filePath, string(unmodifiedFile), edits)
|
||||
fmt.Printf("%v", unifiedEdits)
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
type fileFormattingFunc func(filePath string, unmodifiedFile, formattedFile []byte) error
|
||||
|
||||
func processStdInAndGoFilesInPaths(paths []string, cfg GciConfiguration, fileFunc fileFormattingFunc) error {
|
||||
return processFiles(io.StdInGenerator.Combine(io.GoFilesInPathsGenerator(paths)), cfg, fileFunc)
|
||||
}
|
||||
|
||||
func processGoFilesInPaths(paths []string, cfg GciConfiguration, fileFunc fileFormattingFunc) error {
|
||||
return processFiles(io.GoFilesInPathsGenerator(paths), cfg, fileFunc)
|
||||
}
|
||||
|
||||
func processFiles(fileGenerator io.FileGeneratorFunc, cfg GciConfiguration, fileFunc fileFormattingFunc) error {
|
||||
var taskGroup errgroup.Group
|
||||
files, err := fileGenerator()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
for _, file := range files {
|
||||
// run file processing in parallel
|
||||
taskGroup.Go(processingFunc(file, cfg, fileFunc))
|
||||
}
|
||||
return taskGroup.Wait()
|
||||
}
|
||||
|
||||
src, err := ioutil.ReadAll(f)
|
||||
func processingFunc(file io.FileObj, cfg GciConfiguration, formattingFunc fileFormattingFunc) func() error {
|
||||
return func() error {
|
||||
unmodifiedFile, formattedFile, err := LoadFormatGoFile(file, cfg)
|
||||
if err != nil {
|
||||
if errors.Is(err, FileParsingError{}) {
|
||||
// do not process files that are improperly formatted
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
return formattingFunc(file.Path(), unmodifiedFile, formattedFile)
|
||||
}
|
||||
}
|
||||
|
||||
func LoadFormatGoFile(file io.FileObj, cfg GciConfiguration) (unmodifiedFile, formattedFile []byte, err error) {
|
||||
unmodifiedFile, err = file.Load()
|
||||
log.Printf("Loaded File: %s", file.Path())
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
ori := make([]byte, len(src))
|
||||
copy(ori, src)
|
||||
start := bytes.Index(src, importStartFlag)
|
||||
// in case no importStartFlag or importStartFlag exist in the commentFlag
|
||||
if start < 0 {
|
||||
return nil, nil, nil
|
||||
formattedFile, err = formatGoFile(unmodifiedFile, cfg)
|
||||
if err != nil {
|
||||
// ignore missing import statements
|
||||
if !errors.Is(err, MissingImportStatementError) {
|
||||
return unmodifiedFile, nil, err
|
||||
}
|
||||
log.Printf("File does not contain an import statement: %s", file.Path())
|
||||
formattedFile = unmodifiedFile
|
||||
}
|
||||
end := bytes.Index(src[start:], importEndFlag) + start
|
||||
|
||||
// in case import flags are part of a codegen template, or otherwise "wrong"
|
||||
if start+len(importStartFlag) > end {
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
ret := bytes.Split(src[start+len(importStartFlag):end], []byte(linebreak))
|
||||
|
||||
p := newPkg(ret, set.LocalFlag)
|
||||
|
||||
res := append(src[:start+len(importStartFlag)], append(p.fmt(), src[end+1:]...)...)
|
||||
|
||||
if bytes.Equal(ori, res) {
|
||||
return ori, nil, nil
|
||||
}
|
||||
|
||||
return ori, res, nil
|
||||
return unmodifiedFile, formattedFile, nil
|
||||
}
|
||||
|
|
37
vendor/github.com/daixiang0/gci/pkg/gci/imports/errors.go
generated
vendored
Normal file
37
vendor/github.com/daixiang0/gci/pkg/gci/imports/errors.go
generated
vendored
Normal file
|
@ -0,0 +1,37 @@
|
|||
package imports
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type ValidationError struct {
|
||||
error
|
||||
}
|
||||
|
||||
func (v ValidationError) Unwrap() error {
|
||||
return v.error
|
||||
}
|
||||
|
||||
func (v ValidationError) Is(err error) bool {
|
||||
_, ok := err.(ValidationError)
|
||||
return ok
|
||||
}
|
||||
|
||||
var MissingOpeningQuotesError = ValidationError{errors.New("path is missing starting quotes")}
|
||||
|
||||
var MissingClosingQuotesError = ValidationError{errors.New("path is missing closing quotes")}
|
||||
|
||||
type InvalidCharacterError struct {
|
||||
char rune
|
||||
alias string
|
||||
}
|
||||
|
||||
func (i InvalidCharacterError) Error() string {
|
||||
return fmt.Sprintf("Found non-letter character %q in Alias: %s", i.char, i.alias)
|
||||
}
|
||||
|
||||
func (i InvalidCharacterError) Is(err error) bool {
|
||||
_, ok := err.(InvalidCharacterError)
|
||||
return ok
|
||||
}
|
86
vendor/github.com/daixiang0/gci/pkg/gci/imports/import.go
generated
vendored
Normal file
86
vendor/github.com/daixiang0/gci/pkg/gci/imports/import.go
generated
vendored
Normal file
|
@ -0,0 +1,86 @@
|
|||
package imports
|
||||
|
||||
import (
|
||||
"sort"
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
"github.com/daixiang0/gci/pkg/constants"
|
||||
)
|
||||
|
||||
type ImportDef struct {
|
||||
Alias string
|
||||
QuotedPath string
|
||||
PrefixComment []string
|
||||
InlineComment string
|
||||
}
|
||||
|
||||
func (i ImportDef) Path() string {
|
||||
return strings.TrimSuffix(strings.TrimPrefix(i.QuotedPath, string('"')), string('"'))
|
||||
}
|
||||
|
||||
// Validate checks whether the contents are valid for an import
|
||||
func (i ImportDef) Validate() error {
|
||||
err := checkAlias(i.Alias)
|
||||
if err != nil {
|
||||
return ValidationError{err}
|
||||
}
|
||||
if !strings.HasPrefix(i.QuotedPath, string('"')) {
|
||||
return MissingOpeningQuotesError
|
||||
}
|
||||
if !strings.HasSuffix(i.QuotedPath, string('"')) {
|
||||
return MissingClosingQuotesError
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkAlias(alias string) error {
|
||||
for idx, r := range alias {
|
||||
if !unicode.IsLetter(r) {
|
||||
if r != '_' && r != '.' {
|
||||
if idx == 0 || !unicode.IsDigit(r) {
|
||||
// aliases may not start with a digit
|
||||
return InvalidCharacterError{r, alias}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i ImportDef) String() string {
|
||||
return i.QuotedPath
|
||||
}
|
||||
|
||||
func (i ImportDef) Format(cfg configuration.FormatterConfiguration) string {
|
||||
linePrefix := constants.Indent
|
||||
var output string
|
||||
if cfg.NoPrefixComments == false {
|
||||
for _, prefixComment := range i.PrefixComment {
|
||||
output += linePrefix + prefixComment + constants.Linebreak
|
||||
}
|
||||
}
|
||||
output += linePrefix
|
||||
if i.Alias != "" {
|
||||
output += i.Alias + constants.Blank
|
||||
}
|
||||
output += i.QuotedPath
|
||||
if cfg.NoInlineComments == false {
|
||||
if i.InlineComment != "" {
|
||||
output += constants.Blank + i.InlineComment
|
||||
}
|
||||
}
|
||||
output += constants.Linebreak
|
||||
return output
|
||||
}
|
||||
|
||||
func SortImportsByPath(imports []ImportDef) []ImportDef {
|
||||
sort.Slice(
|
||||
imports,
|
||||
func(i, j int) bool {
|
||||
return sort.StringsAreSorted([]string{imports[i].Path(), imports[j].Path()})
|
||||
},
|
||||
)
|
||||
return imports
|
||||
}
|
56
vendor/github.com/daixiang0/gci/pkg/gci/parse.go
generated
vendored
Normal file
56
vendor/github.com/daixiang0/gci/pkg/gci/parse.go
generated
vendored
Normal file
|
@ -0,0 +1,56 @@
|
|||
package gci
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/constants"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
)
|
||||
|
||||
// Recursively parses import lines into a list of ImportDefs
|
||||
func parseToImportDefinitions(unformattedLines []string) ([]importPkg.ImportDef, error) {
|
||||
newImport := importPkg.ImportDef{}
|
||||
for index, unformattedLine := range unformattedLines {
|
||||
line := strings.TrimSpace(unformattedLine)
|
||||
if line == "" {
|
||||
//empty line --> starts a new import
|
||||
return parseToImportDefinitions(unformattedLines[index+1:])
|
||||
}
|
||||
if strings.HasPrefix(line, constants.CommentFlag) {
|
||||
// comment line
|
||||
newImport.PrefixComment = append(newImport.PrefixComment, line)
|
||||
continue
|
||||
}
|
||||
// split inline comment from import
|
||||
importSegments := strings.SplitN(line, constants.CommentFlag, 2)
|
||||
switch len(importSegments) {
|
||||
case 1:
|
||||
// no inline comment
|
||||
case 2:
|
||||
// inline comment present
|
||||
newImport.InlineComment = constants.CommentFlag + importSegments[1]
|
||||
default:
|
||||
return nil, InvalidImportSplitError{importSegments}
|
||||
}
|
||||
// split alias from path
|
||||
pkgArray := strings.Fields(importSegments[0])
|
||||
switch len(pkgArray) {
|
||||
case 1:
|
||||
// only a path
|
||||
newImport.QuotedPath = pkgArray[0]
|
||||
case 2:
|
||||
// alias + path
|
||||
newImport.Alias = pkgArray[0]
|
||||
newImport.QuotedPath = pkgArray[1]
|
||||
default:
|
||||
return nil, InvalidAliasSplitError{pkgArray}
|
||||
}
|
||||
err := newImport.Validate()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
followingImports, err := parseToImportDefinitions(unformattedLines[index+1:])
|
||||
return append([]importPkg.ImportDef{newImport}, followingImports...), err
|
||||
}
|
||||
return nil, nil
|
||||
}
|
51
vendor/github.com/daixiang0/gci/pkg/gci/sections/commentline.go
generated
vendored
Normal file
51
vendor/github.com/daixiang0/gci/pkg/gci/sections/commentline.go
generated
vendored
Normal file
|
@ -0,0 +1,51 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
"github.com/daixiang0/gci/pkg/constants"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
"github.com/daixiang0/gci/pkg/gci/specificity"
|
||||
)
|
||||
|
||||
func init() {
|
||||
commentLineType := SectionType{
|
||||
generatorFun: func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error) {
|
||||
return CommentLine{parameter}, nil
|
||||
},
|
||||
aliases: []string{"Comment", "CommentLine"},
|
||||
parameterHelp: "your text here",
|
||||
description: "Prints the specified indented comment",
|
||||
}.StandAloneSection()
|
||||
SectionParserInst.registerSectionWithoutErr(&commentLineType)
|
||||
}
|
||||
|
||||
type CommentLine struct {
|
||||
Comment string
|
||||
}
|
||||
|
||||
func (c CommentLine) MatchSpecificity(spec importPkg.ImportDef) specificity.MatchSpecificity {
|
||||
return specificity.MisMatch{}
|
||||
}
|
||||
|
||||
func (c CommentLine) Format(imports []importPkg.ImportDef, cfg configuration.FormatterConfiguration) string {
|
||||
comment := constants.Indent + "//" + c.Comment
|
||||
if !strings.HasSuffix(comment, constants.Linebreak) {
|
||||
comment += constants.Linebreak
|
||||
}
|
||||
return comment
|
||||
}
|
||||
|
||||
func (c CommentLine) sectionPrefix() Section {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c CommentLine) sectionSuffix() Section {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c CommentLine) String() string {
|
||||
return fmt.Sprintf("CommentLine(%s)", c.Comment)
|
||||
}
|
43
vendor/github.com/daixiang0/gci/pkg/gci/sections/default.go
generated
vendored
Normal file
43
vendor/github.com/daixiang0/gci/pkg/gci/sections/default.go
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
"github.com/daixiang0/gci/pkg/gci/specificity"
|
||||
)
|
||||
|
||||
func init() {
|
||||
defaultSectionType := SectionType{
|
||||
generatorFun: func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error) {
|
||||
return DefaultSection{sectionPrefix, sectionSuffix}, nil
|
||||
},
|
||||
aliases: []string{"Def", "Default"},
|
||||
description: "Contains all imports that could not be matched to another section type",
|
||||
}.WithoutParameter()
|
||||
SectionParserInst.registerSectionWithoutErr(&defaultSectionType)
|
||||
}
|
||||
|
||||
type DefaultSection struct {
|
||||
Prefix Section
|
||||
Suffix Section
|
||||
}
|
||||
|
||||
func (d DefaultSection) sectionPrefix() Section {
|
||||
return d.Prefix
|
||||
}
|
||||
|
||||
func (d DefaultSection) sectionSuffix() Section {
|
||||
return d.Suffix
|
||||
}
|
||||
|
||||
func (d DefaultSection) MatchSpecificity(spec importPkg.ImportDef) specificity.MatchSpecificity {
|
||||
return specificity.Default{}
|
||||
}
|
||||
|
||||
func (d DefaultSection) Format(imports []importPkg.ImportDef, cfg configuration.FormatterConfiguration) string {
|
||||
return inorderSectionFormat(d, imports, cfg)
|
||||
}
|
||||
|
||||
func (d DefaultSection) String() string {
|
||||
return sectionStringWithPrefixSuffix("Default", d)
|
||||
}
|
68
vendor/github.com/daixiang0/gci/pkg/gci/sections/errors.go
generated
vendored
Normal file
68
vendor/github.com/daixiang0/gci/pkg/gci/sections/errors.go
generated
vendored
Normal file
|
@ -0,0 +1,68 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/constants"
|
||||
)
|
||||
|
||||
type SectionParsingError struct {
|
||||
error
|
||||
}
|
||||
|
||||
func (s SectionParsingError) Unwrap() error {
|
||||
return s.error
|
||||
}
|
||||
|
||||
func (s SectionParsingError) Wrap(sectionStr string) error {
|
||||
return fmt.Errorf("failed to parse section %q: %w", sectionStr, s)
|
||||
}
|
||||
|
||||
func (s SectionParsingError) Is(err error) bool {
|
||||
_, ok := err.(SectionParsingError)
|
||||
return ok
|
||||
}
|
||||
|
||||
type TypeAlreadyRegisteredError struct {
|
||||
duplicateAlias string
|
||||
newType, existingType SectionType
|
||||
}
|
||||
|
||||
func (t TypeAlreadyRegisteredError) Error() string {
|
||||
return fmt.Sprintf("New type %q could not be registered because alias %q was already defined in %q", t.newType, t.duplicateAlias, t.existingType)
|
||||
}
|
||||
|
||||
func (t TypeAlreadyRegisteredError) Is(err error) bool {
|
||||
_, ok := err.(TypeAlreadyRegisteredError)
|
||||
return ok
|
||||
}
|
||||
|
||||
var PrefixNotAllowedError = errors.New("section may not contain a Prefix")
|
||||
|
||||
var SuffixNotAllowedError = errors.New("section may not contain a Suffix")
|
||||
|
||||
var SectionFormatInvalidError = errors.New("section Definition does not match format [FormattingSection:]Section[:FormattingSection]")
|
||||
|
||||
type SectionAliasNotRegisteredWithParser struct {
|
||||
missingAlias string
|
||||
}
|
||||
|
||||
func (s SectionAliasNotRegisteredWithParser) Error() string {
|
||||
return fmt.Sprintf("section alias %q not registered with parser", s.missingAlias)
|
||||
}
|
||||
|
||||
func (s SectionAliasNotRegisteredWithParser) Is(err error) bool {
|
||||
_, ok := err.(SectionAliasNotRegisteredWithParser)
|
||||
return ok
|
||||
}
|
||||
|
||||
var MissingParameterClosingBracketsError = fmt.Errorf("section parameter is missing closing %q", constants.ParameterClosingBrackets)
|
||||
|
||||
var MoreThanOneOpeningQuotesError = fmt.Errorf("found more than one %q parameter start sequences", constants.ParameterClosingBrackets)
|
||||
|
||||
var SectionTypeDoesNotAcceptParametersError = errors.New("section type does not accept a parameter")
|
||||
|
||||
var SectionTypeDoesNotAcceptPrefixError = errors.New("section may not contain a Prefix")
|
||||
|
||||
var SectionTypeDoesNotAcceptSuffixError = errors.New("section may not contain a Suffix")
|
41
vendor/github.com/daixiang0/gci/pkg/gci/sections/newline.go
generated
vendored
Normal file
41
vendor/github.com/daixiang0/gci/pkg/gci/sections/newline.go
generated
vendored
Normal file
|
@ -0,0 +1,41 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
"github.com/daixiang0/gci/pkg/constants"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
"github.com/daixiang0/gci/pkg/gci/specificity"
|
||||
)
|
||||
|
||||
func init() {
|
||||
newLineType := SectionType{
|
||||
generatorFun: func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error) {
|
||||
return NewLine{}, nil
|
||||
},
|
||||
aliases: []string{"NL", "NewLine"},
|
||||
description: "Prints an empty line",
|
||||
}.StandAloneSection().WithoutParameter()
|
||||
SectionParserInst.registerSectionWithoutErr(&newLineType)
|
||||
}
|
||||
|
||||
type NewLine struct{}
|
||||
|
||||
func (n NewLine) sectionPrefix() Section {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n NewLine) sectionSuffix() Section {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n NewLine) MatchSpecificity(spec importPkg.ImportDef) specificity.MatchSpecificity {
|
||||
return specificity.MisMatch{}
|
||||
}
|
||||
|
||||
func (n NewLine) Format(imports []importPkg.ImportDef, cfg configuration.FormatterConfiguration) string {
|
||||
return constants.Linebreak
|
||||
}
|
||||
|
||||
func (n NewLine) String() string {
|
||||
return "NewLine"
|
||||
}
|
51
vendor/github.com/daixiang0/gci/pkg/gci/sections/prefix.go
generated
vendored
Normal file
51
vendor/github.com/daixiang0/gci/pkg/gci/sections/prefix.go
generated
vendored
Normal file
|
@ -0,0 +1,51 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
"github.com/daixiang0/gci/pkg/gci/specificity"
|
||||
)
|
||||
|
||||
func init() {
|
||||
prefixType := &SectionType{
|
||||
generatorFun: func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error) {
|
||||
return Prefix{parameter, sectionPrefix, sectionSuffix}, nil
|
||||
},
|
||||
aliases: []string{"Prefix", "pkgPrefix"},
|
||||
parameterHelp: "gitlab.com/myorg",
|
||||
description: "Groups all imports with the specified Prefix. Imports will be matched to the longest Prefix.",
|
||||
}
|
||||
SectionParserInst.registerSectionWithoutErr(prefixType)
|
||||
}
|
||||
|
||||
type Prefix struct {
|
||||
ImportPrefix string
|
||||
Prefix Section
|
||||
Suffix Section
|
||||
}
|
||||
|
||||
func (p Prefix) sectionPrefix() Section {
|
||||
return p.Prefix
|
||||
}
|
||||
|
||||
func (p Prefix) sectionSuffix() Section {
|
||||
return p.Suffix
|
||||
}
|
||||
|
||||
func (p Prefix) MatchSpecificity(spec importPkg.ImportDef) specificity.MatchSpecificity {
|
||||
if len(p.ImportPrefix) > 0 && strings.HasPrefix(spec.Path(), p.ImportPrefix) {
|
||||
return specificity.Match{len(p.ImportPrefix)}
|
||||
}
|
||||
return specificity.MisMatch{}
|
||||
}
|
||||
|
||||
func (p Prefix) Format(imports []importPkg.ImportDef, cfg configuration.FormatterConfiguration) string {
|
||||
return inorderSectionFormat(p, imports, cfg)
|
||||
}
|
||||
|
||||
func (p Prefix) String() string {
|
||||
return sectionStringWithPrefixSuffix(fmt.Sprintf("Prefix(%s)", p.ImportPrefix), p)
|
||||
}
|
58
vendor/github.com/daixiang0/gci/pkg/gci/sections/section.go
generated
vendored
Normal file
58
vendor/github.com/daixiang0/gci/pkg/gci/sections/section.go
generated
vendored
Normal file
|
@ -0,0 +1,58 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
"github.com/daixiang0/gci/pkg/gci/specificity"
|
||||
)
|
||||
|
||||
// Section defines a part of the formatted output.
|
||||
type Section interface {
|
||||
// MatchSpecificity returns how well an Import matches to this Section
|
||||
MatchSpecificity(spec importPkg.ImportDef) specificity.MatchSpecificity
|
||||
// Format receives the array of imports that have matched this section and formats them according to it´s rules
|
||||
Format(imports []importPkg.ImportDef, cfg configuration.FormatterConfiguration) string
|
||||
// Returns the Section that will be prefixed if this section is rendered
|
||||
sectionPrefix() Section
|
||||
// Returns the Section that will be suffixed if this section is rendered
|
||||
sectionSuffix() Section
|
||||
// String Implements the stringer interface
|
||||
String() string
|
||||
}
|
||||
|
||||
//Unbound methods that are required until interface methods are supported
|
||||
|
||||
// Default method for formatting a section
|
||||
func inorderSectionFormat(section Section, imports []importPkg.ImportDef, cfg configuration.FormatterConfiguration) string {
|
||||
imports = importPkg.SortImportsByPath(imports)
|
||||
var output string
|
||||
if len(imports) > 0 && section.sectionPrefix() != nil {
|
||||
// imports are not passed to a prefix section to prevent rendering them twice
|
||||
output += section.sectionPrefix().Format([]importPkg.ImportDef{}, cfg)
|
||||
}
|
||||
for _, importDef := range imports {
|
||||
output += importDef.Format(cfg)
|
||||
}
|
||||
if len(imports) > 0 && section.sectionSuffix() != nil {
|
||||
// imports are not passed to a suffix section to prevent rendering them twice
|
||||
output += section.sectionSuffix().Format([]importPkg.ImportDef{}, cfg)
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
// Default method for converting a section to a String representation
|
||||
func sectionStringWithPrefixSuffix(mainSectionStr string, section Section) (output string) {
|
||||
if section.sectionPrefix() != nil {
|
||||
output += fmt.Sprintf("%v:", section.sectionPrefix())
|
||||
} else if section.sectionSuffix() != nil {
|
||||
// insert empty prefix to make suffix distinguishable from prefix
|
||||
output += ":"
|
||||
}
|
||||
output += mainSectionStr
|
||||
if section.sectionSuffix() != nil {
|
||||
output += fmt.Sprintf(":%v", section.sectionSuffix())
|
||||
}
|
||||
return output
|
||||
}
|
139
vendor/github.com/daixiang0/gci/pkg/gci/sections/sectionparser.go
generated
vendored
Normal file
139
vendor/github.com/daixiang0/gci/pkg/gci/sections/sectionparser.go
generated
vendored
Normal file
|
@ -0,0 +1,139 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/daixiang0/gci/pkg/constants"
|
||||
)
|
||||
|
||||
var SectionParserInst = SectionParser{}
|
||||
|
||||
type SectionParser struct {
|
||||
sectionTypes []SectionType
|
||||
}
|
||||
|
||||
func (s *SectionParser) RegisterSection(newSectionType *SectionType) error {
|
||||
for _, existingSectionType := range s.sectionTypes {
|
||||
for _, alias := range existingSectionType.aliases {
|
||||
for _, newAlias := range newSectionType.aliases {
|
||||
if alias == newAlias {
|
||||
return TypeAlreadyRegisteredError{alias, *newSectionType, existingSectionType}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
s.sectionTypes = append(s.sectionTypes, *newSectionType)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SectionParser) registerSectionWithoutErr(newSectionType *SectionType) {
|
||||
err := s.RegisterSection(newSectionType)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *SectionParser) ParseSectionStrings(sectionStrings []string, withSuffix, withPrefix bool) ([]Section, error) {
|
||||
var parsedSections []Section
|
||||
for _, sectionStr := range sectionStrings {
|
||||
section, err := s.parseSectionString(sectionStr, withSuffix, withPrefix)
|
||||
if err != nil {
|
||||
return nil, SectionParsingError{err}.Wrap(sectionStr)
|
||||
}
|
||||
parsedSections = append(parsedSections, section)
|
||||
}
|
||||
return parsedSections, nil
|
||||
}
|
||||
|
||||
func (s *SectionParser) parseSectionString(sectionStr string, withSuffix, withPrefix bool) (Section, error) {
|
||||
trimmedSection := strings.TrimSpace(sectionStr)
|
||||
sectionSegments := strings.Split(trimmedSection, constants.SectionSeparator)
|
||||
switch len(sectionSegments) {
|
||||
case 1:
|
||||
// section
|
||||
return s.parseSectionStringComponents("", sectionSegments[0], "")
|
||||
case 2:
|
||||
// prefix + section
|
||||
if !withPrefix {
|
||||
return nil, PrefixNotAllowedError
|
||||
}
|
||||
return s.parseSectionStringComponents(sectionSegments[0], sectionSegments[1], "")
|
||||
case 3:
|
||||
// prefix + section + suffix
|
||||
if !withPrefix {
|
||||
return nil, PrefixNotAllowedError
|
||||
}
|
||||
if !withSuffix {
|
||||
return nil, SuffixNotAllowedError
|
||||
}
|
||||
return s.parseSectionStringComponents(sectionSegments[0], sectionSegments[1], sectionSegments[2])
|
||||
}
|
||||
return nil, SectionFormatInvalidError
|
||||
}
|
||||
|
||||
func (s *SectionParser) parseSectionStringComponents(sectionPrefixStr string, sectionStr string, sectionSuffixStr string) (Section, error) {
|
||||
var sectionPrefix, sectionSuffix Section
|
||||
var err error
|
||||
if len(sectionPrefixStr) > 0 {
|
||||
sectionPrefix, err = s.createSectionFromString(sectionPrefixStr, nil, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("section prefix %q could not be parsed: %w", sectionPrefixStr, err)
|
||||
}
|
||||
}
|
||||
if len(sectionSuffixStr) > 0 {
|
||||
sectionSuffix, err = s.createSectionFromString(sectionSuffixStr, nil, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("section suffix %q could not be parsed: %w", sectionSuffixStr, err)
|
||||
}
|
||||
}
|
||||
section, err := s.createSectionFromString(sectionStr, sectionPrefix, sectionSuffix)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return section, nil
|
||||
}
|
||||
|
||||
func (s *SectionParser) createSectionFromString(sectionStr string, prefixSection, suffixSection Section) (Section, error) {
|
||||
// create map of all aliases
|
||||
aliasMap := map[string]SectionType{}
|
||||
for _, sectionType := range s.sectionTypes {
|
||||
for _, alias := range sectionType.aliases {
|
||||
aliasMap[strings.ToLower(alias)] = sectionType
|
||||
}
|
||||
}
|
||||
// parse everything before the parameter brackets
|
||||
sectionComponents := strings.Split(sectionStr, constants.ParameterOpeningBrackets)
|
||||
alias := sectionComponents[0]
|
||||
sectionType, exists := aliasMap[strings.ToLower(alias)]
|
||||
if !exists {
|
||||
return nil, SectionAliasNotRegisteredWithParser{alias}
|
||||
}
|
||||
switch len(sectionComponents) {
|
||||
case 1:
|
||||
return sectionType.generatorFun("", prefixSection, suffixSection)
|
||||
case 2:
|
||||
if strings.HasSuffix(sectionComponents[1], constants.ParameterClosingBrackets) {
|
||||
return sectionType.generatorFun(strings.TrimSuffix(sectionComponents[1], constants.ParameterClosingBrackets), prefixSection, suffixSection)
|
||||
} else {
|
||||
return nil, MissingParameterClosingBracketsError
|
||||
}
|
||||
}
|
||||
return nil, MoreThanOneOpeningQuotesError
|
||||
}
|
||||
|
||||
func (s *SectionParser) SectionHelpTexts() string {
|
||||
help := ""
|
||||
for _, sectionType := range s.sectionTypes {
|
||||
var aliasesWithParameters []string
|
||||
for _, alias := range sectionType.aliases {
|
||||
parameterSuffix := ""
|
||||
if sectionType.parameterHelp != "" {
|
||||
parameterSuffix = "(" + sectionType.parameterHelp + ")"
|
||||
}
|
||||
aliasesWithParameters = append(aliasesWithParameters, alias+parameterSuffix)
|
||||
}
|
||||
help += fmt.Sprintf("%s - %s\n", strings.Join(aliasesWithParameters, " | "), sectionType.description)
|
||||
}
|
||||
return help
|
||||
}
|
40
vendor/github.com/daixiang0/gci/pkg/gci/sections/sectiontype.go
generated
vendored
Normal file
40
vendor/github.com/daixiang0/gci/pkg/gci/sections/sectiontype.go
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// A SectionType is used to dynamically register Sections with the parser
|
||||
type SectionType struct {
|
||||
generatorFun func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error)
|
||||
aliases []string
|
||||
parameterHelp string
|
||||
description string
|
||||
}
|
||||
|
||||
func (t SectionType) WithoutParameter() SectionType {
|
||||
generatorFun := func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error) {
|
||||
if parameter != "" {
|
||||
return nil, SectionTypeDoesNotAcceptParametersError
|
||||
}
|
||||
return t.generatorFun(parameter, sectionPrefix, sectionSuffix)
|
||||
}
|
||||
return SectionType{generatorFun, t.aliases, "", t.description}
|
||||
}
|
||||
|
||||
func (t SectionType) StandAloneSection() SectionType {
|
||||
generatorFun := func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error) {
|
||||
if sectionPrefix != nil {
|
||||
return nil, SectionTypeDoesNotAcceptPrefixError
|
||||
}
|
||||
if sectionSuffix != nil {
|
||||
return nil, SectionTypeDoesNotAcceptSuffixError
|
||||
}
|
||||
return t.generatorFun(parameter, sectionPrefix, sectionSuffix)
|
||||
}
|
||||
return SectionType{generatorFun, t.aliases, t.parameterHelp, t.description}
|
||||
}
|
||||
|
||||
func (t SectionType) String() string {
|
||||
return fmt.Sprintf("Sectiontype(aliases: %v,description: %s)", t.aliases, t.description)
|
||||
}
|
51
vendor/github.com/daixiang0/gci/pkg/gci/sections/standardpackage.go
generated
vendored
Normal file
51
vendor/github.com/daixiang0/gci/pkg/gci/sections/standardpackage.go
generated
vendored
Normal file
|
@ -0,0 +1,51 @@
|
|||
package sections
|
||||
|
||||
import (
|
||||
"github.com/daixiang0/gci/pkg/configuration"
|
||||
importPkg "github.com/daixiang0/gci/pkg/gci/imports"
|
||||
"github.com/daixiang0/gci/pkg/gci/specificity"
|
||||
)
|
||||
|
||||
func init() {
|
||||
standardPackageType := SectionType{
|
||||
generatorFun: func(parameter string, sectionPrefix, sectionSuffix Section) (Section, error) {
|
||||
return StandardPackage{sectionPrefix, sectionSuffix}, nil
|
||||
},
|
||||
aliases: []string{"Std", "Standard"},
|
||||
description: "Captures all standard packages if they do not match another section",
|
||||
}.WithoutParameter()
|
||||
SectionParserInst.registerSectionWithoutErr(&standardPackageType)
|
||||
}
|
||||
|
||||
type StandardPackage struct {
|
||||
prefix Section
|
||||
suffix Section
|
||||
}
|
||||
|
||||
func (s StandardPackage) sectionPrefix() Section {
|
||||
return s.prefix
|
||||
}
|
||||
|
||||
func (s StandardPackage) sectionSuffix() Section {
|
||||
return s.suffix
|
||||
}
|
||||
|
||||
func (s StandardPackage) MatchSpecificity(spec importPkg.ImportDef) specificity.MatchSpecificity {
|
||||
if isStandardPackage(spec.Path()) {
|
||||
return specificity.StandardPackageMatch{}
|
||||
}
|
||||
return specificity.MisMatch{}
|
||||
}
|
||||
|
||||
func (s StandardPackage) Format(imports []importPkg.ImportDef, cfg configuration.FormatterConfiguration) string {
|
||||
return inorderSectionFormat(s, imports, cfg)
|
||||
}
|
||||
|
||||
func (s StandardPackage) String() string {
|
||||
return sectionStringWithPrefixSuffix("Standard", s)
|
||||
}
|
||||
|
||||
func isStandardPackage(pkg string) bool {
|
||||
_, ok := standardPackages[pkg]
|
||||
return ok
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package gci
|
||||
package sections
|
||||
|
||||
// Code generated based on go1.16beta1. DO NOT EDIT.
|
||||
// Code generated based on go1.17.5. DO NOT EDIT.
|
||||
|
||||
var standardPackages = map[string]struct{}{
|
||||
"archive/tar": {},
|
||||
|
@ -63,6 +63,7 @@ var standardPackages = map[string]struct{}{
|
|||
"fmt": {},
|
||||
"go/ast": {},
|
||||
"go/build": {},
|
||||
"go/build/constraint": {},
|
||||
"go/constant": {},
|
||||
"go/doc": {},
|
||||
"go/format": {},
|
||||
|
@ -154,8 +155,3 @@ var standardPackages = map[string]struct{}{
|
|||
"unicode/utf8": {},
|
||||
"unsafe": {},
|
||||
}
|
||||
|
||||
func isStandardPackage(pkg string) bool {
|
||||
_, ok := standardPackages[pkg]
|
||||
return ok
|
||||
}
|
19
vendor/github.com/daixiang0/gci/pkg/gci/specificity/default.go
generated
vendored
Normal file
19
vendor/github.com/daixiang0/gci/pkg/gci/specificity/default.go
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
package specificity
|
||||
|
||||
type Default struct {
|
||||
}
|
||||
|
||||
func (d Default) IsMoreSpecific(than MatchSpecificity) bool {
|
||||
return isMoreSpecific(d, than)
|
||||
}
|
||||
func (d Default) Equal(to MatchSpecificity) bool {
|
||||
return equalSpecificity(d, to)
|
||||
}
|
||||
|
||||
func (d Default) class() specificityClass {
|
||||
return DefaultClass
|
||||
}
|
||||
|
||||
func (d Default) String() string {
|
||||
return "Default"
|
||||
}
|
24
vendor/github.com/daixiang0/gci/pkg/gci/specificity/match.go
generated
vendored
Normal file
24
vendor/github.com/daixiang0/gci/pkg/gci/specificity/match.go
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
package specificity
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Match struct {
|
||||
Length int
|
||||
}
|
||||
|
||||
func (m Match) IsMoreSpecific(than MatchSpecificity) bool {
|
||||
otherMatch, isMatch := than.(Match)
|
||||
return isMoreSpecific(m, than) || (isMatch && m.Length > otherMatch.Length)
|
||||
}
|
||||
|
||||
func (m Match) Equal(to MatchSpecificity) bool {
|
||||
return equalSpecificity(m, to)
|
||||
}
|
||||
|
||||
func (m Match) class() specificityClass {
|
||||
return MatchClass
|
||||
}
|
||||
|
||||
func (m Match) String() string {
|
||||
return fmt.Sprintf("Match(length: %d)", m.Length)
|
||||
}
|
21
vendor/github.com/daixiang0/gci/pkg/gci/specificity/mismatch.go
generated
vendored
Normal file
21
vendor/github.com/daixiang0/gci/pkg/gci/specificity/mismatch.go
generated
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
package specificity
|
||||
|
||||
type MisMatch struct {
|
||||
}
|
||||
|
||||
func (m MisMatch) IsMoreSpecific(than MatchSpecificity) bool {
|
||||
return isMoreSpecific(m, than)
|
||||
}
|
||||
|
||||
func (m MisMatch) Equal(to MatchSpecificity) bool {
|
||||
return equalSpecificity(m, to)
|
||||
}
|
||||
|
||||
func (m MisMatch) class() specificityClass {
|
||||
return MisMatchClass
|
||||
}
|
||||
|
||||
func (m MisMatch) String() string {
|
||||
return "Mismatch"
|
||||
|
||||
}
|
28
vendor/github.com/daixiang0/gci/pkg/gci/specificity/specificity.go
generated
vendored
Normal file
28
vendor/github.com/daixiang0/gci/pkg/gci/specificity/specificity.go
generated
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
package specificity
|
||||
|
||||
type specificityClass int
|
||||
|
||||
const (
|
||||
MisMatchClass = 0
|
||||
DefaultClass = 10
|
||||
StandardPackageClass = 20
|
||||
MatchClass = 30
|
||||
)
|
||||
|
||||
// MatchSpecificity is used to determine which section matches an import best
|
||||
type MatchSpecificity interface {
|
||||
IsMoreSpecific(than MatchSpecificity) bool
|
||||
Equal(to MatchSpecificity) bool
|
||||
class() specificityClass
|
||||
}
|
||||
|
||||
//Unbound methods that are required until interface methods are supported
|
||||
|
||||
func isMoreSpecific(this, than MatchSpecificity) bool {
|
||||
return this.class() > than.class()
|
||||
}
|
||||
|
||||
func equalSpecificity(base, to MatchSpecificity) bool {
|
||||
// m.class() == to.class() would not work for Match
|
||||
return !base.IsMoreSpecific(to) && !to.IsMoreSpecific(base)
|
||||
}
|
20
vendor/github.com/daixiang0/gci/pkg/gci/specificity/standard.go
generated
vendored
Normal file
20
vendor/github.com/daixiang0/gci/pkg/gci/specificity/standard.go
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
package specificity
|
||||
|
||||
type StandardPackageMatch struct {
|
||||
}
|
||||
|
||||
func (s StandardPackageMatch) IsMoreSpecific(than MatchSpecificity) bool {
|
||||
return isMoreSpecific(s, than)
|
||||
}
|
||||
|
||||
func (s StandardPackageMatch) Equal(to MatchSpecificity) bool {
|
||||
return equalSpecificity(s, to)
|
||||
}
|
||||
|
||||
func (s StandardPackageMatch) class() specificityClass {
|
||||
return StandardPackageClass
|
||||
}
|
||||
|
||||
func (s StandardPackageMatch) String() string {
|
||||
return "Standard"
|
||||
}
|
59
vendor/github.com/daixiang0/gci/pkg/io/file.go
generated
vendored
Normal file
59
vendor/github.com/daixiang0/gci/pkg/io/file.go
generated
vendored
Normal file
|
@ -0,0 +1,59 @@
|
|||
package io
|
||||
|
||||
import "io/ioutil"
|
||||
|
||||
// FileObj allows mocking the access to files
|
||||
type FileObj interface {
|
||||
Load() ([]byte, error)
|
||||
Path() string
|
||||
}
|
||||
|
||||
// File represents a file that can be loaded from the file system
|
||||
type File struct {
|
||||
FilePath string
|
||||
}
|
||||
|
||||
func (f File) Path() string {
|
||||
return f.FilePath
|
||||
}
|
||||
|
||||
func (f File) Load() ([]byte, error) {
|
||||
return ioutil.ReadFile(f.FilePath)
|
||||
}
|
||||
|
||||
// FileGeneratorFunc returns a list of files that can be loaded and processed
|
||||
type FileGeneratorFunc func() ([]FileObj, error)
|
||||
|
||||
func (a FileGeneratorFunc) Combine(b FileGeneratorFunc) FileGeneratorFunc {
|
||||
return func() ([]FileObj, error) {
|
||||
files, err := a()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
additionalFiles, err := b()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
files = append(files, additionalFiles...)
|
||||
return files, err
|
||||
}
|
||||
}
|
||||
|
||||
func GoFilesInPathsGenerator(paths []string) FileGeneratorFunc {
|
||||
return FilesInPathsGenerator(paths, isGoFile)
|
||||
}
|
||||
|
||||
func FilesInPathsGenerator(paths []string, fileCheckFun fileCheckFunction) FileGeneratorFunc {
|
||||
return func() (foundFiles []FileObj, err error) {
|
||||
for _, path := range paths {
|
||||
files, err := FindFilesForPath(path, fileCheckFun)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, filePath := range files {
|
||||
foundFiles = append(foundFiles, File{filePath})
|
||||
}
|
||||
}
|
||||
return foundFiles, nil
|
||||
}
|
||||
}
|
47
vendor/github.com/daixiang0/gci/pkg/io/search.go
generated
vendored
Normal file
47
vendor/github.com/daixiang0/gci/pkg/io/search.go
generated
vendored
Normal file
|
@ -0,0 +1,47 @@
|
|||
package io
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
type fileCheckFunction func(file os.FileInfo) bool
|
||||
|
||||
func FindFilesForPath(path string, fileCheckFun fileCheckFunction) ([]string, error) {
|
||||
switch entry, err := os.Stat(path); {
|
||||
case err != nil:
|
||||
return nil, err
|
||||
case entry.IsDir():
|
||||
return findFilesForDirectory(path, fileCheckFun)
|
||||
case fileCheckFun(entry):
|
||||
return []string{filepath.Clean(path)}, nil
|
||||
default:
|
||||
return []string{}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func findFilesForDirectory(dirPath string, fileCheckFun fileCheckFunction) ([]string, error) {
|
||||
var filePaths []string
|
||||
err := filepath.WalkDir(dirPath, func(path string, entry fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
file, err := entry.Info()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !entry.IsDir() && fileCheckFun(file) {
|
||||
filePaths = append(filePaths, filepath.Clean(path))
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return filePaths, nil
|
||||
}
|
||||
|
||||
func isGoFile(file os.FileInfo) bool {
|
||||
return !file.IsDir() && filepath.Ext(file.Name()) == ".go"
|
||||
}
|
28
vendor/github.com/daixiang0/gci/pkg/io/stdin.go
generated
vendored
Normal file
28
vendor/github.com/daixiang0/gci/pkg/io/stdin.go
generated
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
package io
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
)
|
||||
|
||||
type stdInFile struct {
|
||||
}
|
||||
|
||||
func (s stdInFile) Load() ([]byte, error) {
|
||||
return ioutil.ReadAll(os.Stdin)
|
||||
}
|
||||
|
||||
func (s stdInFile) Path() string {
|
||||
return "StdIn"
|
||||
}
|
||||
|
||||
var StdInGenerator FileGeneratorFunc = func() ([]FileObj, error) {
|
||||
stat, err := os.Stdin.Stat()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if (stat.Mode() & os.ModeCharDevice) == 0 {
|
||||
return []FileObj{stdInFile{}}, nil
|
||||
}
|
||||
return []FileObj{}, nil
|
||||
}
|
29
vendor/github.com/docker/distribution/reference/normalize.go
generated
vendored
29
vendor/github.com/docker/distribution/reference/normalize.go
generated
vendored
|
@ -56,6 +56,35 @@ func ParseNormalizedNamed(s string) (Named, error) {
|
|||
return named, nil
|
||||
}
|
||||
|
||||
// ParseDockerRef normalizes the image reference following the docker convention. This is added
|
||||
// mainly for backward compatibility.
|
||||
// The reference returned can only be either tagged or digested. For reference contains both tag
|
||||
// and digest, the function returns digested reference, e.g. docker.io/library/busybox:latest@
|
||||
// sha256:7cc4b5aefd1d0cadf8d97d4350462ba51c694ebca145b08d7d41b41acc8db5aa will be returned as
|
||||
// docker.io/library/busybox@sha256:7cc4b5aefd1d0cadf8d97d4350462ba51c694ebca145b08d7d41b41acc8db5aa.
|
||||
func ParseDockerRef(ref string) (Named, error) {
|
||||
named, err := ParseNormalizedNamed(ref)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if _, ok := named.(NamedTagged); ok {
|
||||
if canonical, ok := named.(Canonical); ok {
|
||||
// The reference is both tagged and digested, only
|
||||
// return digested.
|
||||
newNamed, err := WithName(canonical.Name())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
newCanonical, err := WithDigest(newNamed, canonical.Digest())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return newCanonical, nil
|
||||
}
|
||||
}
|
||||
return TagNameOnly(named), nil
|
||||
}
|
||||
|
||||
// splitDockerDomain splits a repository name to domain and remotename string.
|
||||
// If no valid domain is found, the default domain is used. Repository name
|
||||
// needs to be already validated before.
|
||||
|
|
2
vendor/github.com/docker/distribution/reference/reference.go
generated
vendored
2
vendor/github.com/docker/distribution/reference/reference.go
generated
vendored
|
@ -205,7 +205,7 @@ func Parse(s string) (Reference, error) {
|
|||
var repo repository
|
||||
|
||||
nameMatch := anchoredNameRegexp.FindStringSubmatch(matches[1])
|
||||
if nameMatch != nil && len(nameMatch) == 3 {
|
||||
if len(nameMatch) == 3 {
|
||||
repo.domain = nameMatch[1]
|
||||
repo.path = nameMatch[2]
|
||||
} else {
|
||||
|
|
6
vendor/github.com/docker/distribution/registry/api/errcode/errors.go
generated
vendored
6
vendor/github.com/docker/distribution/registry/api/errcode/errors.go
generated
vendored
|
@ -207,11 +207,11 @@ func (errs Errors) MarshalJSON() ([]byte, error) {
|
|||
for _, daErr := range errs {
|
||||
var err Error
|
||||
|
||||
switch daErr.(type) {
|
||||
switch daErr := daErr.(type) {
|
||||
case ErrorCode:
|
||||
err = daErr.(ErrorCode).WithDetail(nil)
|
||||
err = daErr.WithDetail(nil)
|
||||
case Error:
|
||||
err = daErr.(Error)
|
||||
err = daErr
|
||||
default:
|
||||
err = ErrorCodeUnknown.WithDetail(daErr)
|
||||
|
||||
|
|
9
vendor/github.com/esimonov/ifshort/pkg/analyzer/analyzer.go
generated
vendored
9
vendor/github.com/esimonov/ifshort/pkg/analyzer/analyzer.go
generated
vendored
|
@ -108,8 +108,15 @@ func (nom namedOccurrenceMap) checkStatement(stmt ast.Stmt, ifPos token.Pos) {
|
|||
for _, el := range v.Body.List {
|
||||
nom.checkStatement(el, v.If)
|
||||
}
|
||||
if elseBlock, ok := v.Else.(*ast.BlockStmt); ok {
|
||||
for _, el := range elseBlock.List {
|
||||
nom.checkStatement(el, v.If)
|
||||
}
|
||||
}
|
||||
|
||||
switch cond := v.Cond.(type) {
|
||||
case *ast.UnaryExpr:
|
||||
nom.checkExpression(cond.X, v.If)
|
||||
case *ast.BinaryExpr:
|
||||
nom.checkExpression(cond.X, v.If)
|
||||
nom.checkExpression(cond.Y, v.If)
|
||||
|
@ -217,6 +224,8 @@ func (nom namedOccurrenceMap) checkExpression(candidate ast.Expr, ifPos token.Po
|
|||
case *ast.KeyValueExpr:
|
||||
nom.checkExpression(v.Key, ifPos)
|
||||
nom.checkExpression(v.Value, ifPos)
|
||||
case *ast.SelectorExpr:
|
||||
nom.checkExpression(v.X, ifPos)
|
||||
}
|
||||
}
|
||||
case *ast.FuncLit:
|
||||
|
|
13
vendor/github.com/esimonov/ifshort/pkg/analyzer/occurrences.go
generated
vendored
13
vendor/github.com/esimonov/ifshort/pkg/analyzer/occurrences.go
generated
vendored
|
@ -187,14 +187,14 @@ func (nom namedOccurrenceMap) addFromCondition(stmt *ast.IfStmt) {
|
|||
case *ast.BinaryExpr:
|
||||
for _, v := range [2]ast.Expr{v.X, v.Y} {
|
||||
switch e := v.(type) {
|
||||
case *ast.CallExpr:
|
||||
nom.addFromCallExpr(stmt.If, e)
|
||||
case *ast.Ident:
|
||||
nom.addFromIdent(stmt.If, e)
|
||||
case *ast.SelectorExpr:
|
||||
nom.addFromIdent(stmt.If, e.X)
|
||||
}
|
||||
}
|
||||
case *ast.Ident:
|
||||
nom.addFromIdent(stmt.If, v)
|
||||
case *ast.CallExpr:
|
||||
for _, a := range v.Args {
|
||||
switch e := a.(type) {
|
||||
|
@ -204,6 +204,15 @@ func (nom namedOccurrenceMap) addFromCondition(stmt *ast.IfStmt) {
|
|||
nom.addFromCallExpr(stmt.If, e)
|
||||
}
|
||||
}
|
||||
case *ast.Ident:
|
||||
nom.addFromIdent(stmt.If, v)
|
||||
case *ast.UnaryExpr:
|
||||
switch e := v.X.(type) {
|
||||
case *ast.Ident:
|
||||
nom.addFromIdent(stmt.If, e)
|
||||
case *ast.SelectorExpr:
|
||||
nom.addFromIdent(stmt.If, e.X)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
9
vendor/github.com/fzipp/gocyclo/CHANGELOG.md
generated
vendored
9
vendor/github.com/fzipp/gocyclo/CHANGELOG.md
generated
vendored
|
@ -4,7 +4,14 @@ 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).
|
||||
|
||||
## [0.3.1]
|
||||
## [0.4.0] - 2021-12-19
|
||||
### Added
|
||||
- Support method receivers with type parameters introduced in Go 1.18
|
||||
|
||||
### Changed
|
||||
- Use more efficient filepath.WalkDir instead of filepath.Walk
|
||||
|
||||
## [0.3.1] - 2020-10-20
|
||||
### Added
|
||||
- Test coverage
|
||||
|
||||
|
|
3
vendor/github.com/fzipp/gocyclo/README.md
generated
vendored
3
vendor/github.com/fzipp/gocyclo/README.md
generated
vendored
|
@ -1,6 +1,7 @@
|
|||
# gocyclo
|
||||
|
||||
[![PkgGoDev](https://pkg.go.dev/badge/github.com/fzipp/gocyclo)](https://pkg.go.dev/github.com/fzipp/gocyclo)
|
||||
![Build Status](https://github.com/fzipp/gocyclo/workflows/build/badge.svg)
|
||||
[![Go Report Card](https://goreportcard.com/badge/github.com/fzipp/gocyclo)](https://goreportcard.com/report/github.com/fzipp/gocyclo)
|
||||
|
||||
Gocyclo calculates
|
||||
|
@ -31,7 +32,7 @@ to smaller functions.
|
|||
To install the `gocyclo` command, run
|
||||
|
||||
```
|
||||
$ go get github.com/fzipp/gocyclo/cmd/gocyclo
|
||||
$ go install github.com/fzipp/gocyclo/cmd/gocyclo@latest
|
||||
```
|
||||
|
||||
and put the resulting binary in one of your PATH directories if
|
||||
|
|
21
vendor/github.com/fzipp/gocyclo/analyze.go
generated
vendored
21
vendor/github.com/fzipp/gocyclo/analyze.go
generated
vendored
|
@ -9,6 +9,7 @@ import (
|
|||
"go/ast"
|
||||
"go/parser"
|
||||
"go/token"
|
||||
"io/fs"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
@ -39,8 +40,8 @@ func Analyze(paths []string, ignore *regexp.Regexp) Stats {
|
|||
}
|
||||
|
||||
func analyzeDir(dirname string, ignore *regexp.Regexp, stats Stats) Stats {
|
||||
filepath.Walk(dirname, func(path string, info os.FileInfo, err error) error {
|
||||
if err == nil && isGoFile(info) {
|
||||
filepath.WalkDir(dirname, func(path string, entry fs.DirEntry, err error) error {
|
||||
if err == nil && isGoFile(entry) {
|
||||
stats = analyzeFile(path, ignore, stats)
|
||||
}
|
||||
return err
|
||||
|
@ -48,8 +49,8 @@ func analyzeDir(dirname string, ignore *regexp.Regexp, stats Stats) Stats {
|
|||
return stats
|
||||
}
|
||||
|
||||
func isGoFile(f os.FileInfo) bool {
|
||||
return !f.IsDir() && strings.HasSuffix(f.Name(), ".go")
|
||||
func isGoFile(entry fs.DirEntry) bool {
|
||||
return !entry.IsDir() && strings.HasSuffix(entry.Name(), ".go")
|
||||
}
|
||||
|
||||
func analyzeFile(path string, ignore *regexp.Regexp, stats Stats) Stats {
|
||||
|
@ -137,15 +138,3 @@ func funcName(fn *ast.FuncDecl) string {
|
|||
}
|
||||
return fn.Name.Name
|
||||
}
|
||||
|
||||
// recvString returns a string representation of recv of the
|
||||
// form "T", "*T", or "BADRECV" (if not a proper receiver type).
|
||||
func recvString(recv ast.Expr) string {
|
||||
switch t := recv.(type) {
|
||||
case *ast.Ident:
|
||||
return t.Name
|
||||
case *ast.StarExpr:
|
||||
return "*" + recvString(t.X)
|
||||
}
|
||||
return "BADRECV"
|
||||
}
|
||||
|
|
2
vendor/github.com/fzipp/gocyclo/go.mod
generated
vendored
2
vendor/github.com/fzipp/gocyclo/go.mod
generated
vendored
|
@ -1,3 +1,3 @@
|
|||
module github.com/fzipp/gocyclo
|
||||
|
||||
go 1.15
|
||||
go 1.18
|
||||
|
|
26
vendor/github.com/fzipp/gocyclo/recv.go
generated
vendored
Normal file
26
vendor/github.com/fzipp/gocyclo/recv.go
generated
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2021 Frederik Zipp. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build go1.18
|
||||
// +build go1.18
|
||||
|
||||
package gocyclo
|
||||
|
||||
import "go/ast"
|
||||
|
||||
// recvString returns a string representation of recv of the
|
||||
// form "T", "*T", or "BADRECV" (if not a proper receiver type).
|
||||
func recvString(recv ast.Expr) string {
|
||||
switch t := recv.(type) {
|
||||
case *ast.Ident:
|
||||
return t.Name
|
||||
case *ast.StarExpr:
|
||||
return "*" + recvString(t.X)
|
||||
case *ast.IndexExpr:
|
||||
return recvString(t.X)
|
||||
case *ast.IndexListExpr:
|
||||
return recvString(t.X)
|
||||
}
|
||||
return "BADRECV"
|
||||
}
|
24
vendor/github.com/fzipp/gocyclo/recv_pre118.go
generated
vendored
Normal file
24
vendor/github.com/fzipp/gocyclo/recv_pre118.go
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2021 Frederik Zipp. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
//go:build !go1.18
|
||||
// +build !go1.18
|
||||
|
||||
package gocyclo
|
||||
|
||||
import "go/ast"
|
||||
|
||||
// recvString returns a string representation of recv of the
|
||||
// form "T", "*T", or "BADRECV" (if not a proper receiver type).
|
||||
func recvString(recv ast.Expr) string {
|
||||
switch t := recv.(type) {
|
||||
case *ast.Ident:
|
||||
return t.Name
|
||||
case *ast.StarExpr:
|
||||
return "*" + recvString(t.X)
|
||||
case *ast.IndexExpr:
|
||||
return recvString(t.X)
|
||||
}
|
||||
return "BADRECV"
|
||||
}
|
2
vendor/github.com/gin-gonic/gin/.travis.yml
generated
vendored
2
vendor/github.com/gin-gonic/gin/.travis.yml
generated
vendored
|
@ -3,8 +3,6 @@ language: go
|
|||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- go: 1.12.x
|
||||
env: GO111MODULE=on
|
||||
- go: 1.13.x
|
||||
- go: 1.13.x
|
||||
env:
|
||||
|
|
30
vendor/github.com/gin-gonic/gin/CHANGELOG.md
generated
vendored
30
vendor/github.com/gin-gonic/gin/CHANGELOG.md
generated
vendored
|
@ -1,5 +1,35 @@
|
|||
# Gin ChangeLog
|
||||
|
||||
## Gin v1.7.7
|
||||
|
||||
### BUGFIXES
|
||||
|
||||
* Fixed X-Forwarded-For unsafe handling of CVE-2020-28483 [#2844](https://github.com/gin-gonic/gin/pull/2844), closed issue [#2862](https://github.com/gin-gonic/gin/issues/2862).
|
||||
* Tree: updated the code logic for `latestNode` [#2897](https://github.com/gin-gonic/gin/pull/2897), closed issue [#2894](https://github.com/gin-gonic/gin/issues/2894) [#2878](https://github.com/gin-gonic/gin/issues/2878).
|
||||
* Tree: fixed the misplacement of adding slashes [#2847](https://github.com/gin-gonic/gin/pull/2847), closed issue [#2843](https://github.com/gin-gonic/gin/issues/2843).
|
||||
* Tree: fixed tsr with mixed static and wildcard paths [#2924](https://github.com/gin-gonic/gin/pull/2924), closed issue [#2918](https://github.com/gin-gonic/gin/issues/2918).
|
||||
|
||||
### ENHANCEMENTS
|
||||
|
||||
* TrustedProxies: make it backward-compatible [#2887](https://github.com/gin-gonic/gin/pull/2887), closed issue [#2819](https://github.com/gin-gonic/gin/issues/2819).
|
||||
* TrustedPlatform: provide custom options for another CDN services [#2906](https://github.com/gin-gonic/gin/pull/2906).
|
||||
|
||||
### DOCS
|
||||
|
||||
* NoMethod: added usage annotation ([#2832](https://github.com/gin-gonic/gin/pull/2832#issuecomment-929954463)).
|
||||
|
||||
## Gin v1.7.6
|
||||
|
||||
### BUGFIXES
|
||||
|
||||
* bump new release to fix v1.7.5 release error by using v1.7.4 codes.
|
||||
|
||||
## Gin v1.7.4
|
||||
|
||||
### BUGFIXES
|
||||
|
||||
* bump new release to fix checksum mismatch
|
||||
|
||||
## Gin v1.7.3
|
||||
|
||||
### BUGFIXES
|
||||
|
|
43
vendor/github.com/gin-gonic/gin/README.md
generated
vendored
43
vendor/github.com/gin-gonic/gin/README.md
generated
vendored
|
@ -77,6 +77,7 @@ Gin is a web framework written in Go (Golang). It features a martini-like API wi
|
|||
- [http2 server push](#http2-server-push)
|
||||
- [Define format for the log of routes](#define-format-for-the-log-of-routes)
|
||||
- [Set and get a cookie](#set-and-get-a-cookie)
|
||||
- [Don't trust all proxies](#don't-trust-all-proxies)
|
||||
- [Testing](#testing)
|
||||
- [Users](#users)
|
||||
|
||||
|
@ -84,7 +85,7 @@ Gin is a web framework written in Go (Golang). It features a martini-like API wi
|
|||
|
||||
To install Gin package, you need to install Go and set your Go workspace first.
|
||||
|
||||
1. The first need [Go](https://golang.org/) installed (**version 1.12+ is required**), then you can use the below Go command to install Gin.
|
||||
1. The first need [Go](https://golang.org/) installed (**version 1.13+ is required**), then you can use the below Go command to install Gin.
|
||||
|
||||
```sh
|
||||
$ go get -u github.com/gin-gonic/gin
|
||||
|
@ -2130,11 +2131,17 @@ Gin lets you specify which headers to hold the real client IP (if any),
|
|||
as well as specifying which proxies (or direct clients) you trust to
|
||||
specify one of these headers.
|
||||
|
||||
The `TrustedProxies` slice on your `gin.Engine` specifes network addresses or
|
||||
network CIDRs from where clients which their request headers related to client
|
||||
Use function `SetTrustedProxies()` on your `gin.Engine` to specify network addresses
|
||||
or network CIDRs from where clients which their request headers related to client
|
||||
IP can be trusted. They can be IPv4 addresses, IPv4 CIDRs, IPv6 addresses or
|
||||
IPv6 CIDRs.
|
||||
|
||||
**Attention:** Gin trust all proxies by default if you don't specify a trusted
|
||||
proxy using the function above, **this is NOT safe**. At the same time, if you don't
|
||||
use any proxy, you can disable this feature by using `Engine.SetTrustedProxies(nil)`,
|
||||
then `Context.ClientIP()` will return the remote address directly to avoid some
|
||||
unnecessary computation.
|
||||
|
||||
```go
|
||||
import (
|
||||
"fmt"
|
||||
|
@ -2145,7 +2152,7 @@ import (
|
|||
func main() {
|
||||
|
||||
router := gin.Default()
|
||||
router.TrustedProxies = []string{"192.168.1.2"}
|
||||
router.SetTrustedProxies([]string{"192.168.1.2"})
|
||||
|
||||
router.GET("/", func(c *gin.Context) {
|
||||
// If the client is 192.168.1.2, use the X-Forwarded-For
|
||||
|
@ -2158,6 +2165,34 @@ func main() {
|
|||
}
|
||||
```
|
||||
|
||||
**Notice:** If you are using a CDN service, you can set the `Engine.TrustedPlatform`
|
||||
to skip TrustedProxies check, it has a higher priority than TrustedProxies.
|
||||
Look at the example below:
|
||||
```go
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
router := gin.Default()
|
||||
// Use predefined header gin.PlatformXXX
|
||||
router.TrustedPlatform = gin.PlatformGoogleAppEngine
|
||||
// Or set your own trusted request header for another trusted proxy service
|
||||
// Don't set it to any suspect request header, it's unsafe
|
||||
router.TrustedPlatform = "X-CDN-IP"
|
||||
|
||||
router.GET("/", func(c *gin.Context) {
|
||||
// If you set TrustedPlatform, ClientIP() will resolve the
|
||||
// corresponding header and return IP directly
|
||||
fmt.Printf("ClientIP: %s\n", c.ClientIP())
|
||||
})
|
||||
router.Run()
|
||||
}
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
The `net/http/httptest` package is preferable way for HTTP testing.
|
||||
|
|
66
vendor/github.com/gin-gonic/gin/context.go
generated
vendored
66
vendor/github.com/gin-gonic/gin/context.go
generated
vendored
|
@ -9,6 +9,7 @@ import (
|
|||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"math"
|
||||
"mime/multipart"
|
||||
"net"
|
||||
|
@ -53,8 +54,9 @@ type Context struct {
|
|||
index int8
|
||||
fullPath string
|
||||
|
||||
engine *Engine
|
||||
params *Params
|
||||
engine *Engine
|
||||
params *Params
|
||||
skippedNodes *[]skippedNode
|
||||
|
||||
// This mutex protect Keys map
|
||||
mu sync.RWMutex
|
||||
|
@ -96,7 +98,8 @@ func (c *Context) reset() {
|
|||
c.Accepted = nil
|
||||
c.queryCache = nil
|
||||
c.formCache = nil
|
||||
*c.params = (*c.params)[0:0]
|
||||
*c.params = (*c.params)[:0]
|
||||
*c.skippedNodes = (*c.skippedNodes)[:0]
|
||||
}
|
||||
|
||||
// Copy returns a copy of the current context that can be safely used outside the request's scope.
|
||||
|
@ -725,13 +728,23 @@ func (c *Context) ShouldBindBodyWith(obj interface{}, bb binding.BindingBody) (e
|
|||
return bb.BindBody(body, obj)
|
||||
}
|
||||
|
||||
// ClientIP implements a best effort algorithm to return the real client IP.
|
||||
// ClientIP implements one best effort algorithm to return the real client IP.
|
||||
// It called c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not.
|
||||
// If it's it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]).
|
||||
// If the headers are nots syntactically valid OR the remote IP does not correspong to a trusted proxy,
|
||||
// If it is it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]).
|
||||
// If the headers are not syntactically valid OR the remote IP does not correspond to a trusted proxy,
|
||||
// the remote IP (coming form Request.RemoteAddr) is returned.
|
||||
func (c *Context) ClientIP() string {
|
||||
// Check if we're running on a trusted platform, continue running backwards if error
|
||||
if c.engine.TrustedPlatform != "" {
|
||||
// Developers can define their own header of Trusted Platform or use predefined constants
|
||||
if addr := c.requestHeader(c.engine.TrustedPlatform); addr != "" {
|
||||
return addr
|
||||
}
|
||||
}
|
||||
|
||||
// Legacy "AppEngine" flag
|
||||
if c.engine.AppEngine {
|
||||
log.Println(`The AppEngine flag is going to be deprecated. Please check issues #2723 and #2739 and use 'TrustedPlatform: gin.PlatformGoogleAppEngine' instead.`)
|
||||
if addr := c.requestHeader("X-Appengine-Remote-Addr"); addr != "" {
|
||||
return addr
|
||||
}
|
||||
|
@ -744,7 +757,7 @@ func (c *Context) ClientIP() string {
|
|||
|
||||
if trusted && c.engine.ForwardedByClientIP && c.engine.RemoteIPHeaders != nil {
|
||||
for _, headerName := range c.engine.RemoteIPHeaders {
|
||||
ip, valid := validateHeader(c.requestHeader(headerName))
|
||||
ip, valid := c.engine.validateHeader(c.requestHeader(headerName))
|
||||
if valid {
|
||||
return ip
|
||||
}
|
||||
|
@ -753,10 +766,21 @@ func (c *Context) ClientIP() string {
|
|||
return remoteIP.String()
|
||||
}
|
||||
|
||||
func (e *Engine) isTrustedProxy(ip net.IP) bool {
|
||||
if e.trustedCIDRs != nil {
|
||||
for _, cidr := range e.trustedCIDRs {
|
||||
if cidr.Contains(ip) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// RemoteIP parses the IP from Request.RemoteAddr, normalizes and returns the IP (without the port).
|
||||
// It also checks if the remoteIP is a trusted proxy or not.
|
||||
// In order to perform this validation, it will see if the IP is contained within at least one of the CIDR blocks
|
||||
// defined in Engine.TrustedProxies
|
||||
// defined by Engine.SetTrustedProxies()
|
||||
func (c *Context) RemoteIP() (net.IP, bool) {
|
||||
ip, _, err := net.SplitHostPort(strings.TrimSpace(c.Request.RemoteAddr))
|
||||
if err != nil {
|
||||
|
@ -767,35 +791,25 @@ func (c *Context) RemoteIP() (net.IP, bool) {
|
|||
return nil, false
|
||||
}
|
||||
|
||||
if c.engine.trustedCIDRs != nil {
|
||||
for _, cidr := range c.engine.trustedCIDRs {
|
||||
if cidr.Contains(remoteIP) {
|
||||
return remoteIP, true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return remoteIP, false
|
||||
return remoteIP, c.engine.isTrustedProxy(remoteIP)
|
||||
}
|
||||
|
||||
func validateHeader(header string) (clientIP string, valid bool) {
|
||||
func (e *Engine) validateHeader(header string) (clientIP string, valid bool) {
|
||||
if header == "" {
|
||||
return "", false
|
||||
}
|
||||
items := strings.Split(header, ",")
|
||||
for i, ipStr := range items {
|
||||
ipStr = strings.TrimSpace(ipStr)
|
||||
for i := len(items) - 1; i >= 0; i-- {
|
||||
ipStr := strings.TrimSpace(items[i])
|
||||
ip := net.ParseIP(ipStr)
|
||||
if ip == nil {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// We need to return the first IP in the list, but,
|
||||
// we should not early return since we need to validate that
|
||||
// the rest of the header is syntactically valid
|
||||
if i == 0 {
|
||||
clientIP = ipStr
|
||||
valid = true
|
||||
// X-Forwarded-For is appended by proxy
|
||||
// Check IPs in reverse order and stop when find untrusted proxy
|
||||
if (i == 0) || (!e.isTrustedProxy(ip)) {
|
||||
return ipStr, true
|
||||
}
|
||||
}
|
||||
return
|
||||
|
|
2
vendor/github.com/gin-gonic/gin/context_appengine.go
generated
vendored
2
vendor/github.com/gin-gonic/gin/context_appengine.go
generated
vendored
|
@ -8,5 +8,5 @@
|
|||
package gin
|
||||
|
||||
func init() {
|
||||
defaultAppEngine = true
|
||||
defaultPlatform = PlatformGoogleAppEngine
|
||||
}
|
||||
|
|
4
vendor/github.com/gin-gonic/gin/debug.go
generated
vendored
4
vendor/github.com/gin-gonic/gin/debug.go
generated
vendored
|
@ -12,7 +12,7 @@ import (
|
|||
"strings"
|
||||
)
|
||||
|
||||
const ginSupportMinGoVer = 12
|
||||
const ginSupportMinGoVer = 13
|
||||
|
||||
// IsDebugging returns true if the framework is running in debug mode.
|
||||
// Use SetMode(gin.ReleaseMode) to disable debug mode.
|
||||
|
@ -67,7 +67,7 @@ func getMinVer(v string) (uint64, error) {
|
|||
|
||||
func debugPrintWARNINGDefault() {
|
||||
if v, e := getMinVer(runtime.Version()); e == nil && v <= ginSupportMinGoVer {
|
||||
debugPrint(`[WARNING] Now Gin requires Go 1.12+.
|
||||
debugPrint(`[WARNING] Now Gin requires Go 1.13+.
|
||||
|
||||
`)
|
||||
}
|
||||
|
|
126
vendor/github.com/gin-gonic/gin/gin.go
generated
vendored
126
vendor/github.com/gin-gonic/gin/gin.go
generated
vendored
|
@ -11,6 +11,7 @@ import (
|
|||
"net/http"
|
||||
"os"
|
||||
"path"
|
||||
"reflect"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
|
@ -25,7 +26,9 @@ var (
|
|||
default405Body = []byte("405 method not allowed")
|
||||
)
|
||||
|
||||
var defaultAppEngine bool
|
||||
var defaultPlatform string
|
||||
|
||||
var defaultTrustedCIDRs = []*net.IPNet{{IP: net.IP{0x0, 0x0, 0x0, 0x0}, Mask: net.IPMask{0x0, 0x0, 0x0, 0x0}}} // 0.0.0.0/0
|
||||
|
||||
// HandlerFunc defines the handler used by gin middleware as return value.
|
||||
type HandlerFunc func(*Context)
|
||||
|
@ -52,6 +55,16 @@ type RouteInfo struct {
|
|||
// RoutesInfo defines a RouteInfo array.
|
||||
type RoutesInfo []RouteInfo
|
||||
|
||||
// Trusted platforms
|
||||
const (
|
||||
// When running on Google App Engine. Trust X-Appengine-Remote-Addr
|
||||
// for determining the client's IP
|
||||
PlatformGoogleAppEngine = "X-Appengine-Remote-Addr"
|
||||
// When using Cloudflare's CDN. Trust CF-Connecting-IP for determining
|
||||
// the client's IP
|
||||
PlatformCloudflare = "CF-Connecting-IP"
|
||||
)
|
||||
|
||||
// Engine is the framework's instance, it contains the muxer, middleware and configuration settings.
|
||||
// Create an instance of Engine, by using New() or Default()
|
||||
type Engine struct {
|
||||
|
@ -89,18 +102,7 @@ type Engine struct {
|
|||
// `(*gin.Context).Request.RemoteAddr`.
|
||||
ForwardedByClientIP bool
|
||||
|
||||
// List of headers used to obtain the client IP when
|
||||
// `(*gin.Engine).ForwardedByClientIP` is `true` and
|
||||
// `(*gin.Context).Request.RemoteAddr` is matched by at least one of the
|
||||
// network origins of `(*gin.Engine).TrustedProxies`.
|
||||
RemoteIPHeaders []string
|
||||
|
||||
// List of network origins (IPv4 addresses, IPv4 CIDRs, IPv6 addresses or
|
||||
// IPv6 CIDRs) from which to trust request's headers that contain
|
||||
// alternative client IP when `(*gin.Engine).ForwardedByClientIP` is
|
||||
// `true`.
|
||||
TrustedProxies []string
|
||||
|
||||
// DEPRECATED: USE `TrustedPlatform` WITH VALUE `gin.GoogleAppEngine` INSTEAD
|
||||
// #726 #755 If enabled, it will trust some headers starting with
|
||||
// 'X-AppEngine...' for better integration with that PaaS.
|
||||
AppEngine bool
|
||||
|
@ -113,14 +115,24 @@ type Engine struct {
|
|||
// as url.Path gonna be used, which is already unescaped.
|
||||
UnescapePathValues bool
|
||||
|
||||
// Value of 'maxMemory' param that is given to http.Request's ParseMultipartForm
|
||||
// method call.
|
||||
MaxMultipartMemory int64
|
||||
|
||||
// RemoveExtraSlash a parameter can be parsed from the URL even with extra slashes.
|
||||
// See the PR #1817 and issue #1644
|
||||
RemoveExtraSlash bool
|
||||
|
||||
// List of headers used to obtain the client IP when
|
||||
// `(*gin.Engine).ForwardedByClientIP` is `true` and
|
||||
// `(*gin.Context).Request.RemoteAddr` is matched by at least one of the
|
||||
// network origins of list defined by `(*gin.Engine).SetTrustedProxies()`.
|
||||
RemoteIPHeaders []string
|
||||
|
||||
// If set to a constant of value gin.Platform*, trusts the headers set by
|
||||
// that platform, for example to determine the client IP
|
||||
TrustedPlatform string
|
||||
|
||||
// Value of 'maxMemory' param that is given to http.Request's ParseMultipartForm
|
||||
// method call.
|
||||
MaxMultipartMemory int64
|
||||
|
||||
delims render.Delims
|
||||
secureJSONPrefix string
|
||||
HTMLRender render.HTMLRender
|
||||
|
@ -132,6 +144,8 @@ type Engine struct {
|
|||
pool sync.Pool
|
||||
trees methodTrees
|
||||
maxParams uint16
|
||||
maxSections uint16
|
||||
trustedProxies []string
|
||||
trustedCIDRs []*net.IPNet
|
||||
}
|
||||
|
||||
|
@ -159,8 +173,7 @@ func New() *Engine {
|
|||
HandleMethodNotAllowed: false,
|
||||
ForwardedByClientIP: true,
|
||||
RemoteIPHeaders: []string{"X-Forwarded-For", "X-Real-IP"},
|
||||
TrustedProxies: []string{"0.0.0.0/0"},
|
||||
AppEngine: defaultAppEngine,
|
||||
TrustedPlatform: defaultPlatform,
|
||||
UseRawPath: false,
|
||||
RemoveExtraSlash: false,
|
||||
UnescapePathValues: true,
|
||||
|
@ -168,6 +181,8 @@ func New() *Engine {
|
|||
trees: make(methodTrees, 0, 9),
|
||||
delims: render.Delims{Left: "{{", Right: "}}"},
|
||||
secureJSONPrefix: "while(1);",
|
||||
trustedProxies: []string{"0.0.0.0/0"},
|
||||
trustedCIDRs: defaultTrustedCIDRs,
|
||||
}
|
||||
engine.RouterGroup.engine = engine
|
||||
engine.pool.New = func() interface{} {
|
||||
|
@ -186,7 +201,8 @@ func Default() *Engine {
|
|||
|
||||
func (engine *Engine) allocateContext() *Context {
|
||||
v := make(Params, 0, engine.maxParams)
|
||||
return &Context{engine: engine, params: &v}
|
||||
skippedNodes := make([]skippedNode, 0, engine.maxSections)
|
||||
return &Context{engine: engine, params: &v, skippedNodes: &skippedNodes}
|
||||
}
|
||||
|
||||
// Delims sets template left and right delims and returns a Engine instance.
|
||||
|
@ -249,7 +265,7 @@ func (engine *Engine) NoRoute(handlers ...HandlerFunc) {
|
|||
engine.rebuild404Handlers()
|
||||
}
|
||||
|
||||
// NoMethod sets the handlers called when... TODO.
|
||||
// NoMethod sets the handlers called when Engine.HandleMethodNotAllowed = true.
|
||||
func (engine *Engine) NoMethod(handlers ...HandlerFunc) {
|
||||
engine.noMethod = handlers
|
||||
engine.rebuild405Handlers()
|
||||
|
@ -292,6 +308,10 @@ func (engine *Engine) addRoute(method, path string, handlers HandlersChain) {
|
|||
if paramsCount := countParams(path); paramsCount > engine.maxParams {
|
||||
engine.maxParams = paramsCount
|
||||
}
|
||||
|
||||
if sectionsCount := countSections(path); sectionsCount > engine.maxSections {
|
||||
engine.maxSections = sectionsCount
|
||||
}
|
||||
}
|
||||
|
||||
// Routes returns a slice of registered routes, including some useful information, such as:
|
||||
|
@ -326,11 +346,11 @@ func iterate(path, method string, routes RoutesInfo, root *node) RoutesInfo {
|
|||
func (engine *Engine) Run(addr ...string) (err error) {
|
||||
defer func() { debugPrintError(err) }()
|
||||
|
||||
trustedCIDRs, err := engine.prepareTrustedCIDRs()
|
||||
if err != nil {
|
||||
return err
|
||||
if engine.isUnsafeTrustedProxies() {
|
||||
debugPrint("[WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.\n" +
|
||||
"Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.")
|
||||
}
|
||||
engine.trustedCIDRs = trustedCIDRs
|
||||
|
||||
address := resolveAddress(addr)
|
||||
debugPrint("Listening and serving HTTP on %s\n", address)
|
||||
err = http.ListenAndServe(address, engine)
|
||||
|
@ -338,12 +358,12 @@ func (engine *Engine) Run(addr ...string) (err error) {
|
|||
}
|
||||
|
||||
func (engine *Engine) prepareTrustedCIDRs() ([]*net.IPNet, error) {
|
||||
if engine.TrustedProxies == nil {
|
||||
if engine.trustedProxies == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
cidr := make([]*net.IPNet, 0, len(engine.TrustedProxies))
|
||||
for _, trustedProxy := range engine.TrustedProxies {
|
||||
cidr := make([]*net.IPNet, 0, len(engine.trustedProxies))
|
||||
for _, trustedProxy := range engine.trustedProxies {
|
||||
if !strings.Contains(trustedProxy, "/") {
|
||||
ip := parseIP(trustedProxy)
|
||||
if ip == nil {
|
||||
|
@ -366,6 +386,31 @@ func (engine *Engine) prepareTrustedCIDRs() ([]*net.IPNet, error) {
|
|||
return cidr, nil
|
||||
}
|
||||
|
||||
// SetTrustedProxies set a list of network origins (IPv4 addresses,
|
||||
// IPv4 CIDRs, IPv6 addresses or IPv6 CIDRs) from which to trust
|
||||
// request's headers that contain alternative client IP when
|
||||
// `(*gin.Engine).ForwardedByClientIP` is `true`. `TrustedProxies`
|
||||
// feature is enabled by default, and it also trusts all proxies
|
||||
// by default. If you want to disable this feature, use
|
||||
// Engine.SetTrustedProxies(nil), then Context.ClientIP() will
|
||||
// return the remote address directly.
|
||||
func (engine *Engine) SetTrustedProxies(trustedProxies []string) error {
|
||||
engine.trustedProxies = trustedProxies
|
||||
return engine.parseTrustedProxies()
|
||||
}
|
||||
|
||||
// isUnsafeTrustedProxies compares Engine.trustedCIDRs and defaultTrustedCIDRs, it's not safe if equal (returns true)
|
||||
func (engine *Engine) isUnsafeTrustedProxies() bool {
|
||||
return reflect.DeepEqual(engine.trustedCIDRs, defaultTrustedCIDRs)
|
||||
}
|
||||
|
||||
// parseTrustedProxies parse Engine.trustedProxies to Engine.trustedCIDRs
|
||||
func (engine *Engine) parseTrustedProxies() error {
|
||||
trustedCIDRs, err := engine.prepareTrustedCIDRs()
|
||||
engine.trustedCIDRs = trustedCIDRs
|
||||
return err
|
||||
}
|
||||
|
||||
// parseIP parse a string representation of an IP and returns a net.IP with the
|
||||
// minimum byte representation or nil if input is invalid.
|
||||
func parseIP(ip string) net.IP {
|
||||
|
@ -387,6 +432,11 @@ func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) {
|
|||
debugPrint("Listening and serving HTTPS on %s\n", addr)
|
||||
defer func() { debugPrintError(err) }()
|
||||
|
||||
if engine.isUnsafeTrustedProxies() {
|
||||
debugPrint("[WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.\n" +
|
||||
"Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.")
|
||||
}
|
||||
|
||||
err = http.ListenAndServeTLS(addr, certFile, keyFile, engine)
|
||||
return
|
||||
}
|
||||
|
@ -398,6 +448,11 @@ func (engine *Engine) RunUnix(file string) (err error) {
|
|||
debugPrint("Listening and serving HTTP on unix:/%s", file)
|
||||
defer func() { debugPrintError(err) }()
|
||||
|
||||
if engine.isUnsafeTrustedProxies() {
|
||||
debugPrint("[WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.\n" +
|
||||
"Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.")
|
||||
}
|
||||
|
||||
listener, err := net.Listen("unix", file)
|
||||
if err != nil {
|
||||
return
|
||||
|
@ -416,6 +471,11 @@ func (engine *Engine) RunFd(fd int) (err error) {
|
|||
debugPrint("Listening and serving HTTP on fd@%d", fd)
|
||||
defer func() { debugPrintError(err) }()
|
||||
|
||||
if engine.isUnsafeTrustedProxies() {
|
||||
debugPrint("[WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.\n" +
|
||||
"Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.")
|
||||
}
|
||||
|
||||
f := os.NewFile(uintptr(fd), fmt.Sprintf("fd@%d", fd))
|
||||
listener, err := net.FileListener(f)
|
||||
if err != nil {
|
||||
|
@ -431,6 +491,12 @@ func (engine *Engine) RunFd(fd int) (err error) {
|
|||
func (engine *Engine) RunListener(listener net.Listener) (err error) {
|
||||
debugPrint("Listening and serving HTTP on listener what's bind with address@%s", listener.Addr())
|
||||
defer func() { debugPrintError(err) }()
|
||||
|
||||
if engine.isUnsafeTrustedProxies() {
|
||||
debugPrint("[WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.\n" +
|
||||
"Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.")
|
||||
}
|
||||
|
||||
err = http.Serve(listener, engine)
|
||||
return
|
||||
}
|
||||
|
@ -479,7 +545,7 @@ func (engine *Engine) handleHTTPRequest(c *Context) {
|
|||
}
|
||||
root := t[i].root
|
||||
// Find route in tree
|
||||
value := root.getValue(rPath, c.params, unescape)
|
||||
value := root.getValue(rPath, c.params, c.skippedNodes, unescape)
|
||||
if value.params != nil {
|
||||
c.Params = *value.params
|
||||
}
|
||||
|
@ -507,7 +573,7 @@ func (engine *Engine) handleHTTPRequest(c *Context) {
|
|||
if tree.method == httpMethod {
|
||||
continue
|
||||
}
|
||||
if value := tree.root.getValue(rPath, nil, unescape); value.handlers != nil {
|
||||
if value := tree.root.getValue(rPath, nil, c.skippedNodes, unescape); value.handlers != nil {
|
||||
c.handlers = engine.allNoMethod
|
||||
serveError(c, http.StatusMethodNotAllowed, default405Body)
|
||||
return
|
||||
|
|
2
vendor/github.com/gin-gonic/gin/go.mod
generated
vendored
2
vendor/github.com/gin-gonic/gin/go.mod
generated
vendored
|
@ -12,3 +12,5 @@ require (
|
|||
github.com/ugorji/go/codec v1.1.7
|
||||
gopkg.in/yaml.v2 v2.2.8
|
||||
)
|
||||
|
||||
retract v1.7.5
|
||||
|
|
136
vendor/github.com/gin-gonic/gin/tree.go
generated
vendored
136
vendor/github.com/gin-gonic/gin/tree.go
generated
vendored
|
@ -17,6 +17,7 @@ import (
|
|||
var (
|
||||
strColon = []byte(":")
|
||||
strStar = []byte("*")
|
||||
strSlash = []byte("/")
|
||||
)
|
||||
|
||||
// Param is a single URL parameter, consisting of a key and a value.
|
||||
|
@ -98,6 +99,11 @@ func countParams(path string) uint16 {
|
|||
return n
|
||||
}
|
||||
|
||||
func countSections(path string) uint16 {
|
||||
s := bytesconv.StringToBytes(path)
|
||||
return uint16(bytes.Count(s, strSlash))
|
||||
}
|
||||
|
||||
type nodeType uint8
|
||||
|
||||
const (
|
||||
|
@ -394,16 +400,19 @@ type nodeValue struct {
|
|||
fullPath string
|
||||
}
|
||||
|
||||
type skippedNode struct {
|
||||
path string
|
||||
node *node
|
||||
paramsCount int16
|
||||
}
|
||||
|
||||
// Returns the handle registered with the given path (key). The values of
|
||||
// wildcards are saved to a map.
|
||||
// If no handle can be found, a TSR (trailing slash redirect) recommendation is
|
||||
// made if a handle exists with an extra (without the) trailing slash for the
|
||||
// given path.
|
||||
func (n *node) getValue(path string, params *Params, unescape bool) (value nodeValue) {
|
||||
var (
|
||||
skippedPath string
|
||||
latestNode = n // Caching the latest node
|
||||
)
|
||||
func (n *node) getValue(path string, params *Params, skippedNodes *[]skippedNode, unescape bool) (value nodeValue) {
|
||||
var globalParamsCount int16
|
||||
|
||||
walk: // Outer loop for walking the tree
|
||||
for {
|
||||
|
@ -418,15 +427,20 @@ walk: // Outer loop for walking the tree
|
|||
if c == idxc {
|
||||
// strings.HasPrefix(n.children[len(n.children)-1].path, ":") == n.wildChild
|
||||
if n.wildChild {
|
||||
skippedPath = prefix + path
|
||||
latestNode = &node{
|
||||
path: n.path,
|
||||
wildChild: n.wildChild,
|
||||
nType: n.nType,
|
||||
priority: n.priority,
|
||||
children: n.children,
|
||||
handlers: n.handlers,
|
||||
fullPath: n.fullPath,
|
||||
index := len(*skippedNodes)
|
||||
*skippedNodes = (*skippedNodes)[:index+1]
|
||||
(*skippedNodes)[index] = skippedNode{
|
||||
path: prefix + path,
|
||||
node: &node{
|
||||
path: n.path,
|
||||
wildChild: n.wildChild,
|
||||
nType: n.nType,
|
||||
priority: n.priority,
|
||||
children: n.children,
|
||||
handlers: n.handlers,
|
||||
fullPath: n.fullPath,
|
||||
},
|
||||
paramsCount: globalParamsCount,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -434,15 +448,26 @@ walk: // Outer loop for walking the tree
|
|||
continue walk
|
||||
}
|
||||
}
|
||||
// If the path at the end of the loop is not equal to '/' and the current node has no child nodes
|
||||
// the current node needs to be equal to the latest matching node
|
||||
matched := path != "/" && !n.wildChild
|
||||
if matched {
|
||||
n = latestNode
|
||||
}
|
||||
|
||||
// If there is no wildcard pattern, recommend a redirection
|
||||
if !n.wildChild {
|
||||
// If the path at the end of the loop is not equal to '/' and the current node has no child nodes
|
||||
// the current node needs to roll back to last vaild skippedNode
|
||||
if path != "/" {
|
||||
for l := len(*skippedNodes); l > 0; {
|
||||
skippedNode := (*skippedNodes)[l-1]
|
||||
*skippedNodes = (*skippedNodes)[:l-1]
|
||||
if strings.HasSuffix(skippedNode.path, path) {
|
||||
path = skippedNode.path
|
||||
n = skippedNode.node
|
||||
if value.params != nil {
|
||||
*value.params = (*value.params)[:skippedNode.paramsCount]
|
||||
}
|
||||
globalParamsCount = skippedNode.paramsCount
|
||||
continue walk
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Nothing found.
|
||||
// We can recommend to redirect to the same URL without a
|
||||
// trailing slash if a leaf exists for that path.
|
||||
|
@ -452,18 +477,12 @@ walk: // Outer loop for walking the tree
|
|||
|
||||
// Handle wildcard child, which is always at the end of the array
|
||||
n = n.children[len(n.children)-1]
|
||||
globalParamsCount++
|
||||
|
||||
switch n.nType {
|
||||
case param:
|
||||
// fix truncate the parameter
|
||||
// tree_test.go line: 204
|
||||
if matched {
|
||||
path = prefix + path
|
||||
// The saved path is used after the prefix route is intercepted by matching
|
||||
if n.indices == "/" {
|
||||
path = skippedPath[1:]
|
||||
}
|
||||
}
|
||||
|
||||
// Find param end (either '/' or path end)
|
||||
end := 0
|
||||
|
@ -472,7 +491,7 @@ walk: // Outer loop for walking the tree
|
|||
}
|
||||
|
||||
// Save param value
|
||||
if params != nil {
|
||||
if params != nil && cap(*params) > 0 {
|
||||
if value.params == nil {
|
||||
value.params = params
|
||||
}
|
||||
|
@ -500,7 +519,7 @@ walk: // Outer loop for walking the tree
|
|||
}
|
||||
|
||||
// ... but we can't
|
||||
value.tsr = (len(path) == end+1)
|
||||
value.tsr = len(path) == end+1
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -512,7 +531,7 @@ walk: // Outer loop for walking the tree
|
|||
// No handle found. Check if a handle for this path + a
|
||||
// trailing slash exists for TSR recommendation
|
||||
n = n.children[0]
|
||||
value.tsr = (n.path == "/" && n.handlers != nil)
|
||||
value.tsr = n.path == "/" && n.handlers != nil
|
||||
}
|
||||
return
|
||||
|
||||
|
@ -549,9 +568,22 @@ walk: // Outer loop for walking the tree
|
|||
|
||||
if path == prefix {
|
||||
// If the current path does not equal '/' and the node does not have a registered handle and the most recently matched node has a child node
|
||||
// the current node needs to be equal to the latest matching node
|
||||
if latestNode.wildChild && n.handlers == nil && path != "/" {
|
||||
n = latestNode.children[len(latestNode.children)-1]
|
||||
// the current node needs to roll back to last vaild skippedNode
|
||||
if n.handlers == nil && path != "/" {
|
||||
for l := len(*skippedNodes); l > 0; {
|
||||
skippedNode := (*skippedNodes)[l-1]
|
||||
*skippedNodes = (*skippedNodes)[:l-1]
|
||||
if strings.HasSuffix(skippedNode.path, path) {
|
||||
path = skippedNode.path
|
||||
n = skippedNode.node
|
||||
if value.params != nil {
|
||||
*value.params = (*value.params)[:skippedNode.paramsCount]
|
||||
}
|
||||
globalParamsCount = skippedNode.paramsCount
|
||||
continue walk
|
||||
}
|
||||
}
|
||||
// n = latestNode.children[len(latestNode.children)-1]
|
||||
}
|
||||
// We should have reached the node containing the handle.
|
||||
// Check if this node has a handle registered.
|
||||
|
@ -582,25 +614,29 @@ walk: // Outer loop for walking the tree
|
|||
return
|
||||
}
|
||||
|
||||
if path != "/" && len(skippedPath) > 0 && strings.HasSuffix(skippedPath, path) {
|
||||
path = skippedPath
|
||||
// Reduce the number of cycles
|
||||
n, latestNode = latestNode, n
|
||||
// skippedPath cannot execute
|
||||
// example:
|
||||
// * /:cc/cc
|
||||
// call /a/cc expectations:match/200 Actual:match/200
|
||||
// call /a/dd expectations:unmatch/404 Actual: panic
|
||||
// call /addr/dd/aa expectations:unmatch/404 Actual: panic
|
||||
// skippedPath: It can only be executed if the secondary route is not found
|
||||
skippedPath = ""
|
||||
continue walk
|
||||
}
|
||||
|
||||
// Nothing found. We can recommend to redirect to the same URL with an
|
||||
// extra trailing slash if a leaf exists for that path
|
||||
value.tsr = path == "/" ||
|
||||
(len(prefix) == len(path)+1 && n.handlers != nil)
|
||||
(len(prefix) == len(path)+1 && prefix[len(path)] == '/' &&
|
||||
path == prefix[:len(prefix)-1] && n.handlers != nil)
|
||||
|
||||
// roll back to last valid skippedNode
|
||||
if !value.tsr && path != "/" {
|
||||
for l := len(*skippedNodes); l > 0; {
|
||||
skippedNode := (*skippedNodes)[l-1]
|
||||
*skippedNodes = (*skippedNodes)[:l-1]
|
||||
if strings.HasSuffix(skippedNode.path, path) {
|
||||
path = skippedNode.path
|
||||
n = skippedNode.node
|
||||
if value.params != nil {
|
||||
*value.params = (*value.params)[:skippedNode.paramsCount]
|
||||
}
|
||||
globalParamsCount = skippedNode.paramsCount
|
||||
continue walk
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
2
vendor/github.com/gin-gonic/gin/version.go
generated
vendored
2
vendor/github.com/gin-gonic/gin/version.go
generated
vendored
|
@ -5,4 +5,4 @@
|
|||
package gin
|
||||
|
||||
// Version is the current gin framework's version.
|
||||
const Version = "v1.7.3"
|
||||
const Version = "v1.7.7"
|
||||
|
|
7
vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go
generated
vendored
7
vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go
generated
vendored
|
@ -6,15 +6,16 @@ import (
|
|||
"go/token"
|
||||
"strconv"
|
||||
|
||||
"github.com/go-critic/go-critic/checkers/internal/astwalk"
|
||||
"github.com/go-critic/go-critic/checkers/internal/lintutil"
|
||||
"github.com/go-critic/go-critic/framework/linter"
|
||||
"github.com/go-toolsmith/astcast"
|
||||
"github.com/go-toolsmith/astcopy"
|
||||
"github.com/go-toolsmith/astequal"
|
||||
"github.com/go-toolsmith/astp"
|
||||
"github.com/go-toolsmith/typep"
|
||||
"golang.org/x/tools/go/ast/astutil"
|
||||
|
||||
"github.com/go-critic/go-critic/checkers/internal/astwalk"
|
||||
"github.com/go-critic/go-critic/checkers/internal/lintutil"
|
||||
"github.com/go-critic/go-critic/framework/linter"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
|
96
vendor/github.com/go-critic/go-critic/checkers/checkers.go
generated
vendored
96
vendor/github.com/go-critic/go-critic/checkers/checkers.go
generated
vendored
|
@ -2,15 +2,9 @@
|
|||
package checkers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/build"
|
||||
"go/token"
|
||||
"os"
|
||||
|
||||
"github.com/go-critic/go-critic/checkers/rulesdata"
|
||||
"github.com/go-critic/go-critic/framework/linter"
|
||||
"github.com/quasilyte/go-ruleguard/ruleguard"
|
||||
)
|
||||
|
||||
var collection = &linter.CheckerCollection{
|
||||
|
@ -23,93 +17,3 @@ var debug = func() func() bool {
|
|||
return v
|
||||
}
|
||||
}()
|
||||
|
||||
//go:generate go run ./rules/precompile.go -rules ./rules/rules.go -o ./rulesdata/rulesdata.go
|
||||
|
||||
func init() {
|
||||
filename := "rules/rules.go"
|
||||
|
||||
fset := token.NewFileSet()
|
||||
var groups []ruleguard.GoRuleGroup
|
||||
|
||||
var buildContext *build.Context
|
||||
|
||||
ruleguardDebug := os.Getenv("GOCRITIC_RULEGUARD_DEBUG") != ""
|
||||
|
||||
// First we create an Engine to parse all rules.
|
||||
// We need it to get the structured info about our rules
|
||||
// that will be used to generate checkers.
|
||||
// We introduce an extra scope in hope that rootEngine
|
||||
// will be garbage-collected after we don't need it.
|
||||
// LoadedGroups() returns a slice copy and that's all what we need.
|
||||
{
|
||||
rootEngine := ruleguard.NewEngine()
|
||||
rootEngine.InferBuildContext()
|
||||
buildContext = rootEngine.BuildContext
|
||||
|
||||
loadContext := &ruleguard.LoadContext{
|
||||
Fset: fset,
|
||||
DebugImports: ruleguardDebug,
|
||||
DebugPrint: func(s string) {
|
||||
fmt.Println("debug:", s)
|
||||
},
|
||||
}
|
||||
if err := rootEngine.LoadFromIR(loadContext, filename, rulesdata.PrecompiledRules); err != nil {
|
||||
panic(fmt.Sprintf("load embedded ruleguard rules: %v", err))
|
||||
}
|
||||
groups = rootEngine.LoadedGroups()
|
||||
}
|
||||
|
||||
// For every rules group we create a new checker and a separate engine.
|
||||
// That dedicated ruleguard engine will contain rules only from one group.
|
||||
for i := range groups {
|
||||
g := groups[i]
|
||||
info := &linter.CheckerInfo{
|
||||
Name: g.Name,
|
||||
Summary: g.DocSummary,
|
||||
Before: g.DocBefore,
|
||||
After: g.DocAfter,
|
||||
Note: g.DocNote,
|
||||
Tags: g.DocTags,
|
||||
|
||||
EmbeddedRuleguard: true,
|
||||
}
|
||||
collection.AddChecker(info, func(ctx *linter.CheckerContext) (linter.FileWalker, error) {
|
||||
parseContext := &ruleguard.LoadContext{
|
||||
Fset: fset,
|
||||
GroupFilter: func(name string) bool {
|
||||
return name == g.Name
|
||||
},
|
||||
DebugImports: ruleguardDebug,
|
||||
DebugPrint: func(s string) {
|
||||
fmt.Println("debug:", s)
|
||||
},
|
||||
}
|
||||
engine := ruleguard.NewEngine()
|
||||
engine.BuildContext = buildContext
|
||||
err := engine.LoadFromIR(parseContext, filename, rulesdata.PrecompiledRules)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c := &embeddedRuleguardChecker{
|
||||
ctx: ctx,
|
||||
engine: engine,
|
||||
}
|
||||
return c, nil
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type embeddedRuleguardChecker struct {
|
||||
ctx *linter.CheckerContext
|
||||
engine *ruleguard.Engine
|
||||
}
|
||||
|
||||
func (c *embeddedRuleguardChecker) WalkFile(f *ast.File) {
|
||||
runRuleguardEngine(c.ctx, f, c.engine, &ruleguard.RunContext{
|
||||
Pkg: c.ctx.Pkg,
|
||||
Types: c.ctx.TypesInfo,
|
||||
Sizes: c.ctx.SizesInfo,
|
||||
Fset: c.ctx.FileSet,
|
||||
})
|
||||
}
|
||||
|
|
71
vendor/github.com/go-critic/go-critic/checkers/commentFormatting_checker.go
generated
vendored
71
vendor/github.com/go-critic/go-critic/checkers/commentFormatting_checker.go
generated
vendored
|
@ -20,19 +20,30 @@ func init() {
|
|||
info.After = `// This is a comment`
|
||||
|
||||
collection.AddChecker(&info, func(ctx *linter.CheckerContext) (linter.FileWalker, error) {
|
||||
parts := []string{
|
||||
`^//go:generate .*$`, // e.g.: go:generate value
|
||||
`^//[\w-]+:.*$`, // e.g.: key: value
|
||||
`^//nolint\b`, // e.g.: nolint
|
||||
`^//line /.*:\d+`, // e.g.: line /path/to/file:123
|
||||
`^//export \w+$`, // e.g.: export Foo
|
||||
`^//[/+#-]+.*$`, // e.g.: vertical breaker /////////////
|
||||
regexpPatterns := []*regexp.Regexp{
|
||||
regexp.MustCompile(`^//[\w-]+:.*$`), // e.g.: key: value
|
||||
}
|
||||
pat := "(?m)" + strings.Join(parts, "|")
|
||||
pragmaRE := regexp.MustCompile(pat)
|
||||
equalPatterns := []string{
|
||||
"//nolint",
|
||||
}
|
||||
parts := []string{
|
||||
"//go:generate ", // e.g.: go:generate value
|
||||
"//line /", // e.g.: line /path/to/file:123
|
||||
"//nolint ", // e.g.: nolint
|
||||
"//noinspection ", // e.g.: noinspection ALL, some GoLand and friends versions
|
||||
"//export ", // e.g.: export Foo
|
||||
"///", // e.g.: vertical breaker /////////////
|
||||
"//+",
|
||||
"//#",
|
||||
"//-",
|
||||
"//!",
|
||||
}
|
||||
|
||||
return astwalk.WalkerForComment(&commentFormattingChecker{
|
||||
ctx: ctx,
|
||||
pragmaRE: pragmaRE,
|
||||
ctx: ctx,
|
||||
partPatterns: parts,
|
||||
equalPatterns: equalPatterns,
|
||||
regexpPatterns: regexpPatterns,
|
||||
}), nil
|
||||
})
|
||||
}
|
||||
|
@ -41,19 +52,43 @@ type commentFormattingChecker struct {
|
|||
astwalk.WalkHandler
|
||||
ctx *linter.CheckerContext
|
||||
|
||||
pragmaRE *regexp.Regexp
|
||||
partPatterns []string
|
||||
equalPatterns []string
|
||||
regexpPatterns []*regexp.Regexp
|
||||
}
|
||||
|
||||
func (c *commentFormattingChecker) VisitComment(cg *ast.CommentGroup) {
|
||||
if strings.HasPrefix(cg.List[0].Text, "/*") {
|
||||
return
|
||||
}
|
||||
|
||||
outerLoop:
|
||||
for _, comment := range cg.List {
|
||||
if len(comment.Text) <= len("// ") {
|
||||
commentLen := len(comment.Text)
|
||||
if commentLen <= len("// ") {
|
||||
continue
|
||||
}
|
||||
if c.pragmaRE.MatchString(comment.Text) {
|
||||
continue
|
||||
|
||||
for _, p := range c.partPatterns {
|
||||
if commentLen < len(p) {
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.EqualFold(comment.Text[:len(p)], p) {
|
||||
continue outerLoop
|
||||
}
|
||||
}
|
||||
|
||||
for _, p := range c.equalPatterns {
|
||||
if strings.EqualFold(comment.Text, p) {
|
||||
continue outerLoop
|
||||
}
|
||||
}
|
||||
|
||||
for _, p := range c.regexpPatterns {
|
||||
if p.MatchString(comment.Text) {
|
||||
continue outerLoop
|
||||
}
|
||||
}
|
||||
|
||||
// Make a decision based on a first comment text rune.
|
||||
|
@ -76,5 +111,9 @@ func (c *commentFormattingChecker) specialChar(r rune) bool {
|
|||
}
|
||||
|
||||
func (c *commentFormattingChecker) warn(comment *ast.Comment) {
|
||||
c.ctx.Warn(comment, "put a space between `//` and comment text")
|
||||
c.ctx.WarnFixable(comment, linter.QuickFix{
|
||||
From: comment.Pos(),
|
||||
To: comment.End(),
|
||||
Replacement: []byte(strings.Replace(comment.Text, "//", "// ", 1)),
|
||||
}, "put a space between `//` and comment text")
|
||||
}
|
||||
|
|
70
vendor/github.com/go-critic/go-critic/checkers/deferInLoop_checker.go
generated
vendored
Normal file
70
vendor/github.com/go-critic/go-critic/checkers/deferInLoop_checker.go
generated
vendored
Normal file
|
@ -0,0 +1,70 @@
|
|||
package checkers
|
||||
|
||||
import (
|
||||
"go/ast"
|
||||
|
||||
"github.com/go-critic/go-critic/checkers/internal/astwalk"
|
||||
"github.com/go-critic/go-critic/framework/linter"
|
||||
)
|
||||
|
||||
func init() {
|
||||
var info linter.CheckerInfo
|
||||
info.Name = "deferInLoop"
|
||||
info.Tags = []string{"diagnostic", "experimental"}
|
||||
info.Summary = "Detects loops inside functions that use defer"
|
||||
info.Before = `
|
||||
for _, filename := range []string{"foo", "bar"} {
|
||||
f, err := os.Open(filename)
|
||||
|
||||
defer f.Close()
|
||||
}
|
||||
`
|
||||
info.After = `
|
||||
func process(filename string) {
|
||||
f, err := os.Open(filename)
|
||||
|
||||
defer f.Close()
|
||||
}
|
||||
/* ... */
|
||||
for _, filename := range []string{"foo", "bar"} {
|
||||
process(filename)
|
||||
}`
|
||||
|
||||
collection.AddChecker(&info, func(ctx *linter.CheckerContext) (linter.FileWalker, error) {
|
||||
return astwalk.WalkerForFuncDecl(&deferInLoopChecker{ctx: ctx}), nil
|
||||
})
|
||||
}
|
||||
|
||||
type deferInLoopChecker struct {
|
||||
astwalk.WalkHandler
|
||||
ctx *linter.CheckerContext
|
||||
inFor bool
|
||||
}
|
||||
|
||||
func (c *deferInLoopChecker) VisitFuncDecl(fn *ast.FuncDecl) {
|
||||
ast.Inspect(fn.Body, c.traversalFunc)
|
||||
}
|
||||
|
||||
func (c deferInLoopChecker) traversalFunc(cur ast.Node) bool {
|
||||
switch n := cur.(type) {
|
||||
case *ast.DeferStmt:
|
||||
if c.inFor {
|
||||
c.warn(n)
|
||||
}
|
||||
case *ast.RangeStmt, *ast.ForStmt:
|
||||
if !c.inFor {
|
||||
ast.Inspect(cur, deferInLoopChecker{ctx: c.ctx, inFor: true}.traversalFunc)
|
||||
return false
|
||||
}
|
||||
case *ast.FuncLit:
|
||||
ast.Inspect(n.Body, deferInLoopChecker{ctx: c.ctx, inFor: false}.traversalFunc)
|
||||
return false
|
||||
case nil:
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (c *deferInLoopChecker) warn(cause *ast.DeferStmt) {
|
||||
c.ctx.Warn(cause, "Possible resource leak, 'defer' is called in the 'for' loop")
|
||||
}
|
25
vendor/github.com/go-critic/go-critic/checkers/deprecatedComment_checker.go
generated
vendored
25
vendor/github.com/go-critic/go-critic/checkers/deprecatedComment_checker.go
generated
vendored
|
@ -2,7 +2,6 @@ package checkers
|
|||
|
||||
import (
|
||||
"go/ast"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/go-critic/go-critic/checkers/internal/astwalk"
|
||||
|
@ -24,12 +23,15 @@ func FuncOld() int`
|
|||
collection.AddChecker(&info, func(ctx *linter.CheckerContext) (linter.FileWalker, error) {
|
||||
c := &deprecatedCommentChecker{ctx: ctx}
|
||||
|
||||
c.commonPatterns = []*regexp.Regexp{
|
||||
regexp.MustCompile(`(?i)this (?:function|type) is deprecated`),
|
||||
regexp.MustCompile(`(?i)deprecated[.!]? use \S* instead`),
|
||||
regexp.MustCompile(`(?i)\[\[deprecated\]\].*`),
|
||||
regexp.MustCompile(`(?i)note: deprecated\b.*`),
|
||||
regexp.MustCompile(`(?i)deprecated in.*`),
|
||||
c.commonPatterns = []string{
|
||||
"this type is deprecated",
|
||||
"this function is deprecated",
|
||||
"[[deprecated]]",
|
||||
"note: deprecated",
|
||||
"deprecated in",
|
||||
"deprecated. use",
|
||||
"deprecated! use",
|
||||
"deprecated use",
|
||||
// TODO(quasilyte): more of these?
|
||||
}
|
||||
|
||||
|
@ -41,6 +43,7 @@ func FuncOld() int`
|
|||
"Dprecated: ",
|
||||
"Derecated: ",
|
||||
"Depecated: ",
|
||||
"Depekated: ",
|
||||
"Deprcated: ",
|
||||
"Depreated: ",
|
||||
"Deprected: ",
|
||||
|
@ -63,7 +66,7 @@ type deprecatedCommentChecker struct {
|
|||
astwalk.WalkHandler
|
||||
ctx *linter.CheckerContext
|
||||
|
||||
commonPatterns []*regexp.Regexp
|
||||
commonPatterns []string
|
||||
commonTypos []string
|
||||
}
|
||||
|
||||
|
@ -114,7 +117,11 @@ func (c *deprecatedCommentChecker) VisitDocComment(doc *ast.CommentGroup) {
|
|||
|
||||
// Check for other commonly used patterns.
|
||||
for _, pat := range c.commonPatterns {
|
||||
if pat.MatchString(l) {
|
||||
if len(l) < len(pat) {
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.EqualFold(l[:len(pat)], pat) {
|
||||
c.warnPattern(comment)
|
||||
return
|
||||
}
|
||||
|
|
103
vendor/github.com/go-critic/go-critic/checkers/embedded_rules.go
generated
vendored
Normal file
103
vendor/github.com/go-critic/go-critic/checkers/embedded_rules.go
generated
vendored
Normal file
|
@ -0,0 +1,103 @@
|
|||
package checkers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"go/build"
|
||||
"go/token"
|
||||
"os"
|
||||
|
||||
"github.com/go-critic/go-critic/checkers/rulesdata"
|
||||
"github.com/go-critic/go-critic/framework/linter"
|
||||
"github.com/quasilyte/go-ruleguard/ruleguard"
|
||||
)
|
||||
|
||||
//go:generate go run ./rules/precompile.go -rules ./rules/rules.go -o ./rulesdata/rulesdata.go
|
||||
|
||||
func init() {
|
||||
filename := "rules/rules.go"
|
||||
|
||||
fset := token.NewFileSet()
|
||||
var groups []ruleguard.GoRuleGroup
|
||||
|
||||
var buildContext *build.Context
|
||||
|
||||
ruleguardDebug := os.Getenv("GOCRITIC_RULEGUARD_DEBUG") != ""
|
||||
|
||||
// First we create an Engine to parse all rules.
|
||||
// We need it to get the structured info about our rules
|
||||
// that will be used to generate checkers.
|
||||
// We introduce an extra scope in hope that rootEngine
|
||||
// will be garbage-collected after we don't need it.
|
||||
// LoadedGroups() returns a slice copy and that's all what we need.
|
||||
{
|
||||
rootEngine := ruleguard.NewEngine()
|
||||
rootEngine.InferBuildContext()
|
||||
buildContext = rootEngine.BuildContext
|
||||
|
||||
loadContext := &ruleguard.LoadContext{
|
||||
Fset: fset,
|
||||
DebugImports: ruleguardDebug,
|
||||
DebugPrint: func(s string) {
|
||||
fmt.Println("debug:", s)
|
||||
},
|
||||
}
|
||||
if err := rootEngine.LoadFromIR(loadContext, filename, rulesdata.PrecompiledRules); err != nil {
|
||||
panic(fmt.Sprintf("load embedded ruleguard rules: %v", err))
|
||||
}
|
||||
groups = rootEngine.LoadedGroups()
|
||||
}
|
||||
|
||||
// For every rules group we create a new checker and a separate engine.
|
||||
// That dedicated ruleguard engine will contain rules only from one group.
|
||||
for i := range groups {
|
||||
g := groups[i]
|
||||
info := &linter.CheckerInfo{
|
||||
Name: g.Name,
|
||||
Summary: g.DocSummary,
|
||||
Before: g.DocBefore,
|
||||
After: g.DocAfter,
|
||||
Note: g.DocNote,
|
||||
Tags: g.DocTags,
|
||||
|
||||
EmbeddedRuleguard: true,
|
||||
}
|
||||
collection.AddChecker(info, func(ctx *linter.CheckerContext) (linter.FileWalker, error) {
|
||||
parseContext := &ruleguard.LoadContext{
|
||||
Fset: fset,
|
||||
GroupFilter: func(name string) bool {
|
||||
return name == g.Name
|
||||
},
|
||||
DebugImports: ruleguardDebug,
|
||||
DebugPrint: func(s string) {
|
||||
fmt.Println("debug:", s)
|
||||
},
|
||||
}
|
||||
engine := ruleguard.NewEngine()
|
||||
engine.BuildContext = buildContext
|
||||
err := engine.LoadFromIR(parseContext, filename, rulesdata.PrecompiledRules)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c := &embeddedRuleguardChecker{
|
||||
ctx: ctx,
|
||||
engine: engine,
|
||||
}
|
||||
return c, nil
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type embeddedRuleguardChecker struct {
|
||||
ctx *linter.CheckerContext
|
||||
engine *ruleguard.Engine
|
||||
}
|
||||
|
||||
func (c *embeddedRuleguardChecker) WalkFile(f *ast.File) {
|
||||
runRuleguardEngine(c.ctx, f, c.engine, &ruleguard.RunContext{
|
||||
Pkg: c.ctx.Pkg,
|
||||
Types: c.ctx.TypesInfo,
|
||||
Sizes: c.ctx.SizesInfo,
|
||||
Fset: c.ctx.FileSet,
|
||||
})
|
||||
}
|
32
vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astfind.go
generated
vendored
32
vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astfind.go
generated
vendored
|
@ -7,21 +7,35 @@ import (
|
|||
)
|
||||
|
||||
// FindNode applies pred for root and all it's childs until it returns true.
|
||||
// If followFunc is defined, it's called before following any node to check whether it needs to be followed.
|
||||
// followFunc has to return true in order to continuing traversing the node and return false otherwise.
|
||||
// Matched node is returned.
|
||||
// If none of the nodes matched predicate, nil is returned.
|
||||
func FindNode(root ast.Node, pred func(ast.Node) bool) ast.Node {
|
||||
var found ast.Node
|
||||
astutil.Apply(root, nil, func(cur *astutil.Cursor) bool {
|
||||
if pred(cur.Node()) {
|
||||
found = cur.Node()
|
||||
return false
|
||||
func FindNode(root ast.Node, followFunc, pred func(ast.Node) bool) ast.Node {
|
||||
var (
|
||||
found ast.Node
|
||||
preFunc func(*astutil.Cursor) bool
|
||||
)
|
||||
|
||||
if followFunc != nil {
|
||||
preFunc = func(cur *astutil.Cursor) bool {
|
||||
return followFunc(cur.Node())
|
||||
}
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
astutil.Apply(root,
|
||||
preFunc,
|
||||
func(cur *astutil.Cursor) bool {
|
||||
if pred(cur.Node()) {
|
||||
found = cur.Node()
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
return found
|
||||
}
|
||||
|
||||
// ContainsNode reports whether `FindNode(root, pred)!=nil`.
|
||||
func ContainsNode(root ast.Node, pred func(ast.Node) bool) bool {
|
||||
return FindNode(root, pred) != nil
|
||||
return FindNode(root, nil, pred) != nil
|
||||
}
|
||||
|
|
56
vendor/github.com/go-critic/go-critic/checkers/ruleguard_checker.go
generated
vendored
56
vendor/github.com/go-critic/go-critic/checkers/ruleguard_checker.go
generated
vendored
|
@ -12,8 +12,9 @@ import (
|
|||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/go-critic/go-critic/framework/linter"
|
||||
"github.com/quasilyte/go-ruleguard/ruleguard"
|
||||
|
||||
"github.com/go-critic/go-critic/framework/linter"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
@ -41,6 +42,14 @@ If flag is set, the value must be a comma-separated list of error conditions.
|
|||
* 'import': rule refers to a package that cannot be loaded.
|
||||
* 'dsl': gorule file does not comply with the ruleguard DSL.`,
|
||||
},
|
||||
"enable": {
|
||||
Value: "<all>",
|
||||
Usage: "comma-separated list of enabled groups or skip empty to enable everything",
|
||||
},
|
||||
"disable": {
|
||||
Value: "",
|
||||
Usage: "comma-separated list of disabled groups or skip empty to enable everything",
|
||||
},
|
||||
}
|
||||
info.Summary = "Runs user-defined rules using ruleguard linter"
|
||||
info.Details = "Reads a rules file and turns them into go-critic checkers."
|
||||
|
@ -124,13 +133,43 @@ func newRuleguardChecker(info *linter.CheckerInfo, ctx *linter.CheckerContext) (
|
|||
fset := token.NewFileSet()
|
||||
filePatterns := strings.Split(rulesFlag, ",")
|
||||
|
||||
enabledGroups := make(map[string]bool)
|
||||
disabledGroups := make(map[string]bool)
|
||||
|
||||
for _, g := range strings.Split(info.Params.String("disable"), ",") {
|
||||
g = strings.TrimSpace(g)
|
||||
disabledGroups[g] = true
|
||||
}
|
||||
flagEnable := info.Params.String("enable")
|
||||
if flagEnable != "<all>" {
|
||||
for _, g := range strings.Split(flagEnable, ",") {
|
||||
g = strings.TrimSpace(g)
|
||||
enabledGroups[g] = true
|
||||
}
|
||||
}
|
||||
ruleguardDebug := os.Getenv("GOCRITIC_RULEGUARD_DEBUG") != ""
|
||||
|
||||
loadContext := &ruleguard.LoadContext{
|
||||
Fset: fset,
|
||||
DebugImports: ruleguardDebug,
|
||||
DebugPrint: func(s string) {
|
||||
fmt.Println("debug:", s)
|
||||
DebugPrint: debugPrint,
|
||||
GroupFilter: func(g string) bool {
|
||||
whyDisabled := ""
|
||||
enabled := flagEnable == "<all>" || enabledGroups[g]
|
||||
switch {
|
||||
case !enabled:
|
||||
whyDisabled = "not enabled by -enabled flag"
|
||||
case disabledGroups[g]:
|
||||
whyDisabled = "disabled by -disable flag"
|
||||
}
|
||||
if ruleguardDebug {
|
||||
if whyDisabled != "" {
|
||||
debugPrint(fmt.Sprintf("(-) %s is %s", g, whyDisabled))
|
||||
} else {
|
||||
debugPrint(fmt.Sprintf("(+) %s is enabled", g))
|
||||
}
|
||||
}
|
||||
return whyDisabled == ""
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -201,13 +240,14 @@ func runRuleguardEngine(ctx *linter.CheckerContext, f *ast.File, e *ruleguard.En
|
|||
}
|
||||
var reports []ruleguardReport
|
||||
|
||||
runCtx.Report = func(_ ruleguard.GoRuleInfo, n ast.Node, msg string, fix *ruleguard.Suggestion) {
|
||||
runCtx.Report = func(data *ruleguard.ReportData) {
|
||||
// TODO(quasilyte): investigate whether we should add a rule name as
|
||||
// a message prefix here.
|
||||
r := ruleguardReport{
|
||||
node: n,
|
||||
message: msg,
|
||||
node: data.Node,
|
||||
message: data.Message,
|
||||
}
|
||||
fix := data.Suggestion
|
||||
if fix != nil {
|
||||
r.fix = linter.QuickFix{
|
||||
From: fix.From,
|
||||
|
@ -236,3 +276,7 @@ func runRuleguardEngine(ctx *linter.CheckerContext, f *ast.File, e *ruleguard.En
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func debugPrint(s string) {
|
||||
fmt.Println("debug:", s)
|
||||
}
|
||||
|
|
1218
vendor/github.com/go-critic/go-critic/checkers/rulesdata/rulesdata.go
generated
vendored
1218
vendor/github.com/go-critic/go-critic/checkers/rulesdata/rulesdata.go
generated
vendored
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue