Skip to content

Commit 309e544

Browse files
committed
Change manifest parser to split by document
helm 2.5.0 seems to output resources from one template file in a random order. This makes it unfeasible to do diffs by template. Instead we now do diffs by resources.
1 parent 4b90e61 commit 309e544

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

manifest/parse.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,26 @@ package manifest
33
import (
44
"bufio"
55
"bytes"
6+
"fmt"
7+
"log"
68
"strings"
9+
10+
"gopkg.in/yaml.v2"
711
)
812

9-
var yamlSeperator = []byte("---\n# Source: ")
13+
var yamlSeperator = []byte("\n---\n")
14+
15+
type metadata struct {
16+
ApiVersion string `yaml:"apiVersion"`
17+
Kind string
18+
Metadata struct {
19+
Name string
20+
}
21+
}
22+
23+
func (m metadata) String() string {
24+
return fmt.Sprintf("%s, %s (%s)", m.Metadata.Name, m.Kind, m.ApiVersion)
25+
}
1026

1127
func scanYamlSpecs(data []byte, atEOF bool) (advance int, token []byte, err error) {
1228
if atEOF && len(data) == 0 {
@@ -42,12 +58,19 @@ func Parse(manifest string) map[string]string {
4258
result := make(map[string]string)
4359

4460
for scanner.Scan() {
45-
source, content := splitSpec(scanner.Text())
46-
//Since helm 2.5.0 the '# Source:' stanze appears multiple times per template (for each yaml doc)
47-
if _, ok := result[source]; ok {
48-
result[source] = result[source] + "\n" + content
61+
content := scanner.Text()
62+
if strings.TrimSpace(content) == "" {
63+
continue
64+
}
65+
var metadata metadata
66+
if err := yaml.Unmarshal([]byte(content), &metadata); err != nil {
67+
log.Fatalf("YAML unmarshal error: %s\nCan't unmarshal %s", err, content)
68+
}
69+
name := metadata.String()
70+
if _, ok := result[name]; ok {
71+
log.Println("Error: Found duplicate key %#v in manifest", name)
4972
} else {
50-
result[source] = content
73+
result[name] = content
5174
}
5275
}
5376
return result

0 commit comments

Comments
 (0)