You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ja...@apache.org on 2026/10/20 19:30:32 UTC

(mynewt-newt) 02/15: newt/cli: Report errors from loading package repos on upgrade

This is an automated email from the ASF dual-hosted git repository.

sjanc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git

commit e6d8b5e429e3b2787fd835d9b9fccfb85ae1098d
Author: Szymon Janc <sz...@codecoup.pl>
AuthorDate: Mon Oct 19 17:46:37 2026 +0200

    newt/cli: Report errors from loading package repos on upgrade
    
    Error from GetPkgRepos() was ignored, so invalid "repository.*"
    definitions in pkg.yml (bad version, missing type or url, unreadable
    patches directory) made "newt upgrade" silently do nothing and exit
    with status 0. Report the error.
    
    Assisted-by: Claude:claude-opus-5-5
---
 newt/cli/project_cmds.go     |  4 ++-
 newt/error_reporting_test.go | 58 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/newt/cli/project_cmds.go b/newt/cli/project_cmds.go
index eb10191e..4caa9f21 100644
--- a/newt/cli/project_cmds.go
+++ b/newt/cli/project_cmds.go
@@ -130,7 +130,9 @@ func upgradeRunCmd(cmd *cobra.Command, args []string) {
 	proj := TryGetOrDownloadProject()
 	interfaces.SetProject(proj)
 
-	proj.GetPkgRepos()
+	if err := proj.GetPkgRepos(); err != nil {
+		NewtUsage(nil, err)
+	}
 	proj.SetGitEnvVariables()
 
 	pred := makeRepoPredicate(args)
diff --git a/newt/error_reporting_test.go b/newt/error_reporting_test.go
index bed2f4d2..ea83b336 100644
--- a/newt/error_reporting_test.go
+++ b/newt/error_reporting_test.go
@@ -17,10 +17,11 @@
  * under the License.
  */
 
-
 package main
 
 import (
+	"os"
+	"path/filepath"
 	"strings"
 	"testing"
 )
@@ -48,6 +49,24 @@ func errorReportingExpectFail(t *testing.T, dir string,
 	return out
 }
 
+// errorReportingWriteFiles creates files in dir. files maps paths relative
+// to dir to contents.
+func errorReportingWriteFiles(t *testing.T, dir string,
+	files map[string]string) {
+
+	t.Helper()
+
+	for name, content := range files {
+		path := filepath.Join(dir, filepath.FromSlash(name))
+		if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
+			t.Fatal(err)
+		}
+		if err := os.WriteFile(path, []byte(content), 0644); err != nil {
+			t.Fatal(err)
+		}
+	}
+}
+
 // Unknown commands and flags must make newt exit with an error.
 func TestErrorReportingUnknownCommand(t *testing.T) {
 	dir := t.TempDir()
@@ -63,3 +82,40 @@ func TestErrorReportingUnknownCommand(t *testing.T) {
 			"target", "show", "--nosuchflag")
 	})
 }
+
+// Invalid external repository definitions in pkg.yml must make newt upgrade
+// fail instead of being silently ignored.
+func TestErrorReportingUpgradePkgRepos(t *testing.T) {
+	tests := []struct {
+		name string
+		repo string
+		msg  string
+	}{
+		{
+			name: "bad-version",
+			repo: "    type: git\n    vers: notaversion\n" +
+				"    url: https://dummy.invalid/ext.git\n",
+			msg: `Repo "ext" contains invalid version requirement`,
+		},
+		{
+			name: "missing-type",
+			repo: "    vers: 0.0.0\n" +
+				"    url: https://dummy.invalid/ext.git\n",
+			msg: "Missing type for repository ext",
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			dir := t.TempDir()
+			errorReportingWriteFiles(t, dir, map[string]string{
+				"project.yml": "project.name: test\n",
+				"apps/ext/pkg.yml": "pkg.name: apps/ext\n" +
+					"pkg.type: lib\n" +
+					"repository.ext:\n" + tt.repo,
+			})
+
+			errorReportingExpectFail(t, dir, []string{tt.msg}, "upgrade")
+		})
+	}
+}