diff --git a/go.mod b/go.mod
index 4a59dc76e6..686944b6e9 100644
--- a/go.mod
+++ b/go.mod
@@ -31,8 +31,8 @@ require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/fzipp/gocyclo v0.0.0-20150627053110-6acd4345c835
- github.com/go-openapi/jsonreference v0.19.3 // indirect
- github.com/go-openapi/spec v0.19.4 // indirect
+ github.com/go-openapi/spec v0.19.8 // indirect
+ github.com/go-openapi/swag v0.19.9 // indirect
github.com/go-redis/redis/v7 v7.4.0
github.com/go-sql-driver/mysql v1.5.0
github.com/go-testfixtures/testfixtures/v3 v3.2.0
@@ -45,7 +45,7 @@ require (
github.com/labstack/gommon v0.3.0
github.com/laurent22/ical-go v0.1.1-0.20181107184520-7e5d6ade8eef
github.com/lib/pq v1.7.0
- github.com/mailru/easyjson v0.7.0 // indirect
+ github.com/mailru/easyjson v0.7.1 // indirect
github.com/mattn/go-sqlite3 v2.0.3+incompatible
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/olekukonko/tablewriter v0.0.4
@@ -63,17 +63,17 @@ require (
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/viper v1.7.0
github.com/stretchr/testify v1.6.1
- github.com/swaggo/swag v1.6.3
+ github.com/swaggo/swag v1.6.7
github.com/ulule/limiter/v3 v3.5.0
- github.com/urfave/cli v1.22.2 // indirect
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
golang.org/x/lint v0.0.0-20200302205851-738671d3881b
- golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect
- golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef // indirect
+ golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
+ golang.org/x/tools v0.0.0-20200612220849-54c614fe050c // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/d4l3k/messagediff.v1 v1.2.1
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
+ gopkg.in/yaml.v2 v2.3.0 // indirect
honnef.co/go/tools v0.0.1-2020.1.4
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056
src.techknowlogick.com/xormigrate v1.2.1
diff --git a/go.sum b/go.sum
index 78bddcf717..4ad0331c22 100644
--- a/go.sum
+++ b/go.sum
@@ -98,8 +98,7 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4 h1:YcpmyvADGYw5LqMnHqSkyIELsHCGF6PkrmM31V8rF7o=
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
-github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e h1:LzwWXEScfcTu7vUZNlDDWDARoSGEtvlDKK2BYHowNeE=
-github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
+github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg=
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
@@ -146,18 +145,20 @@ github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo=
github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
+github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
+github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE=
+github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-redis/redis/v7 v7.2.0 h1:CrCexy/jYWZjW0AyVoHlcJUeZN19VWlbepTh1Vq6dJs=
github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/go-redis/redis/v7 v7.3.0 h1:3oHqd0W7f/VLKBxeYTEpqdMUsmMectngjM9OtoRoIgg=
-github.com/go-redis/redis/v7 v7.3.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
@@ -315,8 +316,6 @@ github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/lib/pq v1.5.2 h1:yTSXVswvWUOQ3k1sd7vJfDrbSl8lKuscqFJRqjC0ifw=
-github.com/lib/pq v1.5.2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.6.0 h1:I5DPxhYJChW9KYc66se+oKFFQX6VuQrKiprsX6ivRZc=
github.com/lib/pq v1.6.0/go.mod h1:4vXEAYvW1fRQ2/FhZ78H73A60MHw1geSm145z2mdY1g=
github.com/lib/pq v1.7.0 h1:h93mCPfUSkaul3Ka/VG8uZdmW1uMHDGxzu0NWHuJmHY=
@@ -329,8 +328,8 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=
-github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
+github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
+github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -447,6 +446,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/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/shopspring/decimal v0.0.0-20191009025716-f1972eb1d1f5/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
@@ -502,8 +502,8 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI=
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
-github.com/swaggo/swag v1.6.3 h1:N+uVPGP4H2hXoss2pt5dctoSUPKKRInr6qcTMOm0usI=
-github.com/swaggo/swag v1.6.3/go.mod h1:wcc83tB4Mb2aNiL/HP4MFeQdpHUrca+Rp/DRNgWAUio=
+github.com/swaggo/swag v1.6.7 h1:e8GC2xDllJZr3omJkm9YfmK0Y56+rMO3cg0JBKNz09s=
+github.com/swaggo/swag v1.6.7/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -517,8 +517,8 @@ github.com/ulule/limiter/v3 v3.5.0 h1:QRAebbswjlezHIfiSQgM8+jMxaz/zsrxGRuiUJ43MH
github.com/ulule/limiter/v3 v3.5.0/go.mod h1:TgOUQZKZ2KHjemqrC8UHUbKPqpTmSY43/2wbQ7YN1h8=
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo=
-github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k=
+github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.9.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
@@ -553,10 +553,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200311171314-f7b00557c8c4/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
-golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200602180216-279210d13fed h1:g4KENRiCMEx58Q7/ecwfT0N2o8z35Fnbsjig/Alf2T4=
-golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -611,8 +607,8 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
-golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
+golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
@@ -696,8 +692,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef h1:RHORRhs540cYZYrzgU2CPUyykkwZM78hGdzocOo9P8A=
-golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200612220849-54c614fe050c h1:g6oFfz6Cmw68izP3xsdud3Oxu145IPkeFzyRg58AKHM=
+golang.org/x/tools v0.0.0-20200612220849-54c614fe050c/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
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-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
@@ -776,6 +772,8 @@ gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo=
gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
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=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -788,14 +786,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
-src.techknowlogick.com/xgo v0.0.0-20200514233805-209a5cf70012 h1:k1/qGRpsaGka4IHT2UIUdPqM6+oo3O7+8S3ACN2kJZQ=
-src.techknowlogick.com/xgo v0.0.0-20200514233805-209a5cf70012/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU=
-src.techknowlogick.com/xgo v0.0.0-20200601230223-eeb7c0a673dd h1:6hliDQiQTI45t45ECQxdnLhdkd8y96dsBeeun0A/9jQ=
-src.techknowlogick.com/xgo v0.0.0-20200601230223-eeb7c0a673dd/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU=
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056 h1:9XYMVs36yGHbSNs+m7kHg5lQnTOie2bMLM1c8LtAoXs=
src.techknowlogick.com/xgo v0.0.0-20200602060627-a09175ea9056/go.mod h1:31CE1YKtDOrKTk9PSnjTpe6YbO6W/0LTYZ1VskL09oU=
-src.techknowlogick.com/xormigrate v1.2.0 h1:bq9JaI48bxB+OddMghicjmV7sGmBUogJq4HmTN0DOcw=
-src.techknowlogick.com/xormigrate v1.2.0/go.mod h1:7so27LAfBRqAxbma5jKYeL4ykVG1Jhsv9ncSq1KBCs4=
src.techknowlogick.com/xormigrate v1.2.1 h1:HMtGqV5QN5zvYU244jzFCJ27rAljkMn/jsgp+H4S6WA=
src.techknowlogick.com/xormigrate v1.2.1/go.mod h1:PhU3iInlbFSev3M4ZnmAeWy9ZHUVDbz3U1X9Sg9S8xQ=
xorm.io/builder v0.3.7 h1:2pETdKRK+2QG4mLX4oODHEhn5Z8j1m8sXa7jfu+/SZI=
diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml
index 3e33f9f2e3..4e17ed4979 100644
--- a/vendor/github.com/go-openapi/spec/.golangci.yml
+++ b/vendor/github.com/go-openapi/spec/.golangci.yml
@@ -21,3 +21,8 @@ linters:
- lll
- gochecknoinits
- gochecknoglobals
+ - funlen
+ - godox
+ - gocognit
+ - whitespace
+ - wsl
diff --git a/vendor/github.com/go-openapi/spec/.travis.yml b/vendor/github.com/go-openapi/spec/.travis.yml
index aa26d8763a..f1a3f80b35 100644
--- a/vendor/github.com/go-openapi/spec/.travis.yml
+++ b/vendor/github.com/go-openapi/spec/.travis.yml
@@ -1,12 +1,10 @@
after_success:
- bash <(curl -s https://codecov.io/bash)
go:
-- 1.11.x
-- 1.12.x
+- 1.13.x
+- 1.14.x
install:
- GO111MODULE=off go get -u gotest.tools/gotestsum
-env:
-- GO111MODULE=on
language: go
notifications:
slack:
diff --git a/vendor/github.com/go-openapi/spec/contact_info.go b/vendor/github.com/go-openapi/spec/contact_info.go
index f285970aa1..f9bf42e8dd 100644
--- a/vendor/github.com/go-openapi/spec/contact_info.go
+++ b/vendor/github.com/go-openapi/spec/contact_info.go
@@ -14,11 +14,41 @@
package spec
+import (
+ "encoding/json"
+
+ "github.com/go-openapi/swag"
+)
+
// ContactInfo contact information for the exposed API.
//
// For more information: http://goo.gl/8us55a#contactObject
type ContactInfo struct {
+ ContactInfoProps
+ VendorExtensible
+}
+
+type ContactInfoProps struct {
Name string `json:"name,omitempty"`
URL string `json:"url,omitempty"`
Email string `json:"email,omitempty"`
}
+
+func (c *ContactInfo) UnmarshalJSON(data []byte) error {
+ if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil {
+ return err
+ }
+ return json.Unmarshal(data, &c.VendorExtensible)
+}
+
+func (c ContactInfo) MarshalJSON() ([]byte, error) {
+ b1, err := json.Marshal(c.ContactInfoProps)
+ if err != nil {
+ return nil, err
+ }
+ b2, err := json.Marshal(c.VendorExtensible)
+ if err != nil {
+ return nil, err
+ }
+ return swag.ConcatJSON(b1, b2), nil
+}
diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go
index 1e7fc8c490..1f30e7f8b1 100644
--- a/vendor/github.com/go-openapi/spec/expander.go
+++ b/vendor/github.com/go-openapi/spec/expander.go
@@ -200,11 +200,11 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error {
return nil
}
+const rootBase = "root"
// baseForRoot loads in the cache the root document and produces a fake "root" base path entry
// for further $ref resolution
func baseForRoot(root interface{}, cache ResolutionCache) string {
// cache the root document to resolve $ref's
- const rootBase = "root"
if root != nil {
base, _ := absPath(rootBase)
normalizedBase := normalizeAbsPath(base)
@@ -452,11 +452,12 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string)
return err
}
if pathItem.Ref.String() != "" {
- var err error
- resolver, err = resolver.transitiveResolver(basePath, pathItem.Ref)
- if resolver.shouldStopOnError(err) {
+ transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref)
+ if transitiveResolver.shouldStopOnError(err) {
return err
}
+ basePath = transitiveResolver.updateBasePath(resolver, basePath)
+ resolver = transitiveResolver
}
pathItem.Ref = Ref{}
diff --git a/vendor/github.com/go-openapi/spec/go.mod b/vendor/github.com/go-openapi/spec/go.mod
index 02a142c03c..14e5f2dac3 100644
--- a/vendor/github.com/go-openapi/spec/go.mod
+++ b/vendor/github.com/go-openapi/spec/go.mod
@@ -4,14 +4,9 @@ require (
github.com/go-openapi/jsonpointer v0.19.3
github.com/go-openapi/jsonreference v0.19.2
github.com/go-openapi/swag v0.19.5
- github.com/kr/pty v1.1.5 // indirect
- github.com/stretchr/objx v0.2.0 // indirect
github.com/stretchr/testify v1.3.0
- golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect
- golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect
- golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect
- gopkg.in/yaml.v2 v2.2.2
+ gopkg.in/yaml.v2 v2.2.4
)
go 1.13
diff --git a/vendor/github.com/go-openapi/spec/go.sum b/vendor/github.com/go-openapi/spec/go.sum
index 86db601c97..c209ff9712 100644
--- a/vendor/github.com/go-openapi/spec/go.sum
+++ b/vendor/github.com/go-openapi/spec/go.sum
@@ -1,5 +1,3 @@
-github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
-github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
@@ -7,20 +5,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
-github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
-github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8=
-github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk=
-github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
-github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=
-github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
@@ -28,11 +18,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
-github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
@@ -40,35 +27,23 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN
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/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE=
-golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/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-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/vendor/github.com/go-openapi/spec/license.go b/vendor/github.com/go-openapi/spec/license.go
index f20961b4fd..e1529b401c 100644
--- a/vendor/github.com/go-openapi/spec/license.go
+++ b/vendor/github.com/go-openapi/spec/license.go
@@ -14,10 +14,40 @@
package spec
+import (
+ "encoding/json"
+
+ "github.com/go-openapi/swag"
+)
+
// License information for the exposed API.
//
// For more information: http://goo.gl/8us55a#licenseObject
type License struct {
+ LicenseProps
+ VendorExtensible
+}
+
+type LicenseProps struct {
Name string `json:"name,omitempty"`
URL string `json:"url,omitempty"`
}
+
+func (l *License) UnmarshalJSON(data []byte) error {
+ if err := json.Unmarshal(data, &l.LicenseProps); err != nil {
+ return err
+ }
+ return json.Unmarshal(data, &l.VendorExtensible)
+}
+
+func (l License) MarshalJSON() ([]byte, error) {
+ b1, err := json.Marshal(l.LicenseProps)
+ if err != nil {
+ return nil, err
+ }
+ b2, err := json.Marshal(l.VendorExtensible)
+ if err != nil {
+ return nil, err
+ }
+ return swag.ConcatJSON(b1, b2), nil
+}
diff --git a/vendor/github.com/go-openapi/spec/ref.go b/vendor/github.com/go-openapi/spec/ref.go
index 813dfe71b4..1f31a9ead0 100644
--- a/vendor/github.com/go-openapi/spec/ref.go
+++ b/vendor/github.com/go-openapi/spec/ref.go
@@ -68,6 +68,7 @@ func (r *Ref) IsValidURI(basepaths ...string) bool {
}
if r.HasFullURL {
+ //#nosec
rr, err := http.Get(v)
if err != nil {
return false
diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go
index 9e20e96c2a..02d9966c1a 100644
--- a/vendor/github.com/go-openapi/spec/schema_loader.go
+++ b/vendor/github.com/go-openapi/spec/schema_loader.go
@@ -86,12 +86,7 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad
newOptions := r.options
newOptions.RelativeBase = rootURL.String()
debugLog("setting new root: %s", newOptions.RelativeBase)
- resolver, err := defaultSchemaLoader(root, newOptions, r.cache, r.context)
- if err != nil {
- return nil, err
- }
-
- return resolver, nil
+ return defaultSchemaLoader(root, newOptions, r.cache, r.context)
}
func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string {
@@ -154,7 +149,15 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error)
toFetch := *refURL
toFetch.Fragment = ""
- normalized := normalizeAbsPath(toFetch.String())
+ var err error
+ path := toFetch.String()
+ if path == rootBase {
+ path, err = absPath(rootBase)
+ if err != nil {
+ return nil, url.URL{}, false, err
+ }
+ }
+ normalized := normalizeAbsPath(path)
data, fromCache := r.cache.Get(normalized)
if !fromCache {
diff --git a/vendor/github.com/go-openapi/swag/.travis.yml b/vendor/github.com/go-openapi/swag/.travis.yml
index aa26d8763a..f1a3f80b35 100644
--- a/vendor/github.com/go-openapi/swag/.travis.yml
+++ b/vendor/github.com/go-openapi/swag/.travis.yml
@@ -1,12 +1,10 @@
after_success:
- bash <(curl -s https://codecov.io/bash)
go:
-- 1.11.x
-- 1.12.x
+- 1.13.x
+- 1.14.x
install:
- GO111MODULE=off go get -u gotest.tools/gotestsum
-env:
-- GO111MODULE=on
language: go
notifications:
slack:
diff --git a/vendor/github.com/go-openapi/swag/convert.go b/vendor/github.com/go-openapi/swag/convert.go
index 7da35c316e..fc085aeb8e 100644
--- a/vendor/github.com/go-openapi/swag/convert.go
+++ b/vendor/github.com/go-openapi/swag/convert.go
@@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) {
return strconv.ParseFloat(str, 64)
}
-// ConvertInt8 turn a string into int8 boolean
+// ConvertInt8 turn a string into an int8
func ConvertInt8(str string) (int8, error) {
i, err := strconv.ParseInt(str, 10, 8)
if err != nil {
@@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) {
return int8(i), nil
}
-// ConvertInt16 turn a string into a int16
+// ConvertInt16 turn a string into an int16
func ConvertInt16(str string) (int16, error) {
i, err := strconv.ParseInt(str, 10, 16)
if err != nil {
@@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) {
return int16(i), nil
}
-// ConvertInt32 turn a string into a int32
+// ConvertInt32 turn a string into an int32
func ConvertInt32(str string) (int32, error) {
i, err := strconv.ParseInt(str, 10, 32)
if err != nil {
@@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) {
return int32(i), nil
}
-// ConvertInt64 turn a string into a int64
+// ConvertInt64 turn a string into an int64
func ConvertInt64(str string) (int64, error) {
return strconv.ParseInt(str, 10, 64)
}
-// ConvertUint8 turn a string into a uint8
+// ConvertUint8 turn a string into an uint8
func ConvertUint8(str string) (uint8, error) {
i, err := strconv.ParseUint(str, 10, 8)
if err != nil {
@@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) {
return uint8(i), nil
}
-// ConvertUint16 turn a string into a uint16
+// ConvertUint16 turn a string into an uint16
func ConvertUint16(str string) (uint16, error) {
i, err := strconv.ParseUint(str, 10, 16)
if err != nil {
@@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) {
return uint16(i), nil
}
-// ConvertUint32 turn a string into a uint32
+// ConvertUint32 turn a string into an uint32
func ConvertUint32(str string) (uint32, error) {
i, err := strconv.ParseUint(str, 10, 32)
if err != nil {
@@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) {
return uint32(i), nil
}
-// ConvertUint64 turn a string into a uint64
+// ConvertUint64 turn a string into an uint64
func ConvertUint64(str string) (uint64, error) {
return strconv.ParseUint(str, 10, 64)
}
diff --git a/vendor/github.com/go-openapi/swag/convert_types.go b/vendor/github.com/go-openapi/swag/convert_types.go
index c95e4e78bd..c49cc473a8 100644
--- a/vendor/github.com/go-openapi/swag/convert_types.go
+++ b/vendor/github.com/go-openapi/swag/convert_types.go
@@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int {
return dst
}
-// Int32 returns a pointer to of the int64 value passed in.
+// Int32 returns a pointer to of the int32 value passed in.
func Int32(v int32) *int32 {
return &v
}
-// Int32Value returns the value of the int64 pointer passed in or
+// Int32Value returns the value of the int32 pointer passed in or
// 0 if the pointer is nil.
func Int32Value(v *int32) int32 {
if v != nil {
@@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 {
return 0
}
-// Int32Slice converts a slice of int64 values into a slice of
+// Int32Slice converts a slice of int32 values into a slice of
// int32 pointers
func Int32Slice(src []int32) []*int32 {
dst := make([]*int32, len(src))
@@ -299,13 +299,80 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 {
return dst
}
-// Uint returns a pouinter to of the uint value passed in.
+// Uint16 returns a pointer to of the uint16 value passed in.
+func Uint16(v uint16) *uint16 {
+ return &v
+}
+
+// Uint16Value returns the value of the uint16 pointer passed in or
+// 0 if the pointer is nil.
+func Uint16Value(v *uint16) uint16 {
+ if v != nil {
+ return *v
+ }
+
+ return 0
+}
+
+// Uint16Slice converts a slice of uint16 values into a slice of
+// uint16 pointers
+func Uint16Slice(src []uint16) []*uint16 {
+ dst := make([]*uint16, len(src))
+ for i := 0; i < len(src); i++ {
+ dst[i] = &(src[i])
+ }
+
+ return dst
+}
+
+// Uint16ValueSlice converts a slice of uint16 pointers into a slice of
+// uint16 values
+func Uint16ValueSlice(src []*uint16) []uint16 {
+ dst := make([]uint16, len(src))
+
+ for i := 0; i < len(src); i++ {
+ if src[i] != nil {
+ dst[i] = *(src[i])
+ }
+ }
+
+ return dst
+}
+
+// Uint16Map converts a string map of uint16 values into a string
+// map of uint16 pointers
+func Uint16Map(src map[string]uint16) map[string]*uint16 {
+ dst := make(map[string]*uint16)
+
+ for k, val := range src {
+ v := val
+ dst[k] = &v
+ }
+
+ return dst
+}
+
+// Uint16ValueMap converts a string map of uint16 pointers into a string
+// map of uint16 values
+func Uint16ValueMap(src map[string]*uint16) map[string]uint16 {
+ dst := make(map[string]uint16)
+
+ for k, val := range src {
+ if val != nil {
+ dst[k] = *val
+ }
+ }
+
+ return dst
+}
+
+// Uint returns a pointer to of the uint value passed in.
func Uint(v uint) *uint {
return &v
}
-// UintValue returns the value of the uint pouinter passed in or
-// 0 if the pouinter is nil.
+// UintValue returns the value of the uint pointer passed in or
+// 0 if the pointer is nil.
func UintValue(v *uint) uint {
if v != nil {
return *v
@@ -313,8 +380,8 @@ func UintValue(v *uint) uint {
return 0
}
-// UintSlice converts a slice of uint values uinto a slice of
-// uint pouinters
+// UintSlice converts a slice of uint values into a slice of
+// uint pointers
func UintSlice(src []uint) []*uint {
dst := make([]*uint, len(src))
for i := 0; i < len(src); i++ {
@@ -323,7 +390,7 @@ func UintSlice(src []uint) []*uint {
return dst
}
-// UintValueSlice converts a slice of uint pouinters uinto a slice of
+// UintValueSlice converts a slice of uint pointers into a slice of
// uint values
func UintValueSlice(src []*uint) []uint {
dst := make([]uint, len(src))
@@ -335,8 +402,8 @@ func UintValueSlice(src []*uint) []uint {
return dst
}
-// UintMap converts a string map of uint values uinto a string
-// map of uint pouinters
+// UintMap converts a string map of uint values into a string
+// map of uint pointers
func UintMap(src map[string]uint) map[string]*uint {
dst := make(map[string]*uint)
for k, val := range src {
@@ -346,7 +413,7 @@ func UintMap(src map[string]uint) map[string]*uint {
return dst
}
-// UintValueMap converts a string map of uint pouinters uinto a string
+// UintValueMap converts a string map of uint pointers into a string
// map of uint values
func UintValueMap(src map[string]*uint) map[string]uint {
dst := make(map[string]uint)
@@ -358,13 +425,13 @@ func UintValueMap(src map[string]*uint) map[string]uint {
return dst
}
-// Uint32 returns a pouinter to of the uint64 value passed in.
+// Uint32 returns a pointer to of the uint32 value passed in.
func Uint32(v uint32) *uint32 {
return &v
}
-// Uint32Value returns the value of the uint64 pouinter passed in or
-// 0 if the pouinter is nil.
+// Uint32Value returns the value of the uint32 pointer passed in or
+// 0 if the pointer is nil.
func Uint32Value(v *uint32) uint32 {
if v != nil {
return *v
@@ -372,8 +439,8 @@ func Uint32Value(v *uint32) uint32 {
return 0
}
-// Uint32Slice converts a slice of uint64 values uinto a slice of
-// uint32 pouinters
+// Uint32Slice converts a slice of uint32 values into a slice of
+// uint32 pointers
func Uint32Slice(src []uint32) []*uint32 {
dst := make([]*uint32, len(src))
for i := 0; i < len(src); i++ {
@@ -382,7 +449,7 @@ func Uint32Slice(src []uint32) []*uint32 {
return dst
}
-// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of
+// Uint32ValueSlice converts a slice of uint32 pointers into a slice of
// uint32 values
func Uint32ValueSlice(src []*uint32) []uint32 {
dst := make([]uint32, len(src))
@@ -394,8 +461,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 {
return dst
}
-// Uint32Map converts a string map of uint32 values uinto a string
-// map of uint32 pouinters
+// Uint32Map converts a string map of uint32 values into a string
+// map of uint32 pointers
func Uint32Map(src map[string]uint32) map[string]*uint32 {
dst := make(map[string]*uint32)
for k, val := range src {
@@ -405,7 +472,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 {
return dst
}
-// Uint32ValueMap converts a string map of uint32 pouinters uinto a string
+// Uint32ValueMap converts a string map of uint32 pointers into a string
// map of uint32 values
func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
dst := make(map[string]uint32)
@@ -417,13 +484,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
return dst
}
-// Uint64 returns a pouinter to of the uint64 value passed in.
+// Uint64 returns a pointer to of the uint64 value passed in.
func Uint64(v uint64) *uint64 {
return &v
}
-// Uint64Value returns the value of the uint64 pouinter passed in or
-// 0 if the pouinter is nil.
+// Uint64Value returns the value of the uint64 pointer passed in or
+// 0 if the pointer is nil.
func Uint64Value(v *uint64) uint64 {
if v != nil {
return *v
@@ -431,8 +498,8 @@ func Uint64Value(v *uint64) uint64 {
return 0
}
-// Uint64Slice converts a slice of uint64 values uinto a slice of
-// uint64 pouinters
+// Uint64Slice converts a slice of uint64 values into a slice of
+// uint64 pointers
func Uint64Slice(src []uint64) []*uint64 {
dst := make([]*uint64, len(src))
for i := 0; i < len(src); i++ {
@@ -441,7 +508,7 @@ func Uint64Slice(src []uint64) []*uint64 {
return dst
}
-// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of
+// Uint64ValueSlice converts a slice of uint64 pointers into a slice of
// uint64 values
func Uint64ValueSlice(src []*uint64) []uint64 {
dst := make([]uint64, len(src))
@@ -453,8 +520,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 {
return dst
}
-// Uint64Map converts a string map of uint64 values uinto a string
-// map of uint64 pouinters
+// Uint64Map converts a string map of uint64 values into a string
+// map of uint64 pointers
func Uint64Map(src map[string]uint64) map[string]*uint64 {
dst := make(map[string]*uint64)
for k, val := range src {
@@ -464,7 +531,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 {
return dst
}
-// Uint64ValueMap converts a string map of uint64 pouinters uinto a string
+// Uint64ValueMap converts a string map of uint64 pointers into a string
// map of uint64 values
func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
dst := make(map[string]uint64)
@@ -476,6 +543,74 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
return dst
}
+// Float32 returns a pointer to of the float32 value passed in.
+func Float32(v float32) *float32 {
+ return &v
+}
+
+// Float32Value returns the value of the float32 pointer passed in or
+// 0 if the pointer is nil.
+func Float32Value(v *float32) float32 {
+ if v != nil {
+ return *v
+ }
+
+ return 0
+}
+
+// Float32Slice converts a slice of float32 values into a slice of
+// float32 pointers
+func Float32Slice(src []float32) []*float32 {
+ dst := make([]*float32, len(src))
+
+ for i := 0; i < len(src); i++ {
+ dst[i] = &(src[i])
+ }
+
+ return dst
+}
+
+// Float32ValueSlice converts a slice of float32 pointers into a slice of
+// float32 values
+func Float32ValueSlice(src []*float32) []float32 {
+ dst := make([]float32, len(src))
+
+ for i := 0; i < len(src); i++ {
+ if src[i] != nil {
+ dst[i] = *(src[i])
+ }
+ }
+
+ return dst
+}
+
+// Float32Map converts a string map of float32 values into a string
+// map of float32 pointers
+func Float32Map(src map[string]float32) map[string]*float32 {
+ dst := make(map[string]*float32)
+
+ for k, val := range src {
+ v := val
+ dst[k] = &v
+ }
+
+ return dst
+}
+
+// Float32ValueMap converts a string map of float32 pointers into a string
+// map of float32 values
+func Float32ValueMap(src map[string]*float32) map[string]float32 {
+ dst := make(map[string]float32)
+
+ for k, val := range src {
+ if val != nil {
+ dst[k] = *val
+ }
+ }
+
+ return dst
+}
+
// Float64 returns a pointer to of the float64 value passed in.
func Float64(v float64) *float64 {
return &v
diff --git a/vendor/github.com/go-openapi/swag/go.mod b/vendor/github.com/go-openapi/swag/go.mod
index 15bbb08222..4aef463e42 100644
--- a/vendor/github.com/go-openapi/swag/go.mod
+++ b/vendor/github.com/go-openapi/swag/go.mod
@@ -6,9 +6,11 @@ require (
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63
github.com/stretchr/testify v1.3.0
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
- gopkg.in/yaml.v2 v2.2.2
+ gopkg.in/yaml.v2 v2.2.4
)
replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422
replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1
+
+go 1.13
diff --git a/vendor/github.com/go-openapi/swag/go.sum b/vendor/github.com/go-openapi/swag/go.sum
index 33469f54ac..e8a80bacf0 100644
--- a/vendor/github.com/go-openapi/swag/go.sum
+++ b/vendor/github.com/go-openapi/swag/go.sum
@@ -16,5 +16,5 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/vendor/github.com/go-openapi/swag/json.go b/vendor/github.com/go-openapi/swag/json.go
index edf93d84c6..7e9902ca31 100644
--- a/vendor/github.com/go-openapi/swag/json.go
+++ b/vendor/github.com/go-openapi/swag/json.go
@@ -51,7 +51,7 @@ type ejUnmarshaler interface {
UnmarshalEasyJSON(w *jlexer.Lexer)
}
-// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller
+// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler
// so it takes the fastest option available.
func WriteJSON(data interface{}) ([]byte, error) {
if d, ok := data.(ejMarshaler); ok {
@@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) {
return json.Marshal(data)
}
-// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller
-// so it takes the fastes option available
+// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler
+// so it takes the fastest option available
func ReadJSON(data []byte, value interface{}) error {
trimmedData := bytes.Trim(data, "\x00")
if d, ok := value.(ejUnmarshaler); ok {
@@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error {
return json.Unmarshal(b, target)
}
-// NameProvider represents an object capabale of translating from go property names
+// NameProvider represents an object capable of translating from go property names
// to json property names
// This type is thread-safe.
type NameProvider struct {
diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go
index 70f4fb361c..04160b89ba 100644
--- a/vendor/github.com/go-openapi/swag/loading.go
+++ b/vendor/github.com/go-openapi/swag/loading.go
@@ -27,6 +27,15 @@ import (
// LoadHTTPTimeout the default timeout for load requests
var LoadHTTPTimeout = 30 * time.Second
+// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth
+var LoadHTTPBasicAuthUsername = ""
+
+// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth
+var LoadHTTPBasicAuthPassword = ""
+
+// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests
+var LoadHTTPCustomHeaders = map[string]string{}
+
// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
func LoadFromFileOrHTTP(path string) ([]byte, error) {
return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path)
@@ -59,6 +68,15 @@ func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) {
if err != nil {
return nil, err
}
+
+ if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" {
+ req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword)
+ }
+
+ for key, val := range LoadHTTPCustomHeaders {
+ req.Header.Set(key, val)
+ }
+
resp, err := client.Do(req)
defer func() {
if resp != nil {
diff --git a/vendor/github.com/mailru/easyjson/jwriter/writer.go b/vendor/github.com/mailru/easyjson/jwriter/writer.go
index b9ed7ccaa8..eb8547ccc2 100644
--- a/vendor/github.com/mailru/easyjson/jwriter/writer.go
+++ b/vendor/github.com/mailru/easyjson/jwriter/writer.go
@@ -270,16 +270,25 @@ func (w *Writer) Bool(v bool) {
const chars = "0123456789abcdef"
-func isNotEscapedSingleChar(c byte, escapeHTML bool) bool {
- // Note: might make sense to use a table if there are more chars to escape. With 4 chars
- // it benchmarks the same.
- if escapeHTML {
- return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf
- } else {
- return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf
+func getTable(falseValues ...int) [128]bool {
+ table := [128]bool{}
+
+ for i := 0; i < 128; i++ {
+ table[i] = true
}
+
+ for _, v := range falseValues {
+ table[v] = false
+ }
+
+ return table
}
+var (
+ htmlEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '&', '<', '>', '\\')
+ htmlNoEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '\\')
+)
+
func (w *Writer) String(s string) {
w.Buffer.AppendByte('"')
@@ -288,15 +297,23 @@ func (w *Writer) String(s string) {
p := 0 // last non-escape symbol
+ var escapeTable [128]bool
+ if w.NoEscapeHTML {
+ escapeTable = htmlNoEscapeTable
+ } else {
+ escapeTable = htmlEscapeTable
+ }
+
for i := 0; i < len(s); {
c := s[i]
- if isNotEscapedSingleChar(c, !w.NoEscapeHTML) {
- // single-width character, no escaping is required
- i++
- continue
- } else if c < utf8.RuneSelf {
- // single-with character, need to escape
+ if c < utf8.RuneSelf {
+ if escapeTable[c] {
+ // single-width character, no escaping is required
+ i++
+ continue
+ }
+
w.Buffer.AppendString(s[p:i])
switch c {
case '\t':
diff --git a/vendor/github.com/swaggo/swag/.travis.yml b/vendor/github.com/swaggo/swag/.travis.yml
index 560bdf3896..36a51fd720 100644
--- a/vendor/github.com/swaggo/swag/.travis.yml
+++ b/vendor/github.com/swaggo/swag/.travis.yml
@@ -1,10 +1,8 @@
language: go
-sudo: false
go:
- - 1.10.x
- - 1.11.x
- - 1.12.x
+ - 1.13.x
+ - 1.14.x
install:
- make deps
diff --git a/vendor/github.com/swaggo/swag/Dockerfile b/vendor/github.com/swaggo/swag/Dockerfile
new file mode 100644
index 0000000000..0a5d9b8db9
--- /dev/null
+++ b/vendor/github.com/swaggo/swag/Dockerfile
@@ -0,0 +1,29 @@
+# Dockerfile References: https://docs.docker.com/engine/reference/builder/
+
+# Start from the latest golang base image
+FROM golang:1.14-alpine as builder
+
+# Set the Current Working Directory inside the container
+WORKDIR /app
+
+# Copy go mod and sum files
+COPY go.mod go.sum ./
+
+# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
+RUN go mod download
+
+# Copy the source from the current directory to the Working Directory inside the container
+COPY . .
+
+# Build the Go app
+RUN CGO_ENABLED=0 GOOS=linux go build -v -a -installsuffix cgo -o swag cmd/swag/main.go
+
+
+######## Start a new stage from scratch #######
+FROM scratch
+
+WORKDIR /root/
+
+# Copy the Pre-built binary file from the previous stage
+COPY --from=builder /app/swag .
+
diff --git a/vendor/github.com/swaggo/swag/Makefile b/vendor/github.com/swaggo/swag/Makefile
index 75f9502688..f78299612d 100644
--- a/vendor/github.com/swaggo/swag/Makefile
+++ b/vendor/github.com/swaggo/swag/Makefile
@@ -9,6 +9,7 @@ GOTEST:=$(GOCMD) test
GOGET:=$(GOCMD) get
GOLIST:=$(GOCMD) list
GOVET:=$(GOCMD) vet
+GOPATH:=$(shell $(GOCMD) env GOPATH)
u := $(if $(update),-u)
BINARY_NAME:=swag
@@ -53,16 +54,20 @@ clean:
.PHONY: deps
deps:
- $(GOGET) ${u} -d
+ $(GOGET) github.com/swaggo/cli
+ $(GOGET) github.com/ghodss/yaml
+ $(GOGET) github.com/gin-gonic/gin
+ $(GOGET) github.com/KyleBanks/depth
+ $(GOGET) github.com/go-openapi/jsonreference
+ $(GOGET) github.com/go-openapi/spec
$(GOGET) github.com/stretchr/testify/assert
$(GOGET) github.com/alecthomas/template
+ $(GOGET) golang.org/x/tools/go/loader
.PHONY: devel-deps
-devel-deps:
+devel-deps:
GO111MODULE=off $(GOGET) -v -u \
- golang.org/x/lint/golint \
- github.com/swaggo/swag/cmd/swag \
- github.com/swaggo/swag/gen
+ golang.org/x/lint/golint
.PHONY: lint
lint: devel-deps
diff --git a/vendor/github.com/swaggo/swag/README.md b/vendor/github.com/swaggo/swag/README.md
index 4d24e6c8c7..5edbd5d5aa 100644
--- a/vendor/github.com/swaggo/swag/README.md
+++ b/vendor/github.com/swaggo/swag/README.md
@@ -1,5 +1,7 @@
# swag
+đ *[English](README.md) â [įŽäŊä¸æ](README_zh-CN.md)*
+
[![Travis Status](https://img.shields.io/travis/swaggo/swag/master.svg)](https://travis-ci.org/swaggo/swag)
@@ -26,12 +28,15 @@ Swag converts Go annotations to Swagger Documentation 2.0. We've created a varie
- [Examples](#examples)
- [Descriptions over multiple lines](#descriptions-over-multiple-lines)
- [User defined structure with an array type](#user-defined-structure-with-an-array-type)
+ - [Model composition in response](#model-composition-in-response)
- [Add a headers in response](#add-a-headers-in-response)
- [Use multiple path params](#use-multiple-path-params)
- [Example value of struct](#example-value-of-struct)
- [Description of struct](#description-of-struct)
- [Use swaggertype tag to supported custom type](#use-swaggertype-tag-to-supported-custom-type)
+ - [Use swaggerignore tag to exclude a field](#use-swaggerignore-tag-to-exclude-a-field)
- [Add extension info to struct field](#add-extension-info-to-struct-field)
+ - [Rename model to display](#rename-model-to-display)
- [How to using security annotations](#how-to-using-security-annotations)
- [About the Project](#about-the-project)
@@ -45,7 +50,7 @@ $ go get -u github.com/swaggo/swag/cmd/swag
```
To build from source you need [Go](https://golang.org/dl/) (1.9 or newer).
-Or download the pre-compiled binaries binray form [release page](https://github.com/swaggo/swag/releases).
+Or download a pre-compiled binary from the [release page](https://github.com/swaggo/swag/releases).
3. Run `swag init` in the project's root folder which contains the `main.go` file. This will parse your comments and generate the required files (`docs` folder and `docs/docs.go`).
```sh
@@ -70,10 +75,12 @@ USAGE:
OPTIONS:
--generalInfo value, -g value Go file path in which 'swagger general API Info' is written (default: "main.go")
--dir value, -d value Directory you want to parse (default: "./")
+ --exclude value Exclude directoies and files, comma separated
--propertyStrategy value, -p value Property Naming Strategy like snakecase,camelcase,pascalcase (default: "camelcase")
- --output value, -o value Output directory for al the generated files(swagger.json, swagger.yaml and doc.go) (default: "./docs")
+ --output value, -o value Output directory for all the generated files(swagger.json, swagger.yaml and doc.go) (default: "./docs")
--parseVendor Parse go files in 'vendor' folder, disabled by default
--parseDependency Parse go files in outside dependency folder, disabled by default
+ --parseInternal Parse go files in internal packages, disabled by default
```
## Supported Web Frameworks
@@ -82,6 +89,8 @@ OPTIONS:
- [echo](http://github.com/swaggo/echo-swagger)
- [buffalo](https://github.com/swaggo/buffalo-swagger)
- [net/http](https://github.com/swaggo/http-swagger)
+- [flamingo](https://github.com/i-love-flamingo/swagger)
+- [fiber](https://github.com/arsmn/fiber-swagger)
## How to use it with Gin
@@ -110,6 +119,7 @@ import "github.com/swaggo/files" // swagger embed files
// @host localhost:8080
// @BasePath /api/v1
+// @query.collection.format multi
// @securityDefinitions.basic BasicAuth
@@ -277,7 +287,7 @@ func (c *Controller) ListAccounts(ctx *gin.Context) {
$ swag init
```
-4.Run your app, and browse to http://localhost:8080/swagger/index.html. You will see Swagger 2.0 Api documents as shown below:
+4. Run your app, and browse to http://localhost:8080/swagger/index.html. You will see Swagger 2.0 Api documents as shown below:
![swagger_index.html](https://raw.githubusercontent.com/swaggo/swag/master/assets/swagger-image.png)
@@ -325,6 +335,7 @@ $ swag init
| license.url | A URL to the license used for the API. MUST be in the format of a URL. | // @license.url http://www.apache.org/licenses/LICENSE-2.0.html |
| host | The host (name or ip) serving the API. | // @host localhost:8080 |
| BasePath | The base path on which the API is served. | // @BasePath /api/v1 |
+| query.collection.format | The default collection(array) param format in query,enums:csv,multi,pipes,tsv,ssv. If not set, csv is the default.| // @query.collection.format multi
| schemes | The transfer protocol for the operation that separated by spaces. | // @schemes http https |
| x-name | The extension key, must be start by x- and take only json value | // @x-example-key {"key": "value"} |
@@ -341,7 +352,6 @@ When a short string in your documentation is insufficient, or you need images, c
| tag.description.markdown | Description of the tag this is an alternative to tag.description. The description will be read from a file named like tagname.md | // @tag.description.markdown |
-
## API Operation
**Example**
@@ -351,6 +361,7 @@ When a short string in your documentation is insufficient, or you need images, c
| annotation | description |
|-------------|----------------------------------------------------------------------------------------------------------------------------|
| description | A verbose explanation of the operation behavior. |
+| description.markdown | A short description of the application. The description will be read from a file named like endpointname.md| // @description.file endpoint.description.markdown |
| id | A unique string used to identify the operation. Must be unique among all API operations. |
| tags | A list of tags to each API operation that separated by commas. |
| summary | A short summary of what the operation does. |
@@ -364,6 +375,8 @@ When a short string in your documentation is insufficient, or you need images, c
| router | Path definition that separated by spaces. `path`,`[httpMethod]` |
| x-name | The extension key, must be start by x- and take only json value. |
+
+
## Mime Types
`swag` accepts all MIME Types which are in the correct format, that is, match `*/*`.
@@ -431,6 +444,7 @@ Besides that, `swag` also accepts aliases for some MIME Types as follows:
// @Param string query string false "string valid" minlength(5) maxlength(10)
// @Param int query int false "int valid" mininum(1) maxinum(10)
// @Param default query string false "string default" default(A)
+// @Param collection query []string false "string collection" collectionFormat(multi)
```
It also works for the struct fields:
@@ -447,13 +461,15 @@ type Foo struct {
Field Name | Type | Description
---|:---:|---
+validate | `string` | Determines the validation for the parameter. Possible values are: `required`.
default | * | Declares the value of the parameter that the server will use if none is provided, for example a "count" to control the number of results per page might default to 100 if not supplied by the client in the request. (Note: "default" has no meaning for required parameters.) See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2. Unlike JSON Schema this value MUST conform to the defined [`type`](#parameterType) for this parameter.
maximum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2.
minimum | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.3.
maxLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.1.
minLength | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.2.
enums | [\*] | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1.
-format | `string` | The extending format for the previously mentioned [`type`](#parameterType). See [Data Type Formats](#dataTypeFormat) for further details.
+format | `string` | The extending format for the previously mentioned [`type`](#parameterType). See [Data Type Formats](https://swagger.io/specification/v2/#dataTypeFormat) for further details.
+collectionFormat | `string` |Determines the format of the array if type array is used. Possible values are:
- `csv` - comma separated values `foo,bar`.
- `ssv` - space separated values `foo bar`.
- `tsv` - tab separated values `foo\tbar`.
- `pipes` - pipe separated values
foo|bar
. - `multi` - corresponds to multiple parameter instances instead of multiple values for a single instance `foo=bar&foo=baz`. This is valid only for parameters [`in`](#parameterIn) "query" or "formData".
Default value is `csv`.
### Future
@@ -464,7 +480,6 @@ Field Name | Type | Description
maxItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.2.
minItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.3.
uniqueItems | `boolean` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4.
-collectionFormat | `string` | Determines the format of the array if type array is used. Possible values are: - `csv` - comma separated values `foo,bar`.
- `ssv` - space separated values `foo bar`.
- `tsv` - tab separated values `foo\tbar`.
- `pipes` - pipe separated values
foo|bar
. - `multi` - corresponds to multiple parameter instances instead of multiple values for a single instance `foo=bar&foo=baz`. This is valid only for parameters [`in`](#parameterIn) "query" or "formData".
Default value is `csv`.
## Examples
@@ -492,6 +507,44 @@ type Account struct {
Name string `json:"name" example:"account name"`
}
```
+
+### Model composition in response
+```go
+// JSONResult's data field will be overridden by the specific type proto.Order
+@success 200 {object} jsonresult.JSONResult{data=proto.Order} "desc"
+```
+
+```go
+type JSONResult struct {
+ Code int `json:"code" `
+ Message string `json:"message"`
+ Data interface{} `json:"data"`
+}
+
+type Order struct { //in `proto` package
+ Id uint `json:"id"`
+ Data interface{} `json:"data"`
+}
+```
+
+- also support array of objects and primitive types as nested response
+```go
+@success 200 {object} jsonresult.JSONResult{data=[]proto.Order} "desc"
+@success 200 {object} jsonresult.JSONResult{data=string} "desc"
+@success 200 {object} jsonresult.JSONResult{data=[]string} "desc"
+```
+
+- overriding multiple fields. field will be added if not exists
+```go
+@success 200 {object} jsonresult.JSONResult{data1=string,data2=[]string,data3=proto.Order,data4=[]proto.Order} "desc"
+```
+- overriding deep-level fields
+```go
+type DeepObject struct { //in `proto` package
+ ...
+}
+@success 200 {object} jsonresult.JSONResult{data1=proto.Order{data=proto.DeepObject},data2=[]proto.Order{data=[]proto.DeepObject}} "desc"
+```
### Add a headers in response
```go
@@ -594,11 +647,22 @@ generated swagger doc as follows:
```
+
+### Use swaggerignore tag to exclude a field
+
+```go
+type Account struct {
+ ID string `json:"id"`
+ Name string `json:"name"`
+ Ignored int `swaggerignore:"true"`
+}
+```
+
### Add extension info to struct field
```go
type Account struct {
- ID int `json:"id" extensions:"x-nullable,x-abc=def"` // extensions fields must start with "x-"
+ ID string `json:"id" extensions:"x-nullable,x-abc=def"` // extensions fields must start with "x-"
}
```
@@ -616,6 +680,13 @@ generate swagger doc as follows:
}
}
```
+### Rename model to display
+
+```golang
+type Resp struct {
+ Code int
+}//@name Response
+```
### How to using security annotations
diff --git a/vendor/github.com/swaggo/swag/README_zh-CN.md b/vendor/github.com/swaggo/swag/README_zh-CN.md
new file mode 100644
index 0000000000..d14f49851a
--- /dev/null
+++ b/vendor/github.com/swaggo/swag/README_zh-CN.md
@@ -0,0 +1,740 @@
+# swag
+
+đ *[English](README.md) â [įŽäŊä¸æ](README_zh-CN.md)*
+
+
+
+[![Travis Status](https://img.shields.io/travis/swaggo/swag/master.svg)](https://travis-ci.org/swaggo/swag)
+[![Coverage Status](https://img.shields.io/codecov/c/github/swaggo/swag/master.svg)](https://codecov.io/gh/swaggo/swag)
+[![Go Report Card](https://goreportcard.com/badge/github.com/swaggo/swag)](https://goreportcard.com/report/github.com/swaggo/swag)
+[![codebeat badge](https://codebeat.co/badges/71e2f5e5-9e6b-405d-baf9-7cc8b5037330)](https://codebeat.co/projects/github-com-swaggo-swag-master)
+[![Go Doc](https://godoc.org/github.com/swaggo/swagg?status.svg)](https://godoc.org/github.com/swaggo/swag)
+[![Backers on Open Collective](https://opencollective.com/swag/backers/badge.svg)](#backers)
+[![Sponsors on Open Collective](https://opencollective.com/swag/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fswaggo%2Fswag.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fswaggo%2Fswag?ref=badge_shield)
+[![Release](https://img.shields.io/github/release/swaggo/swag.svg?style=flat-square)](https://github.com/swaggo/swag/releases)
+
+Swagå°Goįæŗ¨éčŊŦæĸä¸ēSwagger2.0ææĄŖãæäģŦä¸ēæĩčĄį [Go Web Framework](#æ¯æįWebæĄæļ) ååģēäēåį§æäģļīŧčŋæ ˇå¯äģĨä¸į°æGo饚įŽåŋĢééæīŧäŊŋį¨Swagger UIīŧã
+
+## įŽåŊ
+
+- [åŋĢéåŧå§](#åŋĢéåŧå§)
+- [æ¯æįWebæĄæļ](#æ¯æįwebæĄæļ)
+- [åĻäŊä¸Ginéæ](#åĻäŊä¸ginéæ)
+- [åŧåį°įļ](#åŧåį°įļ)
+- [åŖ°æåŧæŗ¨éæ ŧåŧ](#åŖ°æåŧæŗ¨éæ ŧåŧ)
+ - [éį¨APIäŋĄæ¯](#éį¨apiäŋĄæ¯)
+ - [APIæäŊ](#apiæäŊ)
+ - [åŽå
¨æ§](#åŽå
¨æ§)
+- [æ ˇäž](#æ ˇäž)
+ - [å¤čĄįæčŋ°](#å¤čĄįæčŋ°)
+ - [į¨æˇčĒåŽäšįå
ˇææ°įģįąģåįįģæ](#į¨æˇčĒåŽäšįå
ˇææ°įģįąģåįįģæ)
+ - [ååēå¯ščąĄä¸įæ¨Ąåįģå](#ååēå¯ščąĄä¸įæ¨Ąåįģå)
+ - [å¨ååēä¸åĸå 头åæŽĩ](#å¨ååēä¸åĸå 头åæŽĩ)
+ - [äŊŋį¨å¤čˇ¯åžåæ°](#äŊŋį¨å¤čˇ¯åžåæ°)
+ - [įģæäŊįį¤ēäžåŧ](#įģæäŊįį¤ēäžåŧ)
+ - [įģæäŊæčŋ°](#įģæäŊæčŋ°)
+ - [äŊŋį¨`swaggertype`æ įžæ´æšåæŽĩįąģå](#äŊŋį¨`swaggertype`æ įžæ´æšåæŽĩįąģå)
+ - [äŊŋį¨`swaggerignore`æ įžæé¤åæŽĩ](#äŊŋį¨swaggerignoreæ įžæé¤åæŽĩ)
+ - [å°æŠåąäŋĄæ¯æˇģå å°įģæåæŽĩ](#å°æŠåąäŋĄæ¯æˇģå å°įģæåæŽĩ)
+ - [寚åąį¤ēįæ¨ĄåéåŊå](#寚åąį¤ēįæ¨ĄåéåŊå)
+ - [åĻäŊäŊŋį¨åŽå
¨æ§æŗ¨é](#åĻäŊäŊŋį¨åŽå
¨æ§æŗ¨é)
+- [饚įŽį¸å
ŗ](#饚įŽį¸å
ŗ)
+
+## åŋĢéåŧå§
+
+1. å°æŗ¨éæˇģå å°APIæēäģŖį ä¸īŧč¯ˇåé
åŖ°ææ§æŗ¨éæ ŧåŧã
+2. äŊŋį¨åĻä¸åŊäģ¤ä¸čŊŊswagīŧ
+
+```bash
+go get -u github.com/swaggo/swag/cmd/swag
+```
+
+äģæēį åŧå§æåģēįč¯īŧéčĻæGoį¯åĸīŧ1.9åäģĨä¸įæŦīŧã
+
+æč
äģgithubįreleaseéĄĩéĸä¸čŊŊéĸįŧč¯åĨŊįäēčŋåļæäģļã
+
+3. å¨å
åĢ`main.go`æäģļį饚įŽæ šįŽåŊčŋčĄ`swag init`ãčŋå°äŧč§Ŗææŗ¨éåšļįæéčĻįæäģļīŧ`docs`æäģļ多å`docs/docs.go`īŧã
+
+```bash
+swag init
+```
+
+įĄŽäŋå¯ŧå
Ĩäēįæį`docs/docs.go`æäģļīŧčŋæ ˇįšåŽįé
įŊŽæäģļæäŧčĸĢåå§åãåĻæéį¨APIææ°æ˛Ąæåå¨`main.go`ä¸īŧå¯äģĨäŊŋį¨`-g`æ č¯įŦĻæĨåįĨswagã
+
+```bash
+swag init -g http/api.go
+```
+
+## swag cli
+
+```bash
+swag init -h
+NAME:
+ swag init - Create docs.go
+
+USAGE:
+ swag init [command options] [arguments...]
+
+OPTIONS:
+ --generalInfo value, -g value APIéį¨äŋĄæ¯æå¨įgoæēæäģļčˇ¯åžīŧåĻææ¯į¸å¯ščˇ¯åžååēäēAPIč§ŖæįŽåŊ (éģ莤: "main.go")
+ --dir value, -d value APIč§ŖæįŽåŊ (éģ莤: "./")
+ --propertyStrategy value, -p value įģæäŊåæŽĩåŊåč§åīŧä¸į§īŧsnakecase,camelcase,pascalcase (éģ莤: "camelcase")
+ --output value, -o value æäģļ(swagger.json, swagger.yaml and doc.go)čžåēįŽåŊ (éģ莤: "./docs")
+ --parseVendor æ¯åĻč§ŖævendorįŽåŊéįgoæēæäģļīŧéģ莤ä¸
+ --parseDependency æ¯åĻč§ŖæäžčĩįŽåŊä¸įgoæēæäģļīŧéģ莤ä¸
+ --markdownFiles value, --md value æåŽAPIįæčŋ°äŋĄæ¯æäŊŋį¨įmarkdownæäģļæå¨įįŽåŊ
+ --generatedTime æ¯åĻčžåēæļé´å°čžåēæäģļdocs.goįéĄļé¨īŧéģ莤æ¯
+```
+
+## æ¯æįWebæĄæļ
+
+- [gin](http://github.com/swaggo/gin-swagger)
+- [echo](http://github.com/swaggo/echo-swagger)
+- [buffalo](https://github.com/swaggo/buffalo-swagger)
+- [net/http](https://github.com/swaggo/http-swagger)
+
+## åĻäŊä¸Ginéæ
+
+[įšåģæ¤å¤](https://github.com/swaggo/swag/tree/master/example/celler)æĨįį¤ēäžæēäģŖį ã
+
+1. äŊŋį¨`swag init`įæSwagger2.0ææĄŖåīŧå¯ŧå
ĨåĻä¸äģŖį å
īŧ
+
+```go
+import "github.com/swaggo/gin-swagger" // gin-swagger middleware
+import "github.com/swaggo/files" // swagger embed files
+```
+
+2. å¨`main.go`æēäģŖį ä¸æˇģå éį¨įAPIæŗ¨éīŧ
+
+```bash
+// @title Swagger Example API
+// @version 1.0
+// @description This is a sample server celler server.
+// @termsOfService http://swagger.io/terms/
+
+// @contact.name API Support
+// @contact.url http://www.swagger.io/support
+// @contact.email support@swagger.io
+
+// @license.name Apache 2.0
+// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
+
+// @host localhost:8080
+// @BasePath /api/v1
+// @query.collection.format multi
+
+// @securityDefinitions.basic BasicAuth
+
+// @securityDefinitions.apikey ApiKeyAuth
+// @in header
+// @name Authorization
+
+// @securitydefinitions.oauth2.application OAuth2Application
+// @tokenUrl https://example.com/oauth/token
+// @scope.write Grants write access
+// @scope.admin Grants read and write access to administrative information
+
+// @securitydefinitions.oauth2.implicit OAuth2Implicit
+// @authorizationurl https://example.com/oauth/authorize
+// @scope.write Grants write access
+// @scope.admin Grants read and write access to administrative information
+
+// @securitydefinitions.oauth2.password OAuth2Password
+// @tokenUrl https://example.com/oauth/token
+// @scope.read Grants read access
+// @scope.write Grants write access
+// @scope.admin Grants read and write access to administrative information
+
+// @securitydefinitions.oauth2.accessCode OAuth2AccessCode
+// @tokenUrl https://example.com/oauth/token
+// @authorizationurl https://example.com/oauth/authorize
+// @scope.admin Grants read and write access to administrative information
+
+// @x-extension-openapi {"example": "value on a json format"}
+
+func main() {
+ r := gin.Default()
+
+ c := controller.NewController()
+
+ v1 := r.Group("/api/v1")
+ {
+ accounts := v1.Group("/accounts")
+ {
+ accounts.GET(":id", c.ShowAccount)
+ accounts.GET("", c.ListAccounts)
+ accounts.POST("", c.AddAccount)
+ accounts.DELETE(":id", c.DeleteAccount)
+ accounts.PATCH(":id", c.UpdateAccount)
+ accounts.POST(":id/images", c.UploadAccountImage)
+ }
+ //...
+ }
+ r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
+ r.Run(":8080")
+}
+//...
+```
+
+æ¤å¤īŧå¯äģĨå¨æ莞įŊŽä¸äēéį¨įAPIäŋĄæ¯ãįæįäģŖį å
`docs`å¯ŧåē`SwaggerInfo`åéīŧäŊŋį¨č¯Ĩåéå¯äģĨéčŋįŧį įæšåŧ莞įŊŽæ éĸãæčŋ°ãįæŦãä¸ģæēååēįĄčˇ¯åžãäŊŋį¨Ginįį¤ēäžīŧ
+
+```go
+package main
+
+import (
+ "github.com/gin-gonic/gin"
+ "github.com/swaggo/files"
+ "github.com/swaggo/gin-swagger"
+
+ "./docs" // docs is generated by Swag CLI, you have to import it.
+)
+
+// @contact.name API Support
+// @contact.url http://www.swagger.io/support
+// @contact.email support@swagger.io
+
+// @license.name Apache 2.0
+// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
+
+// @termsOfService http://swagger.io/terms/
+
+func main() {
+
+ // programatically set swagger info
+ docs.SwaggerInfo.Title = "Swagger Example API"
+ docs.SwaggerInfo.Description = "This is a sample server Petstore server."
+ docs.SwaggerInfo.Version = "1.0"
+ docs.SwaggerInfo.Host = "petstore.swagger.io"
+ docs.SwaggerInfo.BasePath = "/v2"
+ docs.SwaggerInfo.Schemes = []string{"http", "https"}
+
+ r := gin.New()
+
+ // use ginSwagger middleware to serve the API docs
+ r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
+
+ r.Run()
+}
+```
+
+3. å¨`controller`äģŖį ä¸æˇģå APIæäŊæŗ¨éīŧ
+
+```go
+package controller
+
+import (
+ "fmt"
+ "net/http"
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+ "github.com/swaggo/swag/example/celler/httputil"
+ "github.com/swaggo/swag/example/celler/model"
+)
+
+// ShowAccount godoc
+// @Summary Show a account
+// @Description get string by ID
+// @ID get-string-by-int
+// @Accept json
+// @Produce json
+// @Param id path int true "Account ID"
+// @Success 200 {object} model.Account
+// @Header 200 {string} Token "qwerty"
+// @Failure 400 {object} httputil.HTTPError
+// @Failure 404 {object} httputil.HTTPError
+// @Failure 500 {object} httputil.HTTPError
+// @Router /accounts/{id} [get]
+func (c *Controller) ShowAccount(ctx *gin.Context) {
+ id := ctx.Param("id")
+ aid, err := strconv.Atoi(id)
+ if err != nil {
+ httputil.NewError(ctx, http.StatusBadRequest, err)
+ return
+ }
+ account, err := model.AccountOne(aid)
+ if err != nil {
+ httputil.NewError(ctx, http.StatusNotFound, err)
+ return
+ }
+ ctx.JSON(http.StatusOK, account)
+}
+
+// ListAccounts godoc
+// @Summary List accounts
+// @Description get accounts
+// @Accept json
+// @Produce json
+// @Param q query string false "name search by q"
+// @Success 200 {array} model.Account
+// @Header 200 {string} Token "qwerty"
+// @Failure 400 {object} httputil.HTTPError
+// @Failure 404 {object} httputil.HTTPError
+// @Failure 500 {object} httputil.HTTPError
+// @Router /accounts [get]
+func (c *Controller) ListAccounts(ctx *gin.Context) {
+ q := ctx.Request.URL.Query().Get("q")
+ accounts, err := model.AccountsAll(q)
+ if err != nil {
+ httputil.NewError(ctx, http.StatusNotFound, err)
+ return
+ }
+ ctx.JSON(http.StatusOK, accounts)
+}
+
+//...
+```
+
+```bash
+swag init
+```
+
+4. čŋčĄį¨åēīŧįļåå¨æĩč§å¨ä¸čŽŋéŽ http://localhost:8080/swagger/index.htmlãå°įå°Swagger 2.0 ApiææĄŖīŧåĻä¸æį¤ēīŧ
+
+![swagger_index.html](https://raw.githubusercontent.com/swaggo/swag/master/assets/swagger-image.png)
+
+## åŧåį°įļ
+
+[Swagger 2.0 ææĄŖ](https://swagger.io/docs/specification/2-0/basic-structure/)
+
+- [x] Basic Structure
+- [x] API Host and Base Path
+- [x] Paths and Operations
+- [x] Describing Parameters
+- [x] Describing Request Body
+- [x] Describing Responses
+- [x] MIME Types
+- [x] Authentication
+ - [x] Basic Authentication
+ - [x] API Keys
+- [x] Adding Examples
+- [x] File Upload
+- [x] Enums
+- [x] Grouping Operations With Tags
+- [ ] Swagger Extensions
+
+## åŖ°æåŧæŗ¨éæ ŧåŧ
+
+## éį¨APIäŋĄæ¯
+
+**į¤ēäž** [`celler/main.go`](https://github.com/swaggo/swag/blob/master/example/celler/main.go)
+
+| æŗ¨é | č¯´æ | į¤ēäž |
+| ----------------------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
+| title | **åŋ
åĄĢ** åēį¨į¨åēįåį§°ã | // @title Swagger Example API |
+| version | **åŋ
åĄĢ** æäžåēį¨į¨åēAPIįįæŦã | // @version 1.0 |
+| description | åēį¨į¨åēįįŽįæčŋ°ã | // @description This is a sample server celler server. |
+| tag.name | æ įžįåį§°ã | // @tag.name This is the name of the tag |
+| tag.description | æ įžįæčŋ°ã | // @tag.description Cool Description |
+| tag.docs.url | æ įžįå¤é¨ææĄŖįURLã | // @tag.docs.url https://example.com |
+| tag.docs.description | æ įžįå¤é¨ææĄŖč¯´æã | // @tag.docs.description Best example documentation |
+| termsOfService | APIįæåĄæĄæŦžã | // @termsOfService http://swagger.io/terms/ |
+| contact.name | å
ŦåŧįAPIįčįŗģäŋĄæ¯ã | // @contact.name API Support |
+| contact.url | čįŗģäŋĄæ¯įURLã åŋ
éĄģéį¨įŊåæ ŧåŧã | // @contact.url http://www.swagger.io/support |
+| contact.email | čįŗģäēē/įģįģįįĩåéŽäģļå°åã åŋ
éĄģéį¨įĩåéŽäģļå°åįæ ŧåŧã | // @contact.email support@swagger.io |
+| license.name | **åŋ
åĄĢ** į¨äēAPIį莸å¯č¯åį§°ã | // @license.name Apache 2.0 |
+| license.url | į¨äēAPIį莸å¯č¯įURLã åŋ
éĄģéį¨įŊåæ ŧåŧã | // @license.url http://www.apache.org/licenses/LICENSE-2.0.html |
+| host | čŋčĄAPIįä¸ģæēīŧä¸ģæēåæIPå°åīŧã | // @host localhost:8080 |
+| BasePath | čŋčĄAPIįåēæŦčˇ¯åžã | // @BasePath /api/v1 |
+| query.collection.format | č¯ˇæąURI queryéæ°įģåæ°įéģ莤æ ŧåŧīŧcsvīŧmultiīŧpipesīŧtsvīŧssvã åĻææĒ莞įŊŽīŧåéģ莤ä¸ēcsvã | // @query.collection.format multi |
+| schemes | į¨įŠēæ ŧåéįč¯ˇæąįäŧ čžå莎ã | // @schemes http https |
+| x-name | æŠåąįéŽåŋ
éĄģäģĨx-åŧ头īŧåšļä¸åĒčŊäŊŋį¨jsonåŧ | // @x-example-key {"key": "value"} |
+
+### äŊŋį¨Markdownæčŋ°
+
+åĻæææĄŖä¸įįåįŦĻ串ä¸čļŗäģĨåŽæ´čĄ¨čžžīŧæč
éčĻåąį¤ēåžįīŧäģŖį į¤ēäžįįąģäŧŧįå
厚īŧåå¯čŊéčĻäŊŋį¨Markdownæčŋ°ãčĻäŊŋį¨Markdownæčŋ°īŧč¯ˇäŊŋį¨ä¸ä¸æŗ¨éã
+
+| æŗ¨é | č¯´æ | į¤ēäž |
+| ------------------------ | ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- |
+| title | **åŋ
åĄĢ** åēį¨į¨åēįåį§°ã | // @title Swagger Example API |
+| version | **åŋ
åĄĢ** æäžåēį¨į¨åēAPIįįæŦã | // @version 1.0 |
+| description.markdown | åēį¨į¨åēįįŽįæčŋ°ã äģ`api.md`æäģļä¸č§Ŗæã čŋæ¯`@description`įæŋäģŖį¨æŗã | // @description.markdown No value needed, this parses the description from api.md |
+| tag.name | æ įžįåį§°ã | // @tag.name This is the name of the tag |
+| tag.description.markdown | æ įžč¯´æīŧčŋæ¯`tag.description`įæŋäģŖį¨æŗã č¯Ĩæčŋ°å°äģåä¸ē`tagname.mdį`æäģļä¸č¯ģåã | // @tag.description.markdown |
+
+## APIæäŊ
+
+Example [celler/controller](https://github.com/swaggo/swag/tree/master/example/celler/controller)
+
+| æŗ¨é | æčŋ° | |
+| -------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
+| description | æäŊčĄä¸ēįč¯Ļįģč¯´æã |
+| description.markdown | åēį¨į¨åēįįŽįæčŋ°ãč¯Ĩæčŋ°å°äģåä¸ē`endpointname.md`įæäģļä¸č¯ģåã | // @description.file endpoint.description.markdown |
+| id | į¨äēæ č¯æäŊįå¯ä¸åįŦĻ串ãå¨ææAPIæäŊä¸åŋ
éĄģå¯ä¸ã |
+| tags | æ¯ä¸ĒAPIæäŊįæ įžå襨īŧäģĨéåˇåéã |
+| summary | č¯ĨæäŊįįŽįæčĻã |
+| accept | APIå¯äģĨäŊŋį¨įMIMEįąģåįå襨ãåŧåŋ
éĄģåĻâ[Mimeįąģå](#mime-types)âä¸æčŋ°ã |
+| produce | APIå¯äģĨįæįMIMEįąģåįå襨ãåŧåŋ
éĄģåĻâ[Mimeįąģå](#mime-types)âä¸æčŋ°ã |
+| param | į¨įŠēæ ŧåéįåæ°ã`param name`,`param type`,`data type`,`is mandatory?`,`comment` `attribute(optional)` |
+| security | æ¯ä¸ĒAPIæäŊį[åŽå
¨æ§](#security)ã |
+| success | äģĨįŠēæ ŧåéįæåååēã`return code`,`{param type}`,`data type`,`comment` |
+| failure | äģĨįŠēæ ŧåéįæ
éååēã`return code`,`{param type}`,`data type`,`comment` |
+| header | äģĨįŠēæ ŧåéį头åæŽĩã `return code`,`{param type}`,`data type`,`comment` |
+| router | äģĨįŠēæ ŧåéįčˇ¯åžåŽäšã `path`,`[httpMethod]` |
+| x-name | æŠåąåæŽĩåŋ
éĄģäģĨ`x-`åŧ头īŧåšļä¸åĒčŊäŊŋį¨jsonåŧã |
+
+## Mimeįąģå
+
+`swag` gæĨåæææ ŧåŧæŖįĄŽįMIMEįąģå, åŗäŊŋåšé
`*/*`ãé¤æ¤äšå¤īŧ`swag`čŋæĨåæäēMIMEįąģåįåĢåīŧåĻä¸æį¤ēīŧ
+
+| Alias | MIME Type |
+| --------------------- | --------------------------------- |
+| json | application/json |
+| xml | text/xml |
+| plain | text/plain |
+| html | text/html |
+| mpfd | multipart/form-data |
+| x-www-form-urlencoded | application/x-www-form-urlencoded |
+| json-api | application/vnd.api+json |
+| json-stream | application/x-json-stream |
+| octet-stream | application/octet-stream |
+| png | image/png |
+| jpeg | image/jpeg |
+| gif | image/gif |
+
+## åæ°įąģå
+
+- query
+- path
+- header
+- body
+- formData
+
+## æ°æŽįąģå
+
+- string (string)
+- integer (int, uint, uint32, uint64)
+- number (float32)
+- boolean (bool)
+- user defined struct
+
+## åŽå
¨æ§
+
+| æŗ¨é | æčŋ° | åæ° | į¤ēäž |
+| -------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------------------------------ |
+| securitydefinitions.basic | [Basic](https://swagger.io/docs/specification/2-0/authentication/basic-authentication/) auth. | | // @securityDefinitions.basic BasicAuth |
+| securitydefinitions.apikey | [API key](https://swagger.io/docs/specification/2-0/authentication/api-keys/) auth. | in, name | // @securityDefinitions.apikey ApiKeyAuth |
+| securitydefinitions.oauth2.application | [OAuth2 application](https://swagger.io/docs/specification/authentication/oauth2/) auth. | tokenUrl, scope | // @securitydefinitions.oauth2.application OAuth2Application |
+| securitydefinitions.oauth2.implicit | [OAuth2 implicit](https://swagger.io/docs/specification/authentication/oauth2/) auth. | authorizationUrl, scope | // @securitydefinitions.oauth2.implicit OAuth2Implicit |
+| securitydefinitions.oauth2.password | [OAuth2 password](https://swagger.io/docs/specification/authentication/oauth2/) auth. | tokenUrl, scope | // @securitydefinitions.oauth2.password OAuth2Password |
+| securitydefinitions.oauth2.accessCode | [OAuth2 access code](https://swagger.io/docs/specification/authentication/oauth2/) auth. | tokenUrl, authorizationUrl, scope | // @securitydefinitions.oauth2.accessCode OAuth2AccessCode |
+
+| åæ°æŗ¨é | į¤ēäž |
+| ---------------- | -------------------------------------------------------- |
+| in | // @in header |
+| name | // @name Authorization |
+| tokenUrl | // @tokenUrl https://example.com/oauth/token |
+| authorizationurl | // @authorizationurl https://example.com/oauth/authorize |
+| scope.hoge | // @scope.write Grants write access |
+
+## åąæ§
+
+```go
+// @Param enumstring query string false "string enums" Enums(A, B, C)
+// @Param enumint query int false "int enums" Enums(1, 2, 3)
+// @Param enumnumber query number false "int enums" Enums(1.1, 1.2, 1.3)
+// @Param string query string false "string valid" minlength(5) maxlength(10)
+// @Param int query int false "int valid" mininum(1) maxinum(10)
+// @Param default query string false "string default" default(A)
+// @Param collection query []string false "string collection" collectionFormat(multi)
+```
+
+äšéį¨äēįģæäŊåæŽĩīŧ
+
+```go
+type Foo struct {
+ Bar string `minLength:"4" maxLength:"16"`
+ Baz int `minimum:"10" maximum:"20" default:"15"`
+ Qux []string `enums:"foo,bar,baz"`
+}
+```
+
+### åŊåå¯į¨į
+
+| åæŽĩå | įąģå | æčŋ° |
+| ---------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| default | * | åŖ°æåĻææĒæäžäģģäŊåæ°īŧåæåĄå¨å°äŊŋį¨įéģ莤åæ°åŧīŧäžåĻīŧåĻæč¯ˇæąä¸įåŽĸæˇįĢ¯æĒæäžč¯Ĩåæ°īŧåį¨äēæ§åļæ¯éĄĩįģææ°įâ莥æ°âå¯čŊéģ莤ä¸ē100ã īŧæŗ¨æīŧâdefaultâ寚äēåŋ
éįåæ°æ˛Ąææäšīŧãåį https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-6.2ã ä¸JSONæ¨Ąåŧä¸åīŧæ¤åŧåĄåŋ
įŦĻåæ¤åæ°įåŽäš[įąģå](#parameterType)ã |
+| maximum | `number` | åį https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.2. |
+| minimum | `number` | åį https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.3. |
+| maxLength | `integer` | åį https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.1. |
+| minLength | `integer` | åį https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.2. |
+| enums | [\*] | åį https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.5.1. |
+| format | `string` | ä¸éĸæå°į[įąģå](#parameterType)įæŠåąæ ŧåŧãæå
ŗæ´å¤č¯ĻįģäŋĄæ¯īŧč¯ˇåč§[æ°æŽįąģåæ ŧåŧ](https://swagger.io/specification/v2/#dataTypeFormat)ã |
+| collectionFormat | `string` | æåŽqueryæ°įģåæ°įæ ŧåŧã å¯čŊįåŧä¸ēīŧ - `csv` - éåˇåéåŧ `foo,bar`.
- `ssv` - įŠēæ ŧåéåŧ `foo bar`.
- `tsv` - åļ襨įŦĻåéåŧ `foo\tbar`.
- `pipes` - įŽĄéįŦĻåéåŧ
foo|bar
. - `multi` - 寚åēäēå¤ä¸Ēåæ°åŽäžīŧčä¸æ¯åä¸ĒåŽäž `foo=barīŧfoo=baz` įå¤ä¸Ēåŧãčŋäģ
寚â`query`âæâ`formData`âä¸įåæ°ææã
éģ莤åŧæ¯ `csv`ã |
+
+### čŋä¸æĨį
+
+| åæŽĩå | įąģå | æčŋ° |
+| ----------- | :-------: | ---------------------------------------------------------------------------------- |
+| multipleOf | `number` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.1.1. |
+| pattern | `string` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.2.3. |
+| maxItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.2. |
+| minItems | `integer` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.3. |
+| uniqueItems | `boolean` | See https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4. |
+
+## æ ˇäž
+
+### å¤čĄįæčŋ°
+
+å¯äģĨå¨å¸¸č§apiæčŋ°æčˇ¯įąåŽäšä¸æˇģå 表čļå¤čĄįæčŋ°īŧåĻä¸æį¤ēīŧ
+
+```go
+// @description This is the first line
+// @description This is the second line
+// @description And so forth.
+```
+
+### į¨æˇčĒåŽäšįå
ˇææ°įģįąģåįįģæ
+
+```go
+// @Success 200 {array} model.Account <-- This is a user defined struct.
+```
+
+```go
+package model
+
+type Account struct {
+ ID int `json:"id" example:"1"`
+ Name string `json:"name" example:"account name"`
+}
+```
+
+### ååēå¯ščąĄä¸įæ¨Ąåįģå
+
+```go
+// JSONResultįdataåæŽĩįąģåå°čĸĢproto.Orderįąģåæŋæĸ
+@success 200 {object} jsonresult.JSONResult{data=proto.Order} "desc"
+```
+
+```go
+type JSONResult struct {
+ Code int `json:"code" `
+ Message string `json:"message"`
+ Data interface{} `json:"data"`
+}
+
+type Order struct { //in `proto` package
+ ...
+}
+```
+
+- čŋæ¯æå¯ščąĄæ°įģååå§įąģåäŊä¸ēåĩåĨååē
+
+```go
+@success 200 {object} jsonresult.JSONResult{data=[]proto.Order} "desc"
+@success 200 {object} jsonresult.JSONResult{data=string} "desc"
+@success 200 {object} jsonresult.JSONResult{data=[]string} "desc"
+```
+
+- æŋæĸå¤ä¸ĒåæŽĩįįąģåãåĻææåæŽĩä¸åå¨īŧå°æˇģå č¯ĨåæŽĩã
+
+```go
+@success 200 {object} jsonresult.JSONResult{data1=string,data2=[]string,data3=proto.Order,data4=[]proto.Order} "desc"
+```
+
+### å¨ååēä¸åĸå 头åæŽĩ
+
+```go
+// @Success 200 {string} string "ok"
+// @Header 200 {string} Location "/entity/1"
+// @Header 200 {string} Token "qwerty"
+```
+
+### äŊŋį¨å¤čˇ¯åžåæ°
+
+```go
+/// ...
+// @Param group_id path int true "Group ID"
+// @Param account_id path int true "Account ID"
+// ...
+// @Router /examples/groups/{group_id}/accounts/{account_id} [get]
+```
+
+### įģæäŊįį¤ēäžåŧ
+
+```go
+type Account struct {
+ ID int `json:"id" example:"1"`
+ Name string `json:"name" example:"account name"`
+ PhotoUrls []string `json:"photo_urls" example:"http://test/image/1.jpg,http://test/image/2.jpg"`
+}
+```
+
+### įģæäŊæčŋ°
+
+```go
+type Account struct {
+ // ID this is userid
+ ID int `json:"id"`
+ Name string `json:"name"` // This is Name
+}
+```
+
+### äŊŋį¨`swaggertype`æ įžæ´æšåæŽĩįąģå
+
+[#201](https://github.com/swaggo/swag/issues/201#issuecomment-475479409)
+
+```go
+type TimestampTime struct {
+ time.Time
+}
+
+///åŽį°encoding.JSON.MarshaleræĨåŖ
+func (t *TimestampTime) MarshalJSON() ([]byte, error) {
+ bin := make([]byte, 16)
+ bin = strconv.AppendInt(bin[:0], t.Time.Unix(), 10)
+ return bin, nil
+}
+
+///åŽį°encoding.JSON.UnmarshaleræĨåŖ
+func (t *TimestampTime) UnmarshalJSON(bin []byte) error {
+ v, err := strconv.ParseInt(string(bin), 10, 64)
+ if err != nil {
+ return err
+ }
+ t.Time = time.Unix(v, 0)
+ return nil
+}
+///
+
+type Account struct {
+ // äŊŋį¨`swaggertype`æ įžå°åĢåįąģåæ´æšä¸ēå
įŊŽįąģåinteger
+ ID sql.NullInt64 `json:"id" swaggertype:"integer"`
+
+ // äŊŋį¨`swaggertype`æ įžæ´æšstructįąģåä¸ēå
įŊŽįąģåinteger
+ RegisterTime TimestampTime `json:"register_time" swaggertype:"primitive,integer"`
+
+ // Array types can be overridden using "array," format
+ Coeffs []big.Float `json:"coeffs" swaggertype:"array,number"`
+}
+```
+
+[#379](https://github.com/swaggo/swag/issues/379)
+
+```go
+type CerticateKeyPair struct {
+ Crt []byte `json:"crt" swaggertype:"string" format:"base64" example:"U3dhZ2dlciByb2Nrcw=="`
+ Key []byte `json:"key" swaggertype:"string" format:"base64" example:"U3dhZ2dlciByb2Nrcw=="`
+}
+```
+
+įæįswaggerææĄŖåĻä¸īŧ
+
+```go
+"api.MyBinding": {
+ "type":"object",
+ "properties":{
+ "crt":{
+ "type":"string",
+ "format":"base64",
+ "example":"U3dhZ2dlciByb2Nrcw=="
+ },
+ "key":{
+ "type":"string",
+ "format":"base64",
+ "example":"U3dhZ2dlciByb2Nrcw=="
+ }
+ }
+}
+```
+
+### äŊŋį¨`swaggerignore`æ įžæé¤åæŽĩ
+
+```go
+type Account struct {
+ ID string `json:"id"`
+ Name string `json:"name"`
+ Ignored int `swaggerignore:"true"`
+}
+```
+
+### å°æŠåąäŋĄæ¯æˇģå å°įģæåæŽĩ
+
+```go
+type Account struct {
+ ID string `json:"id" extensions:"x-nullable,x-abc=def"` // æŠåąåæŽĩåŋ
éĄģäģĨ"x-"åŧ头
+}
+```
+
+įæswaggerææĄŖīŧåĻä¸æį¤ēīŧ
+
+```go
+"Account": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "x-nullable": true,
+ "x-abc": "def"
+ }
+ }
+}
+```
+
+### 寚åąį¤ēįæ¨ĄåéåŊå
+
+```go
+type Resp struct {
+ Code int
+}//@name Response
+```
+
+### åĻäŊäŊŋį¨åŽå
¨æ§æŗ¨é
+
+éį¨APIäŋĄæ¯ã
+
+```go
+// @securityDefinitions.basic BasicAuth
+
+// @securitydefinitions.oauth2.application OAuth2Application
+// @tokenUrl https://example.com/oauth/token
+// @scope.write Grants write access
+// @scope.admin Grants read and write access to administrative information
+```
+
+æ¯ä¸ĒAPIæäŊã
+
+```go
+// @Security ApiKeyAuth
+```
+
+äŊŋį¨ANDæĄäģļã
+
+```go
+// @Security ApiKeyAuth
+// @Security OAuth2Application[write, admin]
+```
+
+## 饚įŽį¸å
ŗ
+
+This project was inspired by [yvasiyarov/swagger](https://github.com/yvasiyarov/swagger) but we simplified the usage and added support a variety of [web frameworks](#supported-web-frameworks). Gopher image source is [tenntenn/gopher-stickers](https://github.com/tenntenn/gopher-stickers). It has licenses [creative commons licensing](http://creativecommons.org/licenses/by/3.0/deed.en).
+
+## č´ĄįŽč
+
+This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
+
+
+## æ¯æč
+
+Thank you to all our backers! đ [[Become a backer](https://opencollective.com/swag#backer)]
+
+
+
+## čĩåŠå
+
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/swag#sponsor)]
+
+
+
+
+
+
+
+
+
+
+
+
+## License
+
+[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fswaggo%2Fswag.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fswaggo%2Fswag?ref=badge_large)
diff --git a/vendor/github.com/swaggo/swag/cmd/swag/main.go b/vendor/github.com/swaggo/swag/cmd/swag/main.go
index fd3a67c762..31403e0120 100644
--- a/vendor/github.com/swaggo/swag/cmd/swag/main.go
+++ b/vendor/github.com/swaggo/swag/cmd/swag/main.go
@@ -7,89 +7,111 @@ import (
"github.com/swaggo/swag"
"github.com/swaggo/swag/gen"
- "github.com/urfave/cli"
+ "github.com/urfave/cli/v2"
)
-const searchDirFlag = "dir"
-const generalInfoFlag = "generalInfo"
-const propertyStrategyFlag = "propertyStrategy"
-const outputFlag = "output"
-const parseVendorFlag = "parseVendor"
-const parseDependency = "parseDependency"
-const markdownFilesDirFlag = "markdownFiles"
+const (
+ searchDirFlag = "dir"
+ excludeFlag = "exclude"
+ generalInfoFlag = "generalInfo"
+ propertyStrategyFlag = "propertyStrategy"
+ outputFlag = "output"
+ parseVendorFlag = "parseVendor"
+ parseDependencyFlag = "parseDependency"
+ markdownFilesFlag = "markdownFiles"
+ parseInternal = "parseInternal"
+ generatedTimeFlag = "generatedTime"
+)
+
+var initFlags = []cli.Flag{
+ &cli.StringFlag{
+ Name: generalInfoFlag,
+ Aliases: []string{"g"},
+ Value: "main.go",
+ Usage: "Go file path in which 'swagger general API Info' is written",
+ },
+ &cli.StringFlag{
+ Name: searchDirFlag,
+ Aliases: []string{"d"},
+ Value: "./",
+ Usage: "Directory you want to parse",
+ },
+ &cli.StringFlag{
+ Name: excludeFlag,
+ Usage: "exclude directories and files when searching, comma separated",
+ },
+ &cli.StringFlag{
+ Name: propertyStrategyFlag,
+ Aliases: []string{"p"},
+ Value: "camelcase",
+ Usage: "Property Naming Strategy like snakecase,camelcase,pascalcase",
+ },
+ &cli.StringFlag{
+ Name: outputFlag,
+ Aliases: []string{"o"},
+ Value: "./docs",
+ Usage: "Output directory for all the generated files(swagger.json, swagger.yaml and doc.go)",
+ },
+ &cli.BoolFlag{
+ Name: parseVendorFlag,
+ Usage: "Parse go files in 'vendor' folder, disabled by default",
+ },
+ &cli.BoolFlag{
+ Name: parseDependencyFlag,
+ Usage: "Parse go files in outside dependency folder, disabled by default",
+ },
+ &cli.StringFlag{
+ Name: markdownFilesFlag,
+ Aliases: []string{"md"},
+ Value: "",
+ Usage: "Parse folder containing markdown files to use as description, disabled by default",
+ },
+ &cli.BoolFlag{
+ Name: "parseInternal",
+ Usage: "Parse go files in internal packages, disabled by default",
+ },
+ &cli.BoolFlag{
+ Name: "generatedTime",
+ Usage: "Generate timestamp at the top of docs.go, true by default",
+ },
+}
+
+func initAction(c *cli.Context) error {
+ strategy := c.String(propertyStrategyFlag)
+
+ switch strategy {
+ case swag.CamelCase, swag.SnakeCase, swag.PascalCase:
+ default:
+ return fmt.Errorf("not supported %s propertyStrategy", strategy)
+ }
+
+ return gen.New().Build(&gen.Config{
+ SearchDir: c.String(searchDirFlag),
+ Excludes: c.String(excludeFlag),
+ MainAPIFile: c.String(generalInfoFlag),
+ PropNamingStrategy: strategy,
+ OutputDir: c.String(outputFlag),
+ ParseVendor: c.Bool(parseVendorFlag),
+ ParseDependency: c.Bool(parseDependencyFlag),
+ MarkdownFilesDir: c.String(markdownFilesFlag),
+ ParseInternal: c.Bool(parseInternal),
+ GeneratedTime: c.Bool(generatedTimeFlag),
+ })
+}
func main() {
app := cli.NewApp()
app.Version = swag.Version
app.Usage = "Automatically generate RESTful API documentation with Swagger 2.0 for Go."
- app.Commands = []cli.Command{
+ app.Commands = []*cli.Command{
{
Name: "init",
Aliases: []string{"i"},
Usage: "Create docs.go",
- Action: func(c *cli.Context) error {
- searchDir := c.String(searchDirFlag)
- mainAPIFile := c.String(generalInfoFlag)
- strategy := c.String(propertyStrategyFlag)
- outputDir := c.String(outputFlag)
- parseVendor := c.Bool(parseVendorFlag)
- parseDependency := c.Bool(parseDependency)
- markdownFilesDir := c.String(markdownFilesDirFlag)
-
- switch strategy {
- case swag.CamelCase, swag.SnakeCase, swag.PascalCase:
- default:
- return fmt.Errorf("not supported %s propertyStrategy", strategy)
- }
-
- return gen.New().Build(&gen.Config{
- SearchDir: searchDir,
- MainAPIFile: mainAPIFile,
- PropNamingStrategy: strategy,
- OutputDir: outputDir,
- ParseVendor: parseVendor,
- ParseDependency: parseDependency,
- MarkdownFilesDir: markdownFilesDir,
- })
- },
- Flags: []cli.Flag{
- cli.StringFlag{
- Name: "generalInfo, g",
- Value: "main.go",
- Usage: "Go file path in which 'swagger general API Info' is written",
- },
- cli.StringFlag{
- Name: "dir, d",
- Value: "./",
- Usage: "Directory you want to parse",
- },
- cli.StringFlag{
- Name: "propertyStrategy, p",
- Value: "camelcase",
- Usage: "Property Naming Strategy like snakecase,camelcase,pascalcase",
- },
- cli.StringFlag{
- Name: "output, o",
- Value: "./docs",
- Usage: "Output directory for al the generated files(swagger.json, swagger.yaml and doc.go)",
- },
- cli.BoolFlag{
- Name: "parseVendor",
- Usage: "Parse go files in 'vendor' folder, disabled by default",
- },
- cli.BoolFlag{
- Name: "parseDependency",
- Usage: "Parse go files in outside dependency folder, disabled by default",
- },
- cli.StringFlag{
- Name: "markdownFiles, md",
- Value: "",
- Usage: "Parse folder containing markdown files to use as description, disabled by default",
- },
- },
+ Action: initAction,
+ Flags: initFlags,
},
}
-
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
diff --git a/vendor/github.com/swaggo/swag/gen/gen.go b/vendor/github.com/swaggo/swag/gen/gen.go
index 7fed9d0419..b80fd21f45 100644
--- a/vendor/github.com/swaggo/swag/gen/gen.go
+++ b/vendor/github.com/swaggo/swag/gen/gen.go
@@ -13,18 +13,25 @@ import (
"text/template"
"time"
- "github.com/go-openapi/spec"
-
"github.com/ghodss/yaml"
+ "github.com/go-openapi/spec"
"github.com/swaggo/swag"
)
// Gen presents a generate tool for swag.
-type Gen struct{}
+type Gen struct {
+ jsonIndent func(data interface{}) ([]byte, error)
+ jsonToYAML func(data []byte) ([]byte, error)
+}
// New creates a new Gen.
func New() *Gen {
- return &Gen{}
+ return &Gen{
+ jsonIndent: func(data interface{}) ([]byte, error) {
+ return json.MarshalIndent(data, "", " ")
+ },
+ jsonToYAML: yaml.JSONToYAML,
+ }
}
// Config presents Gen configurations.
@@ -32,7 +39,10 @@ type Config struct {
// SearchDir the swag would be parse
SearchDir string
- // OutputDir represents the output directory for al the generated files
+ // excludes dirs and files in SearchDir,comma separated
+ Excludes string
+
+ // OutputDir represents the output directory for all the generated files
OutputDir string
// MainAPIFile the Go file path in which 'swagger general API Info' is written
@@ -47,8 +57,14 @@ type Config struct {
// ParseDependencies whether swag should be parse outside dependency folder
ParseDependency bool
+ // ParseInternal whether swag should parse internal packages
+ ParseInternal bool
+
// MarkdownFilesDir used to find markdownfiles, which can be used for tag descriptions
MarkdownFilesDir string
+
+ // GeneratedTime whether swag should generate the timestamp at the top of docs.go
+ GeneratedTime bool
}
// Build builds swagger json file for given searchDir and mainAPIFile. Returns json
@@ -58,10 +74,12 @@ func (g *Gen) Build(config *Config) error {
}
log.Println("Generate swagger docs....")
- p := swag.New(swag.SetMarkdownFileDirectory(config.MarkdownFilesDir))
+ p := swag.New(swag.SetMarkdownFileDirectory(config.MarkdownFilesDir),
+ swag.SetExcludedDirsAndFiles(config.Excludes))
p.PropNamingStrategy = config.PropNamingStrategy
p.ParseVendor = config.ParseVendor
p.ParseDependency = config.ParseDependency
+ p.ParseInternal = config.ParseInternal
if err := p.ParseAPI(config.SearchDir, config.MainAPIFile); err != nil {
return err
@@ -77,64 +95,65 @@ func (g *Gen) Build(config *Config) error {
return err
}
- docs, err := os.Create(path.Join(config.OutputDir, "docs.go"))
+ packageName := path.Base(config.OutputDir)
+ docFileName := path.Join(config.OutputDir, "docs.go")
+ jsonFileName := path.Join(config.OutputDir, "swagger.json")
+ yamlFileName := path.Join(config.OutputDir, "swagger.yaml")
+
+ docs, err := os.Create(docFileName)
if err != nil {
return err
}
defer docs.Close()
- swaggerJSON, err := os.Create(path.Join(config.OutputDir, "swagger.json"))
- if err != nil {
- return err
- }
- defer swaggerJSON.Close()
-
- if _, err := swaggerJSON.Write(b); err != nil {
- return err
- }
-
- swaggerYAML, err := os.Create(path.Join(config.OutputDir, "swagger.yaml"))
+ err = g.writeFile(b, jsonFileName)
if err != nil {
return err
}
- defer swaggerYAML.Close()
- y, err := yaml.JSONToYAML(b)
+ y, err := g.jsonToYAML(b)
if err != nil {
- return fmt.Errorf("cannot covert json to yaml error: %s", err)
+ return fmt.Errorf("cannot convert json to yaml error: %s", err)
}
- if _, err := swaggerYAML.Write(y); err != nil {
+ err = g.writeFile(y, yamlFileName)
+ if err != nil {
return err
}
// Write doc
- err = g.writeGoDoc(docs, swagger)
+ err = g.writeGoDoc(packageName, docs, swagger, config)
if err != nil {
return err
}
- log.Printf("create docs.go at %+v", docs.Name())
- log.Printf("create swagger.json at %+v", swaggerJSON.Name())
- log.Printf("create swagger.yaml at %+v", swaggerYAML.Name())
+ log.Printf("create docs.go at %+v", docFileName)
+ log.Printf("create swagger.json at %+v", jsonFileName)
+ log.Printf("create swagger.yaml at %+v", yamlFileName)
return nil
}
-func (g *Gen) jsonIndent(data interface{}) ([]byte, error) {
- return json.MarshalIndent(data, "", " ")
+func (g *Gen) writeFile(b []byte, file string) error {
+ f, err := os.Create(file)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ _, err = f.Write(b)
+ return err
}
func (g *Gen) formatSource(src []byte) []byte {
code, err := format.Source(src)
if err != nil {
- code = src // Output the unformated code anyway
+ code = src // Output the unformatted code anyway
}
return code
}
-func (g *Gen) writeGoDoc(output io.Writer, swagger *spec.Swagger) error {
-
+func (g *Gen) writeGoDoc(packageName string, output io.Writer, swagger *spec.Swagger, config *Config) error {
generator, err := template.New("swagger_info").Funcs(template.FuncMap{
"printDoc": func(v string) string {
// Add schemes
@@ -186,23 +205,27 @@ func (g *Gen) writeGoDoc(output io.Writer, swagger *spec.Swagger) error {
buffer := &bytes.Buffer{}
err = generator.Execute(buffer, struct {
- Timestamp time.Time
- Doc string
- Host string
- BasePath string
- Schemes []string
- Title string
- Description string
- Version string
+ Timestamp time.Time
+ GeneratedTime bool
+ Doc string
+ Host string
+ PackageName string
+ BasePath string
+ Schemes []string
+ Title string
+ Description string
+ Version string
}{
- Timestamp: time.Now(),
- Doc: string(buf),
- Host: swagger.Host,
- BasePath: swagger.BasePath,
- Schemes: swagger.Schemes,
- Title: swagger.Info.Title,
- Description: swagger.Info.Description,
- Version: swagger.Info.Version,
+ Timestamp: time.Now(),
+ GeneratedTime: config.GeneratedTime,
+ Doc: string(buf),
+ Host: swagger.Host,
+ PackageName: packageName,
+ BasePath: swagger.BasePath,
+ Schemes: swagger.Schemes,
+ Title: swagger.Info.Title,
+ Description: swagger.Info.Description,
+ Version: swagger.Info.Version,
})
if err != nil {
return err
@@ -213,14 +236,13 @@ func (g *Gen) writeGoDoc(output io.Writer, swagger *spec.Swagger) error {
// write
_, err = output.Write(code)
return err
-
}
var packageTemplate = `// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
-// This file was generated by swaggo/swag at
-// {{ .Timestamp }}
+// This file was generated by swaggo/swag{{ if .GeneratedTime }} at
+// {{ .Timestamp }}{{ end }}
-package docs
+package {{.PackageName}}
import (
"bytes"
diff --git a/vendor/github.com/swaggo/swag/go.mod b/vendor/github.com/swaggo/swag/go.mod
index 9b9c0628c6..f02834645a 100644
--- a/vendor/github.com/swaggo/swag/go.mod
+++ b/vendor/github.com/swaggo/swag/go.mod
@@ -4,11 +4,15 @@ require (
github.com/KyleBanks/depth v1.2.1
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/ghodss/yaml v1.0.0
- github.com/go-openapi/jsonreference v0.19.0
- github.com/go-openapi/spec v0.19.0
- github.com/stretchr/testify v1.3.0
+ github.com/gin-gonic/gin v1.4.0
+ github.com/go-openapi/jsonreference v0.19.3
+ github.com/go-openapi/spec v0.19.4
+ github.com/satori/go.uuid v1.2.0
+ github.com/stretchr/testify v1.4.0
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14
github.com/swaggo/gin-swagger v1.2.0
- github.com/urfave/cli v1.20.0
- golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b
+ github.com/urfave/cli/v2 v2.1.1
+ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59
)
+
+go 1.13
diff --git a/vendor/github.com/swaggo/swag/go.sum b/vendor/github.com/swaggo/swag/go.sum
index b5aa483279..ab7e7c11c9 100644
--- a/vendor/github.com/swaggo/swag/go.sum
+++ b/vendor/github.com/swaggo/swag/go.sum
@@ -1,74 +1,128 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
+github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/gzip v0.0.1 h1:ezvKOL6jH+jlzdHNE4h9h8q8uMpDQjyl0NN0Jd7jozc=
github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w=
github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
+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.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
+github.com/gin-gonic/gin v1.4.0 h1:3tMoCCfM7ppqsR0ptz/wi1impNpT7/9wQtMZ8lr1mCQ=
github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM=
github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
+github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
+github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
+github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk=
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
+github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
+github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
+github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
github.com/go-openapi/spec v0.19.0 h1:A4SZ6IWh3lnjH0rG0Z5lkxazMGBECtrZcbyYQi+64k4=
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
+github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo=
+github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
+github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
+github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
+github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
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/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 h1:PyYN9JH5jY9j6av01SpfRMb+1DWg/i3MbGOKPxJ2wjM=
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
+github.com/swaggo/gin-swagger v1.2.0 h1:YskZXEiv51fjOMTsXrOetAjrMDfFaXD79PEoQBOe2W0=
github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI=
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
+github.com/ugorji/go v1.1.5-pre h1:jyJKFOSEbdOc2HODrf2qcCkYOdq7zzXqA9bhW5oV4fM=
github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0=
github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/ugorji/go/codec v1.1.5-pre h1:5YV9PsFAN+ndcCtTM7s60no7nY7eTG3LPtxhSwuxzCs=
github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI=
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k=
+github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a h1:+KkCgOMgnKSgenxTBoiwkMqTiouMIy/3o8RLdmSbGoY=
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
+golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190610200419-93c9922d18ae h1:xiXzMMEQdQcric9hXtr1QU98MHunKK7OTtsoU6bYWs4=
golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4=
+golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
@@ -76,9 +130,14 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b h1:/mJ+GKieZA6hFDQGdWZrjj4AXPl5ylY+5HusG80roy0=
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 h1:QjA/9ArTfVTLfEhClDCG7SGrZkZixxWpwNCDiwJfh88=
+golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
+gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
diff --git a/vendor/github.com/swaggo/swag/operation.go b/vendor/github.com/swaggo/swag/operation.go
index ba51843600..4450bf697e 100644
--- a/vendor/github.com/swaggo/swag/operation.go
+++ b/vendor/github.com/swaggo/swag/operation.go
@@ -9,6 +9,7 @@ import (
"net/http"
"os"
"regexp"
+ "sort"
"strconv"
"strings"
@@ -69,6 +70,12 @@ func (operation *Operation) ParseComment(comment string, astFile *ast.File) erro
switch lowerAttribute {
case "@description":
operation.ParseDescriptionComment(lineRemainder)
+ case "@description.markdown":
+ commentInfo, err := getMarkdownForTag(lineRemainder, operation.parser.markdownFileDir)
+ if err != nil {
+ return err
+ }
+ operation.ParseDescriptionComment(string(commentInfo))
case "@summary":
operation.Summary = lineRemainder
case "@id":
@@ -141,9 +148,10 @@ func (operation *Operation) ParseParamComment(commentLine string, astFile *ast.F
// Detect refType
objectType := "object"
- if strings.HasPrefix(refType, "[]") == true {
+ if strings.HasPrefix(refType, "[]") {
objectType = "array"
refType = strings.TrimPrefix(refType, "[]")
+ refType = TransToValidSchemeType(refType)
} else if IsPrimitiveType(refType) ||
paramType == "formData" && refType == "file" {
objectType = "primitive"
@@ -168,67 +176,132 @@ func (operation *Operation) ParseParamComment(commentLine string, astFile *ast.F
return fmt.Errorf("%s is not supported array type for %s", refType, paramType)
}
param.SimpleSchema.Type = "array"
+ if operation.parser != nil {
+ param.CollectionFormat = TransToValidCollectionFormat(operation.parser.collectionFormatInQuery)
+ }
param.SimpleSchema.Items = &spec.Items{
SimpleSchema: spec.SimpleSchema{
Type: refType,
},
}
case "object":
- return fmt.Errorf("%s is not supported type for %s", refType, paramType)
+ refType, typeSpec, err := operation.registerSchemaType(refType, astFile)
+ if err != nil {
+ return err
+ }
+ structType, ok := typeSpec.Type.(*ast.StructType)
+ if !ok {
+ return fmt.Errorf("%s is not supported type for %s", refType, paramType)
+ }
+ refSplit := strings.Split(refType, ".")
+ schema, err := operation.parser.parseStruct(refSplit[0], structType.Fields)
+ if err != nil {
+ return err
+ }
+ if len(schema.Properties) == 0 {
+ return nil
+ }
+ find := func(arr []string, target string) bool {
+ for _, str := range arr {
+ if str == target {
+ return true
+ }
+ }
+ return false
+ }
+ orderedNames := make([]string, 0, len(schema.Properties))
+ for k := range schema.Properties {
+ orderedNames = append(orderedNames, k)
+ }
+ sort.Strings(orderedNames)
+ for _, name := range orderedNames {
+ prop := schema.Properties[name]
+ if len(prop.Type) == 0 {
+ continue
+ }
+ if prop.Type[0] == "array" &&
+ prop.Items.Schema != nil &&
+ len(prop.Items.Schema.Type) > 0 &&
+ IsSimplePrimitiveType(prop.Items.Schema.Type[0]) {
+ param = createParameter(paramType, prop.Description, name, prop.Type[0], find(schema.Required, name))
+ param.SimpleSchema.Type = prop.Type[0]
+ if operation.parser != nil && operation.parser.collectionFormatInQuery != "" && param.CollectionFormat == "" {
+ param.CollectionFormat = TransToValidCollectionFormat(operation.parser.collectionFormatInQuery)
+ }
+ param.SimpleSchema.Items = &spec.Items{
+ SimpleSchema: spec.SimpleSchema{
+ Type: prop.Items.Schema.Type[0],
+ },
+ }
+ } else if IsSimplePrimitiveType(prop.Type[0]) {
+ param = createParameter(paramType, prop.Description, name, prop.Type[0], find(schema.Required, name))
+ } else {
+ Println(fmt.Sprintf("skip field [%s] in %s is not supported type for %s", name, refType, paramType))
+ continue
+ }
+ param.Nullable = prop.Nullable
+ param.Format = prop.Format
+ param.Default = prop.Default
+ param.Example = prop.Example
+ param.Extensions = prop.Extensions
+ param.CommonValidations.Maximum = prop.Maximum
+ param.CommonValidations.Minimum = prop.Minimum
+ param.CommonValidations.ExclusiveMaximum = prop.ExclusiveMaximum
+ param.CommonValidations.ExclusiveMinimum = prop.ExclusiveMinimum
+ param.CommonValidations.MaxLength = prop.MaxLength
+ param.CommonValidations.MinLength = prop.MinLength
+ param.CommonValidations.Pattern = prop.Pattern
+ param.CommonValidations.MaxItems = prop.MaxItems
+ param.CommonValidations.MinItems = prop.MinItems
+ param.CommonValidations.UniqueItems = prop.UniqueItems
+ param.CommonValidations.MultipleOf = prop.MultipleOf
+ param.CommonValidations.Enum = prop.Enum
+ operation.Operation.Parameters = append(operation.Operation.Parameters, param)
+ }
+ return nil
}
case "body":
switch objectType {
case "primitive":
param.Schema.Type = spec.StringOrArray{refType}
case "array":
- param.Schema.Items = &spec.SchemaOrArray{
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{},
- },
- }
- // Arrau of Primitive or Object
- if IsPrimitiveType(refType) {
- param.Schema.Items.Schema.Type = spec.StringOrArray{refType}
- } else {
- if err := operation.registerSchemaType(refType, astFile); err != nil {
- return err
- }
- param.Schema.Items.Schema.Ref = spec.Ref{Ref: jsonreference.MustCreateRef("#/definitions/" + refType)}
- }
+ refType = "[]" + refType
+ fallthrough
case "object":
- if err := operation.registerSchemaType(refType, astFile); err != nil {
+ schema, err := operation.parseObjectSchema(refType, astFile)
+ if err != nil {
return err
}
- param.Schema.Type = spec.StringOrArray{objectType}
- param.Schema.Ref = spec.Ref{
- Ref: jsonreference.MustCreateRef("#/definitions/" + refType),
- }
+ param.Schema = schema
}
default:
return fmt.Errorf("%s is not supported paramType", paramType)
}
- if err := operation.parseAndExtractionParamAttribute(commentLine, refType, ¶m); err != nil {
+ if err := operation.parseAndExtractionParamAttribute(commentLine, objectType, refType, ¶m); err != nil {
return err
}
operation.Operation.Parameters = append(operation.Operation.Parameters, param)
return nil
}
-func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.File) error {
- refSplit := strings.Split(schemaType, ".")
- if len(refSplit) != 2 {
- return nil
+func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.File) (string, *ast.TypeSpec, error) {
+ if !strings.ContainsRune(schemaType, '.') {
+ if astFile == nil {
+ return schemaType, nil, fmt.Errorf("no package name for type %s", schemaType)
+ }
+ schemaType = fullTypeName(astFile.Name.String(), schemaType)
}
+ refSplit := strings.Split(schemaType, ".")
pkgName := refSplit[0]
typeName := refSplit[1]
if typeSpec, ok := operation.parser.TypeDefinitions[pkgName][typeName]; ok {
operation.parser.registerTypes[schemaType] = typeSpec
- return nil
+ return schemaType, typeSpec, nil
}
var typeSpec *ast.TypeSpec
if astFile == nil {
- return fmt.Errorf("can not register schema type: %q reason: astFile == nil", schemaType)
+ return schemaType, nil, fmt.Errorf("can not register schema type: %q reason: astFile == nil", schemaType)
}
for _, imp := range astFile.Imports {
if imp.Name != nil && imp.Name.Name == pkgName { // the import had an alias that matched
@@ -239,14 +312,14 @@ func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.F
var err error
typeSpec, err = findTypeDef(impPath, typeName)
if err != nil {
- return fmt.Errorf("can not find type def: %q error: %s", schemaType, err)
+ return schemaType, nil, fmt.Errorf("can not find type def: %q error: %s", schemaType, err)
}
break
}
}
if typeSpec == nil {
- return fmt.Errorf("can not find schema type: %q", schemaType)
+ return schemaType, nil, fmt.Errorf("can not find schema type: %q", schemaType)
}
if _, ok := operation.parser.TypeDefinitions[pkgName]; !ok {
@@ -255,27 +328,29 @@ func (operation *Operation) registerSchemaType(schemaType string, astFile *ast.F
operation.parser.TypeDefinitions[pkgName][typeName] = typeSpec
operation.parser.registerTypes[schemaType] = typeSpec
- return nil
+ return schemaType, typeSpec, nil
}
var regexAttributes = map[string]*regexp.Regexp{
// for Enums(A, B)
- "enums": regexp.MustCompile(`(?i)enums\(.*\)`),
+ "enums": regexp.MustCompile(`(?i)\s+enums\(.*\)`),
// for Minimum(0)
- "maxinum": regexp.MustCompile(`(?i)maxinum\(.*\)`),
+ "maxinum": regexp.MustCompile(`(?i)\s+maxinum\(.*\)`),
// for Maximum(0)
- "mininum": regexp.MustCompile(`(?i)mininum\(.*\)`),
+ "mininum": regexp.MustCompile(`(?i)\s+mininum\(.*\)`),
// for Maximum(0)
- "default": regexp.MustCompile(`(?i)default\(.*\)`),
+ "default": regexp.MustCompile(`(?i)\s+default\(.*\)`),
// for minlength(0)
- "minlength": regexp.MustCompile(`(?i)minlength\(.*\)`),
+ "minlength": regexp.MustCompile(`(?i)\s+minlength\(.*\)`),
// for maxlength(0)
- "maxlength": regexp.MustCompile(`(?i)maxlength\(.*\)`),
+ "maxlength": regexp.MustCompile(`(?i)\s+maxlength\(.*\)`),
// for format(email)
- "format": regexp.MustCompile(`(?i)format\(.*\)`),
+ "format": regexp.MustCompile(`(?i)\s+format\(.*\)`),
+ // for collectionFormat(csv)
+ "collectionFormat": regexp.MustCompile(`(?i)\s+collectionFormat\(.*\)`),
}
-func (operation *Operation) parseAndExtractionParamAttribute(commentLine, schemaType string, param *spec.Parameter) error {
+func (operation *Operation) parseAndExtractionParamAttribute(commentLine, objectType, schemaType string, param *spec.Parameter) error {
schemaType = TransToValidSchemeType(schemaType)
for attrKey, re := range regexAttributes {
attr, err := findAttr(re, commentLine)
@@ -320,8 +395,13 @@ func (operation *Operation) parseAndExtractionParamAttribute(commentLine, schema
param.MinLength = &n
case "format":
param.Format = attr
+ case "collectionFormat":
+ n, err := setCollectionFormatParam(attrKey, objectType, attr, commentLine)
+ if err != nil {
+ return err
+ }
+ param.CollectionFormat = n
}
-
}
return nil
}
@@ -371,6 +451,13 @@ func setEnumParam(attr, schemaType string, param *spec.Parameter) error {
return nil
}
+func setCollectionFormatParam(name, schemaType, attr, commentLine string) (string, error) {
+ if schemaType != "array" {
+ return "", fmt.Errorf("%s is attribute to set to an array. comment=%s got=%s", name, commentLine, schemaType)
+ }
+ return TransToValidCollectionFormat(attr), nil
+}
+
// defineType enum value define the type (object and array unsupported)
func defineType(schemaType string, value string) (interface{}, error) {
schemaType = TransToValidSchemeType(schemaType)
@@ -437,7 +524,7 @@ func parseMimeTypeList(mimeTypeList string, typeList *[]string, format string) e
return nil
}
-var routerPattern = regexp.MustCompile(`([\w\.\/\-{}\+]+)[^\[]+\[([^\]]+)`)
+var routerPattern = regexp.MustCompile(`^(/[\w\.\/\-{}\+:]*)[[:blank:]]+\[(\w+)]`)
// ParseRouterComment parses comment for gived `router` comment string.
func (operation *Operation) ParseRouterComment(commentLine string) error {
@@ -536,7 +623,155 @@ func findTypeDef(importPath, typeName string) (*ast.TypeSpec, error) {
return nil, fmt.Errorf("type spec not found")
}
-var responsePattern = regexp.MustCompile(`([\d]+)[\s]+([\w\{\}]+)[\s]+([\w\-\.\/]+)[^"]*(.*)?`)
+var responsePattern = regexp.MustCompile(`([\d]+)[\s]+([\w\{\}]+)[\s]+([\w\-\.\/\{\}=,\[\]]+)[^"]*(.*)?`)
+
+//RepsonseType{data1=Type1,data2=Type2}
+var combinedPattern = regexp.MustCompile(`^([\w\-\.\/\[\]]+)\{(.*)\}$`)
+
+func (operation *Operation) parseObjectSchema(refType string, astFile *ast.File) (*spec.Schema, error) {
+ switch {
+ case refType == "interface{}":
+ return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{"object"}}}, nil
+ case IsGolangPrimitiveType(refType):
+ refType = TransToValidSchemeType(refType)
+ return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{refType}}}, nil
+ case IsPrimitiveType(refType):
+ return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{refType}}}, nil
+ case strings.HasPrefix(refType, "[]"):
+ schema, err := operation.parseObjectSchema(refType[2:], astFile)
+ if err != nil {
+ return nil, err
+ }
+ return &spec.Schema{SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{Schema: schema}},
+ }, nil
+ case strings.HasPrefix(refType, "map["):
+ //ignore key type
+ idx := strings.Index(refType, "]")
+ if idx < 0 {
+ return nil, fmt.Errorf("invalid type: %s", refType)
+ }
+ refType = refType[idx+1:]
+ var valueSchema spec.SchemaOrBool
+ if refType == "interface{}" {
+ valueSchema.Allows = true
+ } else {
+ schema, err := operation.parseObjectSchema(refType, astFile)
+ if err != nil {
+ return &spec.Schema{}, err
+ }
+ valueSchema.Schema = schema
+ }
+ return &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ AdditionalProperties: &valueSchema,
+ },
+ }, nil
+ case strings.Contains(refType, "{"):
+ return operation.parseResponseCombinedObjectSchema(refType, astFile)
+ default:
+ if operation.parser != nil { // checking refType has existing in 'TypeDefinitions'
+ refNewType, typeSpec, err := operation.registerSchemaType(refType, astFile)
+ if err != nil {
+ return nil, err
+ }
+ refType = TypeDocName(refNewType, typeSpec)
+ }
+ return &spec.Schema{SchemaProps: spec.SchemaProps{Ref: spec.Ref{
+ Ref: jsonreference.MustCreateRef("#/definitions/" + refType),
+ }}}, nil
+ }
+}
+
+func (operation *Operation) parseResponseCombinedObjectSchema(refType string, astFile *ast.File) (*spec.Schema, error) {
+ matches := combinedPattern.FindStringSubmatch(refType)
+ if len(matches) != 3 {
+ return nil, fmt.Errorf("invalid type: %s", refType)
+ }
+ refType = matches[1]
+ schema, err := operation.parseObjectSchema(refType, astFile)
+ if err != nil {
+ return nil, err
+ }
+
+ parseFields := func(s string) []string {
+ n := 0
+ return strings.FieldsFunc(s, func(r rune) bool {
+ if r == '{' {
+ n++
+ return false
+ } else if r == '}' {
+ n--
+ return false
+ }
+ return r == ',' && n == 0
+ })
+ }
+
+ fields := parseFields(matches[2])
+ props := map[string]spec.Schema{}
+ for _, field := range fields {
+ if matches := strings.SplitN(field, "=", 2); len(matches) == 2 {
+ if strings.HasPrefix(matches[1], "[]") {
+ itemSchema, err := operation.parseObjectSchema(matches[1][2:], astFile)
+ if err != nil {
+ return nil, err
+ }
+ props[matches[0]] = spec.Schema{SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{Schema: itemSchema}},
+ }
+ } else {
+ schema, err := operation.parseObjectSchema(matches[1], astFile)
+ if err != nil {
+ return nil, err
+ }
+ props[matches[0]] = *schema
+ }
+ }
+ }
+
+ if len(props) == 0 {
+ return schema, nil
+ }
+ return &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ AllOf: []spec.Schema{
+ *schema,
+ {
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: props,
+ },
+ },
+ },
+ },
+ }, nil
+}
+
+func (operation *Operation) parseResponseSchema(schemaType, refType string, astFile *ast.File) (*spec.Schema, error) {
+ switch schemaType {
+ case "object":
+ if !strings.HasPrefix(refType, "[]") {
+ return operation.parseObjectSchema(refType, astFile)
+ }
+ refType = refType[2:]
+ fallthrough
+ case "array":
+ schema, err := operation.parseObjectSchema(refType, astFile)
+ if err != nil {
+ return nil, err
+ }
+ return &spec.Schema{SchemaProps: spec.SchemaProps{
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{Schema: schema}},
+ }, nil
+ default:
+ return &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{schemaType}}}, nil
+ }
+}
// ParseResponseComment parses comment for given `response` comment string.
func (operation *Operation) ParseResponseComment(commentLine string, astFile *ast.File) error {
@@ -550,59 +785,18 @@ func (operation *Operation) ParseResponseComment(commentLine string, astFile *as
return err
}
- response := spec.Response{}
-
code, _ := strconv.Atoi(matches[1])
responseDescription := strings.Trim(matches[4], "\"")
if responseDescription == "" {
responseDescription = http.StatusText(code)
}
- response.Description = responseDescription
schemaType := strings.Trim(matches[2], "{}")
refType := matches[3]
-
- if !IsGolangPrimitiveType(refType) && !strings.Contains(refType, ".") {
- currentPkgName := astFile.Name.String()
- refType = currentPkgName + "." + refType
- }
-
- if operation.parser != nil { // checking refType has existing in 'TypeDefinitions'
- if err := operation.registerSchemaType(refType, astFile); err != nil {
- return err
- }
- }
-
- // so we have to know all type in app
- response.Schema = &spec.Schema{SchemaProps: spec.SchemaProps{Type: []string{schemaType}}}
-
- if schemaType == "object" {
- response.Schema.SchemaProps = spec.SchemaProps{}
- response.Schema.Ref = spec.Ref{
- Ref: jsonreference.MustCreateRef("#/definitions/" + refType),
- }
- }
-
- if schemaType == "array" {
- refType = TransToValidSchemeType(refType)
- if IsPrimitiveType(refType) {
- response.Schema.Items = &spec.SchemaOrArray{
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: spec.StringOrArray{refType},
- },
- },
- }
- } else {
- response.Schema.Items = &spec.SchemaOrArray{
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{
- Ref: spec.Ref{Ref: jsonreference.MustCreateRef("#/definitions/" + refType)},
- },
- },
- }
- }
+ schema, err := operation.parseResponseSchema(schemaType, refType, astFile)
+ if err != nil {
+ return err
}
if operation.Responses == nil {
@@ -613,8 +807,9 @@ func (operation *Operation) ParseResponseComment(commentLine string, astFile *as
}
}
- operation.Responses.StatusCodeResponses[code] = response
-
+ operation.Responses.StatusCodeResponses[code] = spec.Response{
+ ResponseProps: spec.ResponseProps{Schema: schema, Description: responseDescription},
+ }
return nil
}
diff --git a/vendor/github.com/swaggo/swag/parser.go b/vendor/github.com/swaggo/swag/parser.go
index 11618acf05..b4871f4331 100644
--- a/vendor/github.com/swaggo/swag/parser.go
+++ b/vendor/github.com/swaggo/swag/parser.go
@@ -11,7 +11,6 @@ import (
"net/http"
"os"
"os/exec"
- "path"
"path/filepath"
"reflect"
"sort"
@@ -46,6 +45,9 @@ type Parser struct {
// TypeDefinitions is a map that stores [package name][type name][*ast.TypeSpec]
TypeDefinitions map[string]map[string]*ast.TypeSpec
+ // ImportAliases is map that stores [import name][import package name][*ast.ImportSpec]
+ ImportAliases map[string]map[string]*ast.ImportSpec
+
// CustomPrimitiveTypes is a map that stores custom primitive types to actual golang types [type name][string]
CustomPrimitiveTypes map[string]string
@@ -59,11 +61,20 @@ type Parser struct {
// ParseDependencies whether swag should be parse outside dependency folder
ParseDependency bool
+ // ParseInternal whether swag should parse internal packages
+ ParseInternal bool
+
// structStack stores full names of the structures that were already parsed or are being parsed now
structStack []string
// markdownFileDir holds the path to the folder, where markdown files are stored
markdownFileDir string
+
+ // collectionFormatInQuery set the default collectionFormat otherwise then 'csv' for array in query params
+ collectionFormatInQuery string
+
+ // excludes excludes dirs and files in SearchDir
+ excludes map[string]bool
}
// New creates a new Parser with default properties.
@@ -85,8 +96,10 @@ func New(options ...func(*Parser)) *Parser {
},
files: make(map[string]*ast.File),
TypeDefinitions: make(map[string]map[string]*ast.TypeSpec),
+ ImportAliases: make(map[string]map[string]*ast.ImportSpec),
CustomPrimitiveTypes: make(map[string]string),
registerTypes: make(map[string]*ast.TypeSpec),
+ excludes: make(map[string]bool),
}
for _, option := range options {
@@ -103,6 +116,19 @@ func SetMarkdownFileDirectory(directoryPath string) func(*Parser) {
}
}
+// SetExcludedDirsAndFiles sets directories and files to be excluded when searching
+func SetExcludedDirsAndFiles(excludes string) func(*Parser) {
+ return func(p *Parser) {
+ for _, f := range strings.Split(excludes, ",") {
+ f = strings.TrimSpace(f)
+ if f != "" {
+ f = filepath.Clean(f)
+ p.excludes[f] = true
+ }
+ }
+ }
+}
+
// ParseAPI parses general api info for given searchDir and mainAPIFile
func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error {
Printf("Generate general API Info, search dir:%s", searchDir)
@@ -112,6 +138,7 @@ func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error {
}
var t depth.Tree
+ t.ResolveInternal = true
absMainAPIFilePath, err := filepath.Abs(filepath.Join(searchDir, mainAPIFile))
if err != nil {
@@ -119,7 +146,7 @@ func (parser *Parser) ParseAPI(searchDir string, mainAPIFile string) error {
}
if parser.ParseDependency {
- pkgName, err := getPkgName(path.Dir(absMainAPIFilePath))
+ pkgName, err := getPkgName(filepath.Dir(absMainAPIFilePath))
if err != nil {
return err
}
@@ -295,7 +322,8 @@ func (parser *Parser) ParseGeneralAPIInfo(mainAPIFile string) error {
return err
}
securityMap[value] = securitySchemeOAuth2AccessToken(attrMap["@authorizationurl"], attrMap["@tokenurl"], scopes)
-
+ case "@query.collection.format":
+ parser.collectionFormatInQuery = value
default:
prefixExtension := "@x-"
if len(attribute) > 5 { // Prefix extension + 1 char + 1 space + 1 char
@@ -512,7 +540,8 @@ func (parser *Parser) ParseType(astFile *ast.File) {
typeName := fmt.Sprintf("%v", typeSpec.Type)
// check if its a custom primitive type
if IsGolangPrimitiveType(typeName) {
- parser.CustomPrimitiveTypes[typeSpec.Name.String()] = TransToValidSchemeType(typeName)
+ var typeSpecFullName = fmt.Sprintf("%s.%s", astFile.Name.String(), typeSpec.Name.String())
+ parser.CustomPrimitiveTypes[typeSpecFullName] = TransToValidSchemeType(typeName)
} else {
parser.TypeDefinitions[astFile.Name.String()][typeSpec.Name.String()] = typeSpec
}
@@ -521,6 +550,23 @@ func (parser *Parser) ParseType(astFile *ast.File) {
}
}
}
+
+ for _, importSpec := range astFile.Imports {
+ if importSpec.Name == nil {
+ continue
+ }
+
+ alias := importSpec.Name.Name
+
+ if _, ok := parser.ImportAliases[alias]; !ok {
+ parser.ImportAliases[alias] = make(map[string]*ast.ImportSpec)
+ }
+
+ importParts := strings.Split(strings.Trim(importSpec.Path.Value, "\""), "/")
+ importPkgName := importParts[len(importParts)-1]
+
+ parser.ImportAliases[alias][importPkgName] = importSpec
+ }
}
func (parser *Parser) isInStructStack(refTypeName string) bool {
@@ -557,7 +603,7 @@ func (parser *Parser) parseDefinitions() error {
// given name and package, and populates swagger schema definitions registry
// with a schema for the given type
func (parser *Parser) ParseDefinition(pkgName, typeName string, typeSpec *ast.TypeSpec) error {
- refTypeName := fullTypeName(pkgName, typeName)
+ refTypeName := TypeDocName(pkgName, typeSpec)
if typeSpec == nil {
Println("Skipping '" + refTypeName + "', pkg '" + pkgName + "' not found, try add flag --parseDependency or --parseVendor.")
@@ -581,7 +627,7 @@ func (parser *Parser) ParseDefinition(pkgName, typeName string, typeSpec *ast.Ty
if err != nil {
return err
}
- parser.swagger.Definitions[refTypeName] = schema
+ parser.swagger.Definitions[refTypeName] = *schema
return nil
}
@@ -605,9 +651,7 @@ func (parser *Parser) collectRequiredFields(pkgName string, properties map[strin
tspec := parser.TypeDefinitions[pkgName][tname]
parser.ParseDefinition(pkgName, tname, tspec)
}
- if tname != "object" {
- requiredFields = append(requiredFields, prop.SchemaProps.Required...)
- }
+ requiredFields = append(requiredFields, prop.SchemaProps.Required...)
properties[k] = prop
}
@@ -629,28 +673,44 @@ func fullTypeName(pkgName, typeName string) string {
// parseTypeExpr parses given type expression that corresponds to the type under
// given name and package, and returns swagger schema for it.
-func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr) (spec.Schema, error) {
- //TODO: return pointer to spec.Schema
+func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr) (*spec.Schema, error) {
switch expr := typeExpr.(type) {
// type Foo struct {...}
case *ast.StructType:
- refTypeName := fullTypeName(pkgName, typeName)
- if schema, isParsed := parser.swagger.Definitions[refTypeName]; isParsed {
- return schema, nil
+ if typedef, ok := parser.TypeDefinitions[pkgName][typeName]; ok {
+ refTypeName := TypeDocName(pkgName, typedef)
+ if schema, isParsed := parser.swagger.Definitions[refTypeName]; isParsed {
+ return &schema, nil
+ }
}
return parser.parseStruct(pkgName, expr.Fields)
// type Foo Baz
case *ast.Ident:
+ if IsGolangPrimitiveType(expr.Name) {
+ return &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: spec.StringOrArray{TransToValidSchemeType(expr.Name)},
+ },
+ }, nil
+ }
refTypeName := fullTypeName(pkgName, expr.Name)
- if _, isParsed := parser.swagger.Definitions[refTypeName]; !isParsed {
- if typedef, ok := parser.TypeDefinitions[pkgName][expr.Name]; ok {
+ if typedef, ok := parser.TypeDefinitions[pkgName][expr.Name]; ok {
+ refTypeName = TypeDocName(pkgName, typedef)
+ if _, isParsed := parser.swagger.Definitions[refTypeName]; !isParsed {
parser.ParseDefinition(pkgName, expr.Name, typedef)
}
}
- return parser.swagger.Definitions[refTypeName], nil
+
+ return &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Ref: spec.Ref{
+ Ref: jsonreference.MustCreateRef("#/definitions/" + refTypeName),
+ },
+ },
+ }, nil
// type Foo *Baz
case *ast.StarExpr:
@@ -660,13 +720,13 @@ func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr)
case *ast.ArrayType:
itemSchema, err := parser.parseTypeExpr(pkgName, "", expr.Elt)
if err != nil {
- return spec.Schema{}, err
+ return &spec.Schema{}, err
}
- return spec.Schema{
+ return &spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{"array"},
Items: &spec.SchemaOrArray{
- Schema: &itemSchema,
+ Schema: itemSchema,
},
},
}, nil
@@ -674,28 +734,25 @@ func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr)
// type Foo pkg.Bar
case *ast.SelectorExpr:
if xIdent, ok := expr.X.(*ast.Ident); ok {
- pkgName = xIdent.Name
- typeName = expr.Sel.Name
- refTypeName := fullTypeName(pkgName, typeName)
- if _, isParsed := parser.swagger.Definitions[refTypeName]; !isParsed {
- typedef := parser.TypeDefinitions[pkgName][typeName]
- parser.ParseDefinition(pkgName, typeName, typedef)
- }
- return parser.swagger.Definitions[refTypeName], nil
+ return parser.parseTypeExpr(xIdent.Name, expr.Sel.Name, expr.Sel)
}
// type Foo map[string]Bar
case *ast.MapType:
- itemSchema, err := parser.parseTypeExpr(pkgName, "", expr.Value)
- if err != nil {
- return spec.Schema{}, err
+ var valueSchema spec.SchemaOrBool
+ if _, ok := expr.Value.(*ast.InterfaceType); ok {
+ valueSchema.Allows = true
+ } else {
+ schema, err := parser.parseTypeExpr(pkgName, "", expr.Value)
+ if err != nil {
+ return &spec.Schema{}, err
+ }
+ valueSchema.Schema = schema
}
- return spec.Schema{
+ return &spec.Schema{
SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- AdditionalProperties: &spec.SchemaOrBool{
- Schema: &itemSchema,
- },
+ Type: []string{"object"},
+ AdditionalProperties: &valueSchema,
},
}, nil
// ...
@@ -703,21 +760,21 @@ func (parser *Parser) parseTypeExpr(pkgName, typeName string, typeExpr ast.Expr)
Printf("Type definition of type '%T' is not supported yet. Using 'object' instead.\n", typeExpr)
}
- return spec.Schema{
+ return &spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{"object"},
},
}, nil
}
-func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (spec.Schema, error) {
+func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (*spec.Schema, error) {
extraRequired := make([]string, 0)
properties := make(map[string]spec.Schema)
for _, field := range fields.List {
fieldProps, requiredFromAnon, err := parser.parseStructField(pkgName, field)
if err != nil {
- return spec.Schema{}, err
+ return &spec.Schema{}, err
}
extraRequired = append(extraRequired, requiredFromAnon...)
for k, v := range fieldProps {
@@ -730,14 +787,11 @@ func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (spec.S
// unset required from properties because we've collected them
for k, prop := range properties {
- tname := prop.SchemaProps.Type[0]
- if tname != "object" {
- prop.SchemaProps.Required = make([]string, 0)
- }
+ prop.SchemaProps.Required = make([]string, 0)
properties[k] = prop
}
- return spec.Schema{
+ return &spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{"object"},
Properties: properties,
@@ -747,6 +801,7 @@ func (parser *Parser) parseStruct(pkgName string, fields *ast.FieldList) (spec.S
type structField struct {
name string
+ desc string
schemaType string
arrayType string
formatType string
@@ -763,6 +818,34 @@ type structField struct {
extensions map[string]interface{}
}
+func (sf *structField) toStandardSchema() *spec.Schema {
+ required := make([]string, 0)
+ if sf.isRequired {
+ required = append(required, sf.name)
+ }
+ return &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{sf.schemaType},
+ Description: sf.desc,
+ Format: sf.formatType,
+ Required: required,
+ Maximum: sf.maximum,
+ Minimum: sf.minimum,
+ MaxLength: sf.maxLength,
+ MinLength: sf.minLength,
+ Enum: sf.enums,
+ Default: sf.defaultValue,
+ },
+ SwaggerSchemaProps: spec.SwaggerSchemaProps{
+ Example: sf.exampleValue,
+ ReadOnly: sf.readOnly,
+ },
+ VendorExtensible: spec.VendorExtensible{
+ Extensions: sf.extensions,
+ },
+ }
+}
+
func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[string]spec.Schema, []string, error) {
properties := map[string]spec.Schema{}
@@ -780,6 +863,17 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
}
typeSpec := parser.TypeDefinitions[pkgName][typeName]
+ if typeSpec == nil {
+ // Check if the pkg name is an alias and try to define type spec using real package name
+ if aliases, ok := parser.ImportAliases[pkgName]; ok {
+ for alias := range aliases {
+ typeSpec = parser.TypeDefinitions[alias][typeName]
+ if typeSpec != nil {
+ break
+ }
+ }
+ }
+ }
if typeSpec != nil {
schema, err := parser.parseTypeExpr(pkgName, typeName, typeSpec.Type)
if err != nil {
@@ -796,7 +890,7 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
properties[k] = v
}
case "array":
- properties[typeName] = schema
+ properties[typeName] = *schema
default:
Printf("Can't extract properties from a schema of type '%s'", schemaType)
}
@@ -806,34 +900,57 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
return properties, nil, nil
}
- structField, err := parser.parseField(field)
+ structField, err := parser.parseField(pkgName, field)
if err != nil {
- return properties, nil, nil
+ return properties, nil, err
}
if structField.name == "" {
return properties, nil, nil
}
- var desc string
- if field.Doc != nil {
- desc = strings.TrimSpace(field.Doc.Text())
- }
- if desc == "" && field.Comment != nil {
- desc = strings.TrimSpace(field.Comment.Text())
- }
+
// TODO: find package of schemaType and/or arrayType
if structField.crossPkg != "" {
pkgName = structField.crossPkg
}
- if _, ok := parser.TypeDefinitions[pkgName][structField.schemaType]; ok { // user type field
+
+ fillObject := func(src, dest interface{}) error {
+ bin, err := json.Marshal(src)
+ if err != nil {
+ return err
+ }
+ return json.Unmarshal(bin, dest)
+ }
+
+ //for spec.Schema have implemented json.Marshaler, here in another way to convert
+ fillSchema := func(src, dest *spec.Schema) error {
+ err = fillObject(&src.SchemaProps, &dest.SchemaProps)
+ if err != nil {
+ return err
+ }
+ err = fillObject(&src.SwaggerSchemaProps, &dest.SwaggerSchemaProps)
+ if err != nil {
+ return err
+ }
+ return fillObject(&src.VendorExtensible, &dest.VendorExtensible)
+ }
+
+ if typeSpec, ok := parser.TypeDefinitions[pkgName][structField.schemaType]; ok { // user type field
// write definition if not yet present
- parser.ParseDefinition(pkgName, structField.schemaType,
- parser.TypeDefinitions[pkgName][structField.schemaType])
+ err = parser.ParseDefinition(pkgName, structField.schemaType, typeSpec)
+ if err != nil {
+ return properties, nil, err
+ }
+ required := make([]string, 0)
+ if structField.isRequired {
+ required = append(required, structField.name)
+ }
properties[structField.name] = spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{"object"}, // to avoid swagger validation error
- Description: desc,
+ Description: structField.desc,
+ Required: required,
Ref: spec.Ref{
- Ref: jsonreference.MustCreateRef("#/definitions/" + pkgName + "." + structField.schemaType),
+ Ref: jsonreference.MustCreateRef("#/definitions/" + TypeDocName(pkgName, typeSpec)),
},
},
SwaggerSchemaProps: spec.SwaggerSchemaProps{
@@ -842,18 +959,23 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
}
} else if structField.schemaType == "array" { // array field type
// if defined -- ref it
- if _, ok := parser.TypeDefinitions[pkgName][structField.arrayType]; ok { // user type in array
+ if typeSpec, ok := parser.TypeDefinitions[pkgName][structField.arrayType]; ok { // user type in array
parser.ParseDefinition(pkgName, structField.arrayType,
parser.TypeDefinitions[pkgName][structField.arrayType])
+ required := make([]string, 0)
+ if structField.isRequired {
+ required = append(required, structField.name)
+ }
properties[structField.name] = spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{structField.schemaType},
- Description: desc,
+ Description: structField.desc,
+ Required: required,
Items: &spec.SchemaOrArray{
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
Ref: spec.Ref{
- Ref: jsonreference.MustCreateRef("#/definitions/" + pkgName + "." + structField.arrayType),
+ Ref: jsonreference.MustCreateRef("#/definitions/" + TypeDocName(pkgName, typeSpec)),
},
},
},
@@ -881,7 +1003,7 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
properties[structField.name] = spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{structField.schemaType},
- Description: desc,
+ Description: structField.desc,
Items: &spec.SchemaOrArray{
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
@@ -895,6 +1017,36 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
ReadOnly: structField.readOnly,
},
}
+ } else {
+ schema, _ := parser.parseTypeExpr(pkgName, "", astTypeArray.Elt)
+ properties[structField.name] = spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{structField.schemaType},
+ Description: structField.desc,
+ Items: &spec.SchemaOrArray{
+ Schema: schema,
+ },
+ },
+ SwaggerSchemaProps: spec.SwaggerSchemaProps{
+ ReadOnly: structField.readOnly,
+ },
+ }
+ }
+ }
+ } else if structField.arrayType == "array" {
+ if astTypeArray, ok := field.Type.(*ast.ArrayType); ok {
+ schema, _ := parser.parseTypeExpr(pkgName, "", astTypeArray.Elt)
+ properties[structField.name] = spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{structField.schemaType},
+ Description: structField.desc,
+ Items: &spec.SchemaOrArray{
+ Schema: schema,
+ },
+ },
+ SwaggerSchemaProps: spec.SwaggerSchemaProps{
+ ReadOnly: structField.readOnly,
+ },
}
}
} else {
@@ -907,7 +1059,7 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
properties[structField.name] = spec.Schema{
SchemaProps: spec.SchemaProps{
Type: []string{structField.schemaType},
- Description: desc,
+ Description: structField.desc,
Format: structField.formatType,
Required: required,
Items: &spec.SchemaOrArray{
@@ -930,47 +1082,36 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
},
}
}
+ } else if astTypeMap, ok := field.Type.(*ast.MapType); ok { // if map
+ stdSchema := structField.toStandardSchema()
+ mapValueSchema, err := parser.parseTypeExpr(pkgName, "", astTypeMap)
+ if err != nil {
+ return properties, nil, err
+ }
+ stdSchema.Type = mapValueSchema.Type
+ stdSchema.AdditionalProperties = mapValueSchema.AdditionalProperties
+ properties[structField.name] = *stdSchema
} else {
- required := make([]string, 0)
- if structField.isRequired {
- required = append(required, structField.name)
- }
- properties[structField.name] = spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{structField.schemaType},
- Description: desc,
- Format: structField.formatType,
- Required: required,
- Maximum: structField.maximum,
- Minimum: structField.minimum,
- MaxLength: structField.maxLength,
- MinLength: structField.minLength,
- Enum: structField.enums,
- Default: structField.defaultValue,
- },
- SwaggerSchemaProps: spec.SwaggerSchemaProps{
- Example: structField.exampleValue,
- ReadOnly: structField.readOnly,
- },
- VendorExtensible: spec.VendorExtensible{
- Extensions: structField.extensions,
- },
- }
+ stdSchema := structField.toStandardSchema()
+ properties[structField.name] = *stdSchema
- if nestStruct, ok := field.Type.(*ast.StarExpr); ok {
- schema, err := parser.parseTypeExpr(pkgName, structField.schemaType, nestStruct.X)
- if err != nil {
- return nil, nil, err
+ if nestStar, ok := field.Type.(*ast.StarExpr); ok {
+ if !IsGolangPrimitiveType(structField.schemaType) {
+ schema, err := parser.parseTypeExpr(pkgName, structField.schemaType, nestStar.X)
+ if err != nil {
+ return properties, nil, err
+ }
+
+ if len(schema.SchemaProps.Type) > 0 {
+ err = fillSchema(schema, stdSchema)
+ if err != nil {
+ return properties, nil, err
+ }
+ properties[structField.name] = *stdSchema
+ return properties, nil, nil
+ }
}
-
- if len(schema.SchemaProps.Type) > 0 {
- properties[structField.name] = schema
- return properties, nil, nil
- }
- }
-
- nestStruct, ok := field.Type.(*ast.StructType)
- if ok {
+ } else if nestStruct, ok := field.Type.(*ast.StructType); ok {
props := map[string]spec.Schema{}
nestRequired := make([]string, 0)
for _, v := range nestStruct.Fields.List {
@@ -986,26 +1127,9 @@ func (parser *Parser) parseStructField(pkgName string, field *ast.Field) (map[st
props[k] = v
}
}
-
- properties[structField.name] = spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{structField.schemaType},
- Description: desc,
- Format: structField.formatType,
- Properties: props,
- Required: nestRequired,
- Maximum: structField.maximum,
- Minimum: structField.minimum,
- MaxLength: structField.maxLength,
- MinLength: structField.minLength,
- Enum: structField.enums,
- Default: structField.defaultValue,
- },
- SwaggerSchemaProps: spec.SwaggerSchemaProps{
- Example: structField.exampleValue,
- ReadOnly: structField.readOnly,
- },
- }
+ stdSchema.Properties = props
+ stdSchema.Required = nestRequired
+ properties[structField.name] = *stdSchema
}
}
return properties, nil, nil
@@ -1035,8 +1159,8 @@ func getFieldType(field interface{}) (string, error) {
return "", fmt.Errorf("unknown field type %#v", field)
}
-func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
- prop, err := getPropertyName(field.Type, parser)
+func (parser *Parser) parseField(pkgName string, field *ast.Field) (*structField, error) {
+ prop, err := getPropertyName(pkgName, field.Type, parser)
if err != nil {
return nil, err
}
@@ -1051,6 +1175,16 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
}
}
+ // Skip func fields.
+ if prop.SchemaType == "func" {
+ return &structField{name: ""}, nil
+ }
+
+ // Skip non-exported fields.
+ if !ast.IsExported(field.Names[0].Name) {
+ return &structField{name: ""}, nil
+ }
+
structField := &structField{
name: field.Names[0].Name,
schemaType: prop.SchemaType,
@@ -1069,14 +1203,33 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
structField.name = toLowerCamelCase(structField.name)
}
+ if field.Doc != nil {
+ structField.desc = strings.TrimSpace(field.Doc.Text())
+ }
+ if structField.desc == "" && field.Comment != nil {
+ structField.desc = strings.TrimSpace(field.Comment.Text())
+ }
+
if field.Tag == nil {
return structField, nil
}
// `json:"tag"` -> json:"tag"
structTag := reflect.StructTag(strings.Replace(field.Tag.Value, "`", "", -1))
+
+ if ignoreTag := structTag.Get("swaggerignore"); ignoreTag == "true" {
+ structField.name = ""
+ return structField, nil
+ }
+
jsonTag := structTag.Get("json")
+ hasStringTag := false
// json:"tag,hoge"
if strings.Contains(jsonTag, ",") {
+ // json:"name,string" or json:",string"
+ if strings.Contains(jsonTag, ",string") {
+ hasStringTag = true
+ }
+
// json:",hoge"
if strings.HasPrefix(jsonTag, ",") {
jsonTag = ""
@@ -1086,6 +1239,7 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
}
if jsonTag == "-" {
structField.name = ""
+ return structField, nil
} else if jsonTag != "" {
structField.name = jsonTag
}
@@ -1098,6 +1252,9 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
if len(parts) >= 2 {
if newSchemaType == "array" {
newArrayType = parts[1]
+ if err := CheckSchemaType(newArrayType); err != nil {
+ return nil, err
+ }
} else if newSchemaType == "primitive" {
newSchemaType = parts[1]
newArrayType = parts[1]
@@ -1107,19 +1264,22 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
if err := CheckSchemaType(newSchemaType); err != nil {
return nil, err
}
- if err := CheckSchemaType(newArrayType); err != nil {
- return nil, err
- }
+
structField.schemaType = newSchemaType
structField.arrayType = newArrayType
}
}
if exampleTag := structTag.Get("example"); exampleTag != "" {
- example, err := defineTypeOfExample(structField.schemaType, structField.arrayType, exampleTag)
- if err != nil {
- return nil, err
+ if hasStringTag {
+ // then the example must be in string format
+ structField.exampleValue = exampleTag
+ } else {
+ example, err := defineTypeOfExample(structField.schemaType, structField.arrayType, exampleTag)
+ if err != nil {
+ return nil, err
+ }
+ structField.exampleValue = example
}
- structField.exampleValue = example
}
if formatTag := structTag.Get("format"); formatTag != "" {
structField.formatType = formatTag
@@ -1203,6 +1363,30 @@ func (parser *Parser) parseField(field *ast.Field) (*structField, error) {
structField.readOnly = readOnly == "true"
}
+ // perform this after setting everything else (min, max, etc...)
+ if hasStringTag {
+
+ // @encoding/json: "It applies only to fields of string, floating point, integer, or boolean types."
+ defaultValues := map[string]string{
+ // Zero Values as string
+ "string": "",
+ "integer": "0",
+ "boolean": "false",
+ "number": "0",
+ }
+
+ if defaultValue, ok := defaultValues[structField.schemaType]; ok {
+ structField.schemaType = "string"
+
+ if structField.exampleValue == nil {
+ // if exampleValue is not defined by the user,
+ // we will force an example with a correct value
+ // (eg: int->"0", bool:"false")
+ structField.exampleValue = defaultValue
+ }
+ }
+ }
+
return structField, nil
}
@@ -1316,10 +1500,15 @@ func (parser *Parser) getAllGoFileInfo(searchDir string) error {
}
func (parser *Parser) getAllGoFileInfoFromDeps(pkg *depth.Pkg) error {
- if pkg.Internal || !pkg.Resolved { // ignored internal and not resolved dependencies
+ ignoreInternal := pkg.Internal && !parser.ParseInternal
+ if ignoreInternal || !pkg.Resolved { // ignored internal and not resolved dependencies
return nil
}
+ // Skip cgo
+ if pkg.Raw == nil && pkg.Name == "C" {
+ return nil
+ }
srcDir := pkg.Raw.Dir
files, err := ioutil.ReadDir(srcDir) // only parsing files in the dir(don't contains sub dir files)
if err != nil {
@@ -1368,22 +1557,20 @@ func (parser *Parser) parseFile(path string) error {
// Skip returns filepath.SkipDir error if match vendor and hidden folder
func (parser *Parser) Skip(path string, f os.FileInfo) error {
-
- if !parser.ParseVendor { // ignore vendor
- if f.IsDir() && f.Name() == "vendor" {
+ if f.IsDir() {
+ if !parser.ParseVendor && f.Name() == "vendor" || //ignore "vendor"
+ f.Name() == "docs" || //exclude docs
+ len(f.Name()) > 1 && f.Name()[0] == '.' { // exclude all hidden folder
return filepath.SkipDir
}
+
+ if parser.excludes != nil {
+ if _, ok := parser.excludes[path]; ok {
+ return filepath.SkipDir
+ }
+ }
}
- // issue
- if f.IsDir() && f.Name() == "docs" {
- return filepath.SkipDir
- }
-
- // exclude all hidden folder
- if f.IsDir() && len(f.Name()) > 1 && f.Name()[0] == '.' {
- return filepath.SkipDir
- }
return nil
}
diff --git a/vendor/github.com/swaggo/swag/property.go b/vendor/github.com/swaggo/swag/property.go
index 5b846d63d9..6d45632737 100644
--- a/vendor/github.com/swaggo/swag/property.go
+++ b/vendor/github.com/swaggo/swag/property.go
@@ -60,7 +60,21 @@ func parseFieldSelectorExpr(astTypeSelectorExpr *ast.SelectorExpr, parser *Parse
parser.ParseDefinition(pkgName.Name, astTypeSelectorExpr.Sel.Name, typeDefinitions)
return propertyNewFunc(astTypeSelectorExpr.Sel.Name, pkgName.Name)
}
- if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[astTypeSelectorExpr.Sel.Name]; isCustomType {
+ if aliasedNames, ok := parser.ImportAliases[pkgName.Name]; ok {
+ for aliasedName := range aliasedNames {
+ if typeDefinitions, ok := parser.TypeDefinitions[aliasedName][astTypeSelectorExpr.Sel.Name]; ok {
+ if expr, ok := typeDefinitions.Type.(*ast.SelectorExpr); ok {
+ if primitiveType, err := convertFromSpecificToPrimitive(expr.Sel.Name); err == nil {
+ return propertyNewFunc(primitiveType, "")
+ }
+ }
+ parser.ParseDefinition(aliasedName, astTypeSelectorExpr.Sel.Name, typeDefinitions)
+ return propertyNewFunc(astTypeSelectorExpr.Sel.Name, aliasedName)
+ }
+ }
+ }
+ name := fmt.Sprintf("%s.%v", pkgName, astTypeSelectorExpr.Sel.Name)
+ if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[name]; isCustomType {
return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}
}
}
@@ -69,64 +83,57 @@ func parseFieldSelectorExpr(astTypeSelectorExpr *ast.SelectorExpr, parser *Parse
// getPropertyName returns the string value for the given field if it exists
// allowedValues: array, boolean, integer, null, number, object, string
-func getPropertyName(expr ast.Expr, parser *Parser) (propertyName, error) {
- if astTypeSelectorExpr, ok := expr.(*ast.SelectorExpr); ok {
- return parseFieldSelectorExpr(astTypeSelectorExpr, parser, newProperty), nil
- }
-
- // check if it is a custom type
- typeName := fmt.Sprintf("%v", expr)
- if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[typeName]; isCustomType {
- return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}, nil
- }
-
- if astTypeIdent, ok := expr.(*ast.Ident); ok {
- name := astTypeIdent.Name
- schemeType := TransToValidSchemeType(name)
- return propertyName{SchemaType: schemeType, ArrayType: schemeType}, nil
- }
-
- if ptr, ok := expr.(*ast.StarExpr); ok {
- return getPropertyName(ptr.X, parser)
- }
-
- if astTypeArray, ok := expr.(*ast.ArrayType); ok { // if array
- if _, ok := astTypeArray.Elt.(*ast.StructType); ok {
- return propertyName{SchemaType: "array", ArrayType: "object"}, nil
+func getPropertyName(pkgName string, expr ast.Expr, parser *Parser) (propertyName, error) {
+ switch tp := expr.(type) {
+ case *ast.SelectorExpr:
+ return parseFieldSelectorExpr(tp, parser, newProperty), nil
+ case *ast.StarExpr:
+ return getPropertyName(pkgName, tp.X, parser)
+ case *ast.ArrayType:
+ return getArrayPropertyName(pkgName, tp.Elt, parser), nil
+ case *ast.MapType, *ast.StructType, *ast.InterfaceType:
+ return propertyName{SchemaType: "object", ArrayType: "object"}, nil
+ case *ast.FuncType:
+ return propertyName{SchemaType: "func", ArrayType: ""}, nil
+ case *ast.Ident:
+ name := tp.Name
+ // check if it is a custom type
+ if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[fullTypeName(pkgName, name)]; isCustomType {
+ return propertyName{SchemaType: actualPrimitiveType, ArrayType: actualPrimitiveType}, nil
}
- return getArrayPropertyName(astTypeArray, parser), nil
- }
- if _, ok := expr.(*ast.MapType); ok { // if map
- return propertyName{SchemaType: "object", ArrayType: "object"}, nil
+ name = TransToValidSchemeType(name)
+ return propertyName{SchemaType: name, ArrayType: name}, nil
+ default:
+ return propertyName{}, errors.New("not supported" + fmt.Sprint(expr))
}
-
- if _, ok := expr.(*ast.StructType); ok { // if struct
- return propertyName{SchemaType: "object", ArrayType: "object"}, nil
- }
-
- if _, ok := expr.(*ast.InterfaceType); ok { // if interface{}
- return propertyName{SchemaType: "object", ArrayType: "object"}, nil
- }
- return propertyName{}, errors.New("not supported" + fmt.Sprint(expr))
}
-func getArrayPropertyName(astTypeArray *ast.ArrayType, parser *Parser) propertyName {
- if astTypeArrayExpr, ok := astTypeArray.Elt.(*ast.SelectorExpr); ok {
- return parseFieldSelectorExpr(astTypeArrayExpr, parser, newArrayProperty)
- }
- if astTypeArrayExpr, ok := astTypeArray.Elt.(*ast.StarExpr); ok {
- if astTypeArraySel, ok := astTypeArrayExpr.X.(*ast.SelectorExpr); ok {
- return parseFieldSelectorExpr(astTypeArraySel, parser, newArrayProperty)
+func getArrayPropertyName(pkgName string, astTypeArrayElt ast.Expr, parser *Parser) propertyName {
+ switch elt := astTypeArrayElt.(type) {
+ case *ast.StructType, *ast.MapType, *ast.InterfaceType:
+ return propertyName{SchemaType: "array", ArrayType: "object"}
+ case *ast.ArrayType:
+ return propertyName{SchemaType: "array", ArrayType: "array"}
+ case *ast.StarExpr:
+ return getArrayPropertyName(pkgName, elt.X, parser)
+ case *ast.SelectorExpr:
+ return parseFieldSelectorExpr(elt, parser, newArrayProperty)
+ case *ast.Ident:
+ name := elt.Name
+ if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[fullTypeName(pkgName, name)]; isCustomType {
+ name = actualPrimitiveType
+ } else {
+ name = TransToValidSchemeType(elt.Name)
}
- if astTypeArrayIdent, ok := astTypeArrayExpr.X.(*ast.Ident); ok {
- name := TransToValidSchemeType(astTypeArrayIdent.Name)
- return propertyName{SchemaType: "array", ArrayType: name}
+ return propertyName{SchemaType: "array", ArrayType: name}
+ default:
+ name := fmt.Sprintf("%s", astTypeArrayElt)
+ if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[fullTypeName(pkgName, name)]; isCustomType {
+ name = actualPrimitiveType
+ } else {
+ name = TransToValidSchemeType(name)
}
+ return propertyName{SchemaType: "array", ArrayType: name}
}
- itemTypeName := TransToValidSchemeType(fmt.Sprintf("%s", astTypeArray.Elt))
- if actualPrimitiveType, isCustomType := parser.CustomPrimitiveTypes[itemTypeName]; isCustomType {
- itemTypeName = actualPrimitiveType
- }
- return propertyName{SchemaType: "array", ArrayType: itemTypeName}
}
diff --git a/vendor/github.com/swaggo/swag/schema.go b/vendor/github.com/swaggo/swag/schema.go
index 2ebef16785..539340fae9 100644
--- a/vendor/github.com/swaggo/swag/schema.go
+++ b/vendor/github.com/swaggo/swag/schema.go
@@ -1,6 +1,10 @@
package swag
-import "fmt"
+import (
+ "fmt"
+ "go/ast"
+ "strings"
+)
// CheckSchemaType checks if typeName is not a name of primitive type
func CheckSchemaType(typeName string) error {
@@ -10,10 +14,20 @@ func CheckSchemaType(typeName string) error {
return nil
}
+// IsSimplePrimitiveType determine whether the type name is a simple primitive type
+func IsSimplePrimitiveType(typeName string) bool {
+ switch typeName {
+ case "string", "number", "integer", "boolean":
+ return true
+ default:
+ return false
+ }
+}
+
// IsPrimitiveType determine whether the type name is a primitive type
func IsPrimitiveType(typeName string) bool {
switch typeName {
- case "string", "number", "integer", "boolean", "array", "object":
+ case "string", "number", "integer", "boolean", "array", "object", "func":
return true
default:
return false
@@ -69,3 +83,35 @@ func IsGolangPrimitiveType(typeName string) bool {
return false
}
}
+
+// TransToValidCollectionFormat determine valid collection format
+func TransToValidCollectionFormat(format string) string {
+ switch format {
+ case "csv", "multi", "pipes", "tsv", "ssv":
+ return format
+ default:
+ return ""
+ }
+}
+
+// TypeDocName get alias from comment '// @name ', otherwise the original type name to display in doc
+func TypeDocName(pkgName string, spec *ast.TypeSpec) string {
+ if spec != nil {
+ if spec.Comment != nil {
+ for _, comment := range spec.Comment.List {
+ text := strings.TrimSpace(comment.Text)
+ text = strings.TrimLeft(text, "//")
+ text = strings.TrimSpace(text)
+ texts := strings.Split(text, " ")
+ if len(texts) > 1 && strings.ToLower(texts[0]) == "@name" {
+ return texts[1]
+ }
+ }
+ }
+ if spec.Name != nil {
+ return fullTypeName(strings.Split(pkgName, ".")[0], spec.Name.Name)
+ }
+ }
+
+ return pkgName
+}
diff --git a/vendor/github.com/swaggo/swag/version.go b/vendor/github.com/swaggo/swag/version.go
index 7e69b37502..d322f013e8 100644
--- a/vendor/github.com/swaggo/swag/version.go
+++ b/vendor/github.com/swaggo/swag/version.go
@@ -1,4 +1,4 @@
package swag
// Version of swag
-const Version = "v1.6.3"
+const Version = "v1.6.7"
diff --git a/vendor/github.com/urfave/cli/.travis.yml b/vendor/github.com/urfave/cli/.travis.yml
deleted file mode 100644
index d36c22436f..0000000000
--- a/vendor/github.com/urfave/cli/.travis.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-language: go
-sudo: false
-dist: bionic
-osx_image: xcode10
-go:
- - 1.11.x
- - 1.12.x
- - 1.13.x
-
-os:
- - linux
- - osx
-
-env:
- GO111MODULE=on
- GOPROXY=https://proxy.golang.org
-
-cache:
- directories:
- - node_modules
-
-before_script:
- - go get github.com/urfave/gfmrun/cmd/gfmrun
- - go get golang.org/x/tools/cmd/goimports
- - npm install markdown-toc
- - go mod tidy
-
-script:
- - go run build.go vet
- - go run build.go test
- - go run build.go gfmrun docs/v1/manual.md
- - go run build.go toc docs/v1/manual.md
-
-after_success:
- - bash <(curl -s https://codecov.io/bash)
diff --git a/vendor/github.com/urfave/cli/category.go b/vendor/github.com/urfave/cli/category.go
deleted file mode 100644
index bf3c73c55e..0000000000
--- a/vendor/github.com/urfave/cli/category.go
+++ /dev/null
@@ -1,44 +0,0 @@
-package cli
-
-// CommandCategories is a slice of *CommandCategory.
-type CommandCategories []*CommandCategory
-
-// CommandCategory is a category containing commands.
-type CommandCategory struct {
- Name string
- Commands Commands
-}
-
-func (c CommandCategories) Less(i, j int) bool {
- return lexicographicLess(c[i].Name, c[j].Name)
-}
-
-func (c CommandCategories) Len() int {
- return len(c)
-}
-
-func (c CommandCategories) Swap(i, j int) {
- c[i], c[j] = c[j], c[i]
-}
-
-// AddCommand adds a command to a category.
-func (c CommandCategories) AddCommand(category string, command Command) CommandCategories {
- for _, commandCategory := range c {
- if commandCategory.Name == category {
- commandCategory.Commands = append(commandCategory.Commands, command)
- return c
- }
- }
- return append(c, &CommandCategory{Name: category, Commands: []Command{command}})
-}
-
-// VisibleCommands returns a slice of the Commands with Hidden=false
-func (c *CommandCategory) VisibleCommands() []Command {
- ret := []Command{}
- for _, command := range c.Commands {
- if !command.Hidden {
- ret = append(ret, command)
- }
- }
- return ret
-}
diff --git a/vendor/github.com/urfave/cli/context.go b/vendor/github.com/urfave/cli/context.go
deleted file mode 100644
index ecfc032821..0000000000
--- a/vendor/github.com/urfave/cli/context.go
+++ /dev/null
@@ -1,339 +0,0 @@
-package cli
-
-import (
- "errors"
- "flag"
- "fmt"
- "os"
- "reflect"
- "strings"
- "syscall"
-)
-
-// Context is a type that is passed through to
-// each Handler action in a cli application. Context
-// can be used to retrieve context-specific Args and
-// parsed command-line options.
-type Context struct {
- App *App
- Command Command
- shellComplete bool
- flagSet *flag.FlagSet
- setFlags map[string]bool
- parentContext *Context
-}
-
-// NewContext creates a new context. For use in when invoking an App or Command action.
-func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context {
- c := &Context{App: app, flagSet: set, parentContext: parentCtx}
-
- if parentCtx != nil {
- c.shellComplete = parentCtx.shellComplete
- }
-
- return c
-}
-
-// NumFlags returns the number of flags set
-func (c *Context) NumFlags() int {
- return c.flagSet.NFlag()
-}
-
-// Set sets a context flag to a value.
-func (c *Context) Set(name, value string) error {
- c.setFlags = nil
- return c.flagSet.Set(name, value)
-}
-
-// GlobalSet sets a context flag to a value on the global flagset
-func (c *Context) GlobalSet(name, value string) error {
- globalContext(c).setFlags = nil
- return globalContext(c).flagSet.Set(name, value)
-}
-
-// IsSet determines if the flag was actually set
-func (c *Context) IsSet(name string) bool {
- if c.setFlags == nil {
- c.setFlags = make(map[string]bool)
-
- c.flagSet.Visit(func(f *flag.Flag) {
- c.setFlags[f.Name] = true
- })
-
- c.flagSet.VisitAll(func(f *flag.Flag) {
- if _, ok := c.setFlags[f.Name]; ok {
- return
- }
- c.setFlags[f.Name] = false
- })
-
- // XXX hack to support IsSet for flags with EnvVar
- //
- // There isn't an easy way to do this with the current implementation since
- // whether a flag was set via an environment variable is very difficult to
- // determine here. Instead, we intend to introduce a backwards incompatible
- // change in version 2 to add `IsSet` to the Flag interface to push the
- // responsibility closer to where the information required to determine
- // whether a flag is set by non-standard means such as environment
- // variables is available.
- //
- // See https://github.com/urfave/cli/issues/294 for additional discussion
- flags := c.Command.Flags
- if c.Command.Name == "" { // cannot == Command{} since it contains slice types
- if c.App != nil {
- flags = c.App.Flags
- }
- }
- for _, f := range flags {
- eachName(f.GetName(), func(name string) {
- if isSet, ok := c.setFlags[name]; isSet || !ok {
- return
- }
-
- val := reflect.ValueOf(f)
- if val.Kind() == reflect.Ptr {
- val = val.Elem()
- }
-
- filePathValue := val.FieldByName("FilePath")
- if filePathValue.IsValid() {
- eachName(filePathValue.String(), func(filePath string) {
- if _, err := os.Stat(filePath); err == nil {
- c.setFlags[name] = true
- return
- }
- })
- }
-
- envVarValue := val.FieldByName("EnvVar")
- if envVarValue.IsValid() {
- eachName(envVarValue.String(), func(envVar string) {
- envVar = strings.TrimSpace(envVar)
- if _, ok := syscall.Getenv(envVar); ok {
- c.setFlags[name] = true
- return
- }
- })
- }
- })
- }
- }
-
- return c.setFlags[name]
-}
-
-// GlobalIsSet determines if the global flag was actually set
-func (c *Context) GlobalIsSet(name string) bool {
- ctx := c
- if ctx.parentContext != nil {
- ctx = ctx.parentContext
- }
-
- for ; ctx != nil; ctx = ctx.parentContext {
- if ctx.IsSet(name) {
- return true
- }
- }
- return false
-}
-
-// FlagNames returns a slice of flag names used in this context.
-func (c *Context) FlagNames() (names []string) {
- for _, f := range c.Command.Flags {
- name := strings.Split(f.GetName(), ",")[0]
- if name == "help" {
- continue
- }
- names = append(names, name)
- }
- return
-}
-
-// GlobalFlagNames returns a slice of global flag names used by the app.
-func (c *Context) GlobalFlagNames() (names []string) {
- for _, f := range c.App.Flags {
- name := strings.Split(f.GetName(), ",")[0]
- if name == "help" || name == "version" {
- continue
- }
- names = append(names, name)
- }
- return
-}
-
-// Parent returns the parent context, if any
-func (c *Context) Parent() *Context {
- return c.parentContext
-}
-
-// value returns the value of the flag coressponding to `name`
-func (c *Context) value(name string) interface{} {
- return c.flagSet.Lookup(name).Value.(flag.Getter).Get()
-}
-
-// Args contains apps console arguments
-type Args []string
-
-// Args returns the command line arguments associated with the context.
-func (c *Context) Args() Args {
- args := Args(c.flagSet.Args())
- return args
-}
-
-// NArg returns the number of the command line arguments.
-func (c *Context) NArg() int {
- return len(c.Args())
-}
-
-// Get returns the nth argument, or else a blank string
-func (a Args) Get(n int) string {
- if len(a) > n {
- return a[n]
- }
- return ""
-}
-
-// First returns the first argument, or else a blank string
-func (a Args) First() string {
- return a.Get(0)
-}
-
-// Tail returns the rest of the arguments (not the first one)
-// or else an empty string slice
-func (a Args) Tail() []string {
- if len(a) >= 2 {
- return []string(a)[1:]
- }
- return []string{}
-}
-
-// Present checks if there are any arguments present
-func (a Args) Present() bool {
- return len(a) != 0
-}
-
-// Swap swaps arguments at the given indexes
-func (a Args) Swap(from, to int) error {
- if from >= len(a) || to >= len(a) {
- return errors.New("index out of range")
- }
- a[from], a[to] = a[to], a[from]
- return nil
-}
-
-func globalContext(ctx *Context) *Context {
- if ctx == nil {
- return nil
- }
-
- for {
- if ctx.parentContext == nil {
- return ctx
- }
- ctx = ctx.parentContext
- }
-}
-
-func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet {
- if ctx.parentContext != nil {
- ctx = ctx.parentContext
- }
- for ; ctx != nil; ctx = ctx.parentContext {
- if f := ctx.flagSet.Lookup(name); f != nil {
- return ctx.flagSet
- }
- }
- return nil
-}
-
-func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
- switch ff.Value.(type) {
- case *StringSlice:
- default:
- _ = set.Set(name, ff.Value.String())
- }
-}
-
-func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
- visited := make(map[string]bool)
- set.Visit(func(f *flag.Flag) {
- visited[f.Name] = true
- })
- for _, f := range flags {
- parts := strings.Split(f.GetName(), ",")
- if len(parts) == 1 {
- continue
- }
- var ff *flag.Flag
- for _, name := range parts {
- name = strings.Trim(name, " ")
- if visited[name] {
- if ff != nil {
- return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name)
- }
- ff = set.Lookup(name)
- }
- }
- if ff == nil {
- continue
- }
- for _, name := range parts {
- name = strings.Trim(name, " ")
- if !visited[name] {
- copyFlag(name, ff, set)
- }
- }
- }
- return nil
-}
-
-type requiredFlagsErr interface {
- error
- getMissingFlags() []string
-}
-
-type errRequiredFlags struct {
- missingFlags []string
-}
-
-func (e *errRequiredFlags) Error() string {
- numberOfMissingFlags := len(e.missingFlags)
- if numberOfMissingFlags == 1 {
- return fmt.Sprintf("Required flag %q not set", e.missingFlags[0])
- }
- joinedMissingFlags := strings.Join(e.missingFlags, ", ")
- return fmt.Sprintf("Required flags %q not set", joinedMissingFlags)
-}
-
-func (e *errRequiredFlags) getMissingFlags() []string {
- return e.missingFlags
-}
-
-func checkRequiredFlags(flags []Flag, context *Context) requiredFlagsErr {
- var missingFlags []string
- for _, f := range flags {
- if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() {
- var flagPresent bool
- var flagName string
- for _, key := range strings.Split(f.GetName(), ",") {
- if len(key) > 1 {
- flagName = key
- }
-
- if context.IsSet(strings.TrimSpace(key)) {
- flagPresent = true
- }
- }
-
- if !flagPresent && flagName != "" {
- missingFlags = append(missingFlags, flagName)
- }
- }
- }
-
- if len(missingFlags) != 0 {
- return &errRequiredFlags{missingFlags: missingFlags}
- }
-
- return nil
-}
diff --git a/vendor/github.com/urfave/cli/flag_bool_t.go b/vendor/github.com/urfave/cli/flag_bool_t.go
deleted file mode 100644
index cd0888fa21..0000000000
--- a/vendor/github.com/urfave/cli/flag_bool_t.go
+++ /dev/null
@@ -1,110 +0,0 @@
-package cli
-
-import (
- "flag"
- "fmt"
- "strconv"
-)
-
-// BoolTFlag is a flag with type bool that is true by default
-type BoolTFlag struct {
- Name string
- Usage string
- EnvVar string
- FilePath string
- Required bool
- Hidden bool
- Destination *bool
-}
-
-// String returns a readable representation of this value
-// (for usage defaults)
-func (f BoolTFlag) String() string {
- return FlagStringer(f)
-}
-
-// GetName returns the name of the flag
-func (f BoolTFlag) GetName() string {
- return f.Name
-}
-
-// IsRequired returns whether or not the flag is required
-func (f BoolTFlag) IsRequired() bool {
- return f.Required
-}
-
-// TakesValue returns true of the flag takes a value, otherwise false
-func (f BoolTFlag) TakesValue() bool {
- return false
-}
-
-// GetUsage returns the usage string for the flag
-func (f BoolTFlag) GetUsage() string {
- return f.Usage
-}
-
-// GetValue returns the flags value as string representation and an empty
-// string if the flag takes no value at all.
-func (f BoolTFlag) GetValue() string {
- return ""
-}
-
-// BoolT looks up the value of a local BoolTFlag, returns
-// false if not found
-func (c *Context) BoolT(name string) bool {
- return lookupBoolT(name, c.flagSet)
-}
-
-// GlobalBoolT looks up the value of a global BoolTFlag, returns
-// false if not found
-func (c *Context) GlobalBoolT(name string) bool {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
- return lookupBoolT(name, fs)
- }
- return false
-}
-
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f BoolTFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error {
- val := true
-
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- if envVal == "" {
- val = false
- } else {
- envValBool, err := strconv.ParseBool(envVal)
- if err != nil {
- return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
- }
- val = envValBool
- }
- }
-
- eachName(f.Name, func(name string) {
- if f.Destination != nil {
- set.BoolVar(f.Destination, name, val, f.Usage)
- return
- }
- set.Bool(name, val, f.Usage)
- })
-
- return nil
-}
-
-func lookupBoolT(name string, set *flag.FlagSet) bool {
- f := set.Lookup(name)
- if f != nil {
- parsed, err := strconv.ParseBool(f.Value.String())
- if err != nil {
- return false
- }
- return parsed
- }
- return false
-}
diff --git a/vendor/github.com/urfave/cli/flag_int64_slice.go b/vendor/github.com/urfave/cli/flag_int64_slice.go
deleted file mode 100644
index ed2e983b62..0000000000
--- a/vendor/github.com/urfave/cli/flag_int64_slice.go
+++ /dev/null
@@ -1,141 +0,0 @@
-package cli
-
-import (
- "flag"
- "fmt"
- "strconv"
- "strings"
-)
-
-// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter
-type Int64Slice []int64
-
-// Set parses the value into an integer and appends it to the list of values
-func (f *Int64Slice) Set(value string) error {
- tmp, err := strconv.ParseInt(value, 10, 64)
- if err != nil {
- return err
- }
- *f = append(*f, tmp)
- return nil
-}
-
-// String returns a readable representation of this value (for usage defaults)
-func (f *Int64Slice) String() string {
- return fmt.Sprintf("%#v", *f)
-}
-
-// Value returns the slice of ints set by this flag
-func (f *Int64Slice) Value() []int64 {
- return *f
-}
-
-// Get returns the slice of ints set by this flag
-func (f *Int64Slice) Get() interface{} {
- return *f
-}
-
-// Int64SliceFlag is a flag with type *Int64Slice
-type Int64SliceFlag struct {
- Name string
- Usage string
- EnvVar string
- FilePath string
- Required bool
- Hidden bool
- Value *Int64Slice
-}
-
-// String returns a readable representation of this value
-// (for usage defaults)
-func (f Int64SliceFlag) String() string {
- return FlagStringer(f)
-}
-
-// GetName returns the name of the flag
-func (f Int64SliceFlag) GetName() string {
- return f.Name
-}
-
-// IsRequired returns whether or not the flag is required
-func (f Int64SliceFlag) IsRequired() bool {
- return f.Required
-}
-
-// TakesValue returns true of the flag takes a value, otherwise false
-func (f Int64SliceFlag) TakesValue() bool {
- return true
-}
-
-// GetUsage returns the usage string for the flag
-func (f Int64SliceFlag) GetUsage() string {
- return f.Usage
-}
-
-// GetValue returns the flags value as string representation and an empty
-// string if the flag takes no value at all.
-func (f Int64SliceFlag) GetValue() string {
- if f.Value != nil {
- return f.Value.String()
- }
- return ""
-}
-
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f Int64SliceFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- newVal := &Int64Slice{}
- for _, s := range strings.Split(envVal, ",") {
- s = strings.TrimSpace(s)
- if err := newVal.Set(s); err != nil {
- return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err)
- }
- }
- if f.Value == nil {
- f.Value = newVal
- } else {
- *f.Value = *newVal
- }
- }
-
- eachName(f.Name, func(name string) {
- if f.Value == nil {
- f.Value = &Int64Slice{}
- }
- set.Var(f.Value, name, f.Usage)
- })
- return nil
-}
-
-// Int64Slice looks up the value of a local Int64SliceFlag, returns
-// nil if not found
-func (c *Context) Int64Slice(name string) []int64 {
- return lookupInt64Slice(name, c.flagSet)
-}
-
-// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns
-// nil if not found
-func (c *Context) GlobalInt64Slice(name string) []int64 {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
- return lookupInt64Slice(name, fs)
- }
- return nil
-}
-
-func lookupInt64Slice(name string, set *flag.FlagSet) []int64 {
- f := set.Lookup(name)
- if f != nil {
- parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil)
- if err != nil {
- return nil
- }
- return parsed
- }
- return nil
-}
diff --git a/vendor/github.com/urfave/cli/flag_int_slice.go b/vendor/github.com/urfave/cli/flag_int_slice.go
deleted file mode 100644
index c38d010fd0..0000000000
--- a/vendor/github.com/urfave/cli/flag_int_slice.go
+++ /dev/null
@@ -1,142 +0,0 @@
-package cli
-
-import (
- "flag"
- "fmt"
- "strconv"
- "strings"
-)
-
-// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter
-type IntSlice []int
-
-// Set parses the value into an integer and appends it to the list of values
-func (f *IntSlice) Set(value string) error {
- tmp, err := strconv.Atoi(value)
- if err != nil {
- return err
- }
- *f = append(*f, tmp)
- return nil
-}
-
-// String returns a readable representation of this value (for usage defaults)
-func (f *IntSlice) String() string {
- return fmt.Sprintf("%#v", *f)
-}
-
-// Value returns the slice of ints set by this flag
-func (f *IntSlice) Value() []int {
- return *f
-}
-
-// Get returns the slice of ints set by this flag
-func (f *IntSlice) Get() interface{} {
- return *f
-}
-
-// IntSliceFlag is a flag with type *IntSlice
-type IntSliceFlag struct {
- Name string
- Usage string
- EnvVar string
- FilePath string
- Required bool
- Hidden bool
- Value *IntSlice
-}
-
-// String returns a readable representation of this value
-// (for usage defaults)
-func (f IntSliceFlag) String() string {
- return FlagStringer(f)
-}
-
-// GetName returns the name of the flag
-func (f IntSliceFlag) GetName() string {
- return f.Name
-}
-
-// IsRequired returns whether or not the flag is required
-func (f IntSliceFlag) IsRequired() bool {
- return f.Required
-}
-
-// TakesValue returns true of the flag takes a value, otherwise false
-func (f IntSliceFlag) TakesValue() bool {
- return true
-}
-
-// GetUsage returns the usage string for the flag
-func (f IntSliceFlag) GetUsage() string {
- return f.Usage
-}
-
-// GetValue returns the flags value as string representation and an empty
-// string if the flag takes no value at all.
-func (f IntSliceFlag) GetValue() string {
- if f.Value != nil {
- return f.Value.String()
- }
- return ""
-}
-
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f IntSliceFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- newVal := &IntSlice{}
- for _, s := range strings.Split(envVal, ",") {
- s = strings.TrimSpace(s)
- if err := newVal.Set(s); err != nil {
- return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err)
- }
- }
- if f.Value == nil {
- f.Value = newVal
- } else {
- *f.Value = *newVal
- }
- }
-
- eachName(f.Name, func(name string) {
- if f.Value == nil {
- f.Value = &IntSlice{}
- }
- set.Var(f.Value, name, f.Usage)
- })
-
- return nil
-}
-
-// IntSlice looks up the value of a local IntSliceFlag, returns
-// nil if not found
-func (c *Context) IntSlice(name string) []int {
- return lookupIntSlice(name, c.flagSet)
-}
-
-// GlobalIntSlice looks up the value of a global IntSliceFlag, returns
-// nil if not found
-func (c *Context) GlobalIntSlice(name string) []int {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
- return lookupIntSlice(name, fs)
- }
- return nil
-}
-
-func lookupIntSlice(name string, set *flag.FlagSet) []int {
- f := set.Lookup(name)
- if f != nil {
- parsed, err := (f.Value.(*IntSlice)).Value(), error(nil)
- if err != nil {
- return nil
- }
- return parsed
- }
- return nil
-}
diff --git a/vendor/github.com/urfave/cli/flag_string_slice.go b/vendor/github.com/urfave/cli/flag_string_slice.go
deleted file mode 100644
index e865b2ff03..0000000000
--- a/vendor/github.com/urfave/cli/flag_string_slice.go
+++ /dev/null
@@ -1,138 +0,0 @@
-package cli
-
-import (
- "flag"
- "fmt"
- "strings"
-)
-
-// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter
-type StringSlice []string
-
-// Set appends the string value to the list of values
-func (f *StringSlice) Set(value string) error {
- *f = append(*f, value)
- return nil
-}
-
-// String returns a readable representation of this value (for usage defaults)
-func (f *StringSlice) String() string {
- return fmt.Sprintf("%s", *f)
-}
-
-// Value returns the slice of strings set by this flag
-func (f *StringSlice) Value() []string {
- return *f
-}
-
-// Get returns the slice of strings set by this flag
-func (f *StringSlice) Get() interface{} {
- return *f
-}
-
-// StringSliceFlag is a flag with type *StringSlice
-type StringSliceFlag struct {
- Name string
- Usage string
- EnvVar string
- FilePath string
- Required bool
- Hidden bool
- TakesFile bool
- Value *StringSlice
-}
-
-// String returns a readable representation of this value
-// (for usage defaults)
-func (f StringSliceFlag) String() string {
- return FlagStringer(f)
-}
-
-// GetName returns the name of the flag
-func (f StringSliceFlag) GetName() string {
- return f.Name
-}
-
-// IsRequired returns whether or not the flag is required
-func (f StringSliceFlag) IsRequired() bool {
- return f.Required
-}
-
-// TakesValue returns true of the flag takes a value, otherwise false
-func (f StringSliceFlag) TakesValue() bool {
- return true
-}
-
-// GetUsage returns the usage string for the flag
-func (f StringSliceFlag) GetUsage() string {
- return f.Usage
-}
-
-// GetValue returns the flags value as string representation and an empty
-// string if the flag takes no value at all.
-func (f StringSliceFlag) GetValue() string {
- if f.Value != nil {
- return f.Value.String()
- }
- return ""
-}
-
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f StringSliceFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- newVal := &StringSlice{}
- for _, s := range strings.Split(envVal, ",") {
- s = strings.TrimSpace(s)
- if err := newVal.Set(s); err != nil {
- return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err)
- }
- }
- if f.Value == nil {
- f.Value = newVal
- } else {
- *f.Value = *newVal
- }
- }
-
- eachName(f.Name, func(name string) {
- if f.Value == nil {
- f.Value = &StringSlice{}
- }
- set.Var(f.Value, name, f.Usage)
- })
-
- return nil
-}
-
-// StringSlice looks up the value of a local StringSliceFlag, returns
-// nil if not found
-func (c *Context) StringSlice(name string) []string {
- return lookupStringSlice(name, c.flagSet)
-}
-
-// GlobalStringSlice looks up the value of a global StringSliceFlag, returns
-// nil if not found
-func (c *Context) GlobalStringSlice(name string) []string {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
- return lookupStringSlice(name, fs)
- }
- return nil
-}
-
-func lookupStringSlice(name string, set *flag.FlagSet) []string {
- f := set.Lookup(name)
- if f != nil {
- parsed, err := (f.Value.(*StringSlice)).Value(), error(nil)
- if err != nil {
- return nil
- }
- return parsed
- }
- return nil
-}
diff --git a/vendor/github.com/urfave/cli/.flake8 b/vendor/github.com/urfave/cli/v2/.flake8
similarity index 100%
rename from vendor/github.com/urfave/cli/.flake8
rename to vendor/github.com/urfave/cli/v2/.flake8
diff --git a/vendor/github.com/urfave/cli/.gitignore b/vendor/github.com/urfave/cli/v2/.gitignore
similarity index 59%
rename from vendor/github.com/urfave/cli/.gitignore
rename to vendor/github.com/urfave/cli/v2/.gitignore
index 7a7e2d9ef0..b013e4ac68 100644
--- a/vendor/github.com/urfave/cli/.gitignore
+++ b/vendor/github.com/urfave/cli/v2/.gitignore
@@ -1,3 +1,5 @@
*.coverprofile
+*.orig
node_modules/
-vendor
\ No newline at end of file
+vendor
+.idea
diff --git a/vendor/github.com/urfave/cli/CODE_OF_CONDUCT.md b/vendor/github.com/urfave/cli/v2/CODE_OF_CONDUCT.md
similarity index 100%
rename from vendor/github.com/urfave/cli/CODE_OF_CONDUCT.md
rename to vendor/github.com/urfave/cli/v2/CODE_OF_CONDUCT.md
diff --git a/vendor/github.com/urfave/cli/LICENSE b/vendor/github.com/urfave/cli/v2/LICENSE
similarity index 100%
rename from vendor/github.com/urfave/cli/LICENSE
rename to vendor/github.com/urfave/cli/v2/LICENSE
diff --git a/vendor/github.com/urfave/cli/README.md b/vendor/github.com/urfave/cli/v2/README.md
similarity index 58%
rename from vendor/github.com/urfave/cli/README.md
rename to vendor/github.com/urfave/cli/v2/README.md
index b2abbcf9db..e7fb3d7551 100644
--- a/vendor/github.com/urfave/cli/README.md
+++ b/vendor/github.com/urfave/cli/v2/README.md
@@ -1,7 +1,6 @@
cli
===
-[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli)
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli)
[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli)
@@ -15,15 +14,44 @@ applications in an expressive way.
## Usage Documentation
-Usage documentation exists for each major version
+Usage documentation exists for each major version. Don't know what version you're on? You're probably using the version from the `master` branch, which is currently `v2`.
+- `v2` - [./docs/v2/manual.md](./docs/v2/manual.md)
- `v1` - [./docs/v1/manual.md](./docs/v1/manual.md)
-- `v2` - đ§ documentation for `v2` is WIP đ§
## Installation
-Make sure you have a working Go environment. Go version 1.10+ is supported. [See
-the install instructions for Go](http://golang.org/doc/install.html).
+Make sure you have a working Go environment. Go version 1.11+ is supported. [See the install instructions for Go](http://golang.org/doc/install.html).
+
+Go Modules are strongly recommended when using this package. [See the go blog guide on using Go Modules](https://blog.golang.org/using-go-modules).
+
+### Using `v2` releases
+
+```
+$ GO111MODULE=on go get github.com/urfave/cli/v2
+```
+
+```go
+...
+import (
+ "github.com/urfave/cli/v2" // imports as package "cli"
+)
+...
+```
+
+### Using `v1` releases
+
+```
+$ GO111MODULE=on go get github.com/urfave/cli
+```
+
+```go
+...
+import (
+ "github.com/urfave/cli"
+)
+...
+```
### GOPATH
@@ -36,35 +64,5 @@ export PATH=$PATH:$GOPATH/bin
### Supported platforms
cli is tested against multiple versions of Go on Linux, and against the latest
-released version of Go on OS X and Windows. For full details, see
-[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml).
-
-### Using `v1` releases
-
-```
-$ go get github.com/urfave/cli
-```
-
-```go
-...
-import (
- "github.com/urfave/cli"
-)
-...
-```
-
-### Using `v2` releases
-
-**Warning**: `v2` is in a pre-release state.
-
-```
-$ go get github.com/urfave/cli.v2
-```
-
-```go
-...
-import (
- "github.com/urfave/cli.v2" // imports as package "cli"
-)
-...
-```
+released version of Go on OS X and Windows. This project uses Github Actions for
+builds. For more build info, please look at the [./.github/workflows/cli.yml](https://github.com/urfave/cli/blob/master/.github/workflows/cli.yml).
diff --git a/vendor/github.com/urfave/cli/app.go b/vendor/github.com/urfave/cli/v2/app.go
similarity index 81%
rename from vendor/github.com/urfave/cli/app.go
rename to vendor/github.com/urfave/cli/v2/app.go
index 95d2038101..c04e9afdaf 100644
--- a/vendor/github.com/urfave/cli/app.go
+++ b/vendor/github.com/urfave/cli/v2/app.go
@@ -1,24 +1,22 @@
package cli
import (
+ "context"
"flag"
"fmt"
"io"
"os"
"path/filepath"
+ "reflect"
"sort"
"time"
)
var (
- changeLogURL = "https://github.com/urfave/cli/blob/master/CHANGELOG.md"
+ changeLogURL = "https://github.com/urfave/cli/blob/master/docs/CHANGELOG.md"
appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL)
- // unused variable. commented for now. will remove in future if agreed upon by everyone
- //runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL)
-
- contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you."
-
- errInvalidActionType = NewExitError("ERROR invalid Action type. "+
+ contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you."
+ errInvalidActionType = NewExitError("ERROR invalid Action type. "+
fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+
fmt.Sprintf("See %s", appActionDeprecationURL), 2)
)
@@ -41,7 +39,7 @@ type App struct {
// Description of the program
Description string
// List of commands to execute
- Commands []Command
+ Commands []*Command
// List of flags to parse
Flags []Flag
// Boolean to enable bash completion commands
@@ -50,9 +48,9 @@ type App struct {
HideHelp bool
// Boolean to hide built-in version flag and the VERSION section of help
HideVersion bool
- // Populate on app startup, only gettable through method Categories()
+ // categories contains the categorized commands and is populated on app startup
categories CommandCategories
- // An action to execute when the bash-completion flag is set
+ // An action to execute when the shell completion flag is set
BashComplete BashCompleteFunc
// An action to execute before any subcommands are run, but after the context is ready
// If a non-nil error is returned, no subcommands are run
@@ -60,12 +58,8 @@ type App struct {
// An action to execute after any subcommands are run, but after the subcommand has finished
// It is run even if Action() panics
After AfterFunc
-
// The action to execute when no subcommands are specified
- // Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}`
- // *Note*: support for the deprecated `Action` signature will be removed in a future version
- Action interface{}
-
+ Action ActionFunc
// Execute this function if the proper command cannot be found
CommandNotFound CommandNotFoundFunc
// Execute this function if an usage error occurs
@@ -73,13 +67,9 @@ type App struct {
// Compilation date
Compiled time.Time
// List of all authors who contributed
- Authors []Author
+ Authors []*Author
// Copyright of the binary if any
Copyright string
- // Name of Author (Note: Use App.Authors, this is deprecated)
- Author string
- // Email of Author (Note: Use App.Authors, this is deprecated)
- Email string
// Writer writer to write output to
Writer io.Writer
// ErrWriter writes error output
@@ -96,7 +86,7 @@ type App struct {
// render custom help text by setting this variable.
CustomAppHelpTemplate string
// Boolean to enable short-option handling so user can combine several
- // single-character bool arguements into one
+ // single-character bool arguments into one
// i.e. foobar -o -v -> foobar -ov
UseShortOptionHandling bool
@@ -121,7 +111,6 @@ func NewApp() *App {
HelpName: filepath.Base(os.Args[0]),
Usage: "A new cli application",
UsageText: "",
- Version: "0.0.0",
BashComplete: DefaultAppComplete,
Action: helpCommand.Action,
Compiled: compileTime(),
@@ -139,22 +128,52 @@ func (a *App) Setup() {
a.didSetup = true
- if a.Author != "" || a.Email != "" {
- a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email})
+ if a.Name == "" {
+ a.Name = filepath.Base(os.Args[0])
}
- var newCmds []Command
+ if a.HelpName == "" {
+ a.HelpName = filepath.Base(os.Args[0])
+ }
+
+ if a.Usage == "" {
+ a.Usage = "A new cli application"
+ }
+
+ if a.Version == "" {
+ a.HideVersion = true
+ }
+
+ if a.BashComplete == nil {
+ a.BashComplete = DefaultAppComplete
+ }
+
+ if a.Action == nil {
+ a.Action = helpCommand.Action
+ }
+
+ if a.Compiled == (time.Time{}) {
+ a.Compiled = compileTime()
+ }
+
+ if a.Writer == nil {
+ a.Writer = os.Stdout
+ }
+
+ var newCommands []*Command
+
for _, c := range a.Commands {
if c.HelpName == "" {
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
}
- newCmds = append(newCmds, c)
+ newCommands = append(newCommands, c)
}
- a.Commands = newCmds
+ a.Commands = newCommands
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
- a.Commands = append(a.Commands, helpCommand)
- if (HelpFlag != BoolFlag{}) {
+ a.appendCommand(helpCommand)
+
+ if HelpFlag != nil {
a.appendFlag(HelpFlag)
}
}
@@ -163,11 +182,11 @@ func (a *App) Setup() {
a.appendFlag(VersionFlag)
}
- a.categories = CommandCategories{}
+ a.categories = newCommandCategories()
for _, command := range a.Commands {
- a.categories = a.categories.AddCommand(command.Category, command)
+ a.categories.AddCommand(command.Category, command)
}
- sort.Sort(a.categories)
+ sort.Sort(a.categories.(*commandCategories))
if a.Metadata == nil {
a.Metadata = make(map[string]interface{})
@@ -189,6 +208,13 @@ func (a *App) useShortOptionHandling() bool {
// Run is the entry point to the cli app. Parses the arguments slice and routes
// to the proper flag/args combination
func (a *App) Run(arguments []string) (err error) {
+ return a.RunContext(context.Background(), arguments)
+}
+
+// RunContext is like Run except it takes a Context that will be
+// passed to its commands and sub-commands. Through this, you can
+// propagate timeouts and cancellation requests
+func (a *App) RunContext(ctx context.Context, arguments []string) (err error) {
a.Setup()
// handle the completion flag separately from the flagset since
@@ -204,9 +230,9 @@ func (a *App) Run(arguments []string) (err error) {
return err
}
- err = parseIter(set, a, arguments[1:])
+ err = parseIter(set, a, arguments[1:], shellComplete)
nerr := normalizeFlags(a.Flags, set)
- context := NewContext(a, set, nil)
+ context := NewContext(a, set, &Context{Context: ctx})
if nerr != nil {
_, _ = fmt.Fprintln(a.Writer, nerr)
_ = ShowAppHelp(context)
@@ -249,7 +275,7 @@ func (a *App) Run(arguments []string) (err error) {
defer func() {
if afterErr := a.After(context); afterErr != nil {
if err != nil {
- err = NewMultiError(err, afterErr)
+ err = newMultiError(err, afterErr)
} else {
err = afterErr
}
@@ -282,7 +308,7 @@ func (a *App) Run(arguments []string) (err error) {
}
// Run default Action
- err = HandleAction(a.Action, context)
+ err = a.Action(context)
a.handleExitCoder(context, err)
return err
@@ -303,17 +329,20 @@ func (a *App) RunAndExitOnError() {
// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to
// generate command-specific flags
func (a *App) RunAsSubcommand(ctx *Context) (err error) {
+ a.Setup()
+
// append help to commands
if len(a.Commands) > 0 {
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
- a.Commands = append(a.Commands, helpCommand)
- if (HelpFlag != BoolFlag{}) {
+ a.appendCommand(helpCommand)
+
+ if HelpFlag != nil {
a.appendFlag(HelpFlag)
}
}
}
- newCmds := []Command{}
+ var newCmds []*Command
for _, c := range a.Commands {
if c.HelpName == "" {
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
@@ -327,7 +356,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
return err
}
- err = parseIter(set, a, ctx.Args().Tail())
+ err = parseIter(set, a, ctx.Args().Tail(), ctx.shellComplete)
nerr := normalizeFlags(a.Flags, set)
context := NewContext(a, set, ctx)
@@ -379,7 +408,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
if afterErr != nil {
a.handleExitCoder(context, err)
if err != nil {
- err = NewMultiError(err, afterErr)
+ err = newMultiError(err, afterErr)
} else {
err = afterErr
}
@@ -406,7 +435,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
}
// Run default Action
- err = HandleAction(a.Action, context)
+ err = a.Action(context)
a.handleExitCoder(context, err)
return err
@@ -416,28 +445,21 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
func (a *App) Command(name string) *Command {
for _, c := range a.Commands {
if c.HasName(name) {
- return &c
+ return c
}
}
return nil
}
-// Categories returns a slice containing all the categories with the commands they contain
-func (a *App) Categories() CommandCategories {
- return a.categories
-}
-
// VisibleCategories returns a slice of categories and commands that are
// Hidden=false
-func (a *App) VisibleCategories() []*CommandCategory {
- ret := []*CommandCategory{}
- for _, category := range a.categories {
- if visible := func() *CommandCategory {
- for _, command := range category.Commands {
- if !command.Hidden {
- return category
- }
+func (a *App) VisibleCategories() []CommandCategory {
+ ret := []CommandCategory{}
+ for _, category := range a.categories.Categories() {
+ if visible := func() CommandCategory {
+ if len(category.VisibleCommands()) > 0 {
+ return category
}
return nil
}(); visible != nil {
@@ -448,8 +470,8 @@ func (a *App) VisibleCategories() []*CommandCategory {
}
// VisibleCommands returns a slice of the Commands with Hidden=false
-func (a *App) VisibleCommands() []Command {
- var ret []Command
+func (a *App) VisibleCommands() []*Command {
+ var ret []*Command
for _, command := range a.Commands {
if !command.Hidden {
ret = append(ret, command)
@@ -465,7 +487,7 @@ func (a *App) VisibleFlags() []Flag {
func (a *App) hasFlag(flag Flag) bool {
for _, f := range a.Flags {
- if flag == f {
+ if reflect.DeepEqual(flag, f) {
return true
}
}
@@ -482,9 +504,15 @@ func (a *App) errWriter() io.Writer {
return a.ErrWriter
}
-func (a *App) appendFlag(flag Flag) {
- if !a.hasFlag(flag) {
- a.Flags = append(a.Flags, flag)
+func (a *App) appendFlag(fl Flag) {
+ if !hasFlag(a.Flags, fl) {
+ a.Flags = append(a.Flags, fl)
+ }
+}
+
+func (a *App) appendCommand(c *Command) {
+ if !hasCommand(a.Commands, c) {
+ a.Commands = append(a.Commands, c)
}
}
@@ -503,7 +531,7 @@ type Author struct {
}
// String makes Author comply to the Stringer interface, to allow an easy print in the templating process
-func (a Author) String() string {
+func (a *Author) String() string {
e := ""
if a.Email != "" {
e = " <" + a.Email + ">"
diff --git a/vendor/github.com/urfave/cli/appveyor.yml b/vendor/github.com/urfave/cli/v2/appveyor.yml
similarity index 96%
rename from vendor/github.com/urfave/cli/appveyor.yml
rename to vendor/github.com/urfave/cli/v2/appveyor.yml
index 8ef2fea1a6..f1cae90b59 100644
--- a/vendor/github.com/urfave/cli/appveyor.yml
+++ b/vendor/github.com/urfave/cli/v2/appveyor.yml
@@ -20,7 +20,7 @@ install:
- go version
- go env
- go get github.com/urfave/gfmrun/cmd/gfmrun
- - go mod vendor
+ - go mod tidy
build_script:
- go run build.go vet
diff --git a/vendor/github.com/urfave/cli/v2/args.go b/vendor/github.com/urfave/cli/v2/args.go
new file mode 100644
index 0000000000..bd65c17bde
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/args.go
@@ -0,0 +1,54 @@
+package cli
+
+type Args interface {
+ // Get returns the nth argument, or else a blank string
+ Get(n int) string
+ // First returns the first argument, or else a blank string
+ First() string
+ // Tail returns the rest of the arguments (not the first one)
+ // or else an empty string slice
+ Tail() []string
+ // Len returns the length of the wrapped slice
+ Len() int
+ // Present checks if there are any arguments present
+ Present() bool
+ // Slice returns a copy of the internal slice
+ Slice() []string
+}
+
+type args []string
+
+func (a *args) Get(n int) string {
+ if len(*a) > n {
+ return (*a)[n]
+ }
+ return ""
+}
+
+func (a *args) First() string {
+ return a.Get(0)
+}
+
+func (a *args) Tail() []string {
+ if a.Len() >= 2 {
+ tail := []string((*a)[1:])
+ ret := make([]string, len(tail))
+ copy(ret, tail)
+ return ret
+ }
+ return []string{}
+}
+
+func (a *args) Len() int {
+ return len(*a)
+}
+
+func (a *args) Present() bool {
+ return a.Len() != 0
+}
+
+func (a *args) Slice() []string {
+ ret := make([]string, len(*a))
+ copy(ret, *a)
+ return ret
+}
diff --git a/vendor/github.com/urfave/cli/v2/category.go b/vendor/github.com/urfave/cli/v2/category.go
new file mode 100644
index 0000000000..867e3908ca
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/category.go
@@ -0,0 +1,79 @@
+package cli
+
+// CommandCategories interface allows for category manipulation
+type CommandCategories interface {
+ // AddCommand adds a command to a category, creating a new category if necessary.
+ AddCommand(category string, command *Command)
+ // categories returns a copy of the category slice
+ Categories() []CommandCategory
+}
+
+type commandCategories []*commandCategory
+
+func newCommandCategories() CommandCategories {
+ ret := commandCategories([]*commandCategory{})
+ return &ret
+}
+
+func (c *commandCategories) Less(i, j int) bool {
+ return lexicographicLess((*c)[i].Name(), (*c)[j].Name())
+}
+
+func (c *commandCategories) Len() int {
+ return len(*c)
+}
+
+func (c *commandCategories) Swap(i, j int) {
+ (*c)[i], (*c)[j] = (*c)[j], (*c)[i]
+}
+
+func (c *commandCategories) AddCommand(category string, command *Command) {
+ for _, commandCategory := range []*commandCategory(*c) {
+ if commandCategory.name == category {
+ commandCategory.commands = append(commandCategory.commands, command)
+ return
+ }
+ }
+ newVal := append(*c,
+ &commandCategory{name: category, commands: []*Command{command}})
+ *c = newVal
+}
+
+func (c *commandCategories) Categories() []CommandCategory {
+ ret := make([]CommandCategory, len(*c))
+ for i, cat := range *c {
+ ret[i] = cat
+ }
+ return ret
+}
+
+// CommandCategory is a category containing commands.
+type CommandCategory interface {
+ // Name returns the category name string
+ Name() string
+ // VisibleCommands returns a slice of the Commands with Hidden=false
+ VisibleCommands() []*Command
+}
+
+type commandCategory struct {
+ name string
+ commands []*Command
+}
+
+func (c *commandCategory) Name() string {
+ return c.name
+}
+
+func (c *commandCategory) VisibleCommands() []*Command {
+ if c.commands == nil {
+ c.commands = []*Command{}
+ }
+
+ var ret []*Command
+ for _, command := range c.commands {
+ if !command.Hidden {
+ ret = append(ret, command)
+ }
+ }
+ return ret
+}
diff --git a/vendor/github.com/urfave/cli/cli.go b/vendor/github.com/urfave/cli/v2/cli.go
similarity index 67%
rename from vendor/github.com/urfave/cli/cli.go
rename to vendor/github.com/urfave/cli/v2/cli.go
index 4bd2508392..62a5bc22d2 100644
--- a/vendor/github.com/urfave/cli/cli.go
+++ b/vendor/github.com/urfave/cli/v2/cli.go
@@ -2,18 +2,19 @@
// Go applications. cli is designed to be easy to understand and write, the most simple
// cli application can be written as follows:
// func main() {
-// cli.NewApp().Run(os.Args)
+// (&cli.App{}).Run(os.Args)
// }
//
// Of course this application does not do much, so let's make this an actual application:
// func main() {
-// app := cli.NewApp()
-// app.Name = "greet"
-// app.Usage = "say a greeting"
-// app.Action = func(c *cli.Context) error {
-// println("Greetings")
-// return nil
-// }
+// app := &cli.App{
+// Name: "greet",
+// Usage: "say a greeting",
+// Action: func(c *cli.Context) error {
+// fmt.Println("Greetings")
+// return nil
+// },
+// }
//
// app.Run(os.Args)
// }
diff --git a/vendor/github.com/urfave/cli/command.go b/vendor/github.com/urfave/cli/v2/command.go
similarity index 57%
rename from vendor/github.com/urfave/cli/command.go
rename to vendor/github.com/urfave/cli/v2/command.go
index e7cb97a6af..db6c8024ba 100644
--- a/vendor/github.com/urfave/cli/command.go
+++ b/vendor/github.com/urfave/cli/v2/command.go
@@ -11,8 +11,6 @@ import (
type Command struct {
// The name of the command
Name string
- // short name of the command. Typically one character (deprecated, use `Aliases`)
- ShortName string
// A list of aliases for the command
Aliases []string
// A short description of the usage of this command
@@ -34,23 +32,15 @@ type Command struct {
// It is run even if Action() panics
After AfterFunc
// The function to call when this command is invoked
- Action interface{}
- // TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind
- // of deprecation period has passed, maybe?
-
+ Action ActionFunc
// Execute this function if a usage error occurs.
OnUsageError OnUsageErrorFunc
// List of child commands
- Subcommands Commands
+ Subcommands []*Command
// List of flags to parse
Flags []Flag
// Treat all flags as normal arguments if true
SkipFlagParsing bool
- // Skip argument reordering which attempts to move flags before arguments,
- // but only works if all flags appear after all arguments. This behavior was
- // removed n version 2 since it only works under specific conditions so we
- // backport here by exposing it as an option for compatibility.
- SkipArgReorder bool
// Boolean to hide built-in help command
HideHelp bool
// Boolean to hide this command from help or completion
@@ -70,7 +60,9 @@ type Command struct {
CustomHelpTemplate string
}
-type CommandsByName []Command
+type Commands []*Command
+
+type CommandsByName []*Command
func (c CommandsByName) Len() int {
return len(c)
@@ -86,35 +78,29 @@ func (c CommandsByName) Swap(i, j int) {
// FullName returns the full name of the command.
// For subcommands this ensures that parent commands are part of the command path
-func (c Command) FullName() string {
+func (c *Command) FullName() string {
if c.commandNamePath == nil {
return c.Name
}
return strings.Join(c.commandNamePath, " ")
}
-// Commands is a slice of Command
-type Commands []Command
-
// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags
-func (c Command) Run(ctx *Context) (err error) {
+func (c *Command) Run(ctx *Context) (err error) {
if len(c.Subcommands) > 0 {
return c.startApp(ctx)
}
- if !c.HideHelp && (HelpFlag != BoolFlag{}) {
+ if !c.HideHelp && HelpFlag != nil {
// append help to flags
- c.Flags = append(
- c.Flags,
- HelpFlag,
- )
+ c.appendFlag(HelpFlag)
}
if ctx.App.UseShortOptionHandling {
c.UseShortOptionHandling = true
}
- set, err := c.parseFlags(ctx.Args().Tail())
+ set, err := c.parseFlags(ctx.Args(), ctx.shellComplete)
context := NewContext(ctx.App, set, ctx)
context.Command = c
@@ -124,7 +110,7 @@ func (c Command) Run(ctx *Context) (err error) {
if err != nil {
if c.OnUsageError != nil {
- err := c.OnUsageError(context, err, false)
+ err = c.OnUsageError(context, err, false)
context.App.handleExitCoder(context, err)
return err
}
@@ -150,7 +136,7 @@ func (c Command) Run(ctx *Context) (err error) {
if afterErr != nil {
context.App.handleExitCoder(context, err)
if err != nil {
- err = NewMultiError(err, afterErr)
+ err = newMultiError(err, afterErr)
} else {
err = afterErr
}
@@ -171,7 +157,8 @@ func (c Command) Run(ctx *Context) (err error) {
c.Action = helpSubcommand.Action
}
- err = HandleAction(c.Action, context)
+ context.Command = c
+ err = c.Action(context)
if err != nil {
context.App.handleExitCoder(context, err)
@@ -179,26 +166,25 @@ func (c Command) Run(ctx *Context) (err error) {
return err
}
-func (c *Command) parseFlags(args Args) (*flag.FlagSet, error) {
- if c.SkipFlagParsing {
- set, err := c.newFlagSet()
- if err != nil {
- return nil, err
- }
+func (c *Command) newFlagSet() (*flag.FlagSet, error) {
+ return flagSet(c.Name, c.Flags)
+}
- return set, set.Parse(append([]string{"--"}, args...))
- }
-
- if !c.SkipArgReorder {
- args = reorderArgs(c.Flags, args)
- }
+func (c *Command) useShortOptionHandling() bool {
+ return c.UseShortOptionHandling
+}
+func (c *Command) parseFlags(args Args, shellComplete bool) (*flag.FlagSet, error) {
set, err := c.newFlagSet()
if err != nil {
return nil, err
}
- err = parseIter(set, c, args)
+ if c.SkipFlagParsing {
+ return set, set.Parse(append([]string{"--"}, args.Tail()...))
+ }
+
+ err = parseIter(set, c, args.Tail(), shellComplete)
if err != nil {
return nil, err
}
@@ -211,96 +197,13 @@ func (c *Command) parseFlags(args Args) (*flag.FlagSet, error) {
return set, nil
}
-func (c *Command) newFlagSet() (*flag.FlagSet, error) {
- return flagSet(c.Name, c.Flags)
-}
-
-func (c *Command) useShortOptionHandling() bool {
- return c.UseShortOptionHandling
-}
-
-// reorderArgs moves all flags (via reorderedArgs) before the rest of
-// the arguments (remainingArgs) as this is what flag expects.
-func reorderArgs(commandFlags []Flag, args []string) []string {
- var remainingArgs, reorderedArgs []string
-
- nextIndexMayContainValue := false
- for i, arg := range args {
-
- // dont reorder any args after a --
- // read about -- here:
- // https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean-also-known-as-bare-double-dash
- if arg == "--" {
- remainingArgs = append(remainingArgs, args[i:]...)
- break
-
- // checks if this arg is a value that should be re-ordered next to its associated flag
- } else if nextIndexMayContainValue && !strings.HasPrefix(arg, "-") {
- nextIndexMayContainValue = false
- reorderedArgs = append(reorderedArgs, arg)
-
- // checks if this is an arg that should be re-ordered
- } else if argIsFlag(commandFlags, arg) {
- // we have determined that this is a flag that we should re-order
- reorderedArgs = append(reorderedArgs, arg)
- // if this arg does not contain a "=", then the next index may contain the value for this flag
- nextIndexMayContainValue = !strings.Contains(arg, "=")
-
- // simply append any remaining args
- } else {
- remainingArgs = append(remainingArgs, arg)
- }
- }
-
- return append(reorderedArgs, remainingArgs...)
-}
-
-// argIsFlag checks if an arg is one of our command flags
-func argIsFlag(commandFlags []Flag, arg string) bool {
- // checks if this is just a `-`, and so definitely not a flag
- if arg == "-" {
- return false
- }
- // flags always start with a -
- if !strings.HasPrefix(arg, "-") {
- return false
- }
- // this line turns `--flag` into `flag`
- if strings.HasPrefix(arg, "--") {
- arg = strings.Replace(arg, "-", "", 2)
- }
- // this line turns `-flag` into `flag`
- if strings.HasPrefix(arg, "-") {
- arg = strings.Replace(arg, "-", "", 1)
- }
- // this line turns `flag=value` into `flag`
- arg = strings.Split(arg, "=")[0]
- // look through all the flags, to see if the `arg` is one of our flags
- for _, flag := range commandFlags {
- for _, key := range strings.Split(flag.GetName(), ",") {
- key := strings.TrimSpace(key)
- if key == arg {
- return true
- }
- }
- }
- // return false if this arg was not one of our flags
- return false
-}
-
// Names returns the names including short names and aliases.
-func (c Command) Names() []string {
- names := []string{c.Name}
-
- if c.ShortName != "" {
- names = append(names, c.ShortName)
- }
-
- return append(names, c.Aliases...)
+func (c *Command) Names() []string {
+ return append([]string{c.Name}, c.Aliases...)
}
-// HasName returns true if Command.Name or Command.ShortName matches given name
-func (c Command) HasName(name string) bool {
+// HasName returns true if Command.Name matches given name
+func (c *Command) HasName(name string) bool {
for _, n := range c.Names() {
if n == name {
return true
@@ -309,12 +212,12 @@ func (c Command) HasName(name string) bool {
return false
}
-func (c Command) startApp(ctx *Context) error {
- app := NewApp()
- app.Metadata = ctx.App.Metadata
- app.ExitErrHandler = ctx.App.ExitErrHandler
- // set the name and usage
- app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name)
+func (c *Command) startApp(ctx *Context) error {
+ app := &App{
+ Metadata: ctx.App.Metadata,
+ Name: fmt.Sprintf("%s %s", ctx.App.Name, c.Name),
+ }
+
if c.HelpName == "" {
app.HelpName = c.HelpName
} else {
@@ -337,18 +240,17 @@ func (c Command) startApp(ctx *Context) error {
app.Version = ctx.App.Version
app.HideVersion = ctx.App.HideVersion
app.Compiled = ctx.App.Compiled
- app.Author = ctx.App.Author
- app.Email = ctx.App.Email
app.Writer = ctx.App.Writer
app.ErrWriter = ctx.App.ErrWriter
+ app.ExitErrHandler = ctx.App.ExitErrHandler
app.UseShortOptionHandling = ctx.App.UseShortOptionHandling
- app.categories = CommandCategories{}
+ app.categories = newCommandCategories()
for _, command := range c.Subcommands {
- app.categories = app.categories.AddCommand(command.Category, command)
+ app.categories.AddCommand(command.Category, command)
}
- sort.Sort(app.categories)
+ sort.Sort(app.categories.(*commandCategories))
// bash completion
app.EnableBashCompletion = ctx.App.EnableBashCompletion
@@ -374,6 +276,22 @@ func (c Command) startApp(ctx *Context) error {
}
// VisibleFlags returns a slice of the Flags with Hidden=false
-func (c Command) VisibleFlags() []Flag {
+func (c *Command) VisibleFlags() []Flag {
return visibleFlags(c.Flags)
}
+
+func (c *Command) appendFlag(fl Flag) {
+ if !hasFlag(c.Flags, fl) {
+ c.Flags = append(c.Flags, fl)
+ }
+}
+
+func hasCommand(commands []*Command, command *Command) bool {
+ for _, existing := range commands {
+ if command == existing {
+ return true
+ }
+ }
+
+ return false
+}
diff --git a/vendor/github.com/urfave/cli/v2/context.go b/vendor/github.com/urfave/cli/v2/context.go
new file mode 100644
index 0000000000..c0c526f411
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/context.go
@@ -0,0 +1,274 @@
+package cli
+
+import (
+ "context"
+ "errors"
+ "flag"
+ "fmt"
+ "strings"
+)
+
+// Context is a type that is passed through to
+// each Handler action in a cli application. Context
+// can be used to retrieve context-specific args and
+// parsed command-line options.
+type Context struct {
+ context.Context
+ App *App
+ Command *Command
+ shellComplete bool
+ setFlags map[string]bool
+ flagSet *flag.FlagSet
+ parentContext *Context
+}
+
+// NewContext creates a new context. For use in when invoking an App or Command action.
+func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context {
+ c := &Context{App: app, flagSet: set, parentContext: parentCtx}
+ if parentCtx != nil {
+ c.Context = parentCtx.Context
+ c.shellComplete = parentCtx.shellComplete
+ if parentCtx.flagSet == nil {
+ parentCtx.flagSet = &flag.FlagSet{}
+ }
+ }
+
+ c.Command = &Command{}
+
+ if c.Context == nil {
+ c.Context = context.Background()
+ }
+
+ return c
+}
+
+// NumFlags returns the number of flags set
+func (c *Context) NumFlags() int {
+ return c.flagSet.NFlag()
+}
+
+// Set sets a context flag to a value.
+func (c *Context) Set(name, value string) error {
+ return c.flagSet.Set(name, value)
+}
+
+// IsSet determines if the flag was actually set
+func (c *Context) IsSet(name string) bool {
+ if fs := lookupFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
+ isSet := false
+ fs.Visit(func(f *flag.Flag) {
+ if f.Name == name {
+ isSet = true
+ }
+ })
+ if isSet {
+ return true
+ }
+ }
+
+ f := lookupFlag(name, c)
+ if f == nil {
+ return false
+ }
+
+ return f.IsSet()
+ }
+
+ return false
+}
+
+// LocalFlagNames returns a slice of flag names used in this context.
+func (c *Context) LocalFlagNames() []string {
+ var names []string
+ c.flagSet.Visit(makeFlagNameVisitor(&names))
+ return names
+}
+
+// FlagNames returns a slice of flag names used by the this context and all of
+// its parent contexts.
+func (c *Context) FlagNames() []string {
+ var names []string
+ for _, ctx := range c.Lineage() {
+ ctx.flagSet.Visit(makeFlagNameVisitor(&names))
+ }
+ return names
+}
+
+// Lineage returns *this* context and all of its ancestor contexts in order from
+// child to parent
+func (c *Context) Lineage() []*Context {
+ var lineage []*Context
+
+ for cur := c; cur != nil; cur = cur.parentContext {
+ lineage = append(lineage, cur)
+ }
+
+ return lineage
+}
+
+// Value returns the value of the flag corresponding to `name`
+func (c *Context) Value(name string) interface{} {
+ return c.flagSet.Lookup(name).Value.(flag.Getter).Get()
+}
+
+// Args returns the command line arguments associated with the context.
+func (c *Context) Args() Args {
+ ret := args(c.flagSet.Args())
+ return &ret
+}
+
+// NArg returns the number of the command line arguments.
+func (c *Context) NArg() int {
+ return c.Args().Len()
+}
+
+func lookupFlag(name string, ctx *Context) Flag {
+ for _, c := range ctx.Lineage() {
+ if c.Command == nil {
+ continue
+ }
+
+ for _, f := range c.Command.Flags {
+ for _, n := range f.Names() {
+ if n == name {
+ return f
+ }
+ }
+ }
+ }
+
+ if ctx.App != nil {
+ for _, f := range ctx.App.Flags {
+ for _, n := range f.Names() {
+ if n == name {
+ return f
+ }
+ }
+ }
+ }
+
+ return nil
+}
+
+func lookupFlagSet(name string, ctx *Context) *flag.FlagSet {
+ for _, c := range ctx.Lineage() {
+ if f := c.flagSet.Lookup(name); f != nil {
+ return c.flagSet
+ }
+ }
+
+ return nil
+}
+
+func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {
+ switch ff.Value.(type) {
+ case Serializer:
+ _ = set.Set(name, ff.Value.(Serializer).Serialize())
+ default:
+ _ = set.Set(name, ff.Value.String())
+ }
+}
+
+func normalizeFlags(flags []Flag, set *flag.FlagSet) error {
+ visited := make(map[string]bool)
+ set.Visit(func(f *flag.Flag) {
+ visited[f.Name] = true
+ })
+ for _, f := range flags {
+ parts := f.Names()
+ if len(parts) == 1 {
+ continue
+ }
+ var ff *flag.Flag
+ for _, name := range parts {
+ name = strings.Trim(name, " ")
+ if visited[name] {
+ if ff != nil {
+ return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name)
+ }
+ ff = set.Lookup(name)
+ }
+ }
+ if ff == nil {
+ continue
+ }
+ for _, name := range parts {
+ name = strings.Trim(name, " ")
+ if !visited[name] {
+ copyFlag(name, ff, set)
+ }
+ }
+ }
+ return nil
+}
+
+func makeFlagNameVisitor(names *[]string) func(*flag.Flag) {
+ return func(f *flag.Flag) {
+ nameParts := strings.Split(f.Name, ",")
+ name := strings.TrimSpace(nameParts[0])
+
+ for _, part := range nameParts {
+ part = strings.TrimSpace(part)
+ if len(part) > len(name) {
+ name = part
+ }
+ }
+
+ if name != "" {
+ *names = append(*names, name)
+ }
+ }
+}
+
+type requiredFlagsErr interface {
+ error
+ getMissingFlags() []string
+}
+
+type errRequiredFlags struct {
+ missingFlags []string
+}
+
+func (e *errRequiredFlags) Error() string {
+ numberOfMissingFlags := len(e.missingFlags)
+ if numberOfMissingFlags == 1 {
+ return fmt.Sprintf("Required flag %q not set", e.missingFlags[0])
+ }
+ joinedMissingFlags := strings.Join(e.missingFlags, ", ")
+ return fmt.Sprintf("Required flags %q not set", joinedMissingFlags)
+}
+
+func (e *errRequiredFlags) getMissingFlags() []string {
+ return e.missingFlags
+}
+
+func checkRequiredFlags(flags []Flag, context *Context) requiredFlagsErr {
+ var missingFlags []string
+ for _, f := range flags {
+ if rf, ok := f.(RequiredFlag); ok && rf.IsRequired() {
+ var flagPresent bool
+ var flagName string
+
+ for _, key := range f.Names() {
+ if len(key) > 1 {
+ flagName = key
+ }
+
+ if context.IsSet(strings.TrimSpace(key)) {
+ flagPresent = true
+ }
+ }
+
+ if !flagPresent && flagName != "" {
+ missingFlags = append(missingFlags, flagName)
+ }
+ }
+ }
+
+ if len(missingFlags) != 0 {
+ return &errRequiredFlags{missingFlags: missingFlags}
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/urfave/cli/docs.go b/vendor/github.com/urfave/cli/v2/docs.go
similarity index 91%
rename from vendor/github.com/urfave/cli/docs.go
rename to vendor/github.com/urfave/cli/v2/docs.go
index 5b94566128..dc16fc82d4 100644
--- a/vendor/github.com/urfave/cli/docs.go
+++ b/vendor/github.com/urfave/cli/v2/docs.go
@@ -48,15 +48,14 @@ func (a *App) writeDocTemplate(w io.Writer) error {
return t.ExecuteTemplate(w, name, &cliTemplate{
App: a,
Commands: prepareCommands(a.Commands, 0),
- GlobalArgs: prepareArgsWithValues(a.Flags),
- SynopsisArgs: prepareArgsSynopsis(a.Flags),
+ GlobalArgs: prepareArgsWithValues(a.VisibleFlags()),
+ SynopsisArgs: prepareArgsSynopsis(a.VisibleFlags()),
})
}
-func prepareCommands(commands []Command, level int) []string {
- coms := []string{}
- for i := range commands {
- command := &commands[i]
+func prepareCommands(commands []*Command, level int) []string {
+ var coms []string
+ for _, command := range commands {
if command.Hidden {
continue
}
@@ -110,7 +109,8 @@ func prepareFlags(
continue
}
modifiedArg := opener
- for _, s := range strings.Split(flag.GetName(), ",") {
+
+ for _, s := range flag.Names() {
trimmed := strings.TrimSpace(s)
if len(modifiedArg) > len(opener) {
modifiedArg += sep
diff --git a/vendor/github.com/urfave/cli/errors.go b/vendor/github.com/urfave/cli/v2/errors.go
similarity index 62%
rename from vendor/github.com/urfave/cli/errors.go
rename to vendor/github.com/urfave/cli/v2/errors.go
index 562b2953cf..344b4361e9 100644
--- a/vendor/github.com/urfave/cli/errors.go
+++ b/vendor/github.com/urfave/cli/v2/errors.go
@@ -15,25 +15,40 @@ var OsExiter = os.Exit
var ErrWriter io.Writer = os.Stderr
// MultiError is an error that wraps multiple errors.
-type MultiError struct {
- Errors []error
+type MultiError interface {
+ error
+ // Errors returns a copy of the errors slice
+ Errors() []error
}
// NewMultiError creates a new MultiError. Pass in one or more errors.
-func NewMultiError(err ...error) MultiError {
- return MultiError{Errors: err}
+func newMultiError(err ...error) MultiError {
+ ret := multiError(err)
+ return &ret
}
+type multiError []error
+
// Error implements the error interface.
-func (m MultiError) Error() string {
- errs := make([]string, len(m.Errors))
- for i, err := range m.Errors {
+func (m *multiError) Error() string {
+ errs := make([]string, len(*m))
+ for i, err := range *m {
errs[i] = err.Error()
}
return strings.Join(errs, "\n")
}
+// Errors returns a copy of the errors slice
+func (m *multiError) Errors() []error {
+ errs := make([]error, len(*m))
+ for _, err := range *m {
+ errs = append(errs, err)
+ }
+ return errs
+}
+
+// ErrorFormatter is the interface that will suitably format the error output
type ErrorFormatter interface {
Format(s fmt.State, verb rune)
}
@@ -45,29 +60,30 @@ type ExitCoder interface {
ExitCode() int
}
-// ExitError fulfills both the builtin `error` interface and `ExitCoder`
-type ExitError struct {
+type exitError struct {
exitCode int
message interface{}
}
-// NewExitError makes a new *ExitError
-func NewExitError(message interface{}, exitCode int) *ExitError {
- return &ExitError{
- exitCode: exitCode,
+// NewExitError makes a new *exitError
+func NewExitError(message interface{}, exitCode int) ExitCoder {
+ return Exit(message, exitCode)
+}
+
+// Exit wraps a message and exit code into an ExitCoder suitable for handling by
+// HandleExitCoder
+func Exit(message interface{}, exitCode int) ExitCoder {
+ return &exitError{
message: message,
+ exitCode: exitCode,
}
}
-// Error returns the string message, fulfilling the interface required by
-// `error`
-func (ee *ExitError) Error() string {
+func (ee *exitError) Error() string {
return fmt.Sprintf("%v", ee.message)
}
-// ExitCode returns the exit code, fulfilling the interface required by
-// `ExitCoder`
-func (ee *ExitError) ExitCode() int {
+func (ee *exitError) ExitCode() int {
return ee.exitCode
}
@@ -83,9 +99,9 @@ func HandleExitCoder(err error) {
if exitErr, ok := err.(ExitCoder); ok {
if err.Error() != "" {
if _, ok := exitErr.(ErrorFormatter); ok {
- fmt.Fprintf(ErrWriter, "%+v\n", err)
+ _, _ = fmt.Fprintf(ErrWriter, "%+v\n", err)
} else {
- fmt.Fprintln(ErrWriter, err)
+ _, _ = fmt.Fprintln(ErrWriter, err)
}
}
OsExiter(exitErr.ExitCode())
@@ -101,10 +117,10 @@ func HandleExitCoder(err error) {
func handleMultiError(multiErr MultiError) int {
code := 1
- for _, merr := range multiErr.Errors {
+ for _, merr := range multiErr.Errors() {
if multiErr2, ok := merr.(MultiError); ok {
code = handleMultiError(multiErr2)
- } else {
+ } else if merr != nil {
fmt.Fprintln(ErrWriter, merr)
if exitErr, ok := merr.(ExitCoder); ok {
code = exitErr.ExitCode()
diff --git a/vendor/github.com/urfave/cli/fish.go b/vendor/github.com/urfave/cli/v2/fish.go
similarity index 93%
rename from vendor/github.com/urfave/cli/fish.go
rename to vendor/github.com/urfave/cli/v2/fish.go
index cf183af611..67122c9fe7 100644
--- a/vendor/github.com/urfave/cli/fish.go
+++ b/vendor/github.com/urfave/cli/v2/fish.go
@@ -64,11 +64,9 @@ func (a *App) writeFishCompletionTemplate(w io.Writer) error {
})
}
-func (a *App) prepareFishCommands(commands []Command, allCommands *[]string, previousCommands []string) []string {
+func (a *App) prepareFishCommands(commands []*Command, allCommands *[]string, previousCommands []string) []string {
completions := []string{}
- for i := range commands {
- command := &commands[i]
-
+ for _, command := range commands {
if command.Hidden {
continue
}
@@ -131,7 +129,7 @@ func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string
fishAddFileFlag(f, completion)
- for idx, opt := range strings.Split(flag.GetName(), ",") {
+ for idx, opt := range flag.Names() {
if idx == 0 {
completion.WriteString(fmt.Sprintf(
" -l %s", strings.TrimSpace(opt),
@@ -161,15 +159,15 @@ func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string
func fishAddFileFlag(flag Flag, completion *strings.Builder) {
switch f := flag.(type) {
- case GenericFlag:
+ case *GenericFlag:
if f.TakesFile {
return
}
- case StringFlag:
+ case *StringFlag:
if f.TakesFile {
return
}
- case StringSliceFlag:
+ case *StringSliceFlag:
if f.TakesFile {
return
}
diff --git a/vendor/github.com/urfave/cli/flag.go b/vendor/github.com/urfave/cli/v2/flag.go
similarity index 55%
rename from vendor/github.com/urfave/cli/flag.go
rename to vendor/github.com/urfave/cli/v2/flag.go
index 1cfa1cdb21..ec128fd440 100644
--- a/vendor/github.com/urfave/cli/flag.go
+++ b/vendor/github.com/urfave/cli/v2/flag.go
@@ -5,38 +5,53 @@ import (
"fmt"
"io/ioutil"
"reflect"
+ "regexp"
"runtime"
"strconv"
"strings"
"syscall"
+ "time"
)
const defaultPlaceholder = "value"
+var (
+ slPfx = fmt.Sprintf("sl:::%d:::", time.Now().UTC().UnixNano())
+
+ commaWhitespace = regexp.MustCompile("[, ]+.*")
+)
+
// BashCompletionFlag enables bash-completion for all commands and subcommands
-var BashCompletionFlag Flag = BoolFlag{
+var BashCompletionFlag Flag = &BoolFlag{
Name: "generate-bash-completion",
Hidden: true,
}
// VersionFlag prints the version for the application
-var VersionFlag Flag = BoolFlag{
- Name: "version, v",
- Usage: "print the version",
+var VersionFlag Flag = &BoolFlag{
+ Name: "version",
+ Aliases: []string{"v"},
+ Usage: "print the version",
}
-// HelpFlag prints the help for all commands and subcommands
-// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
-// unless HideHelp is set to true)
-var HelpFlag Flag = BoolFlag{
- Name: "help, h",
- Usage: "show help",
+// HelpFlag prints the help for all commands and subcommands.
+// Set to nil to disable the flag. The subcommand
+// will still be added unless HideHelp is set to true.
+var HelpFlag Flag = &BoolFlag{
+ Name: "help",
+ Aliases: []string{"h"},
+ Usage: "show help",
}
// FlagStringer converts a flag definition to a string. This is used by help
// to display a flag.
var FlagStringer FlagStringFunc = stringifyFlag
+// Serializer is used to circumvent the limitations of flag.FlagSet.Set
+type Serializer interface {
+ Serialize() string
+}
+
// FlagNamePrefixer converts a full flag name and its placeholder into the help
// message flag prefix. This is used by the default FlagStringer.
var FlagNamePrefixer FlagNamePrefixFunc = prefixedNames
@@ -57,7 +72,12 @@ func (f FlagsByName) Len() int {
}
func (f FlagsByName) Less(i, j int) bool {
- return lexicographicLess(f[i].GetName(), f[j].GetName())
+ if len(f[j].Names()) == 0 {
+ return false
+ } else if len(f[i].Names()) == 0 {
+ return true
+ }
+ return lexicographicLess(f[i].Names()[0], f[j].Names()[0])
}
func (f FlagsByName) Swap(i, j int) {
@@ -70,8 +90,9 @@ func (f FlagsByName) Swap(i, j int) {
type Flag interface {
fmt.Stringer
// Apply Flag settings to the given flag set
- Apply(*flag.FlagSet)
- GetName() string
+ Apply(*flag.FlagSet) error
+ Names() []string
+ IsSet() bool
}
// RequiredFlag is an interface that allows us to mark flags as required
@@ -97,40 +118,18 @@ type DocGenerationFlag interface {
GetValue() string
}
-// errorableFlag is an interface that allows us to return errors during apply
-// it allows flags defined in this library to return errors in a fashion backwards compatible
-// TODO remove in v2 and modify the existing Flag interface to return errors
-type errorableFlag interface {
- Flag
-
- ApplyWithError(*flag.FlagSet) error
-}
-
func flagSet(name string, flags []Flag) (*flag.FlagSet, error) {
set := flag.NewFlagSet(name, flag.ContinueOnError)
for _, f := range flags {
- //TODO remove in v2 when errorableFlag is removed
- if ef, ok := f.(errorableFlag); ok {
- if err := ef.ApplyWithError(set); err != nil {
- return nil, err
- }
- } else {
- f.Apply(set)
+ if err := f.Apply(set); err != nil {
+ return nil, err
}
}
set.SetOutput(ioutil.Discard)
return set, nil
}
-func eachName(longName string, fn func(string)) {
- parts := strings.Split(longName, ",")
- for _, name := range parts {
- name = strings.Trim(name, " ")
- fn(name)
- }
-}
-
func visibleFlags(fl []Flag) []Flag {
var visible []Flag
for _, f := range fl {
@@ -169,25 +168,27 @@ func unquoteUsage(usage string) (string, string) {
return "", usage
}
-func prefixedNames(fullName, placeholder string) string {
+func prefixedNames(names []string, placeholder string) string {
var prefixed string
- parts := strings.Split(fullName, ",")
- for i, name := range parts {
- name = strings.Trim(name, " ")
+ for i, name := range names {
+ if name == "" {
+ continue
+ }
+
prefixed += prefixFor(name) + name
if placeholder != "" {
prefixed += " " + placeholder
}
- if i < len(parts)-1 {
+ if i < len(names)-1 {
prefixed += ", "
}
}
return prefixed
}
-func withEnvHint(envVar, str string) string {
+func withEnvHint(envVars []string, str string) string {
envText := ""
- if envVar != "" {
+ if envVars != nil && len(envVars) > 0 {
prefix := "$"
suffix := ""
sep := ", $"
@@ -196,11 +197,51 @@ func withEnvHint(envVar, str string) string {
suffix = "%"
sep = "%, %"
}
- envText = " [" + prefix + strings.Join(strings.Split(envVar, ","), sep) + suffix + "]"
+
+ envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(envVars, sep), suffix)
}
return str + envText
}
+func flagNames(f Flag) []string {
+ var ret []string
+
+ name := flagStringField(f, "Name")
+ aliases := flagStringSliceField(f, "Aliases")
+
+ for _, part := range append([]string{name}, aliases...) {
+ // v1 -> v2 migration warning zone:
+ // Strip off anything after the first found comma or space, which
+ // *hopefully* makes it a tiny bit more obvious that unexpected behavior is
+ // caused by using the v1 form of stringly typed "Name".
+ ret = append(ret, commaWhitespace.ReplaceAllString(part, ""))
+ }
+
+ return ret
+}
+
+func flagStringSliceField(f Flag, name string) []string {
+ fv := flagValue(f)
+ field := fv.FieldByName(name)
+
+ if field.IsValid() {
+ return field.Interface().([]string)
+ }
+
+ return []string{}
+}
+
+func flagStringField(f Flag, name string) string {
+ fv := flagValue(f)
+ field := fv.FieldByName(name)
+
+ if field.IsValid() {
+ return field.String()
+ }
+
+ return ""
+}
+
func withFileHint(filePath, str string) string {
fileText := ""
if filePath != "" {
@@ -221,39 +262,27 @@ func stringifyFlag(f Flag) string {
fv := flagValue(f)
switch f.(type) {
- case IntSliceFlag:
- return FlagFileHinter(
- fv.FieldByName("FilePath").String(),
- FlagEnvHinter(
- fv.FieldByName("EnvVar").String(),
- stringifyIntSliceFlag(f.(IntSliceFlag)),
- ),
- )
- case Int64SliceFlag:
- return FlagFileHinter(
- fv.FieldByName("FilePath").String(),
- FlagEnvHinter(
- fv.FieldByName("EnvVar").String(),
- stringifyInt64SliceFlag(f.(Int64SliceFlag)),
- ),
- )
- case StringSliceFlag:
- return FlagFileHinter(
- fv.FieldByName("FilePath").String(),
- FlagEnvHinter(
- fv.FieldByName("EnvVar").String(),
- stringifyStringSliceFlag(f.(StringSliceFlag)),
- ),
- )
+ case *IntSliceFlag:
+ return withEnvHint(flagStringSliceField(f, "EnvVars"),
+ stringifyIntSliceFlag(f.(*IntSliceFlag)))
+ case *Int64SliceFlag:
+ return withEnvHint(flagStringSliceField(f, "EnvVars"),
+ stringifyInt64SliceFlag(f.(*Int64SliceFlag)))
+ case *Float64SliceFlag:
+ return withEnvHint(flagStringSliceField(f, "EnvVars"),
+ stringifyFloat64SliceFlag(f.(*Float64SliceFlag)))
+ case *StringSliceFlag:
+ return withEnvHint(flagStringSliceField(f, "EnvVars"),
+ stringifyStringSliceFlag(f.(*StringSliceFlag)))
}
placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String())
needsPlaceholder := false
defaultValueString := ""
-
- if val := fv.FieldByName("Value"); val.IsValid() {
- needsPlaceholder = true
+ val := fv.FieldByName("Value")
+ if val.IsValid() {
+ needsPlaceholder = val.Kind() != reflect.Bool
defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
if val.Kind() == reflect.String && val.String() != "" {
@@ -261,6 +290,12 @@ func stringifyFlag(f Flag) string {
}
}
+ helpText := fv.FieldByName("DefaultText")
+ if helpText.IsValid() && helpText.String() != "" {
+ needsPlaceholder = val.Kind() != reflect.Bool
+ defaultValueString = fmt.Sprintf(" (default: %s)", helpText.String())
+ }
+
if defaultValueString == " (default: )" {
defaultValueString = ""
}
@@ -271,16 +306,11 @@ func stringifyFlag(f Flag) string {
usageWithDefault := strings.TrimSpace(usage + defaultValueString)
- return FlagFileHinter(
- fv.FieldByName("FilePath").String(),
- FlagEnvHinter(
- fv.FieldByName("EnvVar").String(),
- FlagNamePrefixer(fv.FieldByName("Name").String(), placeholder)+"\t"+usageWithDefault,
- ),
- )
+ return withEnvHint(flagStringSliceField(f, "EnvVars"),
+ fmt.Sprintf("%s\t%s", prefixedNames(f.Names(), placeholder), usageWithDefault))
}
-func stringifyIntSliceFlag(f IntSliceFlag) string {
+func stringifyIntSliceFlag(f *IntSliceFlag) string {
var defaultVals []string
if f.Value != nil && len(f.Value.Value()) > 0 {
for _, i := range f.Value.Value() {
@@ -288,10 +318,10 @@ func stringifyIntSliceFlag(f IntSliceFlag) string {
}
}
- return stringifySliceFlag(f.Usage, f.Name, defaultVals)
+ return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
}
-func stringifyInt64SliceFlag(f Int64SliceFlag) string {
+func stringifyInt64SliceFlag(f *Int64SliceFlag) string {
var defaultVals []string
if f.Value != nil && len(f.Value.Value()) > 0 {
for _, i := range f.Value.Value() {
@@ -299,10 +329,22 @@ func stringifyInt64SliceFlag(f Int64SliceFlag) string {
}
}
- return stringifySliceFlag(f.Usage, f.Name, defaultVals)
+ return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
}
-func stringifyStringSliceFlag(f StringSliceFlag) string {
+func stringifyFloat64SliceFlag(f *Float64SliceFlag) string {
+ var defaultVals []string
+
+ if f.Value != nil && len(f.Value.Value()) > 0 {
+ for _, i := range f.Value.Value() {
+ defaultVals = append(defaultVals, strings.TrimRight(strings.TrimRight(fmt.Sprintf("%f", i), "0"), "."))
+ }
+ }
+
+ return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
+}
+
+func stringifyStringSliceFlag(f *StringSliceFlag) string {
var defaultVals []string
if f.Value != nil && len(f.Value.Value()) > 0 {
for _, s := range f.Value.Value() {
@@ -312,10 +354,10 @@ func stringifyStringSliceFlag(f StringSliceFlag) string {
}
}
- return stringifySliceFlag(f.Usage, f.Name, defaultVals)
+ return stringifySliceFlag(f.Usage, f.Names(), defaultVals)
}
-func stringifySliceFlag(usage, name string, defaultVals []string) string {
+func stringifySliceFlag(usage string, names, defaultVals []string) string {
placeholder, usage := unquoteUsage(usage)
if placeholder == "" {
placeholder = defaultPlaceholder
@@ -326,15 +368,25 @@ func stringifySliceFlag(usage, name string, defaultVals []string) string {
defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", "))
}
- usageWithDefault := strings.TrimSpace(usage + defaultVal)
- return FlagNamePrefixer(name, placeholder) + "\t" + usageWithDefault
+ usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal))
+ return fmt.Sprintf("%s\t%s", prefixedNames(names, placeholder), usageWithDefault)
}
-func flagFromFileEnv(filePath, envName string) (val string, ok bool) {
- for _, envVar := range strings.Split(envName, ",") {
+func hasFlag(flags []Flag, fl Flag) bool {
+ for _, existing := range flags {
+ if fl == existing {
+ return true
+ }
+ }
+
+ return false
+}
+
+func flagFromEnvOrFile(envVars []string, filePath string) (val string, ok bool) {
+ for _, envVar := range envVars {
envVar = strings.TrimSpace(envVar)
- if envVal, ok := syscall.Getenv(envVar); ok {
- return envVal, true
+ if val, ok := syscall.Getenv(envVar); ok {
+ return val, true
}
}
for _, fileVar := range strings.Split(filePath, ",") {
diff --git a/vendor/github.com/urfave/cli/flag_bool.go b/vendor/github.com/urfave/cli/v2/flag_bool.go
similarity index 51%
rename from vendor/github.com/urfave/cli/flag_bool.go
rename to vendor/github.com/urfave/cli/v2/flag_bool.go
index 2499b0b524..6a1da61efd 100644
--- a/vendor/github.com/urfave/cli/flag_bool.go
+++ b/vendor/github.com/urfave/cli/v2/flag_bool.go
@@ -9,93 +9,90 @@ import (
// BoolFlag is a flag with type bool
type BoolFlag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
+ Value bool
+ DefaultText string
Destination *bool
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *BoolFlag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f BoolFlag) String() string {
+func (f *BoolFlag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f BoolFlag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *BoolFlag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f BoolFlag) IsRequired() bool {
+func (f *BoolFlag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f BoolFlag) TakesValue() bool {
+func (f *BoolFlag) TakesValue() bool {
return false
}
// GetUsage returns the usage string for the flag
-func (f BoolFlag) GetUsage() string {
+func (f *BoolFlag) GetUsage() string {
return f.Usage
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f BoolFlag) GetValue() string {
+func (f *BoolFlag) GetValue() string {
return ""
}
+// Apply populates the flag given the flag set and environment
+func (f *BoolFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ valBool, err := strconv.ParseBool(val)
+
+ if err != nil {
+ return fmt.Errorf("could not parse %q as bool value for flag %s: %s", val, f.Name, err)
+ }
+
+ f.Value = valBool
+ f.HasBeenSet = true
+ }
+ }
+
+ for _, name := range f.Names() {
+ if f.Destination != nil {
+ set.BoolVar(f.Destination, name, f.Value, f.Usage)
+ continue
+ }
+ set.Bool(name, f.Value, f.Usage)
+ }
+
+ return nil
+}
+
// Bool looks up the value of a local BoolFlag, returns
// false if not found
func (c *Context) Bool(name string) bool {
- return lookupBool(name, c.flagSet)
-}
-
-// GlobalBool looks up the value of a global BoolFlag, returns
-// false if not found
-func (c *Context) GlobalBool(name string) bool {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupBool(name, fs)
}
return false
}
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f BoolFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error {
- val := false
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- if envVal == "" {
- val = false
- } else {
- envValBool, err := strconv.ParseBool(envVal)
- if err != nil {
- return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
- }
- val = envValBool
- }
- }
-
- eachName(f.Name, func(name string) {
- if f.Destination != nil {
- set.BoolVar(f.Destination, name, val, f.Usage)
- return
- }
- set.Bool(name, val, f.Usage)
- })
-
- return nil
-}
-
func lookupBool(name string, set *flag.FlagSet) bool {
f := set.Lookup(name)
if f != nil {
diff --git a/vendor/github.com/urfave/cli/flag_duration.go b/vendor/github.com/urfave/cli/v2/flag_duration.go
similarity index 56%
rename from vendor/github.com/urfave/cli/flag_duration.go
rename to vendor/github.com/urfave/cli/v2/flag_duration.go
index df4ade589d..2c34944a4b 100644
--- a/vendor/github.com/urfave/cli/flag_duration.go
+++ b/vendor/github.com/urfave/cli/v2/flag_duration.go
@@ -9,90 +9,89 @@ import (
// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration)
type DurationFlag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
Value time.Duration
+ DefaultText string
Destination *time.Duration
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *DurationFlag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f DurationFlag) String() string {
+func (f *DurationFlag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f DurationFlag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *DurationFlag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f DurationFlag) IsRequired() bool {
+func (f *DurationFlag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f DurationFlag) TakesValue() bool {
+func (f *DurationFlag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f DurationFlag) GetUsage() string {
+func (f *DurationFlag) GetUsage() string {
return f.Usage
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f DurationFlag) GetValue() string {
+func (f *DurationFlag) GetValue() string {
return f.Value.String()
}
+// Apply populates the flag given the flag set and environment
+func (f *DurationFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ valDuration, err := time.ParseDuration(val)
+
+ if err != nil {
+ return fmt.Errorf("could not parse %q as duration value for flag %s: %s", val, f.Name, err)
+ }
+
+ f.Value = valDuration
+ f.HasBeenSet = true
+ }
+ }
+
+ for _, name := range f.Names() {
+ if f.Destination != nil {
+ set.DurationVar(f.Destination, name, f.Value, f.Usage)
+ continue
+ }
+ set.Duration(name, f.Value, f.Usage)
+ }
+ return nil
+}
+
// Duration looks up the value of a local DurationFlag, returns
// 0 if not found
func (c *Context) Duration(name string) time.Duration {
- return lookupDuration(name, c.flagSet)
-}
-
-// GlobalDuration looks up the value of a global DurationFlag, returns
-// 0 if not found
-func (c *Context) GlobalDuration(name string) time.Duration {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupDuration(name, fs)
}
return 0
}
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f DurationFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- envValDuration, err := time.ParseDuration(envVal)
- if err != nil {
- return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err)
- }
-
- f.Value = envValDuration
- }
-
- eachName(f.Name, func(name string) {
- if f.Destination != nil {
- set.DurationVar(f.Destination, name, f.Value, f.Usage)
- return
- }
- set.Duration(name, f.Value, f.Usage)
- })
-
- return nil
-}
-
func lookupDuration(name string, set *flag.FlagSet) time.Duration {
f := set.Lookup(name)
if f != nil {
diff --git a/vendor/github.com/urfave/cli/flag_float64.go b/vendor/github.com/urfave/cli/v2/flag_float64.go
similarity index 56%
rename from vendor/github.com/urfave/cli/flag_float64.go
rename to vendor/github.com/urfave/cli/v2/flag_float64.go
index 65398d3b5c..31f06f35e5 100644
--- a/vendor/github.com/urfave/cli/flag_float64.go
+++ b/vendor/github.com/urfave/cli/v2/flag_float64.go
@@ -9,90 +9,90 @@ import (
// Float64Flag is a flag with type float64
type Float64Flag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
Value float64
+ DefaultText string
Destination *float64
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *Float64Flag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f Float64Flag) String() string {
+func (f *Float64Flag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f Float64Flag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *Float64Flag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f Float64Flag) IsRequired() bool {
+func (f *Float64Flag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f Float64Flag) TakesValue() bool {
+func (f *Float64Flag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f Float64Flag) GetUsage() string {
+func (f *Float64Flag) GetUsage() string {
return f.Usage
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f Float64Flag) GetValue() string {
+func (f *Float64Flag) GetValue() string {
return fmt.Sprintf("%f", f.Value)
}
+// Apply populates the flag given the flag set and environment
+func (f *Float64Flag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ valFloat, err := strconv.ParseFloat(val, 10)
+
+ if err != nil {
+ return fmt.Errorf("could not parse %q as float64 value for flag %s: %s", val, f.Name, err)
+ }
+
+ f.Value = valFloat
+ f.HasBeenSet = true
+ }
+ }
+
+ for _, name := range f.Names() {
+ if f.Destination != nil {
+ set.Float64Var(f.Destination, name, f.Value, f.Usage)
+ continue
+ }
+ set.Float64(name, f.Value, f.Usage)
+ }
+
+ return nil
+}
+
// Float64 looks up the value of a local Float64Flag, returns
// 0 if not found
func (c *Context) Float64(name string) float64 {
- return lookupFloat64(name, c.flagSet)
-}
-
-// GlobalFloat64 looks up the value of a global Float64Flag, returns
-// 0 if not found
-func (c *Context) GlobalFloat64(name string) float64 {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupFloat64(name, fs)
}
return 0
}
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f Float64Flag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- envValFloat, err := strconv.ParseFloat(envVal, 10)
- if err != nil {
- return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err)
- }
-
- f.Value = envValFloat
- }
-
- eachName(f.Name, func(name string) {
- if f.Destination != nil {
- set.Float64Var(f.Destination, name, f.Value, f.Usage)
- return
- }
- set.Float64(name, f.Value, f.Usage)
- })
-
- return nil
-}
-
func lookupFloat64(name string, set *flag.FlagSet) float64 {
f := set.Lookup(name)
if f != nil {
diff --git a/vendor/github.com/urfave/cli/v2/flag_float64_slice.go b/vendor/github.com/urfave/cli/v2/flag_float64_slice.go
new file mode 100644
index 0000000000..91d2e9d100
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/flag_float64_slice.go
@@ -0,0 +1,165 @@
+package cli
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// Float64Slice wraps []float64 to satisfy flag.Value
+type Float64Slice struct {
+ slice []float64
+ hasBeenSet bool
+}
+
+// NewFloat64Slice makes a *Float64Slice with default values
+func NewFloat64Slice(defaults ...float64) *Float64Slice {
+ return &Float64Slice{slice: append([]float64{}, defaults...)}
+}
+
+// Set parses the value into a float64 and appends it to the list of values
+func (f *Float64Slice) Set(value string) error {
+ if !f.hasBeenSet {
+ f.slice = []float64{}
+ f.hasBeenSet = true
+ }
+
+ if strings.HasPrefix(value, slPfx) {
+ // Deserializing assumes overwrite
+ _ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &f.slice)
+ f.hasBeenSet = true
+ return nil
+ }
+
+ tmp, err := strconv.ParseFloat(value, 64)
+ if err != nil {
+ return err
+ }
+
+ f.slice = append(f.slice, tmp)
+ return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (f *Float64Slice) String() string {
+ return fmt.Sprintf("%#v", f.slice)
+}
+
+// Serialize allows Float64Slice to fulfill Serializer
+func (f *Float64Slice) Serialize() string {
+ jsonBytes, _ := json.Marshal(f.slice)
+ return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
+}
+
+// Value returns the slice of float64s set by this flag
+func (f *Float64Slice) Value() []float64 {
+ return f.slice
+}
+
+// Get returns the slice of float64s set by this flag
+func (f *Float64Slice) Get() interface{} {
+ return *f
+}
+
+// Float64SliceFlag is a flag with type *Float64Slice
+type Float64SliceFlag struct {
+ Name string
+ Aliases []string
+ Usage string
+ EnvVars []string
+ FilePath string
+ Required bool
+ Hidden bool
+ Value *Float64Slice
+ DefaultText string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *Float64SliceFlag) IsSet() bool {
+ return f.HasBeenSet
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f *Float64SliceFlag) String() string {
+ return FlagStringer(f)
+}
+
+// Names returns the names of the flag
+func (f *Float64SliceFlag) Names() []string {
+ return flagNames(f)
+}
+
+// IsRequired returns whether or not the flag is required
+func (f *Float64SliceFlag) IsRequired() bool {
+ return f.Required
+}
+
+// TakesValue returns true if the flag takes a value, otherwise false
+func (f *Float64SliceFlag) TakesValue() bool {
+ return true
+}
+
+// GetUsage returns the usage string for the flag
+func (f *Float64SliceFlag) GetUsage() string {
+ return f.Usage
+}
+
+// GetValue returns the flags value as string representation and an empty
+// string if the flag takes no value at all.
+func (f *Float64SliceFlag) GetValue() string {
+ if f.Value != nil {
+ return f.Value.String()
+ }
+ return ""
+}
+
+// Apply populates the flag given the flag set and environment
+func (f *Float64SliceFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ f.Value = &Float64Slice{}
+
+ for _, s := range strings.Split(val, ",") {
+ if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
+ return fmt.Errorf("could not parse %q as float64 slice value for flag %s: %s", f.Value, f.Name, err)
+ }
+ }
+
+ f.HasBeenSet = true
+ }
+ }
+
+ for _, name := range f.Names() {
+ if f.Value == nil {
+ f.Value = &Float64Slice{}
+ }
+ set.Var(f.Value, name, f.Usage)
+ }
+
+ return nil
+}
+
+// Float64Slice looks up the value of a local Float64SliceFlag, returns
+// nil if not found
+func (c *Context) Float64Slice(name string) []float64 {
+ if fs := lookupFlagSet(name, c); fs != nil {
+ return lookupFloat64Slice(name, fs)
+ }
+ return nil
+}
+
+func lookupFloat64Slice(name string, set *flag.FlagSet) []float64 {
+ f := set.Lookup(name)
+ if f != nil {
+ parsed, err := (f.Value.(*Float64Slice)).Value(), error(nil)
+ if err != nil {
+ return nil
+ }
+ return parsed
+ }
+ return nil
+}
diff --git a/vendor/github.com/urfave/cli/flag_generic.go b/vendor/github.com/urfave/cli/v2/flag_generic.go
similarity index 52%
rename from vendor/github.com/urfave/cli/flag_generic.go
rename to vendor/github.com/urfave/cli/v2/flag_generic.go
index c43dae7d0b..2d9baa78de 100644
--- a/vendor/github.com/urfave/cli/flag_generic.go
+++ b/vendor/github.com/urfave/cli/v2/flag_generic.go
@@ -13,45 +13,53 @@ type Generic interface {
// GenericFlag is a flag with type Generic
type GenericFlag struct {
- Name string
- Usage string
- EnvVar string
- FilePath string
- Required bool
- Hidden bool
- TakesFile bool
- Value Generic
+ Name string
+ Aliases []string
+ Usage string
+ EnvVars []string
+ FilePath string
+ Required bool
+ Hidden bool
+ TakesFile bool
+ Value Generic
+ DefaultText string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *GenericFlag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f GenericFlag) String() string {
+func (f *GenericFlag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f GenericFlag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *GenericFlag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f GenericFlag) IsRequired() bool {
+func (f *GenericFlag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f GenericFlag) TakesValue() bool {
+func (f *GenericFlag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f GenericFlag) GetUsage() string {
+func (f *GenericFlag) GetUsage() string {
return f.Usage
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f GenericFlag) GetValue() string {
+func (f *GenericFlag) GetValue() string {
if f.Value != nil {
return f.Value.String()
}
@@ -60,24 +68,20 @@ func (f GenericFlag) GetValue() string {
// Apply takes the flagset and calls Set on the generic flag with the value
// provided by the user for parsing by the flag
-// Ignores parsing errors
-func (f GenericFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
+func (f GenericFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ if err := f.Value.Set(val); err != nil {
+ return fmt.Errorf("could not parse %q as value for flag %s: %s", val, f.Name, err)
+ }
-// ApplyWithError takes the flagset and calls Set on the generic flag with the value
-// provided by the user for parsing by the flag
-func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error {
- val := f.Value
- if fileEnvVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- if err := val.Set(fileEnvVal); err != nil {
- return fmt.Errorf("could not parse %s as value for flag %s: %s", fileEnvVal, f.Name, err)
+ f.HasBeenSet = true
}
}
- eachName(f.Name, func(name string) {
+ for _, name := range f.Names() {
set.Var(f.Value, name, f.Usage)
- })
+ }
return nil
}
@@ -85,13 +89,7 @@ func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error {
// Generic looks up the value of a local GenericFlag, returns
// nil if not found
func (c *Context) Generic(name string) interface{} {
- return lookupGeneric(name, c.flagSet)
-}
-
-// GlobalGeneric looks up the value of a global GenericFlag, returns
-// nil if not found
-func (c *Context) GlobalGeneric(name string) interface{} {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupGeneric(name, fs)
}
return nil
diff --git a/vendor/github.com/urfave/cli/flag_int.go b/vendor/github.com/urfave/cli/v2/flag_int.go
similarity index 56%
rename from vendor/github.com/urfave/cli/flag_int.go
rename to vendor/github.com/urfave/cli/v2/flag_int.go
index bae32e2818..be961bf5f1 100644
--- a/vendor/github.com/urfave/cli/flag_int.go
+++ b/vendor/github.com/urfave/cli/v2/flag_int.go
@@ -9,70 +9,77 @@ import (
// IntFlag is a flag with type int
type IntFlag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
Value int
+ DefaultText string
Destination *int
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *IntFlag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f IntFlag) String() string {
+func (f *IntFlag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f IntFlag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *IntFlag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f IntFlag) IsRequired() bool {
+func (f *IntFlag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f IntFlag) TakesValue() bool {
+func (f *IntFlag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f IntFlag) GetUsage() string {
+func (f *IntFlag) GetUsage() string {
return f.Usage
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f IntFlag) GetValue() string {
+func (f *IntFlag) GetValue() string {
return fmt.Sprintf("%d", f.Value)
}
// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f IntFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
+func (f *IntFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ valInt, err := strconv.ParseInt(val, 0, 64)
-// ApplyWithError populates the flag given the flag set and environment
-func (f IntFlag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- envValInt, err := strconv.ParseInt(envVal, 0, 64)
- if err != nil {
- return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
+ if err != nil {
+ return fmt.Errorf("could not parse %q as int value for flag %s: %s", val, f.Name, err)
+ }
+
+ f.Value = int(valInt)
+ f.HasBeenSet = true
}
- f.Value = int(envValInt)
}
- eachName(f.Name, func(name string) {
+ for _, name := range f.Names() {
if f.Destination != nil {
set.IntVar(f.Destination, name, f.Value, f.Usage)
- return
+ continue
}
set.Int(name, f.Value, f.Usage)
- })
+ }
return nil
}
@@ -80,13 +87,7 @@ func (f IntFlag) ApplyWithError(set *flag.FlagSet) error {
// Int looks up the value of a local IntFlag, returns
// 0 if not found
func (c *Context) Int(name string) int {
- return lookupInt(name, c.flagSet)
-}
-
-// GlobalInt looks up the value of a global IntFlag, returns
-// 0 if not found
-func (c *Context) GlobalInt(name string) int {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupInt(name, fs)
}
return 0
diff --git a/vendor/github.com/urfave/cli/flag_int64.go b/vendor/github.com/urfave/cli/v2/flag_int64.go
similarity index 56%
rename from vendor/github.com/urfave/cli/flag_int64.go
rename to vendor/github.com/urfave/cli/v2/flag_int64.go
index aaafbe9d6d..c979119f8e 100644
--- a/vendor/github.com/urfave/cli/flag_int64.go
+++ b/vendor/github.com/urfave/cli/v2/flag_int64.go
@@ -9,85 +9,84 @@ import (
// Int64Flag is a flag with type int64
type Int64Flag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
Value int64
+ DefaultText string
Destination *int64
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *Int64Flag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f Int64Flag) String() string {
+func (f *Int64Flag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f Int64Flag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *Int64Flag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f Int64Flag) IsRequired() bool {
+func (f *Int64Flag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f Int64Flag) TakesValue() bool {
+func (f *Int64Flag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f Int64Flag) GetUsage() string {
+func (f *Int64Flag) GetUsage() string {
return f.Usage
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f Int64Flag) GetValue() string {
+func (f *Int64Flag) GetValue() string {
return fmt.Sprintf("%d", f.Value)
}
// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f Int64Flag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
+func (f *Int64Flag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ valInt, err := strconv.ParseInt(val, 0, 64)
-// ApplyWithError populates the flag given the flag set and environment
-func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- envValInt, err := strconv.ParseInt(envVal, 0, 64)
- if err != nil {
- return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
+ if err != nil {
+ return fmt.Errorf("could not parse %q as int value for flag %s: %s", val, f.Name, err)
+ }
+
+ f.Value = valInt
+ f.HasBeenSet = true
}
-
- f.Value = envValInt
}
- eachName(f.Name, func(name string) {
+ for _, name := range f.Names() {
if f.Destination != nil {
set.Int64Var(f.Destination, name, f.Value, f.Usage)
- return
+ continue
}
set.Int64(name, f.Value, f.Usage)
- })
-
+ }
return nil
}
// Int64 looks up the value of a local Int64Flag, returns
// 0 if not found
func (c *Context) Int64(name string) int64 {
- return lookupInt64(name, c.flagSet)
-}
-
-// GlobalInt64 looks up the value of a global Int64Flag, returns
-// 0 if not found
-func (c *Context) GlobalInt64(name string) int64 {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupInt64(name, fs)
}
return 0
diff --git a/vendor/github.com/urfave/cli/v2/flag_int64_slice.go b/vendor/github.com/urfave/cli/v2/flag_int64_slice.go
new file mode 100644
index 0000000000..41aa0667e6
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/flag_int64_slice.go
@@ -0,0 +1,161 @@
+package cli
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// Int64Slice wraps []int64 to satisfy flag.Value
+type Int64Slice struct {
+ slice []int64
+ hasBeenSet bool
+}
+
+// NewInt64Slice makes an *Int64Slice with default values
+func NewInt64Slice(defaults ...int64) *Int64Slice {
+ return &Int64Slice{slice: append([]int64{}, defaults...)}
+}
+
+// Set parses the value into an integer and appends it to the list of values
+func (i *Int64Slice) Set(value string) error {
+ if !i.hasBeenSet {
+ i.slice = []int64{}
+ i.hasBeenSet = true
+ }
+
+ if strings.HasPrefix(value, slPfx) {
+ // Deserializing assumes overwrite
+ _ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &i.slice)
+ i.hasBeenSet = true
+ return nil
+ }
+
+ tmp, err := strconv.ParseInt(value, 0, 64)
+ if err != nil {
+ return err
+ }
+
+ i.slice = append(i.slice, tmp)
+
+ return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (i *Int64Slice) String() string {
+ return fmt.Sprintf("%#v", i.slice)
+}
+
+// Serialize allows Int64Slice to fulfill Serializer
+func (i *Int64Slice) Serialize() string {
+ jsonBytes, _ := json.Marshal(i.slice)
+ return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
+}
+
+// Value returns the slice of ints set by this flag
+func (i *Int64Slice) Value() []int64 {
+ return i.slice
+}
+
+// Get returns the slice of ints set by this flag
+func (i *Int64Slice) Get() interface{} {
+ return *i
+}
+
+// Int64SliceFlag is a flag with type *Int64Slice
+type Int64SliceFlag struct {
+ Name string
+ Aliases []string
+ Usage string
+ EnvVars []string
+ FilePath string
+ Required bool
+ Hidden bool
+ Value *Int64Slice
+ DefaultText string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *Int64SliceFlag) IsSet() bool {
+ return f.HasBeenSet
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f *Int64SliceFlag) String() string {
+ return FlagStringer(f)
+}
+
+// Names returns the names of the flag
+func (f *Int64SliceFlag) Names() []string {
+ return flagNames(f)
+}
+
+// IsRequired returns whether or not the flag is required
+func (f *Int64SliceFlag) IsRequired() bool {
+ return f.Required
+}
+
+// TakesValue returns true of the flag takes a value, otherwise false
+func (f *Int64SliceFlag) TakesValue() bool {
+ return true
+}
+
+// GetUsage returns the usage string for the flag
+func (f Int64SliceFlag) GetUsage() string {
+ return f.Usage
+}
+
+// GetValue returns the flags value as string representation and an empty
+// string if the flag takes no value at all.
+func (f *Int64SliceFlag) GetValue() string {
+ if f.Value != nil {
+ return f.Value.String()
+ }
+ return ""
+}
+
+// Apply populates the flag given the flag set and environment
+func (f *Int64SliceFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ f.Value = &Int64Slice{}
+
+ for _, s := range strings.Split(val, ",") {
+ if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
+ return fmt.Errorf("could not parse %q as int64 slice value for flag %s: %s", val, f.Name, err)
+ }
+ }
+
+ f.HasBeenSet = true
+ }
+
+ for _, name := range f.Names() {
+ if f.Value == nil {
+ f.Value = &Int64Slice{}
+ }
+ set.Var(f.Value, name, f.Usage)
+ }
+
+ return nil
+}
+
+// Int64Slice looks up the value of a local Int64SliceFlag, returns
+// nil if not found
+func (c *Context) Int64Slice(name string) []int64 {
+ return lookupInt64Slice(name, c.flagSet)
+}
+
+func lookupInt64Slice(name string, set *flag.FlagSet) []int64 {
+ f := set.Lookup(name)
+ if f != nil {
+ parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil)
+ if err != nil {
+ return nil
+ }
+ return parsed
+ }
+ return nil
+}
diff --git a/vendor/github.com/urfave/cli/v2/flag_int_slice.go b/vendor/github.com/urfave/cli/v2/flag_int_slice.go
new file mode 100644
index 0000000000..9388978421
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/flag_int_slice.go
@@ -0,0 +1,175 @@
+package cli
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// IntSlice wraps []int to satisfy flag.Value
+type IntSlice struct {
+ slice []int
+ hasBeenSet bool
+}
+
+// NewIntSlice makes an *IntSlice with default values
+func NewIntSlice(defaults ...int) *IntSlice {
+ return &IntSlice{slice: append([]int{}, defaults...)}
+}
+
+// TODO: Consistently have specific Set function for Int64 and Float64 ?
+// SetInt directly adds an integer to the list of values
+func (i *IntSlice) SetInt(value int) {
+ if !i.hasBeenSet {
+ i.slice = []int{}
+ i.hasBeenSet = true
+ }
+
+ i.slice = append(i.slice, value)
+}
+
+// Set parses the value into an integer and appends it to the list of values
+func (i *IntSlice) Set(value string) error {
+ if !i.hasBeenSet {
+ i.slice = []int{}
+ i.hasBeenSet = true
+ }
+
+ if strings.HasPrefix(value, slPfx) {
+ // Deserializing assumes overwrite
+ _ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &i.slice)
+ i.hasBeenSet = true
+ return nil
+ }
+
+ tmp, err := strconv.ParseInt(value, 0, 64)
+ if err != nil {
+ return err
+ }
+
+ i.slice = append(i.slice, int(tmp))
+
+ return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (i *IntSlice) String() string {
+ return fmt.Sprintf("%#v", i.slice)
+}
+
+// Serialize allows IntSlice to fulfill Serializer
+func (i *IntSlice) Serialize() string {
+ jsonBytes, _ := json.Marshal(i.slice)
+ return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
+}
+
+// Value returns the slice of ints set by this flag
+func (i *IntSlice) Value() []int {
+ return i.slice
+}
+
+// Get returns the slice of ints set by this flag
+func (i *IntSlice) Get() interface{} {
+ return *i
+}
+
+// IntSliceFlag is a flag with type *IntSlice
+type IntSliceFlag struct {
+ Name string
+ Aliases []string
+ Usage string
+ EnvVars []string
+ FilePath string
+ Required bool
+ Hidden bool
+ Value *IntSlice
+ DefaultText string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *IntSliceFlag) IsSet() bool {
+ return f.HasBeenSet
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f *IntSliceFlag) String() string {
+ return FlagStringer(f)
+}
+
+// Names returns the names of the flag
+func (f *IntSliceFlag) Names() []string {
+ return flagNames(f)
+}
+
+// IsRequired returns whether or not the flag is required
+func (f *IntSliceFlag) IsRequired() bool {
+ return f.Required
+}
+
+// TakesValue returns true of the flag takes a value, otherwise false
+func (f *IntSliceFlag) TakesValue() bool {
+ return true
+}
+
+// GetUsage returns the usage string for the flag
+func (f IntSliceFlag) GetUsage() string {
+ return f.Usage
+}
+
+// GetValue returns the flags value as string representation and an empty
+// string if the flag takes no value at all.
+func (f *IntSliceFlag) GetValue() string {
+ if f.Value != nil {
+ return f.Value.String()
+ }
+ return ""
+}
+
+// Apply populates the flag given the flag set and environment
+func (f *IntSliceFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ f.Value = &IntSlice{}
+
+ for _, s := range strings.Split(val, ",") {
+ if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
+ return fmt.Errorf("could not parse %q as int slice value for flag %s: %s", val, f.Name, err)
+ }
+ }
+
+ f.HasBeenSet = true
+ }
+
+ for _, name := range f.Names() {
+ if f.Value == nil {
+ f.Value = &IntSlice{}
+ }
+ set.Var(f.Value, name, f.Usage)
+ }
+
+ return nil
+}
+
+// IntSlice looks up the value of a local IntSliceFlag, returns
+// nil if not found
+func (c *Context) IntSlice(name string) []int {
+ if fs := lookupFlagSet(name, c); fs != nil {
+ return lookupIntSlice(name, c.flagSet)
+ }
+ return nil
+}
+
+func lookupIntSlice(name string, set *flag.FlagSet) []int {
+ f := set.Lookup(name)
+ if f != nil {
+ parsed, err := (f.Value.(*IntSlice)).Value(), error(nil)
+ if err != nil {
+ return nil
+ }
+ return parsed
+ }
+ return nil
+}
diff --git a/vendor/github.com/urfave/cli/v2/flag_path.go b/vendor/github.com/urfave/cli/v2/flag_path.go
new file mode 100644
index 0000000000..a322857395
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/flag_path.go
@@ -0,0 +1,95 @@
+package cli
+
+import "flag"
+
+type PathFlag struct {
+ Name string
+ Aliases []string
+ Usage string
+ EnvVars []string
+ FilePath string
+ Required bool
+ Hidden bool
+ TakesFile bool
+ Value string
+ DefaultText string
+ Destination *string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *PathFlag) IsSet() bool {
+ return f.HasBeenSet
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f *PathFlag) String() string {
+ return FlagStringer(f)
+}
+
+// Names returns the names of the flag
+func (f *PathFlag) Names() []string {
+ return flagNames(f)
+}
+
+// IsRequired returns whether or not the flag is required
+func (f *PathFlag) IsRequired() bool {
+ return f.Required
+}
+
+// TakesValue returns true of the flag takes a value, otherwise false
+func (f *PathFlag) TakesValue() bool {
+ return true
+}
+
+// GetUsage returns the usage string for the flag
+func (f *PathFlag) GetUsage() string {
+ return f.Usage
+}
+
+// GetValue returns the flags value as string representation and an empty
+// string if the flag takes no value at all.
+func (f *PathFlag) GetValue() string {
+ return f.Value
+}
+
+// Apply populates the flag given the flag set and environment
+func (f *PathFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ f.Value = val
+ f.HasBeenSet = true
+ }
+
+ for _, name := range f.Names() {
+ if f.Destination != nil {
+ set.StringVar(f.Destination, name, f.Value, f.Usage)
+ continue
+ }
+ set.String(name, f.Value, f.Usage)
+ }
+
+ return nil
+}
+
+// Path looks up the value of a local PathFlag, returns
+// "" if not found
+func (c *Context) Path(name string) string {
+ if fs := lookupFlagSet(name, c); fs != nil {
+ return lookupPath(name, fs)
+ }
+
+ return ""
+}
+
+func lookupPath(name string, set *flag.FlagSet) string {
+ f := set.Lookup(name)
+ if f != nil {
+ parsed, err := f.Value.String(), error(nil)
+ if err != nil {
+ return ""
+ }
+ return parsed
+ }
+ return ""
+}
diff --git a/vendor/github.com/urfave/cli/flag_string.go b/vendor/github.com/urfave/cli/v2/flag_string.go
similarity index 59%
rename from vendor/github.com/urfave/cli/flag_string.go
rename to vendor/github.com/urfave/cli/v2/flag_string.go
index 9f29da40b9..bcd82530cc 100644
--- a/vendor/github.com/urfave/cli/flag_string.go
+++ b/vendor/github.com/urfave/cli/v2/flag_string.go
@@ -5,67 +5,70 @@ import "flag"
// StringFlag is a flag with type string
type StringFlag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
TakesFile bool
Value string
+ DefaultText string
Destination *string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *StringFlag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f StringFlag) String() string {
+func (f *StringFlag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f StringFlag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *StringFlag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f StringFlag) IsRequired() bool {
+func (f *StringFlag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f StringFlag) TakesValue() bool {
+func (f *StringFlag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f StringFlag) GetUsage() string {
+func (f *StringFlag) GetUsage() string {
return f.Usage
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f StringFlag) GetValue() string {
+func (f *StringFlag) GetValue() string {
return f.Value
}
// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f StringFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f StringFlag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- f.Value = envVal
+func (f *StringFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ f.Value = val
+ f.HasBeenSet = true
}
- eachName(f.Name, func(name string) {
+ for _, name := range f.Names() {
if f.Destination != nil {
set.StringVar(f.Destination, name, f.Value, f.Usage)
- return
+ continue
}
set.String(name, f.Value, f.Usage)
- })
+ }
return nil
}
@@ -73,13 +76,7 @@ func (f StringFlag) ApplyWithError(set *flag.FlagSet) error {
// String looks up the value of a local StringFlag, returns
// "" if not found
func (c *Context) String(name string) string {
- return lookupString(name, c.flagSet)
-}
-
-// GlobalString looks up the value of a global StringFlag, returns
-// "" if not found
-func (c *Context) GlobalString(name string) string {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupString(name, fs)
}
return ""
diff --git a/vendor/github.com/urfave/cli/v2/flag_string_slice.go b/vendor/github.com/urfave/cli/v2/flag_string_slice.go
new file mode 100644
index 0000000000..a114a495eb
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/flag_string_slice.go
@@ -0,0 +1,159 @@
+package cli
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "strings"
+)
+
+// StringSlice wraps a []string to satisfy flag.Value
+type StringSlice struct {
+ slice []string
+ hasBeenSet bool
+}
+
+// NewStringSlice creates a *StringSlice with default values
+func NewStringSlice(defaults ...string) *StringSlice {
+ return &StringSlice{slice: append([]string{}, defaults...)}
+}
+
+// Set appends the string value to the list of values
+func (s *StringSlice) Set(value string) error {
+ if !s.hasBeenSet {
+ s.slice = []string{}
+ s.hasBeenSet = true
+ }
+
+ if strings.HasPrefix(value, slPfx) {
+ // Deserializing assumes overwrite
+ _ = json.Unmarshal([]byte(strings.Replace(value, slPfx, "", 1)), &s.slice)
+ s.hasBeenSet = true
+ return nil
+ }
+
+ s.slice = append(s.slice, value)
+
+ return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (s *StringSlice) String() string {
+ return fmt.Sprintf("%s", s.slice)
+}
+
+// Serialize allows StringSlice to fulfill Serializer
+func (s *StringSlice) Serialize() string {
+ jsonBytes, _ := json.Marshal(s.slice)
+ return fmt.Sprintf("%s%s", slPfx, string(jsonBytes))
+}
+
+// Value returns the slice of strings set by this flag
+func (s *StringSlice) Value() []string {
+ return s.slice
+}
+
+// Get returns the slice of strings set by this flag
+func (s *StringSlice) Get() interface{} {
+ return *s
+}
+
+// StringSliceFlag is a flag with type *StringSlice
+type StringSliceFlag struct {
+ Name string
+ Aliases []string
+ Usage string
+ EnvVars []string
+ FilePath string
+ Required bool
+ Hidden bool
+ TakesFile bool
+ Value *StringSlice
+ DefaultText string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *StringSliceFlag) IsSet() bool {
+ return f.HasBeenSet
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f *StringSliceFlag) String() string {
+ return FlagStringer(f)
+}
+
+// Names returns the names of the flag
+func (f *StringSliceFlag) Names() []string {
+ return flagNames(f)
+}
+
+// IsRequired returns whether or not the flag is required
+func (f *StringSliceFlag) IsRequired() bool {
+ return f.Required
+}
+
+// TakesValue returns true of the flag takes a value, otherwise false
+func (f *StringSliceFlag) TakesValue() bool {
+ return true
+}
+
+// GetUsage returns the usage string for the flag
+func (f *StringSliceFlag) GetUsage() string {
+ return f.Usage
+}
+
+// GetValue returns the flags value as string representation and an empty
+// string if the flag takes no value at all.
+func (f *StringSliceFlag) GetValue() string {
+ if f.Value != nil {
+ return f.Value.String()
+ }
+ return ""
+}
+
+// Apply populates the flag given the flag set and environment
+func (f *StringSliceFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ f.Value = &StringSlice{}
+
+ for _, s := range strings.Split(val, ",") {
+ if err := f.Value.Set(strings.TrimSpace(s)); err != nil {
+ return fmt.Errorf("could not parse %q as string value for flag %s: %s", val, f.Name, err)
+ }
+ }
+
+ f.HasBeenSet = true
+ }
+
+ for _, name := range f.Names() {
+ if f.Value == nil {
+ f.Value = &StringSlice{}
+ }
+ set.Var(f.Value, name, f.Usage)
+ }
+
+ return nil
+}
+
+// StringSlice looks up the value of a local StringSliceFlag, returns
+// nil if not found
+func (c *Context) StringSlice(name string) []string {
+ if fs := lookupFlagSet(name, c); fs != nil {
+ return lookupStringSlice(name, fs)
+ }
+ return nil
+}
+
+func lookupStringSlice(name string, set *flag.FlagSet) []string {
+ f := set.Lookup(name)
+ if f != nil {
+ parsed, err := (f.Value.(*StringSlice)).Value(), error(nil)
+ if err != nil {
+ return nil
+ }
+ return parsed
+ }
+ return nil
+}
diff --git a/vendor/github.com/urfave/cli/v2/flag_timestamp.go b/vendor/github.com/urfave/cli/v2/flag_timestamp.go
new file mode 100644
index 0000000000..d24edcd7f2
--- /dev/null
+++ b/vendor/github.com/urfave/cli/v2/flag_timestamp.go
@@ -0,0 +1,152 @@
+package cli
+
+import (
+ "flag"
+ "fmt"
+ "time"
+)
+
+// Timestamp wrap to satisfy golang's flag interface.
+type Timestamp struct {
+ timestamp *time.Time
+ hasBeenSet bool
+ layout string
+}
+
+// Timestamp constructor
+func NewTimestamp(timestamp time.Time) *Timestamp {
+ return &Timestamp{timestamp: ×tamp}
+}
+
+// Set the timestamp value directly
+func (t *Timestamp) SetTimestamp(value time.Time) {
+ if !t.hasBeenSet {
+ t.timestamp = &value
+ t.hasBeenSet = true
+ }
+}
+
+// Set the timestamp string layout for future parsing
+func (t *Timestamp) SetLayout(layout string) {
+ t.layout = layout
+}
+
+// Parses the string value to timestamp
+func (t *Timestamp) Set(value string) error {
+ timestamp, err := time.Parse(t.layout, value)
+ if err != nil {
+ return err
+ }
+
+ t.timestamp = ×tamp
+ t.hasBeenSet = true
+ return nil
+}
+
+// String returns a readable representation of this value (for usage defaults)
+func (t *Timestamp) String() string {
+ return fmt.Sprintf("%#v", t.timestamp)
+}
+
+// Value returns the timestamp value stored in the flag
+func (t *Timestamp) Value() *time.Time {
+ return t.timestamp
+}
+
+// Get returns the flag structure
+func (t *Timestamp) Get() interface{} {
+ return *t
+}
+
+// TimestampFlag is a flag with type time
+type TimestampFlag struct {
+ Name string
+ Aliases []string
+ Usage string
+ EnvVars []string
+ FilePath string
+ Required bool
+ Hidden bool
+ Layout string
+ Value *Timestamp
+ DefaultText string
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *TimestampFlag) IsSet() bool {
+ return f.HasBeenSet
+}
+
+// String returns a readable representation of this value
+// (for usage defaults)
+func (f *TimestampFlag) String() string {
+ return FlagStringer(f)
+}
+
+// Names returns the names of the flag
+func (f *TimestampFlag) Names() []string {
+ return flagNames(f)
+}
+
+// IsRequired returns whether or not the flag is required
+func (f *TimestampFlag) IsRequired() bool {
+ return f.Required
+}
+
+// TakesValue returns true of the flag takes a value, otherwise false
+func (f *TimestampFlag) TakesValue() bool {
+ return true
+}
+
+// GetUsage returns the usage string for the flag
+func (f *TimestampFlag) GetUsage() string {
+ return f.Usage
+}
+
+// GetValue returns the flags value as string representation and an empty
+// string if the flag takes no value at all.
+func (f *TimestampFlag) GetValue() string {
+ if f.Value != nil {
+ return f.Value.timestamp.String()
+ }
+ return ""
+}
+
+// Apply populates the flag given the flag set and environment
+func (f *TimestampFlag) Apply(set *flag.FlagSet) error {
+ if f.Layout == "" {
+ return fmt.Errorf("timestamp Layout is required")
+ }
+ f.Value = &Timestamp{}
+ f.Value.SetLayout(f.Layout)
+
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if err := f.Value.Set(val); err != nil {
+ return fmt.Errorf("could not parse %q as timestamp value for flag %s: %s", val, f.Name, err)
+ }
+ f.HasBeenSet = true
+ }
+
+ for _, name := range f.Names() {
+ set.Var(f.Value, name, f.Usage)
+ }
+ return nil
+}
+
+// Timestamp gets the timestamp from a flag name
+func (c *Context) Timestamp(name string) *time.Time {
+ if fs := lookupFlagSet(name, c); fs != nil {
+ return lookupTimestamp(name, fs)
+ }
+ return nil
+}
+
+// Fetches the timestamp value from the local timestampWrap
+func lookupTimestamp(name string, set *flag.FlagSet) *time.Time {
+ f := set.Lookup(name)
+ if f != nil {
+ return (f.Value.(*Timestamp)).Value()
+ }
+ return nil
+}
diff --git a/vendor/github.com/urfave/cli/flag_uint.go b/vendor/github.com/urfave/cli/v2/flag_uint.go
similarity index 56%
rename from vendor/github.com/urfave/cli/flag_uint.go
rename to vendor/github.com/urfave/cli/v2/flag_uint.go
index d6a04f4087..9f592388fe 100644
--- a/vendor/github.com/urfave/cli/flag_uint.go
+++ b/vendor/github.com/urfave/cli/v2/flag_uint.go
@@ -9,85 +9,84 @@ import (
// UintFlag is a flag with type uint
type UintFlag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
Value uint
+ DefaultText string
Destination *uint
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *UintFlag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f UintFlag) String() string {
+func (f *UintFlag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f UintFlag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *UintFlag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f UintFlag) IsRequired() bool {
+func (f *UintFlag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f UintFlag) TakesValue() bool {
+func (f *UintFlag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f UintFlag) GetUsage() string {
+func (f *UintFlag) GetUsage() string {
return f.Usage
}
// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f UintFlag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
+func (f *UintFlag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ valInt, err := strconv.ParseUint(val, 0, 64)
+ if err != nil {
+ return fmt.Errorf("could not parse %q as uint value for flag %s: %s", val, f.Name, err)
+ }
-// ApplyWithError populates the flag given the flag set and environment
-func (f UintFlag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- envValInt, err := strconv.ParseUint(envVal, 0, 64)
- if err != nil {
- return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err)
+ f.Value = uint(valInt)
+ f.HasBeenSet = true
}
-
- f.Value = uint(envValInt)
}
- eachName(f.Name, func(name string) {
+ for _, name := range f.Names() {
if f.Destination != nil {
set.UintVar(f.Destination, name, f.Value, f.Usage)
- return
+ continue
}
set.Uint(name, f.Value, f.Usage)
- })
+ }
return nil
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f UintFlag) GetValue() string {
+func (f *UintFlag) GetValue() string {
return fmt.Sprintf("%d", f.Value)
}
// Uint looks up the value of a local UintFlag, returns
// 0 if not found
func (c *Context) Uint(name string) uint {
- return lookupUint(name, c.flagSet)
-}
-
-// GlobalUint looks up the value of a global UintFlag, returns
-// 0 if not found
-func (c *Context) GlobalUint(name string) uint {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupUint(name, fs)
}
return 0
diff --git a/vendor/github.com/urfave/cli/flag_uint64.go b/vendor/github.com/urfave/cli/v2/flag_uint64.go
similarity index 56%
rename from vendor/github.com/urfave/cli/flag_uint64.go
rename to vendor/github.com/urfave/cli/v2/flag_uint64.go
index ea6493a8be..5bbd1fa4b9 100644
--- a/vendor/github.com/urfave/cli/flag_uint64.go
+++ b/vendor/github.com/urfave/cli/v2/flag_uint64.go
@@ -9,85 +9,84 @@ import (
// Uint64Flag is a flag with type uint64
type Uint64Flag struct {
Name string
+ Aliases []string
Usage string
- EnvVar string
+ EnvVars []string
FilePath string
Required bool
Hidden bool
Value uint64
+ DefaultText string
Destination *uint64
+ HasBeenSet bool
+}
+
+// IsSet returns whether or not the flag has been set through env or file
+func (f *Uint64Flag) IsSet() bool {
+ return f.HasBeenSet
}
// String returns a readable representation of this value
// (for usage defaults)
-func (f Uint64Flag) String() string {
+func (f *Uint64Flag) String() string {
return FlagStringer(f)
}
-// GetName returns the name of the flag
-func (f Uint64Flag) GetName() string {
- return f.Name
+// Names returns the names of the flag
+func (f *Uint64Flag) Names() []string {
+ return flagNames(f)
}
// IsRequired returns whether or not the flag is required
-func (f Uint64Flag) IsRequired() bool {
+func (f *Uint64Flag) IsRequired() bool {
return f.Required
}
// TakesValue returns true of the flag takes a value, otherwise false
-func (f Uint64Flag) TakesValue() bool {
+func (f *Uint64Flag) TakesValue() bool {
return true
}
// GetUsage returns the usage string for the flag
-func (f Uint64Flag) GetUsage() string {
+func (f *Uint64Flag) GetUsage() string {
return f.Usage
}
+// Apply populates the flag given the flag set and environment
+func (f *Uint64Flag) Apply(set *flag.FlagSet) error {
+ if val, ok := flagFromEnvOrFile(f.EnvVars, f.FilePath); ok {
+ if val != "" {
+ valInt, err := strconv.ParseUint(val, 0, 64)
+ if err != nil {
+ return fmt.Errorf("could not parse %q as uint64 value for flag %s: %s", val, f.Name, err)
+ }
+
+ f.Value = valInt
+ f.HasBeenSet = true
+ }
+ }
+
+ for _, name := range f.Names() {
+ if f.Destination != nil {
+ set.Uint64Var(f.Destination, name, f.Value, f.Usage)
+ continue
+ }
+ set.Uint64(name, f.Value, f.Usage)
+ }
+
+ return nil
+}
+
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
-func (f Uint64Flag) GetValue() string {
+func (f *Uint64Flag) GetValue() string {
return fmt.Sprintf("%d", f.Value)
}
-// Apply populates the flag given the flag set and environment
-// Ignores errors
-func (f Uint64Flag) Apply(set *flag.FlagSet) {
- _ = f.ApplyWithError(set)
-}
-
-// ApplyWithError populates the flag given the flag set and environment
-func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error {
- if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok {
- envValInt, err := strconv.ParseUint(envVal, 0, 64)
- if err != nil {
- return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err)
- }
-
- f.Value = envValInt
- }
-
- eachName(f.Name, func(name string) {
- if f.Destination != nil {
- set.Uint64Var(f.Destination, name, f.Value, f.Usage)
- return
- }
- set.Uint64(name, f.Value, f.Usage)
- })
-
- return nil
-}
-
// Uint64 looks up the value of a local Uint64Flag, returns
// 0 if not found
func (c *Context) Uint64(name string) uint64 {
- return lookupUint64(name, c.flagSet)
-}
-
-// GlobalUint64 looks up the value of a global Uint64Flag, returns
-// 0 if not found
-func (c *Context) GlobalUint64(name string) uint64 {
- if fs := lookupGlobalFlagSet(name, c); fs != nil {
+ if fs := lookupFlagSet(name, c); fs != nil {
return lookupUint64(name, fs)
}
return 0
diff --git a/vendor/github.com/urfave/cli/funcs.go b/vendor/github.com/urfave/cli/v2/funcs.go
similarity index 88%
rename from vendor/github.com/urfave/cli/funcs.go
rename to vendor/github.com/urfave/cli/v2/funcs.go
index 0036b1130a..474c48faf9 100644
--- a/vendor/github.com/urfave/cli/funcs.go
+++ b/vendor/github.com/urfave/cli/v2/funcs.go
@@ -1,6 +1,6 @@
package cli
-// BashCompleteFunc is an action to execute when the bash-completion flag is set
+// BashCompleteFunc is an action to execute when the shell completion flag is set
type BashCompleteFunc func(*Context)
// BeforeFunc is an action to execute before any subcommands are run, but after
@@ -23,7 +23,7 @@ type CommandNotFoundFunc func(*Context, string)
// is displayed and the execution is interrupted.
type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error
-// ExitErrHandlerFunc is executed if provided in order to handle ExitError values
+// ExitErrHandlerFunc is executed if provided in order to handle exitError values
// returned by Actions and Before/After functions.
type ExitErrHandlerFunc func(context *Context, err error)
@@ -33,11 +33,11 @@ type FlagStringFunc func(Flag) string
// FlagNamePrefixFunc is used by the default FlagStringFunc to create prefix
// text for a flag's full name.
-type FlagNamePrefixFunc func(fullName, placeholder string) string
+type FlagNamePrefixFunc func(fullName []string, placeholder string) string
// FlagEnvHintFunc is used by the default FlagStringFunc to annotate flag help
// with the environment variable details.
-type FlagEnvHintFunc func(envVar, str string) string
+type FlagEnvHintFunc func(envVars []string, str string) string
// FlagFileHintFunc is used by the default FlagStringFunc to annotate flag help
// with the file path details.
diff --git a/vendor/github.com/urfave/cli/go.mod b/vendor/github.com/urfave/cli/v2/go.mod
similarity index 82%
rename from vendor/github.com/urfave/cli/go.mod
rename to vendor/github.com/urfave/cli/v2/go.mod
index 7d04d20167..c38d41c14b 100644
--- a/vendor/github.com/urfave/cli/go.mod
+++ b/vendor/github.com/urfave/cli/v2/go.mod
@@ -1,4 +1,4 @@
-module github.com/urfave/cli
+module github.com/urfave/cli/v2
go 1.11
diff --git a/vendor/github.com/urfave/cli/go.sum b/vendor/github.com/urfave/cli/v2/go.sum
similarity index 100%
rename from vendor/github.com/urfave/cli/go.sum
rename to vendor/github.com/urfave/cli/v2/go.sum
diff --git a/vendor/github.com/urfave/cli/help.go b/vendor/github.com/urfave/cli/v2/help.go
similarity index 91%
rename from vendor/github.com/urfave/cli/help.go
rename to vendor/github.com/urfave/cli/v2/help.go
index 2280e338ef..c1e974a481 100644
--- a/vendor/github.com/urfave/cli/help.go
+++ b/vendor/github.com/urfave/cli/v2/help.go
@@ -10,7 +10,7 @@ import (
"unicode/utf8"
)
-var helpCommand = Command{
+var helpCommand = &Command{
Name: "help",
Aliases: []string{"h"},
Usage: "Shows a list of commands or help for one command",
@@ -26,7 +26,7 @@ var helpCommand = Command{
},
}
-var helpSubcommand = Command{
+var helpSubcommand = &Command{
Name: "help",
Aliases: []string{"h"},
Usage: "Shows a list of commands or help for one command",
@@ -97,7 +97,7 @@ func DefaultAppComplete(c *Context) {
DefaultCompleteWithFlags(nil)(c)
}
-func printCommandSuggestions(commands []Command, writer io.Writer) {
+func printCommandSuggestions(commands []*Command, writer io.Writer) {
for _, command := range commands {
if command.Hidden {
continue
@@ -135,10 +135,10 @@ func printFlagSuggestions(lastArg string, flags []Flag, writer io.Writer) {
cur := strings.TrimPrefix(lastArg, "-")
cur = strings.TrimPrefix(cur, "-")
for _, flag := range flags {
- if bflag, ok := flag.(BoolFlag); ok && bflag.Hidden {
+ if bflag, ok := flag.(*BoolFlag); ok && bflag.Hidden {
continue
}
- for _, name := range strings.Split(flag.GetName(), ",") {
+ for _, name := range flag.Names() {
name = strings.TrimSpace(name)
// this will get total count utf8 letters in flag name
count := utf8.RuneCountInString(name)
@@ -151,7 +151,7 @@ func printFlagSuggestions(lastArg string, flags []Flag, writer io.Writer) {
continue
}
// match if last argument matches this flag and it is not repeated
- if strings.HasPrefix(name, cur) && cur != name && !cliArgContains(flag.GetName()) {
+ if strings.HasPrefix(name, cur) && cur != name && !cliArgContains(name) {
flagCompletion := fmt.Sprintf("%s%s", strings.Repeat("-", count), name)
_, _ = fmt.Fprintln(writer, flagCompletion)
}
@@ -207,7 +207,7 @@ func ShowCommandHelp(ctx *Context, command string) error {
}
if ctx.App.CommandNotFound == nil {
- return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3)
+ return Exit(fmt.Sprintf("No help topic for '%v'", command), 3)
}
ctx.App.CommandNotFound(ctx, command)
@@ -216,7 +216,15 @@ func ShowCommandHelp(ctx *Context, command string) error {
// ShowSubcommandHelp prints help for the given subcommand
func ShowSubcommandHelp(c *Context) error {
- return ShowCommandHelp(c, c.Command.Name)
+ if c == nil {
+ return nil
+ }
+
+ if c.Command != nil {
+ return ShowCommandHelp(c, c.Command.Name)
+ }
+
+ return ShowCommandHelp(c, "")
}
// ShowVersion prints the version number of the App
@@ -263,6 +271,7 @@ func printHelpCustom(out io.Writer, templ string, data interface{}, customFuncs
w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0)
t := template.Must(template.New("help").Funcs(funcMap).Parse(templ))
+
err := t.Execute(w, data)
if err != nil {
// If the writer is closed, t.Execute will fail, and there's nothing
@@ -281,24 +290,20 @@ func printHelp(out io.Writer, templ string, data interface{}) {
func checkVersion(c *Context) bool {
found := false
- if VersionFlag.GetName() != "" {
- eachName(VersionFlag.GetName(), func(name string) {
- if c.GlobalBool(name) || c.Bool(name) {
- found = true
- }
- })
+ for _, name := range VersionFlag.Names() {
+ if c.Bool(name) {
+ found = true
+ }
}
return found
}
func checkHelp(c *Context) bool {
found := false
- if HelpFlag.GetName() != "" {
- eachName(HelpFlag.GetName(), func(name string) {
- if c.GlobalBool(name) || c.Bool(name) {
- found = true
- }
- })
+ for _, name := range HelpFlag.Names() {
+ if c.Bool(name) {
+ found = true
+ }
}
return found
}
@@ -329,7 +334,7 @@ func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) {
pos := len(arguments) - 1
lastArg := arguments[pos]
- if lastArg != "--"+BashCompletionFlag.GetName() {
+ if lastArg != "--generate-bash-completion" {
return false, arguments
}
diff --git a/vendor/github.com/urfave/cli/parse.go b/vendor/github.com/urfave/cli/v2/parse.go
similarity index 88%
rename from vendor/github.com/urfave/cli/parse.go
rename to vendor/github.com/urfave/cli/v2/parse.go
index 660f538b03..7df17296a4 100644
--- a/vendor/github.com/urfave/cli/parse.go
+++ b/vendor/github.com/urfave/cli/v2/parse.go
@@ -11,13 +11,18 @@ type iterativeParser interface {
}
// To enable short-option handling (e.g., "-it" vs "-i -t") we have to
-// iteratively catch parsing errors. This way we achieve LR parsing without
+// iteratively catch parsing errors. This way we achieve LR parsing without
// transforming any arguments. Otherwise, there is no way we can discriminate
// combined short options from common arguments that should be left untouched.
-func parseIter(set *flag.FlagSet, ip iterativeParser, args []string) error {
+// Pass `shellComplete` to continue parsing options on failure during shell
+// completion when, the user-supplied options may be incomplete.
+func parseIter(set *flag.FlagSet, ip iterativeParser, args []string, shellComplete bool) error {
for {
err := set.Parse(args)
if !ip.useShortOptionHandling() || err == nil {
+ if shellComplete {
+ return nil
+ }
return err
}
diff --git a/vendor/github.com/urfave/cli/sort.go b/vendor/github.com/urfave/cli/v2/sort.go
similarity index 100%
rename from vendor/github.com/urfave/cli/sort.go
rename to vendor/github.com/urfave/cli/v2/sort.go
diff --git a/vendor/github.com/urfave/cli/template.go b/vendor/github.com/urfave/cli/v2/template.go
similarity index 95%
rename from vendor/github.com/urfave/cli/template.go
rename to vendor/github.com/urfave/cli/v2/template.go
index c631fb97dd..1cc4bd624b 100644
--- a/vendor/github.com/urfave/cli/template.go
+++ b/vendor/github.com/urfave/cli/v2/template.go
@@ -20,7 +20,6 @@ AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:
{{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
-
{{.Name}}:{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
@@ -63,7 +62,6 @@ USAGE:
{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
COMMANDS:{{range .VisibleCategories}}{{if .Name}}
-
{{.Name}}:{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
@@ -73,9 +71,9 @@ OPTIONS:
{{end}}{{end}}
`
-var MarkdownDocTemplate = `% {{ .App.Name }}(8) {{ .App.Description }}
-
-% {{ .App.Author }}
+var MarkdownDocTemplate = `% {{ .App.Name }}(8){{ if .App.Description }} {{ .App.Description }}{{ end }}
+{{ range $a := .App.Authors }}
+% {{ $a }}{{ end }}
# NAME
diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go
index f4d9b5ece3..3a67636fe2 100644
--- a/vendor/golang.org/x/net/http2/client_conn_pool.go
+++ b/vendor/golang.org/x/net/http2/client_conn_pool.go
@@ -107,6 +107,7 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis
// dialCall is an in-flight Transport dial call to a host.
type dialCall struct {
+ _ incomparable
p *clientConnPool
done chan struct{} // closed when done
res *ClientConn // valid after done is closed
@@ -180,6 +181,7 @@ func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c *tls.Conn)
}
type addConnCall struct {
+ _ incomparable
p *clientConnPool
done chan struct{} // closed when done
err error
@@ -200,12 +202,6 @@ func (c *addConnCall) run(t *Transport, key string, tc *tls.Conn) {
close(c.done)
}
-func (p *clientConnPool) addConn(key string, cc *ClientConn) {
- p.mu.Lock()
- p.addConnLocked(key, cc)
- p.mu.Unlock()
-}
-
// p.mu must be held
func (p *clientConnPool) addConnLocked(key string, cc *ClientConn) {
for _, v := range p.conns[key] {
diff --git a/vendor/golang.org/x/net/http2/flow.go b/vendor/golang.org/x/net/http2/flow.go
index cea601fcdf..b51f0e0cf1 100644
--- a/vendor/golang.org/x/net/http2/flow.go
+++ b/vendor/golang.org/x/net/http2/flow.go
@@ -8,6 +8,8 @@ package http2
// flow is the flow control window's size.
type flow struct {
+ _ incomparable
+
// n is the number of DATA bytes we're allowed to send.
// A flow is kept both on a conn and a per-stream.
n int32
diff --git a/vendor/golang.org/x/net/http2/hpack/huffman.go b/vendor/golang.org/x/net/http2/hpack/huffman.go
index b412a96c50..a1ab2f0567 100644
--- a/vendor/golang.org/x/net/http2/hpack/huffman.go
+++ b/vendor/golang.org/x/net/http2/hpack/huffman.go
@@ -105,7 +105,14 @@ func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error {
return nil
}
+// incomparable is a zero-width, non-comparable type. Adding it to a struct
+// makes that struct also non-comparable, and generally doesn't add
+// any size (as long as it's first).
+type incomparable [0]func()
+
type node struct {
+ _ incomparable
+
// children is non-nil for internal nodes
children *[256]*node
diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go
index 27cc893cc0..5571ccfd26 100644
--- a/vendor/golang.org/x/net/http2/http2.go
+++ b/vendor/golang.org/x/net/http2/http2.go
@@ -241,6 +241,7 @@ func (cw closeWaiter) Wait() {
// Its buffered writer is lazily allocated as needed, to minimize
// idle memory usage with many connections.
type bufferedWriter struct {
+ _ incomparable
w io.Writer // immutable
bw *bufio.Writer // non-nil when data is buffered
}
@@ -313,6 +314,7 @@ func bodyAllowedForStatus(status int) bool {
}
type httpError struct {
+ _ incomparable
msg string
timeout bool
}
@@ -376,3 +378,8 @@ func (s *sorter) SortStrings(ss []string) {
func validPseudoPath(v string) bool {
return (len(v) > 0 && v[0] == '/') || v == "*"
}
+
+// incomparable is a zero-width, non-comparable type. Adding it to a struct
+// makes that struct also non-comparable, and generally doesn't add
+// any size (as long as it's first).
+type incomparable [0]func()
diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go
index bc9e41a1b7..345b7cd85d 100644
--- a/vendor/golang.org/x/net/http2/server.go
+++ b/vendor/golang.org/x/net/http2/server.go
@@ -761,6 +761,7 @@ func (sc *serverConn) readFrames() {
// frameWriteResult is the message passed from writeFrameAsync to the serve goroutine.
type frameWriteResult struct {
+ _ incomparable
wr FrameWriteRequest // what was written (or attempted)
err error // result of the writeFrame call
}
@@ -771,7 +772,7 @@ type frameWriteResult struct {
// serverConn.
func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) {
err := wr.write.writeFrame(sc)
- sc.wroteFrameCh <- frameWriteResult{wr, err}
+ sc.wroteFrameCh <- frameWriteResult{wr: wr, err: err}
}
func (sc *serverConn) closeAllStreamsOnConnClose() {
@@ -1161,7 +1162,7 @@ func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) {
if wr.write.staysWithinBuffer(sc.bw.Available()) {
sc.writingFrameAsync = false
err := wr.write.writeFrame(sc)
- sc.wroteFrame(frameWriteResult{wr, err})
+ sc.wroteFrame(frameWriteResult{wr: wr, err: err})
} else {
sc.writingFrameAsync = true
go sc.writeFrameAsync(wr)
@@ -2057,7 +2058,7 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r
var trailer http.Header
for _, v := range rp.header["Trailer"] {
for _, key := range strings.Split(v, ",") {
- key = http.CanonicalHeaderKey(strings.TrimSpace(key))
+ key = http.CanonicalHeaderKey(textproto.TrimString(key))
switch key {
case "Transfer-Encoding", "Trailer", "Content-Length":
// Bogus. (copy of http1 rules)
@@ -2275,6 +2276,7 @@ func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) {
// requestBody is the Handler's Request.Body type.
// Read and Close may be called concurrently.
type requestBody struct {
+ _ incomparable
stream *stream
conn *serverConn
closed bool // for use by Close only
diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go
index e4fb02530f..76a92e0ca6 100644
--- a/vendor/golang.org/x/net/http2/transport.go
+++ b/vendor/golang.org/x/net/http2/transport.go
@@ -108,6 +108,19 @@ type Transport struct {
// waiting for their turn.
StrictMaxConcurrentStreams bool
+ // ReadIdleTimeout is the timeout after which a health check using ping
+ // frame will be carried out if no frame is received on the connection.
+ // Note that a ping response will is considered a received frame, so if
+ // there is no other traffic on the connection, the health check will
+ // be performed every ReadIdleTimeout interval.
+ // If zero, no health check is performed.
+ ReadIdleTimeout time.Duration
+
+ // PingTimeout is the timeout after which the connection will be closed
+ // if a response to Ping is not received.
+ // Defaults to 15s.
+ PingTimeout time.Duration
+
// t1, if non-nil, is the standard library Transport using
// this transport. Its settings are used (but not its
// RoundTrip method, etc).
@@ -131,6 +144,14 @@ func (t *Transport) disableCompression() bool {
return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression)
}
+func (t *Transport) pingTimeout() time.Duration {
+ if t.PingTimeout == 0 {
+ return 15 * time.Second
+ }
+ return t.PingTimeout
+
+}
+
// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
// It returns an error if t1 has already been HTTP/2-enabled.
func ConfigureTransport(t1 *http.Transport) error {
@@ -675,6 +696,20 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro
return cc, nil
}
+func (cc *ClientConn) healthCheck() {
+ pingTimeout := cc.t.pingTimeout()
+ // We don't need to periodically ping in the health check, because the readLoop of ClientConn will
+ // trigger the healthCheck again if there is no frame received.
+ ctx, cancel := context.WithTimeout(context.Background(), pingTimeout)
+ defer cancel()
+ err := cc.Ping(ctx)
+ if err != nil {
+ cc.closeForLostPing()
+ cc.t.connPool().MarkDead(cc)
+ return
+ }
+}
+
func (cc *ClientConn) setGoAway(f *GoAwayFrame) {
cc.mu.Lock()
defer cc.mu.Unlock()
@@ -846,14 +881,12 @@ func (cc *ClientConn) sendGoAway() error {
return nil
}
-// Close closes the client connection immediately.
-//
-// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead.
-func (cc *ClientConn) Close() error {
+// closes the client connection immediately. In-flight requests are interrupted.
+// err is sent to streams.
+func (cc *ClientConn) closeForError(err error) error {
cc.mu.Lock()
defer cc.cond.Broadcast()
defer cc.mu.Unlock()
- err := errors.New("http2: client connection force closed via ClientConn.Close")
for id, cs := range cc.streams {
select {
case cs.resc <- resAndError{err: err}:
@@ -866,6 +899,20 @@ func (cc *ClientConn) Close() error {
return cc.tconn.Close()
}
+// Close closes the client connection immediately.
+//
+// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead.
+func (cc *ClientConn) Close() error {
+ err := errors.New("http2: client connection force closed via ClientConn.Close")
+ return cc.closeForError(err)
+}
+
+// closes the client connection immediately. In-flight requests are interrupted.
+func (cc *ClientConn) closeForLostPing() error {
+ err := errors.New("http2: client connection lost")
+ return cc.closeForError(err)
+}
+
const maxAllocFrameSize = 512 << 10
// frameBuffer returns a scratch buffer suitable for writing DATA frames.
@@ -916,7 +963,7 @@ func commaSeparatedTrailers(req *http.Request) (string, error) {
k = http.CanonicalHeaderKey(k)
switch k {
case "Transfer-Encoding", "Trailer", "Content-Length":
- return "", &badStringError{"invalid Trailer key", k}
+ return "", fmt.Errorf("invalid Trailer key %q", k)
}
keys = append(keys, k)
}
@@ -1394,13 +1441,6 @@ func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error)
}
}
-type badStringError struct {
- what string
- str string
-}
-
-func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) }
-
// requires cc.mu be held.
func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) {
cc.hbuf.Reset()
@@ -1616,6 +1656,7 @@ func (cc *ClientConn) writeHeader(name, value string) {
}
type resAndError struct {
+ _ incomparable
res *http.Response
err error
}
@@ -1663,6 +1704,7 @@ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream {
// clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop.
type clientConnReadLoop struct {
+ _ incomparable
cc *ClientConn
closeWhenIdle bool
}
@@ -1742,8 +1784,17 @@ func (rl *clientConnReadLoop) run() error {
rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse
gotReply := false // ever saw a HEADERS reply
gotSettings := false
+ readIdleTimeout := cc.t.ReadIdleTimeout
+ var t *time.Timer
+ if readIdleTimeout != 0 {
+ t = time.AfterFunc(readIdleTimeout, cc.healthCheck)
+ defer t.Stop()
+ }
for {
f, err := cc.fr.ReadFrame()
+ if t != nil {
+ t.Reset(readIdleTimeout)
+ }
if err != nil {
cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err)
}
@@ -2479,6 +2530,7 @@ func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) {
// gzipReader wraps a response body so it can lazily
// call gzip.NewReader on the first call to Read
type gzipReader struct {
+ _ incomparable
body io.ReadCloser // underlying Response.Body
zr *gzip.Reader // lazily-initialized gzip reader
zerr error // sticky error
diff --git a/vendor/golang.org/x/tools/go/analysis/doc.go b/vendor/golang.org/x/tools/go/analysis/doc.go
index ea56b724e8..fb17a0e415 100644
--- a/vendor/golang.org/x/tools/go/analysis/doc.go
+++ b/vendor/golang.org/x/tools/go/analysis/doc.go
@@ -170,6 +170,15 @@ Diagnostic is defined as:
The optional Category field is a short identifier that classifies the
kind of message when an analysis produces several kinds of diagnostic.
+Many analyses want to associate diagnostics with a severity level.
+Because Diagnostic does not have a severity level field, an Analyzer's
+diagnostics effectively all have the same severity level. To separate which
+diagnostics are high severity and which are low severity, expose multiple
+Analyzers instead. Analyzers should also be separated when their
+diagnostics belong in different groups, or could be tagged differently
+before being shown to the end user. Analyzers should document their severity
+level to help downstream tools surface diagnostics properly.
+
Most Analyzers inspect typed Go syntax trees, but a few, such as asmdecl
and buildtag, inspect the raw text of Go source files or even non-Go
files such as assembly. To report a diagnostic against a line of a
diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go
index 88ca6691de..6e91391ce2 100644
--- a/vendor/golang.org/x/tools/go/packages/golist.go
+++ b/vendor/golang.org/x/tools/go/packages/golist.go
@@ -24,7 +24,6 @@ import (
"golang.org/x/tools/go/internal/packagesdriver"
"golang.org/x/tools/internal/gocommand"
- "golang.org/x/tools/internal/packagesinternal"
"golang.org/x/xerrors"
)
@@ -382,7 +381,7 @@ type jsonPackage struct {
Imports []string
ImportMap map[string]string
Deps []string
- Module *packagesinternal.Module
+ Module *Module
TestGoFiles []string
TestImports []string
XTestGoFiles []string
@@ -541,7 +540,26 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse
CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles),
OtherFiles: absJoin(p.Dir, otherFiles(p)...),
forTest: p.ForTest,
- module: p.Module,
+ Module: p.Module,
+ }
+
+ if (state.cfg.Mode&typecheckCgo) != 0 && len(p.CgoFiles) != 0 {
+ if len(p.CompiledGoFiles) > len(p.GoFiles) {
+ // We need the cgo definitions, which are in the first
+ // CompiledGoFile after the non-cgo ones. This is a hack but there
+ // isn't currently a better way to find it. We also need the pure
+ // Go files and unprocessed cgo files, all of which are already
+ // in pkg.GoFiles.
+ cgoTypes := p.CompiledGoFiles[len(p.GoFiles)]
+ pkg.CompiledGoFiles = append([]string{cgoTypes}, pkg.GoFiles...)
+ } else {
+ // golang/go#38990: go list silently fails to do cgo processing
+ pkg.CompiledGoFiles = nil
+ pkg.Errors = append(pkg.Errors, Error{
+ Msg: "go list failed to return CompiledGoFiles; https://golang.org/issue/38990?",
+ Kind: ListError,
+ })
+ }
}
// Work around https://golang.org/issue/28749:
diff --git a/vendor/golang.org/x/tools/go/packages/golist_overlay.go b/vendor/golang.org/x/tools/go/packages/golist_overlay.go
index bdba230e1e..b82c90d7c6 100644
--- a/vendor/golang.org/x/tools/go/packages/golist_overlay.go
+++ b/vendor/golang.org/x/tools/go/packages/golist_overlay.go
@@ -5,6 +5,7 @@ import (
"fmt"
"go/parser"
"go/token"
+ "log"
"os"
"path/filepath"
"sort"
@@ -22,10 +23,15 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
needPkgsSet := make(map[string]bool)
modifiedPkgsSet := make(map[string]bool)
+ pkgOfDir := make(map[string][]*Package)
for _, pkg := range response.dr.Packages {
// This is an approximation of import path to id. This can be
// wrong for tests, vendored packages, and a number of other cases.
havePkgs[pkg.PkgPath] = pkg.ID
+ x := commonDir(pkg.GoFiles)
+ if x != "" {
+ pkgOfDir[x] = append(pkgOfDir[x], pkg)
+ }
}
// If no new imports are added, it is safe to avoid loading any needPkgs.
@@ -64,6 +70,9 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
// to the overlay.
continue
}
+ // If all the overlay files belong to a different package, change the
+ // package name to that package.
+ maybeFixPackageName(pkgName, isTestFile, pkgOfDir[dir])
nextPackage:
for _, p := range response.dr.Packages {
if pkgName != p.Name && p.ID != "command-line-arguments" {
@@ -112,16 +121,21 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
if isTestFile && !isXTest {
id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath)
}
- // Try to reclaim a package with the same id if it exists in the response.
+ // Try to reclaim a package with the same ID, if it exists in the response.
for _, p := range response.dr.Packages {
if reclaimPackage(p, id, opath, contents) {
pkg = p
break
}
}
- // Otherwise, create a new package
+ // Otherwise, create a new package.
if pkg == nil {
- pkg = &Package{PkgPath: pkgPath, ID: id, Name: pkgName, Imports: make(map[string]*Package)}
+ pkg = &Package{
+ PkgPath: pkgPath,
+ ID: id,
+ Name: pkgName,
+ Imports: make(map[string]*Package),
+ }
response.addPackage(pkg)
havePkgs[pkg.PkgPath] = id
// Add the production package's sources for a test variant.
@@ -134,6 +148,7 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
pkg.Imports[k] = &Package{ID: v.ID}
}
}
+ // TODO(rstambler): Handle forTest for x_tests.
}
}
if !fileExists {
@@ -149,6 +164,8 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif
continue
}
for _, imp := range imports {
+ // TODO(rstambler): If the package is an x test and the import has
+ // a test variant, make sure to replace it.
if _, found := pkg.Imports[imp]; found {
continue
}
@@ -384,3 +401,57 @@ func extractPackageName(filename string, contents []byte) (string, bool) {
}
return f.Name.Name, true
}
+
+func commonDir(a []string) string {
+ seen := make(map[string]bool)
+ x := append([]string{}, a...)
+ for _, f := range x {
+ seen[filepath.Dir(f)] = true
+ }
+ if len(seen) > 1 {
+ log.Fatalf("commonDir saw %v for %v", seen, x)
+ }
+ for k := range seen {
+ // len(seen) == 1
+ return k
+ }
+ return "" // no files
+}
+
+// It is possible that the files in the disk directory dir have a different package
+// name from newName, which is deduced from the overlays. If they all have a different
+// package name, and they all have the same package name, then that name becomes
+// the package name.
+// It returns true if it changes the package name, false otherwise.
+func maybeFixPackageName(newName string, isTestFile bool, pkgsOfDir []*Package) {
+ names := make(map[string]int)
+ for _, p := range pkgsOfDir {
+ names[p.Name]++
+ }
+ if len(names) != 1 {
+ // some files are in different packages
+ return
+ }
+ var oldName string
+ for k := range names {
+ oldName = k
+ }
+ if newName == oldName {
+ return
+ }
+ // We might have a case where all of the package names in the directory are
+ // the same, but the overlay file is for an x test, which belongs to its
+ // own package. If the x test does not yet exist on disk, we may not yet
+ // have its package name on disk, but we should not rename the packages.
+ //
+ // We use a heuristic to determine if this file belongs to an x test:
+ // The test file should have a package name whose package name has a _test
+ // suffix or looks like "newName_test".
+ maybeXTest := strings.HasPrefix(oldName+"_test", newName) || strings.HasSuffix(newName, "_test")
+ if isTestFile && maybeXTest {
+ return
+ }
+ for _, p := range pkgsOfDir {
+ p.Name = newName
+ }
+}
diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go
index 03fd999c0c..04053f1e7d 100644
--- a/vendor/golang.org/x/tools/go/packages/packages.go
+++ b/vendor/golang.org/x/tools/go/packages/packages.go
@@ -21,10 +21,12 @@ import (
"path/filepath"
"strings"
"sync"
+ "time"
"golang.org/x/tools/go/gcexportdata"
"golang.org/x/tools/internal/gocommand"
"golang.org/x/tools/internal/packagesinternal"
+ "golang.org/x/tools/internal/typesinternal"
)
// A LoadMode controls the amount of detail to return when loading.
@@ -70,6 +72,13 @@ const (
// NeedTypesSizes adds TypesSizes.
NeedTypesSizes
+
+ // typecheckCgo enables full support for type checking cgo. Requires Go 1.15+.
+ // Modifies CompiledGoFiles and Types, and has no effect on its own.
+ typecheckCgo
+
+ // NeedModule adds Module.
+ NeedModule
)
const (
@@ -182,6 +191,13 @@ type driver func(cfg *Config, patterns ...string) (*driverResponse, error)
// driverResponse contains the results for a driver query.
type driverResponse struct {
+ // NotHandled is returned if the request can't be handled by the current
+ // driver. If an external driver returns a response with NotHandled, the
+ // rest of the driverResponse is ignored, and go/packages will fallback
+ // to the next driver. If go/packages is extended in the future to support
+ // lists of multiple drivers, go/packages will fall back to the next driver.
+ NotHandled bool
+
// Sizes, if not nil, is the types.Sizes to use when type checking.
Sizes *types.StdSizes
@@ -223,14 +239,22 @@ func Load(cfg *Config, patterns ...string) ([]*Package, error) {
return l.refine(response.Roots, response.Packages...)
}
-// defaultDriver is a driver that looks for an external driver binary, and if
-// it does not find it falls back to the built in go list driver.
+// defaultDriver is a driver that implements go/packages' fallback behavior.
+// It will try to request to an external driver, if one exists. If there's
+// no external driver, or the driver returns a response with NotHandled set,
+// defaultDriver will fall back to the go list driver.
func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
driver := findExternalDriver(cfg)
if driver == nil {
driver = goListDriver
}
- return driver(cfg, patterns...)
+ response, err := driver(cfg, patterns...)
+ if err != nil {
+ return response, err
+ } else if response.NotHandled {
+ return goListDriver(cfg, patterns...)
+ }
+ return response, nil
}
// A Package describes a loaded Go package.
@@ -257,7 +281,7 @@ type Package struct {
GoFiles []string
// CompiledGoFiles lists the absolute file paths of the package's source
- // files that were presented to the compiler.
+ // files that are suitable for type checking.
// This may differ from GoFiles if files are processed before compilation.
CompiledGoFiles []string
@@ -305,22 +329,39 @@ type Package struct {
forTest string
// module is the module information for the package if it exists.
- module *packagesinternal.Module
+ Module *Module
+}
+
+// Module provides module information for a package.
+type Module struct {
+ Path string // module path
+ Version string // module version
+ Replace *Module // replaced by this module
+ Time *time.Time // time version was created
+ Main bool // is this the main module?
+ Indirect bool // is this module only an indirect dependency of main module?
+ Dir string // directory holding files for this module, if any
+ GoMod string // path to go.mod file used when loading this module, if any
+ GoVersion string // go version used in module
+ Error *ModuleError // error loading module
+}
+
+// ModuleError holds errors loading a module.
+type ModuleError struct {
+ Err string // the error itself
}
func init() {
packagesinternal.GetForTest = func(p interface{}) string {
return p.(*Package).forTest
}
- packagesinternal.GetModule = func(p interface{}) *packagesinternal.Module {
- return p.(*Package).module
- }
packagesinternal.GetGoCmdRunner = func(config interface{}) *gocommand.Runner {
return config.(*Config).gocmdRunner
}
packagesinternal.SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {
config.(*Config).gocmdRunner = runner
}
+ packagesinternal.TypecheckCgo = int(typecheckCgo)
}
// An Error describes a problem with a package's metadata, syntax, or types.
@@ -703,6 +744,9 @@ func (ld *loader) refine(roots []string, list ...*Package) ([]*Package, error) {
if ld.requestedMode&NeedTypesSizes == 0 {
ld.pkgs[i].TypesSizes = nil
}
+ if ld.requestedMode&NeedModule == 0 {
+ ld.pkgs[i].Module = nil
+ }
}
return result, nil
@@ -878,6 +922,15 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) {
Error: appendError,
Sizes: ld.sizes,
}
+ if (ld.Mode & typecheckCgo) != 0 {
+ if !typesinternal.SetUsesCgo(tc) {
+ appendError(Error{
+ Msg: "typecheckCgo requires Go 1.15+",
+ Kind: ListError,
+ })
+ return
+ }
+ }
types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax)
lpkg.importErrors = nil // no longer needed
diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
index 882e3b3d8a..cffd7acbee 100644
--- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
+++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go
@@ -226,7 +226,8 @@ func For(obj types.Object) (Path, error) {
// the best paths because non-types may
// refer to types, but not the reverse.
empty := make([]byte, 0, 48) // initial space
- for _, name := range scope.Names() {
+ names := scope.Names()
+ for _, name := range names {
o := scope.Lookup(name)
tname, ok := o.(*types.TypeName)
if !ok {
@@ -253,7 +254,7 @@ func For(obj types.Object) (Path, error) {
// Then inspect everything else:
// non-types, and declared methods of defined types.
- for _, name := range scope.Names() {
+ for _, name := range names {
o := scope.Lookup(name)
path := append(empty, name...)
if _, ok := o.(*types.TypeName); !ok {
diff --git a/vendor/golang.org/x/tools/internal/event/core/event.go b/vendor/golang.org/x/tools/internal/event/core/event.go
new file mode 100644
index 0000000000..e37b494915
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/event/core/event.go
@@ -0,0 +1,85 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package core provides support for event based telemetry.
+package core
+
+import (
+ "fmt"
+ "time"
+
+ "golang.org/x/tools/internal/event/label"
+)
+
+// Event holds the information about an event of note that ocurred.
+type Event struct {
+ at time.Time
+
+ // As events are often on the stack, storing the first few labels directly
+ // in the event can avoid an allocation at all for the very common cases of
+ // simple events.
+ // The length needs to be large enough to cope with the majority of events
+ // but no so large as to cause undue stack pressure.
+ // A log message with two values will use 3 labels (one for each value and
+ // one for the message itself).
+
+ static [3]label.Label // inline storage for the first few labels
+ dynamic []label.Label // dynamically sized storage for remaining labels
+}
+
+// eventLabelMap implements label.Map for a the labels of an Event.
+type eventLabelMap struct {
+ event Event
+}
+
+func (ev Event) At() time.Time { return ev.at }
+
+func (ev Event) Format(f fmt.State, r rune) {
+ if !ev.at.IsZero() {
+ fmt.Fprint(f, ev.at.Format("2006/01/02 15:04:05 "))
+ }
+ for index := 0; ev.Valid(index); index++ {
+ if l := ev.Label(index); l.Valid() {
+ fmt.Fprintf(f, "\n\t%v", l)
+ }
+ }
+}
+
+func (ev Event) Valid(index int) bool {
+ return index >= 0 && index < len(ev.static)+len(ev.dynamic)
+}
+
+func (ev Event) Label(index int) label.Label {
+ if index < len(ev.static) {
+ return ev.static[index]
+ }
+ return ev.dynamic[index-len(ev.static)]
+}
+
+func (ev Event) Find(key label.Key) label.Label {
+ for _, l := range ev.static {
+ if l.Key() == key {
+ return l
+ }
+ }
+ for _, l := range ev.dynamic {
+ if l.Key() == key {
+ return l
+ }
+ }
+ return label.Label{}
+}
+
+func MakeEvent(static [3]label.Label, labels []label.Label) Event {
+ return Event{
+ static: static,
+ dynamic: labels,
+ }
+}
+
+// CloneEvent event returns a copy of the event with the time adjusted to at.
+func CloneEvent(ev Event, at time.Time) Event {
+ ev.at = at
+ return ev
+}
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/export.go b/vendor/golang.org/x/tools/internal/event/core/export.go
similarity index 76%
rename from vendor/golang.org/x/tools/internal/telemetry/event/export.go
rename to vendor/golang.org/x/tools/internal/event/core/export.go
index a2633b6023..05f3a9a579 100644
--- a/vendor/golang.org/x/tools/internal/telemetry/event/export.go
+++ b/vendor/golang.org/x/tools/internal/event/core/export.go
@@ -2,18 +2,20 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-package event
+package core
import (
"context"
"sync/atomic"
"time"
"unsafe"
+
+ "golang.org/x/tools/internal/event/label"
)
// Exporter is a function that handles events.
// It may return a modified context and event.
-type Exporter func(context.Context, Event, TagMap) context.Context
+type Exporter func(context.Context, Event, label.Map) context.Context
var (
exporter unsafe.Pointer
@@ -35,16 +37,16 @@ func SetExporter(e Exporter) {
}
// deliver is called to deliver an event to the supplied exporter.
-// it will fill in the time and generate the basic tag source.
+// it will fill in the time.
func deliver(ctx context.Context, exporter Exporter, ev Event) context.Context {
// add the current time to the event
- ev.At = time.Now()
+ ev.at = time.Now()
// hand the event off to the current exporter
return exporter(ctx, ev, ev)
}
-// dispatch is called to deliver an event to the global exporter if set.
-func dispatch(ctx context.Context, ev Event) context.Context {
+// Export is called to deliver an event to the global exporter if set.
+func Export(ctx context.Context, ev Event) context.Context {
// get the global exporter and abort early if there is not one
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
if exporterPtr == nil {
@@ -53,11 +55,11 @@ func dispatch(ctx context.Context, ev Event) context.Context {
return deliver(ctx, *exporterPtr, ev)
}
-// dispatchPair is called to deliver a start event to the supplied exporter.
+// ExportPair is called to deliver a start event to the supplied exporter.
// It also returns a function that will deliver the end event to the same
// exporter.
-// it will fill in the time and generate the basic tag source.
-func dispatchPair(ctx context.Context, begin, end Event) (context.Context, func()) {
+// It will fill in the time.
+func ExportPair(ctx context.Context, begin, end Event) (context.Context, func()) {
// get the global exporter and abort early if there is not one
exporterPtr := (*Exporter)(atomic.LoadPointer(&exporter))
if exporterPtr == nil {
diff --git a/vendor/golang.org/x/tools/internal/event/core/fast.go b/vendor/golang.org/x/tools/internal/event/core/fast.go
new file mode 100644
index 0000000000..06c1d4615e
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/event/core/fast.go
@@ -0,0 +1,77 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package core
+
+import (
+ "context"
+
+ "golang.org/x/tools/internal/event/keys"
+ "golang.org/x/tools/internal/event/label"
+)
+
+// Log1 takes a message and one label delivers a log event to the exporter.
+// It is a customized version of Print that is faster and does no allocation.
+func Log1(ctx context.Context, message string, t1 label.Label) {
+ Export(ctx, MakeEvent([3]label.Label{
+ keys.Msg.Of(message),
+ t1,
+ }, nil))
+}
+
+// Log2 takes a message and two labels and delivers a log event to the exporter.
+// It is a customized version of Print that is faster and does no allocation.
+func Log2(ctx context.Context, message string, t1 label.Label, t2 label.Label) {
+ Export(ctx, MakeEvent([3]label.Label{
+ keys.Msg.Of(message),
+ t1,
+ t2,
+ }, nil))
+}
+
+// Metric1 sends a label event to the exporter with the supplied labels.
+func Metric1(ctx context.Context, t1 label.Label) context.Context {
+ return Export(ctx, MakeEvent([3]label.Label{
+ keys.Metric.New(),
+ t1,
+ }, nil))
+}
+
+// Metric2 sends a label event to the exporter with the supplied labels.
+func Metric2(ctx context.Context, t1, t2 label.Label) context.Context {
+ return Export(ctx, MakeEvent([3]label.Label{
+ keys.Metric.New(),
+ t1,
+ t2,
+ }, nil))
+}
+
+// Start1 sends a span start event with the supplied label list to the exporter.
+// It also returns a function that will end the span, which should normally be
+// deferred.
+func Start1(ctx context.Context, name string, t1 label.Label) (context.Context, func()) {
+ return ExportPair(ctx,
+ MakeEvent([3]label.Label{
+ keys.Start.Of(name),
+ t1,
+ }, nil),
+ MakeEvent([3]label.Label{
+ keys.End.New(),
+ }, nil))
+}
+
+// Start2 sends a span start event with the supplied label list to the exporter.
+// It also returns a function that will end the span, which should normally be
+// deferred.
+func Start2(ctx context.Context, name string, t1, t2 label.Label) (context.Context, func()) {
+ return ExportPair(ctx,
+ MakeEvent([3]label.Label{
+ keys.Start.Of(name),
+ t1,
+ t2,
+ }, nil),
+ MakeEvent([3]label.Label{
+ keys.End.New(),
+ }, nil))
+}
diff --git a/vendor/golang.org/x/tools/internal/event/doc.go b/vendor/golang.org/x/tools/internal/event/doc.go
new file mode 100644
index 0000000000..5dc6e6babe
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/event/doc.go
@@ -0,0 +1,7 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package event provides a set of packages that cover the main
+// concepts of telemetry in an implementation agnostic way.
+package event
diff --git a/vendor/golang.org/x/tools/internal/event/event.go b/vendor/golang.org/x/tools/internal/event/event.go
new file mode 100644
index 0000000000..4d55e577d1
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/event/event.go
@@ -0,0 +1,127 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package event
+
+import (
+ "context"
+
+ "golang.org/x/tools/internal/event/core"
+ "golang.org/x/tools/internal/event/keys"
+ "golang.org/x/tools/internal/event/label"
+)
+
+// Exporter is a function that handles events.
+// It may return a modified context and event.
+type Exporter func(context.Context, core.Event, label.Map) context.Context
+
+// SetExporter sets the global exporter function that handles all events.
+// The exporter is called synchronously from the event call site, so it should
+// return quickly so as not to hold up user code.
+func SetExporter(e Exporter) {
+ core.SetExporter(core.Exporter(e))
+}
+
+// Log takes a message and a label list and combines them into a single event
+// before delivering them to the exporter.
+func Log(ctx context.Context, message string, labels ...label.Label) {
+ core.Export(ctx, core.MakeEvent([3]label.Label{
+ keys.Msg.Of(message),
+ }, labels))
+}
+
+// IsLog returns true if the event was built by the Log function.
+// It is intended to be used in exporters to identify the semantics of the
+// event when deciding what to do with it.
+func IsLog(ev core.Event) bool {
+ return ev.Label(0).Key() == keys.Msg
+}
+
+// Error takes a message and a label list and combines them into a single event
+// before delivering them to the exporter. It captures the error in the
+// delivered event.
+func Error(ctx context.Context, message string, err error, labels ...label.Label) {
+ core.Export(ctx, core.MakeEvent([3]label.Label{
+ keys.Msg.Of(message),
+ keys.Err.Of(err),
+ }, labels))
+}
+
+// IsError returns true if the event was built by the Error function.
+// It is intended to be used in exporters to identify the semantics of the
+// event when deciding what to do with it.
+func IsError(ev core.Event) bool {
+ return ev.Label(0).Key() == keys.Msg &&
+ ev.Label(1).Key() == keys.Err
+}
+
+// Metric sends a label event to the exporter with the supplied labels.
+func Metric(ctx context.Context, labels ...label.Label) {
+ core.Export(ctx, core.MakeEvent([3]label.Label{
+ keys.Metric.New(),
+ }, labels))
+}
+
+// IsMetric returns true if the event was built by the Metric function.
+// It is intended to be used in exporters to identify the semantics of the
+// event when deciding what to do with it.
+func IsMetric(ev core.Event) bool {
+ return ev.Label(0).Key() == keys.Metric
+}
+
+// Label sends a label event to the exporter with the supplied labels.
+func Label(ctx context.Context, labels ...label.Label) context.Context {
+ return core.Export(ctx, core.MakeEvent([3]label.Label{
+ keys.Label.New(),
+ }, labels))
+}
+
+// IsLabel returns true if the event was built by the Label function.
+// It is intended to be used in exporters to identify the semantics of the
+// event when deciding what to do with it.
+func IsLabel(ev core.Event) bool {
+ return ev.Label(0).Key() == keys.Label
+}
+
+// Start sends a span start event with the supplied label list to the exporter.
+// It also returns a function that will end the span, which should normally be
+// deferred.
+func Start(ctx context.Context, name string, labels ...label.Label) (context.Context, func()) {
+ return core.ExportPair(ctx,
+ core.MakeEvent([3]label.Label{
+ keys.Start.Of(name),
+ }, labels),
+ core.MakeEvent([3]label.Label{
+ keys.End.New(),
+ }, nil))
+}
+
+// IsStart returns true if the event was built by the Start function.
+// It is intended to be used in exporters to identify the semantics of the
+// event when deciding what to do with it.
+func IsStart(ev core.Event) bool {
+ return ev.Label(0).Key() == keys.Start
+}
+
+// IsEnd returns true if the event was built by the End function.
+// It is intended to be used in exporters to identify the semantics of the
+// event when deciding what to do with it.
+func IsEnd(ev core.Event) bool {
+ return ev.Label(0).Key() == keys.End
+}
+
+// Detach returns a context without an associated span.
+// This allows the creation of spans that are not children of the current span.
+func Detach(ctx context.Context) context.Context {
+ return core.Export(ctx, core.MakeEvent([3]label.Label{
+ keys.Detach.New(),
+ }, nil))
+}
+
+// IsDetach returns true if the event was built by the Detach function.
+// It is intended to be used in exporters to identify the semantics of the
+// event when deciding what to do with it.
+func IsDetach(ev core.Event) bool {
+ return ev.Label(0).Key() == keys.Detach
+}
diff --git a/vendor/golang.org/x/tools/internal/event/keys/keys.go b/vendor/golang.org/x/tools/internal/event/keys/keys.go
new file mode 100644
index 0000000000..a02206e301
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/event/keys/keys.go
@@ -0,0 +1,564 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package keys
+
+import (
+ "fmt"
+ "io"
+ "math"
+ "strconv"
+
+ "golang.org/x/tools/internal/event/label"
+)
+
+// Value represents a key for untyped values.
+type Value struct {
+ name string
+ description string
+}
+
+// New creates a new Key for untyped values.
+func New(name, description string) *Value {
+ return &Value{name: name, description: description}
+}
+
+func (k *Value) Name() string { return k.name }
+func (k *Value) Description() string { return k.description }
+
+func (k *Value) Format(w io.Writer, buf []byte, l label.Label) {
+ fmt.Fprint(w, k.From(l))
+}
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Value) Get(lm label.Map) interface{} {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return nil
+}
+
+// From can be used to get a value from a Label.
+func (k *Value) From(t label.Label) interface{} { return t.UnpackValue() }
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Value) Of(value interface{}) label.Label { return label.OfValue(k, value) }
+
+// Tag represents a key for tagging labels that have no value.
+// These are used when the existence of the label is the entire information it
+// carries, such as marking events to be of a specific kind, or from a specific
+// package.
+type Tag struct {
+ name string
+ description string
+}
+
+// NewTag creates a new Key for tagging labels.
+func NewTag(name, description string) *Tag {
+ return &Tag{name: name, description: description}
+}
+
+func (k *Tag) Name() string { return k.name }
+func (k *Tag) Description() string { return k.description }
+
+func (k *Tag) Format(w io.Writer, buf []byte, l label.Label) {}
+
+// New creates a new Label with this key.
+func (k *Tag) New() label.Label { return label.OfValue(k, nil) }
+
+// Int represents a key
+type Int struct {
+ name string
+ description string
+}
+
+// NewInt creates a new Key for int values.
+func NewInt(name, description string) *Int {
+ return &Int{name: name, description: description}
+}
+
+func (k *Int) Name() string { return k.name }
+func (k *Int) Description() string { return k.description }
+
+func (k *Int) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Int) Of(v int) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Int) Get(lm label.Map) int {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *Int) From(t label.Label) int { return int(t.Unpack64()) }
+
+// Int8 represents a key
+type Int8 struct {
+ name string
+ description string
+}
+
+// NewInt8 creates a new Key for int8 values.
+func NewInt8(name, description string) *Int8 {
+ return &Int8{name: name, description: description}
+}
+
+func (k *Int8) Name() string { return k.name }
+func (k *Int8) Description() string { return k.description }
+
+func (k *Int8) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Int8) Of(v int8) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Int8) Get(lm label.Map) int8 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *Int8) From(t label.Label) int8 { return int8(t.Unpack64()) }
+
+// Int16 represents a key
+type Int16 struct {
+ name string
+ description string
+}
+
+// NewInt16 creates a new Key for int16 values.
+func NewInt16(name, description string) *Int16 {
+ return &Int16{name: name, description: description}
+}
+
+func (k *Int16) Name() string { return k.name }
+func (k *Int16) Description() string { return k.description }
+
+func (k *Int16) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Int16) Of(v int16) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Int16) Get(lm label.Map) int16 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *Int16) From(t label.Label) int16 { return int16(t.Unpack64()) }
+
+// Int32 represents a key
+type Int32 struct {
+ name string
+ description string
+}
+
+// NewInt32 creates a new Key for int32 values.
+func NewInt32(name, description string) *Int32 {
+ return &Int32{name: name, description: description}
+}
+
+func (k *Int32) Name() string { return k.name }
+func (k *Int32) Description() string { return k.description }
+
+func (k *Int32) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendInt(buf, int64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Int32) Of(v int32) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Int32) Get(lm label.Map) int32 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *Int32) From(t label.Label) int32 { return int32(t.Unpack64()) }
+
+// Int64 represents a key
+type Int64 struct {
+ name string
+ description string
+}
+
+// NewInt64 creates a new Key for int64 values.
+func NewInt64(name, description string) *Int64 {
+ return &Int64{name: name, description: description}
+}
+
+func (k *Int64) Name() string { return k.name }
+func (k *Int64) Description() string { return k.description }
+
+func (k *Int64) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendInt(buf, k.From(l), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Int64) Of(v int64) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Int64) Get(lm label.Map) int64 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *Int64) From(t label.Label) int64 { return int64(t.Unpack64()) }
+
+// UInt represents a key
+type UInt struct {
+ name string
+ description string
+}
+
+// NewUInt creates a new Key for uint values.
+func NewUInt(name, description string) *UInt {
+ return &UInt{name: name, description: description}
+}
+
+func (k *UInt) Name() string { return k.name }
+func (k *UInt) Description() string { return k.description }
+
+func (k *UInt) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *UInt) Of(v uint) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *UInt) Get(lm label.Map) uint {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *UInt) From(t label.Label) uint { return uint(t.Unpack64()) }
+
+// UInt8 represents a key
+type UInt8 struct {
+ name string
+ description string
+}
+
+// NewUInt8 creates a new Key for uint8 values.
+func NewUInt8(name, description string) *UInt8 {
+ return &UInt8{name: name, description: description}
+}
+
+func (k *UInt8) Name() string { return k.name }
+func (k *UInt8) Description() string { return k.description }
+
+func (k *UInt8) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *UInt8) Of(v uint8) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *UInt8) Get(lm label.Map) uint8 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *UInt8) From(t label.Label) uint8 { return uint8(t.Unpack64()) }
+
+// UInt16 represents a key
+type UInt16 struct {
+ name string
+ description string
+}
+
+// NewUInt16 creates a new Key for uint16 values.
+func NewUInt16(name, description string) *UInt16 {
+ return &UInt16{name: name, description: description}
+}
+
+func (k *UInt16) Name() string { return k.name }
+func (k *UInt16) Description() string { return k.description }
+
+func (k *UInt16) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *UInt16) Of(v uint16) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *UInt16) Get(lm label.Map) uint16 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *UInt16) From(t label.Label) uint16 { return uint16(t.Unpack64()) }
+
+// UInt32 represents a key
+type UInt32 struct {
+ name string
+ description string
+}
+
+// NewUInt32 creates a new Key for uint32 values.
+func NewUInt32(name, description string) *UInt32 {
+ return &UInt32{name: name, description: description}
+}
+
+func (k *UInt32) Name() string { return k.name }
+func (k *UInt32) Description() string { return k.description }
+
+func (k *UInt32) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendUint(buf, uint64(k.From(l)), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *UInt32) Of(v uint32) label.Label { return label.Of64(k, uint64(v)) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *UInt32) Get(lm label.Map) uint32 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *UInt32) From(t label.Label) uint32 { return uint32(t.Unpack64()) }
+
+// UInt64 represents a key
+type UInt64 struct {
+ name string
+ description string
+}
+
+// NewUInt64 creates a new Key for uint64 values.
+func NewUInt64(name, description string) *UInt64 {
+ return &UInt64{name: name, description: description}
+}
+
+func (k *UInt64) Name() string { return k.name }
+func (k *UInt64) Description() string { return k.description }
+
+func (k *UInt64) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendUint(buf, k.From(l), 10))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *UInt64) Of(v uint64) label.Label { return label.Of64(k, v) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *UInt64) Get(lm label.Map) uint64 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *UInt64) From(t label.Label) uint64 { return t.Unpack64() }
+
+// Float32 represents a key
+type Float32 struct {
+ name string
+ description string
+}
+
+// NewFloat32 creates a new Key for float32 values.
+func NewFloat32(name, description string) *Float32 {
+ return &Float32{name: name, description: description}
+}
+
+func (k *Float32) Name() string { return k.name }
+func (k *Float32) Description() string { return k.description }
+
+func (k *Float32) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendFloat(buf, float64(k.From(l)), 'E', -1, 32))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Float32) Of(v float32) label.Label {
+ return label.Of64(k, uint64(math.Float32bits(v)))
+}
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Float32) Get(lm label.Map) float32 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *Float32) From(t label.Label) float32 {
+ return math.Float32frombits(uint32(t.Unpack64()))
+}
+
+// Float64 represents a key
+type Float64 struct {
+ name string
+ description string
+}
+
+// NewFloat64 creates a new Key for int64 values.
+func NewFloat64(name, description string) *Float64 {
+ return &Float64{name: name, description: description}
+}
+
+func (k *Float64) Name() string { return k.name }
+func (k *Float64) Description() string { return k.description }
+
+func (k *Float64) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendFloat(buf, k.From(l), 'E', -1, 64))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Float64) Of(v float64) label.Label {
+ return label.Of64(k, math.Float64bits(v))
+}
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Float64) Get(lm label.Map) float64 {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return 0
+}
+
+// From can be used to get a value from a Label.
+func (k *Float64) From(t label.Label) float64 {
+ return math.Float64frombits(t.Unpack64())
+}
+
+// String represents a key
+type String struct {
+ name string
+ description string
+}
+
+// NewString creates a new Key for int64 values.
+func NewString(name, description string) *String {
+ return &String{name: name, description: description}
+}
+
+func (k *String) Name() string { return k.name }
+func (k *String) Description() string { return k.description }
+
+func (k *String) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendQuote(buf, k.From(l)))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *String) Of(v string) label.Label { return label.OfString(k, v) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *String) Get(lm label.Map) string {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return ""
+}
+
+// From can be used to get a value from a Label.
+func (k *String) From(t label.Label) string { return t.UnpackString() }
+
+// Boolean represents a key
+type Boolean struct {
+ name string
+ description string
+}
+
+// NewBoolean creates a new Key for bool values.
+func NewBoolean(name, description string) *Boolean {
+ return &Boolean{name: name, description: description}
+}
+
+func (k *Boolean) Name() string { return k.name }
+func (k *Boolean) Description() string { return k.description }
+
+func (k *Boolean) Format(w io.Writer, buf []byte, l label.Label) {
+ w.Write(strconv.AppendBool(buf, k.From(l)))
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Boolean) Of(v bool) label.Label {
+ if v {
+ return label.Of64(k, 1)
+ }
+ return label.Of64(k, 0)
+}
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Boolean) Get(lm label.Map) bool {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return false
+}
+
+// From can be used to get a value from a Label.
+func (k *Boolean) From(t label.Label) bool { return t.Unpack64() > 0 }
+
+// Error represents a key
+type Error struct {
+ name string
+ description string
+}
+
+// NewError creates a new Key for int64 values.
+func NewError(name, description string) *Error {
+ return &Error{name: name, description: description}
+}
+
+func (k *Error) Name() string { return k.name }
+func (k *Error) Description() string { return k.description }
+
+func (k *Error) Format(w io.Writer, buf []byte, l label.Label) {
+ io.WriteString(w, k.From(l).Error())
+}
+
+// Of creates a new Label with this key and the supplied value.
+func (k *Error) Of(v error) label.Label { return label.OfValue(k, v) }
+
+// Get can be used to get a label for the key from a label.Map.
+func (k *Error) Get(lm label.Map) error {
+ if t := lm.Find(k); t.Valid() {
+ return k.From(t)
+ }
+ return nil
+}
+
+// From can be used to get a value from a Label.
+func (k *Error) From(t label.Label) error {
+ err, _ := t.UnpackValue().(error)
+ return err
+}
diff --git a/vendor/golang.org/x/tools/internal/event/keys/standard.go b/vendor/golang.org/x/tools/internal/event/keys/standard.go
new file mode 100644
index 0000000000..7e95866592
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/event/keys/standard.go
@@ -0,0 +1,22 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package keys
+
+var (
+ // Msg is a key used to add message strings to label lists.
+ Msg = NewString("message", "a readable message")
+ // Label is a key used to indicate an event adds labels to the context.
+ Label = NewTag("label", "a label context marker")
+ // Start is used for things like traces that have a name.
+ Start = NewString("start", "span start")
+ // Metric is a key used to indicate an event records metrics.
+ End = NewTag("end", "a span end marker")
+ // Metric is a key used to indicate an event records metrics.
+ Detach = NewTag("detach", "a span detach marker")
+ // Err is a key used to add error values to label lists.
+ Err = NewError("error", "an error that occurred")
+ // Metric is a key used to indicate an event records metrics.
+ Metric = NewTag("metric", "a metric event marker")
+)
diff --git a/vendor/golang.org/x/tools/internal/event/label/label.go b/vendor/golang.org/x/tools/internal/event/label/label.go
new file mode 100644
index 0000000000..b55c12eb25
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/event/label/label.go
@@ -0,0 +1,213 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package label
+
+import (
+ "fmt"
+ "io"
+ "reflect"
+ "unsafe"
+)
+
+// Key is used as the identity of a Label.
+// Keys are intended to be compared by pointer only, the name should be unique
+// for communicating with external systems, but it is not required or enforced.
+type Key interface {
+ // Name returns the key name.
+ Name() string
+ // Description returns a string that can be used to describe the value.
+ Description() string
+
+ // Format is used in formatting to append the value of the label to the
+ // supplied buffer.
+ // The formatter may use the supplied buf as a scratch area to avoid
+ // allocations.
+ Format(w io.Writer, buf []byte, l Label)
+}
+
+// Label holds a key and value pair.
+// It is normally used when passing around lists of labels.
+type Label struct {
+ key Key
+ packed uint64
+ untyped interface{}
+}
+
+// Map is the interface to a collection of Labels indexed by key.
+type Map interface {
+ // Find returns the label that matches the supplied key.
+ Find(key Key) Label
+}
+
+// List is the interface to something that provides an iterable
+// list of labels.
+// Iteration should start from 0 and continue until Valid returns false.
+type List interface {
+ // Valid returns true if the index is within range for the list.
+ // It does not imply the label at that index will itself be valid.
+ Valid(index int) bool
+ // Label returns the label at the given index.
+ Label(index int) Label
+}
+
+// list implements LabelList for a list of Labels.
+type list struct {
+ labels []Label
+}
+
+// filter wraps a LabelList filtering out specific labels.
+type filter struct {
+ keys []Key
+ underlying List
+}
+
+// listMap implements LabelMap for a simple list of labels.
+type listMap struct {
+ labels []Label
+}
+
+// mapChain implements LabelMap for a list of underlying LabelMap.
+type mapChain struct {
+ maps []Map
+}
+
+// OfValue creates a new label from the key and value.
+// This method is for implementing new key types, label creation should
+// normally be done with the Of method of the key.
+func OfValue(k Key, value interface{}) Label { return Label{key: k, untyped: value} }
+
+// UnpackValue assumes the label was built using LabelOfValue and returns the value
+// that was passed to that constructor.
+// This method is for implementing new key types, for type safety normal
+// access should be done with the From method of the key.
+func (t Label) UnpackValue() interface{} { return t.untyped }
+
+// Of64 creates a new label from a key and a uint64. This is often
+// used for non uint64 values that can be packed into a uint64.
+// This method is for implementing new key types, label creation should
+// normally be done with the Of method of the key.
+func Of64(k Key, v uint64) Label { return Label{key: k, packed: v} }
+
+// Unpack64 assumes the label was built using LabelOf64 and returns the value that
+// was passed to that constructor.
+// This method is for implementing new key types, for type safety normal
+// access should be done with the From method of the key.
+func (t Label) Unpack64() uint64 { return t.packed }
+
+// OfString creates a new label from a key and a string.
+// This method is for implementing new key types, label creation should
+// normally be done with the Of method of the key.
+func OfString(k Key, v string) Label {
+ hdr := (*reflect.StringHeader)(unsafe.Pointer(&v))
+ return Label{
+ key: k,
+ packed: uint64(hdr.Len),
+ untyped: unsafe.Pointer(hdr.Data),
+ }
+}
+
+// UnpackString assumes the label was built using LabelOfString and returns the
+// value that was passed to that constructor.
+// This method is for implementing new key types, for type safety normal
+// access should be done with the From method of the key.
+func (t Label) UnpackString() string {
+ var v string
+ hdr := (*reflect.StringHeader)(unsafe.Pointer(&v))
+ hdr.Data = uintptr(t.untyped.(unsafe.Pointer))
+ hdr.Len = int(t.packed)
+ return *(*string)(unsafe.Pointer(hdr))
+}
+
+// Valid returns true if the Label is a valid one (it has a key).
+func (t Label) Valid() bool { return t.key != nil }
+
+// Key returns the key of this Label.
+func (t Label) Key() Key { return t.key }
+
+// Format is used for debug printing of labels.
+func (t Label) Format(f fmt.State, r rune) {
+ if !t.Valid() {
+ io.WriteString(f, `nil`)
+ return
+ }
+ io.WriteString(f, t.Key().Name())
+ io.WriteString(f, "=")
+ var buf [128]byte
+ t.Key().Format(f, buf[:0], t)
+}
+
+func (l *list) Valid(index int) bool {
+ return index >= 0 && index < len(l.labels)
+}
+
+func (l *list) Label(index int) Label {
+ return l.labels[index]
+}
+
+func (f *filter) Valid(index int) bool {
+ return f.underlying.Valid(index)
+}
+
+func (f *filter) Label(index int) Label {
+ l := f.underlying.Label(index)
+ for _, f := range f.keys {
+ if l.Key() == f {
+ return Label{}
+ }
+ }
+ return l
+}
+
+func (lm listMap) Find(key Key) Label {
+ for _, l := range lm.labels {
+ if l.Key() == key {
+ return l
+ }
+ }
+ return Label{}
+}
+
+func (c mapChain) Find(key Key) Label {
+ for _, src := range c.maps {
+ l := src.Find(key)
+ if l.Valid() {
+ return l
+ }
+ }
+ return Label{}
+}
+
+var emptyList = &list{}
+
+func NewList(labels ...Label) List {
+ if len(labels) == 0 {
+ return emptyList
+ }
+ return &list{labels: labels}
+}
+
+func Filter(l List, keys ...Key) List {
+ if len(keys) == 0 {
+ return l
+ }
+ return &filter{keys: keys, underlying: l}
+}
+
+func NewMap(labels ...Label) Map {
+ return listMap{labels: labels}
+}
+
+func MergeMaps(srcs ...Map) Map {
+ var nonNil []Map
+ for _, src := range srcs {
+ if src != nil {
+ nonNil = append(nonNil, src)
+ }
+ }
+ if len(nonNil) == 1 {
+ return nonNil[0]
+ }
+ return mapChain{maps: nonNil}
+}
diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go
index 5b13412708..9aa7984561 100644
--- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go
+++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go
@@ -17,7 +17,7 @@ import (
"sync"
"time"
- "golang.org/x/tools/internal/telemetry/event"
+ "golang.org/x/tools/internal/event"
)
// An Runner will run go command invocations and serialize
@@ -39,7 +39,7 @@ func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, e
return stdout, friendly
}
-// Run calls Innvocation.RunRaw, serializing requests if they fight over
+// RunRaw calls Invocation.runRaw, serializing requests if they fight over
// go.mod changes.
func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) {
// We want to run invocations concurrently as much as possible. However,
@@ -93,6 +93,7 @@ func (i *Invocation) runRaw(ctx context.Context) (stdout *bytes.Buffer, stderr *
stderr = &bytes.Buffer{}
rawError = i.RunPiped(ctx, stdout, stderr)
if rawError != nil {
+ friendlyError = rawError
// Check for 'go' executable not being found.
if ee, ok := rawError.(*exec.Error); ok && ee.Err == exec.ErrNotFound {
friendlyError = fmt.Errorf("go command required, not found: %v", ee)
@@ -100,7 +101,7 @@ func (i *Invocation) runRaw(ctx context.Context) (stdout *bytes.Buffer, stderr *
if ctx.Err() != nil {
friendlyError = ctx.Err()
}
- friendlyError = fmt.Errorf("err: %v: stderr: %s", rawError, stderr)
+ friendlyError = fmt.Errorf("err: %v: stderr: %s", friendlyError, stderr)
}
return
}
diff --git a/vendor/golang.org/x/tools/internal/gocommand/vendor.go b/vendor/golang.org/x/tools/internal/gocommand/vendor.go
new file mode 100644
index 0000000000..1cd8d8473e
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/gocommand/vendor.go
@@ -0,0 +1,102 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gocommand
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+
+ "golang.org/x/mod/semver"
+)
+
+// ModuleJSON holds information about a module.
+type ModuleJSON struct {
+ Path string // module path
+ Replace *ModuleJSON // replaced by this module
+ Main bool // is this the main module?
+ Indirect bool // is this module only an indirect dependency of main module?
+ Dir string // directory holding files for this module, if any
+ GoMod string // path to go.mod file for this module, if any
+ GoVersion string // go version used in module
+}
+
+var modFlagRegexp = regexp.MustCompile(`-mod[ =](\w+)`)
+
+// VendorEnabled reports whether vendoring is enabled. It takes a *Runner to execute Go commands
+// with the supplied context.Context and Invocation. The Invocation can contain pre-defined fields,
+// of which only Verb and Args are modified to run the appropriate Go command.
+// Inspired by setDefaultBuildMod in modload/init.go
+func VendorEnabled(ctx context.Context, inv Invocation, r *Runner) (*ModuleJSON, bool, error) {
+ mainMod, go114, err := getMainModuleAnd114(ctx, inv, r)
+ if err != nil {
+ return nil, false, err
+ }
+
+ // We check the GOFLAGS to see if there is anything overridden or not.
+ inv.Verb = "env"
+ inv.Args = []string{"GOFLAGS"}
+ stdout, err := r.Run(ctx, inv)
+ if err != nil {
+ return nil, false, err
+ }
+ goflags := string(bytes.TrimSpace(stdout.Bytes()))
+ matches := modFlagRegexp.FindStringSubmatch(goflags)
+ var modFlag string
+ if len(matches) != 0 {
+ modFlag = matches[1]
+ }
+ if modFlag != "" {
+ // Don't override an explicit '-mod=' argument.
+ return mainMod, modFlag == "vendor", nil
+ }
+ if mainMod == nil || !go114 {
+ return mainMod, false, nil
+ }
+ // Check 1.14's automatic vendor mode.
+ if fi, err := os.Stat(filepath.Join(mainMod.Dir, "vendor")); err == nil && fi.IsDir() {
+ if mainMod.GoVersion != "" && semver.Compare("v"+mainMod.GoVersion, "v1.14") >= 0 {
+ // The Go version is at least 1.14, and a vendor directory exists.
+ // Set -mod=vendor by default.
+ return mainMod, true, nil
+ }
+ }
+ return mainMod, false, nil
+}
+
+// getMainModuleAnd114 gets the main module's information and whether the
+// go command in use is 1.14+. This is the information needed to figure out
+// if vendoring should be enabled.
+func getMainModuleAnd114(ctx context.Context, inv Invocation, r *Runner) (*ModuleJSON, bool, error) {
+ const format = `{{.Path}}
+{{.Dir}}
+{{.GoMod}}
+{{.GoVersion}}
+{{range context.ReleaseTags}}{{if eq . "go1.14"}}{{.}}{{end}}{{end}}
+`
+ inv.Verb = "list"
+ inv.Args = []string{"-m", "-f", format}
+ stdout, err := r.Run(ctx, inv)
+ if err != nil {
+ return nil, false, err
+ }
+
+ lines := strings.Split(stdout.String(), "\n")
+ if len(lines) < 5 {
+ return nil, false, fmt.Errorf("unexpected stdout: %q", stdout.String())
+ }
+ mod := &ModuleJSON{
+ Path: lines[0],
+ Dir: lines[1],
+ GoMod: lines[2],
+ GoVersion: lines[3],
+ Main: true,
+ }
+ return mod, lines[4] == "go1.14", nil
+}
diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go
index 264d001edc..36292d79a7 100644
--- a/vendor/golang.org/x/tools/internal/imports/fix.go
+++ b/vendor/golang.org/x/tools/internal/imports/fix.go
@@ -50,7 +50,8 @@ var importToGroup = []func(env *ProcessEnv, importPath string) (num int, ok bool
return
},
func(_ *ProcessEnv, importPath string) (num int, ok bool) {
- if strings.Contains(importPath, ".") {
+ firstComponent := strings.Split(importPath, "/")[0]
+ if strings.Contains(firstComponent, ".") {
return 1, true
}
return
@@ -1324,7 +1325,10 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl
fullFile := filepath.Join(dir, fi.Name())
f, err := parser.ParseFile(fset, fullFile, nil, 0)
if err != nil {
- return "", nil, fmt.Errorf("parsing %s: %v", fullFile, err)
+ if env.Logf != nil {
+ env.Logf("error parsing %v: %v", fullFile, err)
+ }
+ continue
}
if f.Name.Name == "documentation" {
// Special case from go/build.ImportDir, not
diff --git a/vendor/golang.org/x/tools/internal/imports/mod.go b/vendor/golang.org/x/tools/internal/imports/mod.go
index 69e3eecc4c..4e816e8bcf 100644
--- a/vendor/golang.org/x/tools/internal/imports/mod.go
+++ b/vendor/golang.org/x/tools/internal/imports/mod.go
@@ -15,7 +15,7 @@ import (
"strings"
"golang.org/x/mod/module"
- "golang.org/x/mod/semver"
+ "golang.org/x/tools/internal/gocommand"
"golang.org/x/tools/internal/gopathwalk"
)
@@ -24,31 +24,21 @@ import (
type ModuleResolver struct {
env *ProcessEnv
moduleCacheDir string
- dummyVendorMod *ModuleJSON // If vendoring is enabled, the pseudo-module that represents the /vendor directory.
+ dummyVendorMod *gocommand.ModuleJSON // If vendoring is enabled, the pseudo-module that represents the /vendor directory.
roots []gopathwalk.Root
scanSema chan struct{} // scanSema prevents concurrent scans and guards scannedRoots.
scannedRoots map[gopathwalk.Root]bool
initialized bool
- main *ModuleJSON
- modsByModPath []*ModuleJSON // All modules, ordered by # of path components in module Path...
- modsByDir []*ModuleJSON // ...or Dir.
+ main *gocommand.ModuleJSON
+ modsByModPath []*gocommand.ModuleJSON // All modules, ordered by # of path components in module Path...
+ modsByDir []*gocommand.ModuleJSON // ...or Dir.
// moduleCacheCache stores information about the module cache.
moduleCacheCache *dirInfoCache
otherCache *dirInfoCache
}
-type ModuleJSON struct {
- Path string // module path
- Replace *ModuleJSON // replaced by this module
- Main bool // is this the main module?
- Indirect bool // is this module only an indirect dependency of main module?
- Dir string // directory holding files for this module, if any
- GoMod string // path to go.mod file for this module, if any
- GoVersion string // go version used in module
-}
-
func newModuleResolver(e *ProcessEnv) *ModuleResolver {
r := &ModuleResolver{
env: e,
@@ -62,7 +52,14 @@ func (r *ModuleResolver) init() error {
if r.initialized {
return nil
}
- mainMod, vendorEnabled, err := vendorEnabled(r.env)
+
+ inv := gocommand.Invocation{
+ BuildFlags: r.env.BuildFlags,
+ Env: r.env.env(),
+ Logf: r.env.Logf,
+ WorkingDir: r.env.WorkingDir,
+ }
+ mainMod, vendorEnabled, err := gocommand.VendorEnabled(context.TODO(), inv, r.env.GocmdRunner)
if err != nil {
return err
}
@@ -71,12 +68,12 @@ func (r *ModuleResolver) init() error {
// Vendor mode is on, so all the non-Main modules are irrelevant,
// and we need to search /vendor for everything.
r.main = mainMod
- r.dummyVendorMod = &ModuleJSON{
+ r.dummyVendorMod = &gocommand.ModuleJSON{
Path: "",
Dir: filepath.Join(mainMod.Dir, "vendor"),
}
- r.modsByModPath = []*ModuleJSON{mainMod, r.dummyVendorMod}
- r.modsByDir = []*ModuleJSON{mainMod, r.dummyVendorMod}
+ r.modsByModPath = []*gocommand.ModuleJSON{mainMod, r.dummyVendorMod}
+ r.modsByDir = []*gocommand.ModuleJSON{mainMod, r.dummyVendorMod}
} else {
// Vendor mode is off, so run go list -m ... to find everything.
r.initAllMods()
@@ -106,7 +103,7 @@ func (r *ModuleResolver) init() error {
if vendorEnabled {
r.roots = append(r.roots, gopathwalk.Root{r.dummyVendorMod.Dir, gopathwalk.RootOther})
} else {
- addDep := func(mod *ModuleJSON) {
+ addDep := func(mod *gocommand.ModuleJSON) {
if mod.Replace == nil {
// This is redundant with the cache, but we'll skip it cheaply enough.
r.roots = append(r.roots, gopathwalk.Root{mod.Dir, gopathwalk.RootModuleCache})
@@ -151,7 +148,7 @@ func (r *ModuleResolver) initAllMods() error {
return err
}
for dec := json.NewDecoder(stdout); dec.More(); {
- mod := &ModuleJSON{}
+ mod := &gocommand.ModuleJSON{}
if err := dec.Decode(mod); err != nil {
return err
}
@@ -197,7 +194,7 @@ func (r *ModuleResolver) ClearForNewMod() {
// findPackage returns the module and directory that contains the package at
// the given import path, or returns nil, "" if no module is in scope.
-func (r *ModuleResolver) findPackage(importPath string) (*ModuleJSON, string) {
+func (r *ModuleResolver) findPackage(importPath string) (*gocommand.ModuleJSON, string) {
// This can't find packages in the stdlib, but that's harmless for all
// the existing code paths.
for _, m := range r.modsByModPath {
@@ -283,7 +280,7 @@ func (r *ModuleResolver) cacheExports(ctx context.Context, env *ProcessEnv, info
// findModuleByDir returns the module that contains dir, or nil if no such
// module is in scope.
-func (r *ModuleResolver) findModuleByDir(dir string) *ModuleJSON {
+func (r *ModuleResolver) findModuleByDir(dir string) *gocommand.ModuleJSON {
// This is quite tricky and may not be correct. dir could be:
// - a package in the main module.
// - a replace target underneath the main module's directory.
@@ -310,7 +307,7 @@ func (r *ModuleResolver) findModuleByDir(dir string) *ModuleJSON {
// dirIsNestedModule reports if dir is contained in a nested module underneath
// mod, not actually in mod.
-func (r *ModuleResolver) dirIsNestedModule(dir string, mod *ModuleJSON) bool {
+func (r *ModuleResolver) dirIsNestedModule(dir string, mod *gocommand.ModuleJSON) bool {
if !strings.HasPrefix(dir, mod.Dir) {
return false
}
@@ -490,7 +487,7 @@ func (r *ModuleResolver) scoreImportPath(ctx context.Context, path string) int {
return modRelevance(mod)
}
-func modRelevance(mod *ModuleJSON) int {
+func modRelevance(mod *gocommand.ModuleJSON) int {
switch {
case mod == nil: // out of scope
return MaxRelevance - 4
@@ -656,63 +653,3 @@ func modulePath(mod []byte) string {
}
return "" // missing module path
}
-
-var modFlagRegexp = regexp.MustCompile(`-mod[ =](\w+)`)
-
-// vendorEnabled indicates if vendoring is enabled.
-// Inspired by setDefaultBuildMod in modload/init.go
-func vendorEnabled(env *ProcessEnv) (*ModuleJSON, bool, error) {
- mainMod, go114, err := getMainModuleAnd114(env)
- if err != nil {
- return nil, false, err
- }
- matches := modFlagRegexp.FindStringSubmatch(env.GOFLAGS)
- var modFlag string
- if len(matches) != 0 {
- modFlag = matches[1]
- }
- if modFlag != "" {
- // Don't override an explicit '-mod=' argument.
- return mainMod, modFlag == "vendor", nil
- }
- if mainMod == nil || !go114 {
- return mainMod, false, nil
- }
- // Check 1.14's automatic vendor mode.
- if fi, err := os.Stat(filepath.Join(mainMod.Dir, "vendor")); err == nil && fi.IsDir() {
- if mainMod.GoVersion != "" && semver.Compare("v"+mainMod.GoVersion, "v1.14") >= 0 {
- // The Go version is at least 1.14, and a vendor directory exists.
- // Set -mod=vendor by default.
- return mainMod, true, nil
- }
- }
- return mainMod, false, nil
-}
-
-// getMainModuleAnd114 gets the main module's information and whether the
-// go command in use is 1.14+. This is the information needed to figure out
-// if vendoring should be enabled.
-func getMainModuleAnd114(env *ProcessEnv) (*ModuleJSON, bool, error) {
- const format = `{{.Path}}
-{{.Dir}}
-{{.GoMod}}
-{{.GoVersion}}
-{{range context.ReleaseTags}}{{if eq . "go1.14"}}{{.}}{{end}}{{end}}
-`
- stdout, err := env.invokeGo(context.TODO(), "list", "-m", "-f", format)
- if err != nil {
- return nil, false, nil
- }
- lines := strings.Split(stdout.String(), "\n")
- if len(lines) < 5 {
- return nil, false, fmt.Errorf("unexpected stdout: %q", stdout)
- }
- mod := &ModuleJSON{
- Path: lines[0],
- Dir: lines[1],
- GoMod: lines[2],
- GoVersion: lines[3],
- Main: true,
- }
- return mod, lines[4] == "go1.14", nil
-}
diff --git a/vendor/golang.org/x/tools/internal/imports/zstdlib.go b/vendor/golang.org/x/tools/internal/imports/zstdlib.go
index 7e60eb04e5..16252111ff 100644
--- a/vendor/golang.org/x/tools/internal/imports/zstdlib.go
+++ b/vendor/golang.org/x/tools/internal/imports/zstdlib.go
@@ -415,6 +415,9 @@ var stdlib = map[string][]string{
"crypto/tls": []string{
"Certificate",
"CertificateRequestInfo",
+ "CipherSuite",
+ "CipherSuiteName",
+ "CipherSuites",
"Client",
"ClientAuthType",
"ClientHelloInfo",
@@ -434,6 +437,7 @@ var stdlib = map[string][]string{
"ECDSAWithP521AndSHA512",
"ECDSAWithSHA1",
"Ed25519",
+ "InsecureCipherSuites",
"Listen",
"LoadX509KeyPair",
"NewLRUClientSessionCache",
@@ -465,6 +469,7 @@ var stdlib = map[string][]string{
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
@@ -473,6 +478,7 @@ var stdlib = map[string][]string{
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_RC4_128_SHA",
"TLS_FALLBACK_SCSV",
"TLS_RSA_WITH_3DES_EDE_CBC_SHA",
@@ -698,36 +704,65 @@ var stdlib = map[string][]string{
"Attr",
"AttrAbstractOrigin",
"AttrAccessibility",
+ "AttrAddrBase",
"AttrAddrClass",
+ "AttrAlignment",
"AttrAllocated",
"AttrArtificial",
"AttrAssociated",
"AttrBaseTypes",
+ "AttrBinaryScale",
"AttrBitOffset",
"AttrBitSize",
"AttrByteSize",
+ "AttrCallAllCalls",
+ "AttrCallAllSourceCalls",
+ "AttrCallAllTailCalls",
"AttrCallColumn",
+ "AttrCallDataLocation",
+ "AttrCallDataValue",
"AttrCallFile",
"AttrCallLine",
+ "AttrCallOrigin",
+ "AttrCallPC",
+ "AttrCallParameter",
+ "AttrCallReturnPC",
+ "AttrCallTailCall",
+ "AttrCallTarget",
+ "AttrCallTargetClobbered",
+ "AttrCallValue",
"AttrCalling",
"AttrCommonRef",
"AttrCompDir",
+ "AttrConstExpr",
"AttrConstValue",
"AttrContainingType",
"AttrCount",
+ "AttrDataBitOffset",
"AttrDataLocation",
"AttrDataMemberLoc",
+ "AttrDecimalScale",
+ "AttrDecimalSign",
"AttrDeclColumn",
"AttrDeclFile",
"AttrDeclLine",
"AttrDeclaration",
"AttrDefaultValue",
+ "AttrDefaulted",
+ "AttrDeleted",
"AttrDescription",
+ "AttrDigitCount",
"AttrDiscr",
"AttrDiscrList",
"AttrDiscrValue",
+ "AttrDwoName",
+ "AttrElemental",
"AttrEncoding",
+ "AttrEndianity",
"AttrEntrypc",
+ "AttrEnumClass",
+ "AttrExplicit",
+ "AttrExportSymbols",
"AttrExtension",
"AttrExternal",
"AttrFrameBase",
@@ -738,27 +773,47 @@ var stdlib = map[string][]string{
"AttrInline",
"AttrIsOptional",
"AttrLanguage",
+ "AttrLinkageName",
"AttrLocation",
+ "AttrLoclistsBase",
"AttrLowerBound",
"AttrLowpc",
"AttrMacroInfo",
+ "AttrMacros",
+ "AttrMainSubprogram",
+ "AttrMutable",
"AttrName",
"AttrNamelistItem",
+ "AttrNoreturn",
+ "AttrObjectPointer",
"AttrOrdering",
+ "AttrPictureString",
"AttrPriority",
"AttrProducer",
"AttrPrototyped",
+ "AttrPure",
"AttrRanges",
+ "AttrRank",
+ "AttrRecursive",
+ "AttrReference",
"AttrReturnAddr",
+ "AttrRnglistsBase",
+ "AttrRvalueReference",
"AttrSegment",
"AttrSibling",
+ "AttrSignature",
+ "AttrSmall",
"AttrSpecification",
"AttrStartScope",
"AttrStaticLink",
"AttrStmtList",
+ "AttrStrOffsetsBase",
"AttrStride",
"AttrStrideSize",
"AttrStringLength",
+ "AttrStringLengthBitSize",
+ "AttrStringLengthByteSize",
+ "AttrThreadsScaled",
"AttrTrampoline",
"AttrType",
"AttrUpperBound",
@@ -772,18 +827,23 @@ var stdlib = map[string][]string{
"BoolType",
"CharType",
"Class",
+ "ClassAddrPtr",
"ClassAddress",
"ClassBlock",
"ClassConstant",
"ClassExprLoc",
"ClassFlag",
"ClassLinePtr",
+ "ClassLocList",
"ClassLocListPtr",
"ClassMacPtr",
"ClassRangeListPtr",
"ClassReference",
"ClassReferenceAlt",
"ClassReferenceSig",
+ "ClassRngList",
+ "ClassRngListsPtr",
+ "ClassStrOffsetsPtr",
"ClassString",
"ClassStringAlt",
"ClassUnknown",
@@ -814,9 +874,13 @@ var stdlib = map[string][]string{
"Tag",
"TagAccessDeclaration",
"TagArrayType",
+ "TagAtomicType",
"TagBaseType",
+ "TagCallSite",
+ "TagCallSiteParameter",
"TagCatchDwarfBlock",
"TagClassType",
+ "TagCoarrayType",
"TagCommonDwarfBlock",
"TagCommonInclusion",
"TagCompileUnit",
@@ -824,12 +888,15 @@ var stdlib = map[string][]string{
"TagConstType",
"TagConstant",
"TagDwarfProcedure",
+ "TagDynamicType",
"TagEntryPoint",
"TagEnumerationType",
"TagEnumerator",
"TagFileType",
"TagFormalParameter",
"TagFriend",
+ "TagGenericSubrange",
+ "TagImmutableType",
"TagImportedDeclaration",
"TagImportedModule",
"TagImportedUnit",
@@ -853,6 +920,7 @@ var stdlib = map[string][]string{
"TagRvalueReferenceType",
"TagSetType",
"TagSharedType",
+ "TagSkeletonUnit",
"TagStringType",
"TagStructType",
"TagSubprogram",
@@ -2359,6 +2427,7 @@ var stdlib = map[string][]string{
"RawValue",
"StructuralError",
"SyntaxError",
+ "TagBMPString",
"TagBitString",
"TagBoolean",
"TagEnum",
@@ -2787,6 +2856,7 @@ var stdlib = map[string][]string{
"IsPredeclared",
"Mode",
"New",
+ "NewFromFiles",
"Note",
"Package",
"PreserveAST",
@@ -3115,6 +3185,11 @@ var stdlib = map[string][]string{
"New64",
"New64a",
},
+ "hash/maphash": []string{
+ "Hash",
+ "MakeSeed",
+ "Seed",
+ },
"html": []string{
"EscapeString",
"UnescapeString",
@@ -3367,6 +3442,7 @@ var stdlib = map[string][]string{
"Ldate",
"Llongfile",
"Lmicroseconds",
+ "Lmsgprefix",
"Logger",
"Lshortfile",
"LstdFlags",
@@ -3443,6 +3519,7 @@ var stdlib = map[string][]string{
"Exp",
"Exp2",
"Expm1",
+ "FMA",
"Float32bits",
"Float32frombits",
"Float64bits",
@@ -3567,6 +3644,9 @@ var stdlib = map[string][]string{
"OnesCount32",
"OnesCount64",
"OnesCount8",
+ "Rem",
+ "Rem32",
+ "Rem64",
"Reverse",
"Reverse16",
"Reverse32",
@@ -5140,7 +5220,10 @@ var stdlib = map[string][]string{
"CTL_NET",
"CTL_QUERY",
"CTRL_BREAK_EVENT",
+ "CTRL_CLOSE_EVENT",
"CTRL_C_EVENT",
+ "CTRL_LOGOFF_EVENT",
+ "CTRL_SHUTDOWN_EVENT",
"CancelIo",
"CancelIoEx",
"CertAddCertificateContextToStore",
@@ -10112,6 +10195,7 @@ var stdlib = map[string][]string{
"Duployan",
"Egyptian_Hieroglyphs",
"Elbasan",
+ "Elymaic",
"Ethiopic",
"Extender",
"FoldCategory",
@@ -10215,6 +10299,7 @@ var stdlib = map[string][]string{
"Myanmar",
"N",
"Nabataean",
+ "Nandinagari",
"Nd",
"New_Tai_Lue",
"Newa",
@@ -10224,6 +10309,7 @@ var stdlib = map[string][]string{
"Noncharacter_Code_Point",
"Number",
"Nushu",
+ "Nyiakeng_Puachue_Hmong",
"Ogham",
"Ol_Chiki",
"Old_Hungarian",
@@ -10331,6 +10417,7 @@ var stdlib = map[string][]string{
"Vai",
"Variation_Selector",
"Version",
+ "Wancho",
"Warang_Citi",
"White_Space",
"Yi",
diff --git a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
index a88750be2b..2c4527f243 100644
--- a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
+++ b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go
@@ -2,34 +2,13 @@
package packagesinternal
import (
- "time"
-
"golang.org/x/tools/internal/gocommand"
)
-// Fields must match go list;
-type Module struct {
- Path string // module path
- Version string // module version
- Versions []string // available module versions (with -versions)
- Replace *Module // replaced by this module
- Time *time.Time // time version was created
- Update *Module // available update, if any (with -u)
- Main bool // is this the main module?
- Indirect bool // is this module only an indirect dependency of main module?
- Dir string // directory holding files for this module, if any
- GoMod string // path to go.mod file used when loading this module, if any
- GoVersion string // go version used in module
- Error *ModuleError // error loading module
-}
-type ModuleError struct {
- Err string // the error itself
-}
-
var GetForTest = func(p interface{}) string { return "" }
-var GetModule = func(p interface{}) *Module { return nil }
-
var GetGoCmdRunner = func(config interface{}) *gocommand.Runner { return nil }
var SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {}
+
+var TypecheckCgo int
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/event.go b/vendor/golang.org/x/tools/internal/telemetry/event/event.go
deleted file mode 100644
index 6028fa6d2b..0000000000
--- a/vendor/golang.org/x/tools/internal/telemetry/event/event.go
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package event provides support for event based telemetry.
-package event
-
-import (
- "fmt"
- "time"
-)
-
-type eventType uint8
-
-const (
- invalidType = eventType(iota)
- LogType // an event that should be recorded in a log
- StartSpanType // the start of a span of time
- EndSpanType // the end of a span of time
- LabelType // some values that should be noted for later events
- DetachType // an event that causes a context to detach
- RecordType // a value that should be tracked
-)
-
-// sTags is used to hold a small number of tags inside an event whichout
-// requiring a separate allocation.
-// As tags are often on the stack, this avoids an allocation at all for
-// the very common cases of simple events.
-// The length needs to be large enough to cope with the majority of events
-// but no so large as to cause undue stack pressure.
-// A log message with two values will use 3 tags (one for each value and
-// one for the message itself).
-type sTags [3]Tag
-
-// Event holds the information about an event of note that ocurred.
-type Event struct {
- At time.Time
-
- typ eventType
- static sTags // inline storage for the first few tags
- dynamic []Tag // dynamically sized storage for remaining tags
-}
-
-// eventTagMap implements TagMap for a the tags of an Event.
-type eventTagMap struct {
- event Event
-}
-
-func (ev Event) IsLog() bool { return ev.typ == LogType }
-func (ev Event) IsEndSpan() bool { return ev.typ == EndSpanType }
-func (ev Event) IsStartSpan() bool { return ev.typ == StartSpanType }
-func (ev Event) IsLabel() bool { return ev.typ == LabelType }
-func (ev Event) IsDetach() bool { return ev.typ == DetachType }
-func (ev Event) IsRecord() bool { return ev.typ == RecordType }
-
-func (ev Event) Format(f fmt.State, r rune) {
- tagMap := TagMap(ev)
- if !ev.At.IsZero() {
- fmt.Fprint(f, ev.At.Format("2006/01/02 15:04:05 "))
- }
- msg := Msg.Get(tagMap)
- err := Err.Get(tagMap)
- fmt.Fprint(f, msg)
- if err != nil {
- if f.Flag('+') {
- fmt.Fprintf(f, ": %+v", err)
- } else {
- fmt.Fprintf(f, ": %v", err)
- }
- }
- for index := 0; ev.Valid(index); index++ {
- tag := ev.Tag(index)
- // msg and err were both already printed above, so we skip them to avoid
- // double printing
- if !tag.Valid() || tag.Key == Msg || tag.Key == Err {
- continue
- }
- fmt.Fprintf(f, "\n\t%v", tag)
- }
-}
-
-func (ev Event) Valid(index int) bool {
- return index >= 0 && index < len(ev.static)+len(ev.dynamic)
-}
-
-func (ev Event) Tag(index int) Tag {
- if index < len(ev.static) {
- return ev.static[index]
- }
- return ev.dynamic[index-len(ev.static)]
-}
-
-func (ev Event) Find(key interface{}) Tag {
- for _, tag := range ev.static {
- if tag.Key == key {
- return tag
- }
- }
- for _, tag := range ev.dynamic {
- if tag.Key == key {
- return tag
- }
- }
- return Tag{}
-}
-
-func makeEvent(typ eventType, static sTags, tags []Tag) Event {
- return Event{
- typ: typ,
- static: static,
- dynamic: tags,
- }
-}
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/key.go b/vendor/golang.org/x/tools/internal/telemetry/event/key.go
deleted file mode 100644
index 97572c37f1..0000000000
--- a/vendor/golang.org/x/tools/internal/telemetry/event/key.go
+++ /dev/null
@@ -1,499 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package event
-
-import (
- "math"
-)
-
-var (
- // Msg is a key used to add message strings to tag lists.
- Msg = NewStringKey("message", "a readable message")
- // Name is used for things like traces that have a name.
- Name = NewStringKey("name", "an entity name")
- // Err is a key used to add error values to tag lists.
- Err = NewErrorKey("error", "an error that occurred")
-)
-
-// Key is the interface shared by all key implementations.
-type Key interface {
- // Name returns the key name.
- Name() string
- // Description returns a string that can be used to describe the value.
- Description() string
-}
-
-// key is used as the identity of a Tag.
-// Keys are intended to be compared by pointer only, the name should be unique
-// for communicating with external systems, but it is not required or enforced.
-type key struct {
- name string
- description string
-}
-
-// ValueKey represents a key for untyped values.
-type ValueKey struct {
- name string
- description string
-}
-
-// NewKey creates a new Key for untyped values.
-func NewKey(name, description string) *ValueKey {
- return &ValueKey{name: name, description: description}
-}
-
-func (k *ValueKey) Name() string { return k.name }
-func (k *ValueKey) Description() string { return k.description }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *ValueKey) Get(tags TagMap) interface{} {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return nil
-}
-
-// From can be used to get a value from a Tag.
-func (k *ValueKey) From(t Tag) interface{} { return t.untyped }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *ValueKey) Of(value interface{}) Tag { return Tag{Key: k, untyped: value} }
-
-// IntKey represents a key
-type IntKey struct {
- name string
- description string
-}
-
-// NewIntKey creates a new Key for int values.
-func NewIntKey(name, description string) *IntKey {
- return &IntKey{name: name, description: description}
-}
-
-func (k *IntKey) Name() string { return k.name }
-func (k *IntKey) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *IntKey) Of(v int) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *IntKey) Get(tags TagMap) int {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *IntKey) From(t Tag) int { return int(t.packed) }
-
-// Int8Key represents a key
-type Int8Key struct {
- name string
- description string
-}
-
-// NewInt8Key creates a new Key for int8 values.
-func NewInt8Key(name, description string) *Int8Key {
- return &Int8Key{name: name, description: description}
-}
-
-func (k *Int8Key) Name() string { return k.name }
-func (k *Int8Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *Int8Key) Of(v int8) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *Int8Key) Get(tags TagMap) int8 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *Int8Key) From(t Tag) int8 { return int8(t.packed) }
-
-// Int16Key represents a key
-type Int16Key struct {
- name string
- description string
-}
-
-// NewInt16Key creates a new Key for int16 values.
-func NewInt16Key(name, description string) *Int16Key {
- return &Int16Key{name: name, description: description}
-}
-
-func (k *Int16Key) Name() string { return k.name }
-func (k *Int16Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *Int16Key) Of(v int16) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *Int16Key) Get(tags TagMap) int16 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *Int16Key) From(t Tag) int16 { return int16(t.packed) }
-
-// Int32Key represents a key
-type Int32Key struct {
- name string
- description string
-}
-
-// NewInt32Key creates a new Key for int32 values.
-func NewInt32Key(name, description string) *Int32Key {
- return &Int32Key{name: name, description: description}
-}
-
-func (k *Int32Key) Name() string { return k.name }
-func (k *Int32Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *Int32Key) Of(v int32) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *Int32Key) Get(tags TagMap) int32 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *Int32Key) From(t Tag) int32 { return int32(t.packed) }
-
-// Int64Key represents a key
-type Int64Key struct {
- name string
- description string
-}
-
-// NewInt64Key creates a new Key for int64 values.
-func NewInt64Key(name, description string) *Int64Key {
- return &Int64Key{name: name, description: description}
-}
-
-func (k *Int64Key) Name() string { return k.name }
-func (k *Int64Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *Int64Key) Of(v int64) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *Int64Key) Get(tags TagMap) int64 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *Int64Key) From(t Tag) int64 { return int64(t.packed) }
-
-// UIntKey represents a key
-type UIntKey struct {
- name string
- description string
-}
-
-// NewUIntKey creates a new Key for uint values.
-func NewUIntKey(name, description string) *UIntKey {
- return &UIntKey{name: name, description: description}
-}
-
-func (k *UIntKey) Name() string { return k.name }
-func (k *UIntKey) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *UIntKey) Of(v uint) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *UIntKey) Get(tags TagMap) uint {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *UIntKey) From(t Tag) uint { return uint(t.packed) }
-
-// UInt8Key represents a key
-type UInt8Key struct {
- name string
- description string
-}
-
-// NewUInt8Key creates a new Key for uint8 values.
-func NewUInt8Key(name, description string) *UInt8Key {
- return &UInt8Key{name: name, description: description}
-}
-
-func (k *UInt8Key) Name() string { return k.name }
-func (k *UInt8Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *UInt8Key) Of(v uint8) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *UInt8Key) Get(tags TagMap) uint8 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *UInt8Key) From(t Tag) uint8 { return uint8(t.packed) }
-
-// UInt16Key represents a key
-type UInt16Key struct {
- name string
- description string
-}
-
-// NewUInt16Key creates a new Key for uint16 values.
-func NewUInt16Key(name, description string) *UInt16Key {
- return &UInt16Key{name: name, description: description}
-}
-
-func (k *UInt16Key) Name() string { return k.name }
-func (k *UInt16Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *UInt16Key) Of(v uint16) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *UInt16Key) Get(tags TagMap) uint16 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *UInt16Key) From(t Tag) uint16 { return uint16(t.packed) }
-
-// UInt32Key represents a key
-type UInt32Key struct {
- name string
- description string
-}
-
-// NewUInt32Key creates a new Key for uint32 values.
-func NewUInt32Key(name, description string) *UInt32Key {
- return &UInt32Key{name: name, description: description}
-}
-
-func (k *UInt32Key) Name() string { return k.name }
-func (k *UInt32Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *UInt32Key) Of(v uint32) Tag { return Tag{Key: k, packed: uint64(v)} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *UInt32Key) Get(tags TagMap) uint32 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *UInt32Key) From(t Tag) uint32 { return uint32(t.packed) }
-
-// UInt64Key represents a key
-type UInt64Key struct {
- name string
- description string
-}
-
-// NewUInt64Key creates a new Key for uint64 values.
-func NewUInt64Key(name, description string) *UInt64Key {
- return &UInt64Key{name: name, description: description}
-}
-
-func (k *UInt64Key) Name() string { return k.name }
-func (k *UInt64Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *UInt64Key) Of(v uint64) Tag { return Tag{Key: k, packed: v} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *UInt64Key) Get(tags TagMap) uint64 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *UInt64Key) From(t Tag) uint64 { return t.packed }
-
-// Float32Key represents a key
-type Float32Key struct {
- name string
- description string
-}
-
-// NewFloat32Key creates a new Key for float32 values.
-func NewFloat32Key(name, description string) *Float32Key {
- return &Float32Key{name: name, description: description}
-}
-
-func (k *Float32Key) Name() string { return k.name }
-func (k *Float32Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *Float32Key) Of(v float32) Tag {
- return Tag{Key: k, packed: uint64(math.Float32bits(v))}
-}
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *Float32Key) Get(tags TagMap) float32 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *Float32Key) From(t Tag) float32 {
- return math.Float32frombits(uint32(t.packed))
-}
-
-// Float64Key represents a key
-type Float64Key struct {
- name string
- description string
-}
-
-// NewFloat64Key creates a new Key for int64 values.
-func NewFloat64Key(name, description string) *Float64Key {
- return &Float64Key{name: name, description: description}
-}
-
-func (k *Float64Key) Name() string { return k.name }
-func (k *Float64Key) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *Float64Key) Of(v float64) Tag {
- return Tag{Key: k, packed: math.Float64bits(v)}
-}
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *Float64Key) Get(tags TagMap) float64 {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return 0
-}
-
-// From can be used to get a value from a Tag.
-func (k *Float64Key) From(t Tag) float64 {
- return math.Float64frombits(t.packed)
-}
-
-// StringKey represents a key
-type StringKey struct {
- name string
- description string
-}
-
-// NewStringKey creates a new Key for int64 values.
-func NewStringKey(name, description string) *StringKey {
- return &StringKey{name: name, description: description}
-}
-
-func (k *StringKey) Name() string { return k.name }
-func (k *StringKey) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *StringKey) Of(v string) Tag { return Tag{Key: k, str: v} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *StringKey) Get(tags TagMap) string {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return ""
-}
-
-// From can be used to get a value from a Tag.
-func (k *StringKey) From(t Tag) string { return t.str }
-
-// BooleanKey represents a key
-type BooleanKey struct {
- name string
- description string
-}
-
-// NewBooleanKey creates a new Key for bool values.
-func NewBooleanKey(name, description string) *BooleanKey {
- return &BooleanKey{name: name, description: description}
-}
-
-func (k *BooleanKey) Name() string { return k.name }
-func (k *BooleanKey) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *BooleanKey) Of(v bool) Tag {
- t := Tag{Key: k}
- if v {
- t.packed = 1
- }
- return t
-}
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *BooleanKey) Get(tags TagMap) bool {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return false
-}
-
-// From can be used to get a value from a Tag.
-func (k *BooleanKey) From(t Tag) bool { return t.packed > 0 }
-
-// ErrorKey represents a key
-type ErrorKey struct {
- name string
- description string
-}
-
-// NewErrorKey creates a new Key for int64 values.
-func NewErrorKey(name, description string) *ErrorKey {
- return &ErrorKey{name: name, description: description}
-}
-
-func (k *ErrorKey) Name() string { return k.name }
-func (k *ErrorKey) Description() string { return k.description }
-
-// Of creates a new Tag with this key and the supplied value.
-func (k *ErrorKey) Of(v error) Tag { return Tag{Key: k, untyped: v} }
-
-// Get can be used to get a tag for the key from a TagMap.
-func (k *ErrorKey) Get(tags TagMap) error {
- if t := tags.Find(k); t.Valid() {
- return k.From(t)
- }
- return nil
-}
-
-// From can be used to get a value from a Tag.
-func (k *ErrorKey) From(t Tag) error {
- err, _ := t.untyped.(error)
- return err
-}
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/label.go b/vendor/golang.org/x/tools/internal/telemetry/event/label.go
deleted file mode 100644
index edd34bb08c..0000000000
--- a/vendor/golang.org/x/tools/internal/telemetry/event/label.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package event
-
-import (
- "context"
-)
-
-// Label sends a label event to the exporter with the supplied tags.
-func Label(ctx context.Context, tags ...Tag) context.Context {
- return dispatch(ctx, makeEvent(LabelType, sTags{}, tags))
-}
-
-// Label1 sends a label event to the exporter with the supplied tags.
-func Label1(ctx context.Context, t1 Tag) context.Context {
- return dispatch(ctx, makeEvent(LabelType, sTags{t1}, nil))
-}
-
-// Label2 sends a label event to the exporter with the supplied tags.
-func Label2(ctx context.Context, t1, t2 Tag) context.Context {
- return dispatch(ctx, makeEvent(LabelType, sTags{t1, t2}, nil))
-}
-
-// Label3 sends a label event to the exporter with the supplied tags.
-func Label3(ctx context.Context, t1, t2, t3 Tag) context.Context {
- return dispatch(ctx, makeEvent(LabelType, sTags{t1, t2, t3}, nil))
-}
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/log.go b/vendor/golang.org/x/tools/internal/telemetry/event/log.go
deleted file mode 100644
index 568aa1b923..0000000000
--- a/vendor/golang.org/x/tools/internal/telemetry/event/log.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package event
-
-import (
- "context"
- "errors"
-)
-
-// Log sends a log event with the supplied tag list to the exporter.
-func Log(ctx context.Context, tags ...Tag) {
- dispatch(ctx, makeEvent(LogType, sTags{}, tags))
-}
-
-// Log1 sends a label event to the exporter with the supplied tags.
-func Log1(ctx context.Context, t1 Tag) context.Context {
- return dispatch(ctx, makeEvent(LogType, sTags{t1}, nil))
-}
-
-// Log2 sends a label event to the exporter with the supplied tags.
-func Log2(ctx context.Context, t1, t2 Tag) context.Context {
- return dispatch(ctx, makeEvent(LogType, sTags{t1, t2}, nil))
-}
-
-// Log3 sends a label event to the exporter with the supplied tags.
-func Log3(ctx context.Context, t1, t2, t3 Tag) context.Context {
- return dispatch(ctx, makeEvent(LogType, sTags{t1, t2, t3}, nil))
-}
-
-// Print takes a message and a tag list and combines them into a single event
-// before delivering them to the exporter.
-func Print(ctx context.Context, message string, tags ...Tag) {
- dispatch(ctx, makeEvent(LogType, sTags{Msg.Of(message)}, tags))
-}
-
-// Print1 takes a message and one tag delivers a log event to the exporter.
-// It is a customized version of Print that is faster and does no allocation.
-func Print1(ctx context.Context, message string, t1 Tag) {
- dispatch(ctx, makeEvent(LogType, sTags{Msg.Of(message), t1}, nil))
-}
-
-// Print2 takes a message and two tags and delivers a log event to the exporter.
-// It is a customized version of Print that is faster and does no allocation.
-func Print2(ctx context.Context, message string, t1 Tag, t2 Tag) {
- dispatch(ctx, makeEvent(LogType, sTags{Msg.Of(message), t1, t2}, nil))
-}
-
-// Error takes a message and a tag list and combines them into a single event
-// before delivering them to the exporter. It captures the error in the
-// delivered event.
-func Error(ctx context.Context, message string, err error, tags ...Tag) {
- if err == nil {
- err = errors.New(message)
- message = ""
- }
- dispatch(ctx, makeEvent(LogType, sTags{Msg.Of(message), Err.Of(err)}, tags))
-}
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/metric.go b/vendor/golang.org/x/tools/internal/telemetry/event/metric.go
deleted file mode 100644
index e4092bb0d3..0000000000
--- a/vendor/golang.org/x/tools/internal/telemetry/event/metric.go
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package event
-
-import (
- "context"
-)
-
-// Record sends a label event to the exporter with the supplied tags.
-func Record(ctx context.Context, tags ...Tag) context.Context {
- return dispatch(ctx, makeEvent(RecordType, sTags{}, tags))
-}
-
-// Record1 sends a label event to the exporter with the supplied tags.
-func Record1(ctx context.Context, t1 Tag) context.Context {
- return dispatch(ctx, makeEvent(RecordType, sTags{t1}, nil))
-}
-
-// Record2 sends a label event to the exporter with the supplied tags.
-func Record2(ctx context.Context, t1, t2 Tag) context.Context {
- return dispatch(ctx, makeEvent(RecordType, sTags{t1, t2}, nil))
-}
-
-// Record3 sends a label event to the exporter with the supplied tags.
-func Record3(ctx context.Context, t1, t2, t3 Tag) context.Context {
- return dispatch(ctx, makeEvent(RecordType, sTags{t1, t2, t3}, nil))
-}
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/tag.go b/vendor/golang.org/x/tools/internal/telemetry/event/tag.go
deleted file mode 100644
index 5fe40a1e9c..0000000000
--- a/vendor/golang.org/x/tools/internal/telemetry/event/tag.go
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package event
-
-import (
- "fmt"
-)
-
-// Tag holds a key and value pair.
-// It is normally used when passing around lists of tags.
-type Tag struct {
- Key Key
- packed uint64
- str string
- untyped interface{}
-}
-
-// TagMap is the interface to a collection of Tags indexed by key.
-type TagMap interface {
- // Find returns the tag that matches the supplied key.
- Find(key interface{}) Tag
-}
-
-// TagList is the interface to something that provides an iterable
-// list of tags.
-// Iteration should start from 0 and continue until Valid returns false.
-type TagList interface {
- // Valid returns true if the index is within range for the list.
- // It does not imply the tag at that index will itself be valid.
- Valid(index int) bool
- // Tag returns the tag at the given index.
- Tag(index int) Tag
-}
-
-// tagList implements TagList for a list of Tags.
-type tagList struct {
- tags []Tag
-}
-
-// tagFilter wraps a TagList filtering out specific tags.
-type tagFilter struct {
- keys []Key
- underlying TagList
-}
-
-// tagMap implements TagMap for a simple list of tags.
-type tagMap struct {
- tags []Tag
-}
-
-// tagMapChain implements TagMap for a list of underlying TagMap.
-type tagMapChain struct {
- maps []TagMap
-}
-
-// Valid returns true if the Tag is a valid one (it has a key).
-func (t Tag) Valid() bool { return t.Key != nil }
-
-// Format is used for debug printing of tags.
-func (t Tag) Format(f fmt.State, r rune) {
- if !t.Valid() {
- fmt.Fprintf(f, `nil`)
- return
- }
- switch key := t.Key.(type) {
- case *IntKey:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *Int8Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *Int16Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *Int32Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *Int64Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *UIntKey:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *UInt8Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *UInt16Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *UInt32Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *UInt64Key:
- fmt.Fprintf(f, "%s=%d", key.Name(), key.From(t))
- case *Float32Key:
- fmt.Fprintf(f, "%s=%g", key.Name(), key.From(t))
- case *Float64Key:
- fmt.Fprintf(f, "%s=%g", key.Name(), key.From(t))
- case *BooleanKey:
- fmt.Fprintf(f, "%s=%t", key.Name(), key.From(t))
- case *StringKey:
- fmt.Fprintf(f, "%s=%q", key.Name(), key.From(t))
- case *ErrorKey:
- fmt.Fprintf(f, "%s=%v", key.Name(), key.From(t))
- case *ValueKey:
- fmt.Fprintf(f, "%s=%v", key.Name(), key.From(t))
- default:
- fmt.Fprintf(f, `%s="invalid type %T"`, key.Name(), key)
- }
-}
-
-func (l *tagList) Valid(index int) bool {
- return index >= 0 && index < len(l.tags)
-}
-
-func (l *tagList) Tag(index int) Tag {
- return l.tags[index]
-}
-
-func (f *tagFilter) Valid(index int) bool {
- return f.underlying.Valid(index)
-}
-
-func (f *tagFilter) Tag(index int) Tag {
- tag := f.underlying.Tag(index)
- for _, f := range f.keys {
- if tag.Key == f {
- return Tag{}
- }
- }
- return tag
-}
-
-func (l tagMap) Find(key interface{}) Tag {
- for _, tag := range l.tags {
- if tag.Key == key {
- return tag
- }
- }
- return Tag{}
-}
-
-func (c tagMapChain) Find(key interface{}) Tag {
- for _, src := range c.maps {
- tag := src.Find(key)
- if tag.Valid() {
- return tag
- }
- }
- return Tag{}
-}
-
-var emptyList = &tagList{}
-
-func NewTagList(tags ...Tag) TagList {
- if len(tags) == 0 {
- return emptyList
- }
- return &tagList{tags: tags}
-}
-
-func Filter(l TagList, keys ...Key) TagList {
- if len(keys) == 0 {
- return l
- }
- return &tagFilter{keys: keys, underlying: l}
-}
-
-func NewTagMap(tags ...Tag) TagMap {
- return tagMap{tags: tags}
-}
-
-func MergeTagMaps(srcs ...TagMap) TagMap {
- return tagMapChain{maps: srcs}
-}
diff --git a/vendor/golang.org/x/tools/internal/telemetry/event/trace.go b/vendor/golang.org/x/tools/internal/telemetry/event/trace.go
deleted file mode 100644
index 2c40341ff4..0000000000
--- a/vendor/golang.org/x/tools/internal/telemetry/event/trace.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package event
-
-import (
- "context"
-)
-
-// StartSpan sends a span start event with the supplied tag list to the exporter.
-// It also returns a function that will end the span, which should normally be
-// deferred.
-func StartSpan(ctx context.Context, name string, tags ...Tag) (context.Context, func()) {
- return dispatchPair(ctx,
- makeEvent(StartSpanType, sTags{Name.Of(name)}, tags),
- makeEvent(EndSpanType, sTags{}, nil))
-}
-
-// StartSpan1 sends a span start event with the supplied tag list to the exporter.
-// It also returns a function that will end the span, which should normally be
-// deferred.
-func StartSpan1(ctx context.Context, name string, t1 Tag) (context.Context, func()) {
- return dispatchPair(ctx,
- makeEvent(StartSpanType, sTags{Name.Of(name), t1}, nil),
- makeEvent(EndSpanType, sTags{}, nil))
-}
-
-// StartSpan2 sends a span start event with the supplied tag list to the exporter.
-// It also returns a function that will end the span, which should normally be
-// deferred.
-func StartSpan2(ctx context.Context, name string, t1, t2 Tag) (context.Context, func()) {
- return dispatchPair(ctx,
- makeEvent(StartSpanType, sTags{Name.Of(name), t1, t2}, nil),
- makeEvent(EndSpanType, sTags{}, nil))
-}
-
-// Detach returns a context without an associated span.
-// This allows the creation of spans that are not children of the current span.
-func Detach(ctx context.Context) context.Context {
- return dispatch(ctx, makeEvent(DetachType, sTags{}, nil))
-}
diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go
new file mode 100644
index 0000000000..a5bb408e2f
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go
@@ -0,0 +1,28 @@
+// Copyright 2020 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package typesinternal
+
+import (
+ "go/types"
+ "reflect"
+ "unsafe"
+)
+
+func SetUsesCgo(conf *types.Config) bool {
+ v := reflect.ValueOf(conf).Elem()
+
+ f := v.FieldByName("go115UsesCgo")
+ if !f.IsValid() {
+ f = v.FieldByName("UsesCgo")
+ if !f.IsValid() {
+ return false
+ }
+ }
+
+ addr := unsafe.Pointer(f.UnsafeAddr())
+ *(*bool)(addr) = true
+
+ return true
+}
diff --git a/vendor/gopkg.in/yaml.v2/apic.go b/vendor/gopkg.in/yaml.v2/apic.go
index 1f7e87e672..d2c2308f1f 100644
--- a/vendor/gopkg.in/yaml.v2/apic.go
+++ b/vendor/gopkg.in/yaml.v2/apic.go
@@ -86,6 +86,7 @@ func yaml_emitter_initialize(emitter *yaml_emitter_t) {
raw_buffer: make([]byte, 0, output_raw_buffer_size),
states: make([]yaml_emitter_state_t, 0, initial_stack_size),
events: make([]yaml_event_t, 0, initial_queue_size),
+ best_width: -1,
}
}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 8d3a8e60e9..b5b56fe929 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -62,9 +62,9 @@ github.com/ghodss/yaml
github.com/go-openapi/jsonpointer
# github.com/go-openapi/jsonreference v0.19.3
github.com/go-openapi/jsonreference
-# github.com/go-openapi/spec v0.19.4
+# github.com/go-openapi/spec v0.19.8
github.com/go-openapi/spec
-# github.com/go-openapi/swag v0.19.5
+# github.com/go-openapi/swag v0.19.9
github.com/go-openapi/swag
# github.com/go-redis/redis/v7 v7.4.0
github.com/go-redis/redis/v7
@@ -124,7 +124,7 @@ github.com/lib/pq/oid
github.com/lib/pq/scram
# github.com/magiconair/properties v1.8.1
github.com/magiconair/properties
-# github.com/mailru/easyjson v0.7.0
+# github.com/mailru/easyjson v0.7.1
github.com/mailru/easyjson/buffer
github.com/mailru/easyjson/jlexer
github.com/mailru/easyjson/jwriter
@@ -205,7 +205,7 @@ github.com/spf13/viper
github.com/stretchr/testify/assert
# github.com/subosito/gotenv v1.2.0
github.com/subosito/gotenv
-# github.com/swaggo/swag v1.6.3
+# github.com/swaggo/swag v1.6.7
github.com/swaggo/swag
github.com/swaggo/swag/cmd/swag
github.com/swaggo/swag/gen
@@ -227,8 +227,8 @@ github.com/ulule/limiter/v3
github.com/ulule/limiter/v3/drivers/store/common
github.com/ulule/limiter/v3/drivers/store/memory
github.com/ulule/limiter/v3/drivers/store/redis
-# github.com/urfave/cli v1.22.2
-github.com/urfave/cli
+# github.com/urfave/cli/v2 v2.1.1
+github.com/urfave/cli/v2
# github.com/valyala/bytebufferpool v1.0.0
github.com/valyala/bytebufferpool
# github.com/valyala/fasttemplate v1.1.0
@@ -244,7 +244,7 @@ golang.org/x/lint/golint
# golang.org/x/mod v0.2.0
golang.org/x/mod/module
golang.org/x/mod/semver
-# golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e
+# golang.org/x/net v0.0.0-20200602114024-627f9648deb9
golang.org/x/net/http/httpguts
golang.org/x/net/http2
golang.org/x/net/http2/h2c
@@ -259,7 +259,7 @@ golang.org/x/text/transform
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
golang.org/x/text/width
-# golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef
+# golang.org/x/tools v0.0.0-20200612220849-54c614fe050c
golang.org/x/tools/go/analysis
golang.org/x/tools/go/analysis/passes/inspect
golang.org/x/tools/go/ast/astutil
@@ -275,12 +275,16 @@ golang.org/x/tools/go/types/objectpath
golang.org/x/tools/go/types/typeutil
golang.org/x/tools/imports
golang.org/x/tools/internal/analysisinternal
+golang.org/x/tools/internal/event
+golang.org/x/tools/internal/event/core
+golang.org/x/tools/internal/event/keys
+golang.org/x/tools/internal/event/label
golang.org/x/tools/internal/fastwalk
golang.org/x/tools/internal/gocommand
golang.org/x/tools/internal/gopathwalk
golang.org/x/tools/internal/imports
golang.org/x/tools/internal/packagesinternal
-golang.org/x/tools/internal/telemetry/event
+golang.org/x/tools/internal/typesinternal
# golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
golang.org/x/xerrors
golang.org/x/xerrors/internal
@@ -323,7 +327,7 @@ gopkg.in/d4l3k/messagediff.v1
gopkg.in/gomail.v2
# gopkg.in/ini.v1 v1.51.0
gopkg.in/ini.v1
-# gopkg.in/yaml.v2 v2.2.8
+# gopkg.in/yaml.v2 v2.3.0
gopkg.in/yaml.v2
# gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
gopkg.in/yaml.v3