Enable lazy create of repo file for repo commannds

Adding Lazy create of repository file for `helm repo` commands
in addition to `repo update`.

Signed-off-by: Martin Hickey <martin.hickey@ie.ibm.com>
pull/6293/head
Martin Hickey 6 years ago
parent f46df928cf
commit 74fa125f0f

@ -67,7 +67,7 @@ func TestRepoAdd(t *testing.T) {
t.Error(err) t.Error(err)
} }
f, err := repo.LoadFile(repoFile) f, err := repo.LoadFile(repoFile, false)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

@ -34,7 +34,7 @@ func newRepoListCmd(out io.Writer) *cobra.Command {
Short: "list chart repositories", Short: "list chart repositories",
Args: require.NoArgs, Args: require.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
f, err := repo.LoadFile(settings.RepositoryConfig) f, err := repo.LoadFile(settings.RepositoryConfig, true)
if err != nil { if err != nil {
return err return err
} }

@ -55,7 +55,7 @@ func newRepoRemoveCmd(out io.Writer) *cobra.Command {
} }
func (o *repoRemoveOptions) run(out io.Writer) error { func (o *repoRemoveOptions) run(out io.Writer) error {
r, err := repo.LoadFile(o.repoFile) r, err := repo.LoadFile(o.repoFile, true)
if err != nil { if err != nil {
return err return err
} }

@ -80,7 +80,7 @@ func TestRepoRemove(t *testing.T) {
t.Errorf("Error cache file was not removed for repository %s", testRepoName) t.Errorf("Error cache file was not removed for repository %s", testRepoName)
} }
f, err := repo.LoadFile(repoFile) f, err := repo.LoadFile(repoFile, false)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

@ -59,7 +59,7 @@ func newRepoUpdateCmd(out io.Writer) *cobra.Command {
} }
func (o *repoUpdateOptions) run(out io.Writer) error { func (o *repoUpdateOptions) run(out io.Writer) error {
f, err := repo.LoadFile(o.repoFile) f, err := repo.LoadFile(o.repoFile, true)
if err != nil { if err != nil {
return err return err
} }

@ -146,7 +146,7 @@ func (o *searchRepoOptions) formatSearchResults(res []*search.Result) string {
func (o *searchRepoOptions) buildIndex(out io.Writer) (*search.Index, error) { func (o *searchRepoOptions) buildIndex(out io.Writer) (*search.Index, error) {
// Load the repositories.yaml // Load the repositories.yaml
rf, err := repo.LoadFile(o.repoFile) rf, err := repo.LoadFile(o.repoFile, true)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "loading repository config") return nil, errors.Wrap(err, "loading repository config")
} }

@ -154,7 +154,7 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, er
} }
c.Options = append(c.Options, getter.WithURL(ref)) c.Options = append(c.Options, getter.WithURL(ref))
rf, err := repo.LoadFile(c.RepositoryConfig) rf, err := repo.LoadFile(c.RepositoryConfig, false)
if err != nil { if err != nil {
return u, err return u, err
} }

@ -222,7 +222,7 @@ func TestScanReposForURL(t *testing.T) {
} }
u := "http://example.com/alpine-0.2.0.tgz" u := "http://example.com/alpine-0.2.0.tgz"
rf, err := repo.LoadFile(repoConfig) rf, err := repo.LoadFile(repoConfig, false)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

@ -311,7 +311,7 @@ func (m *Manager) safeDeleteDep(name, dir string) error {
// hasAllRepos ensures that all of the referenced deps are in the local repo cache. // hasAllRepos ensures that all of the referenced deps are in the local repo cache.
func (m *Manager) hasAllRepos(deps []*chart.Dependency) error { func (m *Manager) hasAllRepos(deps []*chart.Dependency) error {
rf, err := repo.LoadFile(m.RepositoryConfig) rf, err := repo.LoadFile(m.RepositoryConfig, false)
if err != nil { if err != nil {
return err return err
} }
@ -345,7 +345,7 @@ Loop:
// getRepoNames returns the repo names of the referenced deps which can be used to fetch the cahced index file. // getRepoNames returns the repo names of the referenced deps which can be used to fetch the cahced index file.
func (m *Manager) getRepoNames(deps []*chart.Dependency) (map[string]string, error) { func (m *Manager) getRepoNames(deps []*chart.Dependency) (map[string]string, error) {
rf, err := repo.LoadFile(m.RepositoryConfig) rf, err := repo.LoadFile(m.RepositoryConfig, false)
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
return make(map[string]string), nil return make(map[string]string), nil
@ -415,7 +415,7 @@ repository, use "https://charts.example.com/" or "@example" instead of
// UpdateRepositories updates all of the local repos to the latest. // UpdateRepositories updates all of the local repos to the latest.
func (m *Manager) UpdateRepositories() error { func (m *Manager) UpdateRepositories() error {
rf, err := repo.LoadFile(m.RepositoryConfig) rf, err := repo.LoadFile(m.RepositoryConfig, false)
if err != nil { if err != nil {
return err return err
} }
@ -553,7 +553,7 @@ func (m *Manager) loadChartRepositories() (map[string]*repo.ChartRepository, err
indices := map[string]*repo.ChartRepository{} indices := map[string]*repo.ChartRepository{}
// Load repositories.yaml file // Load repositories.yaml file
rf, err := repo.LoadFile(m.RepositoryConfig) rf, err := repo.LoadFile(m.RepositoryConfig, false)
if err != nil { if err != nil {
return indices, errors.Wrapf(err, "failed to load %s", m.RepositoryConfig) return indices, errors.Wrapf(err, "failed to load %s", m.RepositoryConfig)
} }

@ -45,9 +45,19 @@ func NewFile() *File {
} }
// LoadFile takes a file at the given path and returns a File object // LoadFile takes a file at the given path and returns a File object
func LoadFile(path string) (*File, error) { // createRepoFile parameter when set to true, will create repo file if
// it doesn't exist. The parameter is useful for lazy create when
// running some commands.
func LoadFile(path string, createRepoFile bool) (*File, error) {
b, err := ioutil.ReadFile(path) b, err := ioutil.ReadFile(path)
if err != nil { if err != nil {
if os.IsNotExist(err) && createRepoFile {
f := &File{}
if err := f.WriteFile(path, 0644); err != nil {
return nil, errors.Wrapf(err, "couldn't load repositories file (%s)", path)
}
return f, nil
}
if os.IsNotExist(err) { if os.IsNotExist(err) {
return nil, errors.Wrapf(err, "couldn't load repositories file (%s)", path) return nil, errors.Wrapf(err, "couldn't load repositories file (%s)", path)
} }

@ -71,7 +71,7 @@ func TestNewFile(t *testing.T) {
}, },
) )
file, err := LoadFile(testRepositoriesFile) file, err := LoadFile(testRepositoriesFile, false)
if err != nil { if err != nil {
t.Errorf("%q could not be loaded: %s", testRepositoriesFile, err) t.Errorf("%q could not be loaded: %s", testRepositoriesFile, err)
} }
@ -169,7 +169,7 @@ func TestWriteFile(t *testing.T) {
t.Errorf("failed to write file (%v)", err) t.Errorf("failed to write file (%v)", err)
} }
repos, err := LoadFile(file.Name()) repos, err := LoadFile(file.Name(), false)
if err != nil { if err != nil {
t.Errorf("failed to load file (%v)", err) t.Errorf("failed to load file (%v)", err)
} }
@ -181,9 +181,21 @@ func TestWriteFile(t *testing.T) {
} }
func TestRepoNotExists(t *testing.T) { func TestRepoNotExists(t *testing.T) {
if _, err := LoadFile("/this/path/does/not/exist.yaml"); err == nil { if _, err := LoadFile("/this/path/does/not/exist.yaml", false); err == nil {
t.Errorf("expected err to be non-nil when path does not exist") t.Errorf("expected err to be non-nil when path does not exist")
} else if !strings.Contains(err.Error(), "couldn't load repositories file") { } else if !strings.Contains(err.Error(), "couldn't load repositories file") {
t.Errorf("expected prompt `couldn't load repositories file`") t.Errorf("expected prompt `couldn't load repositories file`")
} }
} }
func TestRepoLazyCreate(t *testing.T) {
f, err := LoadFile("testdata/helm-repo-lazy-tst.yaml", true)
if err != nil {
t.Errorf("expected err to be nil when path does not exist and create repo file flag set")
}
if len(f.Repositories) != 0 {
os.Remove("testdata/helm-repo-lazy-tst.yaml")
t.Errorf("expected no rep[ositories to be returned")
}
os.Remove("testdata/helm-repo-lazy-tst.yaml")
}

Loading…
Cancel
Save