Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package helm for openSUSE:Factory checked in at 2021-09-20 23:32:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/helm (Old) and /work/SRC/openSUSE:Factory/.helm.new.1899 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "helm" Mon Sep 20 23:32:09 2021 rev:28 rq:919363 version:3.6.3 Changes: -------- --- /work/SRC/openSUSE:Factory/helm/helm.changes 2021-07-18 23:44:58.827031614 +0200 +++ /work/SRC/openSUSE:Factory/.helm.new.1899/helm.changes 2021-09-20 23:32:44.527143107 +0200 @@ -1,0 +2,21 @@ +Thu Sep 16 02:32:04 UTC 2021 - jenting.hs...@suse.com + +- Update to version 3.6.3: + * Ensure RawPath match Path when resolving reference + * Set Helm as manager for managedFields + * fix(dep update): helm dep update is not respecting the "version" stipulated in the requirements + * fix(doc): fix kube client interface doc. (#9882) + * use TLS client information from repo config when downloading a chart + * Adding test for user/pass without repo on Helm install + * Fix the url being set by WithURL on the getters + * tweak basic handling + * keep existing behavior of returning ErrReleaseNotFound when release(s) failed to decode + * fix(sql storage): Query() should return ErrReleaseNotFound immediately when no records are found + * Add Test cases for repository-config without file extension + * Correctly determine repository-config lockfile path + * Fixed Test + * Added test for lint mode + * Fail message is now the same as the required message. Fixed #8973 Helm function 'fail' should not fail when doing 'helm lint' + * fix helm dep build/update doesn't inherit --insecure-skip-tls-verify from helm repo add + +------------------------------------------------------------------- Old: ---- helm-3.6.2.tar.gz New: ---- helm-3.6.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ helm.spec ++++++ --- /var/tmp/diff_new_pack.XnbRme/_old 2021-09-20 23:32:45.243143992 +0200 +++ /var/tmp/diff_new_pack.XnbRme/_new 2021-09-20 23:32:45.243143992 +0200 @@ -17,11 +17,11 @@ %define goipath helm.sh/helm/v3 -%define git_commit ee407bdf364942bcb8e8c665f82e15aa28009b71 +%define git_commit d506314abfb5d21419df8c7e7e68012379db2354 %define git_dirty clean Name: helm -Version: 3.6.2 +Version: 3.6.3 Release: 0 Summary: The Kubernetes Package Manager License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.XnbRme/_old 2021-09-20 23:32:45.279144036 +0200 +++ /var/tmp/diff_new_pack.XnbRme/_new 2021-09-20 23:32:45.279144036 +0200 @@ -5,7 +5,7 @@ <param name="exclude">.git</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> - <param name="revision">v3.6.2</param> + <param name="revision">v3.6.3</param> <param name="changesgenerate">enable</param> </service> <service name="recompress" mode="disabled"> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.XnbRme/_old 2021-09-20 23:32:45.299144061 +0200 +++ /var/tmp/diff_new_pack.XnbRme/_new 2021-09-20 23:32:45.299144061 +0200 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/helm/helm.git</param> - <param name="changesrevision">ee407bdf364942bcb8e8c665f82e15aa28009b71</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">d506314abfb5d21419df8c7e7e68012379db2354</param></service></servicedata> \ No newline at end of file ++++++ helm-3.6.2.tar.gz -> helm-3.6.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/cmd/helm/helm.go new/helm-3.6.3/cmd/helm/helm.go --- old/helm-3.6.2/cmd/helm/helm.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/cmd/helm/helm.go 2021-07-14 19:25:00.000000000 +0200 @@ -32,6 +32,7 @@ "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/gates" + "helm.sh/helm/v3/pkg/kube" kubefake "helm.sh/helm/v3/pkg/kube/fake" "helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/storage/driver" @@ -59,6 +60,12 @@ } func main() { + // Setting the name of the app for managedFields in the Kubernetes client. + // It is set here to the full name of "helm" so that renaming of helm to + // another name (e.g., helm2 or helm3) does not change the name of the + // manager as picked up by the automated name detection. + kube.ManagedFieldsManager = "helm" + actionConfig := new(action.Configuration) cmd, err := newRootCmd(actionConfig, os.Stdout, os.Args[1:]) if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/cmd/helm/repo_add.go new/helm-3.6.3/cmd/helm/repo_add.go --- old/helm-3.6.2/cmd/helm/repo_add.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/cmd/helm/repo_add.go 2021-07-14 19:25:00.000000000 +0200 @@ -114,7 +114,14 @@ } // Acquire a file lock for process synchronization - fileLock := flock.New(strings.Replace(o.repoFile, filepath.Ext(o.repoFile), ".lock", 1)) + repoFileExt := filepath.Ext(o.repoFile) + var lockPath string + if len(repoFileExt) > 0 && len(repoFileExt) < len(o.repoFile) { + lockPath = strings.Replace(o.repoFile, repoFileExt, ".lock", 1) + } else { + lockPath = o.repoFile + ".lock" + } + fileLock := flock.New(lockPath) lockCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() locked, err := fileLock.TryLockContext(lockCtx, time.Second) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/cmd/helm/repo_add_test.go new/helm-3.6.3/cmd/helm/repo_add_test.go --- old/helm-3.6.2/cmd/helm/repo_add_test.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/cmd/helm/repo_add_test.go 2021-07-14 19:25:00.000000000 +0200 @@ -142,6 +142,18 @@ repoAddConcurrent(t, testName, repoFile) } +func TestRepoAddConcurrentNoFileExtension(t *testing.T) { + const testName = "test-name-3" + repoFile := filepath.Join(ensure.TempDir(t), "repositories") + repoAddConcurrent(t, testName, repoFile) +} + +func TestRepoAddConcurrentHiddenFile(t *testing.T) { + const testName = "test-name-4" + repoFile := filepath.Join(ensure.TempDir(t), ".repositories") + repoAddConcurrent(t, testName, repoFile) +} + func repoAddConcurrent(t *testing.T, testName, repoFile string) { ts, err := repotest.NewTempServerWithCleanup(t, "testdata/testserver/*.*") if err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/internal/resolver/resolver.go new/helm-3.6.3/internal/resolver/resolver.go --- old/helm-3.6.2/internal/resolver/resolver.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/internal/resolver/resolver.go 2021-07-14 19:25:00.000000000 +0200 @@ -57,6 +57,11 @@ locked := make([]*chart.Dependency, len(reqs)) missing := []string{} for i, d := range reqs { + constraint, err := semver.NewConstraint(d.Version) + if err != nil { + return nil, errors.Wrapf(err, "dependency %q has an invalid version/constraint format", d.Name) + } + if d.Repository == "" { // Local chart subfolder if _, err := GetLocalPath(filepath.Join("charts", d.Name), r.chartpath); err != nil { @@ -77,13 +82,22 @@ return nil, err } - // The version of the chart locked will be the version of the chart - // currently listed in the file system within the chart. ch, err := loader.LoadDir(chartpath) if err != nil { return nil, err } + v, err := semver.NewVersion(ch.Metadata.Version) + if err != nil { + // Not a legit entry. + continue + } + + if !constraint.Check(v) { + missing = append(missing, d.Name) + continue + } + locked[i] = &chart.Dependency{ Name: d.Name, Repository: d.Repository, @@ -92,11 +106,6 @@ continue } - constraint, err := semver.NewConstraint(d.Version) - if err != nil { - return nil, errors.Wrapf(err, "dependency %q has an invalid version/constraint format", d.Name) - } - repoName := repoNames[d.Name] // if the repository was not defined, but the dependency defines a repository url, bypass the cache if repoName == "" && d.Repository != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/internal/resolver/resolver_test.go new/helm-3.6.3/internal/resolver/resolver_test.go --- old/helm-3.6.2/internal/resolver/resolver_test.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/internal/resolver/resolver_test.go 2021-07-14 19:25:00.000000000 +0200 @@ -29,6 +29,18 @@ err bool }{ { + name: "repo from invalid version", + req: []*chart.Dependency{ + {Name: "base", Repository: "file://base", Version: "1.1.0"}, + }, + expect: &chart.Lock{ + Dependencies: []*chart.Dependency{ + {Name: "base", Repository: "file://base", Version: "0.1.0"}, + }, + }, + err: true, + }, + { name: "version failure", req: []*chart.Dependency{ {Name: "oedipus-rex", Repository: "http://example.com", Version: ">a1"}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/downloader/manager.go new/helm-3.6.3/pkg/downloader/manager.go --- old/helm-3.6.2/pkg/downloader/manager.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/downloader/manager.go 2021-07-14 19:25:00.000000000 +0200 @@ -310,7 +310,7 @@ // Any failure to resolve/download a chart should fail: // https://github.com/helm/helm/issues/1439 - churl, username, password, passcredentialsall, err := m.findChartURL(dep.Name, dep.Version, dep.Repository, repos) + churl, username, password, insecureskiptlsverify, passcredentialsall, caFile, certFile, keyFile, err := m.findChartURL(dep.Name, dep.Version, dep.Repository, repos) if err != nil { saveError = errors.Wrapf(err, "could not find %s", churl) break @@ -333,6 +333,8 @@ Options: []getter.Option{ getter.WithBasicAuth(username, password), getter.WithPassCredentialsAll(passcredentialsall), + getter.WithInsecureSkipVerifyTLS(insecureskiptlsverify), + getter.WithTLSClientConfig(certFile, keyFile, caFile), }, } @@ -686,9 +688,9 @@ // repoURL is the repository to search // // If it finds a URL that is "relative", it will prepend the repoURL. -func (m *Manager) findChartURL(name, version, repoURL string, repos map[string]*repo.ChartRepository) (url, username, password string, passcredentialsall bool, err error) { +func (m *Manager) findChartURL(name, version, repoURL string, repos map[string]*repo.ChartRepository) (url, username, password string, insecureskiptlsverify, passcredentialsall bool, caFile, certFile, keyFile string, err error) { if strings.HasPrefix(repoURL, "oci://") { - return fmt.Sprintf("%s/%s:%s", repoURL, name, version), "", "", false, nil + return fmt.Sprintf("%s/%s:%s", repoURL, name, version), "", "", false, false, "", "", "", nil } for _, cr := range repos { @@ -711,15 +713,19 @@ username = cr.Config.Username password = cr.Config.Password passcredentialsall = cr.Config.PassCredentialsAll + insecureskiptlsverify = cr.Config.InsecureSkipTLSverify + caFile = cr.Config.CAFile + certFile = cr.Config.CertFile + keyFile = cr.Config.KeyFile return } } - url, err = repo.FindChartInRepoURL(repoURL, name, version, "", "", "", m.Getters) + url, err = repo.FindChartInRepoURL(repoURL, name, version, certFile, keyFile, caFile, m.Getters) if err == nil { - return url, username, password, false, err + return url, username, password, false, false, "", "", "", err } err = errors.Errorf("chart %s not found in %s: %s", name, repoURL, err) - return url, username, password, false, err + return url, username, password, false, false, "", "", "", err } // findEntryByName finds an entry in the chart repository whose name matches the given name. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/downloader/manager_test.go new/helm-3.6.3/pkg/downloader/manager_test.go --- old/helm-3.6.2/pkg/downloader/manager_test.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/downloader/manager_test.go 2021-07-14 19:25:00.000000000 +0200 @@ -81,14 +81,43 @@ version := "0.1.0" repoURL := "http://example.com/charts" - churl, username, password, passcredentialsall, err := m.findChartURL(name, version, repoURL, repos) + churl, username, password, insecureSkipTLSVerify, passcredentialsall, _, _, _, err := m.findChartURL(name, version, repoURL, repos) if err != nil { t.Fatal(err) } + if churl != "https://charts.helm.sh/stable/alpine-0.1.0.tgz" { t.Errorf("Unexpected URL %q", churl) } if username != "" { + t.Errorf("Unexpected username %q", username) + } + if password != "" { + t.Errorf("Unexpected password %q", password) + } + if passcredentialsall != false { + t.Errorf("Unexpected passcredentialsall %t", passcredentialsall) + } + if insecureSkipTLSVerify { + t.Errorf("Unexpected insecureSkipTLSVerify %t", insecureSkipTLSVerify) + } + + name = "tlsfoo" + version = "1.2.3" + repoURL = "https://example-https-insecureskiptlsverify.com" + + churl, username, password, insecureSkipTLSVerify, passcredentialsall, _, _, _, err = m.findChartURL(name, version, repoURL, repos) + if err != nil { + t.Fatal(err) + } + + if !insecureSkipTLSVerify { + t.Errorf("Unexpected insecureSkipTLSVerify %t", insecureSkipTLSVerify) + } + if churl != "https://example.com/tlsfoo-1.2.3.tgz" { + t.Errorf("Unexpected URL %q", churl) + } + if username != "" { t.Errorf("Unexpected username %q", username) } if password != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/downloader/testdata/repositories.yaml new/helm-3.6.3/pkg/downloader/testdata/repositories.yaml --- old/helm-3.6.2/pkg/downloader/testdata/repositories.yaml 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/downloader/testdata/repositories.yaml 2021-07-14 19:25:00.000000000 +0200 @@ -21,3 +21,6 @@ certFile: "cert" keyFile: "key" caFile: "ca" + - name: testing-https-insecureskip-tls-verify + url: "https://example-https-insecureskiptlsverify.com" + insecure_skip_tls_verify: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/downloader/testdata/repository/testing-https-insecureskip-tls-verify-index.yaml new/helm-3.6.3/pkg/downloader/testdata/repository/testing-https-insecureskip-tls-verify-index.yaml --- old/helm-3.6.2/pkg/downloader/testdata/repository/testing-https-insecureskip-tls-verify-index.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/helm-3.6.3/pkg/downloader/testdata/repository/testing-https-insecureskip-tls-verify-index.yaml 2021-07-14 19:25:00.000000000 +0200 @@ -0,0 +1,14 @@ +apiVersion: v1 +entries: + tlsfoo: + - name: tlsfoo + description: TLS FOO Chart + home: https://helm.sh/helm + keywords: [] + maintainers: [] + sources: + - https://github.com/helm/charts + urls: + - https://example.com/tlsfoo-1.2.3.tgz + version: 1.2.3 + checksum: 0e6661f193211d7a5206918d42f5c2a9470b7373 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/engine/engine.go new/helm-3.6.3/pkg/engine/engine.go --- old/helm-3.6.2/pkg/engine/engine.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/engine/engine.go 2021-07-14 19:25:00.000000000 +0200 @@ -173,6 +173,16 @@ return val, nil } + // Override sprig fail function for linting and wrapping message + funcMap["fail"] = func(msg string) (string, error) { + if e.LintMode { + // Don't fail when linting + log.Printf("[INFO] Fail: %s", msg) + return "", nil + } + return "", errors.New(warnWrap(msg)) + } + // If we are not linting and have a cluster connection, provide a Kubernetes-backed // implementation. if !e.LintMode && e.config != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/engine/engine_test.go new/helm-3.6.3/pkg/engine/engine_test.go --- old/helm-3.6.2/pkg/engine/engine_test.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/engine/engine_test.go 2021-07-14 19:25:00.000000000 +0200 @@ -286,6 +286,35 @@ } } +func TestFailErrors(t *testing.T) { + vals := chartutil.Values{"Values": map[string]interface{}{}} + + failtpl := `All your base are belong to us{{ fail "This is an error" }}` + tplsFailed := map[string]renderable{ + "failtpl": {tpl: failtpl, vals: vals}, + } + _, err := new(Engine).render(tplsFailed) + if err == nil { + t.Fatalf("Expected failures while rendering: %s", err) + } + expected := `execution error at (failtpl:1:33): This is an error` + if err.Error() != expected { + t.Errorf("Expected '%s', got %q", expected, err.Error()) + } + + var e Engine + e.LintMode = true + out, err := e.render(tplsFailed) + if err != nil { + t.Fatal(err) + } + + expectStr := "All your base are belong to us" + if gotStr := out["failtpl"]; gotStr != expectStr { + t.Errorf("Expected %q, got %q (%v)", expectStr, gotStr, out) + } +} + func TestAllTemplates(t *testing.T) { ch1 := &chart.Chart{ Metadata: &chart.Metadata{Name: "ch1"}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/kube/client.go new/helm-3.6.3/pkg/kube/client.go --- old/helm-3.6.2/pkg/kube/client.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/kube/client.go 2021-07-14 19:25:00.000000000 +0200 @@ -21,6 +21,8 @@ "encoding/json" "fmt" "io" + "os" + "path/filepath" "strings" "sync" "time" @@ -55,6 +57,10 @@ var metadataAccessor = meta.NewAccessor() +// ManagedFieldsManager is the name of the manager of Kubernetes managedFields +// first introduced in Kubernetes 1.18 +var ManagedFieldsManager string + // Client represents a client capable of communicating with the Kubernetes API. type Client struct { Factory Factory @@ -100,7 +106,7 @@ return c.kubeClient, err } -// IsReachable tests connectivity to the cluster +// IsReachable tests connectivity to the cluster. func (c *Client) IsReachable() error { client, err := c.getKubeClient() if err == genericclioptions.ErrEmptyConfig { @@ -126,7 +132,7 @@ return &Result{Created: resources}, nil } -// Wait up to the given timeout for the specified resources to be ready +// Wait waits up to the given timeout for the specified resources to be ready. func (c *Client) Wait(resources ResourceList, timeout time.Duration) error { cs, err := c.getKubeClient() if err != nil { @@ -206,7 +212,7 @@ return err } - helper := resource.NewHelper(info.Client, info.Mapping) + helper := resource.NewHelper(info.Client, info.Mapping).WithFieldManager(getManagedFieldsManager()) if _, err := helper.Get(info.Namespace, info.Name); err != nil { if !apierrors.IsNotFound(err) { return errors.Wrap(err, "could not get information about the resource") @@ -324,7 +330,7 @@ // WatchUntilReady watches the resources given and waits until it is ready. // -// This function is mainly for hook implementations. It watches for a resource to +// This method is mainly for hook implementations. It watches for a resource to // hit a particular milestone. The milestone depends on the Kind. // // For most kinds, it checks to see if the resource is marked as Added or Modified @@ -359,6 +365,26 @@ return nil } +// getManagedFieldsManager returns the manager string. If one was set it will be returned. +// Otherwise, one is calculated based on the name of the binary. +func getManagedFieldsManager() string { + + // When a manager is explicitly set use it + if ManagedFieldsManager != "" { + return ManagedFieldsManager + } + + // When no manager is set and no calling application can be found it is unknown + if len(os.Args[0]) == 0 { + return "unknown" + } + + // When there is an application that can be determined and no set manager + // use the base name. This is one of the ways Kubernetes libs handle figuring + // names out. + return filepath.Base(os.Args[0]) +} + func batchPerform(infos ResourceList, fn func(*resource.Info) error, errs chan<- error) { var kind string var wg sync.WaitGroup @@ -377,7 +403,7 @@ } func createResource(info *resource.Info) error { - obj, err := resource.NewHelper(info.Client, info.Mapping).Create(info.Namespace, true, info.Object) + obj, err := resource.NewHelper(info.Client, info.Mapping).WithFieldManager(getManagedFieldsManager()).Create(info.Namespace, true, info.Object) if err != nil { return err } @@ -387,7 +413,7 @@ func deleteResource(info *resource.Info) error { policy := metav1.DeletePropagationBackground opts := &metav1.DeleteOptions{PropagationPolicy: &policy} - _, err := resource.NewHelper(info.Client, info.Mapping).DeleteWithOptions(info.Namespace, info.Name, opts) + _, err := resource.NewHelper(info.Client, info.Mapping).WithFieldManager(getManagedFieldsManager()).DeleteWithOptions(info.Namespace, info.Name, opts) return err } @@ -402,7 +428,7 @@ } // Fetch the current object for the three way merge - helper := resource.NewHelper(target.Client, target.Mapping) + helper := resource.NewHelper(target.Client, target.Mapping).WithFieldManager(getManagedFieldsManager()) currentObj, err := helper.Get(target.Namespace, target.Name) if err != nil && !apierrors.IsNotFound(err) { return nil, types.StrategicMergePatchType, errors.Wrapf(err, "unable to get data for current object %s/%s", target.Namespace, target.Name) @@ -444,7 +470,7 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, force bool) error { var ( obj runtime.Object - helper = resource.NewHelper(target.Client, target.Mapping) + helper = resource.NewHelper(target.Client, target.Mapping).WithFieldManager(getManagedFieldsManager()) kind = target.Mapping.GroupVersionKind.Kind ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/kube/interface.go new/helm-3.6.3/pkg/kube/interface.go --- old/helm-3.6.2/pkg/kube/interface.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/kube/interface.go 2021-07-14 19:25:00.000000000 +0200 @@ -30,14 +30,19 @@ // Create creates one or more resources. Create(resources ResourceList) (*Result, error) + // Wait waits up to the given timeout for the specified resources to be ready. Wait(resources ResourceList, timeout time.Duration) error + // WaitWithJobs wait up to the given timeout for the specified resources to be ready, including jobs. WaitWithJobs(resources ResourceList, timeout time.Duration) error // Delete destroys one or more resources. Delete(resources ResourceList) (*Result, []error) - // Watch the resource in reader until it is "ready". This method + // WatchUntilReady watches the resources given and waits until it is ready. + // + // This method is mainly for hook implementations. It watches for a resource to + // hit a particular milestone. The milestone depends on the Kind. // // For Jobs, "ready" means the Job ran to completion (exited without error). // For Pods, "ready" means the Pod phase is marked "succeeded". @@ -49,9 +54,9 @@ // if it doesn't exist. Update(original, target ResourceList, force bool) (*Result, error) - // Build creates a resource list from a Reader + // Build creates a resource list from a Reader. // - // reader must contain a YAML stream (one or more YAML documents separated + // Reader must contain a YAML stream (one or more YAML documents separated // by "\n---\n") // // Validates against OpenAPI schema if validate is true. @@ -61,7 +66,7 @@ // and returns said phase (PodSucceeded or PodFailed qualify). WaitAndGetCompletedPodPhase(name string, timeout time.Duration) (v1.PodPhase, error) - // isReachable checks whether the client is able to connect to the cluster + // IsReachable checks whether the client is able to connect to the cluster. IsReachable() error } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/repo/chartrepo.go new/helm-3.6.3/pkg/repo/chartrepo.go --- old/helm-3.6.2/pkg/repo/chartrepo.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/repo/chartrepo.go 2021-07-14 19:25:00.000000000 +0200 @@ -286,7 +286,8 @@ // ResolveReferenceURL resolves refURL relative to baseURL. // If refURL is absolute, it simply returns refURL. func ResolveReferenceURL(baseURL, refURL string) (string, error) { - parsedBaseURL, err := url.Parse(baseURL) + // We need a trailing slash for ResolveReference to work, but make sure there isn't already one + parsedBaseURL, err := url.Parse(strings.TrimSuffix(baseURL, "/") + "/") if err != nil { return "", errors.Wrapf(err, "failed to parse %s as URL", baseURL) } @@ -296,8 +297,6 @@ return "", errors.Wrapf(err, "failed to parse %s as URL", refURL) } - // We need a trailing slash for ResolveReference to work, but make sure there isn't already one - parsedBaseURL.Path = strings.TrimSuffix(parsedBaseURL.Path, "/") + "/" return parsedBaseURL.ResolveReference(parsedRefURL).String(), nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/repo/chartrepo_test.go new/helm-3.6.3/pkg/repo/chartrepo_test.go --- old/helm-3.6.2/pkg/repo/chartrepo_test.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/repo/chartrepo_test.go 2021-07-14 19:25:00.000000000 +0200 @@ -400,4 +400,12 @@ if chartURL != "https://charts.helm.sh/stable/nginx-0.2.0.tgz" { t.Errorf("%s", chartURL) } + + chartURL, err = ResolveReferenceURL("http://localhost:8123/charts%2fwith%2fescaped%2fslash", "nginx-0.2.0.tgz") + if err != nil { + t.Errorf("%s", err) + } + if chartURL != "http://localhost:8123/charts%2fwith%2fescaped%2fslash/nginx-0.2.0.tgz" { + t.Errorf("%s", chartURL) + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/storage/driver/sql.go new/helm-3.6.3/pkg/storage/driver/sql.go --- old/helm-3.6.2/pkg/storage/driver/sql.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/storage/driver/sql.go 2021-07-14 19:25:00.000000000 +0200 @@ -310,6 +310,10 @@ return nil, err } + if len(records) == 0 { + return nil, ErrReleaseNotFound + } + var releases []*rspb.Release for _, record := range records { release, err := decodeRelease(record.Body) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/helm-3.6.2/pkg/storage/driver/sql_test.go new/helm-3.6.3/pkg/storage/driver/sql_test.go --- old/helm-3.6.2/pkg/storage/driver/sql_test.go 2021-06-29 17:08:03.000000000 +0200 +++ new/helm-3.6.3/pkg/storage/driver/sql_test.go 2021-07-14 19:25:00.000000000 +0200 @@ -292,6 +292,11 @@ func TestSqlQuery(t *testing.T) { // Reflect actual use cases in ../storage.go + labelSetUnknown := map[string]string{ + "name": "smug-pigeon", + "owner": sqlReleaseDefaultOwner, + "status": "unknown", + } labelSetDeployed := map[string]string{ "name": "smug-pigeon", "owner": sqlReleaseDefaultOwner, @@ -322,6 +327,15 @@ mock. ExpectQuery(regexp.QuoteMeta(query)). + WithArgs("smug-pigeon", sqlReleaseDefaultOwner, "unknown", "default"). + WillReturnRows( + mock.NewRows([]string{ + sqlReleaseTableBodyColumn, + }), + ).RowsWillBeClosed() + + mock. + ExpectQuery(regexp.QuoteMeta(query)). WithArgs("smug-pigeon", sqlReleaseDefaultOwner, "deployed", "default"). WillReturnRows( mock.NewRows([]string{ @@ -353,6 +367,13 @@ ), ).RowsWillBeClosed() + _, err := sqlDriver.Query(labelSetUnknown) + if err == nil { + t.Errorf("Expected error {%v}, got nil", ErrReleaseNotFound) + } else if err != ErrReleaseNotFound { + t.Fatalf("failed to query for unknown smug-pigeon release: %v", err) + } + results, err := sqlDriver.Query(labelSetDeployed) if err != nil { t.Fatalf("failed to query for deployed smug-pigeon release: %v", err) ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/helm/vendor.tar.gz /work/SRC/openSUSE:Factory/.helm.new.1899/vendor.tar.gz differ: char 5, line 1