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.
package main
import (
"fmt"
"io"
"path/filepath"
......@@ -80,18 +81,18 @@ func (i *repoIndexCmd) run() 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 {
return err
}
if mergeTo != "" {
old, err := repo.LoadIndexFile(mergeTo)
i2, err := repo.LoadIndexFile(mergeTo)
if err != nil {
return err
return fmt.Errorf("Merge failed: %s", err)
}
return chartRepo.MergeIndex(old)
i.Merge(i2)
}
return chartRepo.Index()
return i.WriteFile(out, 0755)
}
......@@ -170,6 +170,23 @@ func (i IndexFile) WriteFile(dest string, mode os.FileMode) error {
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
// ChartVersion represents a chart entry in the IndexFile
......
......@@ -82,28 +82,13 @@ func TestLoadIndexFile(t *testing.T) {
verifyLocalIndex(t, i)
}
func TestMergeIndex(t *testing.T) {
dirName, err := ioutil.TempDir("", "tmp")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dirName)
ind := NewIndexFile()
ind.Add(&chart.Metadata{
func TestMerge(t *testing.T) {
ind1 := NewIndexFile()
ind1.Add(&chart.Metadata{
Name: "dreadnought",
Version: "0.1.0",
}, "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.Add(&chart.Metadata{
Name: "dreadnought",
......@@ -113,25 +98,12 @@ func TestMergeIndex(t *testing.T) {
Name: "doughnut",
Version: "0.2.0",
}, "doughnut-0.2.0.tgz", "http://example.com", "ccccbbbb")
cr.IndexFile = ind2
ind3, err := LoadIndexFile(filepath.Join(dirName, "index.yaml"))
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)
}
ind1.Merge(ind2)
if len(ind4.Entries) != 2 {
t.Errorf("Expected 2 entries, got %d", len(ind4.Entries))
vs := ind4.Entries["dreadnaught"]
if len(ind1.Entries) != 2 {
t.Errorf("Expected 2 entries, got %d", len(ind1.Entries))
vs := ind1.Entries["dreadnaught"]
if len(vs) != 2 {
t.Errorf("Expected 2 versions, got %d", len(vs))
}
......
......@@ -212,27 +212,6 @@ func (r *ChartRepository) Index() error {
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 {
if r.IndexFile == nil {
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