diff --git a/cmd/helm/repo_index.go b/cmd/helm/repo_index.go index f88127c91..1a681c6f9 100644 --- a/cmd/helm/repo_index.go +++ b/cmd/helm/repo_index.go @@ -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) } diff --git a/pkg/repo/index.go b/pkg/repo/index.go index d9d04762c..2b066d47c 100644 --- a/pkg/repo/index.go +++ b/pkg/repo/index.go @@ -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 diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go index 6f096103b..6e61b4dc2 100644 --- a/pkg/repo/index_test.go +++ b/pkg/repo/index_test.go @@ -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)) } diff --git a/pkg/repo/repo.go b/pkg/repo/repo.go index e1d9d4712..18132fe95 100644 --- a/pkg/repo/repo.go +++ b/pkg/repo/repo.go @@ -198,27 +198,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()