LoadFiles loads from in-memory files.
(files []*archive.BufferedFile)
| 70 | |
| 71 | // LoadFiles loads from in-memory files. |
| 72 | func LoadFiles(files []*archive.BufferedFile) (*chart.Chart, error) { |
| 73 | c := new(chart.Chart) |
| 74 | subcharts := make(map[string][]*archive.BufferedFile) |
| 75 | var subChartsKeys []string |
| 76 | |
| 77 | // do not rely on assumed ordering of files in the chart and crash |
| 78 | // if Chart.yaml was not coming early enough to initialize metadata |
| 79 | for _, f := range files { |
| 80 | c.Raw = append(c.Raw, &common.File{Name: f.Name, ModTime: f.ModTime, Data: f.Data}) |
| 81 | if f.Name == "Chart.yaml" { |
| 82 | if c.Metadata == nil { |
| 83 | c.Metadata = new(chart.Metadata) |
| 84 | } |
| 85 | if err := yaml.Unmarshal(f.Data, c.Metadata); err != nil { |
| 86 | return c, fmt.Errorf("cannot load Chart.yaml: %w", err) |
| 87 | } |
| 88 | // While the documentation says the APIVersion is required, in practice there |
| 89 | // are cases where that's not enforced. Since this package set is for v3 charts, |
| 90 | // when this function is used v3 is automatically added when not present. |
| 91 | if c.Metadata.APIVersion == "" { |
| 92 | c.Metadata.APIVersion = chart.APIVersionV3 |
| 93 | } |
| 94 | c.ModTime = f.ModTime |
| 95 | } |
| 96 | } |
| 97 | for _, f := range files { |
| 98 | switch { |
| 99 | case f.Name == "Chart.yaml": |
| 100 | // already processed |
| 101 | continue |
| 102 | case f.Name == "Chart.lock": |
| 103 | c.Lock = new(chart.Lock) |
| 104 | if err := yaml.Unmarshal(f.Data, &c.Lock); err != nil { |
| 105 | return c, fmt.Errorf("cannot load Chart.lock: %w", err) |
| 106 | } |
| 107 | case f.Name == "values.yaml": |
| 108 | values, err := LoadValues(bytes.NewReader(f.Data)) |
| 109 | if err != nil { |
| 110 | return c, fmt.Errorf("cannot load values.yaml: %w", err) |
| 111 | } |
| 112 | c.Values = values |
| 113 | case f.Name == "values.schema.json": |
| 114 | c.Schema = f.Data |
| 115 | c.SchemaModTime = f.ModTime |
| 116 | |
| 117 | case strings.HasPrefix(f.Name, "templates/"): |
| 118 | c.Templates = append(c.Templates, &common.File{Name: f.Name, Data: f.Data, ModTime: f.ModTime}) |
| 119 | case strings.HasPrefix(f.Name, "charts/"): |
| 120 | if filepath.Ext(f.Name) == ".prov" { |
| 121 | c.Files = append(c.Files, &common.File{Name: f.Name, Data: f.Data, ModTime: f.ModTime}) |
| 122 | continue |
| 123 | } |
| 124 | |
| 125 | fname := strings.TrimPrefix(f.Name, "charts/") |
| 126 | cname := strings.SplitN(fname, "/", 2)[0] |
| 127 | if slices.Index(subChartsKeys, cname) == -1 { |
| 128 | subChartsKeys = append(subChartsKeys, cname) |
| 129 | } |
searching dependent graphs…