aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com')
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go4
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/client/client.go4
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go30
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go1
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go22
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go21
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/request/http_request_1_4.go31
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go19
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/request/request.go50
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/session/session.go7
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go32
-rw-r--r--vendor/github.com/aws/aws-sdk-go/aws/version.go2
-rw-r--r--vendor/github.com/aws/aws-sdk-go/service/s3/api.go411
-rw-r--r--vendor/github.com/aws/aws-sdk-go/service/s3/waiters.go16
-rw-r--r--vendor/github.com/aws/aws-sdk-go/service/sts/api.go36
-rw-r--r--vendor/github.com/davecgh/go-spew/spew/bypass.go7
-rw-r--r--vendor/github.com/davecgh/go-spew/spew/bypasssafe.go7
-rw-r--r--vendor/github.com/davecgh/go-spew/spew/config.go2
-rw-r--r--vendor/github.com/fsnotify/fsnotify/AUTHORS2
-rw-r--r--vendor/github.com/fsnotify/fsnotify/CHANGELOG.md8
-rw-r--r--vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md2
-rw-r--r--vendor/github.com/fsnotify/fsnotify/README.md2
-rw-r--r--vendor/github.com/fsnotify/fsnotify/fsnotify.go26
-rw-r--r--vendor/github.com/golang/protobuf/proto/encode.go14
-rw-r--r--vendor/github.com/google/go-github/github/activity_events.go4
-rw-r--r--vendor/github.com/google/go-github/github/event_types.go34
-rw-r--r--vendor/github.com/google/go-github/github/github.go7
-rw-r--r--vendor/github.com/google/go-github/github/messages.go71
-rw-r--r--vendor/github.com/google/go-github/github/pulls.go1
-rw-r--r--vendor/github.com/google/go-github/github/repos_forks.go2
-rw-r--r--vendor/github.com/google/go-github/github/repos_projects.go464
-rw-r--r--vendor/github.com/gorilla/csrf/README.md2
-rw-r--r--vendor/github.com/gorilla/csrf/csrf.go2
-rw-r--r--vendor/github.com/gorilla/mux/doc.go4
-rw-r--r--vendor/github.com/gorilla/securecookie/securecookie.go8
-rw-r--r--vendor/github.com/gorilla/sessions/README.md2
-rw-r--r--vendor/github.com/gorilla/sessions/store.go25
-rw-r--r--vendor/github.com/hashicorp/hcl/hcl/ast/ast.go3
-rw-r--r--vendor/github.com/hashicorp/hcl/hcl/parser/parser.go6
-rw-r--r--vendor/github.com/hashicorp/hcl/json/parser/parser.go9
-rw-r--r--vendor/github.com/mattn/go-sqlite3/doc.go2
-rw-r--r--vendor/github.com/mattn/go-sqlite3/sqlite3.go129
-rw-r--r--vendor/github.com/mattn/go-sqlite3/tracecallback.go415
-rw-r--r--vendor/github.com/mattn/go-sqlite3/tracecallback_noimpl.go9
-rw-r--r--vendor/github.com/mitchellh/mapstructure/mapstructure.go6
-rw-r--r--vendor/github.com/pelletier/go-toml/keysparsing.go16
-rw-r--r--vendor/github.com/pelletier/go-toml/toml.go3
-rw-r--r--vendor/github.com/pelletier/go-toml/tomltree_conversions.go54
-rw-r--r--vendor/github.com/pkg/errors/errors.go37
-rw-r--r--vendor/github.com/pkg/sftp/client.go7
-rw-r--r--vendor/github.com/pkg/sftp/server_statvfs_linux.go5
-rw-r--r--vendor/github.com/spf13/afero/mem/file.go8
-rw-r--r--vendor/github.com/spf13/cast/cast.go5
-rw-r--r--vendor/github.com/spf13/cast/caste.go70
-rw-r--r--vendor/github.com/spf13/pflag/bool.go7
-rw-r--r--vendor/github.com/spf13/pflag/count.go7
-rw-r--r--vendor/github.com/spf13/pflag/flag.go16
-rw-r--r--vendor/github.com/spf13/pflag/float32.go7
-rw-r--r--vendor/github.com/spf13/pflag/float64.go7
-rw-r--r--vendor/github.com/spf13/pflag/int.go7
-rw-r--r--vendor/github.com/spf13/pflag/int32.go7
-rw-r--r--vendor/github.com/spf13/pflag/int64.go7
-rw-r--r--vendor/github.com/spf13/pflag/int8.go7
-rw-r--r--vendor/github.com/spf13/pflag/string.go4
-rw-r--r--vendor/github.com/spf13/pflag/string_array.go110
-rw-r--r--vendor/github.com/spf13/pflag/string_slice.go20
-rw-r--r--vendor/github.com/spf13/pflag/uint.go7
-rw-r--r--vendor/github.com/spf13/pflag/uint16.go9
-rw-r--r--vendor/github.com/spf13/pflag/uint32.go11
-rw-r--r--vendor/github.com/spf13/pflag/uint64.go7
-rw-r--r--vendor/github.com/spf13/pflag/uint8.go7
-rw-r--r--vendor/github.com/spf13/viper/README.md19
-rw-r--r--vendor/github.com/spf13/viper/util.go75
-rw-r--r--vendor/github.com/spf13/viper/viper.go643
-rw-r--r--vendor/github.com/stretchr/testify/assert/assertion_forward.go167
-rw-r--r--vendor/github.com/stretchr/testify/assert/assertions.go101
-rw-r--r--vendor/github.com/stretchr/testify/assert/http_assertions.go2
77 files changed, 2564 insertions, 856 deletions
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go
index 4d2a01e..11c52c3 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go
@@ -106,8 +106,8 @@ func rValuesAtPath(v interface{}, path string, createPath, caseSensitive, nilTer
if indexStar || index != nil {
nextvals = []reflect.Value{}
- for _, value := range values {
- value := reflect.Indirect(value)
+ for _, valItem := range values {
+ value := reflect.Indirect(valItem)
if value.Kind() != reflect.Slice {
continue
}
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/client.go b/vendor/github.com/aws/aws-sdk-go/aws/client/client.go
index 4003c04..7c0e7d9 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/client/client.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/client/client.go
@@ -2,7 +2,6 @@ package client
import (
"fmt"
- "io/ioutil"
"net/http/httputil"
"github.com/aws/aws-sdk-go/aws"
@@ -104,8 +103,7 @@ func logRequest(r *request.Request) {
// Reset the request body because dumpRequest will re-wrap the r.HTTPRequest's
// Body as a NoOpCloser and will not be reset after read by the HTTP
// client reader.
- r.Body.Seek(r.BodyStart, 0)
- r.HTTPRequest.Body = ioutil.NopCloser(r.Body)
+ r.ResetBody()
}
r.Config.Logger.Log(fmt.Sprintf(logReqMsg, r.ClientInfo.ServiceName, r.Operation.Name, string(dumpedBody)))
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go
index 8456e29..8e12f82 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go
@@ -10,9 +10,11 @@ import (
"regexp"
"runtime"
"strconv"
+ "time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
+ "github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/request"
)
@@ -67,6 +69,34 @@ var SDKVersionUserAgentHandler = request.NamedHandler{
var reStatusCode = regexp.MustCompile(`^(\d{3})`)
+// ValidateReqSigHandler is a request handler to ensure that the request's
+// signature doesn't expire before it is sent. This can happen when a request
+// is built and signed signficantly before it is sent. Or signficant delays
+// occur whne retrying requests that would cause the signature to expire.
+var ValidateReqSigHandler = request.NamedHandler{
+ Name: "core.ValidateReqSigHandler",
+ Fn: func(r *request.Request) {
+ // Unsigned requests are not signed
+ if r.Config.Credentials == credentials.AnonymousCredentials {
+ return
+ }
+
+ signedTime := r.Time
+ if !r.LastSignedAt.IsZero() {
+ signedTime = r.LastSignedAt
+ }
+
+ // 10 minutes to allow for some clock skew/delays in transmission.
+ // Would be improved with aws/aws-sdk-go#423
+ if signedTime.Add(10 * time.Minute).After(time.Now()) {
+ return
+ }
+
+ fmt.Println("request expired, resigning")
+ r.Sign()
+ },
+}
+
// SendHandler is a request handler to send service request using HTTP client.
var SendHandler = request.NamedHandler{Name: "core.SendHandler", Fn: func(r *request.Request) {
var err error
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
index 10b7d86..8dbbf67 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
@@ -72,6 +72,7 @@ func Handlers() request.Handlers {
handlers.Build.PushBackNamed(corehandlers.SDKVersionUserAgentHandler)
handlers.Build.AfterEachFn = request.HandlerListStopOnError
handlers.Sign.PushBackNamed(corehandlers.BuildContentLengthHandler)
+ handlers.Send.PushBackNamed(corehandlers.ValidateReqSigHandler)
handlers.Send.PushBackNamed(corehandlers.SendHandler)
handlers.AfterRetry.PushBackNamed(corehandlers.AfterRetryHandler)
handlers.ValidateResponse.PushBackNamed(corehandlers.ValidateResponseHandler)
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go
index 669c813..e5755d1 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go
@@ -3,6 +3,7 @@ package ec2metadata
import (
"encoding/json"
"fmt"
+ "net/http"
"path"
"strings"
"time"
@@ -27,6 +28,27 @@ func (c *EC2Metadata) GetMetadata(p string) (string, error) {
return output.Content, req.Send()
}
+// GetUserData returns the userdata that was configured for the service. If
+// there is no user-data setup for the EC2 instance a "NotFoundError" error
+// code will be returned.
+func (c *EC2Metadata) GetUserData() (string, error) {
+ op := &request.Operation{
+ Name: "GetUserData",
+ HTTPMethod: "GET",
+ HTTPPath: path.Join("/", "user-data"),
+ }
+
+ output := &metadataOutput{}
+ req := c.NewRequest(op, nil, output)
+ req.Handlers.UnmarshalError.PushBack(func(r *request.Request) {
+ if r.HTTPResponse.StatusCode == http.StatusNotFound {
+ r.Error = awserr.New("NotFoundError", "user-data not found", r.Error)
+ }
+ })
+
+ return output.Content, req.Send()
+}
+
// GetDynamicData uses the path provided to request information from the EC2
// instance metadata service for dynamic data. The content will be returned
// as a string, or error if the request failed.
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go b/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go
index a4087f2..79f7960 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go
@@ -1,5 +1,3 @@
-// +build go1.5
-
package request
import (
@@ -9,20 +7,13 @@ import (
)
func copyHTTPRequest(r *http.Request, body io.ReadCloser) *http.Request {
- req := &http.Request{
- URL: &url.URL{},
- Header: http.Header{},
- Close: r.Close,
- Body: body,
- Host: r.Host,
- Method: r.Method,
- Proto: r.Proto,
- ContentLength: r.ContentLength,
- // Cancel will be deprecated in 1.7 and will be replaced with Context
- Cancel: r.Cancel,
- }
-
+ req := new(http.Request)
+ *req = *r
+ req.URL = &url.URL{}
*req.URL = *r.URL
+ req.Body = body
+
+ req.Header = http.Header{}
for k, v := range r.Header {
for _, vv := range v {
req.Header.Add(k, vv)
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/http_request_1_4.go b/vendor/github.com/aws/aws-sdk-go/aws/request/http_request_1_4.go
deleted file mode 100644
index 75da021..0000000
--- a/vendor/github.com/aws/aws-sdk-go/aws/request/http_request_1_4.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// +build !go1.5
-
-package request
-
-import (
- "io"
- "net/http"
- "net/url"
-)
-
-func copyHTTPRequest(r *http.Request, body io.ReadCloser) *http.Request {
- req := &http.Request{
- URL: &url.URL{},
- Header: http.Header{},
- Close: r.Close,
- Body: body,
- Host: r.Host,
- Method: r.Method,
- Proto: r.Proto,
- ContentLength: r.ContentLength,
- }
-
- *req.URL = *r.URL
- for k, v := range r.Header {
- for _, vv := range v {
- req.Header.Add(k, vv)
- }
- }
-
- return req
-}
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go b/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go
index da6396d..02f07f4 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go
@@ -9,7 +9,7 @@ import (
// with retrying requests
type offsetReader struct {
buf io.ReadSeeker
- lock sync.RWMutex
+ lock sync.Mutex
closed bool
}
@@ -21,7 +21,8 @@ func newOffsetReader(buf io.ReadSeeker, offset int64) *offsetReader {
return reader
}
-// Close is a thread-safe close. Uses the write lock.
+// Close will close the instance of the offset reader's access to
+// the underlying io.ReadSeeker.
func (o *offsetReader) Close() error {
o.lock.Lock()
defer o.lock.Unlock()
@@ -29,10 +30,10 @@ func (o *offsetReader) Close() error {
return nil
}
-// Read is a thread-safe read using a read lock.
+// Read is a thread-safe read of the underlying io.ReadSeeker
func (o *offsetReader) Read(p []byte) (int, error) {
- o.lock.RLock()
- defer o.lock.RUnlock()
+ o.lock.Lock()
+ defer o.lock.Unlock()
if o.closed {
return 0, io.EOF
@@ -41,6 +42,14 @@ func (o *offsetReader) Read(p []byte) (int, error) {
return o.buf.Read(p)
}
+// Seek is a thread-safe seeking operation.
+func (o *offsetReader) Seek(offset int64, whence int) (int64, error) {
+ o.lock.Lock()
+ defer o.lock.Unlock()
+
+ return o.buf.Seek(offset, whence)
+}
+
// CloseAndCopy will return a new offsetReader with a copy of the old buffer
// and close the old buffer.
func (o *offsetReader) CloseAndCopy(offset int64) *offsetReader {
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request.go
index 2832aaa..8ef9715 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/request/request.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/request/request.go
@@ -4,7 +4,6 @@ import (
"bytes"
"fmt"
"io"
- "io/ioutil"
"net/http"
"net/url"
"reflect"
@@ -42,6 +41,12 @@ type Request struct {
LastSignedAt time.Time
built bool
+
+ // Need to persist an intermideant body betweend the input Body and HTTP
+ // request body because the HTTP Client's transport can maintain a reference
+ // to the HTTP request's body after the client has returned. This value is
+ // safe to use concurrently and rewraps the input Body for each HTTP request.
+ safeBody *offsetReader
}
// An Operation is the service API operation to be made.
@@ -135,8 +140,8 @@ func (r *Request) SetStringBody(s string) {
// SetReaderBody will set the request's body reader.
func (r *Request) SetReaderBody(reader io.ReadSeeker) {
- r.HTTPRequest.Body = newOffsetReader(reader, 0)
r.Body = reader
+ r.ResetBody()
}
// Presign returns the request's signed URL. Error will be returned
@@ -220,6 +225,24 @@ func (r *Request) Sign() error {
return r.Error
}
+// ResetBody rewinds the request body backto its starting position, and
+// set's the HTTP Request body reference. When the body is read prior
+// to being sent in the HTTP request it will need to be rewound.
+func (r *Request) ResetBody() {
+ if r.safeBody != nil {
+ r.safeBody.Close()
+ }
+
+ r.safeBody = newOffsetReader(r.Body, r.BodyStart)
+ r.HTTPRequest.Body = r.safeBody
+}
+
+// GetBody will return an io.ReadSeeker of the Request's underlying
+// input body with a concurrency safe wrapper.
+func (r *Request) GetBody() io.ReadSeeker {
+ return r.safeBody
+}
+
// Send will send the request returning error if errors are encountered.
//
// Send will sign the request prior to sending. All Send Handlers will
@@ -231,6 +254,8 @@ func (r *Request) Sign() error {
//
// readLoop() and getConn(req *Request, cm connectMethod)
// https://github.com/golang/go/blob/master/src/net/http/transport.go
+//
+// Send will not close the request.Request's body.
func (r *Request) Send() error {
for {
if aws.BoolValue(r.Retryable) {
@@ -239,21 +264,15 @@ func (r *Request) Send() error {
r.ClientInfo.ServiceName, r.Operation.Name, r.RetryCount))
}
- var body io.ReadCloser
- if reader, ok := r.HTTPRequest.Body.(*offsetReader); ok {
- body = reader.CloseAndCopy(r.BodyStart)
- } else {
- if r.Config.Logger != nil {
- r.Config.Logger.Log("Request body type has been overwritten. May cause race conditions")
- }
- r.Body.Seek(r.BodyStart, 0)
- body = ioutil.NopCloser(r.Body)
- }
+ // The previous http.Request will have a reference to the r.Body
+ // and the HTTP Client's Transport may still be reading from
+ // the request's body even though the Client's Do returned.
+ r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, nil)
+ r.ResetBody()
- r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, body)
+ // Closing response body to ensure that no response body is leaked
+ // between retry attempts.
if r.HTTPResponse != nil && r.HTTPResponse.Body != nil {
- // Closing response body. Since we are setting a new request to send off, this
- // response will get squashed and leaked.
r.HTTPResponse.Body.Close()
}
}
@@ -281,7 +300,6 @@ func (r *Request) Send() error {
debugLogReqError(r, "Send Request", true, err)
continue
}
-
r.Handlers.UnmarshalMeta.Run(r)
r.Handlers.ValidateResponse.Run(r)
if r.Error != nil {
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/session.go b/vendor/github.com/aws/aws-sdk-go/aws/session/session.go
index 2374b1f..602f4e1 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/session/session.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/session/session.go
@@ -179,7 +179,12 @@ type Options struct {
// SharedConfigState: SharedConfigEnable,
// })
func NewSessionWithOptions(opts Options) (*Session, error) {
- envCfg := loadEnvConfig()
+ var envCfg envConfig
+ if opts.SharedConfigState == SharedConfigEnable {
+ envCfg = loadSharedEnvConfig()
+ } else {
+ envCfg = loadEnvConfig()
+ }
if len(opts.Profile) > 0 {
envCfg.Profile = opts.Profile
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
index 7d99f54..eb79ded 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
@@ -11,6 +11,7 @@ import (
"encoding/hex"
"fmt"
"io"
+ "io/ioutil"
"net/http"
"net/url"
"sort"
@@ -175,6 +176,12 @@ type signingCtx struct {
// is not needed as the full request context will be captured by the http.Request
// value. It is included for reference though.
//
+// Sign will set the request's Body to be the `body` parameter passed in. If
+// the body is not already an io.ReadCloser, it will be wrapped within one. If
+// a `nil` body parameter passed to Sign, the request's Body field will be
+// also set to nil. Its important to note that this functionality will not
+// change the request's ContentLength of the request.
+//
// Sign differs from Presign in that it will sign the request using HTTP
// header values. This type of signing is intended for http.Request values that
// will not be shared, or are shared in a way the header values on the request
@@ -240,11 +247,6 @@ func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, regi
}
if ctx.isRequestSigned() {
- if !v4.Credentials.IsExpired() && currentTimeFn().Before(ctx.Time.Add(10*time.Minute)) {
- // If the request is already signed, and the credentials have not
- // expired, and the request is not too old ignore the signing request.
- return ctx.SignedHeaderVals, nil
- }
ctx.Time = currentTimeFn()
ctx.handlePresignRemoval()
}
@@ -258,6 +260,20 @@ func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, regi
ctx.assignAmzQueryValues()
ctx.build(v4.DisableHeaderHoisting)
+ // If the request is not presigned the body should be attached to it. This
+ // prevents the confusion of wanting to send a signed request without
+ // the body the request was signed for attached.
+ if !ctx.isPresign {
+ var reader io.ReadCloser
+ if body != nil {
+ var ok bool
+ if reader, ok = body.(io.ReadCloser); !ok {
+ reader = ioutil.NopCloser(body)
+ }
+ }
+ r.Body = reader
+ }
+
if v4.Debug.Matches(aws.LogDebugWithSigning) {
v4.logSigningInfo(ctx)
}
@@ -345,7 +361,9 @@ func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time
signingTime = req.LastSignedAt
}
- signedHeaders, err := v4.signWithBody(req.HTTPRequest, req.Body, name, region, req.ExpireTime, signingTime)
+ signedHeaders, err := v4.signWithBody(req.HTTPRequest, req.GetBody(),
+ name, region, req.ExpireTime, signingTime,
+ )
if err != nil {
req.Error = err
req.SignedHeaderVals = nil
@@ -356,7 +374,7 @@ func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time
req.LastSignedAt = curTimeFn()
}
-const logSignInfoMsg = `DEBUG: Request Signiture:
+const logSignInfoMsg = `DEBUG: Request Signature:
---[ CANONICAL STRING ]-----------------------------
%s
---[ STRING TO SIGN ]--------------------------------
diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go
index c87a0c2..472f38c 100644
--- a/vendor/github.com/aws/aws-sdk-go/aws/version.go
+++ b/vendor/github.com/aws/aws-sdk-go/aws/version.go
@@ -5,4 +5,4 @@ package aws
const SDKName = "aws-sdk-go"
// SDKVersion is the version of this SDK
-const SDKVersion = "1.4.6"
+const SDKVersion = "1.4.14"
diff --git a/vendor/github.com/aws/aws-sdk-go/service/s3/api.go b/vendor/github.com/aws/aws-sdk-go/service/s3/api.go
index 553b0e4..c71b6eb 100644
--- a/vendor/github.com/aws/aws-sdk-go/service/s3/api.go
+++ b/vendor/github.com/aws/aws-sdk-go/service/s3/api.go
@@ -3120,8 +3120,10 @@ func (s AbortIncompleteMultipartUpload) GoString() string {
type AbortMultipartUploadInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Confirms that the requester knows that she or he will be charged for the
@@ -3130,6 +3132,7 @@ type AbortMultipartUploadInput struct {
// at http://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html
RequestPayer *string `location:"header" locationName:"x-amz-request-payer" type:"string" enum:"RequestPayer"`
+ // UploadId is a required field
UploadId *string `location:"querystring" locationName:"uploadId" type:"string" required:"true"`
}
@@ -3262,6 +3265,7 @@ func (s Bucket) GoString() string {
type BucketLifecycleConfiguration struct {
_ struct{} `type:"structure"`
+ // Rules is a required field
Rules []*LifecycleRule `locationName:"Rule" type:"list" flattened:"true" required:"true"`
}
@@ -3332,6 +3336,7 @@ func (s *BucketLoggingStatus) Validate() error {
type CORSConfiguration struct {
_ struct{} `type:"structure"`
+ // CORSRules is a required field
CORSRules []*CORSRule `locationName:"CORSRule" type:"list" flattened:"true" required:"true"`
}
@@ -3376,9 +3381,13 @@ type CORSRule struct {
// Identifies HTTP methods that the domain/origin specified in the rule is allowed
// to execute.
+ //
+ // AllowedMethods is a required field
AllowedMethods []*string `locationName:"AllowedMethod" type:"list" flattened:"true" required:"true"`
// One or more origins you want customers to be able to access the bucket from.
+ //
+ // AllowedOrigins is a required field
AllowedOrigins []*string `locationName:"AllowedOrigin" type:"list" flattened:"true" required:"true"`
// One or more headers in the response that you want customers to be able to
@@ -3463,8 +3472,10 @@ func (s CommonPrefix) GoString() string {
type CompleteMultipartUploadInput struct {
_ struct{} `type:"structure" payload:"MultipartUpload"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
MultipartUpload *CompletedMultipartUpload `locationName:"CompleteMultipartUpload" type:"structure"`
@@ -3475,6 +3486,7 @@ type CompleteMultipartUploadInput struct {
// at http://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html
RequestPayer *string `location:"header" locationName:"x-amz-request-payer" type:"string" enum:"RequestPayer"`
+ // UploadId is a required field
UploadId *string `location:"querystring" locationName:"uploadId" type:"string" required:"true"`
}
@@ -3625,6 +3637,7 @@ type CopyObjectInput struct {
// The canned ACL to apply to the object.
ACL *string `location:"header" locationName:"x-amz-acl" type:"string" enum:"ObjectCannedACL"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Specifies caching behavior along the request/reply chain.
@@ -3646,6 +3659,8 @@ type CopyObjectInput struct {
// The name of the source bucket and key name of the source object, separated
// by a slash (/). Must be URL-encoded.
+ //
+ // CopySource is a required field
CopySource *string `location:"header" locationName:"x-amz-copy-source" type:"string" required:"true"`
// Copies the object if its entity tag (ETag) matches the specified tag.
@@ -3689,6 +3704,7 @@ type CopyObjectInput struct {
// Allows grantee to write the ACL for the applicable object.
GrantWriteACP *string `location:"header" locationName:"x-amz-grant-write-acp" type:"string"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// A map of metadata to store with the object in S3.
@@ -3878,6 +3894,7 @@ type CreateBucketInput struct {
// The canned ACL to apply to the bucket.
ACL *string `location:"header" locationName:"x-amz-acl" type:"string" enum:"BucketCannedACL"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
CreateBucketConfiguration *CreateBucketConfiguration `locationName:"CreateBucketConfiguration" type:"structure"`
@@ -3944,6 +3961,7 @@ type CreateMultipartUploadInput struct {
// The canned ACL to apply to the object.
ACL *string `location:"header" locationName:"x-amz-acl" type:"string" enum:"ObjectCannedACL"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Specifies caching behavior along the request/reply chain.
@@ -3978,6 +3996,7 @@ type CreateMultipartUploadInput struct {
// Allows grantee to write the ACL for the applicable object.
GrantWriteACP *string `location:"header" locationName:"x-amz-grant-write-acp" type:"string"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// A map of metadata to store with the object in S3.
@@ -4107,6 +4126,7 @@ func (s CreateMultipartUploadOutput) GoString() string {
type Delete struct {
_ struct{} `type:"structure"`
+ // Objects is a required field
Objects []*ObjectIdentifier `locationName:"Object" type:"list" flattened:"true" required:"true"`
// Element to enable quiet mode for the request. When you add this element,
@@ -4150,6 +4170,7 @@ func (s *Delete) Validate() error {
type DeleteBucketCorsInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4193,6 +4214,7 @@ func (s DeleteBucketCorsOutput) GoString() string {
type DeleteBucketInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4222,6 +4244,7 @@ func (s *DeleteBucketInput) Validate() error {
type DeleteBucketLifecycleInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4279,6 +4302,7 @@ func (s DeleteBucketOutput) GoString() string {
type DeleteBucketPolicyInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4322,6 +4346,7 @@ func (s DeleteBucketPolicyOutput) GoString() string {
type DeleteBucketReplicationInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4365,6 +4390,7 @@ func (s DeleteBucketReplicationOutput) GoString() string {
type DeleteBucketTaggingInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4408,6 +4434,7 @@ func (s DeleteBucketTaggingOutput) GoString() string {
type DeleteBucketWebsiteInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4480,8 +4507,10 @@ func (s DeleteMarkerEntry) GoString() string {
type DeleteObjectInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// The concatenation of the authentication device's serial number, a space,
@@ -4556,8 +4585,10 @@ func (s DeleteObjectOutput) GoString() string {
type DeleteObjectsInput struct {
_ struct{} `type:"structure" payload:"Delete"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Delete is a required field
Delete *Delete `locationName:"Delete" type:"structure" required:"true"`
// The concatenation of the authentication device's serial number, a space,
@@ -4651,6 +4682,8 @@ type Destination struct {
// Amazon resource name (ARN) of the bucket where you want Amazon S3 to store
// replicas of the object identified by the rule.
+ //
+ // Bucket is a required field
Bucket *string `type:"string" required:"true"`
// The class of storage used to store the object.
@@ -4706,6 +4739,8 @@ type ErrorDocument struct {
_ struct{} `type:"structure"`
// The object key name to use when a 4XX class error occurs.
+ //
+ // Key is a required field
Key *string `min:"1" type:"string" required:"true"`
}
@@ -4763,6 +4798,8 @@ type GetBucketAccelerateConfigurationInput struct {
_ struct{} `type:"structure"`
// Name of the bucket for which the accelerate configuration is retrieved.
+ //
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4809,6 +4846,7 @@ func (s GetBucketAccelerateConfigurationOutput) GoString() string {
type GetBucketAclInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4857,6 +4895,7 @@ func (s GetBucketAclOutput) GoString() string {
type GetBucketCorsInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4902,6 +4941,7 @@ func (s GetBucketCorsOutput) GoString() string {
type GetBucketLifecycleConfigurationInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4947,6 +4987,7 @@ func (s GetBucketLifecycleConfigurationOutput) GoString() string {
type GetBucketLifecycleInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -4992,6 +5033,7 @@ func (s GetBucketLifecycleOutput) GoString() string {
type GetBucketLocationInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5037,6 +5079,7 @@ func (s GetBucketLocationOutput) GoString() string {
type GetBucketLoggingInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5083,6 +5126,8 @@ type GetBucketNotificationConfigurationRequest struct {
_ struct{} `type:"structure"`
// Name of the bucket to get the notification configuration for.
+ //
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5112,6 +5157,7 @@ func (s *GetBucketNotificationConfigurationRequest) Validate() error {
type GetBucketPolicyInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5158,6 +5204,7 @@ func (s GetBucketPolicyOutput) GoString() string {
type GetBucketReplicationInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5205,6 +5252,7 @@ func (s GetBucketReplicationOutput) GoString() string {
type GetBucketRequestPaymentInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5251,6 +5299,7 @@ func (s GetBucketRequestPaymentOutput) GoString() string {
type GetBucketTaggingInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5280,6 +5329,7 @@ func (s *GetBucketTaggingInput) Validate() error {
type GetBucketTaggingOutput struct {
_ struct{} `type:"structure"`
+ // TagSet is a required field
TagSet []*Tag `locationNameList:"Tag" type:"list" required:"true"`
}
@@ -5296,6 +5346,7 @@ func (s GetBucketTaggingOutput) GoString() string {
type GetBucketVersioningInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5347,6 +5398,7 @@ func (s GetBucketVersioningOutput) GoString() string {
type GetBucketWebsiteInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5398,8 +5450,10 @@ func (s GetBucketWebsiteOutput) GoString() string {
type GetObjectAclInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Confirms that the requester knows that she or he will be charged for the
@@ -5467,6 +5521,7 @@ func (s GetObjectAclOutput) GoString() string {
type GetObjectInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Return the object only if its entity tag (ETag) is the same as the one specified,
@@ -5485,8 +5540,14 @@ type GetObjectInput struct {
// otherwise return a 412 (precondition failed).
IfUnmodifiedSince *time.Time `location:"header" locationName:"If-Unmodified-Since" type:"timestamp" timestampFormat:"rfc822"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
+ // Part number of the object being read. This is a positive integer between
+ // 1 and 10,000. Effectively performs a 'ranged' GET request for the part specified.
+ // Useful for downloading just a part of an object.
+ PartNumber *int64 `location:"querystring" locationName:"partNumber" type:"integer"`
+
// Downloads the specified range bytes of an object. For more information about
// the HTTP Range header, go to http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.
Range *string `location:"header" locationName:"Range" type:"string"`
@@ -5623,6 +5684,9 @@ type GetObjectOutput struct {
// you can create metadata whose values are not legal HTTP headers.
MissingMeta *int64 `location:"header" locationName:"x-amz-missing-meta" type:"integer"`
+ // The count of parts this object has.
+ PartsCount *int64 `location:"header" locationName:"x-amz-mp-parts-count" type:"integer"`
+
ReplicationStatus *string `location:"header" locationName:"x-amz-replication-status" type:"string" enum:"ReplicationStatus"`
// If present, indicates that the requester was successfully charged for the
@@ -5675,8 +5739,10 @@ func (s GetObjectOutput) GoString() string {
type GetObjectTorrentInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Confirms that the requester knows that she or he will be charged for the
@@ -5782,6 +5848,8 @@ type Grantee struct {
ID *string `type:"string"`
// Type of grantee
+ //
+ // Type is a required field
Type *string `locationName:"xsi:type" type:"string" xmlAttribute:"true" required:"true" enum:"Type"`
// URI of the grantee group.
@@ -5814,6 +5882,7 @@ func (s *Grantee) Validate() error {
type HeadBucketInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -5857,6 +5926,7 @@ func (s HeadBucketOutput) GoString() string {
type HeadObjectInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Return the object only if its entity tag (ETag) is the same as the one specified,
@@ -5875,8 +5945,15 @@ type HeadObjectInput struct {
// otherwise return a 412 (precondition failed).
IfUnmodifiedSince *time.Time `location:"header" locationName:"If-Unmodified-Since" type:"timestamp" timestampFormat:"rfc822"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
+ // Part number of the object being read. This is a positive integer between
+ // 1 and 10,000. Effectively performs a 'ranged' HEAD request for the part specified.
+ // Useful querying about the size of the part and the number of parts in this
+ // object.
+ PartNumber *int64 `location:"querystring" locationName:"partNumber" type:"integer"`
+
// Downloads the specified range bytes of an object. For more information about
// the HTTP Range header, go to http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.
Range *string `location:"header" locationName:"Range" type:"string"`
@@ -5989,6 +6066,9 @@ type HeadObjectOutput struct {
// you can create metadata whose values are not legal HTTP headers.
MissingMeta *int64 `location:"header" locationName:"x-amz-missing-meta" type:"integer"`
+ // The count of parts this object has.
+ PartsCount *int64 `location:"header" locationName:"x-amz-mp-parts-count" type:"integer"`
+
ReplicationStatus *string `location:"header" locationName:"x-amz-replication-status" type:"string" enum:"ReplicationStatus"`
// If present, indicates that the requester was successfully charged for the
@@ -6045,6 +6125,8 @@ type IndexDocument struct {
// endpoint (e.g. if the suffix is index.html and you make a request to samplebucket/images/
// the data that is returned will be for the object with the key name images/index.html)
// The suffix must not be empty and must not include a slash character.
+ //
+ // Suffix is a required field
Suffix *string `type:"string" required:"true"`
}
@@ -6115,6 +6197,7 @@ func (s KeyFilter) GoString() string {
type LambdaFunctionConfiguration struct {
_ struct{} `type:"structure"`
+ // Events is a required field
Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true"`
// Container for object key name filtering rules. For information about key
@@ -6128,6 +6211,8 @@ type LambdaFunctionConfiguration struct {
// Lambda cloud function ARN that Amazon S3 can invoke when it detects events
// of the specified type.
+ //
+ // LambdaFunctionArn is a required field
LambdaFunctionArn *string `locationName:"CloudFunction" type:"string" required:"true"`
}
@@ -6160,6 +6245,7 @@ func (s *LambdaFunctionConfiguration) Validate() error {
type LifecycleConfiguration struct {
_ struct{} `type:"structure"`
+ // Rules is a required field
Rules []*Rule `locationName:"Rule" type:"list" flattened:"true" required:"true"`
}
@@ -6246,10 +6332,14 @@ type LifecycleRule struct {
NoncurrentVersionTransitions []*NoncurrentVersionTransition `locationName:"NoncurrentVersionTransition" type:"list" flattened:"true"`
// Prefix identifying one or more objects to which the rule applies.
+ //
+ // Prefix is a required field
Prefix *string `type:"string" required:"true"`
// If 'Enabled', the rule is currently being applied. If 'Disabled', the rule
// is not currently being applied.
+ //
+ // Status is a required field
Status *string `type:"string" required:"true" enum:"ExpirationStatus"`
Transitions []*Transition `locationName:"Transition" type:"list" flattened:"true"`
@@ -6316,6 +6406,7 @@ func (s ListBucketsOutput) GoString() string {
type ListMultipartUploadsInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Character you use to group keys.
@@ -6428,6 +6519,7 @@ func (s ListMultipartUploadsOutput) GoString() string {
type ListObjectVersionsInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// A delimiter is a character you use to group keys.
@@ -6530,6 +6622,7 @@ func (s ListObjectVersionsOutput) GoString() string {
type ListObjectsInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// A delimiter is a character you use to group keys.
@@ -6552,6 +6645,11 @@ type ListObjectsInput struct {
// Limits the response to keys that begin with the specified prefix.
Prefix *string `location:"querystring" locationName:"prefix" type:"string"`
+
+ // Confirms that the requester knows that she or he will be charged for the
+ // list objects request. Bucket owners need not specify this parameter in their
+ // requests.
+ RequestPayer *string `location:"header" locationName:"x-amz-request-payer" type:"string" enum:"RequestPayer"`
}
// String returns the string representation
@@ -6625,6 +6723,8 @@ type ListObjectsV2Input struct {
_ struct{} `type:"structure"`
// Name of the bucket to list.
+ //
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// ContinuationToken indicates Amazon S3 that the list is being continued on
@@ -6650,6 +6750,11 @@ type ListObjectsV2Input struct {
// Limits the response to keys that begin with the specified prefix.
Prefix *string `location:"querystring" locationName:"prefix" type:"string"`
+ // Confirms that the requester knows that she or he will be charged for the
+ // list objects request in V2 style. Bucket owners need not specify this parameter
+ // in their requests.
+ RequestPayer *string `location:"header" locationName:"x-amz-request-payer" type:"string" enum:"RequestPayer"`
+
// StartAfter is where you want Amazon S3 to start listing from. Amazon S3 starts
// listing after this specified key. StartAfter can be any key in the bucket
StartAfter *string `location:"querystring" locationName:"start-after" type:"string"`
@@ -6742,8 +6847,10 @@ func (s ListObjectsV2Output) GoString() string {
type ListPartsInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Sets the maximum number of parts to return.
@@ -6760,6 +6867,8 @@ type ListPartsInput struct {
RequestPayer *string `location:"header" locationName:"x-amz-request-payer" type:"string" enum:"RequestPayer"`
// Upload ID identifying the multipart upload whose parts are being listed.
+ //
+ // UploadId is a required field
UploadId *string `location:"querystring" locationName:"uploadId" type:"string" required:"true"`
}
@@ -7120,6 +7229,8 @@ type ObjectIdentifier struct {
_ struct{} `type:"structure"`
// Key name of the object to delete.
+ //
+ // Key is a required field
Key *string `min:"1" type:"string" required:"true"`
// VersionId for the specific version of the object to delete.
@@ -7238,9 +7349,13 @@ type PutBucketAccelerateConfigurationInput struct {
_ struct{} `type:"structure" payload:"AccelerateConfiguration"`
// Specifies the Accelerate Configuration you want to set for the bucket.
+ //
+ // AccelerateConfiguration is a required field
AccelerateConfiguration *AccelerateConfiguration `locationName:"AccelerateConfiguration" type:"structure" required:"true"`
// Name of the bucket for which the accelerate configuration is set.
+ //
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
}
@@ -7292,6 +7407,7 @@ type PutBucketAclInput struct {
AccessControlPolicy *AccessControlPolicy `locationName:"AccessControlPolicy" type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Allows grantee the read, write, read ACP, and write ACP permissions on the
@@ -7356,8 +7472,10 @@ func (s PutBucketAclOutput) GoString() string {
type PutBucketCorsInput struct {
_ struct{} `type:"structure" payload:"CORSConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // CORSConfiguration is a required field
CORSConfiguration *CORSConfiguration `locationName:"CORSConfiguration" type:"structure" required:"true"`
}
@@ -7409,6 +7527,7 @@ func (s PutBucketCorsOutput) GoString() string {
type PutBucketLifecycleConfigurationInput struct {
_ struct{} `type:"structure" payload:"LifecycleConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
LifecycleConfiguration *BucketLifecycleConfiguration `locationName:"LifecycleConfiguration" type:"structure"`
@@ -7459,6 +7578,7 @@ func (s PutBucketLifecycleConfigurationOutput) GoString() string {
type PutBucketLifecycleInput struct {
_ struct{} `type:"structure" payload:"LifecycleConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
LifecycleConfiguration *LifecycleConfiguration `locationName:"LifecycleConfiguration" type:"structure"`
@@ -7509,8 +7629,10 @@ func (s PutBucketLifecycleOutput) GoString() string {
type PutBucketLoggingInput struct {
_ struct{} `type:"structure" payload:"BucketLoggingStatus"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // BucketLoggingStatus is a required field
BucketLoggingStatus *BucketLoggingStatus `locationName:"BucketLoggingStatus" type:"structure" required:"true"`
}
@@ -7562,10 +7684,13 @@ func (s PutBucketLoggingOutput) GoString() string {
type PutBucketNotificationConfigurationInput struct {
_ struct{} `type:"structure" payload:"NotificationConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Container for specifying the notification configuration of the bucket. If
// this element is empty, notifications are turned off on the bucket.
+ //
+ // NotificationConfiguration is a required field
NotificationConfiguration *NotificationConfiguration `locationName:"NotificationConfiguration" type:"structure" required:"true"`
}
@@ -7617,8 +7742,10 @@ func (s PutBucketNotificationConfigurationOutput) GoString() string {
type PutBucketNotificationInput struct {
_ struct{} `type:"structure" payload:"NotificationConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // NotificationConfiguration is a required field
NotificationConfiguration *NotificationConfigurationDeprecated `locationName:"NotificationConfiguration" type:"structure" required:"true"`
}
@@ -7665,9 +7792,12 @@ func (s PutBucketNotificationOutput) GoString() string {
type PutBucketPolicyInput struct {
_ struct{} `type:"structure" payload:"Policy"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// The bucket policy as a JSON document.
+ //
+ // Policy is a required field
Policy *string `type:"string" required:"true"`
}
@@ -7714,10 +7844,13 @@ func (s PutBucketPolicyOutput) GoString() string {
type PutBucketReplicationInput struct {
_ struct{} `type:"structure" payload:"ReplicationConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Container for replication rules. You can add as many as 1,000 rules. Total
// replication configuration size can be up to 2 MB.
+ //
+ // ReplicationConfiguration is a required field
ReplicationConfiguration *ReplicationConfiguration `locationName:"ReplicationConfiguration" type:"structure" required:"true"`
}
@@ -7769,8 +7902,10 @@ func (s PutBucketReplicationOutput) GoString() string {
type PutBucketRequestPaymentInput struct {
_ struct{} `type:"structure" payload:"RequestPaymentConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // RequestPaymentConfiguration is a required field
RequestPaymentConfiguration *RequestPaymentConfiguration `locationName:"RequestPaymentConfiguration" type:"structure" required:"true"`
}
@@ -7822,8 +7957,10 @@ func (s PutBucketRequestPaymentOutput) GoString() string {
type PutBucketTaggingInput struct {
_ struct{} `type:"structure" payload:"Tagging"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Tagging is a required field
Tagging *Tagging `locationName:"Tagging" type:"structure" required:"true"`
}
@@ -7875,12 +8012,14 @@ func (s PutBucketTaggingOutput) GoString() string {
type PutBucketVersioningInput struct {
_ struct{} `type:"structure" payload:"VersioningConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// The concatenation of the authentication device's serial number, a space,
// and the value that is displayed on your authentication device.
MFA *string `location:"header" locationName:"x-amz-mfa" type:"string"`
+ // VersioningConfiguration is a required field
VersioningConfiguration *VersioningConfiguration `locationName:"VersioningConfiguration" type:"structure" required:"true"`
}
@@ -7927,8 +8066,10 @@ func (s PutBucketVersioningOutput) GoString() string {
type PutBucketWebsiteInput struct {
_ struct{} `type:"structure" payload:"WebsiteConfiguration"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // WebsiteConfiguration is a required field
WebsiteConfiguration *WebsiteConfiguration `locationName:"WebsiteConfiguration" type:"structure" required:"true"`
}
@@ -7985,6 +8126,7 @@ type PutObjectAclInput struct {
AccessControlPolicy *AccessControlPolicy `locationName:"AccessControlPolicy" type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Allows grantee the read, write, read ACP, and write ACP permissions on the
@@ -8003,6 +8145,7 @@ type PutObjectAclInput struct {
// Allows grantee to write the ACL for the applicable bucket.
GrantWriteACP *string `location:"header" locationName:"x-amz-grant-write-acp" type:"string"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Confirms that the requester knows that she or he will be charged for the
@@ -8077,6 +8220,8 @@ type PutObjectInput struct {
Body io.ReadSeeker `type:"blob"`
// Name of the bucket to which the PUT operation was initiated.
+ //
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Specifies caching behavior along the request/reply chain.
@@ -8116,6 +8261,8 @@ type PutObjectInput struct {
GrantWriteACP *string `location:"header" locationName:"x-amz-grant-write-acp" type:"string"`
// Object key for which the PUT operation was initiated.
+ //
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// A map of metadata to store with the object in S3.
@@ -8241,6 +8388,7 @@ func (s PutObjectOutput) GoString() string {
type QueueConfiguration struct {
_ struct{} `type:"structure"`
+ // Events is a required field
Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true"`
// Container for object key name filtering rules. For information about key
@@ -8254,6 +8402,8 @@ type QueueConfiguration struct {
// Amazon SQS queue ARN to which Amazon S3 will publish a message when it detects
// events of specified type.
+ //
+ // QueueArn is a required field
QueueArn *string `locationName:"Queue" type:"string" required:"true"`
}
@@ -8350,6 +8500,8 @@ type RedirectAllRequestsTo struct {
_ struct{} `type:"structure"`
// Name of the host where requests will be redirected.
+ //
+ // HostName is a required field
HostName *string `type:"string" required:"true"`
// Protocol to use (http, https) when redirecting requests. The default is the
@@ -8387,10 +8539,14 @@ type ReplicationConfiguration struct {
// Amazon Resource Name (ARN) of an IAM role for Amazon S3 to assume when replicating
// the objects.
+ //
+ // Role is a required field
Role *string `type:"string" required:"true"`
// Container for information about a particular replication rule. Replication
// configuration must have at least one rule and can contain up to 1,000 rules.
+ //
+ // Rules is a required field
Rules []*ReplicationRule `locationName:"Rule" type:"list" flattened:"true" required:"true"`
}
@@ -8433,6 +8589,7 @@ func (s *ReplicationConfiguration) Validate() error {
type ReplicationRule struct {
_ struct{} `type:"structure"`
+ // Destination is a required field
Destination *Destination `type:"structure" required:"true"`
// Unique identifier for the rule. The value cannot be longer than 255 characters.
@@ -8441,9 +8598,13 @@ type ReplicationRule struct {
// Object keyname prefix identifying one or more objects to which the rule applies.
// Maximum prefix length can be up to 1,024 characters. Overlapping prefixes
// are not supported.
+ //
+ // Prefix is a required field
Prefix *string `type:"string" required:"true"`
// The rule is ignored if status is not Enabled.
+ //
+ // Status is a required field
Status *string `type:"string" required:"true" enum:"ReplicationRuleStatus"`
}
@@ -8485,6 +8646,8 @@ type RequestPaymentConfiguration struct {
_ struct{} `type:"structure"`
// Specifies who pays for the download and request fees.
+ //
+ // Payer is a required field
Payer *string `type:"string" required:"true" enum:"Payer"`
}
@@ -8514,8 +8677,10 @@ func (s *RequestPaymentConfiguration) Validate() error {
type RestoreObjectInput struct {
_ struct{} `type:"structure" payload:"RestoreRequest"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Confirms that the requester knows that she or he will be charged for the
@@ -8585,6 +8750,8 @@ type RestoreRequest struct {
_ struct{} `type:"structure"`
// Lifetime of the active copy in days
+ //
+ // Days is a required field
Days *int64 `type:"integer" required:"true"`
}
@@ -8623,6 +8790,8 @@ type RoutingRule struct {
// Container for redirect information. You can redirect requests to another
// host, to another page, or with another protocol. In the event of an error,
// you can can specify a different error code to return.
+ //
+ // Redirect is a required field
Redirect *Redirect `type:"structure" required:"true"`
}
@@ -8676,10 +8845,14 @@ type Rule struct {
NoncurrentVersionTransition *NoncurrentVersionTransition `type:"structure"`
// Prefix identifying one or more objects to which the rule applies.
+ //
+ // Prefix is a required field
Prefix *string `type:"string" required:"true"`
// If 'Enabled', the rule is currently being applied. If 'Disabled', the rule
// is not currently being applied.
+ //
+ // Status is a required field
Status *string `type:"string" required:"true" enum:"ExpirationStatus"`
Transition *Transition `type:"structure"`
@@ -8715,9 +8888,13 @@ type Tag struct {
_ struct{} `type:"structure"`
// Name of the tag.
+ //
+ // Key is a required field
Key *string `min:"1" type:"string" required:"true"`
// Value of the tag.
+ //
+ // Value is a required field
Value *string `type:"string" required:"true"`
}
@@ -8753,6 +8930,7 @@ func (s *Tag) Validate() error {
type Tagging struct {
_ struct{} `type:"structure"`
+ // TagSet is a required field
TagSet []*Tag `locationNameList:"Tag" type:"list" required:"true"`
}
@@ -8828,6 +9006,7 @@ func (s *TargetGrant) Validate() error {
type TopicConfiguration struct {
_ struct{} `type:"structure"`
+ // Events is a required field
Events []*string `locationName:"Event" type:"list" flattened:"true" required:"true"`
// Container for object key name filtering rules. For information about key
@@ -8841,6 +9020,8 @@ type TopicConfiguration struct {
// Amazon SNS topic ARN to which Amazon S3 will publish a message when it detects
// events of specified type.
+ //
+ // TopicArn is a required field
TopicArn *string `locationName:"Topic" type:"string" required:"true"`
}
@@ -8925,10 +9106,13 @@ func (s Transition) GoString() string {
type UploadPartCopyInput struct {
_ struct{} `type:"structure"`
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// The name of the source bucket and key name of the source object, separated
// by a slash (/). Must be URL-encoded.
+ //
+ // CopySource is a required field
CopySource *string `location:"header" locationName:"x-amz-copy-source" type:"string" required:"true"`
// Copies the object if its entity tag (ETag) matches the specified tag.
@@ -8964,10 +9148,13 @@ type UploadPartCopyInput struct {
// key was transmitted without error.
CopySourceSSECustomerKeyMD5 *string `location:"header" locationName:"x-amz-copy-source-server-side-encryption-customer-key-MD5" type:"string"`
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Part number of part being copied. This is a positive integer between 1 and
// 10,000.
+ //
+ // PartNumber is a required field
PartNumber *int64 `location:"querystring" locationName:"partNumber" type:"integer" required:"true"`
// Confirms that the requester knows that she or he will be charged for the
@@ -8993,6 +9180,8 @@ type UploadPartCopyInput struct {
SSECustomerKeyMD5 *string `location:"header" locationName:"x-amz-server-side-encryption-customer-key-MD5" type:"string"`
// Upload ID identifying the multipart upload whose part is being copied.
+ //
+ // UploadId is a required field
UploadId *string `location:"querystring" locationName:"uploadId" type:"string" required:"true"`
}
@@ -9083,6 +9272,8 @@ type UploadPartInput struct {
Body io.ReadSeeker `type:"blob"`
// Name of the bucket to which the multipart upload was initiated.
+ //
+ // Bucket is a required field
Bucket *string `location:"uri" locationName:"Bucket" type:"string" required:"true"`
// Size of the body in bytes. This parameter is useful when the size of the
@@ -9090,10 +9281,14 @@ type UploadPartInput struct {
ContentLength *int64 `location:"header" locationName:"Content-Length" type:"long"`
// Object key for which the multipart upload was initiated.
+ //
+ // Key is a required field
Key *string `location:"uri" locationName:"Key" min:"1" type:"string" required:"true"`
// Part number of part being uploaded. This is a positive integer between 1
// and 10,000.
+ //
+ // PartNumber is a required field
PartNumber *int64 `location:"querystring" locationName:"partNumber" type:"integer" required:"true"`
// Confirms that the requester knows that she or he will be charged for the
@@ -9119,6 +9314,8 @@ type UploadPartInput struct {
SSECustomerKeyMD5 *string `location:"header" locationName:"x-amz-server-side-encryption-customer-key-MD5" type:"string"`
// Upload ID identifying the multipart upload whose part is being uploaded.
+ //
+ // UploadId is a required field
UploadId *string `location:"querystring" locationName:"uploadId" type:"string" required:"true"`
}
@@ -9276,61 +9473,78 @@ func (s *WebsiteConfiguration) Validate() error {
}
const (
- // @enum BucketAccelerateStatus
+ // BucketAccelerateStatusEnabled is a BucketAccelerateStatus enum value
BucketAccelerateStatusEnabled = "Enabled"
- // @enum BucketAccelerateStatus
+
+ // BucketAccelerateStatusSuspended is a BucketAccelerateStatus enum value
BucketAccelerateStatusSuspended = "Suspended"
)
const (
- // @enum BucketCannedACL
+ // BucketCannedACLPrivate is a BucketCannedACL enum value
BucketCannedACLPrivate = "private"
- // @enum BucketCannedACL
+
+ // BucketCannedACLPublicRead is a BucketCannedACL enum value
BucketCannedACLPublicRead = "public-read"
- // @enum BucketCannedACL
+
+ // BucketCannedACLPublicReadWrite is a BucketCannedACL enum value
BucketCannedACLPublicReadWrite = "public-read-write"
- // @enum BucketCannedACL
+
+ // BucketCannedACLAuthenticatedRead is a BucketCannedACL enum value
BucketCannedACLAuthenticatedRead = "authenticated-read"
)
const (
- // @enum BucketLocationConstraint
+ // BucketLocationConstraintEu is a BucketLocationConstraint enum value
BucketLocationConstraintEu = "EU"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintEuWest1 is a BucketLocationConstraint enum value
BucketLocationConstraintEuWest1 = "eu-west-1"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintUsWest1 is a BucketLocationConstraint enum value
BucketLocationConstraintUsWest1 = "us-west-1"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintUsWest2 is a BucketLocationConstraint enum value
BucketLocationConstraintUsWest2 = "us-west-2"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintApSouth1 is a BucketLocationConstraint enum value
BucketLocationConstraintApSouth1 = "ap-south-1"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintApSoutheast1 is a BucketLocationConstraint enum value
BucketLocationConstraintApSoutheast1 = "ap-southeast-1"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintApSoutheast2 is a BucketLocationConstraint enum value
BucketLocationConstraintApSoutheast2 = "ap-southeast-2"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintApNortheast1 is a BucketLocationConstraint enum value
BucketLocationConstraintApNortheast1 = "ap-northeast-1"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintSaEast1 is a BucketLocationConstraint enum value
BucketLocationConstraintSaEast1 = "sa-east-1"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintCnNorth1 is a BucketLocationConstraint enum value
BucketLocationConstraintCnNorth1 = "cn-north-1"
- // @enum BucketLocationConstraint
+
+ // BucketLocationConstraintEuCentral1 is a BucketLocationConstraint enum value
BucketLocationConstraintEuCentral1 = "eu-central-1"
)
const (
- // @enum BucketLogsPermission
+ // BucketLogsPermissionFullControl is a BucketLogsPermission enum value
BucketLogsPermissionFullControl = "FULL_CONTROL"
- // @enum BucketLogsPermission
+
+ // BucketLogsPermissionRead is a BucketLogsPermission enum value
BucketLogsPermissionRead = "READ"
- // @enum BucketLogsPermission
+
+ // BucketLogsPermissionWrite is a BucketLogsPermission enum value
BucketLogsPermissionWrite = "WRITE"
)
const (
- // @enum BucketVersioningStatus
+ // BucketVersioningStatusEnabled is a BucketVersioningStatus enum value
BucketVersioningStatusEnabled = "Enabled"
- // @enum BucketVersioningStatus
+
+ // BucketVersioningStatusSuspended is a BucketVersioningStatus enum value
BucketVersioningStatusSuspended = "Suspended"
)
@@ -9341,147 +9555,178 @@ const (
// XML 1.0, you can add this parameter to request that Amazon S3 encode the
// keys in the response.
const (
- // @enum EncodingType
+ // EncodingTypeUrl is a EncodingType enum value
EncodingTypeUrl = "url"
)
// Bucket event for which to send notifications.
const (
- // @enum Event
+ // EventS3ReducedRedundancyLostObject is a Event enum value
EventS3ReducedRedundancyLostObject = "s3:ReducedRedundancyLostObject"
- // @enum Event
+
+ // EventS3ObjectCreated is a Event enum value
EventS3ObjectCreated = "s3:ObjectCreated:*"
- // @enum Event
+
+ // EventS3ObjectCreatedPut is a Event enum value
EventS3ObjectCreatedPut = "s3:ObjectCreated:Put"
- // @enum Event
+
+ // EventS3ObjectCreatedPost is a Event enum value
EventS3ObjectCreatedPost = "s3:ObjectCreated:Post"
- // @enum Event
+
+ // EventS3ObjectCreatedCopy is a Event enum value
EventS3ObjectCreatedCopy = "s3:ObjectCreated:Copy"
- // @enum Event
+
+ // EventS3ObjectCreatedCompleteMultipartUpload is a Event enum value
EventS3ObjectCreatedCompleteMultipartUpload = "s3:ObjectCreated:CompleteMultipartUpload"
- // @enum Event
+
+ // EventS3ObjectRemoved is a Event enum value
EventS3ObjectRemoved = "s3:ObjectRemoved:*"
- // @enum Event
+
+ // EventS3ObjectRemovedDelete is a Event enum value
EventS3ObjectRemovedDelete = "s3:ObjectRemoved:Delete"
- // @enum Event
+
+ // EventS3ObjectRemovedDeleteMarkerCreated is a Event enum value
EventS3ObjectRemovedDeleteMarkerCreated = "s3:ObjectRemoved:DeleteMarkerCreated"
)
const (
- // @enum ExpirationStatus
+ // ExpirationStatusEnabled is a ExpirationStatus enum value
ExpirationStatusEnabled = "Enabled"
- // @enum ExpirationStatus
+
+ // ExpirationStatusDisabled is a ExpirationStatus enum value
ExpirationStatusDisabled = "Disabled"
)
const (
- // @enum FilterRuleName
+ // FilterRuleNamePrefix is a FilterRuleName enum value
FilterRuleNamePrefix = "prefix"
- // @enum FilterRuleName
+
+ // FilterRuleNameSuffix is a FilterRuleName enum value
FilterRuleNameSuffix = "suffix"
)
const (
- // @enum MFADelete
+ // MFADeleteEnabled is a MFADelete enum value
MFADeleteEnabled = "Enabled"
- // @enum MFADelete
+
+ // MFADeleteDisabled is a MFADelete enum value
MFADeleteDisabled = "Disabled"
)
const (
- // @enum MFADeleteStatus
+ // MFADeleteStatusEnabled is a MFADeleteStatus enum value
MFADeleteStatusEnabled = "Enabled"
- // @enum MFADeleteStatus
+
+ // MFADeleteStatusDisabled is a MFADeleteStatus enum value
MFADeleteStatusDisabled = "Disabled"
)
const (
- // @enum MetadataDirective
+ // MetadataDirectiveCopy is a MetadataDirective enum value
MetadataDirectiveCopy = "COPY"
- // @enum MetadataDirective
+
+ // MetadataDirectiveReplace is a MetadataDirective enum value
MetadataDirectiveReplace = "REPLACE"
)
const (
- // @enum ObjectCannedACL
+ // ObjectCannedACLPrivate is a ObjectCannedACL enum value
ObjectCannedACLPrivate = "private"
- // @enum ObjectCannedACL
+
+ // ObjectCannedACLPublicRead is a ObjectCannedACL enum value
ObjectCannedACLPublicRead = "public-read"
- // @enum ObjectCannedACL
+
+ // ObjectCannedACLPublicReadWrite is a ObjectCannedACL enum value
ObjectCannedACLPublicReadWrite = "public-read-write"
- // @enum ObjectCannedACL
+
+ // ObjectCannedACLAuthenticatedRead is a ObjectCannedACL enum value
ObjectCannedACLAuthenticatedRead = "authenticated-read"
- // @enum ObjectCannedACL
+
+ // ObjectCannedACLAwsExecRead is a ObjectCannedACL enum value
ObjectCannedACLAwsExecRead = "aws-exec-read"
- // @enum ObjectCannedACL
+
+ // ObjectCannedACLBucketOwnerRead is a ObjectCannedACL enum value
ObjectCannedACLBucketOwnerRead = "bucket-owner-read"
- // @enum ObjectCannedACL
+
+ // ObjectCannedACLBucketOwnerFullControl is a ObjectCannedACL enum value
ObjectCannedACLBucketOwnerFullControl = "bucket-owner-full-control"
)
const (
- // @enum ObjectStorageClass
+ // ObjectStorageClassStandard is a ObjectStorageClass enum value
ObjectStorageClassStandard = "STANDARD"
- // @enum ObjectStorageClass
+
+ // ObjectStorageClassReducedRedundancy is a ObjectStorageClass enum value
ObjectStorageClassReducedRedundancy = "REDUCED_REDUNDANCY"
- // @enum ObjectStorageClass
+
+ // ObjectStorageClassGlacier is a ObjectStorageClass enum value
ObjectStorageClassGlacier = "GLACIER"
)
const (
- // @enum ObjectVersionStorageClass
+ // ObjectVersionStorageClassStandard is a ObjectVersionStorageClass enum value
ObjectVersionStorageClassStandard = "STANDARD"
)
const (
- // @enum Payer
+ // PayerRequester is a Payer enum value
PayerRequester = "Requester"
- // @enum Payer
+
+ // PayerBucketOwner is a Payer enum value
PayerBucketOwner = "BucketOwner"
)
const (
- // @enum Permission
+ // PermissionFullControl is a Permission enum value
PermissionFullControl = "FULL_CONTROL"
- // @enum Permission
+
+ // PermissionWrite is a Permission enum value
PermissionWrite = "WRITE"
- // @enum Permission
+
+ // PermissionWriteAcp is a Permission enum value
PermissionWriteAcp = "WRITE_ACP"
- // @enum Permission
+
+ // PermissionRead is a Permission enum value
PermissionRead = "READ"
- // @enum Permission
+
+ // PermissionReadAcp is a Permission enum value
PermissionReadAcp = "READ_ACP"
)
const (
- // @enum Protocol
+ // ProtocolHttp is a Protocol enum value
ProtocolHttp = "http"
- // @enum Protocol
+
+ // ProtocolHttps is a Protocol enum value
ProtocolHttps = "https"
)
const (
- // @enum ReplicationRuleStatus
+ // ReplicationRuleStatusEnabled is a ReplicationRuleStatus enum value
ReplicationRuleStatusEnabled = "Enabled"
- // @enum ReplicationRuleStatus
+
+ // ReplicationRuleStatusDisabled is a ReplicationRuleStatus enum value
ReplicationRuleStatusDisabled = "Disabled"
)
const (
- // @enum ReplicationStatus
+ // ReplicationStatusComplete is a ReplicationStatus enum value
ReplicationStatusComplete = "COMPLETE"
- // @enum ReplicationStatus
+
+ // ReplicationStatusPending is a ReplicationStatus enum value
ReplicationStatusPending = "PENDING"
- // @enum ReplicationStatus
+
+ // ReplicationStatusFailed is a ReplicationStatus enum value
ReplicationStatusFailed = "FAILED"
- // @enum ReplicationStatus
+
+ // ReplicationStatusReplica is a ReplicationStatus enum value
ReplicationStatusReplica = "REPLICA"
)
// If present, indicates that the requester was successfully charged for the
// request.
const (
- // @enum RequestCharged
+ // RequestChargedRequester is a RequestCharged enum value
RequestChargedRequester = "requester"
)
@@ -9490,38 +9735,44 @@ const (
// Documentation on downloading objects from requester pays buckets can be found
// at http://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html
const (
- // @enum RequestPayer
+ // RequestPayerRequester is a RequestPayer enum value
RequestPayerRequester = "requester"
)
const (
- // @enum ServerSideEncryption
+ // ServerSideEncryptionAes256 is a ServerSideEncryption enum value
ServerSideEncryptionAes256 = "AES256"
- // @enum ServerSideEncryption
+
+ // ServerSideEncryptionAwsKms is a ServerSideEncryption enum value
ServerSideEncryptionAwsKms = "aws:kms"
)
const (
- // @enum StorageClass
+ // StorageClassStandard is a StorageClass enum value
StorageClassStandard = "STANDARD"
- // @enum StorageClass
+
+ // StorageClassReducedRedundancy is a StorageClass enum value
StorageClassReducedRedundancy = "REDUCED_REDUNDANCY"
- // @enum StorageClass
+
+ // StorageClassStandardIa is a StorageClass enum value
StorageClassStandardIa = "STANDARD_IA"
)
const (
- // @enum TransitionStorageClass
+ // TransitionStorageClassGlacier is a TransitionStorageClass enum value
TransitionStorageClassGlacier = "GLACIER"
- // @enum TransitionStorageClass
+
+ // TransitionStorageClassStandardIa is a TransitionStorageClass enum value
TransitionStorageClassStandardIa = "STANDARD_IA"
)
const (
- // @enum Type
+ // TypeCanonicalUser is a Type enum value
TypeCanonicalUser = "CanonicalUser"
- // @enum Type
+
+ // TypeAmazonCustomerByEmail is a Type enum value
TypeAmazonCustomerByEmail = "AmazonCustomerByEmail"
- // @enum Type
+
+ // TypeGroup is a Type enum value
TypeGroup = "Group"
)
diff --git a/vendor/github.com/aws/aws-sdk-go/service/s3/waiters.go b/vendor/github.com/aws/aws-sdk-go/service/s3/waiters.go
index cbd3d31..5e16be4 100644
--- a/vendor/github.com/aws/aws-sdk-go/service/s3/waiters.go
+++ b/vendor/github.com/aws/aws-sdk-go/service/s3/waiters.go
@@ -6,6 +6,10 @@ import (
"github.com/aws/aws-sdk-go/private/waiter"
)
+// WaitUntilBucketExists uses the Amazon S3 API operation
+// HeadBucket to wait for a condition to be met before returning.
+// If the condition is not meet within the max attempt window an error will
+// be returned.
func (c *S3) WaitUntilBucketExists(input *HeadBucketInput) error {
waiterCfg := waiter.Config{
Operation: "HeadBucket",
@@ -47,6 +51,10 @@ func (c *S3) WaitUntilBucketExists(input *HeadBucketInput) error {
return w.Wait()
}
+// WaitUntilBucketNotExists uses the Amazon S3 API operation
+// HeadBucket to wait for a condition to be met before returning.
+// If the condition is not meet within the max attempt window an error will
+// be returned.
func (c *S3) WaitUntilBucketNotExists(input *HeadBucketInput) error {
waiterCfg := waiter.Config{
Operation: "HeadBucket",
@@ -70,6 +78,10 @@ func (c *S3) WaitUntilBucketNotExists(input *HeadBucketInput) error {
return w.Wait()
}
+// WaitUntilObjectExists uses the Amazon S3 API operation
+// HeadObject to wait for a condition to be met before returning.
+// If the condition is not meet within the max attempt window an error will
+// be returned.
func (c *S3) WaitUntilObjectExists(input *HeadObjectInput) error {
waiterCfg := waiter.Config{
Operation: "HeadObject",
@@ -99,6 +111,10 @@ func (c *S3) WaitUntilObjectExists(input *HeadObjectInput) error {
return w.Wait()
}
+// WaitUntilObjectNotExists uses the Amazon S3 API operation
+// HeadObject to wait for a condition to be met before returning.
+// If the condition is not meet within the max attempt window an error will
+// be returned.
func (c *S3) WaitUntilObjectNotExists(input *HeadObjectInput) error {
waiterCfg := waiter.Config{
Operation: "HeadObject",
diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/api.go b/vendor/github.com/aws/aws-sdk-go/service/sts/api.go
index f11e867..d183fab 100644
--- a/vendor/github.com/aws/aws-sdk-go/service/sts/api.go
+++ b/vendor/github.com/aws/aws-sdk-go/service/sts/api.go
@@ -797,6 +797,8 @@ type AssumeRoleInput struct {
Policy *string `min:"1" type:"string"`
// The Amazon Resource Name (ARN) of the role to assume.
+ //
+ // RoleArn is a required field
RoleArn *string `min:"20" type:"string" required:"true"`
// An identifier for the assumed role session.
@@ -813,6 +815,8 @@ type AssumeRoleInput struct {
// of characters consisting of upper- and lower-case alphanumeric characters
// with no spaces. You can also include underscores or any of the following
// characters: =,.@-
+ //
+ // RoleSessionName is a required field
RoleSessionName *string `min:"2" type:"string" required:"true"`
// The identification number of the MFA device that is associated with the user
@@ -967,9 +971,13 @@ type AssumeRoleWithSAMLInput struct {
// The Amazon Resource Name (ARN) of the SAML provider in IAM that describes
// the IdP.
+ //
+ // PrincipalArn is a required field
PrincipalArn *string `min:"20" type:"string" required:"true"`
// The Amazon Resource Name (ARN) of the role that the caller is assuming.
+ //
+ // RoleArn is a required field
RoleArn *string `min:"20" type:"string" required:"true"`
// The base-64 encoded SAML authentication response provided by the IdP.
@@ -977,6 +985,8 @@ type AssumeRoleWithSAMLInput struct {
// For more information, see Configuring a Relying Party and Adding Claims
// (http://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html)
// in the Using IAM guide.
+ //
+ // SAMLAssertion is a required field
SAMLAssertion *string `min:"4" type:"string" required:"true"`
}
@@ -1140,6 +1150,8 @@ type AssumeRoleWithWebIdentityInput struct {
ProviderId *string `min:"4" type:"string"`
// The Amazon Resource Name (ARN) of the role that the caller is assuming.
+ //
+ // RoleArn is a required field
RoleArn *string `min:"20" type:"string" required:"true"`
// An identifier for the assumed role session. Typically, you pass the name
@@ -1152,12 +1164,16 @@ type AssumeRoleWithWebIdentityInput struct {
// of characters consisting of upper- and lower-case alphanumeric characters
// with no spaces. You can also include underscores or any of the following
// characters: =,.@-
+ //
+ // RoleSessionName is a required field
RoleSessionName *string `min:"2" type:"string" required:"true"`
// The OAuth 2.0 access token or OpenID Connect ID token that is provided by
// the identity provider. Your application must get this token by authenticating
// the user who is using your application with a web identity provider before
// the application makes an AssumeRoleWithWebIdentity call.
+ //
+ // WebIdentityToken is a required field
WebIdentityToken *string `min:"4" type:"string" required:"true"`
}
@@ -1273,11 +1289,15 @@ type AssumedRoleUser struct {
// AssumeRole action. For more information about ARNs and how to use them in
// policies, see IAM Identifiers (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html)
// in Using IAM.
+ //
+ // Arn is a required field
Arn *string `min:"20" type:"string" required:"true"`
// A unique identifier that contains the role ID and the role session name of
// the role that is being assumed. The role ID is generated by AWS when the
// role is created.
+ //
+ // AssumedRoleId is a required field
AssumedRoleId *string `min:"2" type:"string" required:"true"`
}
@@ -1296,15 +1316,23 @@ type Credentials struct {
_ struct{} `type:"structure"`
// The access key ID that identifies the temporary security credentials.
+ //
+ // AccessKeyId is a required field
AccessKeyId *string `min:"16" type:"string" required:"true"`
// The date on which the current credentials expire.
+ //
+ // Expiration is a required field
Expiration *time.Time `type:"timestamp" timestampFormat:"iso8601" required:"true"`
// The secret access key that can be used to sign requests.
+ //
+ // SecretAccessKey is a required field
SecretAccessKey *string `type:"string" required:"true"`
// The token that users must pass to the service API to use the temporary credentials.
+ //
+ // SessionToken is a required field
SessionToken *string `type:"string" required:"true"`
}
@@ -1322,6 +1350,8 @@ type DecodeAuthorizationMessageInput struct {
_ struct{} `type:"structure"`
// The encoded message that was returned with the response.
+ //
+ // EncodedMessage is a required field
EncodedMessage *string `min:"1" type:"string" required:"true"`
}
@@ -1379,10 +1409,14 @@ type FederatedUser struct {
// For more information about ARNs and how to use them in policies, see IAM
// Identifiers (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html)
// in Using IAM.
+ //
+ // Arn is a required field
Arn *string `min:"20" type:"string" required:"true"`
// The string that identifies the federated user associated with the credentials,
// similar to the unique ID of an IAM user.
+ //
+ // FederatedUserId is a required field
FederatedUserId *string `min:"2" type:"string" required:"true"`
}
@@ -1460,6 +1494,8 @@ type GetFederationTokenInput struct {
// of characters consisting of upper- and lower-case alphanumeric characters
// with no spaces. You can also include underscores or any of the following
// characters: =,.@-
+ //
+ // Name is a required field
Name *string `min:"2" type:"string" required:"true"`
// An IAM policy in JSON format that is passed with the GetFederationToken call
diff --git a/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go
index 565bf58..d42a0bc 100644
--- a/vendor/github.com/davecgh/go-spew/spew/bypass.go
+++ b/vendor/github.com/davecgh/go-spew/spew/bypass.go
@@ -13,9 +13,10 @@
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
// NOTE: Due to the following build constraints, this file will only be compiled
-// when the code is not running on Google App Engine and "-tags disableunsafe"
-// is not added to the go build command line.
-// +build !appengine,!disableunsafe
+// when the code is not running on Google App Engine, compiled by GopherJS, and
+// "-tags safe" is not added to the go build command line. The "disableunsafe"
+// tag is deprecated and thus should not be used.
+// +build !js,!appengine,!safe,!disableunsafe
package spew
diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go
index 457e412..e47a4e7 100644
--- a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go
+++ b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go
@@ -13,9 +13,10 @@
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
// NOTE: Due to the following build constraints, this file will only be compiled
-// when either the code is running on Google App Engine or "-tags disableunsafe"
-// is added to the go build command line.
-// +build appengine disableunsafe
+// when the code is running on Google App Engine, compiled by GopherJS, or
+// "-tags safe" is added to the go build command line. The "disableunsafe"
+// tag is deprecated and thus should not be used.
+// +build js appengine safe disableunsafe
package spew
diff --git a/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/davecgh/go-spew/spew/config.go
index ee1ab07..5552827 100644
--- a/vendor/github.com/davecgh/go-spew/spew/config.go
+++ b/vendor/github.com/davecgh/go-spew/spew/config.go
@@ -64,7 +64,7 @@ type ConfigState struct {
// inside these interface methods. As a result, this option relies on
// access to the unsafe package, so it will not have any effect when
// running in environments without access to the unsafe package such as
- // Google App Engine or with the "disableunsafe" build tag specified.
+ // Google App Engine or with the "safe" build tag specified.
DisablePointerMethods bool
// ContinueOnMethod specifies whether or not recursion should continue once
diff --git a/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/fsnotify/fsnotify/AUTHORS
index 71c47ce..0a5bf8f 100644
--- a/vendor/github.com/fsnotify/fsnotify/AUTHORS
+++ b/vendor/github.com/fsnotify/fsnotify/AUTHORS
@@ -26,12 +26,14 @@ Kelvin Fo <vmirage@gmail.com>
Ken-ichirou MATSUZAWA <chamas@h4.dion.ne.jp>
Matt Layher <mdlayher@gmail.com>
Nathan Youngman <git@nathany.com>
+Patrick <patrick@dropbox.com>
Paul Hammond <paul@paulhammond.org>
Pawel Knap <pawelknap88@gmail.com>
Pieter Droogendijk <pieter@binky.org.uk>
Pursuit92 <JoshChase@techpursuit.net>
Riku Voipio <riku.voipio@linaro.org>
Rob Figueiredo <robfig@gmail.com>
+Slawek Ligus <root@ooz.ie>
Soge Zhang <zhssoge@gmail.com>
Tiffany Jernigan <tiffany.jernigan@intel.com>
Tilak Sharma <tilaks@google.com>
diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
index f6c7c48..7fe8794 100644
--- a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
+++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## v1.4.1 / 2016-10-04
+
+* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack)
+
+## v1.4.0 / 2016-10-01
+
+* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie)
+
## v1.3.1 / 2016-06-28
* windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
index 617e45a..6a81ba4 100644
--- a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
+++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
@@ -40,7 +40,7 @@ Contribute upstream:
3. Push to the branch (`git push fork my-new-feature`)
4. Create a new Pull Request on GitHub
-This workflow is [thoroughly explained by Katrina Owen](https://blog.splice.com/contributing-open-source-git-repositories-go/).
+This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/).
### Testing
diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md
index 5ebce86..3c891e3 100644
--- a/vendor/github.com/fsnotify/fsnotify/README.md
+++ b/vendor/github.com/fsnotify/fsnotify/README.md
@@ -1,6 +1,6 @@
# File system notifications for Go
-[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) [![Coverage](http://gocover.io/_badge/github.com/fsnotify/fsnotify)](http://gocover.io/github.com/fsnotify/fsnotify)
+[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify)
fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running:
diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
index d1d39a0..e7f55fe 100644
--- a/vendor/github.com/fsnotify/fsnotify/fsnotify.go
+++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
@@ -30,33 +30,33 @@ const (
Chmod
)
-// String returns a string representation of the event in the form
-// "file: REMOVE|WRITE|..."
-func (e Event) String() string {
+func (op Op) String() string {
// Use a buffer for efficient string concatenation
var buffer bytes.Buffer
- if e.Op&Create == Create {
+ if op&Create == Create {
buffer.WriteString("|CREATE")
}
- if e.Op&Remove == Remove {
+ if op&Remove == Remove {
buffer.WriteString("|REMOVE")
}
- if e.Op&Write == Write {
+ if op&Write == Write {
buffer.WriteString("|WRITE")
}
- if e.Op&Rename == Rename {
+ if op&Rename == Rename {
buffer.WriteString("|RENAME")
}
- if e.Op&Chmod == Chmod {
+ if op&Chmod == Chmod {
buffer.WriteString("|CHMOD")
}
-
- // If buffer remains empty, return no event names
if buffer.Len() == 0 {
- return fmt.Sprintf("%q: ", e.Name)
+ return ""
}
+ return buffer.String()[1:] // Strip leading pipe
+}
- // Return a list of event names, with leading pipe character stripped
- return fmt.Sprintf("%q: %s", e.Name, buffer.String()[1:])
+// String returns a string representation of the event in the form
+// "file: REMOVE|WRITE|..."
+func (e Event) String() string {
+ return fmt.Sprintf("%q: %s", e.Name, e.Op.String())
}
diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go
index 8c1b8fd..68b9b30 100644
--- a/vendor/github.com/golang/protobuf/proto/encode.go
+++ b/vendor/github.com/golang/protobuf/proto/encode.go
@@ -234,10 +234,6 @@ func Marshal(pb Message) ([]byte, error) {
}
p := NewBuffer(nil)
err := p.Marshal(pb)
- var state errorState
- if err != nil && !state.shouldContinue(err, nil) {
- return nil, err
- }
if p.buf == nil && err == nil {
// Return a non-nil slice on success.
return []byte{}, nil
@@ -266,11 +262,8 @@ func (p *Buffer) Marshal(pb Message) error {
// Can the object marshal itself?
if m, ok := pb.(Marshaler); ok {
data, err := m.Marshal()
- if err != nil {
- return err
- }
p.buf = append(p.buf, data...)
- return nil
+ return err
}
t, base, err := getbase(pb)
@@ -282,7 +275,7 @@ func (p *Buffer) Marshal(pb Message) error {
}
if collectStats {
- stats.Encode++
+ (stats).Encode++ // Parens are to work around a goimports bug.
}
if len(p.buf) > maxMarshalSize {
@@ -309,7 +302,7 @@ func Size(pb Message) (n int) {
}
if collectStats {
- stats.Size++
+ (stats).Size++ // Parens are to work around a goimports bug.
}
return
@@ -1014,7 +1007,6 @@ func size_slice_struct_message(p *Properties, base structPointer) (n int) {
if p.isMarshaler {
m := structPointer_Interface(structp, p.stype).(Marshaler)
data, _ := m.Marshal()
- n += len(p.tagcode)
n += sizeRawBytes(data)
continue
}
diff --git a/vendor/github.com/google/go-github/github/activity_events.go b/vendor/github.com/google/go-github/github/activity_events.go
index a0e5f08..6bf38b4 100644
--- a/vendor/github.com/google/go-github/github/activity_events.go
+++ b/vendor/github.com/google/go-github/github/activity_events.go
@@ -45,6 +45,10 @@ func (e *Event) Payload() (payload interface{}) {
payload = &ForkEvent{}
case "GollumEvent":
payload = &GollumEvent{}
+ case "IntegrationInstallationEvent":
+ payload = &IntegrationInstallationEvent{}
+ case "IntegrationInstallationRepositoriesEvent":
+ payload = &IntegrationInstallationRepositoriesEvent{}
case "IssueActivityEvent":
payload = &IssueActivityEvent{}
case "IssueCommentEvent":
diff --git a/vendor/github.com/google/go-github/github/event_types.go b/vendor/github.com/google/go-github/github/event_types.go
index 20f509a..da18f71 100644
--- a/vendor/github.com/google/go-github/github/event_types.go
+++ b/vendor/github.com/google/go-github/github/event_types.go
@@ -146,6 +146,40 @@ type EditChange struct {
} `json:"body,omitempty"`
}
+// IntegrationInstallationEvent is triggered when an integration is created or deleted.
+// The Webhook event name is "integration_installation".
+//
+// GitHub docs: https://developer.github.com/early-access/integrations/webhooks/#integrationinstallationevent
+type IntegrationInstallationEvent struct {
+ // The action that was performed. Possible values for an "integration_installation"
+ // event are: "created", "deleted".
+ Action *string `json:"action,omitempty"`
+ Installation *Installation `json:"installation,omitempty"`
+ Sender *User `json:"sender,omitempty"`
+}
+
+// IntegrationInstallationRepositoriesEvent is triggered when an integration repository
+// is added or removed. The Webhook event name is "integration_installation_repositories".
+//
+// GitHub docs: https://developer.github.com/early-access/integrations/webhooks/#integrationinstallationrepositoriesevent
+type IntegrationInstallationRepositoriesEvent struct {
+ // The action that was performed. Possible values for an "integration_installation_repositories"
+ // event are: "added", "removed".
+ Action *string `json:"action,omitempty"`
+ Installation *Installation `json:"installation,omitempty"`
+ RepositoriesAdded []*Repository `json:"repositories_added,omitempty"`
+ RepositoriesRemoved []*Repository `json:"repositories_removed,omitempty"`
+ Sender *User `json:"sender,omitempty"`
+}
+
+// Installation represents a GitHub integration installation.
+type Installation struct {
+ ID *int `json:"id,omitempty"`
+ Account *User `json:"account,omitempty"`
+ AccessTokensURL *string `json:"access_tokens_url,omitempty"`
+ RepositoriesURL *string `json:"repositories_url,omitempty"`
+}
+
// IssueCommentEvent is triggered when an issue comment is created on an issue
// or pull request.
// The Webhook event name is "issue_comment".
diff --git a/vendor/github.com/google/go-github/github/github.go b/vendor/github.com/google/go-github/github/github.go
index 8448982..f04a011 100644
--- a/vendor/github.com/google/go-github/github/github.go
+++ b/vendor/github.com/google/go-github/github/github.go
@@ -87,6 +87,9 @@ const (
// https://developer.github.com/v3/repos/traffic/
mediaTypeTrafficPreview = "application/vnd.github.spiderman-preview+json"
+
+ // https://developer.github.com/changes/2016-09-14-projects-api/
+ mediaTypeProjectsPreview = "application/vnd.github.inertia-preview+json"
)
// A Client manages communication with the GitHub API.
@@ -611,8 +614,8 @@ type RateLimits struct {
Core *Rate `json:"core"`
// The rate limit for search API requests. Unauthenticated requests
- // are limited to 5 requests per minutes. Authenticated requests are
- // limited to 20 per minute.
+ // are limited to 10 requests per minutes. Authenticated requests are
+ // limited to 30 per minute.
//
// GitHub API docs: https://developer.github.com/v3/search/#rate-limit
Search *Rate `json:"search"`
diff --git a/vendor/github.com/google/go-github/github/messages.go b/vendor/github.com/google/go-github/github/messages.go
index 9f0aba9..eedb190 100644
--- a/vendor/github.com/google/go-github/github/messages.go
+++ b/vendor/github.com/google/go-github/github/messages.go
@@ -14,6 +14,7 @@ import (
"crypto/sha256"
"crypto/sha512"
"encoding/hex"
+ "encoding/json"
"errors"
"fmt"
"hash"
@@ -30,6 +31,37 @@ const (
sha512Prefix = "sha512"
// signatureHeader is the GitHub header key used to pass the HMAC hexdigest.
signatureHeader = "X-Hub-Signature"
+ // eventTypeHeader is the Github header key used to pass the event type.
+ eventTypeHeader = "X-Github-Event"
+)
+
+var (
+ // eventTypeMapping maps webhooks types to their corresponding go-github struct types.
+ eventTypeMapping = map[string]string{
+ "commit_comment": "CommitCommentEvent",
+ "create": "CreateEvent",
+ "delete": "DeleteEvent",
+ "deployment": "DeploymentEvent",
+ "deployment_status": "DeploymentStatusEvent",
+ "fork": "ForkEvent",
+ "gollum": "GollumEvent",
+ "integration_installation": "IntegrationInstallationEvent",
+ "integration_installation_repositories": "IntegrationInstallationRepositoriesEvent",
+ "issue_comment": "IssueCommentEvent",
+ "issues": "IssuesEvent",
+ "member": "MemberEvent",
+ "membership": "MembershipEvent",
+ "page_build": "PageBuildEvent",
+ "public": "PublicEvent",
+ "pull_request_review_comment": "PullRequestReviewCommentEvent",
+ "pull_request": "PullRequestEvent",
+ "push": "PushEvent",
+ "repository": "RepositoryEvent",
+ "release": "ReleaseEvent",
+ "status": "StatusEvent",
+ "team_add": "TeamAddEvent",
+ "watch": "WatchEvent",
+ }
)
// genMAC generates the HMAC signature for a message provided the secret key
@@ -117,3 +149,42 @@ func validateSignature(signature string, payload, secretKey []byte) error {
}
return nil
}
+
+// WebHookType returns the event type of webhook request r.
+func WebHookType(r *http.Request) string {
+ return r.Header.Get(eventTypeHeader)
+}
+
+// ParseWebHook parses the event payload. For recognized event types, a
+// value of the corresponding struct type will be returned (as returned
+// by Event.Payload()). An error will be returned for unrecognized event
+// types.
+//
+// Example usage:
+//
+// func (s *GitHubEventMonitor) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+// payload, err := github.ValidatePayload(r, s.webhookSecretKey)
+// if err != nil { ... }
+// event, err := github.ParseWebHook(github.WebHookType(r), payload)
+// if err != nil { ... }
+// switch event := event.(type) {
+// case CommitCommentEvent:
+// processCommitCommentEvent(event)
+// case CreateEvent:
+// processCreateEvent(event)
+// ...
+// }
+// }
+//
+func ParseWebHook(messageType string, payload []byte) (interface{}, error) {
+ eventType, ok := eventTypeMapping[messageType]
+ if !ok {
+ return nil, fmt.Errorf("unknown X-Github-Event in message: %v", messageType)
+ }
+
+ event := Event{
+ Type: &eventType,
+ RawPayload: (*json.RawMessage)(&payload),
+ }
+ return event.Payload(), nil
+}
diff --git a/vendor/github.com/google/go-github/github/pulls.go b/vendor/github.com/google/go-github/github/pulls.go
index 0611507..a823c43 100644
--- a/vendor/github.com/google/go-github/github/pulls.go
+++ b/vendor/github.com/google/go-github/github/pulls.go
@@ -44,6 +44,7 @@ type PullRequest struct {
PatchURL *string `json:"patch_url,omitempty"`
Assignee *User `json:"assignee,omitempty"`
Assignees []*User `json:"assignees,omitempty"`
+ Milestone *Milestone `json:"milestone,omitempty"`
Head *PullRequestBranch `json:"head,omitempty"`
Base *PullRequestBranch `json:"base,omitempty"`
diff --git a/vendor/github.com/google/go-github/github/repos_forks.go b/vendor/github.com/google/go-github/github/repos_forks.go
index 92e9f27..7ef4cb3 100644
--- a/vendor/github.com/google/go-github/github/repos_forks.go
+++ b/vendor/github.com/google/go-github/github/repos_forks.go
@@ -50,7 +50,7 @@ type RepositoryCreateForkOptions struct {
// CreateFork creates a fork of the specified repository.
//
-// GitHub API docs: http://developer.github.com/v3/repos/forks/#list-forks
+// GitHub API docs: https://developer.github.com/v3/repos/forks/#create-a-fork
func (s *RepositoriesService) CreateFork(owner, repo string, opt *RepositoryCreateForkOptions) (*Repository, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/forks", owner, repo)
u, err := addOptions(u, opt)
diff --git a/vendor/github.com/google/go-github/github/repos_projects.go b/vendor/github.com/google/go-github/github/repos_projects.go
new file mode 100644
index 0000000..e37e220
--- /dev/null
+++ b/vendor/github.com/google/go-github/github/repos_projects.go
@@ -0,0 +1,464 @@
+// Copyright 2016 The go-github 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 github
+
+import (
+ "fmt"
+)
+
+// Project represents a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/
+type Project struct {
+ ID *int `json:"id,omitempty"`
+ URL *string `json:"url,omitempty"`
+ OwnerURL *string `json:"owner_url,omitempty"`
+ Name *string `json:"name,omitempty"`
+ Body *string `json:"body,omitempty"`
+ Number *int `json:"number,omitempty"`
+ CreatedAt *Timestamp `json:"created_at,omitempty"`
+ UpdatedAt *Timestamp `json:"updated_at,omitempty"`
+
+ // The User object that generated the project.
+ Creator *User `json:"creator,omitempty"`
+}
+
+func (p Project) String() string {
+ return Stringify(p)
+}
+
+// ListProjects lists the projects for a repo.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#list-projects
+func (s *RepositoriesService) ListProjects(owner, repo string, opt *ListOptions) ([]*Project, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects", owner, repo)
+ u, err := addOptions(u, opt)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ req, err := s.client.NewRequest("GET", u, nil)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ projects := []*Project{}
+ resp, err := s.client.Do(req, &projects)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return projects, resp, err
+}
+
+// GetProject gets a GitHub Project for a repo.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#get-a-project
+func (s *RepositoriesService) GetProject(owner, repo string, number int) (*Project, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/%v", owner, repo, number)
+ req, err := s.client.NewRequest("GET", u, nil)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ project := &Project{}
+ resp, err := s.client.Do(req, project)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return project, resp, err
+}
+
+// ProjectOptions specifies the parameters to the
+// RepositoriesService.CreateProject and
+// RepositoriesService.UpdateProject methods.
+type ProjectOptions struct {
+ // The name of the project. (Required for creation; optional for update.)
+ Name string `json:"name,omitempty"`
+ // The body of the project. (Optional.)
+ Body string `json:"body,omitempty"`
+}
+
+// CreateProject creates a GitHub Project for the specified repository.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#create-a-project
+func (s *RepositoriesService) CreateProject(owner, repo string, projectOptions *ProjectOptions) (*Project, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects", owner, repo)
+ req, err := s.client.NewRequest("POST", u, projectOptions)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ project := &Project{}
+ resp, err := s.client.Do(req, project)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return project, resp, err
+}
+
+// UpdateProject updates a repository project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#update-a-project
+func (s *RepositoriesService) UpdateProject(owner, repo string, number int, projectOptions *ProjectOptions) (*Project, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/%v", owner, repo, number)
+ req, err := s.client.NewRequest("PATCH", u, projectOptions)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ project := &Project{}
+ resp, err := s.client.Do(req, project)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return project, resp, err
+}
+
+// DeleteProject deletes a GitHub Project from a repository.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#delete-a-project
+func (s *RepositoriesService) DeleteProject(owner, repo string, number int) (*Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/%v", owner, repo, number)
+ req, err := s.client.NewRequest("DELETE", u, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ return s.client.Do(req, nil)
+}
+
+// ProjectColumn represents a column of a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/
+type ProjectColumn struct {
+ ID *int `json:"id,omitempty"`
+ Name *string `json:"name,omitempty"`
+ ProjectURL *string `json:"project_url,omitempty"`
+ CreatedAt *Timestamp `json:"created_at,omitempty"`
+ UpdatedAt *Timestamp `json:"updated_at,omitempty"`
+}
+
+// ListProjectColumns lists the columns of a GitHub Project for a repo.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#list-columns
+func (s *RepositoriesService) ListProjectColumns(owner, repo string, number int, opt *ListOptions) ([]*ProjectColumn, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/%v/columns", owner, repo, number)
+ u, err := addOptions(u, opt)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ req, err := s.client.NewRequest("GET", u, nil)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ columns := []*ProjectColumn{}
+ resp, err := s.client.Do(req, &columns)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return columns, resp, err
+}
+
+// GetProjectColumn gets a column of a GitHub Project for a repo.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#get-a-column
+func (s *RepositoriesService) GetProjectColumn(owner, repo string, columnID int) (*ProjectColumn, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/%v", owner, repo, columnID)
+ req, err := s.client.NewRequest("GET", u, nil)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ column := &ProjectColumn{}
+ resp, err := s.client.Do(req, column)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return column, resp, err
+}
+
+// ProjectColumnOptions specifies the parameters to the
+// RepositoriesService.CreateProjectColumn and
+// RepositoriesService.UpdateProjectColumn methods.
+type ProjectColumnOptions struct {
+ // The name of the project column. (Required for creation and update.)
+ Name string `json:"name"`
+}
+
+// CreateProjectColumn creates a column for the specified (by number) project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#create-a-column
+func (s *RepositoriesService) CreateProjectColumn(owner, repo string, number int, columnOptions *ProjectColumnOptions) (*ProjectColumn, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/%v/columns", owner, repo, number)
+ req, err := s.client.NewRequest("POST", u, columnOptions)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ column := &ProjectColumn{}
+ resp, err := s.client.Do(req, column)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return column, resp, err
+}
+
+// UpdateProjectColumn updates a column of a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#update-a-column
+func (s *RepositoriesService) UpdateProjectColumn(owner, repo string, columnID int, columnOptions *ProjectColumnOptions) (*ProjectColumn, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/%v", owner, repo, columnID)
+ req, err := s.client.NewRequest("PATCH", u, columnOptions)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ column := &ProjectColumn{}
+ resp, err := s.client.Do(req, column)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return column, resp, err
+}
+
+// DeleteProjectColumn deletes a column from a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#delete-a-column
+func (s *RepositoriesService) DeleteProjectColumn(owner, repo string, columnID int) (*Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/%v", owner, repo, columnID)
+ req, err := s.client.NewRequest("DELETE", u, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ return s.client.Do(req, nil)
+}
+
+// ProjectColumnMoveOptions specifies the parameters to the
+// RepositoriesService.MoveProjectColumn method.
+type ProjectColumnMoveOptions struct {
+ // Position can be one of "first", "last", or "after:<column-id>", where
+ // <column-id> is the ID of a column in the same project. (Required.)
+ Position string `json:"position"`
+}
+
+// MoveProjectColumn moves a column within a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#move-a-column
+func (s *RepositoriesService) MoveProjectColumn(owner, repo string, columnID int, moveOptions *ProjectColumnMoveOptions) (*Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/%v/moves", owner, repo, columnID)
+ req, err := s.client.NewRequest("POST", u, moveOptions)
+ if err != nil {
+ return nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ return s.client.Do(req, nil)
+}
+
+// ProjectCard represents a card in a column of a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/
+type ProjectCard struct {
+ ColumnURL *string `json:"column_url,omitempty"`
+ ContentURL *string `json:"content_url,omitempty"`
+ ID *int `json:"id,omitempty"`
+ Note *string `json:"note,omitempty"`
+ CreatedAt *Timestamp `json:"created_at,omitempty"`
+ UpdatedAt *Timestamp `json:"updated_at,omitempty"`
+}
+
+// ListProjectCards lists the cards in a column of a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#list-projects-cards
+func (s *RepositoriesService) ListProjectCards(owner, repo string, columnID int, opt *ListOptions) ([]*ProjectCard, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/%v/cards", owner, repo, columnID)
+ u, err := addOptions(u, opt)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ req, err := s.client.NewRequest("GET", u, nil)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ cards := []*ProjectCard{}
+ resp, err := s.client.Do(req, &cards)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return cards, resp, err
+}
+
+// GetProjectCard gets a card in a column of a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#get-a-project-card
+func (s *RepositoriesService) GetProjectCard(owner, repo string, columnID int) (*ProjectCard, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/cards/%v", owner, repo, columnID)
+ req, err := s.client.NewRequest("GET", u, nil)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ card := &ProjectCard{}
+ resp, err := s.client.Do(req, card)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return card, resp, err
+}
+
+// ProjectCardOptions specifies the parameters to the
+// RepositoriesService.CreateProjectCard and
+// RepositoriesService.UpdateProjectCard methods.
+type ProjectCardOptions struct {
+ // The note of the card. Note and ContentID are mutually exclusive.
+ Note string `json:"note,omitempty"`
+ // The ID (not Number) of the Issue or Pull Request to associate with this card.
+ // Note and ContentID are mutually exclusive.
+ ContentID int `json:"content_id,omitempty"`
+ // The type of content to associate with this card. Possible values are: "Issue", "PullRequest".
+ ContentType string `json:"content_type,omitempty"`
+}
+
+// CreateProjectCard creates a card in the specified column of a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#create-a-project-card
+func (s *RepositoriesService) CreateProjectCard(owner, repo string, columnID int, cardOptions *ProjectCardOptions) (*ProjectCard, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/%v/cards", owner, repo, columnID)
+ req, err := s.client.NewRequest("POST", u, cardOptions)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ card := &ProjectCard{}
+ resp, err := s.client.Do(req, card)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return card, resp, err
+}
+
+// UpdateProjectCard updates a card of a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#update-a-project-card
+func (s *RepositoriesService) UpdateProjectCard(owner, repo string, cardID int, cardOptions *ProjectCardOptions) (*ProjectCard, *Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/cards/%v", owner, repo, cardID)
+ req, err := s.client.NewRequest("PATCH", u, cardOptions)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ card := &ProjectCard{}
+ resp, err := s.client.Do(req, card)
+ if err != nil {
+ return nil, resp, err
+ }
+
+ return card, resp, err
+}
+
+// DeleteProjectCard deletes a card from a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#delete-a-project-card
+func (s *RepositoriesService) DeleteProjectCard(owner, repo string, cardID int) (*Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/cards/%v", owner, repo, cardID)
+ req, err := s.client.NewRequest("DELETE", u, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ return s.client.Do(req, nil)
+}
+
+// ProjectCardMoveOptions specifies the parameters to the
+// RepositoriesService.MoveProjectCard method.
+type ProjectCardMoveOptions struct {
+ // Position can be one of "top", "bottom", or "after:<card-id>", where
+ // <card-id> is the ID of a card in the same project.
+ Position string `json:"position"`
+ // ColumnID is the ID of a column in the same project. Note that ColumnID
+ // is required when using Position "after:<card-id>" when that card is in
+ // another column; otherwise it is optional.
+ ColumnID int `json:"column_id,omitempty"`
+}
+
+// MoveProjectCard moves a card within a GitHub Project.
+//
+// GitHub API docs: https://developer.github.com/v3/repos/projects/#move-a-project-card
+func (s *RepositoriesService) MoveProjectCard(owner, repo string, cardID int, moveOptions *ProjectCardMoveOptions) (*Response, error) {
+ u := fmt.Sprintf("repos/%v/%v/projects/columns/cards/%v/moves", owner, repo, cardID)
+ req, err := s.client.NewRequest("POST", u, moveOptions)
+ if err != nil {
+ return nil, err
+ }
+
+ // TODO: remove custom Accept header when this API fully launches.
+ req.Header.Set("Accept", mediaTypeProjectsPreview)
+
+ return s.client.Do(req, nil)
+}
diff --git a/vendor/github.com/gorilla/csrf/README.md b/vendor/github.com/gorilla/csrf/README.md
index 02e4f42..9bcf3f8 100644
--- a/vendor/github.com/gorilla/csrf/README.md
+++ b/vendor/github.com/gorilla/csrf/README.md
@@ -89,7 +89,7 @@ func main() {
func ShowSignupForm(w http.ResponseWriter, r *http.Request) {
// signup_form.tmpl just needs a {{ .csrfField }} template tag for
// csrf.TemplateField to inject the CSRF token into. Easy!
- t.ExecuteTemplate(w, "signup_form.tmpl", map[string]interface{
+ t.ExecuteTemplate(w, "signup_form.tmpl", map[string]interface{}{
csrf.TemplateTag: csrf.TemplateField(r),
})
// We could also retrieve the token directly from csrf.Token(r) and
diff --git a/vendor/github.com/gorilla/csrf/csrf.go b/vendor/github.com/gorilla/csrf/csrf.go
index b4b0439..58ffd5b 100644
--- a/vendor/github.com/gorilla/csrf/csrf.go
+++ b/vendor/github.com/gorilla/csrf/csrf.go
@@ -110,7 +110,7 @@ type options struct {
// func GetSignupForm(w http.ResponseWriter, r *http.Request) {
// // signup_form.tmpl just needs a {{ .csrfField }} template tag for
// // csrf.TemplateField to inject the CSRF token into. Easy!
-// t.ExecuteTemplate(w, "signup_form.tmpl", map[string]interface{
+// t.ExecuteTemplate(w, "signup_form.tmpl", map[string]interface{}{
// csrf.TemplateTag: csrf.TemplateField(r),
// })
// // We could also retrieve the token directly from csrf.Token(r) and
diff --git a/vendor/github.com/gorilla/mux/doc.go b/vendor/github.com/gorilla/mux/doc.go
index 291ef5e..e9573dd 100644
--- a/vendor/github.com/gorilla/mux/doc.go
+++ b/vendor/github.com/gorilla/mux/doc.go
@@ -47,6 +47,10 @@ variable will be anything until the next slash. For example:
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
+Groups can be used inside patterns, as long as they are non-capturing (?:re). For example:
+
+ r.HandleFunc("/articles/{category}/{sort:(?:asc|desc|new)}", ArticlesCategoryHandler)
+
The names are used to create a map of route variables which can be retrieved
calling mux.Vars():
diff --git a/vendor/github.com/gorilla/securecookie/securecookie.go b/vendor/github.com/gorilla/securecookie/securecookie.go
index 83dd606..cd4e097 100644
--- a/vendor/github.com/gorilla/securecookie/securecookie.go
+++ b/vendor/github.com/gorilla/securecookie/securecookie.go
@@ -102,6 +102,7 @@ var (
errTimestampExpired = cookieError{typ: decodeError, msg: "expired timestamp"}
errDecryptionFailed = cookieError{typ: decodeError, msg: "the value could not be decrypted"}
errValueNotByte = cookieError{typ: decodeError, msg: "value not a []byte."}
+ errValueNotBytePtr = cookieError{typ: decodeError, msg: "value not a pointer to []byte."}
// ErrMacInvalid indicates that cookie decoding failed because the HMAC
// could not be extracted and verified. Direct use of this error
@@ -474,12 +475,11 @@ func (e NopEncoder) Serialize(src interface{}) ([]byte, error) {
// Deserialize passes a []byte through as-is.
func (e NopEncoder) Deserialize(src []byte, dst interface{}) error {
- if _, ok := dst.([]byte); ok {
- dst = src
+ if dat, ok := dst.(*[]byte); ok {
+ *dat = src
return nil
}
-
- return errValueNotByte
+ return errValueNotBytePtr
}
// Encoding -------------------------------------------------------------------
diff --git a/vendor/github.com/gorilla/sessions/README.md b/vendor/github.com/gorilla/sessions/README.md
index 12f6118..65e5e1b 100644
--- a/vendor/github.com/gorilla/sessions/README.md
+++ b/vendor/github.com/gorilla/sessions/README.md
@@ -64,7 +64,7 @@ Other implementations of the `sessions.Store` interface:
* [github.com/srinathgs/couchbasestore](https://github.com/srinathgs/couchbasestore) - Couchbase
* [github.com/denizeren/dynamostore](https://github.com/denizeren/dynamostore) - Dynamodb on AWS
* [github.com/bradleypeabody/gorilla-sessions-memcache](https://github.com/bradleypeabody/gorilla-sessions-memcache) - Memcache
-* [github.com/dsoprea/goappenginesessioncascade](https://github.com/dsoprea/goappenginesessioncascade) - Memcache/Datastore/Context in AppEngine
+* [github.com/dsoprea/go-appengine-sessioncascade](https://github.com/dsoprea/go-appengine-sessioncascade) - Memcache/Datastore/Context in AppEngine
* [github.com/kidstuff/mongostore](https://github.com/kidstuff/mongostore) - MongoDB
* [github.com/srinathgs/mysqlstore](https://github.com/srinathgs/mysqlstore) - MySQL
* [github.com/antonlindstrom/pgstore](https://github.com/antonlindstrom/pgstore) - PostgreSQL
diff --git a/vendor/github.com/gorilla/sessions/store.go b/vendor/github.com/gorilla/sessions/store.go
index ba3b9e9..4ff6b6c 100644
--- a/vendor/github.com/gorilla/sessions/store.go
+++ b/vendor/github.com/gorilla/sessions/store.go
@@ -205,8 +205,22 @@ func (s *FilesystemStore) New(r *http.Request, name string) (*Session, error) {
}
// Save adds a single session to the response.
+//
+// If the Options.MaxAge of the session is <= 0 then the session file will be
+// deleted from the store path. With this process it enforces the properly
+// session cookie handling so no need to trust in the cookie management in the
+// web browser.
func (s *FilesystemStore) Save(r *http.Request, w http.ResponseWriter,
session *Session) error {
+ // Delete if max-age is <= 0
+ if session.Options.MaxAge <= 0 {
+ if err := s.erase(session); err != nil {
+ return err
+ }
+ http.SetCookie(w, NewCookie(session.Name(), "", session.Options))
+ return nil
+ }
+
if session.ID == "" {
// Because the ID is used in the filename, encode it to
// use alphanumeric characters only.
@@ -268,3 +282,14 @@ func (s *FilesystemStore) load(session *Session) error {
}
return nil
}
+
+// delete session file
+func (s *FilesystemStore) erase(session *Session) error {
+ filename := filepath.Join(s.path, "session_"+session.ID)
+
+ fileMutex.RLock()
+ defer fileMutex.RUnlock()
+
+ err := os.Remove(filename)
+ return err
+}
diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go
index ea3734f..6e5ef65 100644
--- a/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go
+++ b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go
@@ -156,7 +156,8 @@ func (o *ObjectKey) Pos() token.Pos {
type LiteralType struct {
Token token.Token
- // associated line comment, only when used in a list
+ // comment types, only used when in a list
+ LeadComment *CommentGroup
LineComment *CommentGroup
}
diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
index f46ed4c..0aa080f 100644
--- a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
+++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
@@ -337,6 +337,12 @@ func (p *Parser) listType() (*ast.ListType, error) {
return nil, err
}
+ // If there is a lead comment, apply it
+ if p.leadComment != nil {
+ node.LeadComment = p.leadComment
+ p.leadComment = nil
+ }
+
l.Add(node)
needComma = true
case token.COMMA:
diff --git a/vendor/github.com/hashicorp/hcl/json/parser/parser.go b/vendor/github.com/hashicorp/hcl/json/parser/parser.go
index 3a62ec3..acf9594 100644
--- a/vendor/github.com/hashicorp/hcl/json/parser/parser.go
+++ b/vendor/github.com/hashicorp/hcl/json/parser/parser.go
@@ -5,6 +5,7 @@ import (
"fmt"
"github.com/hashicorp/hcl/hcl/ast"
+ hcltoken "github.com/hashicorp/hcl/hcl/token"
"github.com/hashicorp/hcl/json/scanner"
"github.com/hashicorp/hcl/json/token"
)
@@ -103,6 +104,14 @@ func (p *Parser) objectItem() (*ast.ObjectItem, error) {
switch p.tok.Type {
case token.COLON:
+ pos := p.tok.Pos
+ o.Assign = hcltoken.Pos{
+ Filename: pos.Filename,
+ Offset: pos.Offset,
+ Line: pos.Line,
+ Column: pos.Column,
+ }
+
o.Val, err = p.objectValue()
if err != nil {
return nil, err
diff --git a/vendor/github.com/mattn/go-sqlite3/doc.go b/vendor/github.com/mattn/go-sqlite3/doc.go
index c721f77..030cd93 100644
--- a/vendor/github.com/mattn/go-sqlite3/doc.go
+++ b/vendor/github.com/mattn/go-sqlite3/doc.go
@@ -110,3 +110,5 @@ See the documentation of RegisterFunc for more details.
*/
package sqlite3
+
+import "C"
diff --git a/vendor/github.com/mattn/go-sqlite3/sqlite3.go b/vendor/github.com/mattn/go-sqlite3/sqlite3.go
index f3c1226..af4c68d 100644
--- a/vendor/github.com/mattn/go-sqlite3/sqlite3.go
+++ b/vendor/github.com/mattn/go-sqlite3/sqlite3.go
@@ -9,6 +9,8 @@ package sqlite3
#cgo CFLAGS: -std=gnu99
#cgo CFLAGS: -DSQLITE_ENABLE_RTREE -DSQLITE_THREADSAFE
#cgo CFLAGS: -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS4_UNICODE61
+#cgo CFLAGS: -DSQLITE_TRACE_SIZE_LIMIT=15
+#cgo CFLAGS: -Wno-deprecated-declarations -Wno-c99-extensions
#ifndef USE_LIBSQLITE3
#include <sqlite3-binding.h>
#else
@@ -97,8 +99,6 @@ int _sqlite3_create_function(
}
void callbackTrampoline(sqlite3_context*, int, sqlite3_value**);
-void stepTrampoline(sqlite3_context*, int, sqlite3_value**);
-void doneTrampoline(sqlite3_context*);
*/
import "C"
import (
@@ -388,131 +388,6 @@ func (c *SQLiteConn) RegisterFunc(name string, impl interface{}, pure bool) erro
return nil
}
-// RegisterAggregator makes a Go type available as a SQLite aggregation function.
-//
-// Because aggregation is incremental, it's implemented in Go with a
-// type that has 2 methods: func Step(values) accumulates one row of
-// data into the accumulator, and func Done() ret finalizes and
-// returns the aggregate value. "values" and "ret" may be any type
-// supported by RegisterFunc.
-//
-// RegisterAggregator takes as implementation a constructor function
-// that constructs an instance of the aggregator type each time an
-// aggregation begins. The constructor must return a pointer to a
-// type, or an interface that implements Step() and Done().
-//
-// The constructor function and the Step/Done methods may optionally
-// return an error in addition to their other return values.
-//
-// See _example/go_custom_funcs for a detailed example.
-func (c *SQLiteConn) RegisterAggregator(name string, impl interface{}, pure bool) error {
- var ai aggInfo
- ai.constructor = reflect.ValueOf(impl)
- t := ai.constructor.Type()
- if t.Kind() != reflect.Func {
- return errors.New("non-function passed to RegisterAggregator")
- }
- if t.NumOut() != 1 && t.NumOut() != 2 {
- return errors.New("SQLite aggregator constructors must return 1 or 2 values")
- }
- if t.NumOut() == 2 && !t.Out(1).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
- return errors.New("Second return value of SQLite function must be error")
- }
- if t.NumIn() != 0 {
- return errors.New("SQLite aggregator constructors must not have arguments")
- }
-
- agg := t.Out(0)
- switch agg.Kind() {
- case reflect.Ptr, reflect.Interface:
- default:
- return errors.New("SQlite aggregator constructor must return a pointer object")
- }
- stepFn, found := agg.MethodByName("Step")
- if !found {
- return errors.New("SQlite aggregator doesn't have a Step() function")
- }
- step := stepFn.Type
- if step.NumOut() != 0 && step.NumOut() != 1 {
- return errors.New("SQlite aggregator Step() function must return 0 or 1 values")
- }
- if step.NumOut() == 1 && !step.Out(0).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
- return errors.New("type of SQlite aggregator Step() return value must be error")
- }
-
- stepNArgs := step.NumIn()
- start := 0
- if agg.Kind() == reflect.Ptr {
- // Skip over the method receiver
- stepNArgs--
- start++
- }
- if step.IsVariadic() {
- stepNArgs--
- }
- for i := start; i < start+stepNArgs; i++ {
- conv, err := callbackArg(step.In(i))
- if err != nil {
- return err
- }
- ai.stepArgConverters = append(ai.stepArgConverters, conv)
- }
- if step.IsVariadic() {
- conv, err := callbackArg(t.In(start + stepNArgs).Elem())
- if err != nil {
- return err
- }
- ai.stepVariadicConverter = conv
- // Pass -1 to sqlite so that it allows any number of
- // arguments. The call helper verifies that the minimum number
- // of arguments is present for variadic functions.
- stepNArgs = -1
- }
-
- doneFn, found := agg.MethodByName("Done")
- if !found {
- return errors.New("SQlite aggregator doesn't have a Done() function")
- }
- done := doneFn.Type
- doneNArgs := done.NumIn()
- if agg.Kind() == reflect.Ptr {
- // Skip over the method receiver
- doneNArgs--
- }
- if doneNArgs != 0 {
- return errors.New("SQlite aggregator Done() function must have no arguments")
- }
- if done.NumOut() != 1 && done.NumOut() != 2 {
- return errors.New("SQLite aggregator Done() function must return 1 or 2 values")
- }
- if done.NumOut() == 2 && !done.Out(1).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
- return errors.New("second return value of SQLite aggregator Done() function must be error")
- }
-
- conv, err := callbackRet(done.Out(0))
- if err != nil {
- return err
- }
- ai.doneRetConverter = conv
- ai.active = make(map[int64]reflect.Value)
- ai.next = 1
-
- // ai must outlast the database connection, or we'll have dangling pointers.
- c.aggregators = append(c.aggregators, &ai)
-
- cname := C.CString(name)
- defer C.free(unsafe.Pointer(cname))
- opts := C.SQLITE_UTF8
- if pure {
- opts |= C.SQLITE_DETERMINISTIC
- }
- rv := C._sqlite3_create_function(c.db, cname, C.int(stepNArgs), C.int(opts), C.uintptr_t(newHandle(c, &ai)), nil, (*[0]byte)(unsafe.Pointer(C.stepTrampoline)), (*[0]byte)(unsafe.Pointer(C.doneTrampoline)))
- if rv != C.SQLITE_OK {
- return c.lastError()
- }
- return nil
-}
-
// AutoCommit return which currently auto commit or not.
func (c *SQLiteConn) AutoCommit() bool {
return int(C.sqlite3_get_autocommit(c.db)) != 0
diff --git a/vendor/github.com/mattn/go-sqlite3/tracecallback.go b/vendor/github.com/mattn/go-sqlite3/tracecallback.go
new file mode 100644
index 0000000..bf222b5
--- /dev/null
+++ b/vendor/github.com/mattn/go-sqlite3/tracecallback.go
@@ -0,0 +1,415 @@
+// Copyright (C) 2016 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
+// TODO: add "Gimpl do foo" team?
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+// +build trace
+
+package sqlite3
+
+/*
+#ifndef USE_LIBSQLITE3
+#include <sqlite3-binding.h>
+#else
+#include <sqlite3.h>
+#endif
+#include <stdlib.h>
+
+void stepTrampoline(sqlite3_context*, int, sqlite3_value**);
+void doneTrampoline(sqlite3_context*);
+void traceCallbackTrampoline(unsigned traceEventCode, void *ctx, void *p, void *x);
+*/
+import "C"
+
+import (
+ "errors"
+ "fmt"
+ "reflect"
+ "strings"
+ "sync"
+ "unsafe"
+)
+
+// Trace... constants identify the possible events causing callback invocation.
+// Values are same as the corresponding SQLite Trace Event Codes.
+const (
+ TraceStmt = C.SQLITE_TRACE_STMT
+ TraceProfile = C.SQLITE_TRACE_PROFILE
+ TraceRow = C.SQLITE_TRACE_ROW
+ TraceClose = C.SQLITE_TRACE_CLOSE
+)
+
+type TraceInfo struct {
+ // Pack together the shorter fields, to keep the struct smaller.
+ // On a 64-bit machine there would be padding
+ // between EventCode and ConnHandle; having AutoCommit here is "free":
+ EventCode uint32
+ AutoCommit bool
+ ConnHandle uintptr
+
+ // Usually filled, unless EventCode = TraceClose = SQLITE_TRACE_CLOSE:
+ // identifier for a prepared statement:
+ StmtHandle uintptr
+
+ // Two strings filled when EventCode = TraceStmt = SQLITE_TRACE_STMT:
+ // (1) either the unexpanded SQL text of the prepared statement, or
+ // an SQL comment that indicates the invocation of a trigger;
+ // (2) expanded SQL, if requested and if (1) is not an SQL comment.
+ StmtOrTrigger string
+ ExpandedSQL string // only if requested (TraceConfig.WantExpandedSQL = true)
+
+ // filled when EventCode = TraceProfile = SQLITE_TRACE_PROFILE:
+ // estimated number of nanoseconds that the prepared statement took to run:
+ RunTimeNanosec int64
+
+ DBError Error
+}
+
+// TraceUserCallback gives the signature for a trace function
+// provided by the user (Go application programmer).
+// SQLite 3.14 documentation (as of September 2, 2016)
+// for SQL Trace Hook = sqlite3_trace_v2():
+// The integer return value from the callback is currently ignored,
+// though this may change in future releases. Callback implementations
+// should return zero to ensure future compatibility.
+type TraceUserCallback func(TraceInfo) int
+
+type TraceConfig struct {
+ Callback TraceUserCallback
+ EventMask uint
+ WantExpandedSQL bool
+}
+
+func fillDBError(dbErr *Error, db *C.sqlite3) {
+ // See SQLiteConn.lastError(), in file 'sqlite3.go' at the time of writing (Sept 5, 2016)
+ dbErr.Code = ErrNo(C.sqlite3_errcode(db))
+ dbErr.ExtendedCode = ErrNoExtended(C.sqlite3_extended_errcode(db))
+ dbErr.err = C.GoString(C.sqlite3_errmsg(db))
+}
+
+func fillExpandedSQL(info *TraceInfo, db *C.sqlite3, pStmt unsafe.Pointer) {
+ if pStmt == nil {
+ panic("No SQLite statement pointer in P arg of trace_v2 callback")
+ }
+
+ expSQLiteCStr := C.sqlite3_expanded_sql((*C.sqlite3_stmt)(pStmt))
+ if expSQLiteCStr == nil {
+ fillDBError(&info.DBError, db)
+ return
+ }
+ info.ExpandedSQL = C.GoString(expSQLiteCStr)
+}
+
+//export traceCallbackTrampoline
+func traceCallbackTrampoline(
+ traceEventCode uint,
+ // Parameter named 'C' in SQLite docs = Context given at registration:
+ ctx unsafe.Pointer,
+ // Parameter named 'P' in SQLite docs (Primary event data?):
+ p unsafe.Pointer,
+ // Parameter named 'X' in SQLite docs (eXtra event data?):
+ xValue unsafe.Pointer) int {
+
+ if ctx == nil {
+ panic(fmt.Sprintf("No context (ev 0x%x)", traceEventCode))
+ }
+
+ contextDB := (*C.sqlite3)(ctx)
+ connHandle := uintptr(ctx)
+
+ var traceConf TraceConfig
+ var found bool
+ if traceEventCode == TraceClose {
+ // clean up traceMap: 'pop' means get and delete
+ traceConf, found = popTraceMapping(connHandle)
+ } else {
+ traceConf, found = lookupTraceMapping(connHandle)
+ }
+
+ if !found {
+ panic(fmt.Sprintf("Mapping not found for handle 0x%x (ev 0x%x)",
+ connHandle, traceEventCode))
+ }
+
+ var info TraceInfo
+
+ info.EventCode = uint32(traceEventCode)
+ info.AutoCommit = (int(C.sqlite3_get_autocommit(contextDB)) != 0)
+ info.ConnHandle = connHandle
+
+ switch traceEventCode {
+ case TraceStmt:
+ info.StmtHandle = uintptr(p)
+
+ var xStr string
+ if xValue != nil {
+ xStr = C.GoString((*C.char)(xValue))
+ }
+ info.StmtOrTrigger = xStr
+ if !strings.HasPrefix(xStr, "--") {
+ // Not SQL comment, therefore the current event
+ // is not related to a trigger.
+ // The user might want to receive the expanded SQL;
+ // let's check:
+ if traceConf.WantExpandedSQL {
+ fillExpandedSQL(&info, contextDB, p)
+ }
+ }
+
+ case TraceProfile:
+ info.StmtHandle = uintptr(p)
+
+ if xValue == nil {
+ panic("NULL pointer in X arg of trace_v2 callback for SQLITE_TRACE_PROFILE event")
+ }
+
+ info.RunTimeNanosec = *(*int64)(xValue)
+
+ // sample the error //TODO: is it safe? is it useful?
+ fillDBError(&info.DBError, contextDB)
+
+ case TraceRow:
+ info.StmtHandle = uintptr(p)
+
+ case TraceClose:
+ handle := uintptr(p)
+ if handle != info.ConnHandle {
+ panic(fmt.Sprintf("Different conn handle 0x%x (expected 0x%x) in SQLITE_TRACE_CLOSE event.",
+ handle, info.ConnHandle))
+ }
+
+ default:
+ // Pass unsupported events to the user callback (if configured);
+ // let the user callback decide whether to panic or ignore them.
+ }
+
+ // Do not execute user callback when the event was not requested by user!
+ // Remember that the Close event is always selected when
+ // registering this callback trampoline with SQLite --- for cleanup.
+ // In the future there may be more events forced to "selected" in SQLite
+ // for the driver's needs.
+ if traceConf.EventMask&traceEventCode == 0 {
+ return 0
+ }
+
+ r := 0
+ if traceConf.Callback != nil {
+ r = traceConf.Callback(info)
+ }
+ return r
+}
+
+type traceMapEntry struct {
+ config TraceConfig
+}
+
+var traceMapLock sync.Mutex
+var traceMap = make(map[uintptr]traceMapEntry)
+
+func addTraceMapping(connHandle uintptr, traceConf TraceConfig) {
+ traceMapLock.Lock()
+ defer traceMapLock.Unlock()
+
+ oldEntryCopy, found := traceMap[connHandle]
+ if found {
+ panic(fmt.Sprintf("Adding trace config %v: handle 0x%x already registered (%v).",
+ traceConf, connHandle, oldEntryCopy.config))
+ }
+ traceMap[connHandle] = traceMapEntry{config: traceConf}
+ fmt.Printf("Added trace config %v: handle 0x%x.\n", traceConf, connHandle)
+}
+
+func lookupTraceMapping(connHandle uintptr) (TraceConfig, bool) {
+ traceMapLock.Lock()
+ defer traceMapLock.Unlock()
+
+ entryCopy, found := traceMap[connHandle]
+ return entryCopy.config, found
+}
+
+// 'pop' = get and delete from map before returning the value to the caller
+func popTraceMapping(connHandle uintptr) (TraceConfig, bool) {
+ traceMapLock.Lock()
+ defer traceMapLock.Unlock()
+
+ entryCopy, found := traceMap[connHandle]
+ if found {
+ delete(traceMap, connHandle)
+ fmt.Printf("Pop handle 0x%x: deleted trace config %v.\n", connHandle, entryCopy.config)
+ }
+ return entryCopy.config, found
+}
+
+// RegisterAggregator makes a Go type available as a SQLite aggregation function.
+//
+// Because aggregation is incremental, it's implemented in Go with a
+// type that has 2 methods: func Step(values) accumulates one row of
+// data into the accumulator, and func Done() ret finalizes and
+// returns the aggregate value. "values" and "ret" may be any type
+// supported by RegisterFunc.
+//
+// RegisterAggregator takes as implementation a constructor function
+// that constructs an instance of the aggregator type each time an
+// aggregation begins. The constructor must return a pointer to a
+// type, or an interface that implements Step() and Done().
+//
+// The constructor function and the Step/Done methods may optionally
+// return an error in addition to their other return values.
+//
+// See _example/go_custom_funcs for a detailed example.
+func (c *SQLiteConn) RegisterAggregator(name string, impl interface{}, pure bool) error {
+ var ai aggInfo
+ ai.constructor = reflect.ValueOf(impl)
+ t := ai.constructor.Type()
+ if t.Kind() != reflect.Func {
+ return errors.New("non-function passed to RegisterAggregator")
+ }
+ if t.NumOut() != 1 && t.NumOut() != 2 {
+ return errors.New("SQLite aggregator constructors must return 1 or 2 values")
+ }
+ if t.NumOut() == 2 && !t.Out(1).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
+ return errors.New("Second return value of SQLite function must be error")
+ }
+ if t.NumIn() != 0 {
+ return errors.New("SQLite aggregator constructors must not have arguments")
+ }
+
+ agg := t.Out(0)
+ switch agg.Kind() {
+ case reflect.Ptr, reflect.Interface:
+ default:
+ return errors.New("SQlite aggregator constructor must return a pointer object")
+ }
+ stepFn, found := agg.MethodByName("Step")
+ if !found {
+ return errors.New("SQlite aggregator doesn't have a Step() function")
+ }
+ step := stepFn.Type
+ if step.NumOut() != 0 && step.NumOut() != 1 {
+ return errors.New("SQlite aggregator Step() function must return 0 or 1 values")
+ }
+ if step.NumOut() == 1 && !step.Out(0).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
+ return errors.New("type of SQlite aggregator Step() return value must be error")
+ }
+
+ stepNArgs := step.NumIn()
+ start := 0
+ if agg.Kind() == reflect.Ptr {
+ // Skip over the method receiver
+ stepNArgs--
+ start++
+ }
+ if step.IsVariadic() {
+ stepNArgs--
+ }
+ for i := start; i < start+stepNArgs; i++ {
+ conv, err := callbackArg(step.In(i))
+ if err != nil {
+ return err
+ }
+ ai.stepArgConverters = append(ai.stepArgConverters, conv)
+ }
+ if step.IsVariadic() {
+ conv, err := callbackArg(t.In(start + stepNArgs).Elem())
+ if err != nil {
+ return err
+ }
+ ai.stepVariadicConverter = conv
+ // Pass -1 to sqlite so that it allows any number of
+ // arguments. The call helper verifies that the minimum number
+ // of arguments is present for variadic functions.
+ stepNArgs = -1
+ }
+
+ doneFn, found := agg.MethodByName("Done")
+ if !found {
+ return errors.New("SQlite aggregator doesn't have a Done() function")
+ }
+ done := doneFn.Type
+ doneNArgs := done.NumIn()
+ if agg.Kind() == reflect.Ptr {
+ // Skip over the method receiver
+ doneNArgs--
+ }
+ if doneNArgs != 0 {
+ return errors.New("SQlite aggregator Done() function must have no arguments")
+ }
+ if done.NumOut() != 1 && done.NumOut() != 2 {
+ return errors.New("SQLite aggregator Done() function must return 1 or 2 values")
+ }
+ if done.NumOut() == 2 && !done.Out(1).Implements(reflect.TypeOf((*error)(nil)).Elem()) {
+ return errors.New("second return value of SQLite aggregator Done() function must be error")
+ }
+
+ conv, err := callbackRet(done.Out(0))
+ if err != nil {
+ return err
+ }
+ ai.doneRetConverter = conv
+ ai.active = make(map[int64]reflect.Value)
+ ai.next = 1
+
+ // ai must outlast the database connection, or we'll have dangling pointers.
+ c.aggregators = append(c.aggregators, &ai)
+
+ cname := C.CString(name)
+ defer C.free(unsafe.Pointer(cname))
+ opts := C.SQLITE_UTF8
+ if pure {
+ opts |= C.SQLITE_DETERMINISTIC
+ }
+ rv := C._sqlite3_create_function(c.db, cname, C.int(stepNArgs), C.int(opts), C.uintptr_t(newHandle(c, &ai)), nil, (*[0]byte)(unsafe.Pointer(C.stepTrampoline)), (*[0]byte)(unsafe.Pointer(C.doneTrampoline)))
+ if rv != C.SQLITE_OK {
+ return c.lastError()
+ }
+ return nil
+}
+
+// SetTrace installs or removes the trace callback for the given database connection.
+// It's not named 'RegisterTrace' because only one callback can be kept and called.
+// Calling SetTrace a second time on same database connection
+// overrides (cancels) any prior callback and all its settings:
+// event mask, etc.
+func (c *SQLiteConn) SetTrace(requested *TraceConfig) error {
+ connHandle := uintptr(unsafe.Pointer(c.db))
+
+ _, _ = popTraceMapping(connHandle)
+
+ if requested == nil {
+ // The traceMap entry was deleted already by popTraceMapping():
+ // can disable all events now, no need to watch for TraceClose.
+ err := c.setSQLiteTrace(0)
+ return err
+ }
+
+ reqCopy := *requested
+
+ // Disable potentially expensive operations
+ // if their result will not be used. We are doing this
+ // just in case the caller provided nonsensical input.
+ if reqCopy.EventMask&TraceStmt == 0 {
+ reqCopy.WantExpandedSQL = false
+ }
+
+ addTraceMapping(connHandle, reqCopy)
+
+ // The callback trampoline function does cleanup on Close event,
+ // regardless of the presence or absence of the user callback.
+ // Therefore it needs the Close event to be selected:
+ actualEventMask := reqCopy.EventMask | TraceClose
+ err := c.setSQLiteTrace(actualEventMask)
+ return err
+}
+
+func (c *SQLiteConn) setSQLiteTrace(sqliteEventMask uint) error {
+ rv := C.sqlite3_trace_v2(c.db,
+ C.uint(sqliteEventMask),
+ (*[0]byte)(unsafe.Pointer(C.traceCallbackTrampoline)),
+ unsafe.Pointer(c.db)) // Fourth arg is same as first: we are
+ // passing the database connection handle as callback context.
+
+ if rv != C.SQLITE_OK {
+ return c.lastError()
+ }
+ return nil
+}
diff --git a/vendor/github.com/mattn/go-sqlite3/tracecallback_noimpl.go b/vendor/github.com/mattn/go-sqlite3/tracecallback_noimpl.go
new file mode 100644
index 0000000..c0a49e9
--- /dev/null
+++ b/vendor/github.com/mattn/go-sqlite3/tracecallback_noimpl.go
@@ -0,0 +1,9 @@
+// +build !trace
+
+package sqlite3
+
+import "errors"
+
+func (c *SQLiteConn) RegisterAggregator(name string, impl interface{}, pure bool) error {
+ return errors.New("This feature is not implemented")
+}
diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go
index a554e79..d1cb607 100644
--- a/vendor/github.com/mitchellh/mapstructure/mapstructure.go
+++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go
@@ -698,7 +698,7 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value)
if !rawMapVal.IsValid() {
// Do a slower search by iterating over each key and
// doing case-insensitive search.
- for dataValKey, _ := range dataValKeys {
+ for dataValKey := range dataValKeys {
mK, ok := dataValKey.Interface().(string)
if !ok {
// Not a string key
@@ -746,7 +746,7 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value)
if d.config.ErrorUnused && len(dataValKeysUnused) > 0 {
keys := make([]string, 0, len(dataValKeysUnused))
- for rawKey, _ := range dataValKeysUnused {
+ for rawKey := range dataValKeysUnused {
keys = append(keys, rawKey.(string))
}
sort.Strings(keys)
@@ -761,7 +761,7 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value)
// Add the unused keys to the list of unused keys if we're tracking metadata
if d.config.Metadata != nil {
- for rawKey, _ := range dataValKeysUnused {
+ for rawKey := range dataValKeysUnused {
key := rawKey.(string)
if name != "" {
key = fmt.Sprintf("%s.%s", name, key)
diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go
index 4deed81..b67664f 100644
--- a/vendor/github.com/pelletier/go-toml/keysparsing.go
+++ b/vendor/github.com/pelletier/go-toml/keysparsing.go
@@ -12,6 +12,7 @@ func parseKey(key string) ([]string, error) {
groups := []string{}
var buffer bytes.Buffer
inQuotes := false
+ wasInQuotes := false
escapeNext := false
ignoreSpace := true
expectDot := false
@@ -33,16 +34,27 @@ func parseKey(key string) ([]string, error) {
escapeNext = true
continue
case '"':
+ if inQuotes {
+ groups = append(groups, buffer.String())
+ buffer.Reset()
+ wasInQuotes = true
+ }
inQuotes = !inQuotes
expectDot = false
case '.':
if inQuotes {
buffer.WriteRune(char)
} else {
- groups = append(groups, buffer.String())
- buffer.Reset()
+ if !wasInQuotes {
+ if buffer.Len() == 0 {
+ return nil, fmt.Errorf("empty key group")
+ }
+ groups = append(groups, buffer.String())
+ buffer.Reset()
+ }
ignoreSpace = true
expectDot = false
+ wasInQuotes = false
}
case ' ':
if inQuotes {
diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go
index c0e1ad2..ad23fe8 100644
--- a/vendor/github.com/pelletier/go-toml/toml.go
+++ b/vendor/github.com/pelletier/go-toml/toml.go
@@ -222,9 +222,6 @@ func (t *TomlTree) SetPath(keys []string, value interface{}) {
func (t *TomlTree) createSubTree(keys []string, pos Position) error {
subtree := t
for _, intermediateKey := range keys {
- if intermediateKey == "" {
- return fmt.Errorf("empty intermediate table")
- }
nextTree, exists := subtree.values[intermediateKey]
if !exists {
tree := newTomlTree()
diff --git a/vendor/github.com/pelletier/go-toml/tomltree_conversions.go b/vendor/github.com/pelletier/go-toml/tomltree_conversions.go
index c9c6f95..bf9321b 100644
--- a/vendor/github.com/pelletier/go-toml/tomltree_conversions.go
+++ b/vendor/github.com/pelletier/go-toml/tomltree_conversions.go
@@ -45,8 +45,28 @@ func encodeTomlString(value string) string {
func toTomlValue(item interface{}, indent int) string {
tab := strings.Repeat(" ", indent)
switch value := item.(type) {
+ case int:
+ return tab + strconv.FormatInt(int64(value), 10)
+ case int8:
+ return tab + strconv.FormatInt(int64(value), 10)
+ case int16:
+ return tab + strconv.FormatInt(int64(value), 10)
+ case int32:
+ return tab + strconv.FormatInt(int64(value), 10)
case int64:
return tab + strconv.FormatInt(value, 10)
+ case uint:
+ return tab + strconv.FormatUint(uint64(value), 10)
+ case uint8:
+ return tab + strconv.FormatUint(uint64(value), 10)
+ case uint16:
+ return tab + strconv.FormatUint(uint64(value), 10)
+ case uint32:
+ return tab + strconv.FormatUint(uint64(value), 10)
+ case uint64:
+ return tab + strconv.FormatUint(value, 10)
+ case float32:
+ return tab + strconv.FormatFloat(float64(value), 'f', -1, 32)
case float64:
return tab + strconv.FormatFloat(value, 'f', -1, 64)
case string:
@@ -64,8 +84,10 @@ func toTomlValue(item interface{}, indent int) string {
result += toTomlValue(item, indent+2) + ",\n"
}
return result + tab + "]"
+ case nil:
+ return ""
default:
- panic(fmt.Sprintf("unsupported value type: %v", value))
+ panic(fmt.Sprintf("unsupported value type %T: %v", value, value))
}
}
@@ -100,6 +122,20 @@ func (t *TomlTree) toToml(indent, keyspace string) string {
result += fmt.Sprintf("\n%s[%s]\n", indent, combinedKey)
}
result += sub.toToml(indent+" ", combinedKey)
+ case map[string]string:
+ sub := TreeFromMap(convertMapStringString(node))
+
+ if len(sub.Keys()) > 0 {
+ result += fmt.Sprintf("\n%s[%s]\n", indent, combinedKey)
+ }
+ result += sub.toToml(indent+" ", combinedKey)
+ case map[interface{}]interface{}:
+ sub := TreeFromMap(convertMapInterfaceInterface(node))
+
+ if len(sub.Keys()) > 0 {
+ result += fmt.Sprintf("\n%s[%s]\n", indent, combinedKey)
+ }
+ result += sub.toToml(indent+" ", combinedKey)
case *tomlValue:
result += fmt.Sprintf("%s%s = %s\n", indent, k, toTomlValue(node.value, 0))
default:
@@ -109,6 +145,22 @@ func (t *TomlTree) toToml(indent, keyspace string) string {
return result
}
+func convertMapStringString(in map[string]string) map[string]interface{} {
+ result := make(map[string]interface{}, len(in))
+ for k, v := range in {
+ result[k] = v
+ }
+ return result
+}
+
+func convertMapInterfaceInterface(in map[interface{}]interface{}) map[string]interface{} {
+ result := make(map[string]interface{}, len(in))
+ for k, v := range in {
+ result[k.(string)] = v
+ }
+ return result
+}
+
// ToString is an alias for String
func (t *TomlTree) ToString() string {
return t.String()
diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go
index 1c9731a..842ee80 100644
--- a/vendor/github.com/pkg/errors/errors.go
+++ b/vendor/github.com/pkg/errors/errors.go
@@ -14,13 +14,18 @@
// Adding context to an error
//
// The errors.Wrap function returns a new error that adds context to the
-// original error. For example
+// original error by recording a stack trace at the point Wrap is called,
+// and the supplied message. For example
//
// _, err := ioutil.ReadAll(r)
// if err != nil {
// return errors.Wrap(err, "read failed")
// }
//
+// If additional control is required the errors.WithStack and errors.WithMessage
+// functions destructure errors.Wrap into its component operations of annotating
+// an error with a stack trace and an a message, respectively.
+//
// Retrieving the cause of an error
//
// Using errors.Wrap constructs a stack of errors, adding context to the
@@ -134,6 +139,18 @@ func (f *fundamental) Format(s fmt.State, verb rune) {
}
}
+// WithStack annotates err with a stack trace at the point WithStack was called.
+// If err is nil, WithStack returns nil.
+func WithStack(err error) error {
+ if err == nil {
+ return nil
+ }
+ return &withStack{
+ err,
+ callers(),
+ }
+}
+
type withStack struct {
error
*stack
@@ -157,7 +174,8 @@ func (w *withStack) Format(s fmt.State, verb rune) {
}
}
-// Wrap returns an error annotating err with message.
+// Wrap returns an error annotating err with a stack trace
+// at the point Wrap is called, and the supplied message.
// If err is nil, Wrap returns nil.
func Wrap(err error, message string) error {
if err == nil {
@@ -173,7 +191,8 @@ func Wrap(err error, message string) error {
}
}
-// Wrapf returns an error annotating err with the format specifier.
+// Wrapf returns an error annotating err with a stack trace
+// at the point Wrapf is call, and the format specifier.
// If err is nil, Wrapf returns nil.
func Wrapf(err error, format string, args ...interface{}) error {
if err == nil {
@@ -189,6 +208,18 @@ func Wrapf(err error, format string, args ...interface{}) error {
}
}
+// WithMessage annotates err with a new message.
+// If err is nil, WithMessage returns nil.
+func WithMessage(err error, message string) error {
+ if err == nil {
+ return nil
+ }
+ return &withMessage{
+ cause: err,
+ msg: message,
+ }
+}
+
type withMessage struct {
cause error
msg string
diff --git a/vendor/github.com/pkg/sftp/client.go b/vendor/github.com/pkg/sftp/client.go
index 41f1063..e95bbab 100644
--- a/vendor/github.com/pkg/sftp/client.go
+++ b/vendor/github.com/pkg/sftp/client.go
@@ -490,18 +490,13 @@ func (c *Client) Join(elem ...string) string { return path.Join(elem...) }
// is not empty.
func (c *Client) Remove(path string) error {
err := c.removeFile(path)
- switch err := err.(type) {
- case *StatusError:
+ if err, ok := err.(*StatusError); ok {
switch err.Code {
// some servers, *cough* osx *cough*, return EPERM, not ENODIR.
// serv-u returns ssh_FX_FILE_IS_A_DIRECTORY
case ssh_FX_PERMISSION_DENIED, ssh_FX_FAILURE, ssh_FX_FILE_IS_A_DIRECTORY:
return c.removeDirectory(path)
- default:
- return err
}
- default:
- return err
}
return err
}
diff --git a/vendor/github.com/pkg/sftp/server_statvfs_linux.go b/vendor/github.com/pkg/sftp/server_statvfs_linux.go
index 77fd1bf..43478e8 100644
--- a/vendor/github.com/pkg/sftp/server_statvfs_linux.go
+++ b/vendor/github.com/pkg/sftp/server_statvfs_linux.go
@@ -15,9 +15,8 @@ func statvfsFromStatfst(stat *syscall.Statfs_t) (*StatVFS, error) {
Bavail: stat.Bavail,
Files: stat.Files,
Ffree: stat.Ffree,
- Favail: stat.Ffree, // not sure how to calculate Favail
- Fsid: uint64(uint64(stat.Fsid.X__val[1])<<32 | uint64(stat.Fsid.X__val[0])), // endianness?
- Flag: uint64(stat.Flags), // assuming POSIX?
+ Favail: stat.Ffree, // not sure how to calculate Favail
+ Flag: uint64(stat.Flags), // assuming POSIX?
Namemax: uint64(stat.Namelen),
}, nil
}
diff --git a/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/spf13/afero/mem/file.go
index 9096ff0..3c1e09a 100644
--- a/vendor/github.com/spf13/afero/mem/file.go
+++ b/vendor/github.com/spf13/afero/mem/file.go
@@ -59,7 +59,9 @@ type FileData struct {
modtime time.Time
}
-func (d FileData) Name() string {
+func (d *FileData) Name() string {
+ d.Lock()
+ defer d.Unlock()
return d.name
}
@@ -107,9 +109,7 @@ func (f *File) Close() error {
}
func (f *File) Name() string {
- f.fileData.Lock()
- defer f.fileData.Unlock()
- return f.fileData.name
+ return f.fileData.Name()
}
func (f *File) Stat() (os.FileInfo, error) {
diff --git a/vendor/github.com/spf13/cast/cast.go b/vendor/github.com/spf13/cast/cast.go
index de5a686..6ca3e0e 100644
--- a/vendor/github.com/spf13/cast/cast.go
+++ b/vendor/github.com/spf13/cast/cast.go
@@ -67,6 +67,11 @@ func ToSlice(i interface{}) []interface{} {
return v
}
+func ToBoolSlice(i interface{}) []bool {
+ v, _ := ToBoolSliceE(i)
+ return v
+}
+
func ToStringSlice(i interface{}) []string {
v, _ := ToStringSliceE(i)
return v
diff --git a/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/spf13/cast/caste.go
index 863585b..23f59a1 100644
--- a/vendor/github.com/spf13/cast/caste.go
+++ b/vendor/github.com/spf13/cast/caste.go
@@ -12,14 +12,11 @@ import (
"strconv"
"strings"
"time"
-
- jww "github.com/spf13/jwalterweatherman"
)
// ToTimeE casts an empty interface to time.Time.
func ToTimeE(i interface{}) (tim time.Time, err error) {
i = indirect(i)
- jww.TRACE.Println("ToTimeE called on type:", reflect.TypeOf(i))
switch s := i.(type) {
case time.Time:
@@ -38,19 +35,22 @@ func ToTimeE(i interface{}) (tim time.Time, err error) {
// ToDurationE casts an empty interface to time.Duration.
func ToDurationE(i interface{}) (d time.Duration, err error) {
i = indirect(i)
- jww.TRACE.Println("ToDurationE called on type:", reflect.TypeOf(i))
switch s := i.(type) {
case time.Duration:
return s, nil
- case int64:
- d = time.Duration(s)
+ case int64, int32, int16, int8, int:
+ d = time.Duration(ToInt64(s))
return
- case float64:
- d = time.Duration(s)
+ case float32, float64:
+ d = time.Duration(ToFloat64(s))
return
case string:
- d, err = time.ParseDuration(s)
+ if strings.ContainsAny(s, "nsuµmh") {
+ d, err = time.ParseDuration(s)
+ } else {
+ d, err = time.ParseDuration(s + "ns")
+ }
return
default:
err = fmt.Errorf("Unable to Cast %#v to Duration\n", i)
@@ -60,8 +60,8 @@ func ToDurationE(i interface{}) (d time.Duration, err error) {
// ToBoolE casts an empty interface to a bool.
func ToBoolE(i interface{}) (bool, error) {
+
i = indirect(i)
- jww.TRACE.Println("ToBoolE called on type:", reflect.TypeOf(i))
switch b := i.(type) {
case bool:
@@ -83,7 +83,6 @@ func ToBoolE(i interface{}) (bool, error) {
// ToFloat64E casts an empty interface to a float64.
func ToFloat64E(i interface{}) (float64, error) {
i = indirect(i)
- jww.TRACE.Println("ToFloat64E called on type:", reflect.TypeOf(i))
switch s := i.(type) {
case float64:
@@ -114,7 +113,6 @@ func ToFloat64E(i interface{}) (float64, error) {
// ToInt64E casts an empty interface to an int64.
func ToInt64E(i interface{}) (int64, error) {
i = indirect(i)
- jww.TRACE.Println("ToInt64E called on type:", reflect.TypeOf(i))
switch s := i.(type) {
case int64:
@@ -150,7 +148,6 @@ func ToInt64E(i interface{}) (int64, error) {
// ToIntE casts an empty interface to an int.
func ToIntE(i interface{}) (int, error) {
i = indirect(i)
- jww.TRACE.Println("ToIntE called on type:", reflect.TypeOf(i))
switch s := i.(type) {
case int:
@@ -225,7 +222,6 @@ func indirectToStringerOrError(a interface{}) interface{} {
// ToStringE casts an empty interface to a string.
func ToStringE(i interface{}) (string, error) {
i = indirectToStringerOrError(i)
- jww.TRACE.Println("ToStringE called on type:", reflect.TypeOf(i))
switch s := i.(type) {
case string:
@@ -263,7 +259,6 @@ func ToStringE(i interface{}) (string, error) {
// ToStringMapStringE casts an empty interface to a map[string]string.
func ToStringMapStringE(i interface{}) (map[string]string, error) {
- jww.TRACE.Println("ToStringMapStringE called on type:", reflect.TypeOf(i))
var m = map[string]string{}
@@ -292,7 +287,6 @@ func ToStringMapStringE(i interface{}) (map[string]string, error) {
// ToStringMapStringSliceE casts an empty interface to a map[string][]string.
func ToStringMapStringSliceE(i interface{}) (map[string][]string, error) {
- jww.TRACE.Println("ToStringMapStringSliceE called on type:", reflect.TypeOf(i))
var m = map[string][]string{}
@@ -310,7 +304,14 @@ func ToStringMapStringSliceE(i interface{}) (map[string][]string, error) {
}
case map[string]interface{}:
for k, val := range v {
- m[ToString(k)] = []string{ToString(val)}
+ switch vt := val.(type) {
+ case []interface{}:
+ m[ToString(k)] = ToStringSlice(vt)
+ case []string:
+ m[ToString(k)] = vt
+ default:
+ m[ToString(k)] = []string{ToString(val)}
+ }
}
return m, nil
case map[interface{}][]string:
@@ -348,7 +349,6 @@ func ToStringMapStringSliceE(i interface{}) (map[string][]string, error) {
// ToStringMapBoolE casts an empty interface to a map[string]bool.
func ToStringMapBoolE(i interface{}) (map[string]bool, error) {
- jww.TRACE.Println("ToStringMapBoolE called on type:", reflect.TypeOf(i))
var m = map[string]bool{}
@@ -372,7 +372,6 @@ func ToStringMapBoolE(i interface{}) (map[string]bool, error) {
// ToStringMapE casts an empty interface to a map[string]interface{}.
func ToStringMapE(i interface{}) (map[string]interface{}, error) {
- jww.TRACE.Println("ToStringMapE called on type:", reflect.TypeOf(i))
var m = map[string]interface{}{}
@@ -391,7 +390,6 @@ func ToStringMapE(i interface{}) (map[string]interface{}, error) {
// ToSliceE casts an empty interface to a []interface{}.
func ToSliceE(i interface{}) ([]interface{}, error) {
- jww.TRACE.Println("ToSliceE called on type:", reflect.TypeOf(i))
var s []interface{}
@@ -411,9 +409,38 @@ func ToSliceE(i interface{}) ([]interface{}, error) {
}
}
+// ToBoolSliceE casts an empty interface to a []bool.
+func ToBoolSliceE(i interface{}) ([]bool, error) {
+
+ if i == nil {
+ return []bool{}, fmt.Errorf("Unable to Cast %#v to []bool", i)
+ }
+
+ switch v := i.(type) {
+ case []bool:
+ return v, nil
+ }
+
+ kind := reflect.TypeOf(i).Kind()
+ switch kind {
+ case reflect.Slice, reflect.Array:
+ s := reflect.ValueOf(i)
+ a := make([]bool, s.Len())
+ for j := 0; j < s.Len(); j++ {
+ val, err := ToBoolE(s.Index(j).Interface())
+ if err != nil {
+ return []bool{}, fmt.Errorf("Unable to Cast %#v to []bool", i)
+ }
+ a[j] = val
+ }
+ return a, nil
+ default:
+ return []bool{}, fmt.Errorf("Unable to Cast %#v to []bool", i)
+ }
+}
+
// ToStringSliceE casts an empty interface to a []string.
func ToStringSliceE(i interface{}) ([]string, error) {
- jww.TRACE.Println("ToStringSliceE called on type:", reflect.TypeOf(i))
var a []string
@@ -440,7 +467,6 @@ func ToStringSliceE(i interface{}) ([]string, error) {
// ToIntSliceE casts an empty interface to a []int.
func ToIntSliceE(i interface{}) ([]int, error) {
- jww.TRACE.Println("ToIntSliceE called on type:", reflect.TypeOf(i))
if i == nil {
return []int{}, fmt.Errorf("Unable to Cast %#v to []int", i)
diff --git a/vendor/github.com/spf13/pflag/bool.go b/vendor/github.com/spf13/pflag/bool.go
index d272e40..c4c5c0b 100644
--- a/vendor/github.com/spf13/pflag/bool.go
+++ b/vendor/github.com/spf13/pflag/bool.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// optional interface to indicate boolean flags that can be
// supplied without "=value" text
@@ -30,7 +27,7 @@ func (b *boolValue) Type() string {
return "bool"
}
-func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) }
+func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) }
func (b *boolValue) IsBoolFlag() bool { return true }
diff --git a/vendor/github.com/spf13/pflag/count.go b/vendor/github.com/spf13/pflag/count.go
index 7b1f142..d22be41 100644
--- a/vendor/github.com/spf13/pflag/count.go
+++ b/vendor/github.com/spf13/pflag/count.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- count Value
type countValue int
@@ -28,7 +25,7 @@ func (i *countValue) Type() string {
return "count"
}
-func (i *countValue) String() string { return fmt.Sprintf("%v", *i) }
+func (i *countValue) String() string { return strconv.Itoa(int(*i)) }
func countConv(sval string) (interface{}, error) {
i, err := strconv.Atoi(sval)
diff --git a/vendor/github.com/spf13/pflag/flag.go b/vendor/github.com/spf13/pflag/flag.go
index eb143d7..4258f45 100644
--- a/vendor/github.com/spf13/pflag/flag.go
+++ b/vendor/github.com/spf13/pflag/flag.go
@@ -416,7 +416,7 @@ func Set(name, value string) error {
// otherwise, the default values of all defined flags in the set.
func (f *FlagSet) PrintDefaults() {
usages := f.FlagUsages()
- fmt.Fprintf(f.out(), "%s", usages)
+ fmt.Fprint(f.out(), usages)
}
// defaultIsZeroValue returns true if the default value for this flag represents
@@ -434,10 +434,20 @@ func (f *Flag) defaultIsZeroValue() bool {
return f.DefValue == ""
case *ipValue, *ipMaskValue, *ipNetValue:
return f.DefValue == "<nil>"
- case *intSliceValue, *stringSliceValue:
+ case *intSliceValue, *stringSliceValue, *stringArrayValue:
return f.DefValue == "[]"
default:
- return true
+ switch f.Value.String() {
+ case "false":
+ return true
+ case "<nil>":
+ return true
+ case "":
+ return true
+ case "0":
+ return true
+ }
+ return false
}
}
diff --git a/vendor/github.com/spf13/pflag/float32.go b/vendor/github.com/spf13/pflag/float32.go
index 7683fae..a243f81 100644
--- a/vendor/github.com/spf13/pflag/float32.go
+++ b/vendor/github.com/spf13/pflag/float32.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- float32 Value
type float32Value float32
@@ -23,7 +20,7 @@ func (f *float32Value) Type() string {
return "float32"
}
-func (f *float32Value) String() string { return fmt.Sprintf("%v", *f) }
+func (f *float32Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 32) }
func float32Conv(sval string) (interface{}, error) {
v, err := strconv.ParseFloat(sval, 32)
diff --git a/vendor/github.com/spf13/pflag/float64.go b/vendor/github.com/spf13/pflag/float64.go
index 50fbf8c..04b5492 100644
--- a/vendor/github.com/spf13/pflag/float64.go
+++ b/vendor/github.com/spf13/pflag/float64.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- float64 Value
type float64Value float64
@@ -23,7 +20,7 @@ func (f *float64Value) Type() string {
return "float64"
}
-func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) }
+func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) }
func float64Conv(sval string) (interface{}, error) {
return strconv.ParseFloat(sval, 64)
diff --git a/vendor/github.com/spf13/pflag/int.go b/vendor/github.com/spf13/pflag/int.go
index b656036..1474b89 100644
--- a/vendor/github.com/spf13/pflag/int.go
+++ b/vendor/github.com/spf13/pflag/int.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- int Value
type intValue int
@@ -23,7 +20,7 @@ func (i *intValue) Type() string {
return "int"
}
-func (i *intValue) String() string { return fmt.Sprintf("%v", *i) }
+func (i *intValue) String() string { return strconv.Itoa(int(*i)) }
func intConv(sval string) (interface{}, error) {
return strconv.Atoi(sval)
diff --git a/vendor/github.com/spf13/pflag/int32.go b/vendor/github.com/spf13/pflag/int32.go
index 41659a9..9b95944 100644
--- a/vendor/github.com/spf13/pflag/int32.go
+++ b/vendor/github.com/spf13/pflag/int32.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- int32 Value
type int32Value int32
@@ -23,7 +20,7 @@ func (i *int32Value) Type() string {
return "int32"
}
-func (i *int32Value) String() string { return fmt.Sprintf("%v", *i) }
+func (i *int32Value) String() string { return strconv.FormatInt(int64(*i), 10) }
func int32Conv(sval string) (interface{}, error) {
v, err := strconv.ParseInt(sval, 0, 32)
diff --git a/vendor/github.com/spf13/pflag/int64.go b/vendor/github.com/spf13/pflag/int64.go
index 6e67e38..0026d78 100644
--- a/vendor/github.com/spf13/pflag/int64.go
+++ b/vendor/github.com/spf13/pflag/int64.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- int64 Value
type int64Value int64
@@ -23,7 +20,7 @@ func (i *int64Value) Type() string {
return "int64"
}
-func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) }
+func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) }
func int64Conv(sval string) (interface{}, error) {
return strconv.ParseInt(sval, 0, 64)
diff --git a/vendor/github.com/spf13/pflag/int8.go b/vendor/github.com/spf13/pflag/int8.go
index 400db21..4da9222 100644
--- a/vendor/github.com/spf13/pflag/int8.go
+++ b/vendor/github.com/spf13/pflag/int8.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- int8 Value
type int8Value int8
@@ -23,7 +20,7 @@ func (i *int8Value) Type() string {
return "int8"
}
-func (i *int8Value) String() string { return fmt.Sprintf("%v", *i) }
+func (i *int8Value) String() string { return strconv.FormatInt(int64(*i), 10) }
func int8Conv(sval string) (interface{}, error) {
v, err := strconv.ParseInt(sval, 0, 8)
diff --git a/vendor/github.com/spf13/pflag/string.go b/vendor/github.com/spf13/pflag/string.go
index e296136..04e0a26 100644
--- a/vendor/github.com/spf13/pflag/string.go
+++ b/vendor/github.com/spf13/pflag/string.go
@@ -1,7 +1,5 @@
package pflag
-import "fmt"
-
// -- string Value
type stringValue string
@@ -18,7 +16,7 @@ func (s *stringValue) Type() string {
return "string"
}
-func (s *stringValue) String() string { return fmt.Sprintf("%s", *s) }
+func (s *stringValue) String() string { return string(*s) }
func stringConv(sval string) (interface{}, error) {
return sval, nil
diff --git a/vendor/github.com/spf13/pflag/string_array.go b/vendor/github.com/spf13/pflag/string_array.go
new file mode 100644
index 0000000..f320f2e
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/string_array.go
@@ -0,0 +1,110 @@
+package pflag
+
+import (
+ "fmt"
+ "strings"
+)
+
+var _ = fmt.Fprint
+
+// -- stringArray Value
+type stringArrayValue struct {
+ value *[]string
+ changed bool
+}
+
+func newStringArrayValue(val []string, p *[]string) *stringArrayValue {
+ ssv := new(stringArrayValue)
+ ssv.value = p
+ *ssv.value = val
+ return ssv
+}
+
+func (s *stringArrayValue) Set(val string) error {
+ if !s.changed {
+ *s.value = []string{val}
+ s.changed = true
+ } else {
+ *s.value = append(*s.value, val)
+ }
+ return nil
+}
+
+func (s *stringArrayValue) Type() string {
+ return "stringArray"
+}
+
+func (s *stringArrayValue) String() string {
+ str, _ := writeAsCSV(*s.value)
+ return "[" + str + "]"
+}
+
+func stringArrayConv(sval string) (interface{}, error) {
+ sval = strings.Trim(sval, "[]")
+ // An empty string would cause a array with one (empty) string
+ if len(sval) == 0 {
+ return []string{}, nil
+ }
+ return readAsCSV(sval)
+}
+
+// GetStringArray return the []string value of a flag with the given name
+func (f *FlagSet) GetStringArray(name string) ([]string, error) {
+ val, err := f.getFlagType(name, "stringArray", stringArrayConv)
+ if err != nil {
+ return []string{}, err
+ }
+ return val.([]string), nil
+}
+
+// StringArrayVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a []string variable in which to store the values of the multiple flags.
+// The value of each argument will not try to be separated by comma
+func (f *FlagSet) StringArrayVar(p *[]string, name string, value []string, usage string) {
+ f.VarP(newStringArrayValue(value, p), name, "", usage)
+}
+
+// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) {
+ f.VarP(newStringArrayValue(value, p), name, shorthand, usage)
+}
+
+// StringArrayVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a []string variable in which to store the value of the flag.
+// The value of each argument will not try to be separated by comma
+func StringArrayVar(p *[]string, name string, value []string, usage string) {
+ CommandLine.VarP(newStringArrayValue(value, p), name, "", usage)
+}
+
+// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
+func StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) {
+ CommandLine.VarP(newStringArrayValue(value, p), name, shorthand, usage)
+}
+
+// StringArray defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a []string variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma
+func (f *FlagSet) StringArray(name string, value []string, usage string) *[]string {
+ p := []string{}
+ f.StringArrayVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringArrayP(name, shorthand string, value []string, usage string) *[]string {
+ p := []string{}
+ f.StringArrayVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// StringArray defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a []string variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma
+func StringArray(name string, value []string, usage string) *[]string {
+ return CommandLine.StringArrayP(name, "", value, usage)
+}
+
+// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
+func StringArrayP(name, shorthand string, value []string, usage string) *[]string {
+ return CommandLine.StringArrayP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/string_slice.go b/vendor/github.com/spf13/pflag/string_slice.go
index 927a440..7829cfa 100644
--- a/vendor/github.com/spf13/pflag/string_slice.go
+++ b/vendor/github.com/spf13/pflag/string_slice.go
@@ -31,6 +31,17 @@ func readAsCSV(val string) ([]string, error) {
return csvReader.Read()
}
+func writeAsCSV(vals []string) (string, error) {
+ b := &bytes.Buffer{}
+ w := csv.NewWriter(b)
+ err := w.Write(vals)
+ if err != nil {
+ return "", err
+ }
+ w.Flush()
+ return strings.TrimSuffix(b.String(), fmt.Sprintln()), nil
+}
+
func (s *stringSliceValue) Set(val string) error {
v, err := readAsCSV(val)
if err != nil {
@@ -50,15 +61,12 @@ func (s *stringSliceValue) Type() string {
}
func (s *stringSliceValue) String() string {
- b := &bytes.Buffer{}
- w := csv.NewWriter(b)
- w.Write(*s.value)
- w.Flush()
- return "[" + strings.TrimSuffix(b.String(), fmt.Sprintln()) + "]"
+ str, _ := writeAsCSV(*s.value)
+ return "[" + str + "]"
}
func stringSliceConv(sval string) (interface{}, error) {
- sval = strings.Trim(sval, "[]")
+ sval = sval[1 : len(sval)-1]
// An empty string would cause a slice with one (empty) string
if len(sval) == 0 {
return []string{}, nil
diff --git a/vendor/github.com/spf13/pflag/uint.go b/vendor/github.com/spf13/pflag/uint.go
index e142b49..dcbc2b7 100644
--- a/vendor/github.com/spf13/pflag/uint.go
+++ b/vendor/github.com/spf13/pflag/uint.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- uint Value
type uintValue uint
@@ -23,7 +20,7 @@ func (i *uintValue) Type() string {
return "uint"
}
-func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) }
+func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) }
func uintConv(sval string) (interface{}, error) {
v, err := strconv.ParseUint(sval, 0, 0)
diff --git a/vendor/github.com/spf13/pflag/uint16.go b/vendor/github.com/spf13/pflag/uint16.go
index 5c96c19..7e9914e 100644
--- a/vendor/github.com/spf13/pflag/uint16.go
+++ b/vendor/github.com/spf13/pflag/uint16.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- uint16 value
type uint16Value uint16
@@ -12,7 +9,7 @@ func newUint16Value(val uint16, p *uint16) *uint16Value {
*p = val
return (*uint16Value)(p)
}
-func (i *uint16Value) String() string { return fmt.Sprintf("%d", *i) }
+
func (i *uint16Value) Set(s string) error {
v, err := strconv.ParseUint(s, 0, 16)
*i = uint16Value(v)
@@ -23,6 +20,8 @@ func (i *uint16Value) Type() string {
return "uint16"
}
+func (i *uint16Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
+
func uint16Conv(sval string) (interface{}, error) {
v, err := strconv.ParseUint(sval, 0, 16)
if err != nil {
diff --git a/vendor/github.com/spf13/pflag/uint32.go b/vendor/github.com/spf13/pflag/uint32.go
index 294fcaa..d802453 100644
--- a/vendor/github.com/spf13/pflag/uint32.go
+++ b/vendor/github.com/spf13/pflag/uint32.go
@@ -1,18 +1,15 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
-// -- uint16 value
+// -- uint32 value
type uint32Value uint32
func newUint32Value(val uint32, p *uint32) *uint32Value {
*p = val
return (*uint32Value)(p)
}
-func (i *uint32Value) String() string { return fmt.Sprintf("%d", *i) }
+
func (i *uint32Value) Set(s string) error {
v, err := strconv.ParseUint(s, 0, 32)
*i = uint32Value(v)
@@ -23,6 +20,8 @@ func (i *uint32Value) Type() string {
return "uint32"
}
+func (i *uint32Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
+
func uint32Conv(sval string) (interface{}, error) {
v, err := strconv.ParseUint(sval, 0, 32)
if err != nil {
diff --git a/vendor/github.com/spf13/pflag/uint64.go b/vendor/github.com/spf13/pflag/uint64.go
index c681885..f62240f 100644
--- a/vendor/github.com/spf13/pflag/uint64.go
+++ b/vendor/github.com/spf13/pflag/uint64.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- uint64 Value
type uint64Value uint64
@@ -23,7 +20,7 @@ func (i *uint64Value) Type() string {
return "uint64"
}
-func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) }
+func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
func uint64Conv(sval string) (interface{}, error) {
v, err := strconv.ParseUint(sval, 0, 64)
diff --git a/vendor/github.com/spf13/pflag/uint8.go b/vendor/github.com/spf13/pflag/uint8.go
index 26db418..bb0e83c 100644
--- a/vendor/github.com/spf13/pflag/uint8.go
+++ b/vendor/github.com/spf13/pflag/uint8.go
@@ -1,9 +1,6 @@
package pflag
-import (
- "fmt"
- "strconv"
-)
+import "strconv"
// -- uint8 Value
type uint8Value uint8
@@ -23,7 +20,7 @@ func (i *uint8Value) Type() string {
return "uint8"
}
-func (i *uint8Value) String() string { return fmt.Sprintf("%v", *i) }
+func (i *uint8Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
func uint8Conv(sval string) (interface{}, error) {
v, err := strconv.ParseUint(sval, 0, 8)
diff --git a/vendor/github.com/spf13/viper/README.md b/vendor/github.com/spf13/viper/README.md
index cf17560..f4e72f8 100644
--- a/vendor/github.com/spf13/viper/README.md
+++ b/vendor/github.com/spf13/viper/README.md
@@ -458,16 +458,17 @@ Viper can access a nested field by passing a `.` delimited path of keys:
GetString("datastore.metric.host") // (returns "127.0.0.1")
```
-This obeys the precedence rules established above; the search for the root key
-(in this example, `datastore`) will cascade through the remaining configuration
-registries until found. The search for the sub-keys (`metric` and `host`),
-however, will not.
+This obeys the precedence rules established above; the search for the path
+will cascade through the remaining configuration registries until found.
-For example, if the `metric` key was not defined in the configuration loaded
-from file, but was defined in the defaults, Viper would return the zero value.
+For example, given this configuration file, both `datastore.metric.host` and
+`datastore.metric.port` are already defined (and may be overridden). If in addition
+`datastore.metric.protocol` was defined in the defaults, Viper would also find it.
-On the other hand, if the primary key was not defined, Viper would go through
-the remaining registries looking for it.
+However, if `datastore.metric` was overridden (by a flag, an environment variable,
+the `Set()` method, …) with an immediate value, then all sub-keys of
+`datastore.metric` become undefined, they are “shadowed” by the higher-priority
+configuration level.
Lastly, if there exists a key that matches the delimited key path, its value
will be returned instead. E.g.
@@ -491,7 +492,7 @@ will be returned instead. E.g.
}
}
-GetString("datastore.metric.host") //returns "0.0.0.0"
+GetString("datastore.metric.host") // returns "0.0.0.0"
```
### Extract sub-tree
diff --git a/vendor/github.com/spf13/viper/util.go b/vendor/github.com/spf13/viper/util.go
index fe6cb45..b0903fb 100644
--- a/vendor/github.com/spf13/viper/util.go
+++ b/vendor/github.com/spf13/viper/util.go
@@ -29,12 +29,12 @@ import (
"gopkg.in/yaml.v2"
)
-// Denotes failing to parse configuration file.
+// ConfigParseError denotes failing to parse configuration file.
type ConfigParseError struct {
err error
}
-// Returns the formatted configuration error.
+// Error returns the formatted configuration error.
func (pe ConfigParseError) Error() string {
return fmt.Sprintf("While parsing config: %s", pe.err.Error())
}
@@ -45,6 +45,10 @@ func insensitiviseMap(m map[string]interface{}) {
if key != lower {
delete(m, key)
m[lower] = val
+ if m2, ok := val.(map[string]interface{}); ok {
+ // nested map: recursively insensitivise
+ insensitiviseMap(m2)
+ }
}
}
}
@@ -68,10 +72,10 @@ func absPathify(inPath string) string {
p, err := filepath.Abs(inPath)
if err == nil {
return filepath.Clean(p)
- } else {
- jww.ERROR.Println("Couldn't discover absolute path")
- jww.ERROR.Println(err)
}
+
+ jww.ERROR.Println("Couldn't discover absolute path")
+ jww.ERROR.Println(err)
return ""
}
@@ -107,29 +111,6 @@ func userHomeDir() string {
return os.Getenv("HOME")
}
-func findCWD() (string, error) {
- serverFile, err := filepath.Abs(os.Args[0])
-
- if err != nil {
- return "", fmt.Errorf("Can't get absolute path for executable: %v", err)
- }
-
- path := filepath.Dir(serverFile)
- realFile, err := filepath.EvalSymlinks(serverFile)
-
- if err != nil {
- if _, err = os.Stat(serverFile + ".exe"); err == nil {
- realFile = filepath.Clean(serverFile + ".exe")
- }
- }
-
- if err == nil && realFile != serverFile {
- path = filepath.Dir(realFile)
- }
-
- return path, nil
-}
-
func unmarshallConfigReader(in io.Reader, c map[string]interface{}, configType string) error {
buf := new(bytes.Buffer)
buf.ReadFrom(in)
@@ -172,7 +153,12 @@ func unmarshallConfigReader(in io.Reader, c map[string]interface{}, configType s
}
for _, key := range p.Keys() {
value, _ := p.Get(key)
- c[key] = value
+ // recursively build nested maps
+ path := strings.Split(key, ".")
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(c, path[0:len(path)-1])
+ // set innermost value
+ deepestMap[lastKey] = value
}
}
@@ -222,3 +208,34 @@ func parseSizeInBytes(sizeStr string) uint {
return safeMul(uint(size), multiplier)
}
+
+// deepSearch scans deep maps, following the key indexes listed in the
+// sequence "path".
+// The last value is expected to be another map, and is returned.
+//
+// In case intermediate keys do not exist, or map to a non-map value,
+// a new map is created and inserted, and the search continues from there:
+// the initial map "m" may be modified!
+func deepSearch(m map[string]interface{}, path []string) map[string]interface{} {
+ for _, k := range path {
+ m2, ok := m[k]
+ if !ok {
+ // intermediate key does not exist
+ // => create it and continue from there
+ m3 := make(map[string]interface{})
+ m[k] = m3
+ m = m3
+ continue
+ }
+ m3, ok := m2.(map[string]interface{})
+ if !ok {
+ // intermediate key is a value
+ // => replace with a new map
+ m3 = make(map[string]interface{})
+ m[k] = m3
+ }
+ // continue search from here
+ m = m3
+ }
+ return m
+}
diff --git a/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/spf13/viper/viper.go
index f17790e..8f27849 100644
--- a/vendor/github.com/spf13/viper/viper.go
+++ b/vendor/github.com/spf13/viper/viper.go
@@ -52,40 +52,40 @@ type remoteConfigFactory interface {
// RemoteConfig is optional, see the remote package
var RemoteConfig remoteConfigFactory
-// Denotes encountering an unsupported
+// UnsupportedConfigError denotes encountering an unsupported
// configuration filetype.
type UnsupportedConfigError string
-// Returns the formatted configuration error.
+// Error returns the formatted configuration error.
func (str UnsupportedConfigError) Error() string {
return fmt.Sprintf("Unsupported Config Type %q", string(str))
}
-// Denotes encountering an unsupported remote
+// UnsupportedRemoteProviderError denotes encountering an unsupported remote
// provider. Currently only etcd and Consul are
// supported.
type UnsupportedRemoteProviderError string
-// Returns the formatted remote provider error.
+// Error returns the formatted remote provider error.
func (str UnsupportedRemoteProviderError) Error() string {
return fmt.Sprintf("Unsupported Remote Provider Type %q", string(str))
}
-// Denotes encountering an error while trying to
+// RemoteConfigError denotes encountering an error while trying to
// pull the configuration from the remote provider.
type RemoteConfigError string
-// Returns the formatted remote provider error
+// Error returns the formatted remote provider error
func (rce RemoteConfigError) Error() string {
return fmt.Sprintf("Remote Configurations Error: %s", string(rce))
}
-// Denotes failing to find configuration file.
+// ConfigFileNotFoundError denotes failing to find configuration file.
type ConfigFileNotFoundError struct {
name, locations string
}
-// Returns the formatted configuration error.
+// Error returns the formatted configuration error.
func (fnfe ConfigFileNotFoundError) Error() string {
return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations)
}
@@ -107,11 +107,11 @@ func (fnfe ConfigFileNotFoundError) Error() string {
// Defaults : {
// "secret": "",
// "user": "default",
-// "endpoint": "https://localhost"
+// "endpoint": "https://localhost"
// }
// Config : {
// "user": "root"
-// "secret": "defaultsecret"
+// "secret": "defaultsecret"
// }
// Env : {
// "secret": "somesecretkey"
@@ -159,7 +159,7 @@ type Viper struct {
onConfigChange func(fsnotify.Event)
}
-// Returns an initialized Viper instance.
+// New returns an initialized Viper instance.
func New() *Viper {
v := new(Viper)
v.keyDelim = "."
@@ -220,11 +220,11 @@ type RemoteProvider interface {
SecretKeyring() string
}
-// Universally supported extensions.
-var SupportedExts []string = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"}
+// SupportedExts are universally supported extensions.
+var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"}
-// Universally supported remote providers.
-var SupportedRemoteProviders []string = []string{"etcd", "consul"}
+// SupportedRemoteProviders are universally supported remote providers.
+var SupportedRemoteProviders = []string{"etcd", "consul"}
func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) }
func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) {
@@ -270,7 +270,7 @@ func (v *Viper) WatchConfig() {
}()
}
-// Explicitly define the path, name and extension of the config file
+// SetConfigFile explicitly defines the path, name and extension of the config file
// Viper will use this and not check any of the config paths
func SetConfigFile(in string) { v.SetConfigFile(in) }
func (v *Viper) SetConfigFile(in string) {
@@ -279,7 +279,7 @@ func (v *Viper) SetConfigFile(in string) {
}
}
-// Define a prefix that ENVIRONMENT variables will use.
+// SetEnvPrefix defines a prefix that ENVIRONMENT variables will use.
// E.g. if your prefix is "spf", the env registry
// will look for env. variables that start with "SPF_"
func SetEnvPrefix(in string) { v.SetEnvPrefix(in) }
@@ -301,7 +301,7 @@ func (v *Viper) mergeWithEnvPrefix(in string) string {
// rewriting keys many things, Ex: Get('someKey') -> some_key
// (cammel case to snake case for JSON keys perhaps)
-// getEnv s a wrapper around os.Getenv which replaces characters in the original
+// getEnv is a wrapper around os.Getenv which replaces characters in the original
// key. This allows env vars which have different keys then the config object
// keys
func (v *Viper) getEnv(key string) string {
@@ -311,11 +311,11 @@ func (v *Viper) getEnv(key string) string {
return os.Getenv(key)
}
-// Return the file used to populate the config registry
+// ConfigFileUsed returns the file used to populate the config registry
func ConfigFileUsed() string { return v.ConfigFileUsed() }
func (v *Viper) ConfigFileUsed() string { return v.configFile }
-// Add a path for Viper to search for the config file in.
+// AddConfigPath adds a path for Viper to search for the config file in.
// Can be called multiple times to define multiple search paths.
func AddConfigPath(in string) { v.AddConfigPath(in) }
func (v *Viper) AddConfigPath(in string) {
@@ -399,8 +399,9 @@ func (v *Viper) providerPathExists(p *defaultRemoteProvider) bool {
return false
}
+// searchMap recursively searches for a value for path in source map.
+// Returns nil if not found.
func (v *Viper) searchMap(source map[string]interface{}, path []string) interface{} {
-
if len(path) == 0 {
return source
}
@@ -424,11 +425,133 @@ func (v *Viper) searchMap(source map[string]interface{}, path []string) interfac
// if the type of `next` is the same as the type being asserted
return v.searchMap(next.(map[string]interface{}), path[1:])
default:
- return next
+ if len(path) == 1 {
+ return next
+ }
+ // got a value but nested key expected, return "nil" for not found
+ return nil
+ }
+ }
+ return nil
+}
+
+// searchMapWithPathPrefixes recursively searches for a value for path in source map.
+//
+// While searchMap() considers each path element as a single map key, this
+// function searches for, and prioritizes, merged path elements.
+// e.g., if in the source, "foo" is defined with a sub-key "bar", and "foo.bar"
+// is also defined, this latter value is returned for path ["foo", "bar"].
+//
+// This should be useful only at config level (other maps may not contain dots
+// in their keys).
+func (v *Viper) searchMapWithPathPrefixes(source map[string]interface{}, path []string) interface{} {
+ if len(path) == 0 {
+ return source
+ }
+
+ // search for path prefixes, starting from the longest one
+ for i := len(path); i > 0; i-- {
+ prefixKey := strings.ToLower(strings.Join(path[0:i], v.keyDelim))
+
+ var ok bool
+ var next interface{}
+ for k, v := range source {
+ if strings.ToLower(k) == prefixKey {
+ ok = true
+ next = v
+ break
+ }
+ }
+
+ if ok {
+ var val interface{}
+ switch next.(type) {
+ case map[interface{}]interface{}:
+ val = v.searchMapWithPathPrefixes(cast.ToStringMap(next), path[i:])
+ case map[string]interface{}:
+ // Type assertion is safe here since it is only reached
+ // if the type of `next` is the same as the type being asserted
+ val = v.searchMapWithPathPrefixes(next.(map[string]interface{}), path[i:])
+ default:
+ if len(path) == i {
+ val = next
+ }
+ // got a value but nested key expected, do nothing and look for next prefix
+ }
+ if val != nil {
+ return val
+ }
+ }
+ }
+
+ // not found
+ return nil
+}
+
+// isPathShadowedInDeepMap makes sure the given path is not shadowed somewhere
+// on its path in the map.
+// e.g., if "foo.bar" has a value in the given map, it “shadows”
+// "foo.bar.baz" in a lower-priority map
+func (v *Viper) isPathShadowedInDeepMap(path []string, m map[string]interface{}) string {
+ var parentVal interface{}
+ for i := 1; i < len(path); i++ {
+ parentVal = v.searchMap(m, path[0:i])
+ if parentVal == nil {
+ // not found, no need to add more path elements
+ return ""
+ }
+ switch parentVal.(type) {
+ case map[interface{}]interface{}:
+ continue
+ case map[string]interface{}:
+ continue
+ default:
+ // parentVal is a regular value which shadows "path"
+ return strings.Join(path[0:i], v.keyDelim)
+ }
+ }
+ return ""
+}
+
+// isPathShadowedInFlatMap makes sure the given path is not shadowed somewhere
+// in a sub-path of the map.
+// e.g., if "foo.bar" has a value in the given map, it “shadows”
+// "foo.bar.baz" in a lower-priority map
+func (v *Viper) isPathShadowedInFlatMap(path []string, mi interface{}) string {
+ // unify input map
+ var m map[string]interface{}
+ switch mi.(type) {
+ case map[string]string, map[string]FlagValue:
+ m = cast.ToStringMap(mi)
+ default:
+ return ""
+ }
+
+ // scan paths
+ var parentKey string
+ for i := 1; i < len(path); i++ {
+ parentKey = strings.Join(path[0:i], v.keyDelim)
+ if _, ok := m[parentKey]; ok {
+ return parentKey
+ }
+ }
+ return ""
+}
+
+// isPathShadowedInAutoEnv makes sure the given path is not shadowed somewhere
+// in the environment, when automatic env is on.
+// e.g., if "foo.bar" has a value in the environment, it “shadows”
+// "foo.bar.baz" in a lower-priority map
+func (v *Viper) isPathShadowedInAutoEnv(path []string) string {
+ var parentKey string
+ var val string
+ for i := 1; i < len(path); i++ {
+ parentKey = strings.Join(path[0:i], v.keyDelim)
+ if val = v.getEnv(v.mergeWithEnvPrefix(parentKey)); val != "" {
+ return parentKey
}
- } else {
- return nil
}
+ return ""
}
// SetTypeByDefaultValue enables or disables the inference of a key value's
@@ -455,8 +578,7 @@ func GetViper() *Viper {
return v
}
-// Viper is essentially repository for configurations
-// Get can retrieve any value given the key to use
+// Get can retrieve any value given the key to use.
// Get has the behavior of returning the value associated with the first
// place from where it is set. Viper will check in the following order:
// override, flag, env, config file, key/value store, default
@@ -464,49 +586,18 @@ func GetViper() *Viper {
// Get returns an interface. For a specific value use one of the Get____ methods.
func Get(key string) interface{} { return v.Get(key) }
func (v *Viper) Get(key string) interface{} {
- path := strings.Split(key, v.keyDelim)
-
lcaseKey := strings.ToLower(key)
val := v.find(lcaseKey)
-
- if val == nil {
- source := v.find(strings.ToLower(path[0]))
- if source != nil {
- if reflect.TypeOf(source).Kind() == reflect.Map {
- val = v.searchMap(cast.ToStringMap(source), path[1:])
- }
- }
- }
-
- // if no other value is returned and a flag does exist for the value,
- // get the flag's value even if the flag's value has not changed
- if val == nil {
- if flag, exists := v.pflags[lcaseKey]; exists {
- jww.TRACE.Println(key, "get pflag default", val)
- switch flag.ValueType() {
- case "int", "int8", "int16", "int32", "int64":
- val = cast.ToInt(flag.ValueString())
- case "bool":
- val = cast.ToBool(flag.ValueString())
- default:
- val = flag.ValueString()
- }
- }
- }
-
if val == nil {
return nil
}
- var valType interface{}
- if !v.typeByDefValue {
- valType = val
- } else {
- defVal, defExists := v.defaults[lcaseKey]
- if defExists {
+ valType := val
+ if v.typeByDefValue {
+ path := strings.Split(lcaseKey, v.keyDelim)
+ defVal := v.searchMap(v.defaults, path)
+ if defVal != nil {
valType = defVal
- } else {
- valType = val
}
}
@@ -529,86 +620,89 @@ func (v *Viper) Get(key string) interface{} {
return val
}
-// Returns new Viper instance representing a sub tree of this instance
+// Sub returns new Viper instance representing a sub tree of this instance.
func Sub(key string) *Viper { return v.Sub(key) }
func (v *Viper) Sub(key string) *Viper {
subv := New()
data := v.Get(key)
+ if data == nil {
+ return nil
+ }
+
if reflect.TypeOf(data).Kind() == reflect.Map {
subv.config = cast.ToStringMap(data)
return subv
- } else {
- return nil
}
+ return nil
}
-// Returns the value associated with the key as a string
+// GetString returns the value associated with the key as a string.
func GetString(key string) string { return v.GetString(key) }
func (v *Viper) GetString(key string) string {
return cast.ToString(v.Get(key))
}
-// Returns the value associated with the key as a boolean
+// GetBool returns the value associated with the key as a boolean.
func GetBool(key string) bool { return v.GetBool(key) }
func (v *Viper) GetBool(key string) bool {
return cast.ToBool(v.Get(key))
}
-// Returns the value associated with the key as an integer
+// GetInt returns the value associated with the key as an integer.
func GetInt(key string) int { return v.GetInt(key) }
func (v *Viper) GetInt(key string) int {
return cast.ToInt(v.Get(key))
}
-// Returns the value associated with the key as an integer
+// GetInt64 returns the value associated with the key as an integer.
func GetInt64(key string) int64 { return v.GetInt64(key) }
func (v *Viper) GetInt64(key string) int64 {
return cast.ToInt64(v.Get(key))
}
-// Returns the value associated with the key as a float64
+// GetFloat64 returns the value associated with the key as a float64.
func GetFloat64(key string) float64 { return v.GetFloat64(key) }
func (v *Viper) GetFloat64(key string) float64 {
return cast.ToFloat64(v.Get(key))
}
-// Returns the value associated with the key as time
+// GetTime returns the value associated with the key as time.
func GetTime(key string) time.Time { return v.GetTime(key) }
func (v *Viper) GetTime(key string) time.Time {
return cast.ToTime(v.Get(key))
}
-// Returns the value associated with the key as a duration
+// GetDuration returns the value associated with the key as a duration.
func GetDuration(key string) time.Duration { return v.GetDuration(key) }
func (v *Viper) GetDuration(key string) time.Duration {
return cast.ToDuration(v.Get(key))
}
-// Returns the value associated with the key as a slice of strings
+// GetStringSlice returns the value associated with the key as a slice of strings.
func GetStringSlice(key string) []string { return v.GetStringSlice(key) }
func (v *Viper) GetStringSlice(key string) []string {
return cast.ToStringSlice(v.Get(key))
}
-// Returns the value associated with the key as a map of interfaces
+// GetStringMap returns the value associated with the key as a map of interfaces.
func GetStringMap(key string) map[string]interface{} { return v.GetStringMap(key) }
func (v *Viper) GetStringMap(key string) map[string]interface{} {
return cast.ToStringMap(v.Get(key))
}
-// Returns the value associated with the key as a map of strings
+// GetStringMapString returns the value associated with the key as a map of strings.
func GetStringMapString(key string) map[string]string { return v.GetStringMapString(key) }
func (v *Viper) GetStringMapString(key string) map[string]string {
return cast.ToStringMapString(v.Get(key))
}
-// Returns the value associated with the key as a map to a slice of strings.
+// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings.
func GetStringMapStringSlice(key string) map[string][]string { return v.GetStringMapStringSlice(key) }
func (v *Viper) GetStringMapStringSlice(key string) map[string][]string {
return cast.ToStringMapStringSlice(v.Get(key))
}
-// Returns the size of the value associated with the given key
+// GetSizeInBytes returns the size of the value associated with the given key
// in bytes.
func GetSizeInBytes(key string) uint { return v.GetSizeInBytes(key) }
func (v *Viper) GetSizeInBytes(key string) uint {
@@ -616,17 +710,17 @@ func (v *Viper) GetSizeInBytes(key string) uint {
return parseSizeInBytes(sizeStr)
}
-// Takes a single key and unmarshals it into a Struct
+// UnmarshalKey takes a single key and unmarshals it into a Struct.
func UnmarshalKey(key string, rawVal interface{}) error { return v.UnmarshalKey(key, rawVal) }
func (v *Viper) UnmarshalKey(key string, rawVal interface{}) error {
return mapstructure.Decode(v.Get(key), rawVal)
}
-// Unmarshals the config into a Struct. Make sure that the tags
+// Unmarshal unmarshals the config into a Struct. Make sure that the tags
// on the fields of the structure are properly set.
func Unmarshal(rawVal interface{}) error { return v.Unmarshal(rawVal) }
func (v *Viper) Unmarshal(rawVal interface{}) error {
- err := mapstructure.WeakDecode(v.AllSettings(), rawVal)
+ err := decode(v.AllSettings(), defaultDecoderConfig(rawVal))
if err != nil {
return err
@@ -637,16 +731,19 @@ func (v *Viper) Unmarshal(rawVal interface{}) error {
return nil
}
-// A wrapper around mapstructure.Decode that mimics the WeakDecode functionality
-// while erroring on non existing vals in the destination struct
-func weakDecodeExact(input, output interface{}) error {
- config := &mapstructure.DecoderConfig{
- ErrorUnused: true,
+// defaultDecoderConfig returns default mapsstructure.DecoderConfig with suppot
+// of time.Duration values
+func defaultDecoderConfig(output interface{}) *mapstructure.DecoderConfig {
+ return &mapstructure.DecoderConfig{
Metadata: nil,
Result: output,
WeaklyTypedInput: true,
+ DecodeHook: mapstructure.StringToTimeDurationHookFunc(),
}
+}
+// A wrapper around mapstructure.Decode that mimics the WeakDecode functionality
+func decode(input interface{}, config *mapstructure.DecoderConfig) error {
decoder, err := mapstructure.NewDecoder(config)
if err != nil {
return err
@@ -654,10 +751,13 @@ func weakDecodeExact(input, output interface{}) error {
return decoder.Decode(input)
}
-// Unmarshals the config into a Struct, erroring if a field is non-existant
-// in the destination struct
+// UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent
+// in the destination struct.
func (v *Viper) UnmarshalExact(rawVal interface{}) error {
- err := weakDecodeExact(v.AllSettings(), rawVal)
+ config := defaultDecoderConfig(rawVal)
+ config.ErrorUnused = true
+
+ err := decode(v.AllSettings(), config)
if err != nil {
return err
@@ -668,27 +768,27 @@ func (v *Viper) UnmarshalExact(rawVal interface{}) error {
return nil
}
-// Bind a full flag set to the configuration, using each flag's long
+// BindPFlags binds a full flag set to the configuration, using each flag's long
// name as the config key.
-func BindPFlags(flags *pflag.FlagSet) (err error) { return v.BindPFlags(flags) }
-func (v *Viper) BindPFlags(flags *pflag.FlagSet) (err error) {
+func BindPFlags(flags *pflag.FlagSet) error { return v.BindPFlags(flags) }
+func (v *Viper) BindPFlags(flags *pflag.FlagSet) error {
return v.BindFlagValues(pflagValueSet{flags})
}
-// Bind a specific key to a pflag (as used by cobra).
+// BindPFlag binds a specific key to a pflag (as used by cobra).
// Example (where serverCmd is a Cobra instance):
//
// serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
// Viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
//
-func BindPFlag(key string, flag *pflag.Flag) (err error) { return v.BindPFlag(key, flag) }
-func (v *Viper) BindPFlag(key string, flag *pflag.Flag) (err error) {
+func BindPFlag(key string, flag *pflag.Flag) error { return v.BindPFlag(key, flag) }
+func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error {
return v.BindFlagValue(key, pflagValue{flag})
}
-// Bind a full FlagValue set to the configuration, using each flag's long
+// BindFlagValues binds a full FlagValue set to the configuration, using each flag's long
// name as the config key.
-func BindFlagValues(flags FlagValueSet) (err error) { return v.BindFlagValues(flags) }
+func BindFlagValues(flags FlagValueSet) error { return v.BindFlagValues(flags) }
func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) {
flags.VisitAll(func(flag FlagValue) {
if err = v.BindFlagValue(flag.Name(), flag); err != nil {
@@ -698,14 +798,14 @@ func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) {
return nil
}
-// Bind a specific key to a FlagValue.
+// BindFlagValue binds a specific key to a FlagValue.
// Example(where serverCmd is a Cobra instance):
//
// serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
// Viper.BindFlagValue("port", serverCmd.Flags().Lookup("port"))
//
-func BindFlagValue(key string, flag FlagValue) (err error) { return v.BindFlagValue(key, flag) }
-func (v *Viper) BindFlagValue(key string, flag FlagValue) (err error) {
+func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) }
+func (v *Viper) BindFlagValue(key string, flag FlagValue) error {
if flag == nil {
return fmt.Errorf("flag for %q is nil", key)
}
@@ -713,12 +813,12 @@ func (v *Viper) BindFlagValue(key string, flag FlagValue) (err error) {
return nil
}
-// Binds a Viper key to a ENV variable
-// ENV variables are case sensitive
+// BindEnv binds a Viper key to a ENV variable.
+// ENV variables are case sensitive.
// If only a key is provided, it will use the env key matching the key, uppercased.
// EnvPrefix will be used when set when env name is not provided.
-func BindEnv(input ...string) (err error) { return v.BindEnv(input...) }
-func (v *Viper) BindEnv(input ...string) (err error) {
+func BindEnv(input ...string) error { return v.BindEnv(input...) }
+func (v *Viper) BindEnv(input ...string) error {
var key, envkey string
if len(input) == 0 {
return fmt.Errorf("BindEnv missing key to bind to")
@@ -737,113 +837,130 @@ func (v *Viper) BindEnv(input ...string) (err error) {
return nil
}
-// Given a key, find the value
+// Given a key, find the value.
// Viper will check in the following order:
-// flag, env, config file, key/value store, default
-// Viper will check to see if an alias exists first
+// flag, env, config file, key/value store, default.
+// Viper will check to see if an alias exists first.
func (v *Viper) find(key string) interface{} {
var val interface{}
var exists bool
+ // compute the path through the nested maps to the nested value
+ path := strings.Split(key, v.keyDelim)
+ if shadow := v.isPathShadowedInDeepMap(path, castMapStringToMapInterface(v.aliases)); shadow != "" {
+ return nil
+ }
+
// if the requested key is an alias, then return the proper key
key = v.realKey(key)
+ // re-compute the path
+ path = strings.Split(key, v.keyDelim)
+
+ // Set() override first
+ val = v.searchMap(v.override, path)
+ if val != nil {
+ return val
+ }
+ if shadow := v.isPathShadowedInDeepMap(path, v.override); shadow != "" {
+ return nil
+ }
- // PFlag Override first
+ // PFlag override next
flag, exists := v.pflags[key]
if exists && flag.HasChanged() {
- jww.TRACE.Println(key, "found in override (via pflag):", flag.ValueString())
switch flag.ValueType() {
case "int", "int8", "int16", "int32", "int64":
return cast.ToInt(flag.ValueString())
case "bool":
return cast.ToBool(flag.ValueString())
+ case "stringSlice":
+ s := strings.TrimPrefix(flag.ValueString(), "[")
+ return strings.TrimSuffix(s, "]")
default:
return flag.ValueString()
}
}
-
- val, exists = v.override[key]
- if exists {
- jww.TRACE.Println(key, "found in override:", val)
- return val
+ if shadow := v.isPathShadowedInFlatMap(path, v.pflags); shadow != "" {
+ return nil
}
+ // Env override next
if v.automaticEnvApplied {
// even if it hasn't been registered, if automaticEnv is used,
// check any Get request
if val = v.getEnv(v.mergeWithEnvPrefix(key)); val != "" {
- jww.TRACE.Println(key, "found in environment with val:", val)
return val
}
+ if shadow := v.isPathShadowedInAutoEnv(path); shadow != "" {
+ return nil
+ }
}
-
envkey, exists := v.env[key]
if exists {
- jww.TRACE.Println(key, "registered as env var", envkey)
if val = v.getEnv(envkey); val != "" {
- jww.TRACE.Println(envkey, "found in environment with val:", val)
return val
- } else {
- jww.TRACE.Println(envkey, "env value unset:")
}
}
+ if shadow := v.isPathShadowedInFlatMap(path, v.env); shadow != "" {
+ return nil
+ }
- val, exists = v.config[key]
- if exists {
- jww.TRACE.Println(key, "found in config:", val)
+ // Config file next
+ val = v.searchMapWithPathPrefixes(v.config, path)
+ if val != nil {
return val
}
-
- // Test for nested config parameter
- if strings.Contains(key, v.keyDelim) {
- path := strings.Split(key, v.keyDelim)
-
- source := v.find(path[0])
- if source != nil {
- if reflect.TypeOf(source).Kind() == reflect.Map {
- val := v.searchMap(cast.ToStringMap(source), path[1:])
- jww.TRACE.Println(key, "found in nested config:", val)
- return val
- }
- }
+ if shadow := v.isPathShadowedInDeepMap(path, v.config); shadow != "" {
+ return nil
}
- val, exists = v.kvstore[key]
- if exists {
- jww.TRACE.Println(key, "found in key/value store:", val)
+ // K/V store next
+ val = v.searchMap(v.kvstore, path)
+ if val != nil {
return val
}
+ if shadow := v.isPathShadowedInDeepMap(path, v.kvstore); shadow != "" {
+ return nil
+ }
- val, exists = v.defaults[key]
- if exists {
- jww.TRACE.Println(key, "found in defaults:", val)
+ // Default next
+ val = v.searchMap(v.defaults, path)
+ if val != nil {
return val
}
+ if shadow := v.isPathShadowedInDeepMap(path, v.defaults); shadow != "" {
+ return nil
+ }
+
+ // last chance: if no other value is returned and a flag does exist for the value,
+ // get the flag's value even if the flag's value has not changed
+ if flag, exists := v.pflags[key]; exists {
+ switch flag.ValueType() {
+ case "int", "int8", "int16", "int32", "int64":
+ return cast.ToInt(flag.ValueString())
+ case "bool":
+ return cast.ToBool(flag.ValueString())
+ case "stringSlice":
+ s := strings.TrimPrefix(flag.ValueString(), "[")
+ return strings.TrimSuffix(s, "]")
+ default:
+ return flag.ValueString()
+ }
+ }
+ // last item, no need to check shadowing
return nil
}
-// Check to see if the key has been set in any of the data locations
+// IsSet checks to see if the key has been set in any of the data locations.
func IsSet(key string) bool { return v.IsSet(key) }
func (v *Viper) IsSet(key string) bool {
- path := strings.Split(key, v.keyDelim)
-
lcaseKey := strings.ToLower(key)
val := v.find(lcaseKey)
-
- if val == nil {
- source := v.find(strings.ToLower(path[0]))
- if source != nil {
- if reflect.TypeOf(source).Kind() == reflect.Map {
- val = v.searchMap(cast.ToStringMap(source), path[1:])
- }
- }
- }
-
return val != nil
}
-// Have Viper check ENV variables for all
+// AutomaticEnv has Viper check ENV variables for all.
// keys set in config, default & flags
func AutomaticEnv() { v.AutomaticEnv() }
func (v *Viper) AutomaticEnv() {
@@ -902,12 +1019,11 @@ func (v *Viper) realKey(key string) string {
if exists {
jww.DEBUG.Println("Alias", key, "to", newkey)
return v.realKey(newkey)
- } else {
- return key
}
+ return key
}
-// Check to see if the given key (or an alias) is in the config file
+// InConfig checks to see if the given key (or an alias) is in the config file.
func InConfig(key string) bool { return v.InConfig(key) }
func (v *Viper) InConfig(key string) bool {
// if the requested key is an alias, then return the proper key
@@ -917,26 +1033,38 @@ func (v *Viper) InConfig(key string) bool {
return exists
}
-// Set the default value for this key.
+// SetDefault sets the default value for this key.
// Default only used when no value is provided by the user via flag, config or ENV.
func SetDefault(key string, value interface{}) { v.SetDefault(key, value) }
func (v *Viper) SetDefault(key string, value interface{}) {
// If alias passed in, then set the proper default
key = v.realKey(strings.ToLower(key))
- v.defaults[key] = value
+
+ path := strings.Split(key, v.keyDelim)
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(v.defaults, path[0:len(path)-1])
+
+ // set innermost value
+ deepestMap[lastKey] = value
}
-// Sets the value for the key in the override regiser.
+// Set sets the value for the key in the override regiser.
// Will be used instead of values obtained via
-// flags, config file, ENV, default, or key/value store
+// flags, config file, ENV, default, or key/value store.
func Set(key string, value interface{}) { v.Set(key, value) }
func (v *Viper) Set(key string, value interface{}) {
// If alias passed in, then set the proper override
key = v.realKey(strings.ToLower(key))
- v.override[key] = value
+
+ path := strings.Split(key, v.keyDelim)
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(v.override, path[0:len(path)-1])
+
+ // set innermost value
+ deepestMap[lastKey] = value
}
-// Viper will discover and load the configuration file from disk
+// ReadInConfig will discover and load the configuration file from disk
// and key/value stores, searching in one of the defined paths.
func ReadInConfig() error { return v.ReadInConfig() }
func (v *Viper) ReadInConfig() error {
@@ -971,7 +1099,7 @@ func (v *Viper) MergeInConfig() error {
return v.MergeConfig(bytes.NewReader(file))
}
-// Viper will read a configuration file, setting existing keys to nil if the
+// ReadConfig will read a configuration file, setting existing keys to nil if the
// key does not exist in the file.
func ReadConfig(in io.Reader) error { return v.ReadConfig(in) }
func (v *Viper) ReadConfig(in io.Reader) error {
@@ -1013,6 +1141,14 @@ func castToMapStringInterface(
return tgt
}
+func castMapStringToMapInterface(src map[string]string) map[string]interface{} {
+ tgt := map[string]interface{}{}
+ for k, v := range src {
+ tgt[k] = v
+ }
+ return tgt
+}
+
// mergeMaps merges two maps. The `itgt` parameter is for handling go-yaml's
// insistence on parsing nested structures as `map[interface{}]interface{}`
// instead of using a `string` as the key for nest structures beyond one level
@@ -1073,34 +1209,20 @@ func mergeMaps(
}
}
-// func ReadBufConfig(buf *bytes.Buffer) error { return v.ReadBufConfig(buf) }
-// func (v *Viper) ReadBufConfig(buf *bytes.Buffer) error {
-// v.config = make(map[string]interface{})
-// return v.unmarshalReader(buf, v.config)
-// }
-
-// Attempts to get configuration from a remote source
+// ReadRemoteConfig attempts to get configuration from a remote source
// and read it in the remote configuration registry.
func ReadRemoteConfig() error { return v.ReadRemoteConfig() }
func (v *Viper) ReadRemoteConfig() error {
- err := v.getKeyValueConfig()
- if err != nil {
- return err
- }
- return nil
+ return v.getKeyValueConfig()
}
func WatchRemoteConfig() error { return v.WatchRemoteConfig() }
func (v *Viper) WatchRemoteConfig() error {
- err := v.watchKeyValueConfig()
- if err != nil {
- return err
- }
- return nil
+ return v.watchKeyValueConfig()
}
-// Unmarshall a Reader into a map
-// Should probably be an unexported function
+// Unmarshall a Reader into a map.
+// Should probably be an unexported function.
func unmarshalReader(in io.Reader, c map[string]interface{}) error {
return v.unmarshalReader(in, c)
}
@@ -1116,7 +1238,7 @@ func (v *Viper) insensitiviseMaps() {
insensitiviseMap(v.kvstore)
}
-// retrieve the first found remote configuration
+// Retrieve the first found remote configuration.
func (v *Viper) getKeyValueConfig() error {
if RemoteConfig == nil {
return RemoteConfigError("Enable the remote features by doing a blank import of the viper/remote package: '_ github.com/spf13/viper/remote'")
@@ -1133,8 +1255,7 @@ func (v *Viper) getKeyValueConfig() error {
return RemoteConfigError("No Files Found")
}
-func (v *Viper) getRemoteConfig(provider *defaultRemoteProvider) (map[string]interface{}, error) {
-
+func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) {
reader, err := RemoteConfig.Get(provider)
if err != nil {
return nil, err
@@ -1143,7 +1264,7 @@ func (v *Viper) getRemoteConfig(provider *defaultRemoteProvider) (map[string]int
return v.kvstore, err
}
-// retrieve the first found remote configuration
+// Retrieve the first found remote configuration.
func (v *Viper) watchKeyValueConfig() error {
for _, rp := range v.remoteProviders {
val, err := v.watchRemoteConfig(rp)
@@ -1156,7 +1277,7 @@ func (v *Viper) watchKeyValueConfig() error {
return RemoteConfigError("No Files Found")
}
-func (v *Viper) watchRemoteConfig(provider *defaultRemoteProvider) (map[string]interface{}, error) {
+func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) {
reader, err := RemoteConfig.Watch(provider)
if err != nil {
return nil, err
@@ -1165,65 +1286,124 @@ func (v *Viper) watchRemoteConfig(provider *defaultRemoteProvider) (map[string]i
return v.kvstore, err
}
-// Return all keys regardless where they are set
+// AllKeys returns all keys holding a value, regardless of where they are set.
+// Nested keys are returned with a v.keyDelim (= ".") separator
func AllKeys() []string { return v.AllKeys() }
func (v *Viper) AllKeys() []string {
- m := map[string]struct{}{}
-
- for key, _ := range v.defaults {
- m[strings.ToLower(key)] = struct{}{}
- }
-
- for key, _ := range v.pflags {
- m[strings.ToLower(key)] = struct{}{}
- }
-
- for key, _ := range v.env {
- m[strings.ToLower(key)] = struct{}{}
- }
-
- for key, _ := range v.config {
- m[strings.ToLower(key)] = struct{}{}
+ m := map[string]bool{}
+ // add all paths, by order of descending priority to ensure correct shadowing
+ m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "")
+ m = v.flattenAndMergeMap(m, v.override, "")
+ m = v.mergeFlatMap(m, v.pflags)
+ m = v.mergeFlatMap(m, v.env)
+ m = v.flattenAndMergeMap(m, v.config, "")
+ m = v.flattenAndMergeMap(m, v.kvstore, "")
+ m = v.flattenAndMergeMap(m, v.defaults, "")
+
+ // convert set of paths to list
+ a := []string{}
+ for x := range m {
+ a = append(a, x)
}
+ return a
+}
- for key, _ := range v.kvstore {
- m[strings.ToLower(key)] = struct{}{}
+// flattenAndMergeMap recursively flattens the given map into a map[string]bool
+// of key paths (used as a set, easier to manipulate than a []string):
+// - each path is merged into a single key string, delimited with v.keyDelim (= ".")
+// - if a path is shadowed by an earlier value in the initial shadow map,
+// it is skipped.
+// The resulting set of paths is merged to the given shadow set at the same time.
+func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]interface{}, prefix string) map[string]bool {
+ if shadow != nil && prefix != "" && shadow[prefix] {
+ // prefix is shadowed => nothing more to flatten
+ return shadow
}
-
- for key, _ := range v.override {
- m[strings.ToLower(key)] = struct{}{}
+ if shadow == nil {
+ shadow = make(map[string]bool)
}
- for key, _ := range v.aliases {
- m[strings.ToLower(key)] = struct{}{}
+ var m2 map[string]interface{}
+ if prefix != "" {
+ prefix += v.keyDelim
}
-
- a := []string{}
- for x, _ := range m {
- a = append(a, x)
+ for k, val := range m {
+ fullKey := prefix + k
+ switch val.(type) {
+ case map[string]interface{}:
+ m2 = val.(map[string]interface{})
+ case map[interface{}]interface{}:
+ m2 = cast.ToStringMap(val)
+ default:
+ // immediate value
+ shadow[strings.ToLower(fullKey)] = true
+ continue
+ }
+ // recursively merge to shadow map
+ shadow = v.flattenAndMergeMap(shadow, m2, fullKey)
+ }
+ return shadow
+}
+
+// mergeFlatMap merges the given maps, excluding values of the second map
+// shadowed by values from the first map.
+func (v *Viper) mergeFlatMap(shadow map[string]bool, mi interface{}) map[string]bool {
+ // unify input map
+ var m map[string]interface{}
+ switch mi.(type) {
+ case map[string]string, map[string]FlagValue:
+ m = cast.ToStringMap(mi)
+ default:
+ return shadow
+ }
+
+ // scan keys
+outer:
+ for k, _ := range m {
+ path := strings.Split(k, v.keyDelim)
+ // scan intermediate paths
+ var parentKey string
+ for i := 1; i < len(path); i++ {
+ parentKey = strings.Join(path[0:i], v.keyDelim)
+ if shadow[parentKey] {
+ // path is shadowed, continue
+ continue outer
+ }
+ }
+ // add key
+ shadow[strings.ToLower(k)] = true
}
-
- return a
+ return shadow
}
-// Return all settings as a map[string]interface{}
+// AllSettings merges all settings and returns them as a map[string]interface{}.
func AllSettings() map[string]interface{} { return v.AllSettings() }
func (v *Viper) AllSettings() map[string]interface{} {
m := map[string]interface{}{}
- for _, x := range v.AllKeys() {
- m[x] = v.Get(x)
+ // start from the list of keys, and construct the map one value at a time
+ for _, k := range v.AllKeys() {
+ value := v.Get(k)
+ if value == nil {
+ // should not happen, since AllKeys() returns only keys holding a value,
+ // check just in case anything changes
+ continue
+ }
+ path := strings.Split(k, v.keyDelim)
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(m, path[0:len(path)-1])
+ // set innermost value
+ deepestMap[lastKey] = value
}
-
return m
}
-// Se the filesystem to use to read configuration.
+// SetFs sets the filesystem to use to read configuration.
func SetFs(fs afero.Fs) { v.SetFs(fs) }
func (v *Viper) SetFs(fs afero.Fs) {
v.fs = fs
}
-// Name for the config file.
+// SetConfigName sets name for the config file.
// Does not include extension.
func SetConfigName(in string) { v.SetConfigName(in) }
func (v *Viper) SetConfigName(in string) {
@@ -1233,7 +1413,7 @@ func (v *Viper) SetConfigName(in string) {
}
}
-// Sets the type of the configuration returned by the
+// SetConfigType sets the type of the configuration returned by the
// remote source, e.g. "json".
func SetConfigType(in string) { v.SetConfigType(in) }
func (v *Viper) SetConfigType(in string) {
@@ -1252,9 +1432,9 @@ func (v *Viper) getConfigType() string {
if len(ext) > 1 {
return ext[1:]
- } else {
- return ""
}
+
+ return ""
}
func (v *Viper) getConfigFile() string {
@@ -1285,8 +1465,8 @@ func (v *Viper) searchInPath(in string) (filename string) {
return ""
}
-// search all configPaths for any config file.
-// Returns the first path that exists (and is a config file)
+// Search all configPaths for any config file.
+// Returns the first path that exists (and is a config file).
func (v *Viper) findConfigFile() (string, error) {
jww.INFO.Println("Searching for config in ", v.configPaths)
@@ -1300,11 +1480,10 @@ func (v *Viper) findConfigFile() (string, error) {
return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)}
}
-// Prints all configuration registries for debugging
+// Debug prints all configuration registries for debugging
// purposes.
func Debug() { v.Debug() }
func (v *Viper) Debug() {
- fmt.Println("Aliases:")
fmt.Printf("Aliases:\n%#v\n", v.aliases)
fmt.Printf("Override:\n%#v\n", v.override)
fmt.Printf("PFlags:\n%#v\n", v.pflags)
diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go
index e6a7960..29b71d1 100644
--- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go
+++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go
@@ -1,386 +1,345 @@
/*
* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen
* THIS FILE MUST NOT BE EDITED BY HAND
-*/
+ */
package assert
import (
-
http "net/http"
url "net/url"
time "time"
)
-
// Condition uses a Comparison to assert a complex condition.
func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {
return Condition(a.t, comp, msgAndArgs...)
}
-
// Contains asserts that the specified string, list(array, slice...) or map contains the
// specified substring or element.
-//
+//
// a.Contains("Hello World", "World", "But 'Hello World' does contain 'World'")
// a.Contains(["Hello", "World"], "World", "But ["Hello", "World"] does contain 'World'")
// a.Contains({"Hello": "World"}, "Hello", "But {'Hello': 'World'} does contain 'Hello'")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
return Contains(a.t, s, contains, msgAndArgs...)
}
-
// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either
// a slice or a channel with len == 0.
-//
+//
// a.Empty(obj)
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {
return Empty(a.t, object, msgAndArgs...)
}
-
// Equal asserts that two objects are equal.
-//
+//
// a.Equal(123, 123, "123 and 123 should be equal")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
return Equal(a.t, expected, actual, msgAndArgs...)
}
-
// EqualError asserts that a function returned an error (i.e. not `nil`)
// and that it is equal to the provided error.
-//
+//
// actualObj, err := SomeFunction()
-// if assert.Error(t, err, "An error was expected") {
-// assert.Equal(t, err, expectedError)
-// }
-//
+// a.EqualError(err, expectedErrorString, "An error was expected")
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {
return EqualError(a.t, theError, errString, msgAndArgs...)
}
-
// EqualValues asserts that two objects are equal or convertable to the same types
// and equal.
-//
+//
// a.EqualValues(uint32(123), int32(123), "123 and 123 should be equal")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
return EqualValues(a.t, expected, actual, msgAndArgs...)
}
-
// Error asserts that a function returned an error (i.e. not `nil`).
-//
+//
// actualObj, err := SomeFunction()
// if a.Error(err, "An error was expected") {
// assert.Equal(t, err, expectedError)
// }
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {
return Error(a.t, err, msgAndArgs...)
}
-
// Exactly asserts that two objects are equal is value and type.
-//
+//
// a.Exactly(int32(123), int64(123), "123 and 123 should NOT be equal")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
return Exactly(a.t, expected, actual, msgAndArgs...)
}
-
// Fail reports a failure through
func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {
return Fail(a.t, failureMessage, msgAndArgs...)
}
-
// FailNow fails test
func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {
return FailNow(a.t, failureMessage, msgAndArgs...)
}
-
// False asserts that the specified value is false.
-//
+//
// a.False(myBool, "myBool should be false")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {
return False(a.t, value, msgAndArgs...)
}
-
// HTTPBodyContains asserts that a specified handler returns a
// body that contains a string.
-//
+//
// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {
return HTTPBodyContains(a.t, handler, method, url, values, str)
}
-
// HTTPBodyNotContains asserts that a specified handler returns a
// body that does not contain a string.
-//
+//
// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {
return HTTPBodyNotContains(a.t, handler, method, url, values, str)
}
-
// HTTPError asserts that a specified handler returns an error status code.
-//
+//
// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}}
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool {
return HTTPError(a.t, handler, method, url, values)
}
-
// HTTPRedirect asserts that a specified handler returns a redirect status code.
-//
+//
// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}}
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool {
return HTTPRedirect(a.t, handler, method, url, values)
}
-
// HTTPSuccess asserts that a specified handler returns a success status code.
-//
+//
// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil)
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool {
return HTTPSuccess(a.t, handler, method, url, values)
}
-
// Implements asserts that an object is implemented by the specified interface.
-//
+//
// a.Implements((*MyInterface)(nil), new(MyObject), "MyObject")
func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {
return Implements(a.t, interfaceObject, object, msgAndArgs...)
}
-
// InDelta asserts that the two numerals are within delta of each other.
-//
+//
// a.InDelta(math.Pi, (22 / 7.0), 0.01)
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
return InDelta(a.t, expected, actual, delta, msgAndArgs...)
}
-
// InDeltaSlice is the same as InDelta, except it compares two slices.
func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)
}
-
// InEpsilon asserts that expected and actual have a relative error less than epsilon
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)
}
-
-// InEpsilonSlice is the same as InEpsilon, except it compares two slices.
-func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {
- return InEpsilonSlice(a.t, expected, actual, delta, msgAndArgs...)
+// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.
+func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {
+ return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)
}
-
// IsType asserts that the specified objects are of the same type.
func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {
return IsType(a.t, expectedType, object, msgAndArgs...)
}
-
// JSONEq asserts that two JSON strings are equivalent.
-//
+//
// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`)
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool {
return JSONEq(a.t, expected, actual, msgAndArgs...)
}
-
// Len asserts that the specified object has specific length.
// Len also fails if the object has a type that len() not accept.
-//
+//
// a.Len(mySlice, 3, "The size of slice is not 3")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool {
return Len(a.t, object, length, msgAndArgs...)
}
-
// Nil asserts that the specified object is nil.
-//
+//
// a.Nil(err, "err should be nothing")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {
return Nil(a.t, object, msgAndArgs...)
}
-
// NoError asserts that a function returned no error (i.e. `nil`).
-//
+//
// actualObj, err := SomeFunction()
// if a.NoError(err) {
// assert.Equal(t, actualObj, expectedObj)
// }
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {
return NoError(a.t, err, msgAndArgs...)
}
-
// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the
// specified substring or element.
-//
+//
// a.NotContains("Hello World", "Earth", "But 'Hello World' does NOT contain 'Earth'")
// a.NotContains(["Hello", "World"], "Earth", "But ['Hello', 'World'] does NOT contain 'Earth'")
// a.NotContains({"Hello": "World"}, "Earth", "But {'Hello': 'World'} does NOT contain 'Earth'")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {
return NotContains(a.t, s, contains, msgAndArgs...)
}
-
// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either
// a slice or a channel with len == 0.
-//
+//
// if a.NotEmpty(obj) {
// assert.Equal(t, "two", obj[1])
// }
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool {
return NotEmpty(a.t, object, msgAndArgs...)
}
-
// NotEqual asserts that the specified values are NOT equal.
-//
+//
// a.NotEqual(obj1, obj2, "two objects shouldn't be equal")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {
return NotEqual(a.t, expected, actual, msgAndArgs...)
}
-
// NotNil asserts that the specified object is not nil.
-//
+//
// a.NotNil(err, "err should be something")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool {
return NotNil(a.t, object, msgAndArgs...)
}
-
// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.
-//
+//
// a.NotPanics(func(){
// RemainCalm()
// }, "Calling RemainCalm() should NOT panic")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
return NotPanics(a.t, f, msgAndArgs...)
}
-
// NotRegexp asserts that a specified regexp does not match a string.
-//
+//
// a.NotRegexp(regexp.MustCompile("starts"), "it's starting")
// a.NotRegexp("^start", "it's not starting")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
return NotRegexp(a.t, rx, str, msgAndArgs...)
}
-
// NotZero asserts that i is not the zero value for its type and returns the truth.
func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool {
return NotZero(a.t, i, msgAndArgs...)
}
-
// Panics asserts that the code inside the specified PanicTestFunc panics.
-//
+//
// a.Panics(func(){
// GoCrazy()
// }, "Calling GoCrazy() should panic")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {
return Panics(a.t, f, msgAndArgs...)
}
-
// Regexp asserts that a specified regexp matches a string.
-//
+//
// a.Regexp(regexp.MustCompile("start"), "it's starting")
// a.Regexp("start...$", "it's not starting")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {
return Regexp(a.t, rx, str, msgAndArgs...)
}
-
// True asserts that the specified value is true.
-//
+//
// a.True(myBool, "myBool should be true")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {
return True(a.t, value, msgAndArgs...)
}
-
// WithinDuration asserts that the two times are within duration delta of each other.
-//
+//
// a.WithinDuration(time.Now(), time.Now(), 10*time.Second, "The difference should not be more than 10s")
-//
+//
// Returns whether the assertion was successful (true) or not (false).
func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {
return WithinDuration(a.t, expected, actual, delta, msgAndArgs...)
}
-
// Zero asserts that i is the zero value for its type and returns the truth.
func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {
return Zero(a.t, i, msgAndArgs...)
diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go
index 348d5f1..835084f 100644
--- a/vendor/github.com/stretchr/testify/assert/assertions.go
+++ b/vendor/github.com/stretchr/testify/assert/assertions.go
@@ -18,6 +18,10 @@ import (
"github.com/pmezard/go-difflib/difflib"
)
+func init() {
+ spew.Config.SortKeys = true
+}
+
// TestingT is an interface wrapper around *testing.T
type TestingT interface {
Errorf(format string, args ...interface{})
@@ -65,7 +69,7 @@ func ObjectsAreEqualValues(expected, actual interface{}) bool {
/* CallerInfo is necessary because the assert functions use the testing object
internally, causing it to print the file:line of the assert method, rather than where
-the problem actually occured in calling code.*/
+the problem actually occurred in calling code.*/
// CallerInfo returns an array of strings containing the file and line number
// of each stack frame leading from the current test to the assert call that
@@ -82,7 +86,9 @@ func CallerInfo() []string {
for i := 0; ; i++ {
pc, file, line, ok = runtime.Caller(i)
if !ok {
- return nil
+ // The breaks below failed to terminate the loop, and we ran off the
+ // end of the call stack.
+ break
}
// This is a huge edge case, but it will panic if this is the case, see #180
@@ -90,6 +96,21 @@ func CallerInfo() []string {
break
}
+ f := runtime.FuncForPC(pc)
+ if f == nil {
+ break
+ }
+ name = f.Name()
+
+ // testing.tRunner is the standard library function that calls
+ // tests. Subtests are called directly by tRunner, without going through
+ // the Test/Benchmark/Example function that contains the t.Run calls, so
+ // with subtests we should break when we hit tRunner, without adding it
+ // to the list of callers.
+ if name == "testing.tRunner" {
+ break
+ }
+
parts := strings.Split(file, "/")
dir := parts[len(parts)-2]
file = parts[len(parts)-1]
@@ -97,11 +118,6 @@ func CallerInfo() []string {
callers = append(callers, fmt.Sprintf("%s:%d", file, line))
}
- f := runtime.FuncForPC(pc)
- if f == nil {
- break
- }
- name = f.Name()
// Drop the package
segments := strings.Split(name, ".")
name = segments[len(segments)-1]
@@ -262,14 +278,48 @@ func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{})
if !ObjectsAreEqual(expected, actual) {
diff := diff(expected, actual)
- return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+
- " != %#v (actual)%s", expected, actual, diff), msgAndArgs...)
+ expected, actual = formatUnequalValues(expected, actual)
+ return Fail(t, fmt.Sprintf("Not equal: \n"+
+ "expected: %s\n"+
+ "received: %s%s", expected, actual, diff), msgAndArgs...)
}
return true
}
+// formatUnequalValues takes two values of arbitrary types and returns string
+// representations appropriate to be presented to the user.
+//
+// If the values are not of like type, the returned strings will be prefixed
+// with the type name, and the value will be enclosed in parenthesis similar
+// to a type conversion in the Go grammar.
+func formatUnequalValues(expected, actual interface{}) (e string, a string) {
+ aType := reflect.TypeOf(expected)
+ bType := reflect.TypeOf(actual)
+
+ if aType != bType && isNumericType(aType) && isNumericType(bType) {
+ return fmt.Sprintf("%v(%#v)", aType, expected),
+ fmt.Sprintf("%v(%#v)", bType, actual)
+ }
+
+ return fmt.Sprintf("%#v", expected),
+ fmt.Sprintf("%#v", actual)
+}
+
+func isNumericType(t reflect.Type) bool {
+ switch t.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return true
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return true
+ case reflect.Float32, reflect.Float64:
+ return true
+ }
+
+ return false
+}
+
// EqualValues asserts that two objects are equal or convertable to the same types
// and equal.
//
@@ -279,8 +329,11 @@ func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{})
func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {
if !ObjectsAreEqualValues(expected, actual) {
- return Fail(t, fmt.Sprintf("Not equal: %#v (expected)\n"+
- " != %#v (actual)", expected, actual), msgAndArgs...)
+ diff := diff(expected, actual)
+ expected, actual = formatUnequalValues(expected, actual)
+ return Fail(t, fmt.Sprintf("Not equal: \n"+
+ "expected: %s\n"+
+ "received: %s%s", expected, actual, diff), msgAndArgs...)
}
return true
@@ -833,7 +886,7 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m
// Returns whether the assertion was successful (true) or not (false).
func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
if err != nil {
- return Fail(t, fmt.Sprintf("Received unexpected error %q", err), msgAndArgs...)
+ return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...)
}
return true
@@ -849,9 +902,8 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {
// Returns whether the assertion was successful (true) or not (false).
func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
- message := messageFromMsgAndArgs(msgAndArgs...)
if err == nil {
- return Fail(t, "An error is expected but got nil. %s", message)
+ return Fail(t, "An error is expected but got nil.", msgAndArgs...)
}
return true
@@ -861,20 +913,22 @@ func Error(t TestingT, err error, msgAndArgs ...interface{}) bool {
// and that it is equal to the provided error.
//
// actualObj, err := SomeFunction()
-// if assert.Error(t, err, "An error was expected") {
-// assert.Equal(t, err, expectedError)
-// }
+// assert.EqualError(t, err, expectedErrorString, "An error was expected")
//
// Returns whether the assertion was successful (true) or not (false).
func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {
-
- message := messageFromMsgAndArgs(msgAndArgs...)
- if !NotNil(t, theError, "An error is expected but got nil. %s", message) {
+ if !Error(t, theError, msgAndArgs...) {
return false
}
- s := "An error with value \"%s\" is expected but got \"%s\". %s"
- return Equal(t, errString, theError.Error(),
- s, errString, theError.Error(), message)
+ expected := errString
+ actual := theError.Error()
+ // don't need to use deep equals here, we know they are both strings
+ if expected != actual {
+ return Fail(t, fmt.Sprintf("Error message not equal:\n"+
+ "expected: %q\n"+
+ "received: %q", expected, actual), msgAndArgs...)
+ }
+ return true
}
// matchRegexp return true if a specified regexp matches a string.
@@ -989,7 +1043,6 @@ func diff(expected interface{}, actual interface{}) string {
return ""
}
- spew.Config.SortKeys = true
e := spew.Sdump(expected)
a := spew.Sdump(actual)
diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go
index e1b9442..fa7ab89 100644
--- a/vendor/github.com/stretchr/testify/assert/http_assertions.go
+++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go
@@ -99,7 +99,7 @@ func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url strin
contains := strings.Contains(body, fmt.Sprint(str))
if contains {
- Fail(t, "Expected response body for %s to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)
+ Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body))
}
return !contains