jesseduffield.lazygit/pkg/gui
Stefan Haller 227081f1d1 Preserve whitespace when remembering a commit message
This is useful when cancelling out of the commit panel mid-sentence (after
having typed the space for the next word); when entering the commit message
panel again, the space was gone and you had to type it again. Small thing, but
it just seems better to resume the panel in exactly the state that you left it
in. (Which we actually don't do; we don't remember the cursor position, or which
of the subject/description panels was active. That would be a separate
improvement.)

The save path and the load path used to be asymmetric. On save, the textarea
getters applied strings.TrimSpace, which stripped any leading blank lines, a
trailing newline after the cursor, or indentation on the very first line of the
description — all of which are legitimate user content. On load,
SplitCommitMessageAndDescription did TrimSpace on the description as well, and
the preserved message was routed through that same git-format split because
HandleCommitPress passed it as OpenCommitMessagePanel's InitialMessage. The
result: every round-trip through "escape and reopen" silently mutated the
message.

The fix is to treat our own preservation file as its own format, distinct from
git's canonical "summary\n\nbody" format:

- The textarea getters return raw content. strings.TrimSpace moves to the one
  place that still needs it: the empty-summary check in HandleCommitConfirm (git
  itself strips trailing whitespace and blank lines, so no pre-trim is needed
  before -m).
- SplitPreservedCommitMessage / SetPreservedMessageInView split on the single
  "\n" our Join uses, without any trimming — truly lossless.
- SplitCommitMessageAndDescription keeps its git-format behavior but replaces
  TrimSpace with TrimPrefix("\n"), so it strips only the blank-line separator
  and leaves body indentation intact.
- HandleCommitPress now mirrors HandleWIPCommitPress: it no longer passes the
  preserved message as InitialMessage. OpenCommitMessagePanel resolves the
  preserved content itself, uses it for display via the preservation-format
  setter, and stores it as the initial message so the close-time "did the user
  change anything?" check still correctly detects a cleared panel.
- GetInitialMessage no longer trims. With raw getters on both sides of the
  comparison, trimming here caused spurious non-matches (e.g. for preserved
  content with trailing whitespace). The original motivation — matching a
  "WIP: " prefix with trailing space — works unchanged.
- UpdateCommitPanelView becomes dead code and is removed; its one remaining
  caller (history cycling, always git-format) goes directly through
  SetMessageAndDescriptionInView.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 18:51:17 +02:00
..
context Preserve whitespace when remembering a commit message 2026-04-21 18:51:17 +02:00
controllers Preserve whitespace when remembering a commit message 2026-04-21 18:51:17 +02:00
filetree Make file sort order and case sensitivity configurable 2026-03-30 17:53:25 +02:00
keybindings Make LabelFromKey return an empty string for unset keys 2025-07-27 12:25:16 +02:00
mergeconflicts Enable revive linter, and fix a bunch of warnings 2025-06-30 19:13:20 +02:00
modes Make Commit.Hash a getter for an unexported hash field 2025-04-29 14:57:15 +02:00
patch_exploring Fix selection after staging an added line 2026-03-19 16:57:53 +01:00
popup Strip leading/trailing whitespace from prompt input 2025-11-15 15:38:24 +01:00
presentation Hide closed pull requests on main branches 2026-04-13 21:56:49 +02:00
services/custom_commands Add condition field to custom command prompts 2026-04-06 19:14:51 +02:00
status Move Loader to presentation package 2025-05-06 09:52:53 +02:00
style Modernize all codes 2025-11-15 10:46:23 +01:00
types Add OnQuit hook for controllers 2026-04-21 11:25:29 +02:00
background.go Add pull requests to lazygit's model and refresh them 2026-04-01 09:13:55 +02:00
command_log_panel.go Add merge options menu 2025-10-09 08:45:58 +02:00
context.go Bump gocui (and tcell) 2025-12-23 16:49:16 +01:00
context_config.go Remove some unused code 2025-07-08 15:14:45 +02:00
controllers.go Preserve whitespace when remembering a commit message 2026-04-21 18:51:17 +02:00
dummies.go Move NewDummyCommon to pkg/common 2025-05-06 09:43:26 +02:00
editors.go Call gocui's SimpleEditor instead of duplicating its code 2025-12-23 16:49:16 +01:00
extras_panel.go feat: add keys for command log menu items 2025-12-14 17:12:47 +01:00
global_handlers.go Refactor: add a separate Prompt view 2025-09-05 10:42:03 +02:00
gui.go Add OnQuit hook for controllers 2026-04-21 11:25:29 +02:00
gui_common.go Implement suspending the app using ctrl-z 2025-08-14 20:41:46 +02:00
gui_driver.go Fix clicking multiple times in an integration test 2024-10-18 10:06:52 +02:00
information_panel.go Rename ModeStatus.Description to InfoLabel 2025-08-14 17:59:38 +02:00
keybindings.go Use new ShouldHandleMouseEvent hook to prevent clicks in views behind panels 2026-03-08 17:32:09 +01:00
layout.go Bump gocui and adapt lazygit code 2025-06-05 13:20:38 +02:00
main_panels.go Fix race with PTYs in integration tests 2025-03-28 11:16:04 +01:00
menu_panel.go Add an optional onCancel hook for menus 2026-04-01 09:13:55 +02:00
options_map.go Avoid duplicate key bindings in options map 2025-08-14 17:59:38 +02:00
pty.go Use a PTY when using external diff command from git config 2025-11-01 09:33:52 +01:00
pty_windows.go Export a LAZYGIT_COLUMNS variable to "pty" tasks on Windows 2025-10-09 10:04:29 +02:00
recent_repos_panel.go Remove unused field gui.IsNewRepo 2024-12-01 10:44:26 +01:00
tasks_adapter.go Close a task's stdout pipe when we are done with it 2025-08-01 10:32:46 +02:00
test_mode.go Don't use "HEADLESS" environment variable for running tests 2025-11-28 12:06:42 +01:00
view_helpers.go Avoid scrolling the selection into view on refresh 2025-12-23 15:34:38 +01:00
views.go Bump gocui 2026-01-28 20:57:09 +01:00