Upgrade dependent version: helm.sh/helm/v3 v3.9.0 -> v3.10.3 (#5420)
Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io> Signed-off-by: hongzhouzi <hongzhouzi@kubesphere.io>
This commit is contained in:
141
vendor/helm.sh/helm/v3/pkg/strvals/parser.go
vendored
141
vendor/helm.sh/helm/v3/pkg/strvals/parser.go
vendored
@@ -17,10 +17,13 @@ package strvals
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"sigs.k8s.io/yaml"
|
||||
@@ -29,6 +32,14 @@ import (
|
||||
// ErrNotList indicates that a non-list was treated as a list.
|
||||
var ErrNotList = errors.New("not a list")
|
||||
|
||||
// MaxIndex is the maximum index that will be allowed by setIndex.
|
||||
// The default value 65536 = 1024 * 64
|
||||
var MaxIndex = 65536
|
||||
|
||||
// MaxNestedNameLevel is the maximum level of nesting for a value name that
|
||||
// will be allowed.
|
||||
var MaxNestedNameLevel = 30
|
||||
|
||||
// ToYAML takes a string of arguments and converts to a YAML document.
|
||||
func ToYAML(s string) (string, error) {
|
||||
m, err := Parse(s)
|
||||
@@ -94,6 +105,18 @@ func ParseIntoString(s string, dest map[string]interface{}) error {
|
||||
return t.parse()
|
||||
}
|
||||
|
||||
// ParseJSON parses a string with format key1=val1, key2=val2, ...
|
||||
// where values are json strings (null, or scalars, or arrays, or objects).
|
||||
// An empty val is treated as null.
|
||||
//
|
||||
// If a key exists in dest, the new value overwrites the dest version.
|
||||
//
|
||||
func ParseJSON(s string, dest map[string]interface{}) error {
|
||||
scanner := bytes.NewBufferString(s)
|
||||
t := newJSONParser(scanner, dest)
|
||||
return t.parse()
|
||||
}
|
||||
|
||||
// ParseIntoFile parses a filevals line and merges the result into dest.
|
||||
//
|
||||
// This method always returns a string as the value.
|
||||
@@ -113,9 +136,10 @@ type RunesValueReader func([]rune) (interface{}, error)
|
||||
// where sc is the source of the original data being parsed
|
||||
// where data is the final parsed data from the parses with correct types
|
||||
type parser struct {
|
||||
sc *bytes.Buffer
|
||||
data map[string]interface{}
|
||||
reader RunesValueReader
|
||||
sc *bytes.Buffer
|
||||
data map[string]interface{}
|
||||
reader RunesValueReader
|
||||
isjsonval bool
|
||||
}
|
||||
|
||||
func newParser(sc *bytes.Buffer, data map[string]interface{}, stringBool bool) *parser {
|
||||
@@ -125,13 +149,17 @@ func newParser(sc *bytes.Buffer, data map[string]interface{}, stringBool bool) *
|
||||
return &parser{sc: sc, data: data, reader: stringConverter}
|
||||
}
|
||||
|
||||
func newJSONParser(sc *bytes.Buffer, data map[string]interface{}) *parser {
|
||||
return &parser{sc: sc, data: data, reader: nil, isjsonval: true}
|
||||
}
|
||||
|
||||
func newFileParser(sc *bytes.Buffer, data map[string]interface{}, reader RunesValueReader) *parser {
|
||||
return &parser{sc: sc, data: data, reader: reader}
|
||||
}
|
||||
|
||||
func (t *parser) parse() error {
|
||||
for {
|
||||
err := t.key(t.data)
|
||||
err := t.key(t.data, 0)
|
||||
if err == nil {
|
||||
continue
|
||||
}
|
||||
@@ -150,7 +178,7 @@ func runeSet(r []rune) map[rune]bool {
|
||||
return s
|
||||
}
|
||||
|
||||
func (t *parser) key(data map[string]interface{}) (reterr error) {
|
||||
func (t *parser) key(data map[string]interface{}, nestedNameLevel int) (reterr error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
reterr = fmt.Errorf("unable to parse key: %s", r)
|
||||
@@ -180,10 +208,37 @@ func (t *parser) key(data map[string]interface{}) (reterr error) {
|
||||
}
|
||||
|
||||
// Now we need to get the value after the ].
|
||||
list, err = t.listItem(list, i)
|
||||
list, err = t.listItem(list, i, nestedNameLevel)
|
||||
set(data, kk, list)
|
||||
return err
|
||||
case last == '=':
|
||||
if t.isjsonval {
|
||||
empval, err := t.emptyVal()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if empval {
|
||||
set(data, string(k), nil)
|
||||
return nil
|
||||
}
|
||||
// parse jsonvals by using Go’s JSON standard library
|
||||
// Decode is preferred to Unmarshal in order to parse just the json parts of the list key1=jsonval1,key2=jsonval2,...
|
||||
// Since Decode has its own buffer that consumes more characters (from underlying t.sc) than the ones actually decoded,
|
||||
// we invoke Decode on a separate reader built with a copy of what is left in t.sc. After Decode is executed, we
|
||||
// discard in t.sc the chars of the decoded json value (the number of those characters is returned by InputOffset).
|
||||
var jsonval interface{}
|
||||
dec := json.NewDecoder(strings.NewReader(t.sc.String()))
|
||||
if err = dec.Decode(&jsonval); err != nil {
|
||||
return err
|
||||
}
|
||||
set(data, string(k), jsonval)
|
||||
if _, err = io.CopyN(ioutil.Discard, t.sc, dec.InputOffset()); err != nil {
|
||||
return err
|
||||
}
|
||||
// skip possible blanks and comma
|
||||
_, err = t.emptyVal()
|
||||
return err
|
||||
}
|
||||
//End of key. Consume =, Get value.
|
||||
// FIXME: Get value list first
|
||||
vl, e := t.valList()
|
||||
@@ -205,12 +260,17 @@ func (t *parser) key(data map[string]interface{}) (reterr error) {
|
||||
default:
|
||||
return e
|
||||
}
|
||||
|
||||
case last == ',':
|
||||
// No value given. Set the value to empty string. Return error.
|
||||
set(data, string(k), "")
|
||||
return errors.Errorf("key %q has no value (cannot end with ,)", string(k))
|
||||
case last == '.':
|
||||
// Check value name is within the maximum nested name level
|
||||
nestedNameLevel++
|
||||
if nestedNameLevel > MaxNestedNameLevel {
|
||||
return fmt.Errorf("value name nested level is greater than maximum supported nested level of %d", MaxNestedNameLevel)
|
||||
}
|
||||
|
||||
// First, create or find the target map.
|
||||
inner := map[string]interface{}{}
|
||||
if _, ok := data[string(k)]; ok {
|
||||
@@ -218,11 +278,13 @@ func (t *parser) key(data map[string]interface{}) (reterr error) {
|
||||
}
|
||||
|
||||
// Recurse
|
||||
e := t.key(inner)
|
||||
if len(inner) == 0 {
|
||||
e := t.key(inner, nestedNameLevel)
|
||||
if e == nil && len(inner) == 0 {
|
||||
return errors.Errorf("key map %q has no value", string(k))
|
||||
}
|
||||
set(data, string(k), inner)
|
||||
if len(inner) != 0 {
|
||||
set(data, string(k), inner)
|
||||
}
|
||||
return e
|
||||
}
|
||||
}
|
||||
@@ -249,6 +311,9 @@ func setIndex(list []interface{}, index int, val interface{}) (l2 []interface{},
|
||||
if index < 0 {
|
||||
return list, fmt.Errorf("negative %d index not allowed", index)
|
||||
}
|
||||
if index > MaxIndex {
|
||||
return list, fmt.Errorf("index of %d is greater than maximum supported index of %d", index, MaxIndex)
|
||||
}
|
||||
if len(list) <= index {
|
||||
newlist := make([]interface{}, index+1)
|
||||
copy(newlist, list)
|
||||
@@ -269,7 +334,7 @@ func (t *parser) keyIndex() (int, error) {
|
||||
return strconv.Atoi(string(v))
|
||||
|
||||
}
|
||||
func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) {
|
||||
func (t *parser) listItem(list []interface{}, i, nestedNameLevel int) ([]interface{}, error) {
|
||||
if i < 0 {
|
||||
return list, fmt.Errorf("negative %d index not allowed", i)
|
||||
}
|
||||
@@ -280,6 +345,34 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) {
|
||||
case err != nil:
|
||||
return list, err
|
||||
case last == '=':
|
||||
if t.isjsonval {
|
||||
empval, err := t.emptyVal()
|
||||
if err != nil {
|
||||
return list, err
|
||||
}
|
||||
if empval {
|
||||
return setIndex(list, i, nil)
|
||||
}
|
||||
// parse jsonvals by using Go’s JSON standard library
|
||||
// Decode is preferred to Unmarshal in order to parse just the json parts of the list key1=jsonval1,key2=jsonval2,...
|
||||
// Since Decode has its own buffer that consumes more characters (from underlying t.sc) than the ones actually decoded,
|
||||
// we invoke Decode on a separate reader built with a copy of what is left in t.sc. After Decode is executed, we
|
||||
// discard in t.sc the chars of the decoded json value (the number of those characters is returned by InputOffset).
|
||||
var jsonval interface{}
|
||||
dec := json.NewDecoder(strings.NewReader(t.sc.String()))
|
||||
if err = dec.Decode(&jsonval); err != nil {
|
||||
return list, err
|
||||
}
|
||||
if list, err = setIndex(list, i, jsonval); err != nil {
|
||||
return list, err
|
||||
}
|
||||
if _, err = io.CopyN(ioutil.Discard, t.sc, dec.InputOffset()); err != nil {
|
||||
return list, err
|
||||
}
|
||||
// skip possible blanks and comma
|
||||
_, err = t.emptyVal()
|
||||
return list, err
|
||||
}
|
||||
vl, e := t.valList()
|
||||
switch e {
|
||||
case nil:
|
||||
@@ -314,7 +407,7 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) {
|
||||
}
|
||||
}
|
||||
// Now we need to get the value after the ].
|
||||
list2, err := t.listItem(crtList, nextI)
|
||||
list2, err := t.listItem(crtList, nextI, nestedNameLevel)
|
||||
if err != nil {
|
||||
return list, err
|
||||
}
|
||||
@@ -333,7 +426,7 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) {
|
||||
}
|
||||
|
||||
// Recurse
|
||||
e := t.key(inner)
|
||||
e := t.key(inner, nestedNameLevel)
|
||||
if e != nil {
|
||||
return list, e
|
||||
}
|
||||
@@ -343,6 +436,28 @@ func (t *parser) listItem(list []interface{}, i int) ([]interface{}, error) {
|
||||
}
|
||||
}
|
||||
|
||||
// check for an empty value
|
||||
// read and consume optional spaces until comma or EOF (empty val) or any other char (not empty val)
|
||||
// comma and spaces are consumed, while any other char is not cosumed
|
||||
func (t *parser) emptyVal() (bool, error) {
|
||||
for {
|
||||
r, _, e := t.sc.ReadRune()
|
||||
if e == io.EOF {
|
||||
return true, nil
|
||||
}
|
||||
if e != nil {
|
||||
return false, e
|
||||
}
|
||||
if r == ',' {
|
||||
return true, nil
|
||||
}
|
||||
if !unicode.IsSpace(r) {
|
||||
t.sc.UnreadRune()
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (t *parser) val() ([]rune, error) {
|
||||
stop := runeSet([]rune{','})
|
||||
v, _, err := runesUntil(t.sc, stop)
|
||||
|
||||
Reference in New Issue
Block a user