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 6e2ab62974690b170e17c603699948ab29fd2ed4
Author: Szymon Janc <[email protected]>
AuthorDate: Mon Oct 19 17:55:44 2026 +0200

    newt/docs: Report doxygen and sphinx-build failures
    
    "newt docs build" ignored errors from doxygen and sphinx-build and
    always exited with status 0. Return the errors and report them.
    
    Assisted-by: Claude:claude-opus-5-5
---
 newt/cli/docs_cmds.go        |  9 +++++++--
 newt/docs/docsbuilder.go     | 23 ++++++++++++++---------
 newt/error_reporting_test.go | 31 +++++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+), 11 deletions(-)

diff --git a/newt/cli/docs_cmds.go b/newt/cli/docs_cmds.go
index 9950a53a..24a626b2 100644
--- a/newt/cli/docs_cmds.go
+++ b/newt/cli/docs_cmds.go
@@ -28,8 +28,13 @@ import (
 
 func docsBuildRunCmd(cmd *cobra.Command, args []string) {
        wd, _ := os.Getwd()
-       db, _ := docs.NewDocsBuilder()
-       db.Build(wd + "/_build")
+       db, err := docs.NewDocsBuilder()
+       if err != nil {
+               NewtUsage(nil, err)
+       }
+       if err := db.Build(wd + "/_build"); err != nil {
+               NewtUsage(nil, err)
+       }
 }
 
 func AddDocsCommands(cmd *cobra.Command) {
diff --git a/newt/docs/docsbuilder.go b/newt/docs/docsbuilder.go
index b869e63e..12e923d0 100644
--- a/newt/docs/docsbuilder.go
+++ b/newt/docs/docsbuilder.go
@@ -72,17 +72,19 @@ func (db *DocsBuilder) generateDoxygen(doc *DocDescriptor, 
tmpdir string) error
        util.StatusMessage(util.VERBOSITY_DEFAULT,
                "Preparing docs, running doxygen in %s\n", doc.path)
 
-       util.CallInDir(doc.path, func() error {
+       err := util.CallInDir(doc.path, func() error {
                // Run doxygen
                doxygenGenerate := []string{
                        "doxygen",
                        "doxygen.xml",
                }
 
-               util.ShellCommand(doxygenGenerate, nil)
-
-               return nil
+               _, err := util.ShellCommand(doxygenGenerate, nil)
+               return err
        })
+       if err != nil {
+               return err
+       }
 
        util.MoveDir(doc.path+"/_gen/_xml", tmpdir+"/"+doc.name+"-xml")
        os.RemoveAll(doc.path + "/_gen")
@@ -105,7 +107,10 @@ func (db *DocsBuilder) Build(outdir string) error {
                }
 
                if util.NodeExist(doc.path + "/doxygen.xml") {
-                       db.generateDoxygen(doc, tmpdir)
+                       if err := db.generateDoxygen(doc, tmpdir); err != nil {
+                               os.RemoveAll(tmpdir)
+                               return err
+                       }
                }
 
                tmpPath := tmpdir + "/"
@@ -124,7 +129,7 @@ func (db *DocsBuilder) Build(outdir string) error {
        util.StatusMessage(util.VERBOSITY_DEFAULT,
                "Generating documentation in %s placing results in %s\n", 
tmpdir, outdir)
 
-       util.CallInDir(tmpdir, func() error {
+       err := util.CallInDir(tmpdir, func() error {
                // Time to run the build!
                sphinxBuild := []string{
                        "sphinx-build",
@@ -133,13 +138,13 @@ func (db *DocsBuilder) Build(outdir string) error {
                        outdir,
                }
 
-               util.ShellCommand(sphinxBuild, nil)
-               return nil
+               _, err := util.ShellCommand(sphinxBuild, nil)
+               return err
        })
 
        util.StatusMessage(util.VERBOSITY_DEFAULT,
                "Cleaning up result of generated documentation\n")
        os.RemoveAll(tmpdir)
 
-       return nil
+       return err
 }
diff --git a/newt/error_reporting_test.go b/newt/error_reporting_test.go
index e479931d..8dfddd87 100644
--- a/newt/error_reporting_test.go
+++ b/newt/error_reporting_test.go
@@ -22,6 +22,7 @@ package main
 import (
        "os"
        "path/filepath"
+       "runtime"
        "strings"
        "testing"
 )
@@ -239,3 +240,33 @@ func TestErrorReportingNestedRepository(t *testing.T) {
                t.Errorf("missing warning\n%s", out)
        }
 }
+
+// Failure of sphinx-build must make "newt docs build" fail.
+func TestErrorReportingDocsBuild(t *testing.T) {
+       if runtime.GOOS == "windows" {
+               t.Skip("fake sphinx-build is a shell script")
+       }
+
+       dir := copyToTemp(t, errorReportingProjDir)
+       binDir := t.TempDir()
+       errorReportingWriteFiles(t, dir, map[string]string{
+               "docs/index.rst": "Test\n",
+       })
+       errorReportingWriteFiles(t, binDir, map[string]string{
+               "sphinx-build": "#!/bin/sh\necho sphinx failed >&2\nexit 1\n",
+       })
+       if err := os.Chmod(filepath.Join(binDir, "sphinx-build"),
+               0755); err != nil {
+
+               t.Fatal(err)
+       }
+
+       cmd := newtExecCmd(dir, []string{"PATH=" + binDir}, "docs", "build")
+       out, err := cmd.CombinedOutput()
+       if err == nil {
+               t.Errorf("newt docs build succeeded\n%s", out)
+       }
+       if !strings.Contains(string(out), "sphinx failed") {
+               t.Errorf("missing sphinx-build error\n%s", out)
+       }
+}

Reply via email to