From 28a87bd11f434cfea79fe984739eece15749d5d6 Mon Sep 17 00:00:00 2001 From: Samuel K Date: Sat, 25 Apr 2026 14:38:04 -0500 Subject: [PATCH 1/2] fix(ux): remove duplicate error logging in feature downloads processOCIFeature and processDirectTarFeature logged errors at Error level AND returned the error, causing duplicate messages when callers also display the returned error. Demote to Debugf where the log adds context beyond the error (featureId, reference, destination), remove entirely where the log duplicates the error content. --- pkg/devcontainer/feature/features.go | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/pkg/devcontainer/feature/features.go b/pkg/devcontainer/feature/features.go index 2668e1314..021842114 100644 --- a/pkg/devcontainer/feature/features.go +++ b/pkg/devcontainer/feature/features.go @@ -163,7 +163,7 @@ func processOCIFeature(id string) (string, error) { ref, err := name.ParseReference(id) if err != nil { - log.Errorf("failed to parse OCI reference: error=%v, featureId=%s", err, id) + log.Debugf("failed to parse OCI reference: error=%v, featureId=%s", err, id) return "", err } @@ -171,20 +171,19 @@ func processOCIFeature(id string) (string, error) { img, err := remote.Image(ref, remote.WithAuthFromKeychain(authn.DefaultKeychain)) if err != nil { err = image.SanitizeRegistryError(err) - log.Errorf("failed to fetch OCI image: error=%v, reference=%s", err, ref.String()) + log.Debugf("failed to fetch OCI image: error=%v, reference=%s", err, ref.String()) return "", err } destFile := filepath.Join(featureFolder, "feature.tgz") err = downloadLayer(img, id, destFile) if err != nil { - log.Errorf("failed to download feature layer: error=%v, featureId=%s", err, id) + log.Debugf("failed to download feature layer: error=%v, featureId=%s", err, id) return "", err } file, err := os.Open(destFile) if err != nil { - log.Errorf("failed to open downloaded feature file: error=%v, file=%s", err, destFile) return "", err } defer func() { _ = file.Close() }() @@ -192,11 +191,7 @@ func processOCIFeature(id string) (string, error) { log.Debugf("extract feature: destination=%s", featureExtractedFolder) err = extract.Extract(file, featureExtractedFolder) if err != nil { - log.Errorf( - "failed to extract feature: error=%v, destination=%s", - err, - featureExtractedFolder, - ) + log.Debugf("failed to extract feature: error=%v, destination=%s", err, featureExtractedFolder) _ = os.RemoveAll(featureExtractedFolder) return "", err } @@ -358,7 +353,6 @@ func processDirectTarFeature( downloadBase := id[strings.LastIndex(id, "/"):] if !directTarballRegEx.MatchString(downloadBase) { - log.Errorf("invalid tarball filename format: filename=%s", downloadBase) return "", fmt.Errorf( "expected tarball name to follow 'devcontainer-feature-.tgz' format. Received '%s' ", downloadBase, @@ -386,14 +380,14 @@ func processDirectTarFeature( downloadFile := filepath.Join(featureFolder, "feature.tgz") err = downloadFeatureFromURL(id, downloadFile, httpHeaders) if err != nil { - log.Errorf("failed to download feature tarball: error=%v, url=%s", err, id) + log.Debugf("failed to download feature tarball: error=%v, url=%s", err, id) return "", err } storeIntegrityHash(featureFolder, downloadFile, id) if err := extractTarball(downloadFile, featureExtractedFolder); err != nil { - log.Errorf("failed to extract tarball: error=%v, featureId=%s", err, id) + log.Debugf("failed to extract tarball: error=%v, featureId=%s", err, id) return "", err } @@ -415,7 +409,6 @@ func downloadFeatureFromURL( // #nosec G301 -- TODO Consider using a more secure permission setting and ownership if needed. err := os.MkdirAll(filepath.Dir(destFile), 0o755) if err != nil { - log.Errorf("failed to create feature folder: error=%v, dir=%s", err, filepath.Dir(destFile)) return fmt.Errorf("create feature folder: %w", err) } @@ -430,7 +423,6 @@ func downloadFeatureFromURL( log.Debugf("download feature: url=%s", url) if err := tryDownload(url, destFile, httpHeaders); err != nil { if attempt == 2 { - log.Errorf("all download attempts failed: error=%v, url=%s", err, url) return err } log.Debugf("download attempt failed: error=%v, attempt=%v", err, attempt) From ae02c0e9f40d30ae60880a053b1ae59d85fc9abd Mon Sep 17 00:00:00 2001 From: Samuel K Date: Sat, 25 Apr 2026 14:43:50 -0500 Subject: [PATCH 2/2] fix: break long log line to satisfy golines linter --- pkg/devcontainer/feature/features.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/devcontainer/feature/features.go b/pkg/devcontainer/feature/features.go index 021842114..9ff3dc42e 100644 --- a/pkg/devcontainer/feature/features.go +++ b/pkg/devcontainer/feature/features.go @@ -191,7 +191,11 @@ func processOCIFeature(id string) (string, error) { log.Debugf("extract feature: destination=%s", featureExtractedFolder) err = extract.Extract(file, featureExtractedFolder) if err != nil { - log.Debugf("failed to extract feature: error=%v, destination=%s", err, featureExtractedFolder) + log.Debugf( + "failed to extract feature: error=%v, destination=%s", + err, + featureExtractedFolder, + ) _ = os.RemoveAll(featureExtractedFolder) return "", err }