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 e053aae3b9b3f34b0f8db8c0d6c1aa3bc0e36bc2
Author: Szymon Janc <[email protected]>
AuthorDate: Mon Oct 19 17:47:38 2026 +0200

    newt/builder: Fix CMakeLists.txt truncation on target cmake error
    
    newt target cmake created CMakeLists.txt before resolving and
    preparing the target, so any error (e.g. a syscfg conflict) left an
    empty file behind, destroying the previous content.
    
    The output is already generated into a buffer; write the file only
    after generation succeeded and report write errors.
    
    Assisted-by: Claude:claude-opus-5-5
---
 newt/build_errors_test.go | 18 ++++++++++++++++++
 newt/builder/cmake.go     | 13 ++++++-------
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/newt/build_errors_test.go b/newt/build_errors_test.go
index eead14a1..0cfa4467 100644
--- a/newt/build_errors_test.go
+++ b/newt/build_errors_test.go
@@ -82,3 +82,21 @@ func TestBuildEmptyExtCmd(t *testing.T) {
                })
        }
 }
+
+func TestBuildCmakeErrorKeepsFile(t *testing.T) {
+       dir := buildErrProject(t)
+       path := filepath.Join(dir, "CMakeLists.txt")
+       content := "# user content\n"
+       if err := os.WriteFile(path, []byte(content), 0644); err != nil {
+               t.Fatal(err)
+       }
+
+       out, err := newtCombinedOutput(dir, nil, "target", "cmake", "fail")
+       if err == nil {
+               t.Fatalf("newt target cmake succeeded unexpectedly:\n%s", out)
+       }
+
+       if got := readFile(t, path); got != content {
+               t.Fatalf("CMakeLists.txt modified on error; got:\n%q", got)
+       }
+}
diff --git a/newt/builder/cmake.go b/newt/builder/cmake.go
index 45381d57..6e5a37b3 100644
--- a/newt/builder/cmake.go
+++ b/newt/builder/cmake.go
@@ -428,14 +428,8 @@ func CmakeHeaderWrite(w io.Writer, c *toolchain.Compiler, 
projectName string) {
 }
 
 func CMakeTargetGenerate(target *target.Target) error {
-       CmakeFileHandle, err := os.Create(CmakeListsPath())
-       if err != nil {
-               return util.ChildNewtError(err)
-       }
-
        var b = bytes.Buffer{}
        w := bufio.NewWriter(&b)
-       defer CmakeFileHandle.Close()
 
        targetBuilder, err := NewTargetBuilder(target)
        if err != nil {
@@ -459,6 +453,11 @@ func CMakeTargetGenerate(target *target.Target) error {
 
        w.Flush()
 
-       CmakeFileHandle.Write(b.Bytes())
+       // Only write the file once generation succeeded so that an error does
+       // not destroy an existing CMakeLists.txt.
+       if err := os.WriteFile(CmakeListsPath(), b.Bytes(), 0644); err != nil {
+               return util.ChildNewtError(err)
+       }
+
        return nil
 }

Reply via email to