jesseduffield.lazygit/pkg/commands/git_commands
Stefan Haller da4dfa17d5 Render the custom-patch secondary pane through the pager, via a real git diff
The secondary pane showed the custom patch with a bespoke in-memory render
(PatchBuilder.RenderAggregatedPatch / FormatView). That had two problems: it
could never be fed to a pager the way the main view's diff is (a stdin pager
might have worked, but an external diff tool like difftastic, which diffs two
files rather than a unified diff, could not), and its hand-rolled hunk/context
handling differed subtly from git's.

Materialize the patch instead as two real file trees under a temp dir — a/ holds
each patched file's "from"-side content, b/ that content with the patch applied —
and render it with `git diff --no-index`, reusing the exact pager wiring the main
view uses (stdin pager, external diff, or git's own colour as the raw fallback).
`--no-index` honors both GIT_PAGER and --ext-diff, so every pager type now renders
the custom patch like any other diff, and git computes the context, fixing the
quirks. Because the secondary is now an async diff task, the post-removal
selection reveal (which rides a task's restore) finally takes effect.

The trees are named a/b so that with --no-prefix the diff shows the real
repo-relative paths; added files are seeded empty in a/ so they pair up and show
their real paths rather than git's directory-comparison "added in b" form. The
patch builder owns the temp dir's lifetime (created on Start, removed on Reset)
and bumps a generation counter on every change, so the trees are rebuilt only
when the patch actually changes — covering the focused-main view and the old
explorer alike, without rebuilding on mere navigation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-08 12:59:00 +02:00
..
bisect.go Don't log the "git rev-list" call when marking bisect commits 2026-01-25 11:47:07 +01:00
bisect_info.go rename sha to hash 2 2024-04-12 08:33:47 +02:00
blame.go Suppress command logs for git calls related to the ctrl+f command 2026-07-19 19:22:48 +02:00
branch.go Add backward cycling support for all branches log view 2026-03-08 17:06:17 +01:00
branch_loader.go perf(branches): use for-each-ref ahead-behind for git >= 2.41 2026-04-27 07:09:23 +02:00
branch_loader_test.go perf(branches): use for-each-ref ahead-behind for git >= 2.41 2026-04-27 07:09:23 +02:00
branch_test.go Replace MergeOpts struct with MergeVariant enum 2025-10-19 21:24:28 +02:00
commit.go Thread ignoreExternalDiff through the remaining diff-cmd builders 2026-08-08 12:59:00 +02:00
commit_file_loader.go Show renamed files in the custom patch builder 2026-07-04 13:05:09 +02:00
commit_file_loader_test.go Show renamed files in the custom patch builder 2026-07-04 13:05:09 +02:00
commit_loader.go Add ActionFlag field to Commit 2026-01-28 10:15:45 +01:00
commit_loader_test.go Use a better approach for determining pushed and merge statuses 2025-07-31 15:50:53 +02:00
commit_loading_shared.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
commit_test.go Thread ignoreExternalDiff through the remaining diff-cmd builders 2026-08-08 12:59:00 +02:00
common.go Rework the custom pager config (rename to diff renderer) 2026-07-31 08:42:51 +02:00
config.go Add support for git flow using git-flow-next 2026-05-26 11:57:09 +02:00
config_test.go Add support for git flow using git-flow-next 2026-05-26 11:57:09 +02:00
custom.go Add runCommand function to Go template syntax 2025-04-09 10:44:36 +02:00
deps_test.go Rework the custom pager config (rename to diff renderer) 2026-07-31 08:42:51 +02:00
diff.go Render the custom-patch secondary pane through the pager, via a real git diff 2026-08-08 12:59:00 +02:00
file.go Support absolute paths when detecting edit preset from EDITOR env var 2026-07-30 17:31:56 +02:00
file_loader.go Honor the conflict-marker-size gitattribute 2026-08-08 12:43:42 +02:00
file_loader_test.go Honor the conflict-marker-size gitattribute 2026-08-08 12:43:42 +02:00
file_test.go Support absolute paths when detecting edit preset from EDITOR env var 2026-07-30 17:31:56 +02:00
flow.go Add support for git flow using git-flow-next 2026-05-26 11:57:09 +02:00
flow_test.go Add support for git flow using git-flow-next 2026-05-26 11:57:09 +02:00
git_command_builder.go Don't let our repo answer for a different one 2026-08-08 11:15:01 +02:00
git_command_builder_test.go Add runGitCmdOnPaths utility 2026-03-27 14:34:47 +01:00
github.go Carry aggregate check state with GitHub pull requests 2026-07-31 09:01:44 +02:00
github_test.go Carry aggregate check state with GitHub pull requests 2026-07-31 09:01:44 +02:00
hosting_service.go Remove now unused code 2026-05-10 15:28:14 +02:00
main_branches.go Cleanup: remove the ignoringWarnings hack from GetMergeBase 2025-07-31 15:21:34 +02:00
patch.go Render the custom-patch secondary pane through the pager, via a real git diff 2026-08-08 12:59:00 +02:00
rebase.go Move dragged commits in one rebase 2026-07-31 08:37:28 +02:00
rebase_test.go Fix dropping submodule changes from a commit 2025-10-10 12:55:58 +02:00
reflog_commit_loader.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
reflog_commit_loader_test.go Fix showing diffs for renamed file when filtering by path 2025-07-27 12:05:41 +02:00
remote.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
remote_loader.go Add PushUrls field to models.Remote 2026-05-04 13:09:47 +02:00
remote_loader_test.go Add PushUrls field to models.Remote 2026-05-04 13:09:47 +02:00
repo_paths.go Open the repo when lazygit is started in its .git dir 2026-08-08 11:15:01 +02:00
repo_paths_test.go Open the repo when lazygit is started in its .git dir 2026-08-08 11:15:01 +02:00
stash.go Thread ignoreExternalDiff through the remaining diff-cmd builders 2026-08-08 12:59:00 +02:00
stash_loader.go Add hash field to models.StashEntry 2025-08-25 19:23:30 +02:00
stash_loader_test.go Add hash field to models.StashEntry 2025-08-25 19:23:30 +02:00
stash_test.go Thread ignoreExternalDiff through the remaining diff-cmd builders 2026-08-08 12:59:00 +02:00
status.go Add Status.RefsSnapshot 2026-06-19 18:07:48 +02:00
status_test.go Add Status.RefsSnapshot 2026-06-19 18:07:48 +02:00
submodule.go Don't let our repo answer for a different one 2026-08-08 11:15:01 +02:00
submodule_test.go Don't let our repo answer for a different one 2026-08-08 11:15:01 +02:00
sync.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
sync_test.go Copy gocui files into lazygit repo under pkg/gocui 2026-04-30 14:29:08 +02:00
tag.go Suppress command logs for tag commands 2026-07-19 19:19:47 +02:00
tag_loader.go Revert "Add IsAnnotated field to models.Tag struct" 2025-07-28 10:53:51 +02:00
tag_loader_test.go Revert "Add IsAnnotated field to models.Tag struct" 2025-07-28 10:53:51 +02:00
version.go Add a method GitVersion.IsAtLeast 2024-01-10 09:18:38 +01:00
version_test.go Add a method GitVersion.IsAtLeast 2024-01-10 09:18:38 +01:00
working_tree.go Thread ignoreExternalDiff through the remaining diff-cmd builders 2026-08-08 12:59:00 +02:00
working_tree_test.go Extract GitCommandBuilder method AddCommonDiffArgs 2026-07-31 08:42:51 +02:00
worktree.go Don't let our repo answer for a different one 2026-08-08 11:15:01 +02:00
worktree_loader.go Don't let our repo answer for a different one 2026-08-08 11:15:01 +02:00
worktree_loader_test.go Identify the current and main worktree by git dir, not by path 2026-08-08 11:15:01 +02:00