fix kyaml issue where dropping Style created issues

dropping the node style creates a compatibility issue where quotes around "on" are dropped
because yaml.v3 interprets it as a string.

other yaml parsers interpret on as a bool value, and parse it as a bool rather than string.

fix: retain the original style so it is kept as quoted.

- fmt: don't drop the styles
- merge2: keep the style when merging elements
- setting a field: if changing the value of a scalar field, retain its style by default
This commit is contained in:
Phillip Wittrock
2019-12-19 15:05:49 -08:00
parent 7e56c2c768
commit 98431f6a00
13 changed files with 147 additions and 85 deletions

View File

@@ -23,8 +23,7 @@ kind: Deployment
items:
- name: foo
image: foo:v1
command:
- run.sh
command: ['run.sh']
`,
},
@@ -47,8 +46,7 @@ kind: Deployment
items:
- name: foo
image: foo:v1
command:
- run.sh
command: ['run.sh']
`,
},
@@ -62,15 +60,14 @@ items:
`,
`
kind: Deployment
items: {}
items: []
`,
`
kind: Deployment
items:
- name: foo
image: foo:v1
command:
- run.sh
command: ['run.sh']
`,
},
@@ -90,8 +87,7 @@ kind: Deployment
items:
- name: foo
image: foo:v1
command:
- run.sh
command: ['run.sh']
`,
},
@@ -118,8 +114,7 @@ items:
image: foo:v1
- name: bar
image: bar:v1
command:
- run2.sh
command: ['run2.sh']
`,
},
@@ -146,8 +141,7 @@ items:
image: foo:v1
- name: bar
image: bar:v1
command:
- run2.sh
command: ['run2.sh']
`,
},
@@ -174,8 +168,7 @@ items:
image: foo:v1
- name: bar
image: bar:v1
command:
- run2.sh
command: ['run2.sh']
`,
},
@@ -205,8 +198,7 @@ items:
image: foo:v1
- name: bar
image: bar:v1
command:
- run2.sh
command: ['run2.sh']
`,
},
@@ -225,8 +217,7 @@ items:
image: foo:v1
- name: bar
image: bar:v1
command:
- run2.sh
command: ['run2.sh']
`,
`
kind: Deployment
@@ -235,8 +226,7 @@ items:
image: foo:v1
- name: bar
image: bar:v1
command:
- run2.sh
command: ['run2.sh']
`,
},
@@ -255,8 +245,7 @@ items:
image: foo:v1
- name: bar
image: bar:v1
command:
- run2.sh
command: ['run2.sh']
`,
`
kind: Deployment

View File

@@ -43,6 +43,9 @@ func (m Merger) VisitMap(nodes walk.Sources) (*yaml.RNode, error) {
if err := m.SetComments(nodes); err != nil {
return nil, err
}
if err := m.SetStyle(nodes); err != nil {
return nil, err
}
if yaml.IsEmpty(nodes.Dest()) {
// Add
return nodes.Origin(), nil
@@ -59,6 +62,9 @@ func (m Merger) VisitScalar(nodes walk.Sources) (*yaml.RNode, error) {
if err := m.SetComments(nodes); err != nil {
return nil, err
}
if err := m.SetStyle(nodes); err != nil {
return nil, err
}
// Override value
if nodes.Origin() != nil {
return nodes.Origin(), nil
@@ -71,6 +77,9 @@ func (m Merger) VisitList(nodes walk.Sources, kind walk.ListKind) (*yaml.RNode,
if err := m.SetComments(nodes); err != nil {
return nil, err
}
if err := m.SetStyle(nodes); err != nil {
return nil, err
}
if kind == walk.NonAssociateList {
// Override value
if nodes.Origin() != nil {
@@ -92,6 +101,25 @@ func (m Merger) VisitList(nodes walk.Sources, kind walk.ListKind) (*yaml.RNode,
return nodes.Dest(), nil
}
func (m Merger) SetStyle(sources walk.Sources) error {
source := sources.Origin()
dest := sources.Dest()
if dest == nil || dest.YNode() == nil || source == nil || source.YNode() == nil {
// avoid panic
return nil
}
// copy the style from the source.
// special case: if the dest was an empty map or seq, then it probably had
// folded style applied, but we actually want to keep the style of the origin
// in this case (even if it was the default). otherwise the merged elements
// will get folded even though this probably isn't what is desired.
if dest.YNode().Kind != yaml.ScalarNode && len(dest.YNode().Content) == 0 {
dest.YNode().Style = source.YNode().Style
}
return nil
}
// SetComments copies the dest comments to the source comments if they are present
// on the source.
func (m Merger) SetComments(sources walk.Sources) error {

View File

@@ -83,10 +83,7 @@ spec:
containers:
- name: nginx
image: nginx:1.7.9
args:
- c
- a
- b
args: ['c', 'a', 'b']
env:
- name: DEMO_GREETING
value: "Hello from the environment"
@@ -139,10 +136,7 @@ spec:
containers:
- name: nginx
image: nginx:1.7.9
args:
- c
- a
- b
args: ['c', 'a', 'b']
env:
- name: DEMO_GREETING
value: "Hello from the environment"
@@ -208,10 +202,7 @@ spec:
containers:
- name: nginx
image: nginx:1.7.9
args:
- c
- a
- b
args: ['c', 'a', 'b']
env:
- name: DEMO_GREETING
value: "Hello from the environment"
@@ -276,10 +267,7 @@ spec:
containers:
- name: nginx
image: nginx:1.7.9
args:
- c
- a
- b
args: ['c', 'a', 'b']
env:
- name: DEMO_GREETING
value: "New Demo Greeting"
@@ -343,10 +331,7 @@ spec:
containers:
- name: nginx
image: nginx:1.7.9
args:
- e
- d
- f
args: ['e', 'd', 'f']
env:
- name: DEMO_GREETING
value: "Hello from the environment"