From fec2561774037e728a0081cdc2bb42267672ade6 Mon Sep 17 00:00:00 2001 From: kyu08 <49891479+kyu08@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:50:06 +0900 Subject: [PATCH 1/3] fix: strip trailing newline from git show output in preview buffer git show output includes a POSIX trailing newline, which vim.split turns into an extra empty line. Neovim buffers don't represent the file-terminating newline as a line, so the preview always showed a spurious diff at the end of every file. Strip exactly one trailing \n before splitting to match Neovim's buffer representation. Closes #101 Co-Authored-By: Claude Opus 4.6 --- lua/fude/preview.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/fude/preview.lua b/lua/fude/preview.lua index 848dd4e..29c7296 100644 --- a/lua/fude/preview.lua +++ b/lua/fude/preview.lua @@ -38,6 +38,9 @@ function M.open_preview(source_win) end local preview_buf = vim.api.nvim_create_buf(false, true) + if content:sub(-1) == "\n" then + content = content:sub(1, -2) + end local lines = vim.split(content, "\n", { trimempty = false }) vim.api.nvim_buf_set_lines(preview_buf, 0, -1, false, lines) From a83a15151c91038b673083288f60ead7f567fb19 Mon Sep 17 00:00:00 2001 From: kyu08 <49891479+kyu08@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:50:10 +0900 Subject: [PATCH 2/3] test: add trailing newline handling tests for preview Update mock content to include a trailing newline matching real git show output. Add line count assertion and a dedicated test for content without a trailing newline. Co-Authored-By: Claude Opus 4.6 --- tests/fude/preview_integration_spec.lua | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/tests/fude/preview_integration_spec.lua b/tests/fude/preview_integration_spec.lua index 4fbaa82..184af06 100644 --- a/tests/fude/preview_integration_spec.lua +++ b/tests/fude/preview_integration_spec.lua @@ -6,7 +6,7 @@ describe("preview integration", function() before_each(function() config.setup({}) helpers.mock_diff({ ["source.lua"] = "source.lua" }) - helpers.mock_base_content("base line 1\nbase line 2\nbase line 3") + helpers.mock_base_content("base line 1\nbase line 2\nbase line 3\n") end) after_each(function() @@ -42,11 +42,30 @@ describe("preview integration", function() assert.is_not_nil(config.state.preview_buf) local lines = vim.api.nvim_buf_get_lines(config.state.preview_buf, 0, -1, false) + assert.are.equal(3, #lines) assert.are.equal("base line 1", lines[1]) assert.are.equal("base line 2", lines[2]) assert.are.equal("base line 3", lines[3]) end) + it("handles base content without trailing newline", function() + helpers.mock_base_content("no trailing newline") + + local buf = helpers.create_buf({ "current line 1" }, "source.lua") + local source_win = vim.api.nvim_get_current_win() + vim.api.nvim_win_set_buf(source_win, buf) + + config.state.active = true + config.state.base_ref = "main" + config.state.scope = "full_pr" + + preview.open_preview(source_win) + + local lines = vim.api.nvim_buf_get_lines(config.state.preview_buf, 0, -1, false) + assert.are.equal(1, #lines) + assert.are.equal("no trailing newline", lines[1]) + end) + it("enables diff mode on both windows", function() local buf = helpers.create_buf({ "line 1", "line 2" }, "source.lua") local source_win = vim.api.nvim_get_current_win() From 0c9e0fc18a40ba46d583d776cf10c7e015c23ed9 Mon Sep 17 00:00:00 2001 From: kyu08 <49891479+kyu08@users.noreply.github.com> Date: Tue, 16 Jun 2026 18:05:16 +0900 Subject: [PATCH 3/3] test: add trailing blank line preservation test for preview Verify that a file ending with multiple newlines (e.g. "line 1\n\n") correctly preserves the trailing blank line in the preview buffer. Co-Authored-By: Claude Opus 4.6 --- tests/fude/preview_integration_spec.lua | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/fude/preview_integration_spec.lua b/tests/fude/preview_integration_spec.lua index 184af06..99c2ad1 100644 --- a/tests/fude/preview_integration_spec.lua +++ b/tests/fude/preview_integration_spec.lua @@ -66,6 +66,25 @@ describe("preview integration", function() assert.are.equal("no trailing newline", lines[1]) end) + it("preserves trailing blank lines in base content", function() + helpers.mock_base_content("line 1\n\n") + + local buf = helpers.create_buf({ "current line 1" }, "source.lua") + local source_win = vim.api.nvim_get_current_win() + vim.api.nvim_win_set_buf(source_win, buf) + + config.state.active = true + config.state.base_ref = "main" + config.state.scope = "full_pr" + + preview.open_preview(source_win) + + local lines = vim.api.nvim_buf_get_lines(config.state.preview_buf, 0, -1, false) + assert.are.equal(2, #lines) + assert.are.equal("line 1", lines[1]) + assert.are.equal("", lines[2]) + end) + it("enables diff mode on both windows", function() local buf = helpers.create_buf({ "line 1", "line 2" }, "source.lua") local source_win = vim.api.nvim_get_current_win()