Commit fcdb79da authored by Matt Butcher's avatar Matt Butcher Committed by GitHub

Merge pull request #1402 from technosophos/fix/1328-generate-index

fix(helm): make 'helm repo index' generate the right index
parents 4899faa9 911d3224
...@@ -17,6 +17,7 @@ limitations under the License. ...@@ -17,6 +17,7 @@ limitations under the License.
package main package main
import ( import (
"fmt"
"io" "io"
"path/filepath" "path/filepath"
...@@ -80,18 +81,18 @@ func (i *repoIndexCmd) run() error { ...@@ -80,18 +81,18 @@ func (i *repoIndexCmd) run() error {
} }
func index(dir, url, mergeTo string) error { func index(dir, url, mergeTo string) error {
chartRepo, err := repo.LoadChartRepository(dir, url) out := filepath.Join(dir, "index.yaml")
i, err := repo.IndexDirectory(dir, url)
if err != nil { if err != nil {
return err return err
} }
if mergeTo != "" { if mergeTo != "" {
old, err := repo.LoadIndexFile(mergeTo) i2, err := repo.LoadIndexFile(mergeTo)
if err != nil { if err != nil {
return err return fmt.Errorf("Merge failed: %s", err)
} }
return chartRepo.MergeIndex(old) i.Merge(i2)
} }
return i.WriteFile(out, 0755)
return chartRepo.Index()
} }
...@@ -170,6 +170,23 @@ func (i IndexFile) WriteFile(dest string, mode os.FileMode) error { ...@@ -170,6 +170,23 @@ func (i IndexFile) WriteFile(dest string, mode os.FileMode) error {
return ioutil.WriteFile(dest, b, mode) return ioutil.WriteFile(dest, b, mode)
} }
// Merge merges the given index file into this index.
//
// This merges by name and version.
//
// If one of the entries in the given index does _not_ already exist, it is added.
// In all other cases, the existing record is preserved.
func (i *IndexFile) Merge(f *IndexFile) {
for _, cvs := range f.Entries {
for _, cv := range cvs {
if !i.Has(cv.Name, cv.Version) {
e := i.Entries[cv.Name]
i.Entries[cv.Name] = append(e, cv)
}
}
}
}
// Need both JSON and YAML annotations until we get rid of gopkg.in/yaml.v2 // Need both JSON and YAML annotations until we get rid of gopkg.in/yaml.v2
// ChartVersion represents a chart entry in the IndexFile // ChartVersion represents a chart entry in the IndexFile
......
...@@ -82,28 +82,13 @@ func TestLoadIndexFile(t *testing.T) { ...@@ -82,28 +82,13 @@ func TestLoadIndexFile(t *testing.T) {
verifyLocalIndex(t, i) verifyLocalIndex(t, i)
} }
func TestMergeIndex(t *testing.T) { func TestMerge(t *testing.T) {
dirName, err := ioutil.TempDir("", "tmp") ind1 := NewIndexFile()
if err != nil { ind1.Add(&chart.Metadata{
t.Fatal(err)
}
defer os.RemoveAll(dirName)
ind := NewIndexFile()
ind.Add(&chart.Metadata{
Name: "dreadnought", Name: "dreadnought",
Version: "0.1.0", Version: "0.1.0",
}, "dreadnought-0.1.0.tgz", "http://example.com", "aaaa") }, "dreadnought-0.1.0.tgz", "http://example.com", "aaaa")
cr := &ChartRepository{
IndexFile: ind,
RootPath: dirName,
}
if err := cr.saveIndexFile(); err != nil {
t.Fatal(err)
}
ind2 := NewIndexFile() ind2 := NewIndexFile()
ind2.Add(&chart.Metadata{ ind2.Add(&chart.Metadata{
Name: "dreadnought", Name: "dreadnought",
...@@ -113,25 +98,12 @@ func TestMergeIndex(t *testing.T) { ...@@ -113,25 +98,12 @@ func TestMergeIndex(t *testing.T) {
Name: "doughnut", Name: "doughnut",
Version: "0.2.0", Version: "0.2.0",
}, "doughnut-0.2.0.tgz", "http://example.com", "ccccbbbb") }, "doughnut-0.2.0.tgz", "http://example.com", "ccccbbbb")
cr.IndexFile = ind2
ind3, err := LoadIndexFile(filepath.Join(dirName, "index.yaml")) ind1.Merge(ind2)
if err != nil {
t.Fatal(err)
}
if err := cr.MergeIndex(ind3); err != nil {
t.Fatal(err)
}
ind4, err := LoadIndexFile(filepath.Join(dirName, "index.yaml"))
if err != nil {
t.Fatal(err)
}
if len(ind4.Entries) != 2 { if len(ind1.Entries) != 2 {
t.Errorf("Expected 2 entries, got %d", len(ind4.Entries)) t.Errorf("Expected 2 entries, got %d", len(ind1.Entries))
vs := ind4.Entries["dreadnaught"] vs := ind1.Entries["dreadnaught"]
if len(vs) != 2 { if len(vs) != 2 {
t.Errorf("Expected 2 versions, got %d", len(vs)) t.Errorf("Expected 2 versions, got %d", len(vs))
} }
......
...@@ -212,27 +212,6 @@ func (r *ChartRepository) Index() error { ...@@ -212,27 +212,6 @@ func (r *ChartRepository) Index() error {
return r.saveIndexFile() return r.saveIndexFile()
} }
// MergeIndex merges the given index file into this index, and then writes the result.
//
// This provides a parallel function to the Index() method, but with the additional merge step.
func (r *ChartRepository) MergeIndex(f *IndexFile) error {
err := r.generateIndex()
if err != nil {
return err
}
for _, cvs := range f.Entries {
for _, cv := range cvs {
if !r.IndexFile.Has(cv.Name, cv.Version) {
e := r.IndexFile.Entries[cv.Name]
r.IndexFile.Entries[cv.Name] = append(e, cv)
}
}
}
return r.saveIndexFile()
}
func (r *ChartRepository) generateIndex() error { func (r *ChartRepository) generateIndex() error {
if r.IndexFile == nil { if r.IndexFile == nil {
r.IndexFile = NewIndexFile() r.IndexFile = NewIndexFile()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment