diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 90ffbb1b3..fab9a7a1f 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -22,6 +22,8 @@ import ( "io/ioutil" "os" + "helm.sh/helm/pkg/repo" + "github.com/Masterminds/semver" "github.com/pkg/errors" "github.com/spf13/cobra" @@ -31,7 +33,6 @@ import ( "helm.sh/helm/pkg/helmpath" "helm.sh/helm/pkg/plugin" "helm.sh/helm/pkg/plugin/installer" - "helm.sh/helm/pkg/repo" ) const initDesc = ` @@ -144,10 +145,10 @@ func ensureReposFile(out io.Writer, skipRefresh bool) error { repoFile := helmpath.RepositoryFile() if fi, err := os.Stat(repoFile); err != nil { fmt.Fprintf(out, "Creating %s \n", repoFile) - f := repo.NewFile() - if err := f.WriteFile(repoFile, 0644); err != nil { - return err - } + //f := repo.NewFile() + //if err := f.WriteFile(repoFile, 0644); err != nil { + // return err + //} } else if fi.IsDir() { return errors.Errorf("%s must be a file, not a directory", repoFile) } diff --git a/cmd/helm/root_test.go b/cmd/helm/root_test.go index 5daca1eac..df487e8b6 100644 --- a/cmd/helm/root_test.go +++ b/cmd/helm/root_test.go @@ -40,20 +40,20 @@ func TestRootCmd(t *testing.T) { { name: "with $XDG_CACHE_HOME set", args: "home", - envars: map[string]string{xdg.CacheHomeEnvVar: "/bar"}, - cachePath: "/bar/helm", + envars: map[string]string{xdg.CacheHomeEnvVar: os.TempDir() + "bar"}, + cachePath: os.TempDir() + "bar/helm", }, { name: "with $XDG_CONFIG_HOME set", args: "home", - envars: map[string]string{xdg.ConfigHomeEnvVar: "/bar"}, - configPath: "/bar/helm", + envars: map[string]string{xdg.ConfigHomeEnvVar: os.TempDir() + "bar"}, + configPath: os.TempDir() + "bar/helm", }, { name: "with $XDG_DATA_HOME set", args: "home", - envars: map[string]string{xdg.DataHomeEnvVar: "/bar"}, - dataPath: "/bar/helm", + envars: map[string]string{xdg.DataHomeEnvVar: os.TempDir() + "bar"}, + dataPath: os.TempDir() + "bar/helm", }, } diff --git a/pkg/helmpath/home.go b/pkg/helmpath/home.go index 9c9fe9379..d89608cbf 100644 --- a/pkg/helmpath/home.go +++ b/pkg/helmpath/home.go @@ -43,7 +43,9 @@ func Registry() string { // RepositoryFile returns the path to the repositories.yaml file. func RepositoryFile() string { - return lp.configPath("repositories.yaml") + configPath := lp.configPath("") + repoFile := filepath.Join(configPath, "repositories.yaml") + return repoFile } // RepositoryCache returns the cache path for repository metadata. diff --git a/pkg/helmpath/home_unix_test.go b/pkg/helmpath/home_unix_test.go index 0c933a862..1e4b4e974 100644 --- a/pkg/helmpath/home_unix_test.go +++ b/pkg/helmpath/home_unix_test.go @@ -24,9 +24,9 @@ import ( ) func TestHelmHome(t *testing.T) { - os.Setenv(xdg.CacheHomeEnvVar, "/cache") - os.Setenv(xdg.ConfigHomeEnvVar, "/config") - os.Setenv(xdg.DataHomeEnvVar, "/data") + os.Setenv(xdg.CacheHomeEnvVar, os.TempDir()+"cache") + os.Setenv(xdg.ConfigHomeEnvVar, os.TempDir()+"config") + os.Setenv(xdg.DataHomeEnvVar, os.TempDir()+"data") isEq := func(t *testing.T, got, expected string) { t.Helper() if expected != got { @@ -35,18 +35,18 @@ func TestHelmHome(t *testing.T) { } } - isEq(t, CachePath(), "/cache/helm") - isEq(t, ConfigPath(), "/config/helm") - isEq(t, DataPath(), "/data/helm") - isEq(t, RepositoryFile(), "/config/helm/repositories.yaml") - isEq(t, RepositoryCache(), "/cache/helm/repository") - isEq(t, CacheIndex("t"), "/cache/helm/repository/t-index.yaml") - isEq(t, CacheIndex(""), "/cache/helm/repository/index.yaml") - isEq(t, Starters(), "/data/helm/starters") - isEq(t, Archive(), "/cache/helm/archive") + isEq(t, CachePath(), os.TempDir()+"cache/helm") + isEq(t, ConfigPath(), os.TempDir()+"config/helm") + isEq(t, DataPath(), os.TempDir()+"data/helm") + isEq(t, RepositoryFile(), os.TempDir()+"config/helm/repositories.yaml") + isEq(t, RepositoryCache(), os.TempDir()+"cache/helm/repository") + isEq(t, CacheIndex("t"), os.TempDir()+"cache/helm/repository/t-index.yaml") + isEq(t, CacheIndex(""), os.TempDir()+"cache/helm/repository/index.yaml") + isEq(t, Starters(), os.TempDir()+"data/helm/starters") + isEq(t, Archive(), os.TempDir()+"cache/helm/archive") // test to see if lazy-loading environment variables at runtime works - os.Setenv(xdg.CacheHomeEnvVar, "/cache2") + os.Setenv(xdg.CacheHomeEnvVar, os.TempDir()+"cache2") - isEq(t, CachePath(), "/cache2/helm") + isEq(t, CachePath(), os.TempDir()+"cache2/helm") } diff --git a/pkg/helmpath/lazypath.go b/pkg/helmpath/lazypath.go index 39d349552..1313ee7fd 100644 --- a/pkg/helmpath/lazypath.go +++ b/pkg/helmpath/lazypath.go @@ -13,6 +13,7 @@ package helmpath import ( + "fmt" "os" "path/filepath" @@ -27,7 +28,10 @@ func (l lazypath) path(envVar string, defaultFn func() string, file string) stri if base == "" { base = defaultFn() } - return filepath.Join(base, string(l), file) + path := filepath.Join(base, string(l), file) + // Create directory if not exist. + l.ensurePathExist(path) + return path } // cachePath defines the base directory relative to which user specific non-essential data files @@ -46,3 +50,18 @@ func (l lazypath) configPath(file string) string { func (l lazypath) dataPath(file string) string { return l.path(xdg.DataHomeEnvVar, dataHome, file) } + +func (l lazypath) ensurePathExist(path string) { + if fi, err := os.Stat(path); err != nil { + if err := os.MkdirAll(path, 0755); err != nil { + // FIXME - Need to discuss best way to log error message in this package, + // otherwise would need to refactor path() method. That would be huge refactor :( + fmt.Printf("creation of directory %s failed with error %s \n", path, err.Error()) + // FIXME - os.Exit() seems like anti-pattern to exit, any suggestion here ? + os.Exit(1) + } + } else if !fi.IsDir() { + fmt.Printf("%s must be a directory. \n", path) + os.Exit(1) + } +} diff --git a/pkg/repo/repo.go b/pkg/repo/repo.go index 54152a54e..6ef4219e2 100644 --- a/pkg/repo/repo.go +++ b/pkg/repo/repo.go @@ -55,9 +55,17 @@ func LoadFile(path string) (*File, error) { b, err := ioutil.ReadFile(path) if err != nil { if os.IsNotExist(err) { - return nil, errors.Errorf("couldn't load repositories file (%s).\nYou might need to run `helm init`", path) + f := NewFile() + if err := f.WriteFile(path, 0644); err != nil { + return nil, err + } + b, err = ioutil.ReadFile(path) + if err != nil { + return nil, err + } + } else { + return nil, err } - return nil, err } r := &File{} diff --git a/pkg/repo/repo_test.go b/pkg/repo/repo_test.go index 2d6e46bbd..1bdc5044f 100644 --- a/pkg/repo/repo_test.go +++ b/pkg/repo/repo_test.go @@ -19,7 +19,6 @@ package repo import "testing" import "io/ioutil" import "os" -import "strings" const testRepositoriesFile = "testdata/repositories.yaml" @@ -199,11 +198,11 @@ func TestWriteFile(t *testing.T) { } } -func TestRepoNotExists(t *testing.T) { - _, err := LoadFile("/this/path/does/not/exist.yaml") - if err == nil { - t.Errorf("expected err to be non-nil when path does not exist") - } else if !strings.Contains(err.Error(), "You might need to run `helm init`") { - t.Errorf("expected prompt to run `helm init` when repositories file does not exist") - } -} +//func TestRepoNotExists(t *testing.T) { +// _, err := LoadFile("/this/path/does/not/exist.yaml") +// if err == nil { +// t.Errorf("expected err to be non-nil when path does not exist") +// } else if !strings.Contains(err.Error(), "You might need to run `helm init`") { +// t.Errorf("expected prompt to run `helm init` when repositories file does not exist") +// } +//}