forked from TrueCloudLab/distribution
Merge pull request #2941 from tariq1890/gomod
migrate to go modules from vndr
This commit is contained in:
commit
c2254191d4
503 changed files with 273730 additions and 9491 deletions
|
@ -34,7 +34,7 @@ script:
|
||||||
- export GOOS=$TRAVIS_GOOS
|
- export GOOS=$TRAVIS_GOOS
|
||||||
- export CGO_ENABLED=$TRAVIS_CGO_ENABLED
|
- export CGO_ENABLED=$TRAVIS_CGO_ENABLED
|
||||||
- DCO_VERBOSITY=-q script/validate/dco
|
- DCO_VERBOSITY=-q script/validate/dco
|
||||||
- GOOS=linux script/setup/install-dev-tools
|
- GOOS=linux GO111MODULE=off script/setup/install-dev-tools
|
||||||
- script/validate/vendor
|
- script/validate/vendor
|
||||||
- go build -i .
|
- go build -i .
|
||||||
- make check
|
- make check
|
||||||
|
|
59
go.mod
Normal file
59
go.mod
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
module github.com/docker/distribution
|
||||||
|
|
||||||
|
go 1.12
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible
|
||||||
|
github.com/Azure/go-autorest v10.8.1+incompatible // indirect
|
||||||
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d
|
||||||
|
github.com/aws/aws-sdk-go v1.15.11
|
||||||
|
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a // indirect
|
||||||
|
github.com/bitly/go-simplejson v0.5.0 // indirect
|
||||||
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect
|
||||||
|
github.com/bshuster-repo/logrus-logstash-hook v0.0.0-20170517171303-d2c0ecc1836d
|
||||||
|
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd
|
||||||
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b // indirect
|
||||||
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 // indirect
|
||||||
|
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba
|
||||||
|
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c // indirect
|
||||||
|
github.com/dnaeon/go-vcr v1.0.1 // indirect
|
||||||
|
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916
|
||||||
|
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1
|
||||||
|
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7
|
||||||
|
github.com/golang/protobuf v0.0.0-20160321223353-8d92cf5fc15a // indirect
|
||||||
|
github.com/gorilla/context v1.1.1 // indirect
|
||||||
|
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33
|
||||||
|
github.com/gorilla/mux v0.0.0-20170228224354-599cba5e7b61
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||||
|
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7 // indirect
|
||||||
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
|
github.com/marstr/guid v1.1.0 // indirect
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v0.0.0-20150528213339-482a9fd5fa83
|
||||||
|
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f // indirect
|
||||||
|
github.com/ncw/swift v1.0.40
|
||||||
|
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420
|
||||||
|
github.com/opencontainers/image-spec v1.0.0
|
||||||
|
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06 // indirect
|
||||||
|
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5 // indirect
|
||||||
|
github.com/prometheus/common v0.0.0-20180110214958-89604d197083 // indirect
|
||||||
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 // indirect
|
||||||
|
github.com/satori/go.uuid v1.2.0 // indirect
|
||||||
|
github.com/sirupsen/logrus v0.0.0-20170620144510-3d4380f53a34
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect
|
||||||
|
github.com/spf13/cobra v0.0.0-20150605180824-312092086bed
|
||||||
|
github.com/spf13/pflag v0.0.0-20150601220040-564482062245 // indirect
|
||||||
|
github.com/stretchr/testify v1.3.0 // indirect
|
||||||
|
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 // indirect
|
||||||
|
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50
|
||||||
|
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
|
||||||
|
golang.org/x/oauth2 v0.0.0-20160304213135-045497edb623
|
||||||
|
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed // indirect
|
||||||
|
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff
|
||||||
|
google.golang.org/appengine v0.0.0-20160301025000-12d5545dc1cf // indirect
|
||||||
|
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8
|
||||||
|
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a // indirect
|
||||||
|
gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789
|
||||||
|
gopkg.in/yaml.v2 v2.2.1
|
||||||
|
)
|
130
go.sum
Normal file
130
go.sum
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible h1:KnPIugL51v3N3WwvaSmZbxukD1WuWXOiE9fRdu32f2I=
|
||||||
|
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||||
|
github.com/Azure/go-autorest v10.8.1+incompatible h1:u0jVQf+a6k6x8A+sT60l6EY9XZu+kHdnZVPAYqpVRo0=
|
||||||
|
github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
||||||
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
|
||||||
|
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
|
||||||
|
github.com/aws/aws-sdk-go v1.15.11 h1:m45+Ru/wA+73cOZXiEGLDH2d9uLN3iHqMc0/z4noDXE=
|
||||||
|
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
|
||||||
|
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a h1:BtpsbiV638WQZwhA98cEZw2BsbnQJrbd0BI7tsy0W1c=
|
||||||
|
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
|
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
|
||||||
|
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
|
||||||
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
|
||||||
|
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
|
||||||
|
github.com/bshuster-repo/logrus-logstash-hook v0.0.0-20170517171303-d2c0ecc1836d h1:DJZ/vtxEZ876RjwGfanOc5kJK65b4tGRFqUDJriKuFg=
|
||||||
|
github.com/bshuster-repo/logrus-logstash-hook v0.0.0-20170517171303-d2c0ecc1836d/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
|
||||||
|
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng=
|
||||||
|
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
|
||||||
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ=
|
||||||
|
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
|
||||||
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o=
|
||||||
|
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
|
||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4=
|
||||||
|
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
|
||||||
|
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c h1:KJAnOBuY9cTKVqB5cfbynpvFgeHRTREkRk8C977oFu4=
|
||||||
|
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY=
|
||||||
|
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||||
|
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 h1:yWHOI+vFjEsAakUTSrtqc/SAHrhSkmn48pqjidZX3QA=
|
||||||
|
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
||||||
|
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4=
|
||||||
|
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
||||||
|
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko=
|
||||||
|
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
||||||
|
github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo=
|
||||||
|
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
||||||
|
github.com/golang/protobuf v0.0.0-20160321223353-8d92cf5fc15a h1:vvuznlPYGGYdJ9yHfkMb3l9wSHugsXmSH/XN08b9XoI=
|
||||||
|
github.com/golang/protobuf v0.0.0-20160321223353-8d92cf5fc15a/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||||
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
|
||||||
|
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||||
|
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33 h1:893HsJqtxp9z1SF76gg6hY70hRY1wVlTSnC/h1yUDCo=
|
||||||
|
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
||||||
|
github.com/gorilla/mux v0.0.0-20170228224354-599cba5e7b61 h1:4lceeSGcX6bSAeeTiqcGX4DX6pMLPG5fKHvGeWAP/5c=
|
||||||
|
github.com/gorilla/mux v0.0.0-20170228224354-599cba5e7b61/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
|
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
|
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7 h1:SMvOWPJCES2GdFracYbBQh93GXac8fq7HeN6JnpduB8=
|
||||||
|
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||||
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/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/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI=
|
||||||
|
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
|
github.com/mitchellh/mapstructure v0.0.0-20150528213339-482a9fd5fa83 h1:DpXlMpJom9Cw/wuNxVv3e92kcCpGydKp2Rz6O5SrwkI=
|
||||||
|
github.com/mitchellh/mapstructure v0.0.0-20150528213339-482a9fd5fa83/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ=
|
||||||
|
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
|
||||||
|
github.com/ncw/swift v1.0.40 h1:0c+kzSF82qgP2TvDHwC534eoAMYTRS1jmr6KIMftTk0=
|
||||||
|
github.com/ncw/swift v1.0.40/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
|
||||||
|
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420 h1:Yu3681ykYHDfLoI6XVjL4JWmkE+3TX9yfIWwRCh1kFM=
|
||||||
|
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
|
github.com/opencontainers/image-spec v1.0.0 h1:jcw3cCH887bLKETGYpv8afogdYchbShR0eH6oD9d5PQ=
|
||||||
|
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||||
|
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/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06 h1:BqJUZe1wY8984P2XGsGIGieuao8wucwOwaTS10L9Lj8=
|
||||||
|
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5 h1:cLL6NowurKLMfCeQy4tIeph12XNQWgANCNvdyrOYKV4=
|
||||||
|
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
|
github.com/prometheus/common v0.0.0-20180110214958-89604d197083 h1:BVsJT8+ZbyuL3hypz/HmEiM8h2P6hBQGig4el9/MdjA=
|
||||||
|
github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7 h1:hhvfGDVThBnd4kYisSFmYuHYeUhglxcwag7FhVPH9zM=
|
||||||
|
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
|
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||||
|
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||||
|
github.com/sirupsen/logrus v0.0.0-20170620144510-3d4380f53a34 h1:kVLTAexkb0RpvzqHGdmxz80/bPLGuZn4qnUR0a4sW9Y=
|
||||||
|
github.com/sirupsen/logrus v0.0.0-20170620144510-3d4380f53a34/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||||
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
|
||||||
|
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
|
github.com/spf13/cobra v0.0.0-20150605180824-312092086bed h1:aMrfJ3kreAPpue0oog9V/QejkkfSfOIAFj1Okp0QFqc=
|
||||||
|
github.com/spf13/cobra v0.0.0-20150605180824-312092086bed/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
|
github.com/spf13/pflag v0.0.0-20150601220040-564482062245 h1:DbERKPDk2nYToPmmXaUZpO0TFlw3wj9K7FIK2dUIXv0=
|
||||||
|
github.com/spf13/pflag v0.0.0-20150601220040-564482062245/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI=
|
||||||
|
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
|
||||||
|
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE=
|
||||||
|
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
|
||||||
|
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY=
|
||||||
|
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
|
||||||
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20160304213135-045497edb623 h1:Ogcb1ofcvg+TPJ3U3BmnCFQxTzh9qidyMt5XgDWTrvw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20160304213135-045497edb623/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed h1:uPxWBzB3+mlnjy9W58qY1j/cjyFjutgw/Vhan2zLy/A=
|
||||||
|
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/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/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff h1:mk5zS3XLqVUzdF/CQCZ5ERujSF/8JFo+Wpkp/5I93NA=
|
||||||
|
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||||
|
google.golang.org/appengine v0.0.0-20160301025000-12d5545dc1cf h1:K3MmlQkPswneT7eBhEDAmDpCnNRKBX1ZHuRS7Sf9W+U=
|
||||||
|
google.golang.org/appengine v0.0.0-20160301025000-12d5545dc1cf/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA=
|
||||||
|
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
|
||||||
|
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a h1:zo0EaRwJM6T5UQ+QEt2dDSgEmbFJ4pZr/Rzsjpu7zgI=
|
||||||
|
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789 h1:NMiUjDZiD6qDVeBOzpImftxXzQHCp2Y2QLdmaqU9MRk=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/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=
|
|
@ -7,5 +7,4 @@ set -eu -o pipefail
|
||||||
|
|
||||||
go get -u github.com/alecthomas/gometalinter
|
go get -u github.com/alecthomas/gometalinter
|
||||||
gometalinter --install >/dev/null
|
gometalinter --install >/dev/null
|
||||||
go get -u github.com/LK4D4/vndr
|
|
||||||
go get -u github.com/cpuguy83/go-md2man
|
go get -u github.com/cpuguy83/go-md2man
|
||||||
|
|
|
@ -2,19 +2,11 @@
|
||||||
|
|
||||||
set -eu -o pipefail
|
set -eu -o pipefail
|
||||||
|
|
||||||
rm -rf vendor/
|
echo "- Checking for any unused/missing packages in go.mod..."
|
||||||
vndr |& grep -v -i clone
|
GO111MODULE=on go mod tidy
|
||||||
|
echo "- Checking for unused packages in vendor..."
|
||||||
|
GO111MODULE=on go mod vendor
|
||||||
|
git diff --exit-code -- go.sum go.mod vendor/
|
||||||
|
|
||||||
DIFF_PATH="vendor/"
|
untracked=$(git ls-files --others vendor | wc -l | awk '{ print $1 }')
|
||||||
DIFF=$(git status --porcelain -- "$DIFF_PATH")
|
[[ "${untracked}" == "0" ]]
|
||||||
|
|
||||||
if [ "$DIFF" ]; then
|
|
||||||
echo
|
|
||||||
echo "These files were modified:"
|
|
||||||
echo
|
|
||||||
echo "$DIFF"
|
|
||||||
echo
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "$DIFF_PATH is correct"
|
|
||||||
fi
|
|
||||||
|
|
46
vendor.conf
46
vendor.conf
|
@ -1,46 +0,0 @@
|
||||||
github.com/Azure/azure-sdk-for-go 4650843026a7fdec254a8d9cf893693a254edd0b
|
|
||||||
github.com/Azure/go-autorest eaa7994b2278094c904d31993d26f56324db3052
|
|
||||||
github.com/sirupsen/logrus 3d4380f53a34dcdc95f0c1db702615992b38d9a4
|
|
||||||
github.com/aws/aws-sdk-go f831d5a0822a1ad72420ab18c6269bca1ddaf490
|
|
||||||
github.com/bshuster-repo/logrus-logstash-hook d2c0ecc1836d91814e15e23bb5dc309c3ef51f4a
|
|
||||||
github.com/beorn7/perks 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
|
|
||||||
github.com/bugsnag/bugsnag-go b1d153021fcd90ca3f080db36bec96dc690fb274
|
|
||||||
github.com/bugsnag/osext 0dd3f918b21bec95ace9dc86c7e70266cfc5c702
|
|
||||||
github.com/bugsnag/panicwrap e2c28503fcd0675329da73bf48b33404db873782
|
|
||||||
github.com/denverdino/aliyungo a747050bb1baf06cdd65de7cddc281a2b1c2fde5
|
|
||||||
github.com/dgrijalva/jwt-go a601269ab70c205d26370c16f7c81e9017c14e04
|
|
||||||
github.com/docker/go-metrics 399ea8c73916000c64c2c76e8da00ca82f8387ab
|
|
||||||
github.com/docker/libtrust fa567046d9b14f6aa788882a950d69651d230b21
|
|
||||||
github.com/garyburd/redigo 535138d7bcd717d6531c701ef5933d98b1866257
|
|
||||||
github.com/go-ini/ini 2ba15ac2dc9cdf88c110ec2dc0ced7fa45f5678c
|
|
||||||
github.com/golang/protobuf 8d92cf5fc15a4382f8964b08e1f42a75c0591aa3
|
|
||||||
github.com/gorilla/handlers 60c7bfde3e33c201519a200a4507a158cc03a17b
|
|
||||||
github.com/gorilla/mux 599cba5e7b6137d46ddf58fb1765f5d928e69604
|
|
||||||
github.com/inconshreveable/mousetrap 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
|
|
||||||
github.com/jmespath/go-jmespath bd40a432e4c76585ef6b72d3fd96fb9b6dc7b68d
|
|
||||||
github.com/marstr/guid 8bd9a64bf37eb297b492a4101fb28e80ac0b290f
|
|
||||||
github.com/satori/go.uuid f58768cc1a7a7e77a3bd49e98cdd21419399b6a3
|
|
||||||
github.com/matttproud/golang_protobuf_extensions c12348ce28de40eed0136aa2b644d0ee0650e56c
|
|
||||||
github.com/mitchellh/mapstructure 482a9fd5fa83e8c4e7817413b80f3eb8feec03ef
|
|
||||||
github.com/ncw/swift a0320860b16212c2b59b4912bb6508cda1d7cee6
|
|
||||||
github.com/prometheus/client_golang c332b6f63c0658a65eca15c0e5247ded801cf564
|
|
||||||
github.com/prometheus/client_model 99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c
|
|
||||||
github.com/prometheus/common 89604d197083d4781071d3c65855d24ecfb0a563
|
|
||||||
github.com/prometheus/procfs cb4147076ac75738c9a7d279075a253c0cc5acbd
|
|
||||||
github.com/Shopify/logrus-bugsnag 577dee27f20dd8f1a529f82210094af593be12bd
|
|
||||||
github.com/spf13/cobra 312092086bed4968099259622145a0c9ae280064
|
|
||||||
github.com/spf13/pflag 5644820622454e71517561946e3d94b9f9db6842
|
|
||||||
github.com/yvasiyarov/go-metrics 57bccd1ccd43f94bb17fdd8bf3007059b802f85e
|
|
||||||
github.com/yvasiyarov/gorelic a9bba5b9ab508a086f9a12b8c51fab68478e2128
|
|
||||||
github.com/yvasiyarov/newrelic_platform_go b21fdbd4370f3717f3bbd2bf41c223bc273068e6
|
|
||||||
golang.org/x/crypto e84da0312774c21d64ee2317962ef669b27ffb41
|
|
||||||
golang.org/x/net 4876518f9e71663000c348837735820161a42df7
|
|
||||||
golang.org/x/oauth2 045497edb6234273d67dbc25da3f2ddbc4c4cacf
|
|
||||||
google.golang.org/api 9bf6e6e569ff057f75d9604a46c52928f17d2b54
|
|
||||||
google.golang.org/appengine 12d5545dc1cfa6047a286d5e853841b6471f4c19
|
|
||||||
google.golang.org/cloud 975617b05ea8a58727e6c1a06b6161ff4185a9f2
|
|
||||||
google.golang.org/grpc d3ddb4469d5a1b949fc7a7da7c1d6a0d1b6de994
|
|
||||||
gopkg.in/check.v1 64131543e7896d5bcc6bd5a76287eb75ea96c673
|
|
||||||
gopkg.in/yaml.v2 v2.2.1
|
|
||||||
github.com/opencontainers/go-digest a6d0ee40d4207ea02364bd3b9e8e77b9159ba1eb
|
|
||||||
github.com/opencontainers/image-spec ab7389ef9f50030c9b245bc16b981c7ddf192882
|
|
301
vendor/github.com/Azure/azure-sdk-for-go/README.md
generated
vendored
301
vendor/github.com/Azure/azure-sdk-for-go/README.md
generated
vendored
|
@ -1,301 +0,0 @@
|
||||||
# Azure SDK for Go
|
|
||||||
|
|
||||||
[![godoc](https://godoc.org/github.com/Azure/azure-sdk-for-go?status.svg)](https://godoc.org/github.com/Azure/azure-sdk-for-go)
|
|
||||||
[![Build Status](https://travis-ci.org/Azure/azure-sdk-for-go.svg?branch=master)](https://travis-ci.org/Azure/azure-sdk-for-go)
|
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/Azure/azure-sdk-for-go)](https://goreportcard.com/report/github.com/Azure/azure-sdk-for-go)
|
|
||||||
|
|
||||||
azure-sdk-for-go provides Go packages for managing and using Azure services. It has been
|
|
||||||
tested with Go 1.8, 1.9 and 1.10.
|
|
||||||
|
|
||||||
To be notified about updates and changes, subscribe to the [Azure update
|
|
||||||
feed](https://azure.microsoft.com/updates/).
|
|
||||||
|
|
||||||
Users of the SDK may prefer to jump right in to our samples repo at
|
|
||||||
[github.com/Azure-Samples/azure-sdk-for-go-samples][samples_repo].
|
|
||||||
|
|
||||||
### Build Details
|
|
||||||
|
|
||||||
Most packages in the SDK are generated from [Azure API specs][azure_rest_specs]
|
|
||||||
using [Azure/autorest.go][] and [Azure/autorest][]. These generated packages
|
|
||||||
depend on the HTTP client implemented at [Azure/go-autorest][].
|
|
||||||
|
|
||||||
[azure_rest_specs]: https://github.com/Azure/azure-rest-api-specs
|
|
||||||
[Azure/autorest]: https://github.com/Azure/autorest
|
|
||||||
[Azure/autorest.go]: https://github.com/Azure/autorest.go
|
|
||||||
[Azure/go-autorest]: https://github.com/Azure/go-autorest
|
|
||||||
|
|
||||||
The SDK codebase adheres to [semantic versioning](https://semver.org) and thus
|
|
||||||
avoids breaking changes other than at major (x.0.0) releases. However,
|
|
||||||
occasionally Azure API fixes require breaking updates within an individual
|
|
||||||
package; these exceptions are noted in release changelogs.
|
|
||||||
|
|
||||||
To more reliably manage dependencies like the Azure SDK in your applications we
|
|
||||||
recommend [golang/dep](https://github.com/golang/dep).
|
|
||||||
|
|
||||||
# Install and Use:
|
|
||||||
|
|
||||||
### Install
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ go get -u github.com/Azure/azure-sdk-for-go/...
|
|
||||||
```
|
|
||||||
|
|
||||||
or if you use dep, within your repo run:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ dep ensure -add github.com/Azure/azure-sdk-for-go
|
|
||||||
```
|
|
||||||
|
|
||||||
If you need to install Go, follow [the official instructions](https://golang.org/dl/).
|
|
||||||
|
|
||||||
### Use
|
|
||||||
|
|
||||||
For complete examples of many scenarios see [Azure-Samples/azure-sdk-for-go-samples][samples_repo].
|
|
||||||
|
|
||||||
1. Import a package from the [services][services_dir] directory.
|
|
||||||
2. Create and authenticate a client with a `New*Client` func, e.g.
|
|
||||||
`c := compute.NewVirtualMachinesClient(...)`.
|
|
||||||
3. Invoke API methods using the client, e.g. `c.CreateOrUpdate(...)`.
|
|
||||||
4. Handle responses.
|
|
||||||
|
|
||||||
[services_dir]: https://github.com/Azure/azure-sdk-for-go/tree/master/services
|
|
||||||
|
|
||||||
For example, to create a new virtual network (substitute your own values for
|
|
||||||
strings in angle brackets):
|
|
||||||
|
|
||||||
Note: For more on authentication and the `Authorizer` interface see [the next
|
|
||||||
section](#authentication).
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network"
|
|
||||||
"github.com/Azure/go-autorest/autorest/azure/auth"
|
|
||||||
"github.com/Azure/go-autorest/autorest/to"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
vnetClient := network.NewVirtualNetworksClient("<subscriptionID>")
|
|
||||||
authorizer, err := auth.NewAuthorizerFromEnvironment()
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
vnetClient.Authorizer = authorizer
|
|
||||||
}
|
|
||||||
|
|
||||||
vnetClient.CreateOrUpdate(context.Background(),
|
|
||||||
"<resourceGroupName>",
|
|
||||||
"<vnetName>",
|
|
||||||
network.VirtualNetwork{
|
|
||||||
Location: to.StringPtr("<azureRegion>"),
|
|
||||||
VirtualNetworkPropertiesFormat: &network.VirtualNetworkPropertiesFormat{
|
|
||||||
AddressSpace: &network.AddressSpace{
|
|
||||||
AddressPrefixes: &[]string{"10.0.0.0/8"},
|
|
||||||
},
|
|
||||||
Subnets: &[]network.Subnet{
|
|
||||||
{
|
|
||||||
Name: to.StringPtr("<subnet1Name>"),
|
|
||||||
SubnetPropertiesFormat: &network.SubnetPropertiesFormat{
|
|
||||||
AddressPrefix: to.StringPtr("10.0.0.0/16"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: to.StringPtr("<subnet2Name>"),
|
|
||||||
SubnetPropertiesFormat: &network.SubnetPropertiesFormat{
|
|
||||||
AddressPrefix: to.StringPtr("10.1.0.0/16"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Authentication
|
|
||||||
|
|
||||||
Most SDK operations require an OAuth token for authentication and authorization. These are
|
|
||||||
made available in the Go SDK For Azure through types implementing the `Authorizer` interface.
|
|
||||||
You can get one from Azure Active Directory using the SDK's
|
|
||||||
[authentication](https://godoc.org/github.com/Azure/go-autorest/autorest/azure/auth) package. The `Authorizer` returned should
|
|
||||||
be set as the authorizer for the resource client, as shown in the [previous section](#use).
|
|
||||||
|
|
||||||
You can get an authorizer in the following ways:
|
|
||||||
1. From the **Environment**:
|
|
||||||
- Use `auth.auth.NewAuthorizerFromEnvironment()`. This call will try to get an authorizer based on the environment
|
|
||||||
variables with different types of credentials in the following order:
|
|
||||||
1. **Client Credentials**: Uses the AAD App Secret for auth.
|
|
||||||
- `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate.
|
|
||||||
- `AZURE_CLIENT_ID`: Specifies the app client ID to use.
|
|
||||||
- `AZURE_CLIENT_SECRET`: Specifies the app secret to use.
|
|
||||||
2. **Client Certificate**: Uses a certificate that was configured on the AAD Service Principal.
|
|
||||||
- `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate.
|
|
||||||
- `AZURE_CLIENT_ID`: Specifies the app client ID to use.
|
|
||||||
- `AZURE_CERTIFICATE_PATH`: Specifies the certificate Path to use.
|
|
||||||
- `AZURE_CERTIFICATE_PASSWORD`: Specifies the certificate password to use.
|
|
||||||
3. **Username Pasword**: Uses a username and a password for auth. This is not recommended. Use `Device Flow` Auth instead for user interactive acccess.
|
|
||||||
- `AZURE_TENANT_ID`: Specifies the Tenant to which to authenticate.
|
|
||||||
- `AZURE_CLIENT_ID`: Specifies the app client ID to use.
|
|
||||||
- `AZURE_USERNAME`: Specifies the username to use.
|
|
||||||
- `AZURE_PASSWORD`: Specifies the password to use.
|
|
||||||
4. **MSI**: Only available for apps running in Azure. No configuration needed as it leverages the fact that the app is running in Azure. See [Azure Managed Service Identity](https://docs.microsoft.com/en-us/azure/active-directory/msi-overview).
|
|
||||||
|
|
||||||
- Optionally, the following environment variables can be defined:
|
|
||||||
- `AZURE_ENVIRONMENT`: Specifies the Azure Environment to use. If not set, it defaults to `AzurePublicCloud`. (Not applicable to MSI based auth)
|
|
||||||
- `AZURE_AD_RESOURCE`: Specifies the AAD resource ID to use. If not set, it defaults to `ResourceManagerEndpoint`which allows management operations against Azure Resource Manager.
|
|
||||||
|
|
||||||
2. From an **Auth File**:
|
|
||||||
- Create a service principal and output the file content using `az ad sp create-for-rbac --sdk-auth` from the Azure CLI.For more details see [az ad sp](https://docs.microsoft.com/en-us/cli/azure/ad/sp).
|
|
||||||
- Set environment variable `AZURE_AUTH_LOCATION` for finding the file.
|
|
||||||
- Use `auth.NewAuthorizerFromFile()` for getting the `Authorizer` based on the auth file.
|
|
||||||
|
|
||||||
3. From **Device Flow** by configuring `auth.DeviceFlowConfig` and calling the `Authorizer()` method.
|
|
||||||
|
|
||||||
Note: To authenticate you first need to create a service principal in Azure. To create a new service principal, run
|
|
||||||
`az ad sp create-for-rbac -n "<app_name>"` in the
|
|
||||||
[azure-cli](https://github.com/Azure/azure-cli). See
|
|
||||||
[these docs](https://docs.microsoft.com/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest)
|
|
||||||
for more info. Copy the new principal's ID, secret, and tenant ID for use in your app.
|
|
||||||
|
|
||||||
Alternatively, if your apps are running in Azure, you can now leverage the [Managed Service Identity](https://docs.microsoft.com/en-us/azure/active-directory/msi-overview).
|
|
||||||
|
|
||||||
# Versioning
|
|
||||||
|
|
||||||
azure-sdk-for-go provides at least a basic Go binding for every Azure API. To
|
|
||||||
provide maximum flexibility to users, the SDK even includes previous versions of
|
|
||||||
Azure APIs which are still in use. This enables us to support users of the
|
|
||||||
most updated Azure datacenters, regional datacenters with earlier APIs, and
|
|
||||||
even on-premises installations of Azure Stack.
|
|
||||||
|
|
||||||
**SDK versions** apply globally and are tracked by git
|
|
||||||
[tags](https://github.com/Azure/azure-sdk-for-go/tags). These are in x.y.z form
|
|
||||||
and generally adhere to [semantic versioning](https://semver.org) specifications.
|
|
||||||
|
|
||||||
**Service API versions** are generally represented by a date string and are
|
|
||||||
tracked by offering separate packages for each version. For example, to choose the
|
|
||||||
latest API versions for Compute and Network, use the following imports:
|
|
||||||
|
|
||||||
```go
|
|
||||||
import (
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2017-12-01/compute"
|
|
||||||
"github.com/Azure/azure-sdk-for-go/services/network/mgmt/2017-09-01/network"
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
Occasionally service-side changes require major changes to existing versions.
|
|
||||||
These cases are noted in the changelog.
|
|
||||||
|
|
||||||
All avilable services and versions are listed under the `services/` path in
|
|
||||||
this repo and in [GoDoc][services_godoc]. Run `find ./services -type d
|
|
||||||
-mindepth 3` to list all available service packages.
|
|
||||||
|
|
||||||
[services_godoc]: https://godoc.org/github.com/Azure/azure-sdk-for-go/services
|
|
||||||
|
|
||||||
### Profiles
|
|
||||||
|
|
||||||
Azure **API profiles** specify subsets of Azure APIs and versions. Profiles can provide:
|
|
||||||
|
|
||||||
* **stability** for your application by locking to specific API versions; and/or
|
|
||||||
* **compatibility** for your application with Azure Stack and regional Azure datacenters.
|
|
||||||
|
|
||||||
In the Go SDK, profiles are available under the `profiles/` path and their
|
|
||||||
component API versions are aliases to the true service package under
|
|
||||||
`services/`. You can use them as follows:
|
|
||||||
|
|
||||||
```go
|
|
||||||
import "github.com/Azure/azure-sdk-for-go/profiles/2017-03-09/compute/mgmt/compute"
|
|
||||||
import "github.com/Azure/azure-sdk-for-go/profiles/2017-03-09/network/mgmt/network"
|
|
||||||
import "github.com/Azure/azure-sdk-for-go/profiles/2017-03-09/storage/mgmt/storage"
|
|
||||||
```
|
|
||||||
|
|
||||||
The 2017-03-09 profile is the only one currently available and is for use in
|
|
||||||
hybrid Azure and Azure Stack environments. More profiles are under development.
|
|
||||||
|
|
||||||
In addition to versioned profiles, we also provide two special profiles
|
|
||||||
`latest` and `preview`. These *always* include the most recent respective stable or
|
|
||||||
preview API versions for each service, even when updating them to do so causes
|
|
||||||
breaking changes. That is, these do *not* adhere to semantic versioning rules.
|
|
||||||
|
|
||||||
The `latest` and `preview` profiles can help you stay up to date with API
|
|
||||||
updates as you build applications. Since they are by definition not stable,
|
|
||||||
however, they **should not** be used in production apps. Instead, choose the
|
|
||||||
latest specific API version (or an older one if necessary) from the `services/`
|
|
||||||
path.
|
|
||||||
|
|
||||||
As an example, to automatically use the most recent Compute APIs, use one of
|
|
||||||
the following imports:
|
|
||||||
|
|
||||||
```go
|
|
||||||
import "github.com/Azure/azure-sdk-for-go/profiles/latest/compute/mgmt/compute"
|
|
||||||
import "github.com/Azure/azure-sdk-for-go/profiles/preview/compute/mgmt/compute"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Inspecting and Debugging
|
|
||||||
|
|
||||||
All clients implement some handy hooks to help inspect the underlying requests being made to Azure.
|
|
||||||
|
|
||||||
- `RequestInspector`: View and manipulate the go `http.Request` before it's sent
|
|
||||||
- `ResponseInspector`: View the `http.Response` received
|
|
||||||
|
|
||||||
Here is an example of how these can be used with `net/http/httputil` to see requests and responses.
|
|
||||||
|
|
||||||
```go
|
|
||||||
|
|
||||||
vnetClient := network.NewVirtualNetworksClient("<subscriptionID>")
|
|
||||||
vnetClient.RequestInspector = LogRequest()
|
|
||||||
vnetClient.ResponseInspector = LogResponse()
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
func LogRequest() autorest.PrepareDecorator {
|
|
||||||
return func(p autorest.Preparer) autorest.Preparer {
|
|
||||||
return autorest.PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
|
||||||
r, err := p.Prepare(r)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
}
|
|
||||||
dump, _ := httputil.DumpRequestOut(r, true)
|
|
||||||
log.Println(string(dump))
|
|
||||||
return r, err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func LogResponse() autorest.RespondDecorator {
|
|
||||||
return func(p autorest.Responder) autorest.Responder {
|
|
||||||
return autorest.ResponderFunc(func(r *http.Response) error {
|
|
||||||
err := p.Respond(r)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
}
|
|
||||||
dump, _ := httputil.DumpResponse(r, true)
|
|
||||||
log.Println(string(dump))
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
# Resources
|
|
||||||
|
|
||||||
- SDK docs are at [godoc.org](https://godoc.org/github.com/Azure/azure-sdk-for-go/).
|
|
||||||
- SDK samples are at [Azure-Samples/azure-sdk-for-go-samples](https://github.com/Azure-Samples/azure-sdk-for-go-samples).
|
|
||||||
- SDK notifications are published via the [Azure update feed](https://azure.microsoft.com/updates/).
|
|
||||||
- Azure API docs are at [docs.microsoft.com/rest/api](https://docs.microsoft.com/rest/api/).
|
|
||||||
- General Azure docs are at [docs.microsoft.com/azure](https://docs.microsoft.com/azure).
|
|
||||||
|
|
||||||
### Other Azure packages for Go
|
|
||||||
|
|
||||||
- [Azure Storage Blobs](https://azure.microsoft.com/services/storage/blobs) - [github.com/Azure/azure-storage-blob-go](https://github.com/Azure/azure-storage-blob-go)
|
|
||||||
- [Azure Applications Insights](https://azure.microsoft.com/en-us/services/application-insights/) - [github.com/Microsoft/ApplicationInsights-Go](https://github.com/Microsoft/ApplicationInsights-Go)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Apache 2.0, see [LICENSE](./LICENSE).
|
|
||||||
|
|
||||||
## Contribute
|
|
||||||
|
|
||||||
See [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|
||||||
|
|
||||||
[samples_repo]: https://github.com/Azure-Samples/azure-sdk-for-go-samples
|
|
||||||
|
|
149
vendor/github.com/Azure/go-autorest/README.md
generated
vendored
149
vendor/github.com/Azure/go-autorest/README.md
generated
vendored
|
@ -1,149 +0,0 @@
|
||||||
# go-autorest
|
|
||||||
|
|
||||||
[![GoDoc](https://godoc.org/github.com/Azure/go-autorest/autorest?status.png)](https://godoc.org/github.com/Azure/go-autorest/autorest)
|
|
||||||
[![Build Status](https://travis-ci.org/Azure/go-autorest.svg?branch=master)](https://travis-ci.org/Azure/go-autorest)
|
|
||||||
[![Go Report Card](https://goreportcard.com/badge/Azure/go-autorest)](https://goreportcard.com/report/Azure/go-autorest)
|
|
||||||
|
|
||||||
Package go-autorest provides an HTTP request client for use with [Autorest](https://github.com/Azure/autorest.go)-generated API client packages.
|
|
||||||
|
|
||||||
An authentication client tested with Azure Active Directory (AAD) is also
|
|
||||||
provided in this repo in the package
|
|
||||||
`github.com/Azure/go-autorest/autorest/adal`. Despite its name, this package
|
|
||||||
is maintained only as part of the Azure Go SDK and is not related to other
|
|
||||||
"ADAL" libraries in [github.com/AzureAD](https://github.com/AzureAD).
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Package go-autorest implements an HTTP request pipeline suitable for use across
|
|
||||||
multiple goroutines and provides the shared routines used by packages generated
|
|
||||||
by [Autorest](https://github.com/Azure/autorest.go).
|
|
||||||
|
|
||||||
The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending,
|
|
||||||
and Responding. A typical pattern is:
|
|
||||||
|
|
||||||
```go
|
|
||||||
req, err := Prepare(&http.Request{},
|
|
||||||
token.WithAuthorization())
|
|
||||||
|
|
||||||
resp, err := Send(req,
|
|
||||||
WithLogging(logger),
|
|
||||||
DoErrorIfStatusCode(http.StatusInternalServerError),
|
|
||||||
DoCloseIfError(),
|
|
||||||
DoRetryForAttempts(5, time.Second))
|
|
||||||
|
|
||||||
err = Respond(resp,
|
|
||||||
ByDiscardingBody(),
|
|
||||||
ByClosing())
|
|
||||||
```
|
|
||||||
|
|
||||||
Each phase relies on decorators to modify and / or manage processing. Decorators may first modify
|
|
||||||
and then pass the data along, pass the data first and then modify the result, or wrap themselves
|
|
||||||
around passing the data (such as a logger might do). Decorators run in the order provided. For
|
|
||||||
example, the following:
|
|
||||||
|
|
||||||
```go
|
|
||||||
req, err := Prepare(&http.Request{},
|
|
||||||
WithBaseURL("https://microsoft.com/"),
|
|
||||||
WithPath("a"),
|
|
||||||
WithPath("b"),
|
|
||||||
WithPath("c"))
|
|
||||||
```
|
|
||||||
|
|
||||||
will set the URL to:
|
|
||||||
|
|
||||||
```
|
|
||||||
https://microsoft.com/a/b/c
|
|
||||||
```
|
|
||||||
|
|
||||||
Preparers and Responders may be shared and re-used (assuming the underlying decorators support
|
|
||||||
sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders
|
|
||||||
shared among multiple go-routines, and a single Sender shared among multiple sending go-routines,
|
|
||||||
all bound together by means of input / output channels.
|
|
||||||
|
|
||||||
Decorators hold their passed state within a closure (such as the path components in the example
|
|
||||||
above). Be careful to share Preparers and Responders only in a context where such held state
|
|
||||||
applies. For example, it may not make sense to share a Preparer that applies a query string from a
|
|
||||||
fixed set of values. Similarly, sharing a Responder that reads the response body into a passed
|
|
||||||
struct (e.g., `ByUnmarshallingJson`) is likely incorrect.
|
|
||||||
|
|
||||||
Errors raised by autorest objects and methods will conform to the `autorest.Error` interface.
|
|
||||||
|
|
||||||
See the included examples for more detail. For details on the suggested use of this package by
|
|
||||||
generated clients, see the Client described below.
|
|
||||||
|
|
||||||
## Helpers
|
|
||||||
|
|
||||||
### Handling Swagger Dates
|
|
||||||
|
|
||||||
The Swagger specification (https://swagger.io) that drives AutoRest
|
|
||||||
(https://github.com/Azure/autorest/) precisely defines two date forms: date and date-time. The
|
|
||||||
github.com/Azure/go-autorest/autorest/date package provides time.Time derivations to ensure correct
|
|
||||||
parsing and formatting.
|
|
||||||
|
|
||||||
### Handling Empty Values
|
|
||||||
|
|
||||||
In JSON, missing values have different semantics than empty values. This is especially true for
|
|
||||||
services using the HTTP PATCH verb. The JSON submitted with a PATCH request generally contains
|
|
||||||
only those values to modify. Missing values are to be left unchanged. Developers, then, require a
|
|
||||||
means to both specify an empty value and to leave the value out of the submitted JSON.
|
|
||||||
|
|
||||||
The Go JSON package (`encoding/json`) supports the `omitempty` tag. When specified, it omits
|
|
||||||
empty values from the rendered JSON. Since Go defines default values for all base types (such as ""
|
|
||||||
for string and 0 for int) and provides no means to mark a value as actually empty, the JSON package
|
|
||||||
treats default values as meaning empty, omitting them from the rendered JSON. This means that, using
|
|
||||||
the Go base types encoded through the default JSON package, it is not possible to create JSON to
|
|
||||||
clear a value at the server.
|
|
||||||
|
|
||||||
The workaround within the Go community is to use pointers to base types in lieu of base types within
|
|
||||||
structures that map to JSON. For example, instead of a value of type `string`, the workaround uses
|
|
||||||
`*string`. While this enables distinguishing empty values from those to be unchanged, creating
|
|
||||||
pointers to a base type (notably constant, in-line values) requires additional variables. This, for
|
|
||||||
example,
|
|
||||||
|
|
||||||
```go
|
|
||||||
s := struct {
|
|
||||||
S *string
|
|
||||||
}{ S: &"foo" }
|
|
||||||
```
|
|
||||||
fails, while, this
|
|
||||||
|
|
||||||
```go
|
|
||||||
v := "foo"
|
|
||||||
s := struct {
|
|
||||||
S *string
|
|
||||||
}{ S: &v }
|
|
||||||
```
|
|
||||||
succeeds.
|
|
||||||
|
|
||||||
To ease using pointers, the subpackage `to` contains helpers that convert to and from pointers for
|
|
||||||
Go base types which have Swagger analogs. It also provides a helper that converts between
|
|
||||||
`map[string]string` and `map[string]*string`, enabling the JSON to specify that the value
|
|
||||||
associated with a key should be cleared. With the helpers, the previous example becomes
|
|
||||||
|
|
||||||
```go
|
|
||||||
s := struct {
|
|
||||||
S *string
|
|
||||||
}{ S: to.StringPtr("foo") }
|
|
||||||
```
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```bash
|
|
||||||
go get github.com/Azure/go-autorest/autorest
|
|
||||||
go get github.com/Azure/go-autorest/autorest/azure
|
|
||||||
go get github.com/Azure/go-autorest/autorest/date
|
|
||||||
go get github.com/Azure/go-autorest/autorest/to
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
See LICENSE file.
|
|
||||||
|
|
||||||
-----
|
|
||||||
|
|
||||||
This project has adopted the [Microsoft Open Source Code of
|
|
||||||
Conduct](https://opensource.microsoft.com/codeofconduct/). For more information
|
|
||||||
see the [Code of Conduct
|
|
||||||
FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact
|
|
||||||
[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional
|
|
||||||
questions or comments.
|
|
4
vendor/github.com/Shopify/logrus-bugsnag/.travis.yml
generated
vendored
Normal file
4
vendor/github.com/Shopify/logrus-bugsnag/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.7
|
8
vendor/github.com/Shopify/logrus-bugsnag/dev.yml
generated
vendored
Normal file
8
vendor/github.com/Shopify/logrus-bugsnag/dev.yml
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
name: logrus-bugsnag
|
||||||
|
|
||||||
|
up:
|
||||||
|
- go: 1.6.2
|
||||||
|
|
||||||
|
commands:
|
||||||
|
test:
|
||||||
|
run: go get -t ./... && go test ./...
|
451
vendor/github.com/aws/aws-sdk-go/README.md
generated
vendored
451
vendor/github.com/aws/aws-sdk-go/README.md
generated
vendored
|
@ -1,451 +0,0 @@
|
||||||
[![API Reference](http://img.shields.io/badge/api-reference-blue.svg)](http://docs.aws.amazon.com/sdk-for-go/api) [![Join the chat at https://gitter.im/aws/aws-sdk-go](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/aws/aws-sdk-go?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://img.shields.io/travis/aws/aws-sdk-go.svg)](https://travis-ci.org/aws/aws-sdk-go) [![Apache V2 License](http://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt)
|
|
||||||
|
|
||||||
# AWS SDK for Go
|
|
||||||
|
|
||||||
aws-sdk-go is the official AWS SDK for the Go programming language.
|
|
||||||
|
|
||||||
Checkout our [release notes](https://github.com/aws/aws-sdk-go/releases) for information about the latest bug fixes, updates, and features added to the SDK.
|
|
||||||
|
|
||||||
We [announced](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-2-0-developer-preview/) the Developer Preview for the [v2 AWS SDK for Go](https://github.com/aws/aws-sdk-go-v2). The v2 SDK is available at https://github.com/aws/aws-sdk-go-v2, and `go get github.com/aws/aws-sdk-go-v2` via `go get`. Check out the v2 SDK's [changes and updates](https://github.com/aws/aws-sdk-go-v2/blob/master/CHANGELOG.md), and let us know what you think. We want your feedback.
|
|
||||||
|
|
||||||
## Installing
|
|
||||||
|
|
||||||
If you are using Go 1.5 with the `GO15VENDOREXPERIMENT=1` vendoring flag, or 1.6 and higher you can use the following command to retrieve the SDK. The SDK's non-testing dependencies will be included and are vendored in the `vendor` folder.
|
|
||||||
|
|
||||||
go get -u github.com/aws/aws-sdk-go
|
|
||||||
|
|
||||||
Otherwise if your Go environment does not have vendoring support enabled, or you do not want to include the vendored SDK's dependencies you can use the following command to retrieve the SDK and its non-testing dependencies using `go get`.
|
|
||||||
|
|
||||||
go get -u github.com/aws/aws-sdk-go/aws/...
|
|
||||||
go get -u github.com/aws/aws-sdk-go/service/...
|
|
||||||
|
|
||||||
If you're looking to retrieve just the SDK without any dependencies use the following command.
|
|
||||||
|
|
||||||
go get -d github.com/aws/aws-sdk-go/
|
|
||||||
|
|
||||||
These two processes will still include the `vendor` folder and it should be deleted if its not going to be used by your environment.
|
|
||||||
|
|
||||||
rm -rf $GOPATH/src/github.com/aws/aws-sdk-go/vendor
|
|
||||||
|
|
||||||
## Getting Help
|
|
||||||
|
|
||||||
Please use these community resources for getting help. We use the GitHub issues for tracking bugs and feature requests.
|
|
||||||
|
|
||||||
* Ask a question on [StackOverflow](http://stackoverflow.com/) and tag it with the [`aws-sdk-go`](http://stackoverflow.com/questions/tagged/aws-sdk-go) tag.
|
|
||||||
* Come join the AWS SDK for Go community chat on [gitter](https://gitter.im/aws/aws-sdk-go).
|
|
||||||
* Open a support ticket with [AWS Support](http://docs.aws.amazon.com/awssupport/latest/user/getting-started.html).
|
|
||||||
* If you think you may have found a bug, please open an [issue](https://github.com/aws/aws-sdk-go/issues/new).
|
|
||||||
|
|
||||||
## Opening Issues
|
|
||||||
|
|
||||||
If you encounter a bug with the AWS SDK for Go we would like to hear about it. Search the [existing issues](https://github.com/aws/aws-sdk-go/issues) and see if others are also experiencing the issue before opening a new issue. Please include the version of AWS SDK for Go, Go language, and OS you’re using. Please also include repro case when appropriate.
|
|
||||||
|
|
||||||
The GitHub issues are intended for bug reports and feature requests. For help and questions with using AWS SDK for GO please make use of the resources listed in the [Getting Help](https://github.com/aws/aws-sdk-go#getting-help) section. Keeping the list of open issues lean will help us respond in a timely manner.
|
|
||||||
|
|
||||||
## Reference Documentation
|
|
||||||
|
|
||||||
[`Getting Started Guide`](https://aws.amazon.com/sdk-for-go/) - This document is a general introduction how to configure and make requests with the SDK. If this is your first time using the SDK, this documentation and the API documentation will help you get started. This document focuses on the syntax and behavior of the SDK. The [Service Developer Guide](https://aws.amazon.com/documentation/) will help you get started using specific AWS services.
|
|
||||||
|
|
||||||
[`SDK API Reference Documentation`](https://docs.aws.amazon.com/sdk-for-go/api/) - Use this document to look up all API operation input and output parameters for AWS services supported by the SDK. The API reference also includes documentation of the SDK, and examples how to using the SDK, service client API operations, and API operation require parameters.
|
|
||||||
|
|
||||||
[`Service Developer Guide`](https://aws.amazon.com/documentation/) - Use this documentation to learn how to interface with an AWS service. These are great guides both, if you're getting started with a service, or looking for more information on a service. You should not need this document for coding, though in some cases, services may supply helpful samples that you might want to look out for.
|
|
||||||
|
|
||||||
[`SDK Examples`](https://github.com/aws/aws-sdk-go/tree/master/example) - Included in the SDK's repo are a several hand crafted examples using the SDK features and AWS services.
|
|
||||||
|
|
||||||
## Overview of SDK's Packages
|
|
||||||
|
|
||||||
The SDK is composed of two main components, SDK core, and service clients.
|
|
||||||
The SDK core packages are all available under the aws package at the root of
|
|
||||||
the SDK. Each client for a supported AWS service is available within its own
|
|
||||||
package under the service folder at the root of the SDK.
|
|
||||||
|
|
||||||
* aws - SDK core, provides common shared types such as Config, Logger,
|
|
||||||
and utilities to make working with API parameters easier.
|
|
||||||
|
|
||||||
* awserr - Provides the error interface that the SDK will use for all
|
|
||||||
errors that occur in the SDK's processing. This includes service API
|
|
||||||
response errors as well. The Error type is made up of a code and message.
|
|
||||||
Cast the SDK's returned error type to awserr.Error and call the Code
|
|
||||||
method to compare returned error to specific error codes. See the package's
|
|
||||||
documentation for additional values that can be extracted such as RequestID.
|
|
||||||
|
|
||||||
* credentials - Provides the types and built in credentials providers
|
|
||||||
the SDK will use to retrieve AWS credentials to make API requests with.
|
|
||||||
Nested under this folder are also additional credentials providers such as
|
|
||||||
stscreds for assuming IAM roles, and ec2rolecreds for EC2 Instance roles.
|
|
||||||
|
|
||||||
* endpoints - Provides the AWS Regions and Endpoints metadata for the SDK.
|
|
||||||
Use this to lookup AWS service endpoint information such as which services
|
|
||||||
are in a region, and what regions a service is in. Constants are also provided
|
|
||||||
for all region identifiers, e.g UsWest2RegionID for "us-west-2".
|
|
||||||
|
|
||||||
* session - Provides initial default configuration, and load
|
|
||||||
configuration from external sources such as environment and shared
|
|
||||||
credentials file.
|
|
||||||
|
|
||||||
* request - Provides the API request sending, and retry logic for the SDK.
|
|
||||||
This package also includes utilities for defining your own request
|
|
||||||
retryer, and configuring how the SDK processes the request.
|
|
||||||
|
|
||||||
* service - Clients for AWS services. All services supported by the SDK are
|
|
||||||
available under this folder.
|
|
||||||
|
|
||||||
## How to Use the SDK's AWS Service Clients
|
|
||||||
|
|
||||||
The SDK includes the Go types and utilities you can use to make requests to
|
|
||||||
AWS service APIs. Within the service folder at the root of the SDK you'll find
|
|
||||||
a package for each AWS service the SDK supports. All service clients follows
|
|
||||||
a common pattern of creation and usage.
|
|
||||||
|
|
||||||
When creating a client for an AWS service you'll first need to have a Session
|
|
||||||
value constructed. The Session provides shared configuration that can be shared
|
|
||||||
between your service clients. When service clients are created you can pass
|
|
||||||
in additional configuration via the aws.Config type to override configuration
|
|
||||||
provided by in the Session to create service client instances with custom
|
|
||||||
configuration.
|
|
||||||
|
|
||||||
Once the service's client is created you can use it to make API requests the
|
|
||||||
AWS service. These clients are safe to use concurrently.
|
|
||||||
|
|
||||||
## Configuring the SDK
|
|
||||||
|
|
||||||
In the AWS SDK for Go, you can configure settings for service clients, such
|
|
||||||
as the log level and maximum number of retries. Most settings are optional;
|
|
||||||
however, for each service client, you must specify a region and your credentials.
|
|
||||||
The SDK uses these values to send requests to the correct AWS region and sign
|
|
||||||
requests with the correct credentials. You can specify these values as part
|
|
||||||
of a session or as environment variables.
|
|
||||||
|
|
||||||
See the SDK's [configuration guide][config_guide] for more information.
|
|
||||||
|
|
||||||
See the [session][session_pkg] package documentation for more information on how to use Session
|
|
||||||
with the SDK.
|
|
||||||
|
|
||||||
See the [Config][config_typ] type in the [aws][aws_pkg] package for more information on configuration
|
|
||||||
options.
|
|
||||||
|
|
||||||
[config_guide]: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html
|
|
||||||
[session_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/session/
|
|
||||||
[config_typ]: https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
|
||||||
[aws_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/
|
|
||||||
|
|
||||||
### Configuring Credentials
|
|
||||||
|
|
||||||
When using the SDK you'll generally need your AWS credentials to authenticate
|
|
||||||
with AWS services. The SDK supports multiple methods of supporting these
|
|
||||||
credentials. By default the SDK will source credentials automatically from
|
|
||||||
its default credential chain. See the session package for more information
|
|
||||||
on this chain, and how to configure it. The common items in the credential
|
|
||||||
chain are the following:
|
|
||||||
|
|
||||||
* Environment Credentials - Set of environment variables that are useful
|
|
||||||
when sub processes are created for specific roles.
|
|
||||||
|
|
||||||
* Shared Credentials file (~/.aws/credentials) - This file stores your
|
|
||||||
credentials based on a profile name and is useful for local development.
|
|
||||||
|
|
||||||
* EC2 Instance Role Credentials - Use EC2 Instance Role to assign credentials
|
|
||||||
to application running on an EC2 instance. This removes the need to manage
|
|
||||||
credential files in production.
|
|
||||||
|
|
||||||
Credentials can be configured in code as well by setting the Config's Credentials
|
|
||||||
value to a custom provider or using one of the providers included with the
|
|
||||||
SDK to bypass the default credential chain and use a custom one. This is
|
|
||||||
helpful when you want to instruct the SDK to only use a specific set of
|
|
||||||
credentials or providers.
|
|
||||||
|
|
||||||
This example creates a credential provider for assuming an IAM role, "myRoleARN"
|
|
||||||
and configures the S3 service client to use that role for API requests.
|
|
||||||
|
|
||||||
```go
|
|
||||||
// Initial credentials loaded from SDK's default credential chain. Such as
|
|
||||||
// the environment, shared credentials (~/.aws/credentials), or EC2 Instance
|
|
||||||
// Role. These credentials will be used to to make the STS Assume Role API.
|
|
||||||
sess := session.Must(session.NewSession())
|
|
||||||
|
|
||||||
// Create the credentials from AssumeRoleProvider to assume the role
|
|
||||||
// referenced by the "myRoleARN" ARN.
|
|
||||||
creds := stscreds.NewCredentials(sess, "myRoleArn")
|
|
||||||
|
|
||||||
// Create service client value configured for credentials
|
|
||||||
// from assumed role.
|
|
||||||
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
|
||||||
```
|
|
||||||
|
|
||||||
See the [credentials][credentials_pkg] package documentation for more information on credential
|
|
||||||
providers included with the SDK, and how to customize the SDK's usage of
|
|
||||||
credentials.
|
|
||||||
|
|
||||||
The SDK has support for the shared configuration file (~/.aws/config). This
|
|
||||||
support can be enabled by setting the environment variable, "AWS_SDK_LOAD_CONFIG=1",
|
|
||||||
or enabling the feature in code when creating a Session via the
|
|
||||||
Option's SharedConfigState parameter.
|
|
||||||
|
|
||||||
```go
|
|
||||||
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
|
||||||
SharedConfigState: session.SharedConfigEnable,
|
|
||||||
}))
|
|
||||||
```
|
|
||||||
|
|
||||||
[credentials_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials
|
|
||||||
|
|
||||||
### Configuring AWS Region
|
|
||||||
|
|
||||||
In addition to the credentials you'll need to specify the region the SDK
|
|
||||||
will use to make AWS API requests to. In the SDK you can specify the region
|
|
||||||
either with an environment variable, or directly in code when a Session or
|
|
||||||
service client is created. The last value specified in code wins if the region
|
|
||||||
is specified multiple ways.
|
|
||||||
|
|
||||||
To set the region via the environment variable set the "AWS_REGION" to the
|
|
||||||
region you want to the SDK to use. Using this method to set the region will
|
|
||||||
allow you to run your application in multiple regions without needing additional
|
|
||||||
code in the application to select the region.
|
|
||||||
|
|
||||||
AWS_REGION=us-west-2
|
|
||||||
|
|
||||||
The endpoints package includes constants for all regions the SDK knows. The
|
|
||||||
values are all suffixed with RegionID. These values are helpful, because they
|
|
||||||
reduce the need to type the region string manually.
|
|
||||||
|
|
||||||
To set the region on a Session use the aws package's Config struct parameter
|
|
||||||
Region to the AWS region you want the service clients created from the session to
|
|
||||||
use. This is helpful when you want to create multiple service clients, and
|
|
||||||
all of the clients make API requests to the same region.
|
|
||||||
|
|
||||||
```go
|
|
||||||
sess := session.Must(session.NewSession(&aws.Config{
|
|
||||||
Region: aws.String(endpoints.UsWest2RegionID),
|
|
||||||
}))
|
|
||||||
```
|
|
||||||
|
|
||||||
See the [endpoints][endpoints_pkg] package for the AWS Regions and Endpoints metadata.
|
|
||||||
|
|
||||||
In addition to setting the region when creating a Session you can also set
|
|
||||||
the region on a per service client bases. This overrides the region of a
|
|
||||||
Session. This is helpful when you want to create service clients in specific
|
|
||||||
regions different from the Session's region.
|
|
||||||
|
|
||||||
```go
|
|
||||||
svc := s3.New(sess, &aws.Config{
|
|
||||||
Region: aws.String(endpoints.UsWest2RegionID),
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
See the [Config][config_typ] type in the [aws][aws_pkg] package for more information and additional
|
|
||||||
options such as setting the Endpoint, and other service client configuration options.
|
|
||||||
|
|
||||||
[endpoints_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/
|
|
||||||
|
|
||||||
## Making API Requests
|
|
||||||
|
|
||||||
Once the client is created you can make an API request to the service.
|
|
||||||
Each API method takes a input parameter, and returns the service response
|
|
||||||
and an error. The SDK provides methods for making the API call in multiple ways.
|
|
||||||
|
|
||||||
In this list we'll use the S3 ListObjects API as an example for the different
|
|
||||||
ways of making API requests.
|
|
||||||
|
|
||||||
* ListObjects - Base API operation that will make the API request to the service.
|
|
||||||
|
|
||||||
* ListObjectsRequest - API methods suffixed with Request will construct the
|
|
||||||
API request, but not send it. This is also helpful when you want to get a
|
|
||||||
presigned URL for a request, and share the presigned URL instead of your
|
|
||||||
application making the request directly.
|
|
||||||
|
|
||||||
* ListObjectsPages - Same as the base API operation, but uses a callback to
|
|
||||||
automatically handle pagination of the API's response.
|
|
||||||
|
|
||||||
* ListObjectsWithContext - Same as base API operation, but adds support for
|
|
||||||
the Context pattern. This is helpful for controlling the canceling of in
|
|
||||||
flight requests. See the Go standard library context package for more
|
|
||||||
information. This method also takes request package's Option functional
|
|
||||||
options as the variadic argument for modifying how the request will be
|
|
||||||
made, or extracting information from the raw HTTP response.
|
|
||||||
|
|
||||||
* ListObjectsPagesWithContext - same as ListObjectsPages, but adds support for
|
|
||||||
the Context pattern. Similar to ListObjectsWithContext this method also
|
|
||||||
takes the request package's Option function option types as the variadic
|
|
||||||
argument.
|
|
||||||
|
|
||||||
In addition to the API operations the SDK also includes several higher level
|
|
||||||
methods that abstract checking for and waiting for an AWS resource to be in
|
|
||||||
a desired state. In this list we'll use WaitUntilBucketExists to demonstrate
|
|
||||||
the different forms of waiters.
|
|
||||||
|
|
||||||
* WaitUntilBucketExists. - Method to make API request to query an AWS service for
|
|
||||||
a resource's state. Will return successfully when that state is accomplished.
|
|
||||||
|
|
||||||
* WaitUntilBucketExistsWithContext - Same as WaitUntilBucketExists, but adds
|
|
||||||
support for the Context pattern. In addition these methods take request
|
|
||||||
package's WaiterOptions to configure the waiter, and how underlying request
|
|
||||||
will be made by the SDK.
|
|
||||||
|
|
||||||
The API method will document which error codes the service might return for
|
|
||||||
the operation. These errors will also be available as const strings prefixed
|
|
||||||
with "ErrCode" in the service client's package. If there are no errors listed
|
|
||||||
in the API's SDK documentation you'll need to consult the AWS service's API
|
|
||||||
documentation for the errors that could be returned.
|
|
||||||
|
|
||||||
```go
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
result, err := svc.GetObjectWithContext(ctx, &s3.GetObjectInput{
|
|
||||||
Bucket: aws.String("my-bucket"),
|
|
||||||
Key: aws.String("my-key"),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
// Cast err to awserr.Error to handle specific error codes.
|
|
||||||
aerr, ok := err.(awserr.Error)
|
|
||||||
if ok && aerr.Code() == s3.ErrCodeNoSuchKey {
|
|
||||||
// Specific error code handling
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure to close the body when done with it for S3 GetObject APIs or
|
|
||||||
// will leak connections.
|
|
||||||
defer result.Body.Close()
|
|
||||||
|
|
||||||
fmt.Println("Object Size:", aws.Int64Value(result.ContentLength))
|
|
||||||
```
|
|
||||||
|
|
||||||
### API Request Pagination and Resource Waiters
|
|
||||||
|
|
||||||
Pagination helper methods are suffixed with "Pages", and provide the
|
|
||||||
functionality needed to round trip API page requests. Pagination methods
|
|
||||||
take a callback function that will be called for each page of the API's response.
|
|
||||||
|
|
||||||
```go
|
|
||||||
objects := []string{}
|
|
||||||
err := svc.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{
|
|
||||||
Bucket: aws.String(myBucket),
|
|
||||||
}, func(p *s3.ListObjectsOutput, lastPage bool) bool {
|
|
||||||
for _, o := range p.Contents {
|
|
||||||
objects = append(objects, aws.StringValue(o.Key))
|
|
||||||
}
|
|
||||||
return true // continue paging
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
panic(fmt.Sprintf("failed to list objects for bucket, %s, %v", myBucket, err))
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println("Objects in bucket:", objects)
|
|
||||||
```
|
|
||||||
|
|
||||||
Waiter helper methods provide the functionality to wait for an AWS resource
|
|
||||||
state. These methods abstract the logic needed to check the state of an
|
|
||||||
AWS resource, and wait until that resource is in a desired state. The waiter
|
|
||||||
will block until the resource is in the state that is desired, an error occurs,
|
|
||||||
or the waiter times out. If a resource times out the error code returned will
|
|
||||||
be request.WaiterResourceNotReadyErrorCode.
|
|
||||||
|
|
||||||
```go
|
|
||||||
err := svc.WaitUntilBucketExistsWithContext(ctx, &s3.HeadBucketInput{
|
|
||||||
Bucket: aws.String(myBucket),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
aerr, ok := err.(awserr.Error)
|
|
||||||
if ok && aerr.Code() == request.WaiterResourceNotReadyErrorCode {
|
|
||||||
fmt.Fprintf(os.Stderr, "timed out while waiting for bucket to exist")
|
|
||||||
}
|
|
||||||
panic(fmt.Errorf("failed to wait for bucket to exist, %v", err))
|
|
||||||
}
|
|
||||||
fmt.Println("Bucket", myBucket, "exists")
|
|
||||||
```
|
|
||||||
|
|
||||||
## Complete SDK Example
|
|
||||||
|
|
||||||
This example shows a complete working Go file which will upload a file to S3
|
|
||||||
and use the Context pattern to implement timeout logic that will cancel the
|
|
||||||
request if it takes too long. This example highlights how to use sessions,
|
|
||||||
create a service client, make a request, handle the error, and process the
|
|
||||||
response.
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/session"
|
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Uploads a file to S3 given a bucket and object key. Also takes a duration
|
|
||||||
// value to terminate the update if it doesn't complete within that time.
|
|
||||||
//
|
|
||||||
// The AWS Region needs to be provided in the AWS shared config or on the
|
|
||||||
// environment variable as `AWS_REGION`. Credentials also must be provided
|
|
||||||
// Will default to shared config file, but can load from environment if provided.
|
|
||||||
//
|
|
||||||
// Usage:
|
|
||||||
// # Upload myfile.txt to myBucket/myKey. Must complete within 10 minutes or will fail
|
|
||||||
// go run withContext.go -b mybucket -k myKey -d 10m < myfile.txt
|
|
||||||
func main() {
|
|
||||||
var bucket, key string
|
|
||||||
var timeout time.Duration
|
|
||||||
|
|
||||||
flag.StringVar(&bucket, "b", "", "Bucket name.")
|
|
||||||
flag.StringVar(&key, "k", "", "Object key name.")
|
|
||||||
flag.DurationVar(&timeout, "d", 0, "Upload timeout.")
|
|
||||||
flag.Parse()
|
|
||||||
|
|
||||||
// All clients require a Session. The Session provides the client with
|
|
||||||
// shared configuration such as region, endpoint, and credentials. A
|
|
||||||
// Session should be shared where possible to take advantage of
|
|
||||||
// configuration and credential caching. See the session package for
|
|
||||||
// more information.
|
|
||||||
sess := session.Must(session.NewSession())
|
|
||||||
|
|
||||||
// Create a new instance of the service's client with a Session.
|
|
||||||
// Optional aws.Config values can also be provided as variadic arguments
|
|
||||||
// to the New function. This option allows you to provide service
|
|
||||||
// specific configuration.
|
|
||||||
svc := s3.New(sess)
|
|
||||||
|
|
||||||
// Create a context with a timeout that will abort the upload if it takes
|
|
||||||
// more than the passed in timeout.
|
|
||||||
ctx := context.Background()
|
|
||||||
var cancelFn func()
|
|
||||||
if timeout > 0 {
|
|
||||||
ctx, cancelFn = context.WithTimeout(ctx, timeout)
|
|
||||||
}
|
|
||||||
// Ensure the context is canceled to prevent leaking.
|
|
||||||
// See context package for more information, https://golang.org/pkg/context/
|
|
||||||
defer cancelFn()
|
|
||||||
|
|
||||||
// Uploads the object to S3. The Context will interrupt the request if the
|
|
||||||
// timeout expires.
|
|
||||||
_, err := svc.PutObjectWithContext(ctx, &s3.PutObjectInput{
|
|
||||||
Bucket: aws.String(bucket),
|
|
||||||
Key: aws.String(key),
|
|
||||||
Body: os.Stdin,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
if aerr, ok := err.(awserr.Error); ok && aerr.Code() == request.CanceledErrorCode {
|
|
||||||
// If the SDK can determine the request or retry delay was canceled
|
|
||||||
// by a context the CanceledErrorCode error code will be returned.
|
|
||||||
fmt.Fprintf(os.Stderr, "upload canceled due to timeout, %v\n", err)
|
|
||||||
} else {
|
|
||||||
fmt.Fprintf(os.Stderr, "failed to upload object, %v\n", err)
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("successfully uploaded file to %s/%s\n", bucket, key)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This SDK is distributed under the
|
|
||||||
[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0),
|
|
||||||
see LICENSE.txt and NOTICE.txt for more information.
|
|
12
vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini
generated
vendored
Normal file
12
vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
[default]
|
||||||
|
aws_access_key_id = accessKey
|
||||||
|
aws_secret_access_key = secret
|
||||||
|
aws_session_token = token
|
||||||
|
|
||||||
|
[no_token]
|
||||||
|
aws_access_key_id = accessKey
|
||||||
|
aws_secret_access_key = secret
|
||||||
|
|
||||||
|
[with_colon]
|
||||||
|
aws_access_key_id: accessKey
|
||||||
|
aws_secret_access_key: secret
|
6
vendor/github.com/aws/aws-sdk-go/go.mod
generated
vendored
6
vendor/github.com/aws/aws-sdk-go/go.mod
generated
vendored
|
@ -1,6 +0,0 @@
|
||||||
module github.com/aws/aws-sdk-go
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/go-ini/ini v1.25.4
|
|
||||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8
|
|
||||||
)
|
|
4
vendor/github.com/aws/aws-sdk-go/private/README.md
generated
vendored
4
vendor/github.com/aws/aws-sdk-go/private/README.md
generated
vendored
|
@ -1,4 +0,0 @@
|
||||||
## AWS SDK for Go Private packages ##
|
|
||||||
`private` is a collection of packages used internally by the SDK, and is subject to have breaking changes. This package is not `internal` so that if you really need to use its functionality, and understand breaking changes will be made, you are able to.
|
|
||||||
|
|
||||||
These packages will be refactored in the future so that the API generator and model parsers are exposed cleanly on their own. Making it easier for you to generate your own code based on the API models.
|
|
31
vendor/github.com/beorn7/perks/README.md
generated
vendored
31
vendor/github.com/beorn7/perks/README.md
generated
vendored
|
@ -1,31 +0,0 @@
|
||||||
# Perks for Go (golang.org)
|
|
||||||
|
|
||||||
Perks contains the Go package quantile that computes approximate quantiles over
|
|
||||||
an unbounded data stream within low memory and CPU bounds.
|
|
||||||
|
|
||||||
For more information and examples, see:
|
|
||||||
http://godoc.org/github.com/bmizerany/perks
|
|
||||||
|
|
||||||
A very special thank you and shout out to Graham Cormode (Rutgers University),
|
|
||||||
Flip Korn (AT&T Labs–Research), S. Muthukrishnan (Rutgers University), and
|
|
||||||
Divesh Srivastava (AT&T Labs–Research) for their research and publication of
|
|
||||||
[Effective Computation of Biased Quantiles over Data Streams](http://www.cs.rutgers.edu/~muthu/bquant.pdf)
|
|
||||||
|
|
||||||
Thank you, also:
|
|
||||||
* Armon Dadgar (@armon)
|
|
||||||
* Andrew Gerrand (@nf)
|
|
||||||
* Brad Fitzpatrick (@bradfitz)
|
|
||||||
* Keith Rarick (@kr)
|
|
||||||
|
|
||||||
FAQ:
|
|
||||||
|
|
||||||
Q: Why not move the quantile package into the project root?
|
|
||||||
A: I want to add more packages to perks later.
|
|
||||||
|
|
||||||
Copyright (C) 2013 Blake Mizerany
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
2388
vendor/github.com/beorn7/perks/quantile/exampledata.txt
generated
vendored
Normal file
2388
vendor/github.com/beorn7/perks/quantile/exampledata.txt
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
26
vendor/github.com/bshuster-repo/logrus-logstash-hook/.gitignore
generated
vendored
Normal file
26
vendor/github.com/bshuster-repo/logrus-logstash-hook/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
*.test
|
||||||
|
*.prof
|
||||||
|
*.iml
|
19
vendor/github.com/bshuster-repo/logrus-logstash-hook/.travis.yml
generated
vendored
Normal file
19
vendor/github.com/bshuster-repo/logrus-logstash-hook/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
language: go
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- go: 1.3
|
||||||
|
- go: 1.4
|
||||||
|
- go: 1.5
|
||||||
|
- go: 1.6
|
||||||
|
- go: tip
|
||||||
|
|
||||||
|
install:
|
||||||
|
- # Skip
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go get -t -v ./...
|
||||||
|
- diff -u <(echo -n) <(gofmt -d .)
|
||||||
|
- go tool vet .
|
||||||
|
- go test -v -race ./...
|
18
vendor/github.com/bshuster-repo/logrus-logstash-hook/CHANGELOG.md
generated
vendored
Normal file
18
vendor/github.com/bshuster-repo/logrus-logstash-hook/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 0.4
|
||||||
|
|
||||||
|
* Update the name of the package from `logrus_logstash` to `logrustash`
|
||||||
|
* Add TimeFormat to Hook
|
||||||
|
* Replace the old logrus package path: `github.com/Sirupsen/logrus` with `github.com/sirupsen/logrus`
|
||||||
|
|
||||||
|
## 0.3
|
||||||
|
|
||||||
|
* Fix the Logstash format to set `@version` to `"1"`
|
||||||
|
* Add unit-tests to logstash.go
|
||||||
|
* Remove the assert package
|
||||||
|
* Add prefix filtering
|
||||||
|
|
||||||
|
## Before that (major changes)
|
||||||
|
|
||||||
|
* Update LICENSE to MIT from GPL
|
13
vendor/github.com/bugsnag/bugsnag-go/.travis.yml
generated
vendored
Normal file
13
vendor/github.com/bugsnag/bugsnag-go/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.1
|
||||||
|
- 1.2
|
||||||
|
- 1.3
|
||||||
|
- tip
|
||||||
|
|
||||||
|
install:
|
||||||
|
- go get github.com/bugsnag/panicwrap
|
||||||
|
- go get github.com/bugsnag/osext
|
||||||
|
- go get github.com/bitly/go-simplejson
|
||||||
|
- go get github.com/revel/revel
|
181
vendor/github.com/denverdino/aliyungo/README.md
generated
vendored
181
vendor/github.com/denverdino/aliyungo/README.md
generated
vendored
|
@ -1,181 +0,0 @@
|
||||||
# AliyunGo: Go SDK for Aliyun Services
|
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/denverdino/aliyungo.svg?branch=master)](https://travis-ci.org/denverdino/aliyungo) [![CircleCI](https://circleci.com/gh/denverdino/aliyungo.svg?style=svg)](https://circleci.com/gh/denverdino/aliyungo) [![Go Report Card](https://goreportcard.com/badge/github.com/denverdino/aliyungo)](https://goreportcard.com/report/github.com/denverdino/aliyungo)
|
|
||||||
|
|
||||||
This is an unofficial Go SDK for Aliyun services. You are welcome for contribution.
|
|
||||||
|
|
||||||
The official SDK for Aliyun services is published. Please visit https://github.com/aliyun/alibaba-cloud-sdk-go for details
|
|
||||||
|
|
||||||
## Package Structure
|
|
||||||
|
|
||||||
* cdn: [Content Delivery Network](https://help.aliyun.com/document_detail/27101.html)
|
|
||||||
* cms: [Cloud Monitor Service](https://help.aliyun.com/document_detail/28615.html)
|
|
||||||
* cs: [Container Service](https://help.aliyun.com/product/25972.html)
|
|
||||||
* dm: [Direct Mail](https://help.aliyun.com/document_detail/29414.html)
|
|
||||||
* dns: [DNS](https://help.aliyun.com/document_detail/dns/api-reference/summary.html)
|
|
||||||
* ecs: [Elastic Compute Service](https://help.aliyun.com/document_detail/ecs/open-api/summary.html)
|
|
||||||
* ess: [Auto Scaling](https://help.aliyun.com/document_detail/25857.html)
|
|
||||||
* mns: [Message Service](https://help.aliyun.com/document_detail/27414.html)
|
|
||||||
* mq: [Message Queue](https://help.aliyun.com/document_detail/29532.html)
|
|
||||||
* nas: [Network Attached Storage](https://help.aliyun.com/document_detail/27518.html)
|
|
||||||
* opensearch: [OpenSearch](https://help.aliyun.com/document_detail/29118.html)
|
|
||||||
* oss: [Open Storage Service](https://help.aliyun.com/document_detail/oss/api-reference/abstract.html)
|
|
||||||
* push: [Cloud Mobile Push](https://help.aliyun.com/document_detail/30049.html)
|
|
||||||
* rds: [Relational Database Service](https://help.aliyun.com/document_detail/26226.html)
|
|
||||||
* ram: [Resource Access Management](https://help.aliyun.com/document_detail/ram/ram-api-reference/intro/intro.html)
|
|
||||||
* slb: [Server Load Balancer](https://help.aliyun.com/document_detail/slb/api-reference/brief-introduction.html)
|
|
||||||
* sls: [Logging Service](https://help.aliyun.com/document_detail/sls/api/overview.html)
|
|
||||||
* sms: [Short Message Service](https://help.aliyun.com/product/44282.html)
|
|
||||||
* sts: [Security Token Service](https://help.aliyun.com/document_detail/28756.html)
|
|
||||||
* common: Common libary of Aliyun Go SDK
|
|
||||||
* util: Utility helpers
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/denverdino/aliyungo/ecs"
|
|
||||||
)
|
|
||||||
|
|
||||||
const ACCESS_KEY_ID = "<YOUR_ID>"
|
|
||||||
const ACCESS_KEY_SECRET = "<****>"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
client := ecs.NewClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET)
|
|
||||||
fmt.Print(client.DescribeRegions())
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
* CDN: [https://godoc.org/github.com/denverdino/aliyungo/cdn](https://godoc.org/github.com/denverdino/aliyungo/cdn)[![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/cdn?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/cdn)
|
|
||||||
* CMS: [https://godoc.org/github.com/denverdino/aliyungo/cms](https://godoc.org/github.com/denverdino/aliyungo/cms) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/cms?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/cms)
|
|
||||||
* CS: [https://godoc.org/github.com/denverdino/aliyungo/cs](https://godoc.org/github.com/denverdino/aliyungo/cs) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/cs?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/cs)
|
|
||||||
* DM: [https://godoc.org/github.com/denverdino/aliyungo/dm](https://godoc.org/github.com/denverdino/aliyungo/dm) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/dm?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/dm)
|
|
||||||
* DNS: [https://godoc.org/github.com/denverdino/aliyungo/dns](https://godoc.org/github.com/denverdino/aliyungo/dns) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/dns?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/dns)
|
|
||||||
* ECS: [https://godoc.org/github.com/denverdino/aliyungo/ecs](https://godoc.org/github.com/denverdino/aliyungo/ecs) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/ecs?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/ecs)
|
|
||||||
* ESS: [https://godoc.org/github.com/denverdino/aliyungo/ess](https://godoc.org/github.com/denverdino/aliyungo/ess)[![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/ess?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/ess)
|
|
||||||
* MNS: [https://godoc.org/github.com/denverdino/aliyungo/mns](https://godoc.org/github.com/denverdino/aliyungo/mns)[![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/mns?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/mns)
|
|
||||||
* MQ: [https://godoc.org/github.com/denverdino/aliyungo/mq](https://godoc.org/github.com/denverdino/aliyungo/mq) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/mq?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/mq)
|
|
||||||
* NAS: [https://godoc.org/github.com/denverdino/aliyungo/nas](https://godoc.org/github.com/denverdino/aliyungo/nas) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/nas?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/nas)
|
|
||||||
* OPENSEARCH: [https://godoc.org/github.com/denverdino/aliyungo/opensearch](https://godoc.org/github.com/denverdino/aliyungo/opensearch) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/opensearch?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/opensearch)
|
|
||||||
* OSS: [https://godoc.org/github.com/denverdino/aliyungo/oss](https://godoc.org/github.com/denverdino/aliyungo/oss) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/oss?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/oss)
|
|
||||||
* PUSH: [https://godoc.org/github.com/denverdino/aliyungo/push](https://godoc.org/github.com/denverdino/aliyungo/push) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/push?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/push)
|
|
||||||
* RAM: [https://godoc.org/github.com/denverdino/aliyungo/ram](https://godoc.org/github.com/denverdino/aliyungo/ram) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/ram?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/ram)
|
|
||||||
* RDS: [https://godoc.org/github.com/denverdino/aliyungo/rds](https://godoc.org/github.com/denverdino/aliyungo/rds) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/rds?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/rds)
|
|
||||||
* SLB: [https://godoc.org/github.com/denverdino/aliyungo/slb](https://godoc.org/github.com/denverdino/aliyungo/slb) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/slb?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/slb)
|
|
||||||
* SLS: [https://godoc.org/github.com/denverdino/aliyungo/sls](https://godoc.org/github.com/denverdino/aliyungo/sls) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/sls?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/sls)
|
|
||||||
* SMS: [https://godoc.org/github.com/denverdino/aliyungo/sms](https://godoc.org/github.com/denverdino/aliyungo/sms) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/sms?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/sms)
|
|
||||||
* STS: [https://godoc.org/github.com/denverdino/aliyungo/sts](https://godoc.org/github.com/denverdino/aliyungo/sts) [![GoDoc](https://godoc.org/github.com/denverdino/aliyungo/sts?status.svg)](https://godoc.org/github.com/denverdino/aliyungo/sts)
|
|
||||||
|
|
||||||
## Build and Install
|
|
||||||
|
|
||||||
go get:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
go get github.com/denverdino/aliyungo
|
|
||||||
```
|
|
||||||
|
|
||||||
## Test ECS
|
|
||||||
|
|
||||||
Modify "ecs/config_test.go"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
TestAccessKeyId = "MY_ACCESS_KEY_ID"
|
|
||||||
TestAccessKeySecret = "MY_ACCESS_KEY_ID"
|
|
||||||
TestInstanceId = "MY_INSTANCE_ID"
|
|
||||||
TestIAmRich = false
|
|
||||||
```
|
|
||||||
|
|
||||||
* TestAccessKeyId: the Access Key Id
|
|
||||||
* TestAccessKeySecret: the Access Key Secret.
|
|
||||||
* TestInstanceId: the existing instance id for testing. It will be stopped and restarted during testing.
|
|
||||||
* TestIAmRich(Optional): If it is set to true, it will perform tests to create virtual machines and disks under your account. And you will pay the bill. :-)
|
|
||||||
|
|
||||||
Under "ecs" and run
|
|
||||||
|
|
||||||
```sh
|
|
||||||
go test
|
|
||||||
```
|
|
||||||
|
|
||||||
## Test OSS
|
|
||||||
|
|
||||||
Modify "oss/config_test.go"
|
|
||||||
|
|
||||||
```sh
|
|
||||||
TestAccessKeyId = "MY_ACCESS_KEY_ID"
|
|
||||||
TestAccessKeySecret = "MY_ACCESS_KEY_ID"
|
|
||||||
TestRegion = oss.Beijing
|
|
||||||
TestBucket = "denverdino"
|
|
||||||
```
|
|
||||||
|
|
||||||
* TestAccessKeyId: the Access Key Id
|
|
||||||
* TestAccessKeySecret: the Access Key Secret.
|
|
||||||
* TestRegion: the region of OSS for testing
|
|
||||||
* TestBucket: the bucket name for testing
|
|
||||||
|
|
||||||
Under "oss" and run
|
|
||||||
|
|
||||||
```sh
|
|
||||||
go test
|
|
||||||
```
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
* Li Yi (denverdino@gmail.com)
|
|
||||||
* Boshi Lian (farmer1992@gmail.com)
|
|
||||||
* Yu Zhou (oscarrr110@gmail.com)
|
|
||||||
* Yufei Zhang
|
|
||||||
* linuxlikerqq
|
|
||||||
* Changhai Yan
|
|
||||||
* Jizhong Jiang (jiangjizhong@gmail.com)
|
|
||||||
* Kent Wang (pragkent@gmail.com)
|
|
||||||
* ringtail
|
|
||||||
* aiden0z (aiden0xz@gmail.com)
|
|
||||||
* jimmycmh
|
|
||||||
* menglingwei
|
|
||||||
* mingang.he (dustgle@gmail.com)
|
|
||||||
* Young Chen (chainone@gmail.com)
|
|
||||||
* johnzeng
|
|
||||||
* spacexnice (445436286@qq.com)
|
|
||||||
* xiaoheihero
|
|
||||||
* hmgle (dustgle@gmail.com)
|
|
||||||
* jzwlqx (jiangjizhong@gmail.com)
|
|
||||||
* Linhua Tan (toolchainX@gmail.com)
|
|
||||||
* Plutonist (p@vecsight.com)
|
|
||||||
* Bin Liu
|
|
||||||
* wangyue
|
|
||||||
* demonwy
|
|
||||||
* yarous224
|
|
||||||
* yufeizyf (xazyf9111@sina.cn)
|
|
||||||
* keontang (ikeontang@gmail.com)
|
|
||||||
* Cholerae Hu (me@cholerae.com)
|
|
||||||
* Zach Bergh (berghzach@gmail.com)
|
|
||||||
* Bingshen Wang
|
|
||||||
* xiaozhu36
|
|
||||||
* Russell (yufeiwu@gmail.com)
|
|
||||||
* zhuzhih2017
|
|
||||||
* cheyang
|
|
||||||
* Hobo Chen
|
|
||||||
* Shuwei Yin
|
|
||||||
* Xujin Zheng (xujinzheng@gmail.com)
|
|
||||||
* Dino Lai (dinos80152@gmail.com)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
This project is licensed under the Apache License, Version 2.0. See [LICENSE](https://github.com/denverdino/aliyungo/blob/master/LICENSE.txt) for the full license text.
|
|
||||||
|
|
||||||
## Related projects
|
|
||||||
|
|
||||||
* Aliyun ECS driver for Docker Machine: [Pull request](https://github.com/docker/machine/pull/1182)
|
|
||||||
|
|
||||||
* Aliyun OSS driver for Docker Registry V2: [Pull request](https://github.com/docker/distribution/pull/514)
|
|
||||||
|
|
||||||
## References
|
|
||||||
|
|
||||||
The GO API design of OSS refer the implementation from [https://github.com/AdRoll/goamz](https://github.com/AdRoll)
|
|
1370
vendor/github.com/denverdino/aliyungo/common/endpoints.xml
generated
vendored
Normal file
1370
vendor/github.com/denverdino/aliyungo/common/endpoints.xml
generated
vendored
Normal file
File diff suppressed because it is too large
Load diff
4
vendor/github.com/dgrijalva/jwt-go/.gitignore
generated
vendored
Normal file
4
vendor/github.com/dgrijalva/jwt-go/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
.DS_Store
|
||||||
|
bin
|
||||||
|
|
||||||
|
|
13
vendor/github.com/dgrijalva/jwt-go/.travis.yml
generated
vendored
Normal file
13
vendor/github.com/dgrijalva/jwt-go/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
language: go
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go vet ./...
|
||||||
|
- go test -v ./...
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.3
|
||||||
|
- 1.4
|
||||||
|
- 1.5
|
||||||
|
- 1.6
|
||||||
|
- 1.7
|
||||||
|
- tip
|
97
vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md
generated
vendored
Normal file
97
vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md
generated
vendored
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
## Migration Guide from v2 -> v3
|
||||||
|
|
||||||
|
Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code.
|
||||||
|
|
||||||
|
### `Token.Claims` is now an interface type
|
||||||
|
|
||||||
|
The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`.
|
||||||
|
|
||||||
|
`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property.
|
||||||
|
|
||||||
|
The old example for parsing a token looked like this..
|
||||||
|
|
||||||
|
```go
|
||||||
|
if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil {
|
||||||
|
fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"])
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
is now directly mapped to...
|
||||||
|
|
||||||
|
```go
|
||||||
|
if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil {
|
||||||
|
claims := token.Claims.(jwt.MapClaims)
|
||||||
|
fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"])
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type MyCustomClaims struct {
|
||||||
|
User string
|
||||||
|
*StandardClaims
|
||||||
|
}
|
||||||
|
|
||||||
|
if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil {
|
||||||
|
claims := token.Claims.(*MyCustomClaims)
|
||||||
|
fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `ParseFromRequest` has been moved
|
||||||
|
|
||||||
|
To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`.
|
||||||
|
|
||||||
|
`Extractors` do the work of picking the token string out of a request. The interface is simple and composable.
|
||||||
|
|
||||||
|
This simple parsing example:
|
||||||
|
|
||||||
|
```go
|
||||||
|
if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil {
|
||||||
|
fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"])
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
is directly mapped to:
|
||||||
|
|
||||||
|
```go
|
||||||
|
if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil {
|
||||||
|
claims := token.Claims.(jwt.MapClaims)
|
||||||
|
fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"])
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
There are several concrete `Extractor` types provided for your convenience:
|
||||||
|
|
||||||
|
* `HeaderExtractor` will search a list of headers until one contains content.
|
||||||
|
* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content.
|
||||||
|
* `MultiExtractor` will try a list of `Extractors` in order until one returns content.
|
||||||
|
* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token.
|
||||||
|
* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument
|
||||||
|
* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header
|
||||||
|
|
||||||
|
|
||||||
|
### RSA signing methods no longer accept `[]byte` keys
|
||||||
|
|
||||||
|
Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse.
|
||||||
|
|
||||||
|
To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types.
|
||||||
|
|
||||||
|
```go
|
||||||
|
func keyLookupFunc(*Token) (interface{}, error) {
|
||||||
|
// Don't forget to validate the alg is what you expect:
|
||||||
|
if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
|
||||||
|
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Look up key
|
||||||
|
key, err := lookupPublicKey(token.Header["kid"])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unpack key from PEM encoded PKCS8
|
||||||
|
return jwt.ParseRSAPublicKeyFromPEM(key)
|
||||||
|
}
|
||||||
|
```
|
105
vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md
generated
vendored
Normal file
105
vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md
generated
vendored
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
## `jwt-go` Version History
|
||||||
|
|
||||||
|
#### 3.0.0
|
||||||
|
|
||||||
|
* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code
|
||||||
|
* Dropped support for `[]byte` keys when using RSA signing methods. This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods.
|
||||||
|
* `ParseFromRequest` has been moved to `request` subpackage and usage has changed
|
||||||
|
* The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`. The default value is type `MapClaims`, which is an alias to `map[string]interface{}`. This makes it possible to use a custom type when decoding claims.
|
||||||
|
* Other Additions and Changes
|
||||||
|
* Added `Claims` interface type to allow users to decode the claims into a custom type
|
||||||
|
* Added `ParseWithClaims`, which takes a third argument of type `Claims`. Use this function instead of `Parse` if you have a custom type you'd like to decode into.
|
||||||
|
* Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage
|
||||||
|
* Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims`
|
||||||
|
* Added new interface type `Extractor`, which is used for extracting JWT strings from http requests. Used with `ParseFromRequest` and `ParseFromRequestWithClaims`.
|
||||||
|
* Added several new, more specific, validation errors to error type bitmask
|
||||||
|
* Moved examples from README to executable example files
|
||||||
|
* Signing method registry is now thread safe
|
||||||
|
* Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser)
|
||||||
|
|
||||||
|
#### 2.7.0
|
||||||
|
|
||||||
|
This will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes.
|
||||||
|
|
||||||
|
* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying
|
||||||
|
* Error text for expired tokens includes how long it's been expired
|
||||||
|
* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM`
|
||||||
|
* Documentation updates
|
||||||
|
|
||||||
|
#### 2.6.0
|
||||||
|
|
||||||
|
* Exposed inner error within ValidationError
|
||||||
|
* Fixed validation errors when using UseJSONNumber flag
|
||||||
|
* Added several unit tests
|
||||||
|
|
||||||
|
#### 2.5.0
|
||||||
|
|
||||||
|
* Added support for signing method none. You shouldn't use this. The API tries to make this clear.
|
||||||
|
* Updated/fixed some documentation
|
||||||
|
* Added more helpful error message when trying to parse tokens that begin with `BEARER `
|
||||||
|
|
||||||
|
#### 2.4.0
|
||||||
|
|
||||||
|
* Added new type, Parser, to allow for configuration of various parsing parameters
|
||||||
|
* You can now specify a list of valid signing methods. Anything outside this set will be rejected.
|
||||||
|
* You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON
|
||||||
|
* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go)
|
||||||
|
* Fixed some bugs with ECDSA parsing
|
||||||
|
|
||||||
|
#### 2.3.0
|
||||||
|
|
||||||
|
* Added support for ECDSA signing methods
|
||||||
|
* Added support for RSA PSS signing methods (requires go v1.4)
|
||||||
|
|
||||||
|
#### 2.2.0
|
||||||
|
|
||||||
|
* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`. Result will now be the parsed token and an error, instead of a panic.
|
||||||
|
|
||||||
|
#### 2.1.0
|
||||||
|
|
||||||
|
Backwards compatible API change that was missed in 2.0.0.
|
||||||
|
|
||||||
|
* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte`
|
||||||
|
|
||||||
|
#### 2.0.0
|
||||||
|
|
||||||
|
There were two major reasons for breaking backwards compatibility with this update. The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations. There will likely be no required code changes to support this change.
|
||||||
|
|
||||||
|
The second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods. Not all keys used for all signing methods have a single standard on-disk representation. Requiring `[]byte` as the type for all keys proved too limiting. Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys. Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`.
|
||||||
|
|
||||||
|
It is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`.
|
||||||
|
|
||||||
|
* **Compatibility Breaking Changes**
|
||||||
|
* `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct`
|
||||||
|
* `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct`
|
||||||
|
* `KeyFunc` now returns `interface{}` instead of `[]byte`
|
||||||
|
* `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key
|
||||||
|
* `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key
|
||||||
|
* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`. Specific sizes are now just instances of this type.
|
||||||
|
* Added public package global `SigningMethodHS256`
|
||||||
|
* Added public package global `SigningMethodHS384`
|
||||||
|
* Added public package global `SigningMethodHS512`
|
||||||
|
* Renamed type `SigningMethodRS256` to `SigningMethodRSA`. Specific sizes are now just instances of this type.
|
||||||
|
* Added public package global `SigningMethodRS256`
|
||||||
|
* Added public package global `SigningMethodRS384`
|
||||||
|
* Added public package global `SigningMethodRS512`
|
||||||
|
* Moved sample private key for HMAC tests from an inline value to a file on disk. Value is unchanged.
|
||||||
|
* Refactored the RSA implementation to be easier to read
|
||||||
|
* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM`
|
||||||
|
|
||||||
|
#### 1.0.2
|
||||||
|
|
||||||
|
* Fixed bug in parsing public keys from certificates
|
||||||
|
* Added more tests around the parsing of keys for RS256
|
||||||
|
* Code refactoring in RS256 implementation. No functional changes
|
||||||
|
|
||||||
|
#### 1.0.1
|
||||||
|
|
||||||
|
* Fixed panic if RS256 signing method was passed an invalid key
|
||||||
|
|
||||||
|
#### 1.0.0
|
||||||
|
|
||||||
|
* First versioned release
|
||||||
|
* API stabilized
|
||||||
|
* Supports creating, signing, parsing, and validating JWT tokens
|
||||||
|
* Supports RS256 and HS256 signing methods
|
55
vendor/github.com/docker/go-metrics/CONTRIBUTING.md
generated
vendored
Normal file
55
vendor/github.com/docker/go-metrics/CONTRIBUTING.md
generated
vendored
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
## Sign your work
|
||||||
|
|
||||||
|
The sign-off is a simple line at the end of the explanation for the patch. Your
|
||||||
|
signature certifies that you wrote the patch or otherwise have the right to pass
|
||||||
|
it on as an open-source patch. The rules are pretty simple: if you can certify
|
||||||
|
the below (from [developercertificate.org](http://developercertificate.org/)):
|
||||||
|
|
||||||
|
```
|
||||||
|
Developer Certificate of Origin
|
||||||
|
Version 1.1
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||||
|
660 York Street, Suite 102,
|
||||||
|
San Francisco, CA 94110 USA
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Developer's Certificate of Origin 1.1
|
||||||
|
|
||||||
|
By making a contribution to this project, I certify that:
|
||||||
|
|
||||||
|
(a) The contribution was created in whole or in part by me and I
|
||||||
|
have the right to submit it under the open source license
|
||||||
|
indicated in the file; or
|
||||||
|
|
||||||
|
(b) The contribution is based upon previous work that, to the best
|
||||||
|
of my knowledge, is covered under an appropriate open source
|
||||||
|
license and I have the right under that license to submit that
|
||||||
|
work with modifications, whether created in whole or in part
|
||||||
|
by me, under the same open source license (unless I am
|
||||||
|
permitted to submit under a different license), as indicated
|
||||||
|
in the file; or
|
||||||
|
|
||||||
|
(c) The contribution was provided directly to me by some other
|
||||||
|
person who certified (a), (b) or (c) and I have not modified
|
||||||
|
it.
|
||||||
|
|
||||||
|
(d) I understand and agree that this project and the contribution
|
||||||
|
are public and that a record of the contribution (including all
|
||||||
|
personal information I submit with it, including my sign-off) is
|
||||||
|
maintained indefinitely and may be redistributed consistent with
|
||||||
|
this project or the open source license(s) involved.
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you just add a line to every git commit message:
|
||||||
|
|
||||||
|
Signed-off-by: Joe Smith <joe.smith@email.com>
|
||||||
|
|
||||||
|
Use your real name (sorry, no pseudonyms or anonymous contributions.)
|
||||||
|
|
||||||
|
If you set your `user.name` and `user.email` git configs, you can sign your
|
||||||
|
commit automatically with `git commit -s`.
|
13
vendor/github.com/docker/libtrust/CONTRIBUTING.md
generated
vendored
Normal file
13
vendor/github.com/docker/libtrust/CONTRIBUTING.md
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Contributing to libtrust
|
||||||
|
|
||||||
|
Want to hack on libtrust? Awesome! Here are instructions to get you
|
||||||
|
started.
|
||||||
|
|
||||||
|
libtrust is a part of the [Docker](https://www.docker.com) project, and follows
|
||||||
|
the same rules and principles. If you're already familiar with the way
|
||||||
|
Docker does things, you'll feel right at home.
|
||||||
|
|
||||||
|
Otherwise, go read
|
||||||
|
[Docker's contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md).
|
||||||
|
|
||||||
|
Happy hacking!
|
3
vendor/github.com/docker/libtrust/MAINTAINERS
generated
vendored
Normal file
3
vendor/github.com/docker/libtrust/MAINTAINERS
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
Solomon Hykes <solomon@docker.com>
|
||||||
|
Josh Hawn <josh@docker.com> (github: jlhawn)
|
||||||
|
Derek McGowan <derek@docker.com> (github: dmcgowan)
|
44
vendor/github.com/garyburd/redigo/README.markdown
generated
vendored
44
vendor/github.com/garyburd/redigo/README.markdown
generated
vendored
|
@ -1,44 +0,0 @@
|
||||||
Redigo
|
|
||||||
======
|
|
||||||
|
|
||||||
Redigo is a [Go](http://golang.org/) client for the [Redis](http://redis.io/) database.
|
|
||||||
|
|
||||||
Features
|
|
||||||
-------
|
|
||||||
|
|
||||||
* A [Print-like](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Executing_Commands) API with support for all Redis commands.
|
|
||||||
* [Pipelining](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Pipelining), including pipelined transactions.
|
|
||||||
* [Publish/Subscribe](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Publish_and_Subscribe).
|
|
||||||
* [Connection pooling](http://godoc.org/github.com/garyburd/redigo/redis#Pool).
|
|
||||||
* [Script helper type](http://godoc.org/github.com/garyburd/redigo/redis#Script) with optimistic use of EVALSHA.
|
|
||||||
* [Helper functions](http://godoc.org/github.com/garyburd/redigo/redis#hdr-Reply_Helpers) for working with command replies.
|
|
||||||
|
|
||||||
Documentation
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- [API Reference](http://godoc.org/github.com/garyburd/redigo/redis)
|
|
||||||
- [FAQ](https://github.com/garyburd/redigo/wiki/FAQ)
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
Install Redigo using the "go get" command:
|
|
||||||
|
|
||||||
go get github.com/garyburd/redigo/redis
|
|
||||||
|
|
||||||
The Go distribution is Redigo's only dependency.
|
|
||||||
|
|
||||||
Contributing
|
|
||||||
------------
|
|
||||||
|
|
||||||
Contributions are welcome.
|
|
||||||
|
|
||||||
Before writing code, send mail to gary@beagledreams.com to discuss what you
|
|
||||||
plan to do. This gives me a chance to validate the design, avoid duplication of
|
|
||||||
effort and ensure that the changes fit the goals of the project. Do not start
|
|
||||||
the discussion with a pull request.
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
|
|
||||||
Redigo is available under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).
|
|
5
vendor/github.com/go-ini/ini/.gitignore
generated
vendored
Normal file
5
vendor/github.com/go-ini/ini/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
testdata/conf_out.ini
|
||||||
|
ini.sublime-project
|
||||||
|
ini.sublime-workspace
|
||||||
|
testdata/conf_reflect.ini
|
||||||
|
.idea
|
17
vendor/github.com/go-ini/ini/.travis.yml
generated
vendored
Normal file
17
vendor/github.com/go-ini/ini/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
sudo: false
|
||||||
|
language: go
|
||||||
|
go:
|
||||||
|
- 1.4.x
|
||||||
|
- 1.5.x
|
||||||
|
- 1.6.x
|
||||||
|
- 1.7.x
|
||||||
|
- master
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go get golang.org/x/tools/cmd/cover
|
||||||
|
- go get github.com/smartystreets/goconvey
|
||||||
|
- go test -v -cover -race
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
- u@gogs.io
|
12
vendor/github.com/go-ini/ini/Makefile
generated
vendored
Normal file
12
vendor/github.com/go-ini/ini/Makefile
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
.PHONY: build test bench vet
|
||||||
|
|
||||||
|
build: vet bench
|
||||||
|
|
||||||
|
test:
|
||||||
|
go test -v -cover -race
|
||||||
|
|
||||||
|
bench:
|
||||||
|
go test -v -cover -race -test.bench=. -test.benchmem
|
||||||
|
|
||||||
|
vet:
|
||||||
|
go vet
|
41
vendor/github.com/go-ini/ini/README.md
generated
vendored
41
vendor/github.com/go-ini/ini/README.md
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini)
|
INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini) [![Sourcegraph](https://sourcegraph.com/github.com/go-ini/ini/-/badge.svg)](https://sourcegraph.com/github.com/go-ini/ini?badge)
|
||||||
===
|
===
|
||||||
|
|
||||||
![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200)
|
![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200)
|
||||||
|
@ -9,7 +9,7 @@ Package ini provides INI file read and write functionality in Go.
|
||||||
|
|
||||||
## Feature
|
## Feature
|
||||||
|
|
||||||
- Load multiple data sources(`[]byte` or file) with overwrites.
|
- Load multiple data sources(`[]byte`, file and `io.ReadCloser`) with overwrites.
|
||||||
- Read with recursion values.
|
- Read with recursion values.
|
||||||
- Read with parent-child sections.
|
- Read with parent-child sections.
|
||||||
- Read with auto-increment key names.
|
- Read with auto-increment key names.
|
||||||
|
@ -44,10 +44,10 @@ Please add `-u` flag to update in the future.
|
||||||
|
|
||||||
### Loading from data sources
|
### Loading from data sources
|
||||||
|
|
||||||
A **Data Source** is either raw data in type `[]byte` or a file name with type `string` and you can load **as many data sources as you want**. Passing other types will simply return an error.
|
A **Data Source** is either raw data in type `[]byte`, a file name with type `string` or `io.ReadCloser`. You can load **as many data sources as you want**. Passing other types will simply return an error.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
cfg, err := ini.Load([]byte("raw data"), "filename")
|
cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data"))))
|
||||||
```
|
```
|
||||||
|
|
||||||
Or start with an empty object:
|
Or start with an empty object:
|
||||||
|
@ -106,6 +106,22 @@ cfg, err := LoadSources(LoadOptions{AllowBooleanKeys: true}, "my.cnf"))
|
||||||
|
|
||||||
The value of those keys are always `true`, and when you save to a file, it will keep in the same foramt as you read.
|
The value of those keys are always `true`, and when you save to a file, it will keep in the same foramt as you read.
|
||||||
|
|
||||||
|
To generate such keys in your program, you could use `NewBooleanKey`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
key, err := sec.NewBooleanKey("skip-host-cache")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Comment
|
||||||
|
|
||||||
|
Take care that following format will be treated as comment:
|
||||||
|
|
||||||
|
1. Line begins with `#` or `;`
|
||||||
|
2. Words after `#` or `;`
|
||||||
|
3. Words after section name (i.e words after `[some section name]`)
|
||||||
|
|
||||||
|
If you want to save a value with `#` or `;`, please quote them with ``` ` ``` or ``` """ ```.
|
||||||
|
|
||||||
### Working with sections
|
### Working with sections
|
||||||
|
|
||||||
To get a section, you would need to:
|
To get a section, you would need to:
|
||||||
|
@ -123,7 +139,7 @@ section, err := cfg.GetSection("")
|
||||||
When you're pretty sure the section exists, following code could make your life easier:
|
When you're pretty sure the section exists, following code could make your life easier:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
section := cfg.Section("")
|
section := cfg.Section("section name")
|
||||||
```
|
```
|
||||||
|
|
||||||
What happens when the section somehow does not exist? Don't panic, it automatically creates and returns a new section to you.
|
What happens when the section somehow does not exist? Don't panic, it automatically creates and returns a new section to you.
|
||||||
|
@ -453,6 +469,21 @@ cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1
|
||||||
cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"]
|
cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Unparseable Sections
|
||||||
|
|
||||||
|
Sometimes, you have sections that do not contain key-value pairs but raw content, to handle such case, you can use `LoadOptions.UnparsableSections`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := LoadSources(LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS]
|
||||||
|
<1><L.Slide#2> This slide has the fuel listed in the wrong units <e.1>`))
|
||||||
|
|
||||||
|
body := cfg.Section("COMMENTS").Body()
|
||||||
|
|
||||||
|
/* --- start ---
|
||||||
|
<1><L.Slide#2> This slide has the fuel listed in the wrong units <e.1>
|
||||||
|
------ end --- */
|
||||||
|
```
|
||||||
|
|
||||||
### Auto-increment Key Names
|
### Auto-increment Key Names
|
||||||
|
|
||||||
If key name is `-` in data source, then it would be seen as special syntax for auto-increment key name start from 1, and every section is independent on counter.
|
If key name is `-` in data source, then it would be seen as special syntax for auto-increment key name start from 1, and every section is independent on counter.
|
||||||
|
|
47
vendor/github.com/go-ini/ini/README_ZH.md
generated
vendored
47
vendor/github.com/go-ini/ini/README_ZH.md
generated
vendored
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## 功能特性
|
## 功能特性
|
||||||
|
|
||||||
- 支持覆盖加载多个数据源(`[]byte` 或文件)
|
- 支持覆盖加载多个数据源(`[]byte`、文件和 `io.ReadCloser`)
|
||||||
- 支持递归读取键值
|
- 支持递归读取键值
|
||||||
- 支持读取父子分区
|
- 支持读取父子分区
|
||||||
- 支持读取自增键名
|
- 支持读取自增键名
|
||||||
|
@ -37,10 +37,10 @@
|
||||||
|
|
||||||
### 从数据源加载
|
### 从数据源加载
|
||||||
|
|
||||||
一个 **数据源** 可以是 `[]byte` 类型的原始数据,或 `string` 类型的文件路径。您可以加载 **任意多个** 数据源。如果您传递其它类型的数据源,则会直接返回错误。
|
一个 **数据源** 可以是 `[]byte` 类型的原始数据,`string` 类型的文件路径或 `io.ReadCloser`。您可以加载 **任意多个** 数据源。如果您传递其它类型的数据源,则会直接返回错误。
|
||||||
|
|
||||||
```go
|
```go
|
||||||
cfg, err := ini.Load([]byte("raw data"), "filename")
|
cfg, err := ini.Load([]byte("raw data"), "filename", ioutil.NopCloser(bytes.NewReader([]byte("some other data"))))
|
||||||
```
|
```
|
||||||
|
|
||||||
或者从一个空白的文件开始:
|
或者从一个空白的文件开始:
|
||||||
|
@ -99,6 +99,22 @@ cfg, err := LoadSources(LoadOptions{AllowBooleanKeys: true}, "my.cnf"))
|
||||||
|
|
||||||
这些键的值永远为 `true`,且在保存到文件时也只会输出键名。
|
这些键的值永远为 `true`,且在保存到文件时也只会输出键名。
|
||||||
|
|
||||||
|
如果您想要通过程序来生成此类键,则可以使用 `NewBooleanKey`:
|
||||||
|
|
||||||
|
```go
|
||||||
|
key, err := sec.NewBooleanKey("skip-host-cache")
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 关于注释
|
||||||
|
|
||||||
|
下述几种情况的内容将被视为注释:
|
||||||
|
|
||||||
|
1. 所有以 `#` 或 `;` 开头的行
|
||||||
|
2. 所有在 `#` 或 `;` 之后的内容
|
||||||
|
3. 分区标签后的文字 (即 `[分区名]` 之后的内容)
|
||||||
|
|
||||||
|
如果你希望使用包含 `#` 或 `;` 的值,请使用 ``` ` ``` 或 ``` """ ``` 进行包覆。
|
||||||
|
|
||||||
### 操作分区(Section)
|
### 操作分区(Section)
|
||||||
|
|
||||||
获取指定分区:
|
获取指定分区:
|
||||||
|
@ -116,7 +132,7 @@ section, err := cfg.GetSection("")
|
||||||
当您非常确定某个分区是存在的,可以使用以下简便方法:
|
当您非常确定某个分区是存在的,可以使用以下简便方法:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
section := cfg.Section("")
|
section := cfg.Section("section name")
|
||||||
```
|
```
|
||||||
|
|
||||||
如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。
|
如果不小心判断错了,要获取的分区其实是不存在的,那会发生什么呢?没事的,它会自动创建并返回一个对应的分区对象给您。
|
||||||
|
@ -399,9 +415,9 @@ cfg.WriteToIndent(writer, "\t")
|
||||||
ini.PrettyFormat = false
|
ini.PrettyFormat = false
|
||||||
```
|
```
|
||||||
|
|
||||||
### 高级用法
|
## 高级用法
|
||||||
|
|
||||||
#### 递归读取键值
|
### 递归读取键值
|
||||||
|
|
||||||
在获取所有键值的过程中,特殊语法 `%(<name>)s` 会被应用,其中 `<name>` 可以是相同分区或者默认分区下的键名。字符串 `%(<name>)s` 会被相应的键值所替代,如果指定的键不存在,则会用空字符串替代。您可以最多使用 99 层的递归嵌套。
|
在获取所有键值的过程中,特殊语法 `%(<name>)s` 会被应用,其中 `<name>` 可以是相同分区或者默认分区下的键名。字符串 `%(<name>)s` 会被相应的键值所替代,如果指定的键不存在,则会用空字符串替代。您可以最多使用 99 层的递归嵌套。
|
||||||
|
|
||||||
|
@ -421,7 +437,7 @@ cfg.Section("author").Key("GITHUB").String() // https://github.com/Unknwon
|
||||||
cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini
|
cfg.Section("package").Key("FULL_NAME").String() // github.com/go-ini/ini
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 读取父子分区
|
### 读取父子分区
|
||||||
|
|
||||||
您可以在分区名称中使用 `.` 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。
|
您可以在分区名称中使用 `.` 来表示两个或多个分区之间的父子关系。如果某个键在子分区中不存在,则会去它的父分区中再次寻找,直到没有父分区为止。
|
||||||
|
|
||||||
|
@ -446,7 +462,22 @@ cfg.Section("package.sub").Key("CLONE_URL").String() // https://gopkg.in/ini.v1
|
||||||
cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"]
|
cfg.Section("package.sub").ParentKeys() // ["CLONE_URL"]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 读取自增键名
|
### 无法解析的分区
|
||||||
|
|
||||||
|
如果遇到一些比较特殊的分区,它们不包含常见的键值对,而是没有固定格式的纯文本,则可以使用 `LoadOptions.UnparsableSections` 进行处理:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cfg, err := LoadSources(LoadOptions{UnparseableSections: []string{"COMMENTS"}}, `[COMMENTS]
|
||||||
|
<1><L.Slide#2> This slide has the fuel listed in the wrong units <e.1>`))
|
||||||
|
|
||||||
|
body := cfg.Section("COMMENTS").Body()
|
||||||
|
|
||||||
|
/* --- start ---
|
||||||
|
<1><L.Slide#2> This slide has the fuel listed in the wrong units <e.1>
|
||||||
|
------ end --- */
|
||||||
|
```
|
||||||
|
|
||||||
|
### 读取自增键名
|
||||||
|
|
||||||
如果数据源中的键名为 `-`,则认为该键使用了自增键名的特殊语法。计数器从 1 开始,并且分区之间是相互独立的。
|
如果数据源中的键名为 `-`,则认为该键使用了自增键名的特殊语法。计数器从 1 开始,并且分区之间是相互独立的。
|
||||||
|
|
||||||
|
|
90
vendor/github.com/go-ini/ini/ini.go
generated
vendored
90
vendor/github.com/go-ini/ini/ini.go
generated
vendored
|
@ -20,6 +20,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
@ -36,7 +37,7 @@ const (
|
||||||
|
|
||||||
// Maximum allowed depth when recursively substituing variable names.
|
// Maximum allowed depth when recursively substituing variable names.
|
||||||
_DEPTH_VALUES = 99
|
_DEPTH_VALUES = 99
|
||||||
_VERSION = "1.21.1"
|
_VERSION = "1.25.4"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Version returns current package version literal.
|
// Version returns current package version literal.
|
||||||
|
@ -108,7 +109,16 @@ type sourceData struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sourceData) ReadCloser() (io.ReadCloser, error) {
|
func (s *sourceData) ReadCloser() (io.ReadCloser, error) {
|
||||||
return &bytesReadCloser{bytes.NewReader(s.data)}, nil
|
return ioutil.NopCloser(bytes.NewReader(s.data)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// sourceReadCloser represents an input stream with Close method.
|
||||||
|
type sourceReadCloser struct {
|
||||||
|
reader io.ReadCloser
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *sourceReadCloser) ReadCloser() (io.ReadCloser, error) {
|
||||||
|
return s.reader, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// File represents a combination of a or more INI file(s) in memory.
|
// File represents a combination of a or more INI file(s) in memory.
|
||||||
|
@ -149,6 +159,8 @@ func parseDataSource(source interface{}) (dataSource, error) {
|
||||||
return sourceFile{s}, nil
|
return sourceFile{s}, nil
|
||||||
case []byte:
|
case []byte:
|
||||||
return &sourceData{s}, nil
|
return &sourceData{s}, nil
|
||||||
|
case io.ReadCloser:
|
||||||
|
return &sourceReadCloser{s}, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("error parsing data source: unknown type '%s'", s)
|
return nil, fmt.Errorf("error parsing data source: unknown type '%s'", s)
|
||||||
}
|
}
|
||||||
|
@ -164,6 +176,11 @@ type LoadOptions struct {
|
||||||
// AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing.
|
// AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing.
|
||||||
// This type of keys are mostly used in my.cnf.
|
// This type of keys are mostly used in my.cnf.
|
||||||
AllowBooleanKeys bool
|
AllowBooleanKeys bool
|
||||||
|
// AllowShadows indicates whether to keep track of keys with same name under same section.
|
||||||
|
AllowShadows bool
|
||||||
|
// Some INI formats allow group blocks that store a block of raw content that doesn't otherwise
|
||||||
|
// conform to key/value pairs. Specify the names of those blocks here.
|
||||||
|
UnparseableSections []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadSources(opts LoadOptions, source interface{}, others ...interface{}) (_ *File, err error) {
|
func LoadSources(opts LoadOptions, source interface{}, others ...interface{}) (_ *File, err error) {
|
||||||
|
@ -204,6 +221,12 @@ func InsensitiveLoad(source interface{}, others ...interface{}) (*File, error) {
|
||||||
return LoadSources(LoadOptions{Insensitive: true}, source, others...)
|
return LoadSources(LoadOptions{Insensitive: true}, source, others...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InsensitiveLoad has exactly same functionality as Load function
|
||||||
|
// except it allows have shadow keys.
|
||||||
|
func ShadowLoad(source interface{}, others ...interface{}) (*File, error) {
|
||||||
|
return LoadSources(LoadOptions{AllowShadows: true}, source, others...)
|
||||||
|
}
|
||||||
|
|
||||||
// Empty returns an empty file object.
|
// Empty returns an empty file object.
|
||||||
func Empty() *File {
|
func Empty() *File {
|
||||||
// Ignore error here, we sure our data is good.
|
// Ignore error here, we sure our data is good.
|
||||||
|
@ -233,6 +256,18 @@ func (f *File) NewSection(name string) (*Section, error) {
|
||||||
return f.sections[name], nil
|
return f.sections[name], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewRawSection creates a new section with an unparseable body.
|
||||||
|
func (f *File) NewRawSection(name, body string) (*Section, error) {
|
||||||
|
section, err := f.NewSection(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
section.isRawSection = true
|
||||||
|
section.rawBody = body
|
||||||
|
return section, nil
|
||||||
|
}
|
||||||
|
|
||||||
// NewSections creates a list of sections.
|
// NewSections creates a list of sections.
|
||||||
func (f *File) NewSections(names ...string) (err error) {
|
func (f *File) NewSections(names ...string) (err error) {
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
|
@ -386,6 +421,13 @@ func (f *File) WriteToIndent(w io.Writer, indent string) (n int64, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if sec.isRawSection {
|
||||||
|
if _, err = buf.WriteString(sec.rawBody); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Count and generate alignment length and buffer spaces using the
|
// Count and generate alignment length and buffer spaces using the
|
||||||
// longest key. Keys may be modifed if they contain certain characters so
|
// longest key. Keys may be modifed if they contain certain characters so
|
||||||
// we need to take that into account in our calculation.
|
// we need to take that into account in our calculation.
|
||||||
|
@ -407,6 +449,7 @@ func (f *File) WriteToIndent(w io.Writer, indent string) (n int64, err error) {
|
||||||
}
|
}
|
||||||
alignSpaces := bytes.Repeat([]byte(" "), alignLength)
|
alignSpaces := bytes.Repeat([]byte(" "), alignLength)
|
||||||
|
|
||||||
|
KEY_LIST:
|
||||||
for _, kname := range sec.keyList {
|
for _, kname := range sec.keyList {
|
||||||
key := sec.Key(kname)
|
key := sec.Key(kname)
|
||||||
if len(key.Comment) > 0 {
|
if len(key.Comment) > 0 {
|
||||||
|
@ -433,28 +476,33 @@ func (f *File) WriteToIndent(w io.Writer, indent string) (n int64, err error) {
|
||||||
case strings.Contains(kname, "`"):
|
case strings.Contains(kname, "`"):
|
||||||
kname = `"""` + kname + `"""`
|
kname = `"""` + kname + `"""`
|
||||||
}
|
}
|
||||||
if _, err = buf.WriteString(kname); err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if key.isBooleanType {
|
for _, val := range key.ValueWithShadows() {
|
||||||
continue
|
if _, err = buf.WriteString(kname); err != nil {
|
||||||
}
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
// Write out alignment spaces before "=" sign
|
if key.isBooleanType {
|
||||||
if PrettyFormat {
|
if kname != sec.keyList[len(sec.keyList)-1] {
|
||||||
buf.Write(alignSpaces[:alignLength-len(kname)])
|
buf.WriteString(LineBreak)
|
||||||
}
|
}
|
||||||
|
continue KEY_LIST
|
||||||
|
}
|
||||||
|
|
||||||
val := key.value
|
// Write out alignment spaces before "=" sign
|
||||||
// In case key value contains "\n", "`", "\"", "#" or ";"
|
if PrettyFormat {
|
||||||
if strings.ContainsAny(val, "\n`") {
|
buf.Write(alignSpaces[:alignLength-len(kname)])
|
||||||
val = `"""` + val + `"""`
|
}
|
||||||
} else if strings.ContainsAny(val, "#;") {
|
|
||||||
val = "`" + val + "`"
|
// In case key value contains "\n", "`", "\"", "#" or ";"
|
||||||
}
|
if strings.ContainsAny(val, "\n`") {
|
||||||
if _, err = buf.WriteString(equalSign + val + LineBreak); err != nil {
|
val = `"""` + val + `"""`
|
||||||
return 0, err
|
} else if strings.ContainsAny(val, "#;") {
|
||||||
|
val = "`" + val + "`"
|
||||||
|
}
|
||||||
|
if _, err = buf.WriteString(equalSign + val + LineBreak); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
104
vendor/github.com/go-ini/ini/key.go
generated
vendored
104
vendor/github.com/go-ini/ini/key.go
generated
vendored
|
@ -15,6 +15,7 @@
|
||||||
package ini
|
package ini
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -29,9 +30,42 @@ type Key struct {
|
||||||
isAutoIncrement bool
|
isAutoIncrement bool
|
||||||
isBooleanType bool
|
isBooleanType bool
|
||||||
|
|
||||||
|
isShadow bool
|
||||||
|
shadows []*Key
|
||||||
|
|
||||||
Comment string
|
Comment string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// newKey simply return a key object with given values.
|
||||||
|
func newKey(s *Section, name, val string) *Key {
|
||||||
|
return &Key{
|
||||||
|
s: s,
|
||||||
|
name: name,
|
||||||
|
value: val,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Key) addShadow(val string) error {
|
||||||
|
if k.isShadow {
|
||||||
|
return errors.New("cannot add shadow to another shadow key")
|
||||||
|
} else if k.isAutoIncrement || k.isBooleanType {
|
||||||
|
return errors.New("cannot add shadow to auto-increment or boolean key")
|
||||||
|
}
|
||||||
|
|
||||||
|
shadow := newKey(k.s, k.name, val)
|
||||||
|
shadow.isShadow = true
|
||||||
|
k.shadows = append(k.shadows, shadow)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddShadow adds a new shadow key to itself.
|
||||||
|
func (k *Key) AddShadow(val string) error {
|
||||||
|
if !k.s.f.options.AllowShadows {
|
||||||
|
return errors.New("shadow key is not allowed")
|
||||||
|
}
|
||||||
|
return k.addShadow(val)
|
||||||
|
}
|
||||||
|
|
||||||
// ValueMapper represents a mapping function for values, e.g. os.ExpandEnv
|
// ValueMapper represents a mapping function for values, e.g. os.ExpandEnv
|
||||||
type ValueMapper func(string) string
|
type ValueMapper func(string) string
|
||||||
|
|
||||||
|
@ -45,16 +79,29 @@ func (k *Key) Value() string {
|
||||||
return k.value
|
return k.value
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns string representation of value.
|
// ValueWithShadows returns raw values of key and its shadows if any.
|
||||||
func (k *Key) String() string {
|
func (k *Key) ValueWithShadows() []string {
|
||||||
val := k.value
|
if len(k.shadows) == 0 {
|
||||||
|
return []string{k.value}
|
||||||
|
}
|
||||||
|
vals := make([]string, len(k.shadows)+1)
|
||||||
|
vals[0] = k.value
|
||||||
|
for i := range k.shadows {
|
||||||
|
vals[i+1] = k.shadows[i].value
|
||||||
|
}
|
||||||
|
return vals
|
||||||
|
}
|
||||||
|
|
||||||
|
// transformValue takes a raw value and transforms to its final string.
|
||||||
|
func (k *Key) transformValue(val string) string {
|
||||||
if k.s.f.ValueMapper != nil {
|
if k.s.f.ValueMapper != nil {
|
||||||
val = k.s.f.ValueMapper(val)
|
val = k.s.f.ValueMapper(val)
|
||||||
}
|
}
|
||||||
if strings.Index(val, "%") == -1 {
|
|
||||||
|
// Fail-fast if no indicate char found for recursive value
|
||||||
|
if !strings.Contains(val, "%") {
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < _DEPTH_VALUES; i++ {
|
for i := 0; i < _DEPTH_VALUES; i++ {
|
||||||
vr := varPattern.FindString(val)
|
vr := varPattern.FindString(val)
|
||||||
if len(vr) == 0 {
|
if len(vr) == 0 {
|
||||||
|
@ -78,6 +125,11 @@ func (k *Key) String() string {
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// String returns string representation of value.
|
||||||
|
func (k *Key) String() string {
|
||||||
|
return k.transformValue(k.value)
|
||||||
|
}
|
||||||
|
|
||||||
// Validate accepts a validate function which can
|
// Validate accepts a validate function which can
|
||||||
// return modifed result as key value.
|
// return modifed result as key value.
|
||||||
func (k *Key) Validate(fn func(string) string) string {
|
func (k *Key) Validate(fn func(string) string) string {
|
||||||
|
@ -394,11 +446,31 @@ func (k *Key) Strings(delim string) []string {
|
||||||
|
|
||||||
vals := strings.Split(str, delim)
|
vals := strings.Split(str, delim)
|
||||||
for i := range vals {
|
for i := range vals {
|
||||||
|
// vals[i] = k.transformValue(strings.TrimSpace(vals[i]))
|
||||||
vals[i] = strings.TrimSpace(vals[i])
|
vals[i] = strings.TrimSpace(vals[i])
|
||||||
}
|
}
|
||||||
return vals
|
return vals
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// StringsWithShadows returns list of string divided by given delimiter.
|
||||||
|
// Shadows will also be appended if any.
|
||||||
|
func (k *Key) StringsWithShadows(delim string) []string {
|
||||||
|
vals := k.ValueWithShadows()
|
||||||
|
results := make([]string, 0, len(vals)*2)
|
||||||
|
for i := range vals {
|
||||||
|
if len(vals) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
results = append(results, strings.Split(vals[i], delim)...)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range results {
|
||||||
|
results[i] = k.transformValue(strings.TrimSpace(results[i]))
|
||||||
|
}
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
// Float64s returns list of float64 divided by given delimiter. Any invalid input will be treated as zero value.
|
// Float64s returns list of float64 divided by given delimiter. Any invalid input will be treated as zero value.
|
||||||
func (k *Key) Float64s(delim string) []float64 {
|
func (k *Key) Float64s(delim string) []float64 {
|
||||||
vals, _ := k.getFloat64s(delim, true, false)
|
vals, _ := k.getFloat64s(delim, true, false)
|
||||||
|
@ -407,13 +479,13 @@ func (k *Key) Float64s(delim string) []float64 {
|
||||||
|
|
||||||
// Ints returns list of int divided by given delimiter. Any invalid input will be treated as zero value.
|
// Ints returns list of int divided by given delimiter. Any invalid input will be treated as zero value.
|
||||||
func (k *Key) Ints(delim string) []int {
|
func (k *Key) Ints(delim string) []int {
|
||||||
vals, _ := k.getInts(delim, true, false)
|
vals, _ := k.parseInts(k.Strings(delim), true, false)
|
||||||
return vals
|
return vals
|
||||||
}
|
}
|
||||||
|
|
||||||
// Int64s returns list of int64 divided by given delimiter. Any invalid input will be treated as zero value.
|
// Int64s returns list of int64 divided by given delimiter. Any invalid input will be treated as zero value.
|
||||||
func (k *Key) Int64s(delim string) []int64 {
|
func (k *Key) Int64s(delim string) []int64 {
|
||||||
vals, _ := k.getInt64s(delim, true, false)
|
vals, _ := k.parseInt64s(k.Strings(delim), true, false)
|
||||||
return vals
|
return vals
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,14 +524,14 @@ func (k *Key) ValidFloat64s(delim string) []float64 {
|
||||||
// ValidInts returns list of int divided by given delimiter. If some value is not integer, then it will
|
// ValidInts returns list of int divided by given delimiter. If some value is not integer, then it will
|
||||||
// not be included to result list.
|
// not be included to result list.
|
||||||
func (k *Key) ValidInts(delim string) []int {
|
func (k *Key) ValidInts(delim string) []int {
|
||||||
vals, _ := k.getInts(delim, false, false)
|
vals, _ := k.parseInts(k.Strings(delim), false, false)
|
||||||
return vals
|
return vals
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidInt64s returns list of int64 divided by given delimiter. If some value is not 64-bit integer,
|
// ValidInt64s returns list of int64 divided by given delimiter. If some value is not 64-bit integer,
|
||||||
// then it will not be included to result list.
|
// then it will not be included to result list.
|
||||||
func (k *Key) ValidInt64s(delim string) []int64 {
|
func (k *Key) ValidInt64s(delim string) []int64 {
|
||||||
vals, _ := k.getInt64s(delim, false, false)
|
vals, _ := k.parseInt64s(k.Strings(delim), false, false)
|
||||||
return vals
|
return vals
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -495,12 +567,12 @@ func (k *Key) StrictFloat64s(delim string) ([]float64, error) {
|
||||||
|
|
||||||
// StrictInts returns list of int divided by given delimiter or error on first invalid input.
|
// StrictInts returns list of int divided by given delimiter or error on first invalid input.
|
||||||
func (k *Key) StrictInts(delim string) ([]int, error) {
|
func (k *Key) StrictInts(delim string) ([]int, error) {
|
||||||
return k.getInts(delim, false, true)
|
return k.parseInts(k.Strings(delim), false, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// StrictInt64s returns list of int64 divided by given delimiter or error on first invalid input.
|
// StrictInt64s returns list of int64 divided by given delimiter or error on first invalid input.
|
||||||
func (k *Key) StrictInt64s(delim string) ([]int64, error) {
|
func (k *Key) StrictInt64s(delim string) ([]int64, error) {
|
||||||
return k.getInt64s(delim, false, true)
|
return k.parseInt64s(k.Strings(delim), false, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// StrictUints returns list of uint divided by given delimiter or error on first invalid input.
|
// StrictUints returns list of uint divided by given delimiter or error on first invalid input.
|
||||||
|
@ -541,9 +613,8 @@ func (k *Key) getFloat64s(delim string, addInvalid, returnOnInvalid bool) ([]flo
|
||||||
return vals, nil
|
return vals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getInts returns list of int divided by given delimiter.
|
// parseInts transforms strings to ints.
|
||||||
func (k *Key) getInts(delim string, addInvalid, returnOnInvalid bool) ([]int, error) {
|
func (k *Key) parseInts(strs []string, addInvalid, returnOnInvalid bool) ([]int, error) {
|
||||||
strs := k.Strings(delim)
|
|
||||||
vals := make([]int, 0, len(strs))
|
vals := make([]int, 0, len(strs))
|
||||||
for _, str := range strs {
|
for _, str := range strs {
|
||||||
val, err := strconv.Atoi(str)
|
val, err := strconv.Atoi(str)
|
||||||
|
@ -557,9 +628,8 @@ func (k *Key) getInts(delim string, addInvalid, returnOnInvalid bool) ([]int, er
|
||||||
return vals, nil
|
return vals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getInt64s returns list of int64 divided by given delimiter.
|
// parseInt64s transforms strings to int64s.
|
||||||
func (k *Key) getInt64s(delim string, addInvalid, returnOnInvalid bool) ([]int64, error) {
|
func (k *Key) parseInt64s(strs []string, addInvalid, returnOnInvalid bool) ([]int64, error) {
|
||||||
strs := k.Strings(delim)
|
|
||||||
vals := make([]int64, 0, len(strs))
|
vals := make([]int64, 0, len(strs))
|
||||||
for _, str := range strs {
|
for _, str := range strs {
|
||||||
val, err := strconv.ParseInt(str, 10, 64)
|
val, err := strconv.ParseInt(str, 10, 64)
|
||||||
|
|
59
vendor/github.com/go-ini/ini/parser.go
generated
vendored
59
vendor/github.com/go-ini/ini/parser.go
generated
vendored
|
@ -48,16 +48,31 @@ func newParser(r io.Reader) *parser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// BOM handles header of BOM-UTF8 format.
|
// BOM handles header of UTF-8, UTF-16 LE and UTF-16 BE's BOM format.
|
||||||
// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding
|
// http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding
|
||||||
func (p *parser) BOM() error {
|
func (p *parser) BOM() error {
|
||||||
mask, err := p.buf.Peek(3)
|
mask, err := p.buf.Peek(2)
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
return err
|
return err
|
||||||
} else if len(mask) < 3 {
|
} else if len(mask) < 2 {
|
||||||
return nil
|
return nil
|
||||||
} else if mask[0] == 239 && mask[1] == 187 && mask[2] == 191 {
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case mask[0] == 254 && mask[1] == 255:
|
||||||
|
fallthrough
|
||||||
|
case mask[0] == 255 && mask[1] == 254:
|
||||||
p.buf.Read(mask)
|
p.buf.Read(mask)
|
||||||
|
case mask[0] == 239 && mask[1] == 187:
|
||||||
|
mask, err := p.buf.Peek(3)
|
||||||
|
if err != nil && err != io.EOF {
|
||||||
|
return err
|
||||||
|
} else if len(mask) < 3 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if mask[2] == 191 {
|
||||||
|
p.buf.Read(mask)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -235,6 +250,7 @@ func (f *File) parse(reader io.Reader) (err error) {
|
||||||
section, _ := f.NewSection(DEFAULT_SECTION)
|
section, _ := f.NewSection(DEFAULT_SECTION)
|
||||||
|
|
||||||
var line []byte
|
var line []byte
|
||||||
|
var inUnparseableSection bool
|
||||||
for !p.isEOF {
|
for !p.isEOF {
|
||||||
line, err = p.readUntil('\n')
|
line, err = p.readUntil('\n')
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -280,6 +296,21 @@ func (f *File) parse(reader io.Reader) (err error) {
|
||||||
// Reset aotu-counter and comments
|
// Reset aotu-counter and comments
|
||||||
p.comment.Reset()
|
p.comment.Reset()
|
||||||
p.count = 1
|
p.count = 1
|
||||||
|
|
||||||
|
inUnparseableSection = false
|
||||||
|
for i := range f.options.UnparseableSections {
|
||||||
|
if f.options.UnparseableSections[i] == name ||
|
||||||
|
(f.options.Insensitive && strings.ToLower(f.options.UnparseableSections[i]) == strings.ToLower(name)) {
|
||||||
|
inUnparseableSection = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if inUnparseableSection {
|
||||||
|
section.isRawSection = true
|
||||||
|
section.rawBody += string(line)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,11 +318,14 @@ func (f *File) parse(reader io.Reader) (err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Treat as boolean key when desired, and whole line is key name.
|
// Treat as boolean key when desired, and whole line is key name.
|
||||||
if IsErrDelimiterNotFound(err) && f.options.AllowBooleanKeys {
|
if IsErrDelimiterNotFound(err) && f.options.AllowBooleanKeys {
|
||||||
key, err := section.NewKey(string(line), "true")
|
kname, err := p.readValue(line, f.options.IgnoreContinuation)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
key, err := section.NewBooleanKey(kname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
key.isBooleanType = true
|
|
||||||
key.Comment = strings.TrimSpace(p.comment.String())
|
key.Comment = strings.TrimSpace(p.comment.String())
|
||||||
p.comment.Reset()
|
p.comment.Reset()
|
||||||
continue
|
continue
|
||||||
|
@ -307,17 +341,16 @@ func (f *File) parse(reader io.Reader) (err error) {
|
||||||
p.count++
|
p.count++
|
||||||
}
|
}
|
||||||
|
|
||||||
key, err := section.NewKey(kname, "")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
key.isAutoIncrement = isAutoIncr
|
|
||||||
|
|
||||||
value, err := p.readValue(line[offset:], f.options.IgnoreContinuation)
|
value, err := p.readValue(line[offset:], f.options.IgnoreContinuation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
key.SetValue(value)
|
|
||||||
|
key, err := section.NewKey(kname, value)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
key.isAutoIncrement = isAutoIncr
|
||||||
key.Comment = strings.TrimSpace(p.comment.String())
|
key.Comment = strings.TrimSpace(p.comment.String())
|
||||||
p.comment.Reset()
|
p.comment.Reset()
|
||||||
}
|
}
|
||||||
|
|
42
vendor/github.com/go-ini/ini/section.go
generated
vendored
42
vendor/github.com/go-ini/ini/section.go
generated
vendored
|
@ -28,10 +28,19 @@ type Section struct {
|
||||||
keys map[string]*Key
|
keys map[string]*Key
|
||||||
keyList []string
|
keyList []string
|
||||||
keysHash map[string]string
|
keysHash map[string]string
|
||||||
|
|
||||||
|
isRawSection bool
|
||||||
|
rawBody string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSection(f *File, name string) *Section {
|
func newSection(f *File, name string) *Section {
|
||||||
return &Section{f, "", name, make(map[string]*Key), make([]string, 0, 10), make(map[string]string)}
|
return &Section{
|
||||||
|
f: f,
|
||||||
|
name: name,
|
||||||
|
keys: make(map[string]*Key),
|
||||||
|
keyList: make([]string, 0, 10),
|
||||||
|
keysHash: make(map[string]string),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name returns name of Section.
|
// Name returns name of Section.
|
||||||
|
@ -39,6 +48,12 @@ func (s *Section) Name() string {
|
||||||
return s.name
|
return s.name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Body returns rawBody of Section if the section was marked as unparseable.
|
||||||
|
// It still follows the other rules of the INI format surrounding leading/trailing whitespace.
|
||||||
|
func (s *Section) Body() string {
|
||||||
|
return strings.TrimSpace(s.rawBody)
|
||||||
|
}
|
||||||
|
|
||||||
// NewKey creates a new key to given section.
|
// NewKey creates a new key to given section.
|
||||||
func (s *Section) NewKey(name, val string) (*Key, error) {
|
func (s *Section) NewKey(name, val string) (*Key, error) {
|
||||||
if len(name) == 0 {
|
if len(name) == 0 {
|
||||||
|
@ -53,20 +68,33 @@ func (s *Section) NewKey(name, val string) (*Key, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if inSlice(name, s.keyList) {
|
if inSlice(name, s.keyList) {
|
||||||
s.keys[name].value = val
|
if s.f.options.AllowShadows {
|
||||||
|
if err := s.keys[name].addShadow(val); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s.keys[name].value = val
|
||||||
|
}
|
||||||
return s.keys[name], nil
|
return s.keys[name], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s.keyList = append(s.keyList, name)
|
s.keyList = append(s.keyList, name)
|
||||||
s.keys[name] = &Key{
|
s.keys[name] = newKey(s, name, val)
|
||||||
s: s,
|
|
||||||
name: name,
|
|
||||||
value: val,
|
|
||||||
}
|
|
||||||
s.keysHash[name] = val
|
s.keysHash[name] = val
|
||||||
return s.keys[name], nil
|
return s.keys[name], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewBooleanKey creates a new boolean type key to given section.
|
||||||
|
func (s *Section) NewBooleanKey(name string) (*Key, error) {
|
||||||
|
key, err := s.NewKey(name, "true")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
key.isBooleanType = true
|
||||||
|
return key, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetKey returns key in section by given name.
|
// GetKey returns key in section by given name.
|
||||||
func (s *Section) GetKey(name string) (*Key, error) {
|
func (s *Section) GetKey(name string) (*Key, error) {
|
||||||
// FIXME: change to section level lock?
|
// FIXME: change to section level lock?
|
||||||
|
|
39
vendor/github.com/go-ini/ini/struct.go
generated
vendored
39
vendor/github.com/go-ini/ini/struct.go
generated
vendored
|
@ -78,8 +78,14 @@ func parseDelim(actual string) string {
|
||||||
var reflectTime = reflect.TypeOf(time.Now()).Kind()
|
var reflectTime = reflect.TypeOf(time.Now()).Kind()
|
||||||
|
|
||||||
// setSliceWithProperType sets proper values to slice based on its type.
|
// setSliceWithProperType sets proper values to slice based on its type.
|
||||||
func setSliceWithProperType(key *Key, field reflect.Value, delim string) error {
|
func setSliceWithProperType(key *Key, field reflect.Value, delim string, allowShadow bool) error {
|
||||||
strs := key.Strings(delim)
|
var strs []string
|
||||||
|
if allowShadow {
|
||||||
|
strs = key.StringsWithShadows(delim)
|
||||||
|
} else {
|
||||||
|
strs = key.Strings(delim)
|
||||||
|
}
|
||||||
|
|
||||||
numVals := len(strs)
|
numVals := len(strs)
|
||||||
if numVals == 0 {
|
if numVals == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
@ -92,9 +98,9 @@ func setSliceWithProperType(key *Key, field reflect.Value, delim string) error {
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
vals = strs
|
vals = strs
|
||||||
case reflect.Int:
|
case reflect.Int:
|
||||||
vals = key.Ints(delim)
|
vals, _ = key.parseInts(strs, true, false)
|
||||||
case reflect.Int64:
|
case reflect.Int64:
|
||||||
vals = key.Int64s(delim)
|
vals, _ = key.parseInt64s(strs, true, false)
|
||||||
case reflect.Uint:
|
case reflect.Uint:
|
||||||
vals = key.Uints(delim)
|
vals = key.Uints(delim)
|
||||||
case reflect.Uint64:
|
case reflect.Uint64:
|
||||||
|
@ -133,7 +139,7 @@ func setSliceWithProperType(key *Key, field reflect.Value, delim string) error {
|
||||||
// setWithProperType sets proper value to field based on its type,
|
// setWithProperType sets proper value to field based on its type,
|
||||||
// but it does not return error for failing parsing,
|
// but it does not return error for failing parsing,
|
||||||
// because we want to use default value that is already assigned to strcut.
|
// because we want to use default value that is already assigned to strcut.
|
||||||
func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string) error {
|
func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string, allowShadow bool) error {
|
||||||
switch t.Kind() {
|
switch t.Kind() {
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
if len(key.String()) == 0 {
|
if len(key.String()) == 0 {
|
||||||
|
@ -174,7 +180,7 @@ func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim stri
|
||||||
}
|
}
|
||||||
field.SetUint(uintVal)
|
field.SetUint(uintVal)
|
||||||
|
|
||||||
case reflect.Float64:
|
case reflect.Float32, reflect.Float64:
|
||||||
floatVal, err := key.Float64()
|
floatVal, err := key.Float64()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
|
@ -187,13 +193,25 @@ func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim stri
|
||||||
}
|
}
|
||||||
field.Set(reflect.ValueOf(timeVal))
|
field.Set(reflect.ValueOf(timeVal))
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
return setSliceWithProperType(key, field, delim)
|
return setSliceWithProperType(key, field, delim, allowShadow)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unsupported type '%s'", t)
|
return fmt.Errorf("unsupported type '%s'", t)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseTagOptions(tag string) (rawName string, omitEmpty bool, allowShadow bool) {
|
||||||
|
opts := strings.SplitN(tag, ",", 3)
|
||||||
|
rawName = opts[0]
|
||||||
|
if len(opts) > 1 {
|
||||||
|
omitEmpty = opts[1] == "omitempty"
|
||||||
|
}
|
||||||
|
if len(opts) > 2 {
|
||||||
|
allowShadow = opts[2] == "allowshadow"
|
||||||
|
}
|
||||||
|
return rawName, omitEmpty, allowShadow
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Section) mapTo(val reflect.Value) error {
|
func (s *Section) mapTo(val reflect.Value) error {
|
||||||
if val.Kind() == reflect.Ptr {
|
if val.Kind() == reflect.Ptr {
|
||||||
val = val.Elem()
|
val = val.Elem()
|
||||||
|
@ -209,8 +227,8 @@ func (s *Section) mapTo(val reflect.Value) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := strings.SplitN(tag, ",", 2) // strip off possible omitempty
|
rawName, _, allowShadow := parseTagOptions(tag)
|
||||||
fieldName := s.parseFieldName(tpField.Name, opts[0])
|
fieldName := s.parseFieldName(tpField.Name, rawName)
|
||||||
if len(fieldName) == 0 || !field.CanSet() {
|
if len(fieldName) == 0 || !field.CanSet() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -231,7 +249,8 @@ func (s *Section) mapTo(val reflect.Value) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if key, err := s.GetKey(fieldName); err == nil {
|
if key, err := s.GetKey(fieldName); err == nil {
|
||||||
if err = setWithProperType(tpField.Type, key, field, parseDelim(tpField.Tag.Get("delim"))); err != nil {
|
delim := parseDelim(tpField.Tag.Get("delim"))
|
||||||
|
if err = setWithProperType(tpField.Type, key, field, delim, allowShadow); err != nil {
|
||||||
return fmt.Errorf("error mapping field(%s): %v", fieldName, err)
|
return fmt.Errorf("error mapping field(%s): %v", fieldName, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
3
vendor/github.com/golang/protobuf/AUTHORS
generated
vendored
Normal file
3
vendor/github.com/golang/protobuf/AUTHORS
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# This source code refers to The Go Authors for copyright purposes.
|
||||||
|
# The master list of authors is in the main Go distribution,
|
||||||
|
# visible at http://tip.golang.org/AUTHORS.
|
3
vendor/github.com/golang/protobuf/CONTRIBUTORS
generated
vendored
Normal file
3
vendor/github.com/golang/protobuf/CONTRIBUTORS
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# This source code was written by the Go contributors.
|
||||||
|
# The master list of contributors is in the main Go distribution,
|
||||||
|
# visible at http://tip.golang.org/CONTRIBUTORS.
|
199
vendor/github.com/golang/protobuf/README.md
generated
vendored
199
vendor/github.com/golang/protobuf/README.md
generated
vendored
|
@ -1,199 +0,0 @@
|
||||||
# Go support for Protocol Buffers
|
|
||||||
|
|
||||||
Google's data interchange format.
|
|
||||||
Copyright 2010 The Go Authors.
|
|
||||||
https://github.com/golang/protobuf
|
|
||||||
|
|
||||||
This package and the code it generates requires at least Go 1.4.
|
|
||||||
|
|
||||||
This software implements Go bindings for protocol buffers. For
|
|
||||||
information about protocol buffers themselves, see
|
|
||||||
https://developers.google.com/protocol-buffers/
|
|
||||||
|
|
||||||
## Installation ##
|
|
||||||
|
|
||||||
To use this software, you must:
|
|
||||||
- Install the standard C++ implementation of protocol buffers from
|
|
||||||
https://developers.google.com/protocol-buffers/
|
|
||||||
- Of course, install the Go compiler and tools from
|
|
||||||
https://golang.org/
|
|
||||||
See
|
|
||||||
https://golang.org/doc/install
|
|
||||||
for details or, if you are using gccgo, follow the instructions at
|
|
||||||
https://golang.org/doc/install/gccgo
|
|
||||||
- Grab the code from the repository and install the proto package.
|
|
||||||
The simplest way is to run `go get -u github.com/golang/protobuf/{proto,protoc-gen-go}`.
|
|
||||||
The compiler plugin, protoc-gen-go, will be installed in $GOBIN,
|
|
||||||
defaulting to $GOPATH/bin. It must be in your $PATH for the protocol
|
|
||||||
compiler, protoc, to find it.
|
|
||||||
|
|
||||||
This software has two parts: a 'protocol compiler plugin' that
|
|
||||||
generates Go source files that, once compiled, can access and manage
|
|
||||||
protocol buffers; and a library that implements run-time support for
|
|
||||||
encoding (marshaling), decoding (unmarshaling), and accessing protocol
|
|
||||||
buffers.
|
|
||||||
|
|
||||||
There is support for gRPC in Go using protocol buffers.
|
|
||||||
See the note at the bottom of this file for details.
|
|
||||||
|
|
||||||
There are no insertion points in the plugin.
|
|
||||||
|
|
||||||
|
|
||||||
## Using protocol buffers with Go ##
|
|
||||||
|
|
||||||
Once the software is installed, there are two steps to using it.
|
|
||||||
First you must compile the protocol buffer definitions and then import
|
|
||||||
them, with the support library, into your program.
|
|
||||||
|
|
||||||
To compile the protocol buffer definition, run protoc with the --go_out
|
|
||||||
parameter set to the directory you want to output the Go code to.
|
|
||||||
|
|
||||||
protoc --go_out=. *.proto
|
|
||||||
|
|
||||||
The generated files will be suffixed .pb.go. See the Test code below
|
|
||||||
for an example using such a file.
|
|
||||||
|
|
||||||
|
|
||||||
The package comment for the proto library contains text describing
|
|
||||||
the interface provided in Go for protocol buffers. Here is an edited
|
|
||||||
version.
|
|
||||||
|
|
||||||
==========
|
|
||||||
|
|
||||||
The proto package converts data structures to and from the
|
|
||||||
wire format of protocol buffers. It works in concert with the
|
|
||||||
Go source code generated for .proto files by the protocol compiler.
|
|
||||||
|
|
||||||
A summary of the properties of the protocol buffer interface
|
|
||||||
for a protocol buffer variable v:
|
|
||||||
|
|
||||||
- Names are turned from camel_case to CamelCase for export.
|
|
||||||
- There are no methods on v to set fields; just treat
|
|
||||||
them as structure fields.
|
|
||||||
- There are getters that return a field's value if set,
|
|
||||||
and return the field's default value if unset.
|
|
||||||
The getters work even if the receiver is a nil message.
|
|
||||||
- The zero value for a struct is its correct initialization state.
|
|
||||||
All desired fields must be set before marshaling.
|
|
||||||
- A Reset() method will restore a protobuf struct to its zero state.
|
|
||||||
- Non-repeated fields are pointers to the values; nil means unset.
|
|
||||||
That is, optional or required field int32 f becomes F *int32.
|
|
||||||
- Repeated fields are slices.
|
|
||||||
- Helper functions are available to aid the setting of fields.
|
|
||||||
Helpers for getting values are superseded by the
|
|
||||||
GetFoo methods and their use is deprecated.
|
|
||||||
msg.Foo = proto.String("hello") // set field
|
|
||||||
- Constants are defined to hold the default values of all fields that
|
|
||||||
have them. They have the form Default_StructName_FieldName.
|
|
||||||
Because the getter methods handle defaulted values,
|
|
||||||
direct use of these constants should be rare.
|
|
||||||
- Enums are given type names and maps from names to values.
|
|
||||||
Enum values are prefixed with the enum's type name. Enum types have
|
|
||||||
a String method, and a Enum method to assist in message construction.
|
|
||||||
- Nested groups and enums have type names prefixed with the name of
|
|
||||||
the surrounding message type.
|
|
||||||
- Extensions are given descriptor names that start with E_,
|
|
||||||
followed by an underscore-delimited list of the nested messages
|
|
||||||
that contain it (if any) followed by the CamelCased name of the
|
|
||||||
extension field itself. HasExtension, ClearExtension, GetExtension
|
|
||||||
and SetExtension are functions for manipulating extensions.
|
|
||||||
- Oneof field sets are given a single field in their message,
|
|
||||||
with distinguished wrapper types for each possible field value.
|
|
||||||
- Marshal and Unmarshal are functions to encode and decode the wire format.
|
|
||||||
|
|
||||||
When the .proto file specifies `syntax="proto3"`, there are some differences:
|
|
||||||
|
|
||||||
- Non-repeated fields of non-message type are values instead of pointers.
|
|
||||||
- Getters are only generated for message and oneof fields.
|
|
||||||
- Enum types do not get an Enum method.
|
|
||||||
|
|
||||||
Consider file test.proto, containing
|
|
||||||
|
|
||||||
```proto
|
|
||||||
package example;
|
|
||||||
|
|
||||||
enum FOO { X = 17; };
|
|
||||||
|
|
||||||
message Test {
|
|
||||||
required string label = 1;
|
|
||||||
optional int32 type = 2 [default=77];
|
|
||||||
repeated int64 reps = 3;
|
|
||||||
optional group OptionalGroup = 4 {
|
|
||||||
required string RequiredField = 5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
To create and play with a Test object from the example package,
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/golang/protobuf/proto"
|
|
||||||
"path/to/example"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
test := &example.Test {
|
|
||||||
Label: proto.String("hello"),
|
|
||||||
Type: proto.Int32(17),
|
|
||||||
Reps: []int64{1, 2, 3},
|
|
||||||
Optionalgroup: &example.Test_OptionalGroup {
|
|
||||||
RequiredField: proto.String("good bye"),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
data, err := proto.Marshal(test)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("marshaling error: ", err)
|
|
||||||
}
|
|
||||||
newTest := &example.Test{}
|
|
||||||
err = proto.Unmarshal(data, newTest)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("unmarshaling error: ", err)
|
|
||||||
}
|
|
||||||
// Now test and newTest contain the same data.
|
|
||||||
if test.GetLabel() != newTest.GetLabel() {
|
|
||||||
log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel())
|
|
||||||
}
|
|
||||||
// etc.
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Parameters ##
|
|
||||||
|
|
||||||
To pass extra parameters to the plugin, use a comma-separated
|
|
||||||
parameter list separated from the output directory by a colon:
|
|
||||||
|
|
||||||
|
|
||||||
protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto
|
|
||||||
|
|
||||||
|
|
||||||
- `import_prefix=xxx` - a prefix that is added onto the beginning of
|
|
||||||
all imports. Useful for things like generating protos in a
|
|
||||||
subdirectory, or regenerating vendored protobufs in-place.
|
|
||||||
- `import_path=foo/bar` - used as the package if no input files
|
|
||||||
declare `go_package`. If it contains slashes, everything up to the
|
|
||||||
rightmost slash is ignored.
|
|
||||||
- `plugins=plugin1+plugin2` - specifies the list of sub-plugins to
|
|
||||||
load. The only plugin in this repo is `grpc`.
|
|
||||||
- `Mfoo/bar.proto=quux/shme` - declares that foo/bar.proto is
|
|
||||||
associated with Go package quux/shme. This is subject to the
|
|
||||||
import_prefix parameter.
|
|
||||||
|
|
||||||
## gRPC Support ##
|
|
||||||
|
|
||||||
If a proto file specifies RPC services, protoc-gen-go can be instructed to
|
|
||||||
generate code compatible with gRPC (http://www.grpc.io/). To do this, pass
|
|
||||||
the `plugins` parameter to protoc-gen-go; the usual way is to insert it into
|
|
||||||
the --go_out argument to protoc:
|
|
||||||
|
|
||||||
protoc --go_out=plugins=grpc:. *.proto
|
|
||||||
|
|
||||||
## Plugins ##
|
|
||||||
|
|
||||||
The `protoc-gen-go/generator` package exposes a plugin interface,
|
|
||||||
which is used by the gRPC code generation. This interface is not
|
|
||||||
supported and is subject to incompatible changes without notice.
|
|
43
vendor/github.com/golang/protobuf/proto/Makefile
generated
vendored
Normal file
43
vendor/github.com/golang/protobuf/proto/Makefile
generated
vendored
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
# Go support for Protocol Buffers - Google's data interchange format
|
||||||
|
#
|
||||||
|
# Copyright 2010 The Go Authors. All rights reserved.
|
||||||
|
# https://github.com/golang/protobuf
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above
|
||||||
|
# copyright notice, this list of conditions and the following disclaimer
|
||||||
|
# in the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# * Neither the name of Google Inc. nor the names of its
|
||||||
|
# contributors may be used to endorse or promote products derived from
|
||||||
|
# this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
install:
|
||||||
|
go install
|
||||||
|
|
||||||
|
test: install generate-test-pbs
|
||||||
|
go test
|
||||||
|
|
||||||
|
|
||||||
|
generate-test-pbs:
|
||||||
|
make install
|
||||||
|
make -C testdata
|
||||||
|
protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto
|
||||||
|
make
|
19
vendor/github.com/gorilla/context/.travis.yml
generated
vendored
Normal file
19
vendor/github.com/gorilla/context/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
language: go
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- go: 1.3
|
||||||
|
- go: 1.4
|
||||||
|
- go: 1.5
|
||||||
|
- go: 1.6
|
||||||
|
- go: 1.7
|
||||||
|
- go: tip
|
||||||
|
allow_failures:
|
||||||
|
- go: tip
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go get -t -v ./...
|
||||||
|
- diff -u <(echo -n) <(gofmt -d .)
|
||||||
|
- go vet $(go list ./... | grep -v /vendor/)
|
||||||
|
- go test -v -race ./...
|
27
vendor/github.com/gorilla/context/LICENSE
generated
vendored
Normal file
27
vendor/github.com/gorilla/context/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following disclaimer
|
||||||
|
in the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of Google Inc. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
10
vendor/github.com/gorilla/context/README.md
generated
vendored
Normal file
10
vendor/github.com/gorilla/context/README.md
generated
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
context
|
||||||
|
=======
|
||||||
|
[![Build Status](https://travis-ci.org/gorilla/context.png?branch=master)](https://travis-ci.org/gorilla/context)
|
||||||
|
|
||||||
|
gorilla/context is a general purpose registry for global request variables.
|
||||||
|
|
||||||
|
> Note: gorilla/context, having been born well before `context.Context` existed, does not play well
|
||||||
|
> with the shallow copying of the request that [`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext) (added to net/http Go 1.7 onwards) performs. You should either use *just* gorilla/context, or moving forward, the new `http.Request.Context()`.
|
||||||
|
|
||||||
|
Read the full documentation here: http://www.gorillatoolkit.org/pkg/context
|
143
vendor/github.com/gorilla/context/context.go
generated
vendored
Normal file
143
vendor/github.com/gorilla/context/context.go
generated
vendored
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
// Copyright 2012 The Gorilla 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 context
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
mutex sync.RWMutex
|
||||||
|
data = make(map[*http.Request]map[interface{}]interface{})
|
||||||
|
datat = make(map[*http.Request]int64)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Set stores a value for a given key in a given request.
|
||||||
|
func Set(r *http.Request, key, val interface{}) {
|
||||||
|
mutex.Lock()
|
||||||
|
if data[r] == nil {
|
||||||
|
data[r] = make(map[interface{}]interface{})
|
||||||
|
datat[r] = time.Now().Unix()
|
||||||
|
}
|
||||||
|
data[r][key] = val
|
||||||
|
mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns a value stored for a given key in a given request.
|
||||||
|
func Get(r *http.Request, key interface{}) interface{} {
|
||||||
|
mutex.RLock()
|
||||||
|
if ctx := data[r]; ctx != nil {
|
||||||
|
value := ctx[key]
|
||||||
|
mutex.RUnlock()
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
mutex.RUnlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOk returns stored value and presence state like multi-value return of map access.
|
||||||
|
func GetOk(r *http.Request, key interface{}) (interface{}, bool) {
|
||||||
|
mutex.RLock()
|
||||||
|
if _, ok := data[r]; ok {
|
||||||
|
value, ok := data[r][key]
|
||||||
|
mutex.RUnlock()
|
||||||
|
return value, ok
|
||||||
|
}
|
||||||
|
mutex.RUnlock()
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAll returns all stored values for the request as a map. Nil is returned for invalid requests.
|
||||||
|
func GetAll(r *http.Request) map[interface{}]interface{} {
|
||||||
|
mutex.RLock()
|
||||||
|
if context, ok := data[r]; ok {
|
||||||
|
result := make(map[interface{}]interface{}, len(context))
|
||||||
|
for k, v := range context {
|
||||||
|
result[k] = v
|
||||||
|
}
|
||||||
|
mutex.RUnlock()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
mutex.RUnlock()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllOk returns all stored values for the request as a map and a boolean value that indicates if
|
||||||
|
// the request was registered.
|
||||||
|
func GetAllOk(r *http.Request) (map[interface{}]interface{}, bool) {
|
||||||
|
mutex.RLock()
|
||||||
|
context, ok := data[r]
|
||||||
|
result := make(map[interface{}]interface{}, len(context))
|
||||||
|
for k, v := range context {
|
||||||
|
result[k] = v
|
||||||
|
}
|
||||||
|
mutex.RUnlock()
|
||||||
|
return result, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete removes a value stored for a given key in a given request.
|
||||||
|
func Delete(r *http.Request, key interface{}) {
|
||||||
|
mutex.Lock()
|
||||||
|
if data[r] != nil {
|
||||||
|
delete(data[r], key)
|
||||||
|
}
|
||||||
|
mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear removes all values stored for a given request.
|
||||||
|
//
|
||||||
|
// This is usually called by a handler wrapper to clean up request
|
||||||
|
// variables at the end of a request lifetime. See ClearHandler().
|
||||||
|
func Clear(r *http.Request) {
|
||||||
|
mutex.Lock()
|
||||||
|
clear(r)
|
||||||
|
mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear is Clear without the lock.
|
||||||
|
func clear(r *http.Request) {
|
||||||
|
delete(data, r)
|
||||||
|
delete(datat, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Purge removes request data stored for longer than maxAge, in seconds.
|
||||||
|
// It returns the amount of requests removed.
|
||||||
|
//
|
||||||
|
// If maxAge <= 0, all request data is removed.
|
||||||
|
//
|
||||||
|
// This is only used for sanity check: in case context cleaning was not
|
||||||
|
// properly set some request data can be kept forever, consuming an increasing
|
||||||
|
// amount of memory. In case this is detected, Purge() must be called
|
||||||
|
// periodically until the problem is fixed.
|
||||||
|
func Purge(maxAge int) int {
|
||||||
|
mutex.Lock()
|
||||||
|
count := 0
|
||||||
|
if maxAge <= 0 {
|
||||||
|
count = len(data)
|
||||||
|
data = make(map[*http.Request]map[interface{}]interface{})
|
||||||
|
datat = make(map[*http.Request]int64)
|
||||||
|
} else {
|
||||||
|
min := time.Now().Unix() - int64(maxAge)
|
||||||
|
for r := range data {
|
||||||
|
if datat[r] < min {
|
||||||
|
clear(r)
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mutex.Unlock()
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClearHandler wraps an http.Handler and clears request values at the end
|
||||||
|
// of a request lifetime.
|
||||||
|
func ClearHandler(h http.Handler) http.Handler {
|
||||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
defer Clear(r)
|
||||||
|
h.ServeHTTP(w, r)
|
||||||
|
})
|
||||||
|
}
|
88
vendor/github.com/gorilla/context/doc.go
generated
vendored
Normal file
88
vendor/github.com/gorilla/context/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
// Copyright 2012 The Gorilla 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 context stores values shared during a request lifetime.
|
||||||
|
|
||||||
|
Note: gorilla/context, having been born well before `context.Context` existed,
|
||||||
|
does not play well > with the shallow copying of the request that
|
||||||
|
[`http.Request.WithContext`](https://golang.org/pkg/net/http/#Request.WithContext)
|
||||||
|
(added to net/http Go 1.7 onwards) performs. You should either use *just*
|
||||||
|
gorilla/context, or moving forward, the new `http.Request.Context()`.
|
||||||
|
|
||||||
|
For example, a router can set variables extracted from the URL and later
|
||||||
|
application handlers can access those values, or it can be used to store
|
||||||
|
sessions values to be saved at the end of a request. There are several
|
||||||
|
others common uses.
|
||||||
|
|
||||||
|
The idea was posted by Brad Fitzpatrick to the go-nuts mailing list:
|
||||||
|
|
||||||
|
http://groups.google.com/group/golang-nuts/msg/e2d679d303aa5d53
|
||||||
|
|
||||||
|
Here's the basic usage: first define the keys that you will need. The key
|
||||||
|
type is interface{} so a key can be of any type that supports equality.
|
||||||
|
Here we define a key using a custom int type to avoid name collisions:
|
||||||
|
|
||||||
|
package foo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gorilla/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
type key int
|
||||||
|
|
||||||
|
const MyKey key = 0
|
||||||
|
|
||||||
|
Then set a variable. Variables are bound to an http.Request object, so you
|
||||||
|
need a request instance to set a value:
|
||||||
|
|
||||||
|
context.Set(r, MyKey, "bar")
|
||||||
|
|
||||||
|
The application can later access the variable using the same key you provided:
|
||||||
|
|
||||||
|
func MyHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// val is "bar".
|
||||||
|
val := context.Get(r, foo.MyKey)
|
||||||
|
|
||||||
|
// returns ("bar", true)
|
||||||
|
val, ok := context.GetOk(r, foo.MyKey)
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
And that's all about the basic usage. We discuss some other ideas below.
|
||||||
|
|
||||||
|
Any type can be stored in the context. To enforce a given type, make the key
|
||||||
|
private and wrap Get() and Set() to accept and return values of a specific
|
||||||
|
type:
|
||||||
|
|
||||||
|
type key int
|
||||||
|
|
||||||
|
const mykey key = 0
|
||||||
|
|
||||||
|
// GetMyKey returns a value for this package from the request values.
|
||||||
|
func GetMyKey(r *http.Request) SomeType {
|
||||||
|
if rv := context.Get(r, mykey); rv != nil {
|
||||||
|
return rv.(SomeType)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMyKey sets a value for this package in the request values.
|
||||||
|
func SetMyKey(r *http.Request, val SomeType) {
|
||||||
|
context.Set(r, mykey, val)
|
||||||
|
}
|
||||||
|
|
||||||
|
Variables must be cleared at the end of a request, to remove all values
|
||||||
|
that were stored. This can be done in an http.Handler, after a request was
|
||||||
|
served. Just call Clear() passing the request:
|
||||||
|
|
||||||
|
context.Clear(r)
|
||||||
|
|
||||||
|
...or use ClearHandler(), which conveniently wraps an http.Handler to clear
|
||||||
|
variables at the end of a request lifetime.
|
||||||
|
|
||||||
|
The Routers from the packages gorilla/mux and gorilla/pat call Clear()
|
||||||
|
so if you are using either of them you don't need to clear the context manually.
|
||||||
|
*/
|
||||||
|
package context
|
8
vendor/github.com/gorilla/handlers/.travis.yml
generated
vendored
Normal file
8
vendor/github.com/gorilla/handlers/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.1
|
||||||
|
- 1.2
|
||||||
|
- 1.3
|
||||||
|
- 1.4
|
||||||
|
- tip
|
22
vendor/github.com/gorilla/mux/.travis.yml
generated
vendored
Normal file
22
vendor/github.com/gorilla/mux/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
language: go
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- go: 1.2
|
||||||
|
- go: 1.3
|
||||||
|
- go: 1.4
|
||||||
|
- go: 1.5
|
||||||
|
- go: 1.6
|
||||||
|
- go: 1.7
|
||||||
|
- go: 1.8
|
||||||
|
- go: tip
|
||||||
|
|
||||||
|
install:
|
||||||
|
- # Skip
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go get -t -v ./...
|
||||||
|
- diff -u <(echo -n) <(gofmt -d .)
|
||||||
|
- go tool vet .
|
||||||
|
- go test -v -race ./...
|
4
vendor/github.com/jmespath/go-jmespath/.gitignore
generated
vendored
Normal file
4
vendor/github.com/jmespath/go-jmespath/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/jpgo
|
||||||
|
jmespath-fuzz.zip
|
||||||
|
cpu.out
|
||||||
|
go-jmespath.test
|
9
vendor/github.com/jmespath/go-jmespath/.travis.yml
generated
vendored
Normal file
9
vendor/github.com/jmespath/go-jmespath/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
language: go
|
||||||
|
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.4
|
||||||
|
|
||||||
|
install: go get -v -t ./...
|
||||||
|
script: make test
|
44
vendor/github.com/jmespath/go-jmespath/Makefile
generated
vendored
Normal file
44
vendor/github.com/jmespath/go-jmespath/Makefile
generated
vendored
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
|
||||||
|
CMD = jpgo
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Please use \`make <target>' where <target> is one of"
|
||||||
|
@echo " test to run all the tests"
|
||||||
|
@echo " build to build the library and jp executable"
|
||||||
|
@echo " generate to run codegen"
|
||||||
|
|
||||||
|
|
||||||
|
generate:
|
||||||
|
go generate ./...
|
||||||
|
|
||||||
|
build:
|
||||||
|
rm -f $(CMD)
|
||||||
|
go build ./...
|
||||||
|
rm -f cmd/$(CMD)/$(CMD) && cd cmd/$(CMD)/ && go build ./...
|
||||||
|
mv cmd/$(CMD)/$(CMD) .
|
||||||
|
|
||||||
|
test:
|
||||||
|
go test -v ./...
|
||||||
|
|
||||||
|
check:
|
||||||
|
go vet ./...
|
||||||
|
@echo "golint ./..."
|
||||||
|
@lint=`golint ./...`; \
|
||||||
|
lint=`echo "$$lint" | grep -v "astnodetype_string.go" | grep -v "toktype_string.go"`; \
|
||||||
|
echo "$$lint"; \
|
||||||
|
if [ "$$lint" != "" ]; then exit 1; fi
|
||||||
|
|
||||||
|
htmlc:
|
||||||
|
go test -coverprofile="/tmp/jpcov" && go tool cover -html="/tmp/jpcov" && unlink /tmp/jpcov
|
||||||
|
|
||||||
|
buildfuzz:
|
||||||
|
go-fuzz-build github.com/jmespath/go-jmespath/fuzz
|
||||||
|
|
||||||
|
fuzz: buildfuzz
|
||||||
|
go-fuzz -bin=./jmespath-fuzz.zip -workdir=fuzz/testdata
|
||||||
|
|
||||||
|
bench:
|
||||||
|
go test -bench . -cpuprofile cpu.out
|
||||||
|
|
||||||
|
pprof-cpu:
|
||||||
|
go tool pprof ./go-jmespath.test ./cpu.out
|
18
vendor/github.com/marstr/guid/.travis.yml
generated
vendored
Normal file
18
vendor/github.com/marstr/guid/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.7
|
||||||
|
- 1.8
|
||||||
|
|
||||||
|
install:
|
||||||
|
- go get -u github.com/golang/lint/golint
|
||||||
|
- go get -u github.com/HewlettPackard/gas
|
||||||
|
|
||||||
|
script:
|
||||||
|
- golint --set_exit_status
|
||||||
|
- go vet
|
||||||
|
- go test -v -cover -race
|
||||||
|
- go test -bench .
|
||||||
|
- gas ./...
|
20
vendor/github.com/matttproud/golang_protobuf_extensions/README.md
generated
vendored
20
vendor/github.com/matttproud/golang_protobuf_extensions/README.md
generated
vendored
|
@ -1,20 +0,0 @@
|
||||||
# Overview
|
|
||||||
This repository provides various Protocol Buffer extensions for the Go
|
|
||||||
language (golang), namely support for record length-delimited message
|
|
||||||
streaming.
|
|
||||||
|
|
||||||
| Java | Go |
|
|
||||||
| ------------------------------ | --------------------- |
|
|
||||||
| MessageLite#parseDelimitedFrom | pbutil.ReadDelimited |
|
|
||||||
| MessageLite#writeDelimitedTo | pbutil.WriteDelimited |
|
|
||||||
|
|
||||||
Because [Code Review 9102043](https://codereview.appspot.com/9102043/) is
|
|
||||||
destined to never be merged into mainline (i.e., never be promoted to formal
|
|
||||||
[goprotobuf features](https://github.com/golang/protobuf)), this repository
|
|
||||||
will live here in the wild.
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
We have [generated Go Doc documentation](http://godoc.org/github.com/matttproud/golang_protobuf_extensions/pbutil) here.
|
|
||||||
|
|
||||||
# Testing
|
|
||||||
[![Build Status](https://travis-ci.org/matttproud/golang_protobuf_extensions.png?branch=master)](https://travis-ci.org/matttproud/golang_protobuf_extensions)
|
|
1
vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore
generated
vendored
Normal file
1
vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
cover.dat
|
7
vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile
generated
vendored
Normal file
7
vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
all:
|
||||||
|
|
||||||
|
cover:
|
||||||
|
go test -cover -v -coverprofile=cover.dat ./...
|
||||||
|
go tool cover -func cover.dat
|
||||||
|
|
||||||
|
.PHONY: cover
|
7
vendor/github.com/mitchellh/mapstructure/.travis.yml
generated
vendored
Normal file
7
vendor/github.com/mitchellh/mapstructure/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.4
|
||||||
|
|
||||||
|
script:
|
||||||
|
- go test
|
4
vendor/github.com/ncw/swift/.gitignore
generated
vendored
Normal file
4
vendor/github.com/ncw/swift/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
*~
|
||||||
|
*.pyc
|
||||||
|
test-env*
|
||||||
|
junk/
|
33
vendor/github.com/ncw/swift/.travis.yml
generated
vendored
Normal file
33
vendor/github.com/ncw/swift/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
language: go
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.1.x
|
||||||
|
- 1.2.x
|
||||||
|
- 1.3.x
|
||||||
|
- 1.4.x
|
||||||
|
- 1.5.x
|
||||||
|
- 1.6.x
|
||||||
|
- 1.7.x
|
||||||
|
- 1.8.x
|
||||||
|
- 1.9.x
|
||||||
|
- 1.10.x
|
||||||
|
- 1.11.x
|
||||||
|
- master
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- go: 1.11.x
|
||||||
|
env: TEST_REAL_SERVER=rackspace
|
||||||
|
- go: 1.11.x
|
||||||
|
env: TEST_REAL_SERVER=memset
|
||||||
|
allow_failures:
|
||||||
|
- go: 1.11.x
|
||||||
|
env: TEST_REAL_SERVER=rackspace
|
||||||
|
- go: 1.11.x
|
||||||
|
env: TEST_REAL_SERVER=memset
|
||||||
|
install: go test -i ./...
|
||||||
|
script:
|
||||||
|
- test -z "$(go fmt ./...)"
|
||||||
|
- go test
|
||||||
|
- ./travis_realserver.sh
|
55
vendor/github.com/ncw/swift/notes.txt
generated
vendored
Normal file
55
vendor/github.com/ncw/swift/notes.txt
generated
vendored
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
Notes on Go Swift
|
||||||
|
=================
|
||||||
|
|
||||||
|
Make a builder style interface like the Google Go APIs? Advantages
|
||||||
|
are that it is easy to add named methods to the service object to do
|
||||||
|
specific things. Slightly less efficient. Not sure about how to
|
||||||
|
return extra stuff though - in an object?
|
||||||
|
|
||||||
|
Make a container struct so these could be methods on it?
|
||||||
|
|
||||||
|
Make noResponse check for 204?
|
||||||
|
|
||||||
|
Make storage public so it can be extended easily?
|
||||||
|
|
||||||
|
Rename to go-swift to match user agent string?
|
||||||
|
|
||||||
|
Reconnect on auth error - 401 when token expires isn't tested
|
||||||
|
|
||||||
|
Make more api compatible with python cloudfiles?
|
||||||
|
|
||||||
|
Retry operations on timeout / network errors?
|
||||||
|
- also 408 error
|
||||||
|
- GET requests only?
|
||||||
|
|
||||||
|
Make Connection thread safe - whenever it is changed take a write lock whenever it is read from a read lock
|
||||||
|
|
||||||
|
Add extra headers field to Connection (for via etc)
|
||||||
|
|
||||||
|
Make errors use an error heirachy then can catch them with a type assertion
|
||||||
|
|
||||||
|
Error(...)
|
||||||
|
ObjectCorrupted{ Error }
|
||||||
|
|
||||||
|
Make a Debug flag in connection for logging stuff
|
||||||
|
|
||||||
|
Object If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since etc
|
||||||
|
|
||||||
|
Object range
|
||||||
|
|
||||||
|
Object create, update with X-Delete-At or X-Delete-After
|
||||||
|
|
||||||
|
Large object support
|
||||||
|
- check uploads are less than 5GB in normal mode?
|
||||||
|
|
||||||
|
Access control CORS?
|
||||||
|
|
||||||
|
Swift client retries and backs off for all types of errors
|
||||||
|
|
||||||
|
Implement net error interface?
|
||||||
|
|
||||||
|
type Error interface {
|
||||||
|
error
|
||||||
|
Timeout() bool // Is the error a timeout?
|
||||||
|
Temporary() bool // Is the error temporary?
|
||||||
|
}
|
22
vendor/github.com/ncw/swift/travis_realserver.sh
generated
vendored
Normal file
22
vendor/github.com/ncw/swift/travis_realserver.sh
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ "${TRAVIS_PULL_REQUEST}" = "true" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${TEST_REAL_SERVER}" = "rackspace" ] && [ ! -z "${RACKSPACE_APIKEY}" ]; then
|
||||||
|
echo "Running tests pointing to Rackspace"
|
||||||
|
export SWIFT_API_KEY=$RACKSPACE_APIKEY
|
||||||
|
export SWIFT_API_USER=$RACKSPACE_USER
|
||||||
|
export SWIFT_AUTH_URL=$RACKSPACE_AUTH
|
||||||
|
go test ./...
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${TEST_REAL_SERVER}" = "memset" ] && [ ! -z "${MEMSET_APIKEY}" ]; then
|
||||||
|
echo "Running tests pointing to Memset"
|
||||||
|
export SWIFT_API_KEY=$MEMSET_APIKEY
|
||||||
|
export SWIFT_API_USER=$MEMSET_USER
|
||||||
|
export SWIFT_AUTH_URL=$MEMSET_AUTH
|
||||||
|
go test
|
||||||
|
fi
|
12
vendor/github.com/opencontainers/go-digest/.pullapprove.yml
generated
vendored
Normal file
12
vendor/github.com/opencontainers/go-digest/.pullapprove.yml
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
approve_by_comment: true
|
||||||
|
approve_regex: '^(Approved|lgtm|LGTM|:shipit:|:star:|:\+1:|:ship:)'
|
||||||
|
reject_regex: ^Rejected
|
||||||
|
reset_on_push: true
|
||||||
|
author_approval: ignored
|
||||||
|
signed_off_by:
|
||||||
|
required: true
|
||||||
|
reviewers:
|
||||||
|
teams:
|
||||||
|
- go-digest-maintainers
|
||||||
|
name: default
|
||||||
|
required: 2
|
4
vendor/github.com/opencontainers/go-digest/.travis.yml
generated
vendored
Normal file
4
vendor/github.com/opencontainers/go-digest/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
language: go
|
||||||
|
go:
|
||||||
|
- 1.7
|
||||||
|
- master
|
72
vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md
generated
vendored
Normal file
72
vendor/github.com/opencontainers/go-digest/CONTRIBUTING.md
generated
vendored
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
# Contributing to Docker open source projects
|
||||||
|
|
||||||
|
Want to hack on this project? Awesome! Here are instructions to get you started.
|
||||||
|
|
||||||
|
This project is a part of the [Docker](https://www.docker.com) project, and follows
|
||||||
|
the same rules and principles. If you're already familiar with the way
|
||||||
|
Docker does things, you'll feel right at home.
|
||||||
|
|
||||||
|
Otherwise, go read Docker's
|
||||||
|
[contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md),
|
||||||
|
[issue triaging](https://github.com/docker/docker/blob/master/project/ISSUE-TRIAGE.md),
|
||||||
|
[review process](https://github.com/docker/docker/blob/master/project/REVIEWING.md) and
|
||||||
|
[branches and tags](https://github.com/docker/docker/blob/master/project/BRANCHES-AND-TAGS.md).
|
||||||
|
|
||||||
|
For an in-depth description of our contribution process, visit the
|
||||||
|
contributors guide: [Understand how to contribute](https://docs.docker.com/opensource/workflow/make-a-contribution/)
|
||||||
|
|
||||||
|
### Sign your work
|
||||||
|
|
||||||
|
The sign-off is a simple line at the end of the explanation for the patch. Your
|
||||||
|
signature certifies that you wrote the patch or otherwise have the right to pass
|
||||||
|
it on as an open-source patch. The rules are pretty simple: if you can certify
|
||||||
|
the below (from [developercertificate.org](http://developercertificate.org/)):
|
||||||
|
|
||||||
|
```
|
||||||
|
Developer Certificate of Origin
|
||||||
|
Version 1.1
|
||||||
|
|
||||||
|
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
||||||
|
1 Letterman Drive
|
||||||
|
Suite D4700
|
||||||
|
San Francisco, CA, 94129
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
Developer's Certificate of Origin 1.1
|
||||||
|
|
||||||
|
By making a contribution to this project, I certify that:
|
||||||
|
|
||||||
|
(a) The contribution was created in whole or in part by me and I
|
||||||
|
have the right to submit it under the open source license
|
||||||
|
indicated in the file; or
|
||||||
|
|
||||||
|
(b) The contribution is based upon previous work that, to the best
|
||||||
|
of my knowledge, is covered under an appropriate open source
|
||||||
|
license and I have the right under that license to submit that
|
||||||
|
work with modifications, whether created in whole or in part
|
||||||
|
by me, under the same open source license (unless I am
|
||||||
|
permitted to submit under a different license), as indicated
|
||||||
|
in the file; or
|
||||||
|
|
||||||
|
(c) The contribution was provided directly to me by some other
|
||||||
|
person who certified (a), (b) or (c) and I have not modified
|
||||||
|
it.
|
||||||
|
|
||||||
|
(d) I understand and agree that this project and the contribution
|
||||||
|
are public and that a record of the contribution (including all
|
||||||
|
personal information I submit with it, including my sign-off) is
|
||||||
|
maintained indefinitely and may be redistributed consistent with
|
||||||
|
this project or the open source license(s) involved.
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you just add a line to every git commit message:
|
||||||
|
|
||||||
|
Signed-off-by: Joe Smith <joe.smith@email.com>
|
||||||
|
|
||||||
|
Use your real name (sorry, no pseudonyms or anonymous contributions.)
|
||||||
|
|
||||||
|
If you set your `user.name` and `user.email` git configs, you can sign your
|
||||||
|
commit automatically with `git commit -s`.
|
7
vendor/github.com/opencontainers/go-digest/MAINTAINERS
generated
vendored
Normal file
7
vendor/github.com/opencontainers/go-digest/MAINTAINERS
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
Brandon Philips <brandon.philips@coreos.com> (@philips)
|
||||||
|
Brendan Burns <bburns@microsoft.com> (@brendandburns)
|
||||||
|
Jason Bouzane <jbouzane@google.com> (@jbouzane)
|
||||||
|
John Starks <jostarks@microsoft.com> (@jstarks)
|
||||||
|
Jonathan Boulle <jon.boulle@coreos.com> (@jonboulle)
|
||||||
|
Stephen Day <stephen.day@docker.com> (@stevvooe)
|
||||||
|
Vincent Batts <vbatts@redhat.com> (@vbatts)
|
167
vendor/github.com/opencontainers/image-spec/README.md
generated
vendored
167
vendor/github.com/opencontainers/image-spec/README.md
generated
vendored
|
@ -1,167 +0,0 @@
|
||||||
# OCI Image Format Specification
|
|
||||||
<div>
|
|
||||||
<a href="https://travis-ci.org/opencontainers/image-spec">
|
|
||||||
<img src="https://travis-ci.org/opencontainers/image-spec.svg?branch=master"></img>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
The OCI Image Format project creates and maintains the software shipping container image format spec (OCI Image Format).
|
|
||||||
|
|
||||||
**[The specification can be found here](spec.md).**
|
|
||||||
|
|
||||||
This repository also provides [Go types](specs-go), [intra-blob validation tooling, and JSON Schema](schema).
|
|
||||||
The Go types and validation should be compatible with the current Go release; earlier Go releases are not supported.
|
|
||||||
|
|
||||||
Additional documentation about how this group operates:
|
|
||||||
|
|
||||||
- [Code of Conduct](https://github.com/opencontainers/tob/blob/d2f9d68c1332870e40693fe077d311e0742bc73d/code-of-conduct.md)
|
|
||||||
- [Roadmap](#roadmap)
|
|
||||||
- [Releases](RELEASES.md)
|
|
||||||
- [Project Documentation](project.md)
|
|
||||||
|
|
||||||
The _optional_ and _base_ layers of all OCI projects are tracked in the [OCI Scope Table](https://www.opencontainers.org/about/oci-scope-table).
|
|
||||||
|
|
||||||
## Running an OCI Image
|
|
||||||
|
|
||||||
The OCI Image Format partner project is the [OCI Runtime Spec project](https://github.com/opencontainers/runtime-spec).
|
|
||||||
The Runtime Specification outlines how to run a "[filesystem bundle](https://github.com/opencontainers/runtime-spec/blob/master/bundle.md)" that is unpacked on disk.
|
|
||||||
At a high-level an OCI implementation would download an OCI Image then unpack that image into an OCI Runtime filesystem bundle.
|
|
||||||
At this point the OCI Runtime Bundle would be run by an OCI Runtime.
|
|
||||||
|
|
||||||
This entire workflow supports the UX that users have come to expect from container engines like Docker and rkt: primarily, the ability to run an image with no additional arguments:
|
|
||||||
|
|
||||||
* docker run example.com/org/app:v1.0.0
|
|
||||||
* rkt run example.com/org/app,version=v1.0.0
|
|
||||||
|
|
||||||
To support this UX the OCI Image Format contains sufficient information to launch the application on the target platform (e.g. command, arguments, environment variables, etc).
|
|
||||||
|
|
||||||
## FAQ
|
|
||||||
|
|
||||||
**Q: Why doesn't this project mention distribution?**
|
|
||||||
|
|
||||||
A: Distribution, for example using HTTP as both Docker v2.2 and AppC do today, is currently out of scope on the [OCI Scope Table](https://www.opencontainers.org/about/oci-scope-table).
|
|
||||||
There has been [some discussion on the TOB mailing list](https://groups.google.com/a/opencontainers.org/d/msg/tob/A3JnmI-D-6Y/tLuptPDHAgAJ) to make distribution an optional layer, but this topic is a work in progress.
|
|
||||||
|
|
||||||
**Q: What happens to AppC or Docker Image Formats?**
|
|
||||||
|
|
||||||
A: Existing formats can continue to be a proving ground for technologies, as needed.
|
|
||||||
The OCI Image Format project strives to provide a dependable open specification that can be shared between different tools and be evolved for years or decades of compatibility; as the deb and rpm format have.
|
|
||||||
|
|
||||||
Find more [FAQ on the OCI site](https://www.opencontainers.org/faq).
|
|
||||||
|
|
||||||
## Roadmap
|
|
||||||
|
|
||||||
The [GitHub milestones](https://github.com/opencontainers/image-spec/milestones) lay out the path to the OCI v1.0.0 release in late 2016.
|
|
||||||
|
|
||||||
# Contributing
|
|
||||||
|
|
||||||
Development happens on GitHub for the spec.
|
|
||||||
Issues are used for bugs and actionable items and longer discussions can happen on the [mailing list](#mailing-list).
|
|
||||||
|
|
||||||
The specification and code is licensed under the Apache 2.0 license found in the `LICENSE` file of this repository.
|
|
||||||
|
|
||||||
## Discuss your design
|
|
||||||
|
|
||||||
The project welcomes submissions, but please let everyone know what you are working on.
|
|
||||||
|
|
||||||
Before undertaking a nontrivial change to this specification, send mail to the [mailing list](#mailing-list) to discuss what you plan to do.
|
|
||||||
This gives everyone a chance to validate the design, helps prevent duplication of effort, and ensures that the idea fits.
|
|
||||||
It also guarantees that the design is sound before code is written; a GitHub pull-request is not the place for high-level discussions.
|
|
||||||
|
|
||||||
Typos and grammatical errors can go straight to a pull-request.
|
|
||||||
When in doubt, start on the [mailing-list](#mailing-list).
|
|
||||||
|
|
||||||
## Weekly Call
|
|
||||||
|
|
||||||
The contributors and maintainers of all OCI projects have a weekly meeting Wednesdays at 2:00 PM (USA Pacific).
|
|
||||||
Everyone is welcome to participate via [UberConference web][UberConference] or audio-only: +1-415-968-0849 (no PIN needed).
|
|
||||||
An initial agenda will be posted to the [mailing list](#mailing-list) earlier in the week, and everyone is welcome to propose additional topics or suggest other agenda alterations there.
|
|
||||||
Minutes are posted to the [mailing list](#mailing-list) and minutes from past calls are archived [here][minutes].
|
|
||||||
|
|
||||||
## Mailing List
|
|
||||||
|
|
||||||
You can subscribe and join the mailing list on [Google Groups](https://groups.google.com/a/opencontainers.org/forum/#!forum/dev).
|
|
||||||
|
|
||||||
## IRC
|
|
||||||
|
|
||||||
OCI discussion happens on #opencontainers on Freenode ([logs][irc-logs]).
|
|
||||||
|
|
||||||
## Markdown style
|
|
||||||
|
|
||||||
To keep consistency throughout the Markdown files in the Open Container spec all files should be formatted one sentence per line.
|
|
||||||
This fixes two things: it makes diffing easier with git and it resolves fights about line wrapping length.
|
|
||||||
For example, this paragraph will span three lines in the Markdown source.
|
|
||||||
|
|
||||||
## Git commit
|
|
||||||
|
|
||||||
### Sign your work
|
|
||||||
|
|
||||||
The sign-off is a simple line at the end of the explanation for the patch, which certifies that you wrote it or otherwise have the right to pass it on as an open-source patch.
|
|
||||||
The rules are pretty simple: if you can certify the below (from [developercertificate.org](http://developercertificate.org/)):
|
|
||||||
|
|
||||||
```
|
|
||||||
Developer Certificate of Origin
|
|
||||||
Version 1.1
|
|
||||||
|
|
||||||
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
|
|
||||||
660 York Street, Suite 102,
|
|
||||||
San Francisco, CA 94110 USA
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies of this
|
|
||||||
license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
|
|
||||||
Developer's Certificate of Origin 1.1
|
|
||||||
|
|
||||||
By making a contribution to this project, I certify that:
|
|
||||||
|
|
||||||
(a) The contribution was created in whole or in part by me and I
|
|
||||||
have the right to submit it under the open source license
|
|
||||||
indicated in the file; or
|
|
||||||
|
|
||||||
(b) The contribution is based upon previous work that, to the best
|
|
||||||
of my knowledge, is covered under an appropriate open source
|
|
||||||
license and I have the right under that license to submit that
|
|
||||||
work with modifications, whether created in whole or in part
|
|
||||||
by me, under the same open source license (unless I am
|
|
||||||
permitted to submit under a different license), as indicated
|
|
||||||
in the file; or
|
|
||||||
|
|
||||||
(c) The contribution was provided directly to me by some other
|
|
||||||
person who certified (a), (b) or (c) and I have not modified
|
|
||||||
it.
|
|
||||||
|
|
||||||
(d) I understand and agree that this project and the contribution
|
|
||||||
are public and that a record of the contribution (including all
|
|
||||||
personal information I submit with it, including my sign-off) is
|
|
||||||
maintained indefinitely and may be redistributed consistent with
|
|
||||||
this project or the open source license(s) involved.
|
|
||||||
```
|
|
||||||
|
|
||||||
then you just add a line to every git commit message:
|
|
||||||
|
|
||||||
Signed-off-by: Joe Smith <joe@gmail.com>
|
|
||||||
|
|
||||||
using your real name (sorry, no pseudonyms or anonymous contributions.)
|
|
||||||
|
|
||||||
You can add the sign off when creating the git commit via `git commit -s`.
|
|
||||||
|
|
||||||
### Commit Style
|
|
||||||
|
|
||||||
Simple house-keeping for clean git history.
|
|
||||||
Read more on [How to Write a Git Commit Message](http://chris.beams.io/posts/git-commit/) or the Discussion section of [`git-commit(1)`](http://git-scm.com/docs/git-commit).
|
|
||||||
|
|
||||||
1. Separate the subject from body with a blank line
|
|
||||||
2. Limit the subject line to 50 characters
|
|
||||||
3. Capitalize the subject line
|
|
||||||
4. Do not end the subject line with a period
|
|
||||||
5. Use the imperative mood in the subject line
|
|
||||||
6. Wrap the body at 72 characters
|
|
||||||
7. Use the body to explain what and why vs. how
|
|
||||||
* If there was important/useful/essential conversation or information, copy or include a reference
|
|
||||||
8. When possible, one keyword to scope the change in the subject (i.e. "README: ...", "runtime: ...")
|
|
||||||
|
|
||||||
|
|
||||||
[UberConference]: https://www.uberconference.com/opencontainers
|
|
||||||
[irc-logs]: http://ircbot.wl.linuxfoundation.org/eavesdrop/%23opencontainers/
|
|
||||||
[minutes]: http://ircbot.wl.linuxfoundation.org/meetings/opencontainers/
|
|
93
vendor/github.com/prometheus/client_golang/README.md
generated
vendored
93
vendor/github.com/prometheus/client_golang/README.md
generated
vendored
|
@ -1,93 +0,0 @@
|
||||||
# Prometheus Go client library
|
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/prometheus/client_golang.svg?branch=master)](https://travis-ci.org/prometheus/client_golang)
|
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/client_golang)](https://goreportcard.com/report/github.com/prometheus/client_golang)
|
|
||||||
|
|
||||||
This is the [Go](http://golang.org) client library for
|
|
||||||
[Prometheus](http://prometheus.io). It has two separate parts, one for
|
|
||||||
instrumenting application code, and one for creating clients that talk to the
|
|
||||||
Prometheus HTTP API.
|
|
||||||
|
|
||||||
__This library requires Go1.7 or later.__
|
|
||||||
|
|
||||||
## Important note about releases, versioning, tagging, stability, and your favorite Go dependency management tool
|
|
||||||
|
|
||||||
While our goal is to follow [Semantic Versioning](https://semver.org/), this
|
|
||||||
repository is still pre-1.0.0. To quote the
|
|
||||||
[Semantic Versioning spec](https://semver.org/#spec-item-4): “Anything may
|
|
||||||
change at any time. The public API should not be considered stable.” We know
|
|
||||||
that this is at odds with the widespread use of this library. However, just
|
|
||||||
declaring something 1.0.0 doesn't make it 1.0.0. Instead, we are working
|
|
||||||
towards a 1.0.0 release that actually deserves its major version number.
|
|
||||||
|
|
||||||
Having said that, we aim for always keeping the tip of master in a workable
|
|
||||||
state and for only introducing ”mildly” breaking changes up to and including
|
|
||||||
[v0.9.0](https://github.com/prometheus/client_golang/milestone/1). After that,
|
|
||||||
a number of ”hard” breaking changes are planned, see the
|
|
||||||
[v0.10.0 milestone](https://github.com/prometheus/client_golang/milestone/2),
|
|
||||||
which should get the library much closer to 1.0.0 state.
|
|
||||||
|
|
||||||
Dependency management in Go projects is still in flux, and there are many tools
|
|
||||||
floating around. While [dep](https://golang.github.io/dep/) might develop into
|
|
||||||
the de-facto standard tool, it is still officially experimental. The roadmap
|
|
||||||
for this library has been laid out with a lot of sometimes painful experience
|
|
||||||
in mind. We really cannot adjust it every other month to the needs of the
|
|
||||||
currently most popular or most promising Go dependency management tool. The
|
|
||||||
recommended course of action with dependency management tools is the following:
|
|
||||||
|
|
||||||
- Do not expect strict post-1.0.0 semver semantics prior to the 1.0.0
|
|
||||||
release. If your dependency management tool expects strict post-1.0.0 semver
|
|
||||||
semantics, you have to wait. Sorry.
|
|
||||||
- If you want absolute certainty, please lock to a specific commit. You can
|
|
||||||
also lock to tags, but please don't ask for more tagging. This would suggest
|
|
||||||
some release or stability testing procedure that simply is not in place. As
|
|
||||||
said above, we are aiming for stability of the tip of master, but if we
|
|
||||||
tagged every single commit, locking to tags would be the same as locking to
|
|
||||||
commits.
|
|
||||||
- If you want to get the newer features and improvements and are willing to
|
|
||||||
take the minor risk of newly introduced bugs and “mild” breakage, just always
|
|
||||||
update to the tip of master (which is essentially the original idea of Go
|
|
||||||
dependency management). We recommend to not use features marked as
|
|
||||||
_deprecated_ in this case.
|
|
||||||
- Once [v0.9.0](https://github.com/prometheus/client_golang/milestone/1) is
|
|
||||||
out, you could lock to v0.9.x to get bugfixes (and perhaps minor new
|
|
||||||
features) while avoiding the “hard” breakage that will come with post-0.9
|
|
||||||
features.
|
|
||||||
|
|
||||||
## Instrumenting applications
|
|
||||||
|
|
||||||
[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/prometheus)](http://gocover.io/github.com/prometheus/client_golang/prometheus) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/prometheus)
|
|
||||||
|
|
||||||
The
|
|
||||||
[`prometheus` directory](https://github.com/prometheus/client_golang/tree/master/prometheus)
|
|
||||||
contains the instrumentation library. See the
|
|
||||||
[best practices section](http://prometheus.io/docs/practices/naming/) of the
|
|
||||||
Prometheus documentation to learn more about instrumenting applications.
|
|
||||||
|
|
||||||
The
|
|
||||||
[`examples` directory](https://github.com/prometheus/client_golang/tree/master/examples)
|
|
||||||
contains simple examples of instrumented code.
|
|
||||||
|
|
||||||
## Client for the Prometheus HTTP API
|
|
||||||
|
|
||||||
[![code-coverage](http://gocover.io/_badge/github.com/prometheus/client_golang/api/prometheus/v1)](http://gocover.io/github.com/prometheus/client_golang/api/prometheus/v1) [![go-doc](https://godoc.org/github.com/prometheus/client_golang/api/prometheus?status.svg)](https://godoc.org/github.com/prometheus/client_golang/api)
|
|
||||||
|
|
||||||
The
|
|
||||||
[`api/prometheus` directory](https://github.com/prometheus/client_golang/tree/master/api/prometheus)
|
|
||||||
contains the client for the
|
|
||||||
[Prometheus HTTP API](http://prometheus.io/docs/querying/api/). It allows you
|
|
||||||
to write Go applications that query time series data from a Prometheus
|
|
||||||
server. It is still in alpha stage.
|
|
||||||
|
|
||||||
## Where is `model`, `extraction`, and `text`?
|
|
||||||
|
|
||||||
The `model` packages has been moved to
|
|
||||||
[`prometheus/common/model`](https://github.com/prometheus/common/tree/master/model).
|
|
||||||
|
|
||||||
The `extraction` and `text` packages are now contained in
|
|
||||||
[`prometheus/common/expfmt`](https://github.com/prometheus/common/tree/master/expfmt).
|
|
||||||
|
|
||||||
## Contributing and community
|
|
||||||
|
|
||||||
See the [contributing guidelines](CONTRIBUTING.md) and the
|
|
||||||
[Community section](http://prometheus.io/community/) of the homepage.
|
|
1
vendor/github.com/prometheus/client_golang/prometheus/.gitignore
generated
vendored
Normal file
1
vendor/github.com/prometheus/client_golang/prometheus/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
command-line-arguments.test
|
26
vendor/github.com/prometheus/client_model/README.md
generated
vendored
26
vendor/github.com/prometheus/client_model/README.md
generated
vendored
|
@ -1,26 +0,0 @@
|
||||||
# Background
|
|
||||||
Under most circumstances, manually downloading this repository should never
|
|
||||||
be required.
|
|
||||||
|
|
||||||
# Prerequisites
|
|
||||||
# Base
|
|
||||||
* [Google Protocol Buffers](https://developers.google.com/protocol-buffers)
|
|
||||||
|
|
||||||
## Java
|
|
||||||
* [Apache Maven](http://maven.apache.org)
|
|
||||||
* [Prometheus Maven Repository](https://github.com/prometheus/io.prometheus-maven-repository) checked out into ../io.prometheus-maven-repository
|
|
||||||
|
|
||||||
## Go
|
|
||||||
* [Go](http://golang.org)
|
|
||||||
* [goprotobuf](https://code.google.com/p/goprotobuf)
|
|
||||||
|
|
||||||
## Ruby
|
|
||||||
* [Ruby](https://www.ruby-lang.org)
|
|
||||||
* [bundler](https://rubygems.org/gems/bundler)
|
|
||||||
|
|
||||||
# Building
|
|
||||||
$ make
|
|
||||||
|
|
||||||
# Getting Started
|
|
||||||
* The Go source code is periodically indexed: [Go Protocol Buffer Model](http://godoc.org/github.com/prometheus/client_model/go).
|
|
||||||
* All of the core developers are accessible via the [Prometheus Developers Mailinglist](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers).
|
|
12
vendor/github.com/prometheus/common/README.md
generated
vendored
12
vendor/github.com/prometheus/common/README.md
generated
vendored
|
@ -1,12 +0,0 @@
|
||||||
# Common
|
|
||||||
[![Build Status](https://travis-ci.org/prometheus/common.svg)](https://travis-ci.org/prometheus/common)
|
|
||||||
|
|
||||||
This repository contains Go libraries that are shared across Prometheus
|
|
||||||
components and libraries.
|
|
||||||
|
|
||||||
* **config**: Common configuration structures
|
|
||||||
* **expfmt**: Decoding and encoding for the exposition format
|
|
||||||
* **log**: A logging wrapper around [logrus](https://github.com/sirupsen/logrus)
|
|
||||||
* **model**: Shared data structures
|
|
||||||
* **route**: A routing wrapper around [httprouter](https://github.com/julienschmidt/httprouter) using `context.Context`
|
|
||||||
* **version**: Version informations and metric
|
|
9
vendor/github.com/prometheus/procfs/.travis.yml
generated
vendored
Normal file
9
vendor/github.com/prometheus/procfs/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.9.x
|
||||||
|
- 1.x
|
||||||
|
|
||||||
|
go_import_path: github.com/prometheus/procfs
|
18
vendor/github.com/prometheus/procfs/CONTRIBUTING.md
generated
vendored
Normal file
18
vendor/github.com/prometheus/procfs/CONTRIBUTING.md
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
Prometheus uses GitHub to manage reviews of pull requests.
|
||||||
|
|
||||||
|
* If you have a trivial fix or improvement, go ahead and create a pull request,
|
||||||
|
addressing (with `@...`) the maintainer of this repository (see
|
||||||
|
[MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request.
|
||||||
|
|
||||||
|
* If you plan to do something more involved, first discuss your ideas
|
||||||
|
on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers).
|
||||||
|
This will avoid unnecessary work and surely give you and us a good deal
|
||||||
|
of inspiration.
|
||||||
|
|
||||||
|
* Relevant coding style guidelines are the [Go Code Review
|
||||||
|
Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments)
|
||||||
|
and the _Formatting and style_ section of Peter Bourgon's [Go: Best
|
||||||
|
Practices for Production
|
||||||
|
Environments](http://peter.bourgon.org/go-in-production/#formatting-and-style).
|
1
vendor/github.com/prometheus/procfs/MAINTAINERS.md
generated
vendored
Normal file
1
vendor/github.com/prometheus/procfs/MAINTAINERS.md
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
* Tobias Schmidt <tobidt@gmail.com>
|
18
vendor/github.com/prometheus/procfs/Makefile
generated
vendored
Normal file
18
vendor/github.com/prometheus/procfs/Makefile
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
ci: fmt lint test
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
! gofmt -l *.go | read nothing
|
||||||
|
go vet
|
||||||
|
|
||||||
|
lint:
|
||||||
|
go get github.com/golang/lint/golint
|
||||||
|
golint *.go
|
||||||
|
|
||||||
|
test: sysfs/fixtures/.unpacked
|
||||||
|
go test -v ./...
|
||||||
|
|
||||||
|
sysfs/fixtures/.unpacked: sysfs/fixtures.ttar
|
||||||
|
./ttar -C sysfs -x -f sysfs/fixtures.ttar
|
||||||
|
touch $@
|
||||||
|
|
||||||
|
.PHONY: fmt lint test ci
|
264
vendor/github.com/prometheus/procfs/ttar
generated
vendored
Normal file
264
vendor/github.com/prometheus/procfs/ttar
generated
vendored
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Purpose: plain text tar format
|
||||||
|
# Limitations: - only suitable for text files, directories, and symlinks
|
||||||
|
# - stores only filename, content, and mode
|
||||||
|
# - not designed for untrusted input
|
||||||
|
|
||||||
|
# Note: must work with bash version 3.2 (macOS)
|
||||||
|
|
||||||
|
set -o errexit -o nounset
|
||||||
|
|
||||||
|
# Sanitize environment (for instance, standard sorting of glob matches)
|
||||||
|
export LC_ALL=C
|
||||||
|
|
||||||
|
path=""
|
||||||
|
CMD=""
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
bname=$(basename "$0")
|
||||||
|
cat << USAGE
|
||||||
|
Usage: $bname [-C <DIR>] -c -f <ARCHIVE> <FILE...> (create archive)
|
||||||
|
$bname -t -f <ARCHIVE> (list archive contents)
|
||||||
|
$bname [-C <DIR>] -x -f <ARCHIVE> (extract archive)
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-C <DIR> (change directory)
|
||||||
|
|
||||||
|
Example: Change to sysfs directory, create ttar file from fixtures directory
|
||||||
|
$bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/
|
||||||
|
USAGE
|
||||||
|
exit "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function vecho {
|
||||||
|
if [ "${VERBOSE:-}" == "yes" ]; then
|
||||||
|
echo >&7 "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_cmd {
|
||||||
|
if [ -n "$CMD" ]; then
|
||||||
|
echo "ERROR: more than one command given"
|
||||||
|
echo
|
||||||
|
usage 2
|
||||||
|
fi
|
||||||
|
CMD=$1
|
||||||
|
}
|
||||||
|
|
||||||
|
while getopts :cf:htxvC: opt; do
|
||||||
|
case $opt in
|
||||||
|
c)
|
||||||
|
set_cmd "create"
|
||||||
|
;;
|
||||||
|
f)
|
||||||
|
ARCHIVE=$OPTARG
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
usage 0
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
set_cmd "list"
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
set_cmd "extract"
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
VERBOSE=yes
|
||||||
|
exec 7>&1
|
||||||
|
;;
|
||||||
|
C)
|
||||||
|
CDIR=$OPTARG
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo >&2 "ERROR: invalid option -$OPTARG"
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Remove processed options from arguments
|
||||||
|
shift $(( OPTIND - 1 ));
|
||||||
|
|
||||||
|
if [ "${CMD:-}" == "" ]; then
|
||||||
|
echo >&2 "ERROR: no command given"
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
elif [ "${ARCHIVE:-}" == "" ]; then
|
||||||
|
echo >&2 "ERROR: no archive name given"
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function list {
|
||||||
|
local path=""
|
||||||
|
local size=0
|
||||||
|
local line_no=0
|
||||||
|
local ttar_file=$1
|
||||||
|
if [ -n "${2:-}" ]; then
|
||||||
|
echo >&2 "ERROR: too many arguments."
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
fi
|
||||||
|
if [ ! -e "$ttar_file" ]; then
|
||||||
|
echo >&2 "ERROR: file not found ($ttar_file)"
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
fi
|
||||||
|
while read -r line; do
|
||||||
|
line_no=$(( line_no + 1 ))
|
||||||
|
if [ $size -gt 0 ]; then
|
||||||
|
size=$(( size - 1 ))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ $line =~ ^Path:\ (.*)$ ]]; then
|
||||||
|
path=${BASH_REMATCH[1]}
|
||||||
|
elif [[ $line =~ ^Lines:\ (.*)$ ]]; then
|
||||||
|
size=${BASH_REMATCH[1]}
|
||||||
|
echo "$path"
|
||||||
|
elif [[ $line =~ ^Directory:\ (.*)$ ]]; then
|
||||||
|
path=${BASH_REMATCH[1]}
|
||||||
|
echo "$path/"
|
||||||
|
elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then
|
||||||
|
echo "$path -> ${BASH_REMATCH[1]}"
|
||||||
|
fi
|
||||||
|
done < "$ttar_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
function extract {
|
||||||
|
local path=""
|
||||||
|
local size=0
|
||||||
|
local line_no=0
|
||||||
|
local ttar_file=$1
|
||||||
|
if [ -n "${2:-}" ]; then
|
||||||
|
echo >&2 "ERROR: too many arguments."
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
fi
|
||||||
|
if [ ! -e "$ttar_file" ]; then
|
||||||
|
echo >&2 "ERROR: file not found ($ttar_file)"
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
fi
|
||||||
|
while IFS= read -r line; do
|
||||||
|
line_no=$(( line_no + 1 ))
|
||||||
|
if [ "$size" -gt 0 ]; then
|
||||||
|
echo "$line" >> "$path"
|
||||||
|
size=$(( size - 1 ))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ $line =~ ^Path:\ (.*)$ ]]; then
|
||||||
|
path=${BASH_REMATCH[1]}
|
||||||
|
if [ -e "$path" ] || [ -L "$path" ]; then
|
||||||
|
rm "$path"
|
||||||
|
fi
|
||||||
|
elif [[ $line =~ ^Lines:\ (.*)$ ]]; then
|
||||||
|
size=${BASH_REMATCH[1]}
|
||||||
|
# Create file even if it is zero-length.
|
||||||
|
touch "$path"
|
||||||
|
vecho " $path"
|
||||||
|
elif [[ $line =~ ^Mode:\ (.*)$ ]]; then
|
||||||
|
mode=${BASH_REMATCH[1]}
|
||||||
|
chmod "$mode" "$path"
|
||||||
|
vecho "$mode"
|
||||||
|
elif [[ $line =~ ^Directory:\ (.*)$ ]]; then
|
||||||
|
path=${BASH_REMATCH[1]}
|
||||||
|
mkdir -p "$path"
|
||||||
|
vecho " $path/"
|
||||||
|
elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then
|
||||||
|
ln -s "${BASH_REMATCH[1]}" "$path"
|
||||||
|
vecho " $path -> ${BASH_REMATCH[1]}"
|
||||||
|
elif [[ $line =~ ^# ]]; then
|
||||||
|
# Ignore comments between files
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
echo >&2 "ERROR: Unknown keyword on line $line_no: $line"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done < "$ttar_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
function div {
|
||||||
|
echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \
|
||||||
|
"- - - - - -"
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_mode {
|
||||||
|
local mfile=$1
|
||||||
|
if [ -z "${STAT_OPTION:-}" ]; then
|
||||||
|
if stat -c '%a' "$mfile" >/dev/null 2>&1; then
|
||||||
|
STAT_OPTION='-c'
|
||||||
|
STAT_FORMAT='%a'
|
||||||
|
else
|
||||||
|
STAT_OPTION='-f'
|
||||||
|
STAT_FORMAT='%A'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _create {
|
||||||
|
shopt -s nullglob
|
||||||
|
local mode
|
||||||
|
while (( "$#" )); do
|
||||||
|
file=$1
|
||||||
|
if [ -L "$file" ]; then
|
||||||
|
echo "Path: $file"
|
||||||
|
symlinkTo=$(readlink "$file")
|
||||||
|
echo "SymlinkTo: $symlinkTo"
|
||||||
|
vecho " $file -> $symlinkTo"
|
||||||
|
div
|
||||||
|
elif [ -d "$file" ]; then
|
||||||
|
# Strip trailing slash (if there is one)
|
||||||
|
file=${file%/}
|
||||||
|
echo "Directory: $file"
|
||||||
|
mode=$(get_mode "$file")
|
||||||
|
echo "Mode: $mode"
|
||||||
|
vecho "$mode $file/"
|
||||||
|
div
|
||||||
|
# Find all files and dirs, including hidden/dot files
|
||||||
|
for x in "$file/"{*,.[^.]*}; do
|
||||||
|
_create "$x"
|
||||||
|
done
|
||||||
|
elif [ -f "$file" ]; then
|
||||||
|
echo "Path: $file"
|
||||||
|
lines=$(wc -l "$file"|awk '{print $1}')
|
||||||
|
echo "Lines: $lines"
|
||||||
|
cat "$file"
|
||||||
|
mode=$(get_mode "$file")
|
||||||
|
echo "Mode: $mode"
|
||||||
|
vecho "$mode $file"
|
||||||
|
div
|
||||||
|
else
|
||||||
|
echo >&2 "ERROR: file not found ($file in $(pwd))"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function create {
|
||||||
|
ttar_file=$1
|
||||||
|
shift
|
||||||
|
if [ -z "${1:-}" ]; then
|
||||||
|
echo >&2 "ERROR: missing arguments."
|
||||||
|
echo
|
||||||
|
usage 1
|
||||||
|
fi
|
||||||
|
if [ -e "$ttar_file" ]; then
|
||||||
|
rm "$ttar_file"
|
||||||
|
fi
|
||||||
|
exec > "$ttar_file"
|
||||||
|
_create "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -n "${CDIR:-}" ]; then
|
||||||
|
if [[ "$ARCHIVE" != /* ]]; then
|
||||||
|
# Relative path: preserve the archive's location before changing
|
||||||
|
# directory
|
||||||
|
ARCHIVE="$(pwd)/$ARCHIVE"
|
||||||
|
fi
|
||||||
|
cd "$CDIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
"$CMD" "$ARCHIVE" "$@"
|
23
vendor/github.com/satori/go.uuid/.travis.yml
generated
vendored
Normal file
23
vendor/github.com/satori/go.uuid/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
language: go
|
||||||
|
sudo: false
|
||||||
|
go:
|
||||||
|
- 1.2
|
||||||
|
- 1.3
|
||||||
|
- 1.4
|
||||||
|
- 1.5
|
||||||
|
- 1.6
|
||||||
|
- 1.7
|
||||||
|
- 1.8
|
||||||
|
- 1.9
|
||||||
|
- tip
|
||||||
|
matrix:
|
||||||
|
allow_failures:
|
||||||
|
- go: tip
|
||||||
|
fast_finish: true
|
||||||
|
before_install:
|
||||||
|
- go get github.com/mattn/goveralls
|
||||||
|
- go get golang.org/x/tools/cmd/cover
|
||||||
|
script:
|
||||||
|
- $HOME/gopath/bin/goveralls -service=travis-ci
|
||||||
|
notifications:
|
||||||
|
email: false
|
1
vendor/github.com/sirupsen/logrus/.gitignore
generated
vendored
Normal file
1
vendor/github.com/sirupsen/logrus/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
logrus
|
12
vendor/github.com/sirupsen/logrus/.travis.yml
generated
vendored
Normal file
12
vendor/github.com/sirupsen/logrus/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
language: go
|
||||||
|
go:
|
||||||
|
- 1.6.x
|
||||||
|
- 1.7.x
|
||||||
|
- 1.8.x
|
||||||
|
- tip
|
||||||
|
env:
|
||||||
|
- GOMAXPROCS=4 GORACE=halt_on_error=1
|
||||||
|
install:
|
||||||
|
- go get github.com/stretchr/testify/assert
|
||||||
|
script:
|
||||||
|
- go test -race -v .
|
100
vendor/github.com/sirupsen/logrus/CHANGELOG.md
generated
vendored
Normal file
100
vendor/github.com/sirupsen/logrus/CHANGELOG.md
generated
vendored
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
# 1.0.0
|
||||||
|
|
||||||
|
* Officially changed name to lower-case
|
||||||
|
* bug: colors on Windows 10 (#541)
|
||||||
|
* bug: fix race in accessing level (#512)
|
||||||
|
|
||||||
|
# 0.11.5
|
||||||
|
|
||||||
|
* feature: add writer and writerlevel to entry (#372)
|
||||||
|
|
||||||
|
# 0.11.4
|
||||||
|
|
||||||
|
* bug: fix undefined variable on solaris (#493)
|
||||||
|
|
||||||
|
# 0.11.3
|
||||||
|
|
||||||
|
* formatter: configure quoting of empty values (#484)
|
||||||
|
* formatter: configure quoting character (default is `"`) (#484)
|
||||||
|
* bug: fix not importing io correctly in non-linux environments (#481)
|
||||||
|
|
||||||
|
# 0.11.2
|
||||||
|
|
||||||
|
* bug: fix windows terminal detection (#476)
|
||||||
|
|
||||||
|
# 0.11.1
|
||||||
|
|
||||||
|
* bug: fix tty detection with custom out (#471)
|
||||||
|
|
||||||
|
# 0.11.0
|
||||||
|
|
||||||
|
* performance: Use bufferpool to allocate (#370)
|
||||||
|
* terminal: terminal detection for app-engine (#343)
|
||||||
|
* feature: exit handler (#375)
|
||||||
|
|
||||||
|
# 0.10.0
|
||||||
|
|
||||||
|
* feature: Add a test hook (#180)
|
||||||
|
* feature: `ParseLevel` is now case-insensitive (#326)
|
||||||
|
* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308)
|
||||||
|
* performance: avoid re-allocations on `WithFields` (#335)
|
||||||
|
|
||||||
|
# 0.9.0
|
||||||
|
|
||||||
|
* logrus/text_formatter: don't emit empty msg
|
||||||
|
* logrus/hooks/airbrake: move out of main repository
|
||||||
|
* logrus/hooks/sentry: move out of main repository
|
||||||
|
* logrus/hooks/papertrail: move out of main repository
|
||||||
|
* logrus/hooks/bugsnag: move out of main repository
|
||||||
|
* logrus/core: run tests with `-race`
|
||||||
|
* logrus/core: detect TTY based on `stderr`
|
||||||
|
* logrus/core: support `WithError` on logger
|
||||||
|
* logrus/core: Solaris support
|
||||||
|
|
||||||
|
# 0.8.7
|
||||||
|
|
||||||
|
* logrus/core: fix possible race (#216)
|
||||||
|
* logrus/doc: small typo fixes and doc improvements
|
||||||
|
|
||||||
|
|
||||||
|
# 0.8.6
|
||||||
|
|
||||||
|
* hooks/raven: allow passing an initialized client
|
||||||
|
|
||||||
|
# 0.8.5
|
||||||
|
|
||||||
|
* logrus/core: revert #208
|
||||||
|
|
||||||
|
# 0.8.4
|
||||||
|
|
||||||
|
* formatter/text: fix data race (#218)
|
||||||
|
|
||||||
|
# 0.8.3
|
||||||
|
|
||||||
|
* logrus/core: fix entry log level (#208)
|
||||||
|
* logrus/core: improve performance of text formatter by 40%
|
||||||
|
* logrus/core: expose `LevelHooks` type
|
||||||
|
* logrus/core: add support for DragonflyBSD and NetBSD
|
||||||
|
* formatter/text: print structs more verbosely
|
||||||
|
|
||||||
|
# 0.8.2
|
||||||
|
|
||||||
|
* logrus: fix more Fatal family functions
|
||||||
|
|
||||||
|
# 0.8.1
|
||||||
|
|
||||||
|
* logrus: fix not exiting on `Fatalf` and `Fatalln`
|
||||||
|
|
||||||
|
# 0.8.0
|
||||||
|
|
||||||
|
* logrus: defaults to stderr instead of stdout
|
||||||
|
* hooks/sentry: add special field for `*http.Request`
|
||||||
|
* formatter/text: ignore Windows for colors
|
||||||
|
|
||||||
|
# 0.7.3
|
||||||
|
|
||||||
|
* formatter/\*: allow configuration of timestamp layout
|
||||||
|
|
||||||
|
# 0.7.2
|
||||||
|
|
||||||
|
* formatter/text: Add configuration option for time format (#158)
|
24
vendor/github.com/spf13/cobra/.gitignore
generated
vendored
Normal file
24
vendor/github.com/spf13/cobra/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
|
*.o
|
||||||
|
*.a
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Folders
|
||||||
|
_obj
|
||||||
|
_test
|
||||||
|
|
||||||
|
# Architecture specific extensions/prefixes
|
||||||
|
*.[568vq]
|
||||||
|
[568vq].out
|
||||||
|
|
||||||
|
*.cgo1.go
|
||||||
|
*.cgo2.c
|
||||||
|
_cgo_defun.c
|
||||||
|
_cgo_gotypes.go
|
||||||
|
_cgo_export.*
|
||||||
|
|
||||||
|
_testmain.go
|
||||||
|
|
||||||
|
*.exe
|
||||||
|
|
||||||
|
cobra.test
|
8
vendor/github.com/spf13/cobra/.travis.yml
generated
vendored
Normal file
8
vendor/github.com/spf13/cobra/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
language: go
|
||||||
|
go:
|
||||||
|
- 1.3
|
||||||
|
- 1.4.2
|
||||||
|
- tip
|
||||||
|
script:
|
||||||
|
- go test ./...
|
||||||
|
- go build
|
149
vendor/github.com/spf13/cobra/bash_completions.md
generated
vendored
Normal file
149
vendor/github.com/spf13/cobra/bash_completions.md
generated
vendored
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
# Generating Bash Completions For Your Own cobra.Command
|
||||||
|
|
||||||
|
Generating bash completions from a cobra command is incredibly easy. An actual program which does so for the kubernetes kubectl binary is as follows:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
kubectl := cmd.NewFactory(nil).NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
|
||||||
|
kubectl.GenBashCompletionFile("out.sh")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
That will get you completions of subcommands and flags. If you make additional annotations to your code, you can get even more intelligent and flexible behavior.
|
||||||
|
|
||||||
|
## Creating your own custom functions
|
||||||
|
|
||||||
|
Some more actual code that works in kubernetes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
const (
|
||||||
|
bash_completion_func = `__kubectl_parse_get()
|
||||||
|
{
|
||||||
|
local kubectl_output out
|
||||||
|
if kubectl_output=$(kubectl get --no-headers "$1" 2>/dev/null); then
|
||||||
|
out=($(echo "${kubectl_output}" | awk '{print $1}'))
|
||||||
|
COMPREPLY=( $( compgen -W "${out[*]}" -- "$cur" ) )
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__kubectl_get_resource()
|
||||||
|
{
|
||||||
|
if [[ ${#nouns[@]} -eq 0 ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
__kubectl_parse_get ${nouns[${#nouns[@]} -1]}
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__custom_func() {
|
||||||
|
case ${last_command} in
|
||||||
|
kubectl_get | kubectl_describe | kubectl_delete | kubectl_stop)
|
||||||
|
__kubectl_get_resource
|
||||||
|
return
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
`)
|
||||||
|
```
|
||||||
|
|
||||||
|
And then I set that in my command definition:
|
||||||
|
|
||||||
|
```go
|
||||||
|
cmds := &cobra.Command{
|
||||||
|
Use: "kubectl",
|
||||||
|
Short: "kubectl controls the Kubernetes cluster manager",
|
||||||
|
Long: `kubectl controls the Kubernetes cluster manager.
|
||||||
|
|
||||||
|
Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`,
|
||||||
|
Run: runHelp,
|
||||||
|
BashCompletionFunction: bash_completion_func,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__custom_func()` to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods!
|
||||||
|
|
||||||
|
## Have the completions code complete your 'nouns'
|
||||||
|
|
||||||
|
In the above example "pod" was assumed to already be typed. But if you want `kubectl get [tab][tab]` to show a list of valid "nouns" you have to set them. Simplified code from `kubectl get` looks like:
|
||||||
|
|
||||||
|
```go
|
||||||
|
validArgs []string = { "pods", "nodes", "services", "replicationControllers" }
|
||||||
|
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "get [(-o|--output=)json|yaml|template|...] (RESOURCE [NAME] | RESOURCE/NAME ...)",
|
||||||
|
Short: "Display one or many resources",
|
||||||
|
Long: get_long,
|
||||||
|
Example: get_example,
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
err := RunGet(f, out, cmd, args)
|
||||||
|
util.CheckErr(err)
|
||||||
|
},
|
||||||
|
ValidArgs: validArgs,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Notice we put the "ValidArgs" on the "get" subcommand. Doing so will give results like
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# kubectl get [tab][tab]
|
||||||
|
nodes pods replicationControllers services
|
||||||
|
```
|
||||||
|
|
||||||
|
## Mark flags as required
|
||||||
|
|
||||||
|
Most of the time completions will only show subcommands. But if a flag is required to make a subcommand work, you probably want it to show up when the user types [tab][tab]. Marking a flag as 'Required' is incredibly easy.
|
||||||
|
|
||||||
|
```go
|
||||||
|
cmd.MarkFlagRequired("pod")
|
||||||
|
cmd.MarkFlagRequired("container")
|
||||||
|
```
|
||||||
|
|
||||||
|
and you'll get something like
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# kubectl exec [tab][tab][tab]
|
||||||
|
-c --container= -p --pod=
|
||||||
|
```
|
||||||
|
|
||||||
|
# Specify valid filename extensions for flags that take a filename
|
||||||
|
|
||||||
|
In this example we use --filename= and expect to get a json or yaml file as the argument. To make this easier we annotate the --filename flag with valid filename extensions.
|
||||||
|
|
||||||
|
```go
|
||||||
|
annotations := []string{"json", "yaml", "yml"}
|
||||||
|
annotation := make(map[string][]string)
|
||||||
|
annotation[cobra.BashCompFilenameExt] = annotations
|
||||||
|
|
||||||
|
flag := &pflag.Flag{
|
||||||
|
Name: "filename",
|
||||||
|
Shorthand: "f",
|
||||||
|
Usage: usage,
|
||||||
|
Value: value,
|
||||||
|
DefValue: value.String(),
|
||||||
|
Annotations: annotation,
|
||||||
|
}
|
||||||
|
cmd.Flags().AddFlag(flag)
|
||||||
|
```
|
||||||
|
|
||||||
|
Now when you run a command with this filename flag you'll get something like
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# kubectl create -f
|
||||||
|
test/ example/ rpmbuild/
|
||||||
|
hello.yml test.json
|
||||||
|
```
|
||||||
|
|
||||||
|
So while there are many other files in the CWD it only shows me subdirs and those with valid extensions.
|
81
vendor/github.com/spf13/cobra/md_docs.md
generated
vendored
Normal file
81
vendor/github.com/spf13/cobra/md_docs.md
generated
vendored
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
# Generating Markdown Docs For Your Own cobra.Command
|
||||||
|
|
||||||
|
## Generate markdown docs for the entire command tree
|
||||||
|
|
||||||
|
This program can actually generate docs for the kubectl command in the kubernetes project
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
kubectl := cmd.NewFactory(nil).NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
|
||||||
|
cobra.GenMarkdownTree(kubectl, "./")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./")
|
||||||
|
|
||||||
|
## Generate markdown docs for a single command
|
||||||
|
|
||||||
|
You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenMarkdown` instead of `GenMarkdownTree`
|
||||||
|
|
||||||
|
```go
|
||||||
|
out := new(bytes.Buffer)
|
||||||
|
cobra.GenMarkdown(cmd, out)
|
||||||
|
```
|
||||||
|
|
||||||
|
This will write the markdown doc for ONLY "cmd" into the out, buffer.
|
||||||
|
|
||||||
|
## Customize the output
|
||||||
|
|
||||||
|
Both `GenMarkdown` and `GenMarkdownTree` have alternate versions with callbacks to get some control of the output:
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GenMarkdownTreeCustom(cmd *Command, dir string, filePrepender func(string) string, linkHandler func(string) string) {
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```go
|
||||||
|
func GenMarkdownCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) {
|
||||||
|
//...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `filePrepender` will prepend the return value given the full filepath to the rendered Markdown file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/):
|
||||||
|
|
||||||
|
```go
|
||||||
|
const fmTemplate = `---
|
||||||
|
date: %s
|
||||||
|
title: "%s"
|
||||||
|
slug: %s
|
||||||
|
url: %s
|
||||||
|
---
|
||||||
|
`
|
||||||
|
|
||||||
|
filePrepender := func(filename string) string {
|
||||||
|
now := time.Now().Format(time.RFC3339)
|
||||||
|
name := filepath.Base(filename)
|
||||||
|
base := strings.TrimSuffix(name, path.Ext(name))
|
||||||
|
url := "/commands/" + strings.ToLower(base) + "/"
|
||||||
|
return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename:
|
||||||
|
|
||||||
|
```go
|
||||||
|
linkHandler := func(name string) string {
|
||||||
|
base := strings.TrimSuffix(name, path.Ext(name))
|
||||||
|
return "/commands/" + strings.ToLower(base) + "/"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
8
vendor/github.com/spf13/pflag/.travis.yml
generated
vendored
Normal file
8
vendor/github.com/spf13/pflag/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
language: go
|
||||||
|
|
||||||
|
go:
|
||||||
|
- 1.3
|
||||||
|
- 1.4
|
||||||
|
- tip
|
9
vendor/github.com/yvasiyarov/go-metrics/.gitignore
generated
vendored
Normal file
9
vendor/github.com/yvasiyarov/go-metrics/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
*.[68]
|
||||||
|
*.a
|
||||||
|
*.out
|
||||||
|
*.swp
|
||||||
|
_obj
|
||||||
|
_testmain.go
|
||||||
|
cmd/metrics-bench/metrics-bench
|
||||||
|
cmd/metrics-example/metrics-example
|
||||||
|
cmd/never-read/never-read
|
285
vendor/github.com/yvasiyarov/go-metrics/memory.md
generated
vendored
Normal file
285
vendor/github.com/yvasiyarov/go-metrics/memory.md
generated
vendored
Normal file
|
@ -0,0 +1,285 @@
|
||||||
|
Memory usage
|
||||||
|
============
|
||||||
|
|
||||||
|
(Highly unscientific.)
|
||||||
|
|
||||||
|
Command used to gather static memory usage:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
grep ^Vm "/proc/$(ps fax | grep [m]etrics-bench | awk '{print $1}')/status"
|
||||||
|
```
|
||||||
|
|
||||||
|
Program used to gather baseline memory usage:
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
time.Sleep(600e9)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Baseline
|
||||||
|
--------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 42604 kB
|
||||||
|
VmSize: 42604 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 1120 kB
|
||||||
|
VmRSS: 1120 kB
|
||||||
|
VmData: 35460 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1020 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 36 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
Program used to gather metric memory usage (with other metrics being similar):
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"metrics"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Sprintf("foo")
|
||||||
|
metrics.NewRegistry()
|
||||||
|
time.Sleep(600e9)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
1000 counters registered
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 44016 kB
|
||||||
|
VmSize: 44016 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 1928 kB
|
||||||
|
VmRSS: 1928 kB
|
||||||
|
VmData: 36868 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1024 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 40 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**1.412 kB virtual, TODO 0.808 kB resident per counter.**
|
||||||
|
|
||||||
|
100000 counters registered
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 55024 kB
|
||||||
|
VmSize: 55024 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 12440 kB
|
||||||
|
VmRSS: 12440 kB
|
||||||
|
VmData: 47876 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1024 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 64 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**0.1242 kB virtual, 0.1132 kB resident per counter.**
|
||||||
|
|
||||||
|
1000 gauges registered
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 44012 kB
|
||||||
|
VmSize: 44012 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 1928 kB
|
||||||
|
VmRSS: 1928 kB
|
||||||
|
VmData: 36868 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1020 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 40 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**1.408 kB virtual, 0.808 kB resident per counter.**
|
||||||
|
|
||||||
|
100000 gauges registered
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 55020 kB
|
||||||
|
VmSize: 55020 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 12432 kB
|
||||||
|
VmRSS: 12432 kB
|
||||||
|
VmData: 47876 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1020 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 60 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**0.12416 kB virtual, 0.11312 resident per gauge.**
|
||||||
|
|
||||||
|
1000 histograms with a uniform sample size of 1028
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 72272 kB
|
||||||
|
VmSize: 72272 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 16204 kB
|
||||||
|
VmRSS: 16204 kB
|
||||||
|
VmData: 65100 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1048 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 80 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**29.668 kB virtual, TODO 15.084 resident per histogram.**
|
||||||
|
|
||||||
|
10000 histograms with a uniform sample size of 1028
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 256912 kB
|
||||||
|
VmSize: 256912 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 146204 kB
|
||||||
|
VmRSS: 146204 kB
|
||||||
|
VmData: 249740 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1048 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 448 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**21.4308 kB virtual, 14.5084 kB resident per histogram.**
|
||||||
|
|
||||||
|
50000 histograms with a uniform sample size of 1028
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 908112 kB
|
||||||
|
VmSize: 908112 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 645832 kB
|
||||||
|
VmRSS: 645588 kB
|
||||||
|
VmData: 900940 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1048 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 1716 kB
|
||||||
|
VmSwap: 1544 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**17.31016 kB virtual, 12.88936 kB resident per histogram.**
|
||||||
|
|
||||||
|
1000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015
|
||||||
|
-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 62480 kB
|
||||||
|
VmSize: 62480 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 11572 kB
|
||||||
|
VmRSS: 11572 kB
|
||||||
|
VmData: 55308 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1048 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 64 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**19.876 kB virtual, 10.452 kB resident per histogram.**
|
||||||
|
|
||||||
|
10000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015
|
||||||
|
--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 153296 kB
|
||||||
|
VmSize: 153296 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 101176 kB
|
||||||
|
VmRSS: 101176 kB
|
||||||
|
VmData: 146124 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1048 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 240 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**11.0692 kB virtual, 10.0056 kB resident per histogram.**
|
||||||
|
|
||||||
|
50000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015
|
||||||
|
--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 557264 kB
|
||||||
|
VmSize: 557264 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 501056 kB
|
||||||
|
VmRSS: 501056 kB
|
||||||
|
VmData: 550092 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1048 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 1032 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**10.2932 kB virtual, 9.99872 kB resident per histogram.**
|
||||||
|
|
||||||
|
1000 meters
|
||||||
|
-----------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 74504 kB
|
||||||
|
VmSize: 74504 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 24124 kB
|
||||||
|
VmRSS: 24124 kB
|
||||||
|
VmData: 67340 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1040 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 92 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**31.9 kB virtual, 23.004 kB resident per meter.**
|
||||||
|
|
||||||
|
10000 meters
|
||||||
|
------------
|
||||||
|
|
||||||
|
```
|
||||||
|
VmPeak: 278920 kB
|
||||||
|
VmSize: 278920 kB
|
||||||
|
VmLck: 0 kB
|
||||||
|
VmHWM: 227300 kB
|
||||||
|
VmRSS: 227300 kB
|
||||||
|
VmData: 271756 kB
|
||||||
|
VmStk: 136 kB
|
||||||
|
VmExe: 1040 kB
|
||||||
|
VmLib: 1848 kB
|
||||||
|
VmPTE: 488 kB
|
||||||
|
VmSwap: 0 kB
|
||||||
|
```
|
||||||
|
|
||||||
|
**23.6316 kB virtual, 22.618 kB resident per meter.**
|
4
vendor/github.com/yvasiyarov/gorelic/.gitignore
generated
vendored
Normal file
4
vendor/github.com/yvasiyarov/gorelic/.gitignore
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
*.nut
|
||||||
|
*.swp
|
||||||
|
examples/example1
|
||||||
|
examples/example_web
|
1
vendor/github.com/yvasiyarov/gorelic/.travis.yml
generated
vendored
Normal file
1
vendor/github.com/yvasiyarov/gorelic/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
language: go
|
15
vendor/github.com/yvasiyarov/gorelic/nut.json
generated
vendored
Normal file
15
vendor/github.com/yvasiyarov/gorelic/nut.json
generated
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"Version": "0.0.6",
|
||||||
|
"Vendor": "yvasiyarov",
|
||||||
|
"Authors": [
|
||||||
|
{
|
||||||
|
"FullName": "Yuriy Vasiyarov",
|
||||||
|
"Email": "varyous@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ExtraFiles": [
|
||||||
|
"README.md",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"Homepage": "https://github.com/yvasiyarov/gorelic"
|
||||||
|
}
|
1
vendor/github.com/yvasiyarov/newrelic_platform_go/.travis.yml
generated
vendored
Normal file
1
vendor/github.com/yvasiyarov/newrelic_platform_go/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
language: go
|
15
vendor/github.com/yvasiyarov/newrelic_platform_go/nut.json
generated
vendored
Normal file
15
vendor/github.com/yvasiyarov/newrelic_platform_go/nut.json
generated
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"Version": "0.0.1",
|
||||||
|
"Vendor": "yvasiyarov",
|
||||||
|
"Authors": [
|
||||||
|
{
|
||||||
|
"FullName": "Yuriy Vasiyarov",
|
||||||
|
"Email": "varyous@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ExtraFiles": [
|
||||||
|
"README.md",
|
||||||
|
"LICENSE"
|
||||||
|
],
|
||||||
|
"Homepage": "https://github.com/yvasiyarov/newrelic_platform_go"
|
||||||
|
}
|
3
vendor/golang.org/x/crypto/AUTHORS
generated
vendored
Normal file
3
vendor/golang.org/x/crypto/AUTHORS
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# This source code refers to The Go Authors for copyright purposes.
|
||||||
|
# The master list of authors is in the main Go distribution,
|
||||||
|
# visible at https://tip.golang.org/AUTHORS.
|
3
vendor/golang.org/x/crypto/CONTRIBUTORS
generated
vendored
Normal file
3
vendor/golang.org/x/crypto/CONTRIBUTORS
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# This source code was written by the Go contributors.
|
||||||
|
# The master list of contributors is in the main Go distribution,
|
||||||
|
# visible at https://tip.golang.org/CONTRIBUTORS.
|
21
vendor/golang.org/x/crypto/README.md
generated
vendored
21
vendor/golang.org/x/crypto/README.md
generated
vendored
|
@ -1,21 +0,0 @@
|
||||||
# Go Cryptography
|
|
||||||
|
|
||||||
This repository holds supplementary Go cryptography libraries.
|
|
||||||
|
|
||||||
## Download/Install
|
|
||||||
|
|
||||||
The easiest way to install is to run `go get -u golang.org/x/crypto/...`. You
|
|
||||||
can also manually git clone the repository to `$GOPATH/src/golang.org/x/crypto`.
|
|
||||||
|
|
||||||
## Report Issues / Send Patches
|
|
||||||
|
|
||||||
This repository uses Gerrit for code changes. To learn how to submit changes to
|
|
||||||
this repository, see https://golang.org/doc/contribute.html.
|
|
||||||
|
|
||||||
The main issue tracker for the crypto repository is located at
|
|
||||||
https://github.com/golang/go/issues. Prefix your issue with "x/crypto:" in the
|
|
||||||
subject line, so it is easy to find.
|
|
||||||
|
|
||||||
Note that contributions to the cryptography package receive additional scrutiny
|
|
||||||
due to their sensitive nature. Patches may take longer than normal to receive
|
|
||||||
feedback.
|
|
43
vendor/golang.org/x/crypto/acme/acme.go
generated
vendored
43
vendor/golang.org/x/crypto/acme/acme.go
generated
vendored
|
@ -77,6 +77,10 @@ const (
|
||||||
type Client struct {
|
type Client struct {
|
||||||
// Key is the account key used to register with a CA and sign requests.
|
// Key is the account key used to register with a CA and sign requests.
|
||||||
// Key.Public() must return a *rsa.PublicKey or *ecdsa.PublicKey.
|
// Key.Public() must return a *rsa.PublicKey or *ecdsa.PublicKey.
|
||||||
|
//
|
||||||
|
// The following algorithms are supported:
|
||||||
|
// RS256, ES256, ES384 and ES512.
|
||||||
|
// See RFC7518 for more details about the algorithms.
|
||||||
Key crypto.Signer
|
Key crypto.Signer
|
||||||
|
|
||||||
// HTTPClient optionally specifies an HTTP client to use
|
// HTTPClient optionally specifies an HTTP client to use
|
||||||
|
@ -124,11 +128,7 @@ func (c *Client) Discover(ctx context.Context) (Directory, error) {
|
||||||
return *c.dir, nil
|
return *c.dir, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
dirURL := c.DirectoryURL
|
res, err := c.get(ctx, c.directoryURL(), wantStatus(http.StatusOK))
|
||||||
if dirURL == "" {
|
|
||||||
dirURL = LetsEncryptURL
|
|
||||||
}
|
|
||||||
res, err := c.get(ctx, dirURL, wantStatus(http.StatusOK))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Directory{}, err
|
return Directory{}, err
|
||||||
}
|
}
|
||||||
|
@ -161,6 +161,13 @@ func (c *Client) Discover(ctx context.Context) (Directory, error) {
|
||||||
return *c.dir, nil
|
return *c.dir, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) directoryURL() string {
|
||||||
|
if c.DirectoryURL != "" {
|
||||||
|
return c.DirectoryURL
|
||||||
|
}
|
||||||
|
return LetsEncryptURL
|
||||||
|
}
|
||||||
|
|
||||||
// CreateCert requests a new certificate using the Certificate Signing Request csr encoded in DER format.
|
// CreateCert requests a new certificate using the Certificate Signing Request csr encoded in DER format.
|
||||||
// The exp argument indicates the desired certificate validity duration. CA may issue a certificate
|
// The exp argument indicates the desired certificate validity duration. CA may issue a certificate
|
||||||
// with a different duration.
|
// with a different duration.
|
||||||
|
@ -319,6 +326,20 @@ func (c *Client) UpdateReg(ctx context.Context, a *Account) (*Account, error) {
|
||||||
// a valid authorization (Authorization.Status is StatusValid). If so, the caller
|
// a valid authorization (Authorization.Status is StatusValid). If so, the caller
|
||||||
// need not fulfill any challenge and can proceed to requesting a certificate.
|
// need not fulfill any challenge and can proceed to requesting a certificate.
|
||||||
func (c *Client) Authorize(ctx context.Context, domain string) (*Authorization, error) {
|
func (c *Client) Authorize(ctx context.Context, domain string) (*Authorization, error) {
|
||||||
|
return c.authorize(ctx, "dns", domain)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AuthorizeIP is the same as Authorize but requests IP address authorization.
|
||||||
|
// Clients which successfully obtain such authorization may request to issue
|
||||||
|
// a certificate for IP addresses.
|
||||||
|
//
|
||||||
|
// See the ACME spec extension for more details about IP address identifiers:
|
||||||
|
// https://tools.ietf.org/html/draft-ietf-acme-ip.
|
||||||
|
func (c *Client) AuthorizeIP(ctx context.Context, ipaddr string) (*Authorization, error) {
|
||||||
|
return c.authorize(ctx, "ip", ipaddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) authorize(ctx context.Context, typ, val string) (*Authorization, error) {
|
||||||
if _, err := c.Discover(ctx); err != nil {
|
if _, err := c.Discover(ctx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -332,7 +353,7 @@ func (c *Client) Authorize(ctx context.Context, domain string) (*Authorization,
|
||||||
Identifier authzID `json:"identifier"`
|
Identifier authzID `json:"identifier"`
|
||||||
}{
|
}{
|
||||||
Resource: "new-authz",
|
Resource: "new-authz",
|
||||||
Identifier: authzID{Type: "dns", Value: domain},
|
Identifier: authzID{Type: typ, Value: val},
|
||||||
}
|
}
|
||||||
res, err := c.post(ctx, c.Key, c.dir.AuthzURL, req, wantStatus(http.StatusCreated))
|
res, err := c.post(ctx, c.Key, c.dir.AuthzURL, req, wantStatus(http.StatusCreated))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -693,12 +714,18 @@ func (c *Client) doReg(ctx context.Context, url string, typ string, acct *Accoun
|
||||||
}
|
}
|
||||||
|
|
||||||
// popNonce returns a nonce value previously stored with c.addNonce
|
// popNonce returns a nonce value previously stored with c.addNonce
|
||||||
// or fetches a fresh one from the given URL.
|
// or fetches a fresh one from a URL by issuing a HEAD request.
|
||||||
|
// It first tries c.directoryURL() and then the provided url if the former fails.
|
||||||
func (c *Client) popNonce(ctx context.Context, url string) (string, error) {
|
func (c *Client) popNonce(ctx context.Context, url string) (string, error) {
|
||||||
c.noncesMu.Lock()
|
c.noncesMu.Lock()
|
||||||
defer c.noncesMu.Unlock()
|
defer c.noncesMu.Unlock()
|
||||||
if len(c.nonces) == 0 {
|
if len(c.nonces) == 0 {
|
||||||
return c.fetchNonce(ctx, url)
|
dirURL := c.directoryURL()
|
||||||
|
v, err := c.fetchNonce(ctx, dirURL)
|
||||||
|
if err != nil && url != dirURL {
|
||||||
|
v, err = c.fetchNonce(ctx, url)
|
||||||
|
}
|
||||||
|
return v, err
|
||||||
}
|
}
|
||||||
var nonce string
|
var nonce string
|
||||||
for nonce = range c.nonces {
|
for nonce = range c.nonces {
|
||||||
|
|
29
vendor/golang.org/x/crypto/acme/jws.go
generated
vendored
29
vendor/golang.org/x/crypto/acme/jws.go
generated
vendored
|
@ -25,7 +25,7 @@ func jwsEncodeJSON(claimset interface{}, key crypto.Signer, nonce string) ([]byt
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
alg, sha := jwsHasher(key)
|
alg, sha := jwsHasher(key.Public())
|
||||||
if alg == "" || !sha.Available() {
|
if alg == "" || !sha.Available() {
|
||||||
return nil, ErrUnsupportedKey
|
return nil, ErrUnsupportedKey
|
||||||
}
|
}
|
||||||
|
@ -97,13 +97,16 @@ func jwkEncode(pub crypto.PublicKey) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// jwsSign signs the digest using the given key.
|
// jwsSign signs the digest using the given key.
|
||||||
// It returns ErrUnsupportedKey if the key type is unknown.
|
// The hash is unused for ECDSA keys.
|
||||||
// The hash is used only for RSA keys.
|
//
|
||||||
|
// Note: non-stdlib crypto.Signer implementations are expected to return
|
||||||
|
// the signature in the format as specified in RFC7518.
|
||||||
|
// See https://tools.ietf.org/html/rfc7518 for more details.
|
||||||
func jwsSign(key crypto.Signer, hash crypto.Hash, digest []byte) ([]byte, error) {
|
func jwsSign(key crypto.Signer, hash crypto.Hash, digest []byte) ([]byte, error) {
|
||||||
switch key := key.(type) {
|
if key, ok := key.(*ecdsa.PrivateKey); ok {
|
||||||
case *rsa.PrivateKey:
|
// The key.Sign method of ecdsa returns ASN1-encoded signature.
|
||||||
return key.Sign(rand.Reader, digest, hash)
|
// So, we use the package Sign function instead
|
||||||
case *ecdsa.PrivateKey:
|
// to get R and S values directly and format the result accordingly.
|
||||||
r, s, err := ecdsa.Sign(rand.Reader, key, digest)
|
r, s, err := ecdsa.Sign(rand.Reader, key, digest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -118,18 +121,18 @@ func jwsSign(key crypto.Signer, hash crypto.Hash, digest []byte) ([]byte, error)
|
||||||
copy(sig[size*2-len(sb):], sb)
|
copy(sig[size*2-len(sb):], sb)
|
||||||
return sig, nil
|
return sig, nil
|
||||||
}
|
}
|
||||||
return nil, ErrUnsupportedKey
|
return key.Sign(rand.Reader, digest, hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
// jwsHasher indicates suitable JWS algorithm name and a hash function
|
// jwsHasher indicates suitable JWS algorithm name and a hash function
|
||||||
// to use for signing a digest with the provided key.
|
// to use for signing a digest with the provided key.
|
||||||
// It returns ("", 0) if the key is not supported.
|
// It returns ("", 0) if the key is not supported.
|
||||||
func jwsHasher(key crypto.Signer) (string, crypto.Hash) {
|
func jwsHasher(pub crypto.PublicKey) (string, crypto.Hash) {
|
||||||
switch key := key.(type) {
|
switch pub := pub.(type) {
|
||||||
case *rsa.PrivateKey:
|
case *rsa.PublicKey:
|
||||||
return "RS256", crypto.SHA256
|
return "RS256", crypto.SHA256
|
||||||
case *ecdsa.PrivateKey:
|
case *ecdsa.PublicKey:
|
||||||
switch key.Params().Name {
|
switch pub.Params().Name {
|
||||||
case "P-256":
|
case "P-256":
|
||||||
return "ES256", crypto.SHA256
|
return "ES256", crypto.SHA256
|
||||||
case "P-384":
|
case "P-384":
|
||||||
|
|
8
vendor/golang.org/x/crypto/blowfish/cipher.go
generated
vendored
8
vendor/golang.org/x/crypto/blowfish/cipher.go
generated
vendored
|
@ -3,6 +3,14 @@
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
// Package blowfish implements Bruce Schneier's Blowfish encryption algorithm.
|
// Package blowfish implements Bruce Schneier's Blowfish encryption algorithm.
|
||||||
|
//
|
||||||
|
// Blowfish is a legacy cipher and its short block size makes it vulnerable to
|
||||||
|
// birthday bound attacks (see https://sweet32.info). It should only be used
|
||||||
|
// where compatibility with legacy systems, not security, is the goal.
|
||||||
|
//
|
||||||
|
// Deprecated: any new system should use AES (from crypto/aes, if necessary in
|
||||||
|
// an AEAD mode like crypto/cipher.NewGCM) or XChaCha20-Poly1305 (from
|
||||||
|
// golang.org/x/crypto/chacha20poly1305).
|
||||||
package blowfish // import "golang.org/x/crypto/blowfish"
|
package blowfish // import "golang.org/x/crypto/blowfish"
|
||||||
|
|
||||||
// The code is a port of Bruce Schneier's C implementation.
|
// The code is a port of Bruce Schneier's C implementation.
|
||||||
|
|
8
vendor/golang.org/x/crypto/curve25519/const_amd64.h
generated
vendored
8
vendor/golang.org/x/crypto/curve25519/const_amd64.h
generated
vendored
|
@ -1,8 +0,0 @@
|
||||||
// Copyright 2012 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.
|
|
||||||
|
|
||||||
// This code was translated into a form compatible with 6a from the public
|
|
||||||
// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html
|
|
||||||
|
|
||||||
#define REDMASK51 0x0007FFFFFFFFFFFF
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue