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 }
