From db79dbdd8b0a000e112691d3ca106473fcb8ae6e Mon Sep 17 00:00:00 2001 From: fcying Date: Tue, 18 Aug 2026 11:11:15 +0800 Subject: [PATCH] fix: create output parent directory automatically (#35) --- internal/init.go | 4 ++++ internal/init_test.go | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/internal/init.go b/internal/init.go index 052aec0..3b05f60 100644 --- a/internal/init.go +++ b/internal/init.go @@ -334,6 +334,10 @@ func (t *Tool) WriteJSON(filename string, _ int, data *[]Command) { } jsonData = append(jsonData, '\n') + if err := os.MkdirAll(filepath.Dir(filename), 0o755); err != nil { + t.Logger.Fatalf("create directory %v failed! err:%v", filepath.Dir(filename), err) + } + outfile, err := os.Create(filename) if err != nil { t.Logger.Fatalf("create %v failed! err:%v", filename, err) diff --git a/internal/init_test.go b/internal/init_test.go index b17d16c..8d4d457 100644 --- a/internal/init_test.go +++ b/internal/init_test.go @@ -786,6 +786,19 @@ func TestWriteJSONFileEndsWithOneNewline(t *testing.T) { } } +func TestWriteJSONCreatesMissingParentDirectory(t *testing.T) { + outputFile := filepath.Join(t.TempDir(), "build", "nested", "compile_commands.json") + tool := newTestTool(t, Config{OutputFile: outputFile, NoStrict: true}) + commands := []Command{{Directory: "/project", Arguments: []string{"cc", "-c", "main.c"}, File: "main.c"}} + + tool.WriteJSON(outputFile, len(commands), &commands) + + entries := readTestDatabase(t, outputFile) + if len(entries) != 1 || entries[0]["file"] != "main.c" { + t.Fatalf("unexpected entries: %#v", entries) + } +} + func TestWriteJSONStdoutReturnsCanceledStatusWhenBlocked(t *testing.T) { oldStdout := os.Stdout r, w, err := os.Pipe()