mirror of https://github.com/docker/cli.git
vendor: github.com/go-logr/logr v1.4.2
full diff: https://github.com/go-logr/logr/compare/v1.4.1...v1.4.2 Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
4c85feb4dd
commit
97ff1b7c0a
|
@ -69,7 +69,7 @@ require (
|
||||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
|
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
|
||||||
github.com/docker/go-metrics v0.0.1 // indirect
|
github.com/docker/go-metrics v0.0.1 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
github.com/go-logr/logr v1.4.1 // indirect
|
github.com/go-logr/logr v1.4.2 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/gorilla/mux v1.8.1 // indirect
|
github.com/gorilla/mux v1.8.1 // indirect
|
||||||
|
|
|
@ -89,8 +89,8 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
|
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# A minimal logging API for Go
|
# A minimal logging API for Go
|
||||||
|
|
||||||
[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr)
|
[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr)
|
||||||
|
[![Go Report Card](https://goreportcard.com/badge/github.com/go-logr/logr)](https://goreportcard.com/report/github.com/go-logr/logr)
|
||||||
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/go-logr/logr/badge)](https://securityscorecards.dev/viewer/?platform=github.com&org=go-logr&repo=logr)
|
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/go-logr/logr/badge)](https://securityscorecards.dev/viewer/?platform=github.com&org=go-logr&repo=logr)
|
||||||
|
|
||||||
logr offers an(other) opinion on how Go programs and libraries can do logging
|
logr offers an(other) opinion on how Go programs and libraries can do logging
|
||||||
|
|
|
@ -236,15 +236,14 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter {
|
||||||
// implementation. It should be constructed with NewFormatter. Some of
|
// implementation. It should be constructed with NewFormatter. Some of
|
||||||
// its methods directly implement logr.LogSink.
|
// its methods directly implement logr.LogSink.
|
||||||
type Formatter struct {
|
type Formatter struct {
|
||||||
outputFormat outputFormat
|
outputFormat outputFormat
|
||||||
prefix string
|
prefix string
|
||||||
values []any
|
values []any
|
||||||
valuesStr string
|
valuesStr string
|
||||||
parentValuesStr string
|
depth int
|
||||||
depth int
|
opts *Options
|
||||||
opts *Options
|
groupName string // for slog groups
|
||||||
group string // for slog groups
|
groups []groupDef
|
||||||
groupDepth int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// outputFormat indicates which outputFormat to use.
|
// outputFormat indicates which outputFormat to use.
|
||||||
|
@ -257,6 +256,13 @@ const (
|
||||||
outputJSON
|
outputJSON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// groupDef represents a saved group. The values may be empty, but we don't
|
||||||
|
// know if we need to render the group until the final record is rendered.
|
||||||
|
type groupDef struct {
|
||||||
|
name string
|
||||||
|
values string
|
||||||
|
}
|
||||||
|
|
||||||
// PseudoStruct is a list of key-value pairs that gets logged as a struct.
|
// PseudoStruct is a list of key-value pairs that gets logged as a struct.
|
||||||
type PseudoStruct []any
|
type PseudoStruct []any
|
||||||
|
|
||||||
|
@ -264,76 +270,102 @@ type PseudoStruct []any
|
||||||
func (f Formatter) render(builtins, args []any) string {
|
func (f Formatter) render(builtins, args []any) string {
|
||||||
// Empirically bytes.Buffer is faster than strings.Builder for this.
|
// Empirically bytes.Buffer is faster than strings.Builder for this.
|
||||||
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
|
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
buf.WriteByte('{') // for the whole line
|
buf.WriteByte('{') // for the whole record
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Render builtins
|
||||||
vals := builtins
|
vals := builtins
|
||||||
if hook := f.opts.RenderBuiltinsHook; hook != nil {
|
if hook := f.opts.RenderBuiltinsHook; hook != nil {
|
||||||
vals = hook(f.sanitize(vals))
|
vals = hook(f.sanitize(vals))
|
||||||
}
|
}
|
||||||
f.flatten(buf, vals, false, false) // keys are ours, no need to escape
|
f.flatten(buf, vals, false) // keys are ours, no need to escape
|
||||||
continuing := len(builtins) > 0
|
continuing := len(builtins) > 0
|
||||||
|
|
||||||
if f.parentValuesStr != "" {
|
// Turn the inner-most group into a string
|
||||||
|
argsStr := func() string {
|
||||||
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
|
|
||||||
|
vals = args
|
||||||
|
if hook := f.opts.RenderArgsHook; hook != nil {
|
||||||
|
vals = hook(f.sanitize(vals))
|
||||||
|
}
|
||||||
|
f.flatten(buf, vals, true) // escape user-provided keys
|
||||||
|
|
||||||
|
return buf.String()
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Render the stack of groups from the inside out.
|
||||||
|
bodyStr := f.renderGroup(f.groupName, f.valuesStr, argsStr)
|
||||||
|
for i := len(f.groups) - 1; i >= 0; i-- {
|
||||||
|
grp := &f.groups[i]
|
||||||
|
if grp.values == "" && bodyStr == "" {
|
||||||
|
// no contents, so we must elide the whole group
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
bodyStr = f.renderGroup(grp.name, grp.values, bodyStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if bodyStr != "" {
|
||||||
if continuing {
|
if continuing {
|
||||||
buf.WriteByte(f.comma())
|
buf.WriteByte(f.comma())
|
||||||
}
|
}
|
||||||
buf.WriteString(f.parentValuesStr)
|
buf.WriteString(bodyStr)
|
||||||
continuing = true
|
|
||||||
}
|
|
||||||
|
|
||||||
groupDepth := f.groupDepth
|
|
||||||
if f.group != "" {
|
|
||||||
if f.valuesStr != "" || len(args) != 0 {
|
|
||||||
if continuing {
|
|
||||||
buf.WriteByte(f.comma())
|
|
||||||
}
|
|
||||||
buf.WriteString(f.quoted(f.group, true)) // escape user-provided keys
|
|
||||||
buf.WriteByte(f.colon())
|
|
||||||
buf.WriteByte('{') // for the group
|
|
||||||
continuing = false
|
|
||||||
} else {
|
|
||||||
// The group was empty
|
|
||||||
groupDepth--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if f.valuesStr != "" {
|
|
||||||
if continuing {
|
|
||||||
buf.WriteByte(f.comma())
|
|
||||||
}
|
|
||||||
buf.WriteString(f.valuesStr)
|
|
||||||
continuing = true
|
|
||||||
}
|
|
||||||
|
|
||||||
vals = args
|
|
||||||
if hook := f.opts.RenderArgsHook; hook != nil {
|
|
||||||
vals = hook(f.sanitize(vals))
|
|
||||||
}
|
|
||||||
f.flatten(buf, vals, continuing, true) // escape user-provided keys
|
|
||||||
|
|
||||||
for i := 0; i < groupDepth; i++ {
|
|
||||||
buf.WriteByte('}') // for the groups
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
buf.WriteByte('}') // for the whole line
|
buf.WriteByte('}') // for the whole record
|
||||||
}
|
}
|
||||||
|
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// flatten renders a list of key-value pairs into a buffer. If continuing is
|
// renderGroup returns a string representation of the named group with rendered
|
||||||
// true, it assumes that the buffer has previous values and will emit a
|
// values and args. If the name is empty, this will return the values and args,
|
||||||
// separator (which depends on the output format) before the first pair it
|
// joined. If the name is not empty, this will return a single key-value pair,
|
||||||
// writes. If escapeKeys is true, the keys are assumed to have
|
// where the value is a grouping of the values and args. If the values and
|
||||||
// non-JSON-compatible characters in them and must be evaluated for escapes.
|
// args are both empty, this will return an empty string, even if the name was
|
||||||
|
// specified.
|
||||||
|
func (f Formatter) renderGroup(name string, values string, args string) string {
|
||||||
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
|
|
||||||
|
needClosingBrace := false
|
||||||
|
if name != "" && (values != "" || args != "") {
|
||||||
|
buf.WriteString(f.quoted(name, true)) // escape user-provided keys
|
||||||
|
buf.WriteByte(f.colon())
|
||||||
|
buf.WriteByte('{')
|
||||||
|
needClosingBrace = true
|
||||||
|
}
|
||||||
|
|
||||||
|
continuing := false
|
||||||
|
if values != "" {
|
||||||
|
buf.WriteString(values)
|
||||||
|
continuing = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if args != "" {
|
||||||
|
if continuing {
|
||||||
|
buf.WriteByte(f.comma())
|
||||||
|
}
|
||||||
|
buf.WriteString(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
if needClosingBrace {
|
||||||
|
buf.WriteByte('}')
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
// flatten renders a list of key-value pairs into a buffer. If escapeKeys is
|
||||||
|
// true, the keys are assumed to have non-JSON-compatible characters in them
|
||||||
|
// and must be evaluated for escapes.
|
||||||
//
|
//
|
||||||
// This function returns a potentially modified version of kvList, which
|
// This function returns a potentially modified version of kvList, which
|
||||||
// ensures that there is a value for every key (adding a value if needed) and
|
// ensures that there is a value for every key (adding a value if needed) and
|
||||||
// that each key is a string (substituting a key if needed).
|
// that each key is a string (substituting a key if needed).
|
||||||
func (f Formatter) flatten(buf *bytes.Buffer, kvList []any, continuing bool, escapeKeys bool) []any {
|
func (f Formatter) flatten(buf *bytes.Buffer, kvList []any, escapeKeys bool) []any {
|
||||||
// This logic overlaps with sanitize() but saves one type-cast per key,
|
// This logic overlaps with sanitize() but saves one type-cast per key,
|
||||||
// which can be measurable.
|
// which can be measurable.
|
||||||
if len(kvList)%2 != 0 {
|
if len(kvList)%2 != 0 {
|
||||||
|
@ -354,7 +386,7 @@ func (f Formatter) flatten(buf *bytes.Buffer, kvList []any, continuing bool, esc
|
||||||
}
|
}
|
||||||
v := kvList[i+1]
|
v := kvList[i+1]
|
||||||
|
|
||||||
if i > 0 || continuing {
|
if i > 0 {
|
||||||
if f.outputFormat == outputJSON {
|
if f.outputFormat == outputJSON {
|
||||||
buf.WriteByte(f.comma())
|
buf.WriteByte(f.comma())
|
||||||
} else {
|
} else {
|
||||||
|
@ -766,46 +798,17 @@ func (f Formatter) sanitize(kvList []any) []any {
|
||||||
// startGroup opens a new group scope (basically a sub-struct), which locks all
|
// startGroup opens a new group scope (basically a sub-struct), which locks all
|
||||||
// the current saved values and starts them anew. This is needed to satisfy
|
// the current saved values and starts them anew. This is needed to satisfy
|
||||||
// slog.
|
// slog.
|
||||||
func (f *Formatter) startGroup(group string) {
|
func (f *Formatter) startGroup(name string) {
|
||||||
// Unnamed groups are just inlined.
|
// Unnamed groups are just inlined.
|
||||||
if group == "" {
|
if name == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Any saved values can no longer be changed.
|
n := len(f.groups)
|
||||||
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
f.groups = append(f.groups[:n:n], groupDef{f.groupName, f.valuesStr})
|
||||||
continuing := false
|
|
||||||
|
|
||||||
if f.parentValuesStr != "" {
|
|
||||||
buf.WriteString(f.parentValuesStr)
|
|
||||||
continuing = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if f.group != "" && f.valuesStr != "" {
|
|
||||||
if continuing {
|
|
||||||
buf.WriteByte(f.comma())
|
|
||||||
}
|
|
||||||
buf.WriteString(f.quoted(f.group, true)) // escape user-provided keys
|
|
||||||
buf.WriteByte(f.colon())
|
|
||||||
buf.WriteByte('{') // for the group
|
|
||||||
continuing = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if f.valuesStr != "" {
|
|
||||||
if continuing {
|
|
||||||
buf.WriteByte(f.comma())
|
|
||||||
}
|
|
||||||
buf.WriteString(f.valuesStr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: We don't close the scope here - that's done later, when a log line
|
|
||||||
// is actually rendered (because we have N scopes to close).
|
|
||||||
|
|
||||||
f.parentValuesStr = buf.String()
|
|
||||||
|
|
||||||
// Start collecting new values.
|
// Start collecting new values.
|
||||||
f.group = group
|
f.groupName = name
|
||||||
f.groupDepth++
|
|
||||||
f.valuesStr = ""
|
f.valuesStr = ""
|
||||||
f.values = nil
|
f.values = nil
|
||||||
}
|
}
|
||||||
|
@ -900,7 +903,7 @@ func (f *Formatter) AddValues(kvList []any) {
|
||||||
|
|
||||||
// Pre-render values, so we don't have to do it on each Info/Error call.
|
// Pre-render values, so we don't have to do it on each Info/Error call.
|
||||||
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
buf := bytes.NewBuffer(make([]byte, 0, 1024))
|
||||||
f.flatten(buf, vals, false, true) // escape user-provided keys
|
f.flatten(buf, vals, true) // escape user-provided keys
|
||||||
f.valuesStr = buf.String()
|
f.valuesStr = buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ github.com/go-jose/go-jose/v3
|
||||||
github.com/go-jose/go-jose/v3/cipher
|
github.com/go-jose/go-jose/v3/cipher
|
||||||
github.com/go-jose/go-jose/v3/json
|
github.com/go-jose/go-jose/v3/json
|
||||||
github.com/go-jose/go-jose/v3/jwt
|
github.com/go-jose/go-jose/v3/jwt
|
||||||
# github.com/go-logr/logr v1.4.1
|
# github.com/go-logr/logr v1.4.2
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/go-logr/logr
|
github.com/go-logr/logr
|
||||||
github.com/go-logr/logr/funcr
|
github.com/go-logr/logr/funcr
|
||||||
|
|
Loading…
Reference in New Issue