aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgescheit <gescheit@yandex-team.com>2023-12-01 21:31:51 +0300
committergescheit <gescheit@yandex-team.com>2023-12-02 02:35:12 +0300
commit32fb6dda1feb24f9ab69ece5df0cb9ec238ca5e6 (patch)
tree4354f9bab28f0d73e70fc0d909e18ab1901bd0bc
parent7fb28312c27a153b000251fd3ff6c9837980bb95 (diff)
downloadydb-32fb6dda1feb24f9ab69ece5df0cb9ec238ca5e6.tar.gz
Update vendor/github.com/openconfig/ygot to 0.29.15
Обновляю openconfig так как обнаружил, что из-за ошибки в коде много заметное количество ресурсов уходит на форматирование данных для дебага, которые не используется. https://st.yandex-team.ru/ disable tests due to 'transitive dependencies on modules under test are prohibited' Update vendor/github.com/openconfig/ygot to 0.29.15
-rw-r--r--vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go49
-rw-r--r--vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go16
-rw-r--r--vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go12
-rw-r--r--vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go4
-rw-r--r--vendor/github.com/google/go-cmp/cmp/cmpopts/ya.make4
-rw-r--r--vendor/github.com/google/go-cmp/cmp/compare.go38
-rw-r--r--vendor/github.com/google/go-cmp/cmp/export.go (renamed from vendor/github.com/google/go-cmp/cmp/export_unsafe.go)5
-rw-r--r--vendor/github.com/google/go-cmp/cmp/internal/diff/ya.make4
-rw-r--r--vendor/github.com/google/go-cmp/cmp/internal/flags/ya.make4
-rw-r--r--vendor/github.com/google/go-cmp/cmp/internal/function/ya.make8
-rw-r--r--vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go (renamed from vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go)3
-rw-r--r--vendor/github.com/google/go-cmp/cmp/internal/value/ya.make6
-rw-r--r--vendor/github.com/google/go-cmp/cmp/options.go84
-rw-r--r--vendor/github.com/google/go-cmp/cmp/path.go46
-rw-r--r--vendor/github.com/google/go-cmp/cmp/report_reflect.go2
-rw-r--r--vendor/github.com/google/go-cmp/cmp/ya.make2
-rw-r--r--vendor/github.com/spf13/cobra/active_help.go10
-rw-r--r--vendor/github.com/spf13/cobra/bash_completions.go2
-rw-r--r--vendor/github.com/spf13/cobra/bash_completionsV2.go2
-rw-r--r--vendor/github.com/spf13/cobra/cobra.go13
-rw-r--r--vendor/github.com/spf13/cobra/command.go69
-rw-r--r--vendor/github.com/spf13/cobra/command_test.go175
-rw-r--r--vendor/github.com/spf13/cobra/completions.go29
-rw-r--r--vendor/github.com/spf13/cobra/completions_test.go344
-rw-r--r--vendor/github.com/spf13/cobra/fish_completions.go2
-rw-r--r--vendor/github.com/spf13/cobra/fish_completions_test.go35
-rw-r--r--vendor/github.com/spf13/cobra/flag_groups.go68
-rw-r--r--vendor/github.com/spf13/cobra/flag_groups_test.go63
-rw-r--r--vendor/github.com/spf13/cobra/powershell_completions.go6
-rw-r--r--vendor/github.com/spf13/cobra/powershell_completions_test.go2
-rw-r--r--vendor/github.com/spf13/cobra/ya.make12
31 files changed, 871 insertions, 248 deletions
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
index e54a76c7e3c..3d8d0cd3ae3 100644
--- a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go
@@ -7,6 +7,7 @@ package cmpopts
import (
"errors"
+ "fmt"
"math"
"reflect"
"time"
@@ -16,10 +17,10 @@ import (
func equateAlways(_, _ interface{}) bool { return true }
-// EquateEmpty returns a Comparer option that determines all maps and slices
+// EquateEmpty returns a [cmp.Comparer] option that determines all maps and slices
// with a length of zero to be equal, regardless of whether they are nil.
//
-// EquateEmpty can be used in conjunction with SortSlices and SortMaps.
+// EquateEmpty can be used in conjunction with [SortSlices] and [SortMaps].
func EquateEmpty() cmp.Option {
return cmp.FilterValues(isEmpty, cmp.Comparer(equateAlways))
}
@@ -31,7 +32,7 @@ func isEmpty(x, y interface{}) bool {
(vx.Len() == 0 && vy.Len() == 0)
}
-// EquateApprox returns a Comparer option that determines float32 or float64
+// EquateApprox returns a [cmp.Comparer] option that determines float32 or float64
// values to be equal if they are within a relative fraction or absolute margin.
// This option is not used when either x or y is NaN or infinite.
//
@@ -45,7 +46,7 @@ func isEmpty(x, y interface{}) bool {
//
// |x-y| ≤ max(fraction*min(|x|, |y|), margin)
//
-// EquateApprox can be used in conjunction with EquateNaNs.
+// EquateApprox can be used in conjunction with [EquateNaNs].
func EquateApprox(fraction, margin float64) cmp.Option {
if margin < 0 || fraction < 0 || math.IsNaN(margin) || math.IsNaN(fraction) {
panic("margin or fraction must be a non-negative number")
@@ -73,10 +74,10 @@ func (a approximator) compareF32(x, y float32) bool {
return a.compareF64(float64(x), float64(y))
}
-// EquateNaNs returns a Comparer option that determines float32 and float64
+// EquateNaNs returns a [cmp.Comparer] option that determines float32 and float64
// NaN values to be equal.
//
-// EquateNaNs can be used in conjunction with EquateApprox.
+// EquateNaNs can be used in conjunction with [EquateApprox].
func EquateNaNs() cmp.Option {
return cmp.Options{
cmp.FilterValues(areNaNsF64s, cmp.Comparer(equateAlways)),
@@ -91,8 +92,8 @@ func areNaNsF32s(x, y float32) bool {
return areNaNsF64s(float64(x), float64(y))
}
-// EquateApproxTime returns a Comparer option that determines two non-zero
-// time.Time values to be equal if they are within some margin of one another.
+// EquateApproxTime returns a [cmp.Comparer] option that determines two non-zero
+// [time.Time] values to be equal if they are within some margin of one another.
// If both times have a monotonic clock reading, then the monotonic time
// difference will be used. The margin must be non-negative.
func EquateApproxTime(margin time.Duration) cmp.Option {
@@ -131,8 +132,8 @@ type anyError struct{}
func (anyError) Error() string { return "any error" }
func (anyError) Is(err error) bool { return err != nil }
-// EquateErrors returns a Comparer option that determines errors to be equal
-// if errors.Is reports them to match. The AnyError error can be used to
+// EquateErrors returns a [cmp.Comparer] option that determines errors to be equal
+// if [errors.Is] reports them to match. The [AnyError] error can be used to
// match any non-nil error.
func EquateErrors() cmp.Option {
return cmp.FilterValues(areConcreteErrors, cmp.Comparer(compareErrors))
@@ -154,3 +155,31 @@ func compareErrors(x, y interface{}) bool {
ye := y.(error)
return errors.Is(xe, ye) || errors.Is(ye, xe)
}
+
+// EquateComparable returns a [cmp.Option] that determines equality
+// of comparable types by directly comparing them using the == operator in Go.
+// The types to compare are specified by passing a value of that type.
+// This option should only be used on types that are documented as being
+// safe for direct == comparison. For example, [net/netip.Addr] is documented
+// as being semantically safe to use with ==, while [time.Time] is documented
+// to discourage the use of == on time values.
+func EquateComparable(typs ...interface{}) cmp.Option {
+ types := make(typesFilter)
+ for _, typ := range typs {
+ switch t := reflect.TypeOf(typ); {
+ case !t.Comparable():
+ panic(fmt.Sprintf("%T is not a comparable Go type", typ))
+ case types[t]:
+ panic(fmt.Sprintf("%T is already specified", typ))
+ default:
+ types[t] = true
+ }
+ }
+ return cmp.FilterPath(types.filter, cmp.Comparer(equateAny))
+}
+
+type typesFilter map[reflect.Type]bool
+
+func (tf typesFilter) filter(p cmp.Path) bool { return tf[p.Last().Type()] }
+
+func equateAny(x, y interface{}) bool { return x == y }
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go
index 80c60617e40..fb84d11d70e 100644
--- a/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go
@@ -14,7 +14,7 @@ import (
"github.com/google/go-cmp/cmp/internal/function"
)
-// IgnoreFields returns an Option that ignores fields of the
+// IgnoreFields returns an [cmp.Option] that ignores fields of the
// given names on a single struct type. It respects the names of exported fields
// that are forwarded due to struct embedding.
// The struct type is specified by passing in a value of that type.
@@ -26,7 +26,7 @@ func IgnoreFields(typ interface{}, names ...string) cmp.Option {
return cmp.FilterPath(sf.filter, cmp.Ignore())
}
-// IgnoreTypes returns an Option that ignores all values assignable to
+// IgnoreTypes returns an [cmp.Option] that ignores all values assignable to
// certain types, which are specified by passing in a value of each type.
func IgnoreTypes(typs ...interface{}) cmp.Option {
tf := newTypeFilter(typs...)
@@ -59,10 +59,10 @@ func (tf typeFilter) filter(p cmp.Path) bool {
return false
}
-// IgnoreInterfaces returns an Option that ignores all values or references of
+// IgnoreInterfaces returns an [cmp.Option] that ignores all values or references of
// values assignable to certain interface types. These interfaces are specified
// by passing in an anonymous struct with the interface types embedded in it.
-// For example, to ignore sync.Locker, pass in struct{sync.Locker}{}.
+// For example, to ignore [sync.Locker], pass in struct{sync.Locker}{}.
func IgnoreInterfaces(ifaces interface{}) cmp.Option {
tf := newIfaceFilter(ifaces)
return cmp.FilterPath(tf.filter, cmp.Ignore())
@@ -107,7 +107,7 @@ func (tf ifaceFilter) filter(p cmp.Path) bool {
return false
}
-// IgnoreUnexported returns an Option that only ignores the immediate unexported
+// IgnoreUnexported returns an [cmp.Option] that only ignores the immediate unexported
// fields of a struct, including anonymous fields of unexported types.
// In particular, unexported fields within the struct's exported fields
// of struct types, including anonymous fields, will not be ignored unless the
@@ -115,7 +115,7 @@ func (tf ifaceFilter) filter(p cmp.Path) bool {
//
// Avoid ignoring unexported fields of a type which you do not control (i.e. a
// type from another repository), as changes to the implementation of such types
-// may change how the comparison behaves. Prefer a custom Comparer instead.
+// may change how the comparison behaves. Prefer a custom [cmp.Comparer] instead.
func IgnoreUnexported(typs ...interface{}) cmp.Option {
ux := newUnexportedFilter(typs...)
return cmp.FilterPath(ux.filter, cmp.Ignore())
@@ -148,7 +148,7 @@ func isExported(id string) bool {
return unicode.IsUpper(r)
}
-// IgnoreSliceElements returns an Option that ignores elements of []V.
+// IgnoreSliceElements returns an [cmp.Option] that ignores elements of []V.
// The discard function must be of the form "func(T) bool" which is used to
// ignore slice elements of type V, where V is assignable to T.
// Elements are ignored if the function reports true.
@@ -176,7 +176,7 @@ func IgnoreSliceElements(discardFunc interface{}) cmp.Option {
}, cmp.Ignore())
}
-// IgnoreMapEntries returns an Option that ignores entries of map[K]V.
+// IgnoreMapEntries returns an [cmp.Option] that ignores entries of map[K]V.
// The discard function must be of the form "func(T, R) bool" which is used to
// ignore map entries of type K and V, where K and V are assignable to T and R.
// Entries are ignored if the function reports true.
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go
index 0eb2a758c23..c6d09dae402 100644
--- a/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go
@@ -13,7 +13,7 @@ import (
"github.com/google/go-cmp/cmp/internal/function"
)
-// SortSlices returns a Transformer option that sorts all []V.
+// SortSlices returns a [cmp.Transformer] option that sorts all []V.
// The less function must be of the form "func(T, T) bool" which is used to
// sort any slice with element type V that is assignable to T.
//
@@ -25,7 +25,7 @@ import (
// The less function does not have to be "total". That is, if !less(x, y) and
// !less(y, x) for two elements x and y, their relative order is maintained.
//
-// SortSlices can be used in conjunction with EquateEmpty.
+// SortSlices can be used in conjunction with [EquateEmpty].
func SortSlices(lessFunc interface{}) cmp.Option {
vf := reflect.ValueOf(lessFunc)
if !function.IsType(vf.Type(), function.Less) || vf.IsNil() {
@@ -82,13 +82,13 @@ func (ss sliceSorter) less(v reflect.Value, i, j int) bool {
return ss.fnc.Call([]reflect.Value{vx, vy})[0].Bool()
}
-// SortMaps returns a Transformer option that flattens map[K]V types to be a
+// SortMaps returns a [cmp.Transformer] option that flattens map[K]V types to be a
// sorted []struct{K, V}. The less function must be of the form
// "func(T, T) bool" which is used to sort any map with key K that is
// assignable to T.
//
-// Flattening the map into a slice has the property that cmp.Equal is able to
-// use Comparers on K or the K.Equal method if it exists.
+// Flattening the map into a slice has the property that [cmp.Equal] is able to
+// use [cmp.Comparer] options on K or the K.Equal method if it exists.
//
// The less function must be:
// - Deterministic: less(x, y) == less(x, y)
@@ -96,7 +96,7 @@ func (ss sliceSorter) less(v reflect.Value, i, j int) bool {
// - Transitive: if !less(x, y) and !less(y, z), then !less(x, z)
// - Total: if x != y, then either less(x, y) or less(y, x)
//
-// SortMaps can be used in conjunction with EquateEmpty.
+// SortMaps can be used in conjunction with [EquateEmpty].
func SortMaps(lessFunc interface{}) cmp.Option {
vf := reflect.ValueOf(lessFunc)
if !function.IsType(vf.Type(), function.Less) || vf.IsNil() {
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go
index 8812443a2f5..25b4bd05bd7 100644
--- a/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go
@@ -19,7 +19,7 @@ func (xf xformFilter) filter(p cmp.Path) bool {
return true
}
-// AcyclicTransformer returns a Transformer with a filter applied that ensures
+// AcyclicTransformer returns a [cmp.Transformer] with a filter applied that ensures
// that the transformer cannot be recursively applied upon its own output.
//
// An example use case is a transformer that splits a string by lines:
@@ -28,7 +28,7 @@ func (xf xformFilter) filter(p cmp.Path) bool {
// return strings.Split(s, "\n")
// })
//
-// Had this been an unfiltered Transformer instead, this would result in an
+// Had this been an unfiltered [cmp.Transformer] instead, this would result in an
// infinite cycle converting a string to []string to [][]string and so on.
func AcyclicTransformer(name string, xformFunc interface{}) cmp.Option {
xf := xformFilter{cmp.Transformer(name, xformFunc)}
diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/ya.make b/vendor/github.com/google/go-cmp/cmp/cmpopts/ya.make
index 3b327fb6c11..438a3e2c3b6 100644
--- a/vendor/github.com/google/go-cmp/cmp/cmpopts/ya.make
+++ b/vendor/github.com/google/go-cmp/cmp/cmpopts/ya.make
@@ -16,4 +16,6 @@ GO_XTEST_SRCS(example_test.go)
END()
-RECURSE(gotest)
+RECURSE(
+ gotest
+)
diff --git a/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/google/go-cmp/cmp/compare.go
index 087320da7f0..0f5b8a48c6b 100644
--- a/vendor/github.com/google/go-cmp/cmp/compare.go
+++ b/vendor/github.com/google/go-cmp/cmp/compare.go
@@ -5,7 +5,7 @@
// Package cmp determines equality of values.
//
// This package is intended to be a more powerful and safer alternative to
-// reflect.DeepEqual for comparing whether two values are semantically equal.
+// [reflect.DeepEqual] for comparing whether two values are semantically equal.
// It is intended to only be used in tests, as performance is not a goal and
// it may panic if it cannot compare the values. Its propensity towards
// panicking means that its unsuitable for production environments where a
@@ -18,16 +18,17 @@
// For example, an equality function may report floats as equal so long as
// they are within some tolerance of each other.
//
-// - Types with an Equal method may use that method to determine equality.
-// This allows package authors to determine the equality operation
-// for the types that they define.
+// - Types with an Equal method (e.g., [time.Time.Equal]) may use that method
+// to determine equality. This allows package authors to determine
+// the equality operation for the types that they define.
//
// - If no custom equality functions are used and no Equal method is defined,
// equality is determined by recursively comparing the primitive kinds on
-// both values, much like reflect.DeepEqual. Unlike reflect.DeepEqual,
+// both values, much like [reflect.DeepEqual]. Unlike [reflect.DeepEqual],
// unexported fields are not compared by default; they result in panics
-// unless suppressed by using an Ignore option (see cmpopts.IgnoreUnexported)
-// or explicitly compared using the Exporter option.
+// unless suppressed by using an [Ignore] option
+// (see [github.com/google/go-cmp/cmp/cmpopts.IgnoreUnexported])
+// or explicitly compared using the [Exporter] option.
package cmp
import (
@@ -45,14 +46,14 @@ import (
// Equal reports whether x and y are equal by recursively applying the
// following rules in the given order to x and y and all of their sub-values:
//
-// - Let S be the set of all Ignore, Transformer, and Comparer options that
+// - Let S be the set of all [Ignore], [Transformer], and [Comparer] options that
// remain after applying all path filters, value filters, and type filters.
-// If at least one Ignore exists in S, then the comparison is ignored.
-// If the number of Transformer and Comparer options in S is non-zero,
+// If at least one [Ignore] exists in S, then the comparison is ignored.
+// If the number of [Transformer] and [Comparer] options in S is non-zero,
// then Equal panics because it is ambiguous which option to use.
-// If S contains a single Transformer, then use that to transform
+// If S contains a single [Transformer], then use that to transform
// the current values and recursively call Equal on the output values.
-// If S contains a single Comparer, then use that to compare the current values.
+// If S contains a single [Comparer], then use that to compare the current values.
// Otherwise, evaluation proceeds to the next rule.
//
// - If the values have an Equal method of the form "(T) Equal(T) bool" or
@@ -66,21 +67,22 @@ import (
// Functions are only equal if they are both nil, otherwise they are unequal.
//
// Structs are equal if recursively calling Equal on all fields report equal.
-// If a struct contains unexported fields, Equal panics unless an Ignore option
-// (e.g., cmpopts.IgnoreUnexported) ignores that field or the Exporter option
-// explicitly permits comparing the unexported field.
+// If a struct contains unexported fields, Equal panics unless an [Ignore] option
+// (e.g., [github.com/google/go-cmp/cmp/cmpopts.IgnoreUnexported]) ignores that field
+// or the [Exporter] option explicitly permits comparing the unexported field.
//
// Slices are equal if they are both nil or both non-nil, where recursively
// calling Equal on all non-ignored slice or array elements report equal.
// Empty non-nil slices and nil slices are not equal; to equate empty slices,
-// consider using cmpopts.EquateEmpty.
+// consider using [github.com/google/go-cmp/cmp/cmpopts.EquateEmpty].
//
// Maps are equal if they are both nil or both non-nil, where recursively
// calling Equal on all non-ignored map entries report equal.
// Map keys are equal according to the == operator.
-// To use custom comparisons for map keys, consider using cmpopts.SortMaps.
+// To use custom comparisons for map keys, consider using
+// [github.com/google/go-cmp/cmp/cmpopts.SortMaps].
// Empty non-nil maps and nil maps are not equal; to equate empty maps,
-// consider using cmpopts.EquateEmpty.
+// consider using [github.com/google/go-cmp/cmp/cmpopts.EquateEmpty].
//
// Pointers and interfaces are equal if they are both nil or both non-nil,
// where they have the same underlying concrete type and recursively
diff --git a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go b/vendor/github.com/google/go-cmp/cmp/export.go
index e2c0f74e839..29f82fe6b2f 100644
--- a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go
+++ b/vendor/github.com/google/go-cmp/cmp/export.go
@@ -2,9 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build !purego
-// +build !purego
-
package cmp
import (
@@ -12,8 +9,6 @@ import (
"unsafe"
)
-const supportExporters = true
-
// retrieveUnexportedField uses unsafe to forcibly retrieve any field from
// a struct such that the value has read-write permissions.
//
diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/ya.make b/vendor/github.com/google/go-cmp/cmp/internal/diff/ya.make
index 6ecad735291..26569017931 100644
--- a/vendor/github.com/google/go-cmp/cmp/internal/diff/ya.make
+++ b/vendor/github.com/google/go-cmp/cmp/internal/diff/ya.make
@@ -11,4 +11,6 @@ GO_TEST_SRCS(diff_test.go)
END()
-RECURSE(gotest)
+RECURSE(
+ gotest
+)
diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/ya.make b/vendor/github.com/google/go-cmp/cmp/internal/flags/ya.make
index 451be9b0c73..63f346a3a77 100644
--- a/vendor/github.com/google/go-cmp/cmp/internal/flags/ya.make
+++ b/vendor/github.com/google/go-cmp/cmp/internal/flags/ya.make
@@ -2,6 +2,8 @@ GO_LIBRARY()
LICENSE(BSD-3-Clause)
-SRCS(flags.go)
+SRCS(
+ flags.go
+)
END()
diff --git a/vendor/github.com/google/go-cmp/cmp/internal/function/ya.make b/vendor/github.com/google/go-cmp/cmp/internal/function/ya.make
index da5aa18d98f..3c7a602a666 100644
--- a/vendor/github.com/google/go-cmp/cmp/internal/function/ya.make
+++ b/vendor/github.com/google/go-cmp/cmp/internal/function/ya.make
@@ -2,10 +2,14 @@ GO_LIBRARY()
LICENSE(BSD-3-Clause)
-SRCS(func.go)
+SRCS(
+ func.go
+)
GO_TEST_SRCS(func_test.go)
END()
-RECURSE(gotest)
+RECURSE(
+ gotest
+)
diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go
index 16e6860af6e..e5dfff69afa 100644
--- a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go
+++ b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer.go
@@ -2,9 +2,6 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-//go:build !purego
-// +build !purego
-
package value
import (
diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/ya.make b/vendor/github.com/google/go-cmp/cmp/internal/value/ya.make
index 4c8b9aa8239..ed00d3f024e 100644
--- a/vendor/github.com/google/go-cmp/cmp/internal/value/ya.make
+++ b/vendor/github.com/google/go-cmp/cmp/internal/value/ya.make
@@ -4,7 +4,7 @@ LICENSE(BSD-3-Clause)
SRCS(
name.go
- pointer_unsafe.go
+ pointer.go
sort.go
)
@@ -16,4 +16,6 @@ GO_XTEST_SRCS(
END()
-RECURSE(gotest)
+RECURSE(
+ gotest
+)
diff --git a/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/google/go-cmp/cmp/options.go
index 1f9ca9c4892..754496f3b3f 100644
--- a/vendor/github.com/google/go-cmp/cmp/options.go
+++ b/vendor/github.com/google/go-cmp/cmp/options.go
@@ -13,15 +13,15 @@ import (
"github.com/google/go-cmp/cmp/internal/function"
)
-// Option configures for specific behavior of Equal and Diff. In particular,
-// the fundamental Option functions (Ignore, Transformer, and Comparer),
+// Option configures for specific behavior of [Equal] and [Diff]. In particular,
+// the fundamental Option functions ([Ignore], [Transformer], and [Comparer]),
// configure how equality is determined.
//
-// The fundamental options may be composed with filters (FilterPath and
-// FilterValues) to control the scope over which they are applied.
+// The fundamental options may be composed with filters ([FilterPath] and
+// [FilterValues]) to control the scope over which they are applied.
//
-// The cmp/cmpopts package provides helper functions for creating options that
-// may be used with Equal and Diff.
+// The [github.com/google/go-cmp/cmp/cmpopts] package provides helper functions
+// for creating options that may be used with [Equal] and [Diff].
type Option interface {
// filter applies all filters and returns the option that remains.
// Each option may only read s.curPath and call s.callTTBFunc.
@@ -56,9 +56,9 @@ type core struct{}
func (core) isCore() {}
-// Options is a list of Option values that also satisfies the Option interface.
+// Options is a list of [Option] values that also satisfies the [Option] interface.
// Helper comparison packages may return an Options value when packing multiple
-// Option values into a single Option. When this package processes an Options,
+// [Option] values into a single [Option]. When this package processes an Options,
// it will be implicitly expanded into a flat list.
//
// Applying a filter on an Options is equivalent to applying that same filter
@@ -105,16 +105,16 @@ func (opts Options) String() string {
return fmt.Sprintf("Options{%s}", strings.Join(ss, ", "))
}
-// FilterPath returns a new Option where opt is only evaluated if filter f
-// returns true for the current Path in the value tree.
+// FilterPath returns a new [Option] where opt is only evaluated if filter f
+// returns true for the current [Path] in the value tree.
//
// This filter is called even if a slice element or map entry is missing and
// provides an opportunity to ignore such cases. The filter function must be
// symmetric such that the filter result is identical regardless of whether the
// missing value is from x or y.
//
-// The option passed in may be an Ignore, Transformer, Comparer, Options, or
-// a previously filtered Option.
+// The option passed in may be an [Ignore], [Transformer], [Comparer], [Options], or
+// a previously filtered [Option].
func FilterPath(f func(Path) bool, opt Option) Option {
if f == nil {
panic("invalid path filter function")
@@ -142,7 +142,7 @@ func (f pathFilter) String() string {
return fmt.Sprintf("FilterPath(%s, %v)", function.NameOf(reflect.ValueOf(f.fnc)), f.opt)
}
-// FilterValues returns a new Option where opt is only evaluated if filter f,
+// FilterValues returns a new [Option] where opt is only evaluated if filter f,
// which is a function of the form "func(T, T) bool", returns true for the
// current pair of values being compared. If either value is invalid or
// the type of the values is not assignable to T, then this filter implicitly
@@ -154,8 +154,8 @@ func (f pathFilter) String() string {
// If T is an interface, it is possible that f is called with two values with
// different concrete types that both implement T.
//
-// The option passed in may be an Ignore, Transformer, Comparer, Options, or
-// a previously filtered Option.
+// The option passed in may be an [Ignore], [Transformer], [Comparer], [Options], or
+// a previously filtered [Option].
func FilterValues(f interface{}, opt Option) Option {
v := reflect.ValueOf(f)
if !function.IsType(v.Type(), function.ValueFilter) || v.IsNil() {
@@ -192,9 +192,9 @@ func (f valuesFilter) String() string {
return fmt.Sprintf("FilterValues(%s, %v)", function.NameOf(f.fnc), f.opt)
}
-// Ignore is an Option that causes all comparisons to be ignored.
-// This value is intended to be combined with FilterPath or FilterValues.
-// It is an error to pass an unfiltered Ignore option to Equal.
+// Ignore is an [Option] that causes all comparisons to be ignored.
+// This value is intended to be combined with [FilterPath] or [FilterValues].
+// It is an error to pass an unfiltered Ignore option to [Equal].
func Ignore() Option { return ignore{} }
type ignore struct{ core }
@@ -234,6 +234,8 @@ func (validator) apply(s *state, vx, vy reflect.Value) {
name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType
if _, ok := reflect.New(t).Interface().(error); ok {
help = "consider using cmpopts.EquateErrors to compare error values"
+ } else if t.Comparable() {
+ help = "consider using cmpopts.EquateComparable to compare comparable Go types"
}
} else {
// Unnamed type with unexported fields. Derive PkgPath from field.
@@ -254,7 +256,7 @@ const identRx = `[_\p{L}][_\p{L}\p{N}]*`
var identsRx = regexp.MustCompile(`^` + identRx + `(\.` + identRx + `)*$`)
-// Transformer returns an Option that applies a transformation function that
+// Transformer returns an [Option] that applies a transformation function that
// converts values of a certain type into that of another.
//
// The transformer f must be a function "func(T) R" that converts values of
@@ -265,13 +267,14 @@ var identsRx = regexp.MustCompile(`^` + identRx + `(\.` + identRx + `)*$`)
// same transform to the output of itself (e.g., in the case where the
// input and output types are the same), an implicit filter is added such that
// a transformer is applicable only if that exact transformer is not already
-// in the tail of the Path since the last non-Transform step.
+// in the tail of the [Path] since the last non-[Transform] step.
// For situations where the implicit filter is still insufficient,
-// consider using cmpopts.AcyclicTransformer, which adds a filter
-// to prevent the transformer from being recursively applied upon itself.
+// consider using [github.com/google/go-cmp/cmp/cmpopts.AcyclicTransformer],
+// which adds a filter to prevent the transformer from
+// being recursively applied upon itself.
//
-// The name is a user provided label that is used as the Transform.Name in the
-// transformation PathStep (and eventually shown in the Diff output).
+// The name is a user provided label that is used as the [Transform.Name] in the
+// transformation [PathStep] (and eventually shown in the [Diff] output).
// The name must be a valid identifier or qualified identifier in Go syntax.
// If empty, an arbitrary name is used.
func Transformer(name string, f interface{}) Option {
@@ -329,7 +332,7 @@ func (tr transformer) String() string {
return fmt.Sprintf("Transformer(%s, %s)", tr.name, function.NameOf(tr.fnc))
}
-// Comparer returns an Option that determines whether two values are equal
+// Comparer returns an [Option] that determines whether two values are equal
// to each other.
//
// The comparer f must be a function "func(T, T) bool" and is implicitly
@@ -377,35 +380,32 @@ func (cm comparer) String() string {
return fmt.Sprintf("Comparer(%s)", function.NameOf(cm.fnc))
}
-// Exporter returns an Option that specifies whether Equal is allowed to
+// Exporter returns an [Option] that specifies whether [Equal] is allowed to
// introspect into the unexported fields of certain struct types.
//
// Users of this option must understand that comparing on unexported fields
// from external packages is not safe since changes in the internal
-// implementation of some external package may cause the result of Equal
+// implementation of some external package may cause the result of [Equal]
// to unexpectedly change. However, it may be valid to use this option on types
// defined in an internal package where the semantic meaning of an unexported
// field is in the control of the user.
//
-// In many cases, a custom Comparer should be used instead that defines
+// In many cases, a custom [Comparer] should be used instead that defines
// equality as a function of the public API of a type rather than the underlying
// unexported implementation.
//
-// For example, the reflect.Type documentation defines equality to be determined
+// For example, the [reflect.Type] documentation defines equality to be determined
// by the == operator on the interface (essentially performing a shallow pointer
-// comparison) and most attempts to compare *regexp.Regexp types are interested
+// comparison) and most attempts to compare *[regexp.Regexp] types are interested
// in only checking that the regular expression strings are equal.
-// Both of these are accomplished using Comparers:
+// Both of these are accomplished using [Comparer] options:
//
// Comparer(func(x, y reflect.Type) bool { return x == y })
// Comparer(func(x, y *regexp.Regexp) bool { return x.String() == y.String() })
//
-// In other cases, the cmpopts.IgnoreUnexported option can be used to ignore
-// all unexported fields on specified struct types.
+// In other cases, the [github.com/google/go-cmp/cmp/cmpopts.IgnoreUnexported]
+// option can be used to ignore all unexported fields on specified struct types.
func Exporter(f func(reflect.Type) bool) Option {
- if !supportExporters {
- panic("Exporter is not supported on purego builds")
- }
return exporter(f)
}
@@ -415,10 +415,10 @@ func (exporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableO
panic("not implemented")
}
-// AllowUnexported returns an Options that allows Equal to forcibly introspect
+// AllowUnexported returns an [Option] that allows [Equal] to forcibly introspect
// unexported fields of the specified struct types.
//
-// See Exporter for the proper use of this option.
+// See [Exporter] for the proper use of this option.
func AllowUnexported(types ...interface{}) Option {
m := make(map[reflect.Type]bool)
for _, typ := range types {
@@ -432,7 +432,7 @@ func AllowUnexported(types ...interface{}) Option {
}
// Result represents the comparison result for a single node and
-// is provided by cmp when calling Report (see Reporter).
+// is provided by cmp when calling Report (see [Reporter]).
type Result struct {
_ [0]func() // Make Result incomparable
flags resultFlags
@@ -445,7 +445,7 @@ func (r Result) Equal() bool {
}
// ByIgnore reports whether the node is equal because it was ignored.
-// This never reports true if Equal reports false.
+// This never reports true if [Result.Equal] reports false.
func (r Result) ByIgnore() bool {
return r.flags&reportByIgnore != 0
}
@@ -455,7 +455,7 @@ func (r Result) ByMethod() bool {
return r.flags&reportByMethod != 0
}
-// ByFunc reports whether a Comparer function determined equality.
+// ByFunc reports whether a [Comparer] function determined equality.
func (r Result) ByFunc() bool {
return r.flags&reportByFunc != 0
}
@@ -478,7 +478,7 @@ const (
reportByCycle
)
-// Reporter is an Option that can be passed to Equal. When Equal traverses
+// Reporter is an [Option] that can be passed to [Equal]. When [Equal] traverses
// the value trees, it calls PushStep as it descends into each node in the
// tree and PopStep as it ascend out of the node. The leaves of the tree are
// either compared (determined to be equal or not equal) or ignored and reported
diff --git a/vendor/github.com/google/go-cmp/cmp/path.go b/vendor/github.com/google/go-cmp/cmp/path.go
index a0a588502ed..c3c1456423c 100644
--- a/vendor/github.com/google/go-cmp/cmp/path.go
+++ b/vendor/github.com/google/go-cmp/cmp/path.go
@@ -14,9 +14,9 @@ import (
"github.com/google/go-cmp/cmp/internal/value"
)
-// Path is a list of PathSteps describing the sequence of operations to get
+// Path is a list of [PathStep] describing the sequence of operations to get
// from some root type to the current position in the value tree.
-// The first Path element is always an operation-less PathStep that exists
+// The first Path element is always an operation-less [PathStep] that exists
// simply to identify the initial type.
//
// When traversing structs with embedded structs, the embedded struct will
@@ -29,8 +29,13 @@ type Path []PathStep
// a value's tree structure. Users of this package never need to implement
// these types as values of this type will be returned by this package.
//
-// Implementations of this interface are
-// StructField, SliceIndex, MapIndex, Indirect, TypeAssertion, and Transform.
+// Implementations of this interface:
+// - [StructField]
+// - [SliceIndex]
+// - [MapIndex]
+// - [Indirect]
+// - [TypeAssertion]
+// - [Transform]
type PathStep interface {
String() string
@@ -70,8 +75,9 @@ func (pa *Path) pop() {
*pa = (*pa)[:len(*pa)-1]
}
-// Last returns the last PathStep in the Path.
-// If the path is empty, this returns a non-nil PathStep that reports a nil Type.
+// Last returns the last [PathStep] in the Path.
+// If the path is empty, this returns a non-nil [PathStep]
+// that reports a nil [PathStep.Type].
func (pa Path) Last() PathStep {
return pa.Index(-1)
}
@@ -79,7 +85,8 @@ func (pa Path) Last() PathStep {
// Index returns the ith step in the Path and supports negative indexing.
// A negative index starts counting from the tail of the Path such that -1
// refers to the last step, -2 refers to the second-to-last step, and so on.
-// If index is invalid, this returns a non-nil PathStep that reports a nil Type.
+// If index is invalid, this returns a non-nil [PathStep]
+// that reports a nil [PathStep.Type].
func (pa Path) Index(i int) PathStep {
if i < 0 {
i = len(pa) + i
@@ -168,7 +175,8 @@ func (ps pathStep) String() string {
return fmt.Sprintf("{%s}", s)
}
-// StructField represents a struct field access on a field called Name.
+// StructField is a [PathStep] that represents a struct field access
+// on a field called [StructField.Name].
type StructField struct{ *structField }
type structField struct {
pathStep
@@ -204,10 +212,11 @@ func (sf StructField) String() string { return fmt.Sprintf(".%s", sf.name) }
func (sf StructField) Name() string { return sf.name }
// Index is the index of the field in the parent struct type.
-// See reflect.Type.Field.
+// See [reflect.Type.Field].
func (sf StructField) Index() int { return sf.idx }
-// SliceIndex is an index operation on a slice or array at some index Key.
+// SliceIndex is a [PathStep] that represents an index operation on
+// a slice or array at some index [SliceIndex.Key].
type SliceIndex struct{ *sliceIndex }
type sliceIndex struct {
pathStep
@@ -247,12 +256,12 @@ func (si SliceIndex) Key() int {
// all of the indexes to be shifted. If an index is -1, then that
// indicates that the element does not exist in the associated slice.
//
-// Key is guaranteed to return -1 if and only if the indexes returned
-// by SplitKeys are not the same. SplitKeys will never return -1 for
+// [SliceIndex.Key] is guaranteed to return -1 if and only if the indexes
+// returned by SplitKeys are not the same. SplitKeys will never return -1 for
// both indexes.
func (si SliceIndex) SplitKeys() (ix, iy int) { return si.xkey, si.ykey }
-// MapIndex is an index operation on a map at some index Key.
+// MapIndex is a [PathStep] that represents an index operation on a map at some index Key.
type MapIndex struct{ *mapIndex }
type mapIndex struct {
pathStep
@@ -266,7 +275,7 @@ func (mi MapIndex) String() string { return fmt.Sprintf("[%#v]",
// Key is the value of the map key.
func (mi MapIndex) Key() reflect.Value { return mi.key }
-// Indirect represents pointer indirection on the parent type.
+// Indirect is a [PathStep] that represents pointer indirection on the parent type.
type Indirect struct{ *indirect }
type indirect struct {
pathStep
@@ -276,7 +285,7 @@ func (in Indirect) Type() reflect.Type { return in.typ }
func (in Indirect) Values() (vx, vy reflect.Value) { return in.vx, in.vy }
func (in Indirect) String() string { return "*" }
-// TypeAssertion represents a type assertion on an interface.
+// TypeAssertion is a [PathStep] that represents a type assertion on an interface.
type TypeAssertion struct{ *typeAssertion }
type typeAssertion struct {
pathStep
@@ -286,7 +295,8 @@ func (ta TypeAssertion) Type() reflect.Type { return ta.typ }
func (ta TypeAssertion) Values() (vx, vy reflect.Value) { return ta.vx, ta.vy }
func (ta TypeAssertion) String() string { return fmt.Sprintf(".(%v)", value.TypeString(ta.typ, false)) }
-// Transform is a transformation from the parent type to the current type.
+// Transform is a [PathStep] that represents a transformation
+// from the parent type to the current type.
type Transform struct{ *transform }
type transform struct {
pathStep
@@ -297,13 +307,13 @@ func (tf Transform) Type() reflect.Type { return tf.typ }
func (tf Transform) Values() (vx, vy reflect.Value) { return tf.vx, tf.vy }
func (tf Transform) String() string { return fmt.Sprintf("%s()", tf.trans.name) }
-// Name is the name of the Transformer.
+// Name is the name of the [Transformer].
func (tf Transform) Name() string { return tf.trans.name }
// Func is the function pointer to the transformer function.
func (tf Transform) Func() reflect.Value { return tf.trans.fnc }
-// Option returns the originally constructed Transformer option.
+// Option returns the originally constructed [Transformer] option.
// The == operator can be used to detect the exact option used.
func (tf Transform) Option() Option { return tf.trans }
diff --git a/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/vendor/github.com/google/go-cmp/cmp/report_reflect.go
index 2ab41fad3fb..e39f42284ee 100644
--- a/vendor/github.com/google/go-cmp/cmp/report_reflect.go
+++ b/vendor/github.com/google/go-cmp/cmp/report_reflect.go
@@ -199,7 +199,7 @@ func (opts formatOptions) FormatValue(v reflect.Value, parentKind reflect.Kind,
break
}
sf := t.Field(i)
- if supportExporters && !isExported(sf.Name) {
+ if !isExported(sf.Name) {
vv = retrieveUnexportedField(v, sf, true)
}
s := opts.WithTypeMode(autoType).FormatValue(vv, t.Kind(), ptrs)
diff --git a/vendor/github.com/google/go-cmp/cmp/ya.make b/vendor/github.com/google/go-cmp/cmp/ya.make
index e2da0d2aacb..f8c1cd91b99 100644
--- a/vendor/github.com/google/go-cmp/cmp/ya.make
+++ b/vendor/github.com/google/go-cmp/cmp/ya.make
@@ -4,7 +4,7 @@ LICENSE(BSD-3-Clause)
SRCS(
compare.go
- export_unsafe.go
+ export.go
options.go
path.go
report.go
diff --git a/vendor/github.com/spf13/cobra/active_help.go b/vendor/github.com/spf13/cobra/active_help.go
index 2d0239437a8..5f965e057f2 100644
--- a/vendor/github.com/spf13/cobra/active_help.go
+++ b/vendor/github.com/spf13/cobra/active_help.go
@@ -17,6 +17,7 @@ package cobra
import (
"fmt"
"os"
+ "regexp"
"strings"
)
@@ -29,6 +30,8 @@ const (
activeHelpGlobalDisable = "0"
)
+var activeHelpEnvVarPrefixSubstRegexp = regexp.MustCompile(`[^A-Z0-9_]`)
+
// AppendActiveHelp adds the specified string to the specified array to be used as ActiveHelp.
// Such strings will be processed by the completion script and will be shown as ActiveHelp
// to the user.
@@ -42,7 +45,7 @@ func AppendActiveHelp(compArray []string, activeHelpStr string) []string {
// GetActiveHelpConfig returns the value of the ActiveHelp environment variable
// <PROGRAM>_ACTIVE_HELP where <PROGRAM> is the name of the root command in upper
-// case, with all - replaced by _.
+// case, with all non-ASCII-alphanumeric characters replaced by `_`.
// It will always return "0" if the global environment variable COBRA_ACTIVE_HELP
// is set to "0".
func GetActiveHelpConfig(cmd *Command) string {
@@ -55,9 +58,10 @@ func GetActiveHelpConfig(cmd *Command) string {
// activeHelpEnvVar returns the name of the program-specific ActiveHelp environment
// variable. It has the format <PROGRAM>_ACTIVE_HELP where <PROGRAM> is the name of the
-// root command in upper case, with all - replaced by _.
+// root command in upper case, with all non-ASCII-alphanumeric characters replaced by `_`.
func activeHelpEnvVar(name string) string {
// This format should not be changed: users will be using it explicitly.
activeHelpEnvVar := strings.ToUpper(fmt.Sprintf("%s%s", name, activeHelpEnvVarSuffix))
- return strings.ReplaceAll(activeHelpEnvVar, "-", "_")
+ activeHelpEnvVar = activeHelpEnvVarPrefixSubstRegexp.ReplaceAllString(activeHelpEnvVar, "_")
+ return activeHelpEnvVar
}
diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go
index 10c78847de2..8a531518409 100644
--- a/vendor/github.com/spf13/cobra/bash_completions.go
+++ b/vendor/github.com/spf13/cobra/bash_completions.go
@@ -85,7 +85,7 @@ __%[1]s_handle_go_custom_completion()
local out requestComp lastParam lastChar comp directive args
# Prepare the command to request completions for the program.
- # Calling ${words[0]} instead of directly %[1]s allows to handle aliases
+ # Calling ${words[0]} instead of directly %[1]s allows handling aliases
args=("${words[@]:1}")
# Disable ActiveHelp which is not supported for bash completion v1
requestComp="%[8]s=0 ${words[0]} %[2]s ${args[*]}"
diff --git a/vendor/github.com/spf13/cobra/bash_completionsV2.go b/vendor/github.com/spf13/cobra/bash_completionsV2.go
index 19b09560c1e..1cce5c329c2 100644
--- a/vendor/github.com/spf13/cobra/bash_completionsV2.go
+++ b/vendor/github.com/spf13/cobra/bash_completionsV2.go
@@ -57,7 +57,7 @@ __%[1]s_get_completion_results() {
local requestComp lastParam lastChar args
# Prepare the command to request completions for the program.
- # Calling ${words[0]} instead of directly %[1]s allows to handle aliases
+ # Calling ${words[0]} instead of directly %[1]s allows handling aliases
args=("${words[@]:1}")
requestComp="${words[0]} %[2]s ${args[*]}"
diff --git a/vendor/github.com/spf13/cobra/cobra.go b/vendor/github.com/spf13/cobra/cobra.go
index b07b44a0ce2..a6b160ce53c 100644
--- a/vendor/github.com/spf13/cobra/cobra.go
+++ b/vendor/github.com/spf13/cobra/cobra.go
@@ -43,12 +43,13 @@ var initializers []func()
var finalizers []func()
const (
- defaultPrefixMatching = false
- defaultCommandSorting = true
- defaultCaseInsensitive = false
+ defaultPrefixMatching = false
+ defaultCommandSorting = true
+ defaultCaseInsensitive = false
+ defaultTraverseRunHooks = false
)
-// EnablePrefixMatching allows to set automatic prefix matching. Automatic prefix matching can be a dangerous thing
+// EnablePrefixMatching allows setting automatic prefix matching. Automatic prefix matching can be a dangerous thing
// to automatically enable in CLI tools.
// Set this to true to enable it.
var EnablePrefixMatching = defaultPrefixMatching
@@ -60,6 +61,10 @@ var EnableCommandSorting = defaultCommandSorting
// EnableCaseInsensitive allows case-insensitive commands names. (case sensitive by default)
var EnableCaseInsensitive = defaultCaseInsensitive
+// EnableTraverseRunHooks executes persistent pre-run and post-run hooks from all parents.
+// By default this is disabled, which means only the first run hook to be found is executed.
+var EnableTraverseRunHooks = defaultTraverseRunHooks
+
// MousetrapHelpText enables an information splash screen on Windows
// if the CLI is started from explorer.exe.
// To disable the mousetrap, just set this variable to blank string ("").
diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go
index 01f7c6f1c5e..2fbe6c131a7 100644
--- a/vendor/github.com/spf13/cobra/command.go
+++ b/vendor/github.com/spf13/cobra/command.go
@@ -30,7 +30,10 @@ import (
flag "github.com/spf13/pflag"
)
-const FlagSetByCobraAnnotation = "cobra_annotation_flag_set_by_cobra"
+const (
+ FlagSetByCobraAnnotation = "cobra_annotation_flag_set_by_cobra"
+ CommandDisplayNameAnnotation = "cobra_annotation_command_display_name"
+)
// FParseErrWhitelist configures Flag parse errors to be ignored
type FParseErrWhitelist flag.ParseErrorsWhitelist
@@ -99,7 +102,7 @@ type Command struct {
Deprecated string
// Annotations are key/value pairs that can be used by applications to identify or
- // group commands.
+ // group commands or set special options.
Annotations map[string]string
// Version defines the version for this command. If this value is non-empty and the command does not
@@ -115,6 +118,8 @@ type Command struct {
// * PostRun()
// * PersistentPostRun()
// All functions get the same args, the arguments after the command name.
+ // The *PreRun and *PostRun functions will only be executed if the Run function of the current
+ // command has been declared.
//
// PersistentPreRun: children of this command will inherit and execute.
PersistentPreRun func(cmd *Command, args []string)
@@ -181,6 +186,9 @@ type Command struct {
// versionTemplate is the version template defined by user.
versionTemplate string
+ // errPrefix is the error message prefix defined by user.
+ errPrefix string
+
// inReader is a reader defined by the user that replaces stdin
inReader io.Reader
// outWriter is a writer defined by the user that replaces stdout
@@ -346,6 +354,11 @@ func (c *Command) SetVersionTemplate(s string) {
c.versionTemplate = s
}
+// SetErrPrefix sets error message prefix to be used. Application can use it to set custom prefix.
+func (c *Command) SetErrPrefix(s string) {
+ c.errPrefix = s
+}
+
// SetGlobalNormalizationFunc sets a normalization function to all flag sets and also to child commands.
// The user should not have a cyclic dependency on commands.
func (c *Command) SetGlobalNormalizationFunc(n func(f *flag.FlagSet, name string) flag.NormalizedName) {
@@ -595,6 +608,18 @@ func (c *Command) VersionTemplate() string {
`
}
+// ErrPrefix return error message prefix for the command
+func (c *Command) ErrPrefix() string {
+ if c.errPrefix != "" {
+ return c.errPrefix
+ }
+
+ if c.HasParent() {
+ return c.parent.ErrPrefix()
+ }
+ return "Error:"
+}
+
func hasNoOptDefVal(name string, fs *flag.FlagSet) bool {
flag := fs.Lookup(name)
if flag == nil {
@@ -752,7 +777,9 @@ func (c *Command) findNext(next string) *Command {
}
if len(matches) == 1 {
- return matches[0]
+ // Temporarily disable gosec G602, which produces a false positive.
+ // See https://github.com/securego/gosec/issues/1005.
+ return matches[0] // #nosec G602
}
return nil
@@ -910,15 +937,31 @@ func (c *Command) execute(a []string) (err error) {
return err
}
+ parents := make([]*Command, 0, 5)
for p := c; p != nil; p = p.Parent() {
+ if EnableTraverseRunHooks {
+ // When EnableTraverseRunHooks is set:
+ // - Execute all persistent pre-runs from the root parent till this command.
+ // - Execute all persistent post-runs from this command till the root parent.
+ parents = append([]*Command{p}, parents...)
+ } else {
+ // Otherwise, execute only the first found persistent hook.
+ parents = append(parents, p)
+ }
+ }
+ for _, p := range parents {
if p.PersistentPreRunE != nil {
if err := p.PersistentPreRunE(c, argWoFlags); err != nil {
return err
}
- break
+ if !EnableTraverseRunHooks {
+ break
+ }
} else if p.PersistentPreRun != nil {
p.PersistentPreRun(c, argWoFlags)
- break
+ if !EnableTraverseRunHooks {
+ break
+ }
}
}
if c.PreRunE != nil {
@@ -955,10 +998,14 @@ func (c *Command) execute(a []string) (err error) {
if err := p.PersistentPostRunE(c, argWoFlags); err != nil {
return err
}
- break
+ if !EnableTraverseRunHooks {
+ break
+ }
} else if p.PersistentPostRun != nil {
p.PersistentPostRun(c, argWoFlags)
- break
+ if !EnableTraverseRunHooks {
+ break
+ }
}
}
@@ -1048,7 +1095,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
c = cmd
}
if !c.SilenceErrors {
- c.PrintErrln("Error:", err.Error())
+ c.PrintErrln(c.ErrPrefix(), err.Error())
c.PrintErrf("Run '%v --help' for usage.\n", c.CommandPath())
}
return c, err
@@ -1077,7 +1124,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) {
// If root command has SilenceErrors flagged,
// all subcommands should respect it
if !cmd.SilenceErrors && !c.SilenceErrors {
- c.PrintErrln("Error:", err.Error())
+ c.PrintErrln(cmd.ErrPrefix(), err.Error())
}
// If root command has SilenceUsage flagged,
@@ -1380,6 +1427,9 @@ func (c *Command) CommandPath() string {
if c.HasParent() {
return c.Parent().CommandPath() + " " + c.Name()
}
+ if displayName, ok := c.Annotations[CommandDisplayNameAnnotation]; ok {
+ return displayName
+ }
return c.Name()
}
@@ -1402,6 +1452,7 @@ func (c *Command) UseLine() string {
// DebugFlags used to determine which flags have been assigned to which commands
// and which persist.
+// nolint:goconst
func (c *Command) DebugFlags() {
c.Println("DebugFlags called on", c.Name())
var debugflags func(*Command)
diff --git a/vendor/github.com/spf13/cobra/command_test.go b/vendor/github.com/spf13/cobra/command_test.go
index 0212f5ae943..9f686d65ece 100644
--- a/vendor/github.com/spf13/cobra/command_test.go
+++ b/vendor/github.com/spf13/cobra/command_test.go
@@ -366,6 +366,36 @@ func TestAliasPrefixMatching(t *testing.T) {
EnablePrefixMatching = defaultPrefixMatching
}
+// TestPlugin checks usage as plugin for another command such as kubectl. The
+// executable is `kubectl-plugin`, but we run it as `kubectl plugin`. The help
+// text should reflect the way we run the command.
+func TestPlugin(t *testing.T) {
+ rootCmd := &Command{
+ Use: "plugin",
+ Args: NoArgs,
+ Annotations: map[string]string{
+ CommandDisplayNameAnnotation: "kubectl plugin",
+ },
+ }
+
+ subCmd := &Command{Use: "sub [flags]", Args: NoArgs, Run: emptyRun}
+ rootCmd.AddCommand(subCmd)
+
+ rootHelp, err := executeCommand(rootCmd, "-h")
+ if err != nil {
+ t.Errorf("Unexpected error: %v", err)
+ }
+
+ checkStringContains(t, rootHelp, "kubectl plugin [command]")
+
+ childHelp, err := executeCommand(rootCmd, "sub", "-h")
+ if err != nil {
+ t.Errorf("Unexpected error: %v", err)
+ }
+
+ checkStringContains(t, childHelp, "kubectl plugin sub [flags]")
+}
+
// TestChildSameName checks the correct behaviour of cobra in cases,
// when an application with name "foo" and with subcommand "foo"
// is executed with args "foo foo".
@@ -438,7 +468,7 @@ func TestFlagLong(t *testing.T) {
output, err := executeCommand(c, "--intf=7", "--sf=abc", "one", "--", "two")
if output != "" {
- t.Errorf("Unexpected output: %v", err)
+ t.Errorf("Unexpected output: %v", output)
}
if err != nil {
t.Errorf("Unexpected error: %v", err)
@@ -475,7 +505,7 @@ func TestFlagShort(t *testing.T) {
output, err := executeCommand(c, "-i", "7", "-sabc", "one", "two")
if output != "" {
- t.Errorf("Unexpected output: %v", err)
+ t.Errorf("Unexpected output: %v", output)
}
if err != nil {
t.Errorf("Unexpected error: %v", err)
@@ -504,7 +534,7 @@ func TestChildFlag(t *testing.T) {
output, err := executeCommand(rootCmd, "child", "-i7")
if output != "" {
- t.Errorf("Unexpected output: %v", err)
+ t.Errorf("Unexpected output: %v", output)
}
if err != nil {
t.Errorf("Unexpected error: %v", err)
@@ -1099,6 +1129,39 @@ func TestShorthandVersionTemplate(t *testing.T) {
checkStringContains(t, output, "customized version: 1.0.0")
}
+func TestRootErrPrefixExecutedOnSubcommand(t *testing.T) {
+ rootCmd := &Command{Use: "root", Run: emptyRun}
+ rootCmd.SetErrPrefix("root error prefix:")
+ rootCmd.AddCommand(&Command{Use: "sub", Run: emptyRun})
+
+ output, err := executeCommand(rootCmd, "sub", "--unknown-flag")
+ if err == nil {
+ t.Errorf("Expected error")
+ }
+
+ checkStringContains(t, output, "root error prefix: unknown flag: --unknown-flag")
+}
+
+func TestRootAndSubErrPrefix(t *testing.T) {
+ rootCmd := &Command{Use: "root", Run: emptyRun}
+ subCmd := &Command{Use: "sub", Run: emptyRun}
+ rootCmd.AddCommand(subCmd)
+ rootCmd.SetErrPrefix("root error prefix:")
+ subCmd.SetErrPrefix("sub error prefix:")
+
+ if output, err := executeCommand(rootCmd, "--unknown-root-flag"); err == nil {
+ t.Errorf("Expected error")
+ } else {
+ checkStringContains(t, output, "root error prefix: unknown flag: --unknown-root-flag")
+ }
+
+ if output, err := executeCommand(rootCmd, "sub", "--unknown-sub-flag"); err == nil {
+ t.Errorf("Expected error")
+ } else {
+ checkStringContains(t, output, "sub error prefix: unknown flag: --unknown-sub-flag")
+ }
+}
+
func TestVersionFlagExecutedOnSubcommand(t *testing.T) {
rootCmd := &Command{Use: "root", Version: "1.0.0"}
rootCmd.AddCommand(&Command{Use: "sub", Run: emptyRun})
@@ -1497,57 +1560,73 @@ func TestHooks(t *testing.T) {
}
func TestPersistentHooks(t *testing.T) {
- var (
- parentPersPreArgs string
- parentPreArgs string
- parentRunArgs string
- parentPostArgs string
- parentPersPostArgs string
- )
+ EnableTraverseRunHooks = true
+ testPersistentHooks(t, []string{
+ "parent PersistentPreRun",
+ "child PersistentPreRun",
+ "child PreRun",
+ "child Run",
+ "child PostRun",
+ "child PersistentPostRun",
+ "parent PersistentPostRun",
+ })
- var (
- childPersPreArgs string
- childPreArgs string
- childRunArgs string
- childPostArgs string
- childPersPostArgs string
- )
+ EnableTraverseRunHooks = false
+ testPersistentHooks(t, []string{
+ "child PersistentPreRun",
+ "child PreRun",
+ "child Run",
+ "child PostRun",
+ "child PersistentPostRun",
+ })
+}
+
+func testPersistentHooks(t *testing.T, expectedHookRunOrder []string) {
+ var hookRunOrder []string
+
+ validateHook := func(args []string, hookName string) {
+ hookRunOrder = append(hookRunOrder, hookName)
+ got := strings.Join(args, " ")
+ if onetwo != got {
+ t.Errorf("Expected %s %q, got %q", hookName, onetwo, got)
+ }
+ }
parentCmd := &Command{
Use: "parent",
PersistentPreRun: func(_ *Command, args []string) {
- parentPersPreArgs = strings.Join(args, " ")
+ validateHook(args, "parent PersistentPreRun")
},
PreRun: func(_ *Command, args []string) {
- parentPreArgs = strings.Join(args, " ")
+ validateHook(args, "parent PreRun")
},
Run: func(_ *Command, args []string) {
- parentRunArgs = strings.Join(args, " ")
+ validateHook(args, "parent Run")
},
PostRun: func(_ *Command, args []string) {
- parentPostArgs = strings.Join(args, " ")
+ validateHook(args, "parent PostRun")
},
PersistentPostRun: func(_ *Command, args []string) {
- parentPersPostArgs = strings.Join(args, " ")
+ validateHook(args, "parent PersistentPostRun")
},
}
childCmd := &Command{
Use: "child",
PersistentPreRun: func(_ *Command, args []string) {
- childPersPreArgs = strings.Join(args, " ")
+ validateHook(args, "child PersistentPreRun")
},
PreRun: func(_ *Command, args []string) {
- childPreArgs = strings.Join(args, " ")
+ validateHook(args, "child PreRun")
},
Run: func(_ *Command, args []string) {
- childRunArgs = strings.Join(args, " ")
+ validateHook(args, "child Run")
},
PostRun: func(_ *Command, args []string) {
- childPostArgs = strings.Join(args, " ")
+ validateHook(args, "child PostRun")
},
PersistentPostRun: func(_ *Command, args []string) {
- childPersPostArgs = strings.Join(args, " ")
+ validateHook(args, "child PersistentPostRun")
},
}
parentCmd.AddCommand(childCmd)
@@ -1560,41 +1639,13 @@ func TestPersistentHooks(t *testing.T) {
t.Errorf("Unexpected error: %v", err)
}
- for _, v := range []struct {
- name string
- got string
- }{
- // TODO: currently PersistentPreRun* defined in parent does not
- // run if the matching child subcommand has PersistentPreRun.
- // If the behavior changes (https://github.com/spf13/cobra/issues/252)
- // this test must be fixed.
- {"parentPersPreArgs", parentPersPreArgs},
- {"parentPreArgs", parentPreArgs},
- {"parentRunArgs", parentRunArgs},
- {"parentPostArgs", parentPostArgs},
- // TODO: currently PersistentPostRun* defined in parent does not
- // run if the matching child subcommand has PersistentPostRun.
- // If the behavior changes (https://github.com/spf13/cobra/issues/252)
- // this test must be fixed.
- {"parentPersPostArgs", parentPersPostArgs},
- } {
- if v.got != "" {
- t.Errorf("Expected blank %s, got %q", v.name, v.got)
- }
- }
-
- for _, v := range []struct {
- name string
- got string
- }{
- {"childPersPreArgs", childPersPreArgs},
- {"childPreArgs", childPreArgs},
- {"childRunArgs", childRunArgs},
- {"childPostArgs", childPostArgs},
- {"childPersPostArgs", childPersPostArgs},
- } {
- if v.got != onetwo {
- t.Errorf("Expected %s %q, got %q", v.name, onetwo, v.got)
+ for idx, exp := range expectedHookRunOrder {
+ if len(hookRunOrder) > idx {
+ if act := hookRunOrder[idx]; act != exp {
+ t.Errorf("Expected %q at %d, got %q", exp, idx, act)
+ }
+ } else {
+ t.Errorf("Expected %q at %d, got nothing", exp, idx)
}
}
}
diff --git a/vendor/github.com/spf13/cobra/completions.go b/vendor/github.com/spf13/cobra/completions.go
index ee38c4d0b86..b60f6b20007 100644
--- a/vendor/github.com/spf13/cobra/completions.go
+++ b/vendor/github.com/spf13/cobra/completions.go
@@ -145,6 +145,20 @@ func (c *Command) RegisterFlagCompletionFunc(flagName string, f func(cmd *Comman
return nil
}
+// GetFlagCompletionFunc returns the completion function for the given flag of the command, if available.
+func (c *Command) GetFlagCompletionFunc(flagName string) (func(*Command, []string, string) ([]string, ShellCompDirective), bool) {
+ flag := c.Flag(flagName)
+ if flag == nil {
+ return nil, false
+ }
+
+ flagCompletionMutex.RLock()
+ defer flagCompletionMutex.RUnlock()
+
+ completionFunc, exists := flagCompletionFunctions[flag]
+ return completionFunc, exists
+}
+
// Returns a string listing the different directive enabled in the specified parameter
func (d ShellCompDirective) string() string {
var directives []string
@@ -283,9 +297,13 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi
// These flags are normally added when `execute()` is called on `finalCmd`,
// however, when doing completion, we don't call `finalCmd.execute()`.
- // Let's add the --help and --version flag ourselves.
- finalCmd.InitDefaultHelpFlag()
- finalCmd.InitDefaultVersionFlag()
+ // Let's add the --help and --version flag ourselves but only if the finalCmd
+ // has not disabled flag parsing; if flag parsing is disabled, it is up to the
+ // finalCmd itself to handle the completion of *all* flags.
+ if !finalCmd.DisableFlagParsing {
+ finalCmd.InitDefaultHelpFlag()
+ finalCmd.InitDefaultVersionFlag()
+ }
// Check if we are doing flag value completion before parsing the flags.
// This is important because if we are completing a flag value, we need to also
@@ -389,6 +407,11 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi
finalCmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) {
doCompleteFlags(flag)
})
+ // Try to complete non-inherited flags even if DisableFlagParsing==true.
+ // This allows programs to tell Cobra about flags for completion even
+ // if the actual parsing of flags is not done by Cobra.
+ // For instance, Helm uses this to provide flag name completion for
+ // some of its plugins.
finalCmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) {
doCompleteFlags(flag)
})
diff --git a/vendor/github.com/spf13/cobra/completions_test.go b/vendor/github.com/spf13/cobra/completions_test.go
index 0588da0f1f7..d5aee25015f 100644
--- a/vendor/github.com/spf13/cobra/completions_test.go
+++ b/vendor/github.com/spf13/cobra/completions_test.go
@@ -17,7 +17,9 @@ package cobra
import (
"bytes"
"context"
+ "fmt"
"strings"
+ "sync"
"testing"
)
@@ -2040,6 +2042,114 @@ func TestFlagCompletionWorksRootCommandAddedAfterFlags(t *testing.T) {
}
}
+func TestFlagCompletionForPersistentFlagsCalledFromSubCmd(t *testing.T) {
+ rootCmd := &Command{Use: "root", Run: emptyRun}
+ rootCmd.PersistentFlags().String("string", "", "test string flag")
+ _ = rootCmd.RegisterFlagCompletionFunc("string", func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"myval"}, ShellCompDirectiveDefault
+ })
+
+ childCmd := &Command{
+ Use: "child",
+ Run: emptyRun,
+ ValidArgsFunction: func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"--validarg", "test"}, ShellCompDirectiveDefault
+ },
+ }
+ childCmd.Flags().Bool("bool", false, "test bool flag")
+ rootCmd.AddCommand(childCmd)
+
+ // Test that persistent flag completion works for the subcmd
+ output, err := executeCommand(rootCmd, ShellCompRequestCmd, "child", "--string", "")
+ if err != nil {
+ t.Errorf("Unexpected error: %v", err)
+ }
+
+ expected := strings.Join([]string{
+ "myval",
+ ":0",
+ "Completion ended with directive: ShellCompDirectiveDefault", ""}, "\n")
+
+ if output != expected {
+ t.Errorf("expected: %q, got: %q", expected, output)
+ }
+}
+
+// This test tries to register flag completion concurrently to make sure the
+// code handles concurrency properly.
+// This was reported as a problem when tests are run concurrently:
+// https://github.com/spf13/cobra/issues/1320
+//
+// NOTE: this test can sometimes pass even if the code were to not handle
+// concurrency properly. This is not great but the important part is that
+// it should never fail. Therefore, if the tests fails sometimes, we will
+// still be able to know there is a problem.
+func TestFlagCompletionConcurrentRegistration(t *testing.T) {
+ rootCmd := &Command{Use: "root", Run: emptyRun}
+ const maxFlags = 50
+ for i := 1; i < maxFlags; i += 2 {
+ flagName := fmt.Sprintf("flag%d", i)
+ rootCmd.Flags().String(flagName, "", fmt.Sprintf("test %s flag on root", flagName))
+ }
+
+ childCmd := &Command{
+ Use: "child",
+ Run: emptyRun,
+ }
+ for i := 2; i <= maxFlags; i += 2 {
+ flagName := fmt.Sprintf("flag%d", i)
+ childCmd.Flags().String(flagName, "", fmt.Sprintf("test %s flag on child", flagName))
+ }
+
+ rootCmd.AddCommand(childCmd)
+
+ // Register completion in different threads to test concurrency.
+ var wg sync.WaitGroup
+ for i := 1; i <= maxFlags; i++ {
+ index := i
+ flagName := fmt.Sprintf("flag%d", i)
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ cmd := rootCmd
+ if index%2 == 0 {
+ cmd = childCmd
+ }
+ _ = cmd.RegisterFlagCompletionFunc(flagName, func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{fmt.Sprintf("flag%d", index)}, ShellCompDirectiveDefault
+ })
+ }()
+ }
+
+ wg.Wait()
+
+ // Test that flag completion works for each flag
+ for i := 1; i <= 6; i++ {
+ var output string
+ var err error
+ flagName := fmt.Sprintf("flag%d", i)
+
+ if i%2 == 1 {
+ output, err = executeCommand(rootCmd, ShellCompRequestCmd, "--"+flagName, "")
+ } else {
+ output, err = executeCommand(rootCmd, ShellCompRequestCmd, "child", "--"+flagName, "")
+ }
+
+ if err != nil {
+ t.Errorf("Unexpected error: %v", err)
+ }
+
+ expected := strings.Join([]string{
+ flagName,
+ ":0",
+ "Completion ended with directive: ShellCompDirectiveDefault", ""}, "\n")
+
+ if output != expected {
+ t.Errorf("expected: %q, got: %q", expected, output)
+ }
+ }
+}
+
func TestFlagCompletionInGoWithDesc(t *testing.T) {
rootCmd := &Command{
Use: "root",
@@ -2622,8 +2732,6 @@ func TestCompleteWithDisableFlagParsing(t *testing.T) {
expected := strings.Join([]string{
"--persistent",
"-p",
- "--help",
- "-h",
"--nonPersistent",
"-n",
"--flag",
@@ -2830,6 +2938,104 @@ func TestCompletionForGroupedFlags(t *testing.T) {
}
}
+func TestCompletionForOneRequiredGroupFlags(t *testing.T) {
+ getCmd := func() *Command {
+ rootCmd := &Command{
+ Use: "root",
+ Run: emptyRun,
+ }
+ childCmd := &Command{
+ Use: "child",
+ ValidArgsFunction: func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"subArg"}, ShellCompDirectiveNoFileComp
+ },
+ Run: emptyRun,
+ }
+ rootCmd.AddCommand(childCmd)
+
+ rootCmd.PersistentFlags().Int("ingroup1", -1, "ingroup1")
+ rootCmd.PersistentFlags().String("ingroup2", "", "ingroup2")
+
+ childCmd.Flags().Bool("ingroup3", false, "ingroup3")
+ childCmd.Flags().Bool("nogroup", false, "nogroup")
+
+ // Add flags to a group
+ childCmd.MarkFlagsOneRequired("ingroup1", "ingroup2", "ingroup3")
+
+ return rootCmd
+ }
+
+ // Each test case uses a unique command from the function above.
+ testcases := []struct {
+ desc string
+ args []string
+ expectedOutput string
+ }{
+ {
+ desc: "flags in group suggested without - prefix",
+ args: []string{"child", ""},
+ expectedOutput: strings.Join([]string{
+ "--ingroup1",
+ "--ingroup2",
+ "--ingroup3",
+ "subArg",
+ ":4",
+ "Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
+ },
+ {
+ desc: "flags in group suggested with - prefix",
+ args: []string{"child", "-"},
+ expectedOutput: strings.Join([]string{
+ "--ingroup1",
+ "--ingroup2",
+ "--ingroup3",
+ ":4",
+ "Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
+ },
+ {
+ desc: "when any flag in group present, other flags in group not suggested without - prefix",
+ args: []string{"child", "--ingroup2", "value", ""},
+ expectedOutput: strings.Join([]string{
+ "subArg",
+ ":4",
+ "Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
+ },
+ {
+ desc: "when all flags in group present, flags not suggested without - prefix",
+ args: []string{"child", "--ingroup1", "8", "--ingroup2", "value2", "--ingroup3", ""},
+ expectedOutput: strings.Join([]string{
+ "subArg",
+ ":4",
+ "Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
+ },
+ {
+ desc: "group ignored if some flags not applicable",
+ args: []string{"--ingroup2", "value", ""},
+ expectedOutput: strings.Join([]string{
+ "child",
+ "completion",
+ "help",
+ ":4",
+ "Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
+ },
+ }
+
+ for _, tc := range testcases {
+ t.Run(tc.desc, func(t *testing.T) {
+ c := getCmd()
+ args := []string{ShellCompNoDescRequestCmd}
+ args = append(args, tc.args...)
+ output, err := executeCommand(c, args...)
+ switch {
+ case err == nil && output != tc.expectedOutput:
+ t.Errorf("expected: %q, got: %q", tc.expectedOutput, output)
+ case err != nil:
+ t.Errorf("Unexpected error %q", err)
+ }
+ })
+ }
+}
+
func TestCompletionForMutuallyExclusiveFlags(t *testing.T) {
getCmd := func() *Command {
rootCmd := &Command{
@@ -2955,8 +3161,26 @@ func TestCompletionCobraFlags(t *testing.T) {
return []string{"extra3"}, ShellCompDirectiveNoFileComp
},
}
+ childCmd4 := &Command{
+ Use: "child4",
+ Version: "1.1.1",
+ Run: emptyRun,
+ ValidArgsFunction: func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"extra4"}, ShellCompDirectiveNoFileComp
+ },
+ DisableFlagParsing: true,
+ }
+ childCmd5 := &Command{
+ Use: "child5",
+ Version: "1.1.1",
+ Run: emptyRun,
+ ValidArgsFunction: func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"extra5"}, ShellCompDirectiveNoFileComp
+ },
+ DisableFlagParsing: true,
+ }
- rootCmd.AddCommand(childCmd, childCmd2, childCmd3)
+ rootCmd.AddCommand(childCmd, childCmd2, childCmd3, childCmd4, childCmd5)
_ = childCmd.Flags().Bool("bool", false, "A bool flag")
_ = childCmd.MarkFlagRequired("bool")
@@ -2968,6 +3192,10 @@ func TestCompletionCobraFlags(t *testing.T) {
// Have a command that only adds its own -v flag
_ = childCmd3.Flags().BoolP("verbose", "v", false, "Not a version flag")
+ // Have a command that DisablesFlagParsing but that also adds its own help and version flags
+ _ = childCmd5.Flags().BoolP("help", "h", false, "My own help")
+ _ = childCmd5.Flags().BoolP("version", "v", false, "My own version")
+
return rootCmd
}
@@ -3098,6 +3326,26 @@ func TestCompletionCobraFlags(t *testing.T) {
":4",
"Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
},
+ {
+ desc: "no completion for --help/-h and --version/-v flags when DisableFlagParsing=true",
+ args: []string{"child4", "-"},
+ expectedOutput: strings.Join([]string{
+ "extra4",
+ ":4",
+ "Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
+ },
+ {
+ desc: "completions for program-defined --help/-h and --version/-v flags even when DisableFlagParsing=true",
+ args: []string{"child5", "-"},
+ expectedOutput: strings.Join([]string{
+ "--help",
+ "-h",
+ "--version",
+ "-v",
+ "extra5",
+ ":4",
+ "Completion ended with directive: ShellCompDirectiveNoFileComp", ""}, "\n"),
+ },
}
for _, tc := range testcases {
@@ -3179,3 +3427,93 @@ Completion ended with directive: ShellCompDirectiveNoFileComp
})
}
}
+
+func TestGetFlagCompletion(t *testing.T) {
+ rootCmd := &Command{Use: "root", Run: emptyRun}
+
+ rootCmd.Flags().String("rootflag", "", "root flag")
+ _ = rootCmd.RegisterFlagCompletionFunc("rootflag", func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"rootvalue"}, ShellCompDirectiveKeepOrder
+ })
+
+ rootCmd.PersistentFlags().String("persistentflag", "", "persistent flag")
+ _ = rootCmd.RegisterFlagCompletionFunc("persistentflag", func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"persistentvalue"}, ShellCompDirectiveDefault
+ })
+
+ childCmd := &Command{Use: "child", Run: emptyRun}
+
+ childCmd.Flags().String("childflag", "", "child flag")
+ _ = childCmd.RegisterFlagCompletionFunc("childflag", func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) {
+ return []string{"childvalue"}, ShellCompDirectiveNoFileComp | ShellCompDirectiveNoSpace
+ })
+
+ rootCmd.AddCommand(childCmd)
+
+ testcases := []struct {
+ desc string
+ cmd *Command
+ flagName string
+ exists bool
+ comps []string
+ directive ShellCompDirective
+ }{
+ {
+ desc: "get flag completion function for command",
+ cmd: rootCmd,
+ flagName: "rootflag",
+ exists: true,
+ comps: []string{"rootvalue"},
+ directive: ShellCompDirectiveKeepOrder,
+ },
+ {
+ desc: "get persistent flag completion function for command",
+ cmd: rootCmd,
+ flagName: "persistentflag",
+ exists: true,
+ comps: []string{"persistentvalue"},
+ directive: ShellCompDirectiveDefault,
+ },
+ {
+ desc: "get flag completion function for child command",
+ cmd: childCmd,
+ flagName: "childflag",
+ exists: true,
+ comps: []string{"childvalue"},
+ directive: ShellCompDirectiveNoFileComp | ShellCompDirectiveNoSpace,
+ },
+ {
+ desc: "get persistent flag completion function for child command",
+ cmd: childCmd,
+ flagName: "persistentflag",
+ exists: true,
+ comps: []string{"persistentvalue"},
+ directive: ShellCompDirectiveDefault,
+ },
+ {
+ desc: "cannot get flag completion function for local parent flag",
+ cmd: childCmd,
+ flagName: "rootflag",
+ exists: false,
+ },
+ }
+
+ for _, tc := range testcases {
+ t.Run(tc.desc, func(t *testing.T) {
+ compFunc, exists := tc.cmd.GetFlagCompletionFunc(tc.flagName)
+ if tc.exists != exists {
+ t.Errorf("Unexpected result looking for flag completion function")
+ }
+
+ if exists {
+ comps, directive := compFunc(tc.cmd, []string{}, "")
+ if strings.Join(tc.comps, " ") != strings.Join(comps, " ") {
+ t.Errorf("Unexpected completions %q", comps)
+ }
+ if tc.directive != directive {
+ t.Errorf("Unexpected directive %q", directive)
+ }
+ }
+ })
+ }
+}
diff --git a/vendor/github.com/spf13/cobra/fish_completions.go b/vendor/github.com/spf13/cobra/fish_completions.go
index 12ca0d2b11c..12d61b69111 100644
--- a/vendor/github.com/spf13/cobra/fish_completions.go
+++ b/vendor/github.com/spf13/cobra/fish_completions.go
@@ -113,7 +113,7 @@ function __%[1]s_clear_perform_completion_once_result
__%[1]s_debug ""
__%[1]s_debug "========= clearing previously set __%[1]s_perform_completion_once_result variable =========="
set --erase __%[1]s_perform_completion_once_result
- __%[1]s_debug "Succesfully erased the variable __%[1]s_perform_completion_once_result"
+ __%[1]s_debug "Successfully erased the variable __%[1]s_perform_completion_once_result"
end
function __%[1]s_requires_order_preservation
diff --git a/vendor/github.com/spf13/cobra/fish_completions_test.go b/vendor/github.com/spf13/cobra/fish_completions_test.go
index 10d97d85441..ce2a531dc38 100644
--- a/vendor/github.com/spf13/cobra/fish_completions_test.go
+++ b/vendor/github.com/spf13/cobra/fish_completions_test.go
@@ -16,9 +16,10 @@ package cobra
import (
"bytes"
+ "errors"
"fmt"
- "log"
"os"
+ "path/filepath"
"testing"
)
@@ -98,12 +99,12 @@ func TestFishCompletionNoActiveHelp(t *testing.T) {
}
func TestGenFishCompletionFile(t *testing.T) {
- err := os.Mkdir("./tmp", 0755)
+ tmpFile, err := os.CreateTemp("", "cobra-test")
if err != nil {
- log.Fatal(err.Error())
+ t.Fatal(err.Error())
}
- defer os.RemoveAll("./tmp")
+ defer os.Remove(tmpFile.Name())
rootCmd := &Command{Use: "root", Args: NoArgs, Run: emptyRun}
child := &Command{
@@ -113,18 +114,18 @@ func TestGenFishCompletionFile(t *testing.T) {
}
rootCmd.AddCommand(child)
- assertNoErr(t, rootCmd.GenFishCompletionFile("./tmp/test", false))
+ assertNoErr(t, rootCmd.GenFishCompletionFile(tmpFile.Name(), false))
}
func TestFailGenFishCompletionFile(t *testing.T) {
- err := os.Mkdir("./tmp", 0755)
+ tmpDir, err := os.MkdirTemp("", "cobra-test")
if err != nil {
- log.Fatal(err.Error())
+ t.Fatal(err.Error())
}
- defer os.RemoveAll("./tmp")
+ defer os.RemoveAll(tmpDir)
- f, _ := os.OpenFile("./tmp/test", os.O_CREATE, 0400)
+ f, _ := os.OpenFile(filepath.Join(tmpDir, "test"), os.O_CREATE, 0400)
defer f.Close()
rootCmd := &Command{Use: "root", Args: NoArgs, Run: emptyRun}
@@ -135,18 +136,8 @@ func TestFailGenFishCompletionFile(t *testing.T) {
}
rootCmd.AddCommand(child)
- got := rootCmd.GenFishCompletionFile("./tmp/test", false)
- if got == nil {
- t.Error("should raise permission denied error")
- }
-
- if os.Getenv("MSYSTEM") == "MINGW64" {
- if got.Error() != "open ./tmp/test: Access is denied." {
- t.Errorf("got: %s, want: %s", got.Error(), "open ./tmp/test: Access is denied.")
- }
- } else {
- if got.Error() != "open ./tmp/test: permission denied" {
- t.Errorf("got: %s, want: %s", got.Error(), "open ./tmp/test: permission denied")
- }
+ got := rootCmd.GenFishCompletionFile(f.Name(), false)
+ if !errors.Is(got, os.ErrPermission) {
+ t.Errorf("got: %s, want: %s", got.Error(), os.ErrPermission.Error())
}
}
diff --git a/vendor/github.com/spf13/cobra/flag_groups.go b/vendor/github.com/spf13/cobra/flag_groups.go
index b35fde15548..0671ec5f202 100644
--- a/vendor/github.com/spf13/cobra/flag_groups.go
+++ b/vendor/github.com/spf13/cobra/flag_groups.go
@@ -24,6 +24,7 @@ import (
const (
requiredAsGroup = "cobra_annotation_required_if_others_set"
+ oneRequired = "cobra_annotation_one_required"
mutuallyExclusive = "cobra_annotation_mutually_exclusive"
)
@@ -43,6 +44,22 @@ func (c *Command) MarkFlagsRequiredTogether(flagNames ...string) {
}
}
+// MarkFlagsOneRequired marks the given flags with annotations so that Cobra errors
+// if the command is invoked without at least one flag from the given set of flags.
+func (c *Command) MarkFlagsOneRequired(flagNames ...string) {
+ c.mergePersistentFlags()
+ for _, v := range flagNames {
+ f := c.Flags().Lookup(v)
+ if f == nil {
+ panic(fmt.Sprintf("Failed to find flag %q and mark it as being in a one-required flag group", v))
+ }
+ if err := c.Flags().SetAnnotation(v, oneRequired, append(f.Annotations[oneRequired], strings.Join(flagNames, " "))); err != nil {
+ // Only errs if the flag isn't found.
+ panic(err)
+ }
+ }
+}
+
// MarkFlagsMutuallyExclusive marks the given flags with annotations so that Cobra errors
// if the command is invoked with more than one flag from the given set of flags.
func (c *Command) MarkFlagsMutuallyExclusive(flagNames ...string) {
@@ -59,7 +76,7 @@ func (c *Command) MarkFlagsMutuallyExclusive(flagNames ...string) {
}
}
-// ValidateFlagGroups validates the mutuallyExclusive/requiredAsGroup logic and returns the
+// ValidateFlagGroups validates the mutuallyExclusive/oneRequired/requiredAsGroup logic and returns the
// first error encountered.
func (c *Command) ValidateFlagGroups() error {
if c.DisableFlagParsing {
@@ -71,15 +88,20 @@ func (c *Command) ValidateFlagGroups() error {
// groupStatus format is the list of flags as a unique ID,
// then a map of each flag name and whether it is set or not.
groupStatus := map[string]map[string]bool{}
+ oneRequiredGroupStatus := map[string]map[string]bool{}
mutuallyExclusiveGroupStatus := map[string]map[string]bool{}
flags.VisitAll(func(pflag *flag.Flag) {
processFlagForGroupAnnotation(flags, pflag, requiredAsGroup, groupStatus)
+ processFlagForGroupAnnotation(flags, pflag, oneRequired, oneRequiredGroupStatus)
processFlagForGroupAnnotation(flags, pflag, mutuallyExclusive, mutuallyExclusiveGroupStatus)
})
if err := validateRequiredFlagGroups(groupStatus); err != nil {
return err
}
+ if err := validateOneRequiredFlagGroups(oneRequiredGroupStatus); err != nil {
+ return err
+ }
if err := validateExclusiveFlagGroups(mutuallyExclusiveGroupStatus); err != nil {
return err
}
@@ -142,6 +164,27 @@ func validateRequiredFlagGroups(data map[string]map[string]bool) error {
return nil
}
+func validateOneRequiredFlagGroups(data map[string]map[string]bool) error {
+ keys := sortedKeys(data)
+ for _, flagList := range keys {
+ flagnameAndStatus := data[flagList]
+ var set []string
+ for flagname, isSet := range flagnameAndStatus {
+ if isSet {
+ set = append(set, flagname)
+ }
+ }
+ if len(set) >= 1 {
+ continue
+ }
+
+ // Sort values, so they can be tested/scripted against consistently.
+ sort.Strings(set)
+ return fmt.Errorf("at least one of the flags in the group [%v] is required", flagList)
+ }
+ return nil
+}
+
func validateExclusiveFlagGroups(data map[string]map[string]bool) error {
keys := sortedKeys(data)
for _, flagList := range keys {
@@ -176,6 +219,7 @@ func sortedKeys(m map[string]map[string]bool) []string {
// enforceFlagGroupsForCompletion will do the following:
// - when a flag in a group is present, other flags in the group will be marked required
+// - when none of the flags in a one-required group are present, all flags in the group will be marked required
// - when a flag in a mutually exclusive group is present, other flags in the group will be marked as hidden
// This allows the standard completion logic to behave appropriately for flag groups
func (c *Command) enforceFlagGroupsForCompletion() {
@@ -185,9 +229,11 @@ func (c *Command) enforceFlagGroupsForCompletion() {
flags := c.Flags()
groupStatus := map[string]map[string]bool{}
+ oneRequiredGroupStatus := map[string]map[string]bool{}
mutuallyExclusiveGroupStatus := map[string]map[string]bool{}
c.Flags().VisitAll(func(pflag *flag.Flag) {
processFlagForGroupAnnotation(flags, pflag, requiredAsGroup, groupStatus)
+ processFlagForGroupAnnotation(flags, pflag, oneRequired, oneRequiredGroupStatus)
processFlagForGroupAnnotation(flags, pflag, mutuallyExclusive, mutuallyExclusiveGroupStatus)
})
@@ -204,6 +250,26 @@ func (c *Command) enforceFlagGroupsForCompletion() {
}
}
+ // If none of the flags of a one-required group are present, we make all the flags
+ // of that group required so that the shell completion suggests them automatically
+ for flagList, flagnameAndStatus := range oneRequiredGroupStatus {
+ set := 0
+
+ for _, isSet := range flagnameAndStatus {
+ if isSet {
+ set++
+ }
+ }
+
+ // None of the flags of the group are set, mark all flags in the group
+ // as required
+ if set == 0 {
+ for _, fName := range strings.Split(flagList, " ") {
+ _ = c.MarkFlagRequired(fName)
+ }
+ }
+ }
+
// If a flag that is mutually exclusive to others is present, we hide the other
// flags of that group so the shell completion does not suggest them
for flagList, flagnameAndStatus := range mutuallyExclusiveGroupStatus {
diff --git a/vendor/github.com/spf13/cobra/flag_groups_test.go b/vendor/github.com/spf13/cobra/flag_groups_test.go
index bf988d734e7..cffa85525b2 100644
--- a/vendor/github.com/spf13/cobra/flag_groups_test.go
+++ b/vendor/github.com/spf13/cobra/flag_groups_test.go
@@ -43,13 +43,15 @@ func TestValidateFlagGroups(t *testing.T) {
// Each test case uses a unique command from the function above.
testcases := []struct {
- desc string
- flagGroupsRequired []string
- flagGroupsExclusive []string
- subCmdFlagGroupsRequired []string
- subCmdFlagGroupsExclusive []string
- args []string
- expectErr string
+ desc string
+ flagGroupsRequired []string
+ flagGroupsOneRequired []string
+ flagGroupsExclusive []string
+ subCmdFlagGroupsRequired []string
+ subCmdFlagGroupsOneRequired []string
+ subCmdFlagGroupsExclusive []string
+ args []string
+ expectErr string
}{
{
desc: "No flags no problem",
@@ -63,6 +65,11 @@ func TestValidateFlagGroups(t *testing.T) {
args: []string{"--a=foo"},
expectErr: "if any flags in the group [a b c] are set they must all be set; missing [b c]",
}, {
+ desc: "One-required flag group not satisfied",
+ flagGroupsOneRequired: []string{"a b"},
+ args: []string{"--c=foo"},
+ expectErr: "at least one of the flags in the group [a b] is required",
+ }, {
desc: "Exclusive flag group not satisfied",
flagGroupsExclusive: []string{"a b c"},
args: []string{"--a=foo", "--b=foo"},
@@ -73,6 +80,11 @@ func TestValidateFlagGroups(t *testing.T) {
args: []string{"--c=foo", "--d=foo"},
expectErr: `if any flags in the group [a b c] are set they must all be set; missing [a b]`,
}, {
+ desc: "Multiple one-required flag group not satisfied returns first error",
+ flagGroupsOneRequired: []string{"a b", "d e"},
+ args: []string{"--c=foo", "--f=foo"},
+ expectErr: `at least one of the flags in the group [a b] is required`,
+ }, {
desc: "Multiple exclusive flag group not satisfied returns first error",
flagGroupsExclusive: []string{"a b c", "a d"},
args: []string{"--a=foo", "--c=foo", "--d=foo"},
@@ -83,32 +95,57 @@ func TestValidateFlagGroups(t *testing.T) {
args: []string{"--a=foo"},
expectErr: `if any flags in the group [a b] are set they must all be set; missing [b]`,
}, {
+ desc: "Validation of one-required groups occurs on groups in sorted order",
+ flagGroupsOneRequired: []string{"d e", "a b", "f g"},
+ args: []string{"--c=foo"},
+ expectErr: `at least one of the flags in the group [a b] is required`,
+ }, {
desc: "Validation of exclusive groups occurs on groups in sorted order",
flagGroupsExclusive: []string{"a d", "a b", "a c"},
args: []string{"--a=foo", "--b=foo", "--c=foo"},
expectErr: `if any flags in the group [a b] are set none of the others can be; [a b] were all set`,
}, {
- desc: "Persistent flags utilize both features and can fail required groups",
+ desc: "Persistent flags utilize required and exclusive groups and can fail required groups",
flagGroupsRequired: []string{"a e", "e f"},
flagGroupsExclusive: []string{"f g"},
args: []string{"--a=foo", "--f=foo", "--g=foo"},
expectErr: `if any flags in the group [a e] are set they must all be set; missing [e]`,
}, {
- desc: "Persistent flags utilize both features and can fail mutually exclusive groups",
+ desc: "Persistent flags utilize one-required and exclusive groups and can fail one-required groups",
+ flagGroupsOneRequired: []string{"a b", "e f"},
+ flagGroupsExclusive: []string{"e f"},
+ args: []string{"--e=foo"},
+ expectErr: `at least one of the flags in the group [a b] is required`,
+ }, {
+ desc: "Persistent flags utilize required and exclusive groups and can fail mutually exclusive groups",
flagGroupsRequired: []string{"a e", "e f"},
flagGroupsExclusive: []string{"f g"},
args: []string{"--a=foo", "--e=foo", "--f=foo", "--g=foo"},
expectErr: `if any flags in the group [f g] are set none of the others can be; [f g] were all set`,
}, {
- desc: "Persistent flags utilize both features and can pass",
+ desc: "Persistent flags utilize required and exclusive groups and can pass",
flagGroupsRequired: []string{"a e", "e f"},
flagGroupsExclusive: []string{"f g"},
args: []string{"--a=foo", "--e=foo", "--f=foo"},
}, {
+ desc: "Persistent flags utilize one-required and exclusive groups and can pass",
+ flagGroupsOneRequired: []string{"a e", "e f"},
+ flagGroupsExclusive: []string{"f g"},
+ args: []string{"--a=foo", "--e=foo", "--f=foo"},
+ }, {
desc: "Subcmds can use required groups using inherited flags",
subCmdFlagGroupsRequired: []string{"e subonly"},
args: []string{"subcmd", "--e=foo", "--subonly=foo"},
}, {
+ desc: "Subcmds can use one-required groups using inherited flags",
+ subCmdFlagGroupsOneRequired: []string{"e subonly"},
+ args: []string{"subcmd", "--e=foo", "--subonly=foo"},
+ }, {
+ desc: "Subcmds can use one-required groups using inherited flags and fail one-required groups",
+ subCmdFlagGroupsOneRequired: []string{"e subonly"},
+ args: []string{"subcmd"},
+ expectErr: "at least one of the flags in the group [e subonly] is required",
+ }, {
desc: "Subcmds can use exclusive groups using inherited flags",
subCmdFlagGroupsExclusive: []string{"e subonly"},
args: []string{"subcmd", "--e=foo", "--subonly=foo"},
@@ -130,12 +167,18 @@ func TestValidateFlagGroups(t *testing.T) {
for _, flagGroup := range tc.flagGroupsRequired {
c.MarkFlagsRequiredTogether(strings.Split(flagGroup, " ")...)
}
+ for _, flagGroup := range tc.flagGroupsOneRequired {
+ c.MarkFlagsOneRequired(strings.Split(flagGroup, " ")...)
+ }
for _, flagGroup := range tc.flagGroupsExclusive {
c.MarkFlagsMutuallyExclusive(strings.Split(flagGroup, " ")...)
}
for _, flagGroup := range tc.subCmdFlagGroupsRequired {
sub.MarkFlagsRequiredTogether(strings.Split(flagGroup, " ")...)
}
+ for _, flagGroup := range tc.subCmdFlagGroupsOneRequired {
+ sub.MarkFlagsOneRequired(strings.Split(flagGroup, " ")...)
+ }
for _, flagGroup := range tc.subCmdFlagGroupsExclusive {
sub.MarkFlagsMutuallyExclusive(strings.Split(flagGroup, " ")...)
}
diff --git a/vendor/github.com/spf13/cobra/powershell_completions.go b/vendor/github.com/spf13/cobra/powershell_completions.go
index 177d2755f21..55195193944 100644
--- a/vendor/github.com/spf13/cobra/powershell_completions.go
+++ b/vendor/github.com/spf13/cobra/powershell_completions.go
@@ -47,7 +47,7 @@ filter __%[1]s_escapeStringWithSpecialChars {
`+" $_ -replace '\\s|#|@|\\$|;|,|''|\\{|\\}|\\(|\\)|\"|`|\\||<|>|&','`$&'"+`
}
-[scriptblock]$__%[2]sCompleterBlock = {
+[scriptblock]${__%[2]sCompleterBlock} = {
param(
$WordToComplete,
$CommandAst,
@@ -122,7 +122,7 @@ filter __%[1]s_escapeStringWithSpecialChars {
__%[1]s_debug "Calling $RequestComp"
# First disable ActiveHelp which is not supported for Powershell
- $env:%[10]s=0
+ ${env:%[10]s}=0
#call the command store the output in $out and redirect stderr and stdout to null
# $Out is an array contains each line per element
@@ -279,7 +279,7 @@ filter __%[1]s_escapeStringWithSpecialChars {
}
}
-Register-ArgumentCompleter -CommandName '%[1]s' -ScriptBlock $__%[2]sCompleterBlock
+Register-ArgumentCompleter -CommandName '%[1]s' -ScriptBlock ${__%[2]sCompleterBlock}
`, name, nameForVar, compCmd,
ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder, activeHelpEnvVar(name)))
diff --git a/vendor/github.com/spf13/cobra/powershell_completions_test.go b/vendor/github.com/spf13/cobra/powershell_completions_test.go
index b40921341d8..603b50c973b 100644
--- a/vendor/github.com/spf13/cobra/powershell_completions_test.go
+++ b/vendor/github.com/spf13/cobra/powershell_completions_test.go
@@ -29,5 +29,5 @@ func TestPwshCompletionNoActiveHelp(t *testing.T) {
// check that active help is being disabled
activeHelpVar := activeHelpEnvVar(c.Name())
- check(t, output, fmt.Sprintf("%s=0", activeHelpVar))
+ check(t, output, fmt.Sprintf("${env:%s}=0", activeHelpVar))
}
diff --git a/vendor/github.com/spf13/cobra/ya.make b/vendor/github.com/spf13/cobra/ya.make
index 8f9487ea09e..4242c95a675 100644
--- a/vendor/github.com/spf13/cobra/ya.make
+++ b/vendor/github.com/spf13/cobra/ya.make
@@ -32,15 +32,21 @@ GO_TEST_SRCS(
)
IF (OS_LINUX)
- SRCS(command_notwin.go)
+ SRCS(
+ command_notwin.go
+ )
ENDIF()
IF (OS_DARWIN)
- SRCS(command_notwin.go)
+ SRCS(
+ command_notwin.go
+ )
ENDIF()
IF (OS_WINDOWS)
- SRCS(command_win.go)
+ SRCS(
+ command_win.go
+ )
ENDIF()
END()