From fe92480ab4e7177cd8bcd5e10da9e9e03fcda244 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Wed, 28 Aug 2019 14:13:49 -0700 Subject: [PATCH] fix(cmd/helm): user friendly error message when repos are not configured Signed-off-by: Adam Reese --- cmd/helm/repo.go | 6 ++++++ cmd/helm/repo_list.go | 5 +---- cmd/helm/repo_remove.go | 4 ++-- cmd/helm/repo_update.go | 6 +----- cmd/helm/search_repo.go | 4 ++-- pkg/downloader/chart_downloader.go | 10 +++++++++- pkg/downloader/manager.go | 8 ++++---- pkg/repo/repo.go | 7 ++----- 8 files changed, 27 insertions(+), 23 deletions(-) diff --git a/cmd/helm/repo.go b/cmd/helm/repo.go index afd5850d5..f20bde6c3 100644 --- a/cmd/helm/repo.go +++ b/cmd/helm/repo.go @@ -18,7 +18,9 @@ package main import ( "io" + "os" + "github.com/pkg/errors" "github.com/spf13/cobra" "helm.sh/helm/cmd/helm/require" @@ -48,3 +50,7 @@ func newRepoCmd(out io.Writer) *cobra.Command { return cmd } + +func isNotExist(err error) bool { + return os.IsNotExist(errors.Cause(err)) +} diff --git a/cmd/helm/repo_list.go b/cmd/helm/repo_list.go index 3228dbb1e..7825faebd 100644 --- a/cmd/helm/repo_list.go +++ b/cmd/helm/repo_list.go @@ -35,10 +35,7 @@ func newRepoListCmd(out io.Writer) *cobra.Command { Args: require.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { f, err := repo.LoadFile(settings.RepositoryConfig) - if err != nil { - return err - } - if len(f.Repositories) == 0 { + if isNotExist(err) || len(f.Repositories) == 0 { return errors.New("no repositories to show") } table := uitable.New() diff --git a/cmd/helm/repo_remove.go b/cmd/helm/repo_remove.go index 006908cd0..708c713dd 100644 --- a/cmd/helm/repo_remove.go +++ b/cmd/helm/repo_remove.go @@ -56,8 +56,8 @@ func newRepoRemoveCmd(out io.Writer) *cobra.Command { func (o *repoRemoveOptions) run(out io.Writer) error { r, err := repo.LoadFile(o.repoFile) - if err != nil { - return err + if isNotExist(err) || len(r.Repositories) == 0 { + return errors.New("no repositories configured") } if !r.Remove(o.name) { diff --git a/cmd/helm/repo_update.go b/cmd/helm/repo_update.go index 1d647366a..ba9a3ea09 100644 --- a/cmd/helm/repo_update.go +++ b/cmd/helm/repo_update.go @@ -60,11 +60,7 @@ func newRepoUpdateCmd(out io.Writer) *cobra.Command { func (o *repoUpdateOptions) run(out io.Writer) error { f, err := repo.LoadFile(o.repoFile) - if err != nil { - return err - } - - if len(f.Repositories) == 0 { + if isNotExist(err) || len(f.Repositories) == 0 { return errNoRepositories } var repos []*repo.ChartRepository diff --git a/cmd/helm/search_repo.go b/cmd/helm/search_repo.go index 0399490aa..21781d6da 100644 --- a/cmd/helm/search_repo.go +++ b/cmd/helm/search_repo.go @@ -147,8 +147,8 @@ func (o *searchRepoOptions) formatSearchResults(res []*search.Result) string { func (o *searchRepoOptions) buildIndex(out io.Writer) (*search.Index, error) { // Load the repositories.yaml rf, err := repo.LoadFile(o.repoFile) - if err != nil { - return nil, errors.Wrap(err, "loading repository config") + if isNotExist(err) || len(rf.Repositories) == 0 { + return nil, errors.New("no repositories configured") } i := search.NewIndex() diff --git a/pkg/downloader/chart_downloader.go b/pkg/downloader/chart_downloader.go index cdb146e79..af061dab7 100644 --- a/pkg/downloader/chart_downloader.go +++ b/pkg/downloader/chart_downloader.go @@ -154,7 +154,7 @@ func (c *ChartDownloader) ResolveChartVersion(ref, version string) (*url.URL, er } c.Options = append(c.Options, getter.WithURL(ref)) - rf, err := repo.LoadFile(c.RepositoryConfig) + rf, err := loadRepoConfig(c.RepositoryConfig) if err != nil { return u, err } @@ -354,3 +354,11 @@ func (c *ChartDownloader) scanReposForURL(u string, rf *repo.File) (*repo.Entry, // This means that there is no repo file for the given URL. return nil, ErrNoOwnerRepo } + +func loadRepoConfig(file string) (*repo.File, error) { + r, err := repo.LoadFile(file) + if err != nil && !os.IsNotExist(errors.Cause(err)) { + return nil, err + } + return r, nil +} diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index 4bfa1e670..e04b7fe1b 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -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. func (m *Manager) hasAllRepos(deps []*chart.Dependency) error { - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { 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. func (m *Manager) getRepoNames(deps []*chart.Dependency) (map[string]string, error) { - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { if os.IsNotExist(err) { 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. func (m *Manager) UpdateRepositories() error { - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { return err } @@ -553,7 +553,7 @@ func (m *Manager) loadChartRepositories() (map[string]*repo.ChartRepository, err indices := map[string]*repo.ChartRepository{} // Load repositories.yaml file - rf, err := repo.LoadFile(m.RepositoryConfig) + rf, err := loadRepoConfig(m.RepositoryConfig) if err != nil { return indices, errors.Wrapf(err, "failed to load %s", m.RepositoryConfig) } diff --git a/pkg/repo/repo.go b/pkg/repo/repo.go index 70f026dcf..d6bfc75e7 100644 --- a/pkg/repo/repo.go +++ b/pkg/repo/repo.go @@ -46,15 +46,12 @@ func NewFile() *File { // LoadFile takes a file at the given path and returns a File object func LoadFile(path string) (*File, error) { + r := new(File) b, err := ioutil.ReadFile(path) if err != nil { - if os.IsNotExist(err) { - return nil, errors.Wrapf(err, "couldn't load repositories file (%s)", path) - } - return nil, err + return r, errors.Wrapf(err, "couldn't load repositories file (%s)", path) } - r := &File{} err = yaml.Unmarshal(b, r) return r, err }