diff --git a/pkg/downloader/manager.go b/pkg/downloader/manager.go index bf9b384fd..f8d8cac9c 100644 --- a/pkg/downloader/manager.go +++ b/pkg/downloader/manager.go @@ -325,14 +325,7 @@ func (m *Manager) getRepoNames(deps []*chartutil.Dependency) (map[string]string, for _, dd := range deps { // if dep chart is from local path, verify the path is valid if strings.HasPrefix(dd.Repository, "file://") { - depPath, err := filepath.Abs(strings.TrimPrefix(dd.Repository, "file://")) - if err != nil { - return nil, err - } - - if _, err = os.Stat(depPath); os.IsNotExist(err) { - return nil, fmt.Errorf("directory %s not found", depPath) - } else if err != nil { + if _, err := resolver.GetLocalPath(dd.Repository, m.ChartPath); err != nil { return nil, err } @@ -537,17 +530,11 @@ func tarFromLocalDir(chartpath string, name string, repo string, version string) return "", fmt.Errorf("wrong format: chart %s repository %s", name, repo) } - origPath, err := filepath.Abs(strings.TrimPrefix(repo, "file://")) + origPath, err := resolver.GetLocalPath(repo, chartpath) if err != nil { return "", err } - if _, err = os.Stat(origPath); os.IsNotExist(err) { - return "", fmt.Errorf("directory %s not found: %s", origPath, err) - } else if err != nil { - return "", err - } - ch, err := chartutil.LoadDir(origPath) if err != nil { return "", err diff --git a/pkg/resolver/resolver.go b/pkg/resolver/resolver.go index 858ca272d..e8a599002 100644 --- a/pkg/resolver/resolver.go +++ b/pkg/resolver/resolver.go @@ -58,14 +58,8 @@ func (r *Resolver) Resolve(reqs *chartutil.Requirements, repoNames map[string]st missing := []string{} for i, d := range reqs.Dependencies { if strings.HasPrefix(d.Repository, "file://") { - depPath, err := filepath.Abs(strings.TrimPrefix(d.Repository, "file://")) - if err != nil { - return nil, err - } - if _, err = os.Stat(depPath); os.IsNotExist(err) { - return nil, fmt.Errorf("directory %s not found", depPath) - } else if err != nil { + if _, err := GetLocalPath(d.Repository, r.chartpath); err != nil { return nil, err } @@ -136,3 +130,28 @@ func HashReq(req *chartutil.Requirements) (string, error) { s, err := provenance.Digest(bytes.NewBuffer(data)) return "sha256:" + s, err } + +// GetLocalPath generates absolute local path when use +// "file://" in repository of requirements +func GetLocalPath(repo string, chartpath string) (string, error) { + var depPath string + var err error + p := strings.TrimPrefix(repo, "file://") + + // root path is absolute + if strings.HasPrefix(p, "/") { + if depPath, err = filepath.Abs(p); err != nil { + return "", err + } + } else { + depPath = filepath.Join(chartpath, p) + } + + if _, err = os.Stat(depPath); os.IsNotExist(err) { + return "", fmt.Errorf("directory %s not found", depPath) + } else if err != nil { + return "", err + } + + return depPath, nil +} diff --git a/pkg/resolver/resolver_test.go b/pkg/resolver/resolver_test.go index 4a4f853b7..8d4b86019 100644 --- a/pkg/resolver/resolver_test.go +++ b/pkg/resolver/resolver_test.go @@ -81,12 +81,12 @@ func TestResolve(t *testing.T) { name: "repo from valid local path", req: &chartutil.Requirements{ Dependencies: []*chartutil.Dependency{ - {Name: "signtest", Repository: "file://../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, + {Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, }, }, expect: &chartutil.RequirementsLock{ Dependencies: []*chartutil.Dependency{ - {Name: "signtest", Repository: "file://../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, + {Name: "signtest", Repository: "file://../../../../cmd/helm/testdata/testcharts/signtest", Version: "0.1.0"}, }, }, },