From b86a491ab567d3ae78140f9cbaacc6e5542694d2 Mon Sep 17 00:00:00 2001 From: Peter Mertz Date: Thu, 26 Feb 2026 14:20:45 -0500 Subject: [PATCH] Fix diff view crash when Go nil slices serialize as null Go's JSON marshaling encodes nil slices as `null` instead of `[]`. The frontend crashes with "Cannot read properties of null (reading 'length')" when iterating over file.hunks or hunk.lines that are null. Initialize all slice fields (Files, Hunks, Lines) to empty slices so they serialize as `[]` in JSON. Co-Authored-By: Claude Opus 4.6 --- internal/api/sessions.go | 2 +- internal/git/diff.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/api/sessions.go b/internal/api/sessions.go index 3b8722a..8fd4d9c 100644 --- a/internal/api/sessions.go +++ b/internal/api/sessions.go @@ -229,7 +229,7 @@ func (h *SessionsHandler) HandleDiff(w http.ResponseWriter, r *http.Request) { if baseCommit == "" { baseCommit = inferBaseCommit(h.db, worktreePath, sourceBranch, repoID) if baseCommit == "" { - WriteJSON(w, http.StatusOK, git.DiffResult{}) + WriteJSON(w, http.StatusOK, git.DiffResult{Files: []git.DiffFile{}}) return } // Backfill so we don't recompute next time diff --git a/internal/git/diff.go b/internal/git/diff.go index 6e6673d..fa59a46 100644 --- a/internal/git/diff.go +++ b/internal/git/diff.go @@ -88,7 +88,7 @@ func Diff(worktreePath, baseCommit string) (*DiffResult, error) { // parseDiff parses unified diff output into structured types. func parseDiff(raw string) (*DiffResult, error) { - result := &DiffResult{} + result := &DiffResult{Files: []DiffFile{}} if strings.TrimSpace(raw) == "" { return result, nil @@ -111,7 +111,7 @@ func parseDiff(raw string) (*DiffResult, error) { if currentFile != nil { result.Files = append(result.Files, *currentFile) } - currentFile = &DiffFile{Status: "modified"} + currentFile = &DiffFile{Status: "modified", Hunks: []DiffHunk{}} currentHunk = nil continue } @@ -270,7 +270,7 @@ func parseHunkHeader(line string) (*DiffHunk, error) { return nil, fmt.Errorf("malformed hunk range") } - hunk := &DiffHunk{Header: line} + hunk := &DiffHunk{Header: line, Lines: []DiffLine{}} // Parse old range (-start,count) oldRange := strings.TrimPrefix(parts[0], "-")