func (f *fetchCmd) run() error { pname := f.chartRef c := downloader.ChartDownloader{ HelmHome: helmpath.Home(homePath()), Out: f.out, Keyring: f.keyring, Verify: downloader.VerifyNever, } if f.verify { c.Verify = downloader.VerifyAlways } else if f.verifyLater { c.Verify = downloader.VerifyLater } // If untar is set, we fetch to a tempdir, then untar and copy after // verification. dest := f.destdir if f.untar { var err error dest, err = ioutil.TempDir("", "helm-") if err != nil { return fmt.Errorf("Failed to untar: %s", err) } defer os.RemoveAll(dest) } saved, v, err := c.DownloadTo(pname, f.version, dest) if err != nil { return err } if f.verify { fmt.Fprintf(f.out, "Verification: %v\n", v) } // After verification, untar the chart into the requested directory. if f.untar { ud := f.untardir if !filepath.IsAbs(ud) { ud = filepath.Join(f.destdir, ud) } if fi, err := os.Stat(ud); err != nil { if err := os.MkdirAll(ud, 0755); err != nil { return fmt.Errorf("Failed to untar (mkdir): %s", err) } } else if !fi.IsDir() { return fmt.Errorf("Failed to untar: %s is not a directory", ud) } return chartutil.ExpandFile(ud, saved) } return nil }
// locateChartPath looks for a chart directory in known places, and returns either the full path or an error. // // This does not ensure that the chart is well-formed; only that the requested filename exists. // // Order of resolution: // - current working directory // - if path is absolute or begins with '.', error out here // - chart repos in $HELM_HOME // - URL // // If 'verify' is true, this will attempt to also verify the chart. func locateChartPath(name, version string, verify bool, keyring string) (string, error) { name = strings.TrimSpace(name) version = strings.TrimSpace(version) if fi, err := os.Stat(name); err == nil { abs, err := filepath.Abs(name) if err != nil { return abs, err } if verify { if fi.IsDir() { return "", errors.New("cannot verify a directory") } if _, err := downloader.VerifyChart(abs, keyring); err != nil { return "", err } } return abs, nil } if filepath.IsAbs(name) || strings.HasPrefix(name, ".") { return name, fmt.Errorf("path %q not found", name) } crepo := filepath.Join(helmpath.Home(homePath()).Repository(), name) if _, err := os.Stat(crepo); err == nil { return filepath.Abs(crepo) } dl := downloader.ChartDownloader{ HelmHome: helmpath.Home(homePath()), Out: os.Stdout, Keyring: keyring, } if verify { dl.Verify = downloader.VerifyAlways } filename, _, err := dl.DownloadTo(name, version, ".") if err == nil { lname, err := filepath.Abs(filename) if err != nil { return filename, err } if flagDebug { fmt.Printf("Fetched %s to %s\n", name, filename) } return lname, nil } else if flagDebug { return filename, err } return filename, fmt.Errorf("file %q not found", name) }
// locateChartPath looks for a chart directory in known places, and returns either the full path or an error. // // This does not ensure that the chart is well-formed; only that the requested filename exists. // // Order of resolution: // - current working directory // - if path is absolute or begins with '.', error out here // - chart repos in $HELM_HOME // // If 'verify' is true, this will attempt to also verify the chart. func locateChartPath(name string, verify bool, keyring string) (string, error) { if fi, err := os.Stat(name); err == nil { abs, err := filepath.Abs(name) if err != nil { return abs, err } if verify { if fi.IsDir() { return "", errors.New("cannot verify a directory") } if _, err := downloader.VerifyChart(abs, keyring); err != nil { return "", err } } return abs, nil } if filepath.IsAbs(name) || strings.HasPrefix(name, ".") { return name, fmt.Errorf("path %q not found", name) } crepo := filepath.Join(repositoryDirectory(), name) if _, err := os.Stat(crepo); err == nil { return filepath.Abs(crepo) } // Try fetching the chart from a remote repo into a tmpdir origname := name if filepath.Ext(name) != ".tgz" { name += ".tgz" } dl := downloader.ChartDownloader{ HelmHome: helmpath.Home(homePath()), Out: os.Stdout, Keyring: keyring, } if verify { dl.Verify = downloader.VerifyAlways } if _, err := dl.DownloadTo(name, "."); err == nil { lname, err := filepath.Abs(filepath.Base(name)) if err != nil { return lname, err } fmt.Printf("Fetched %s to %s\n", origname, lname) return lname, nil } return name, fmt.Errorf("file %q not found", origname) }