summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Haller <stefan@haller-berlin.de>2024-04-22 18:58:55 +0200
committerGitHub <noreply@github.com>2024-04-22 18:58:55 +0200
commitb4fbfd20cb411132310a7fed5d16a2df601894bc (patch)
treea81e2abd9ef9574e0a6ea3b578ff9895346cbaf0
parent580818e935e19a67f7fe1bbb148224a95781879c (diff)
parentef99e47d09f4c3d474c8a239c3cb029c06c241c3 (diff)
Fix amend to operation not working with non-HEAD merge commit (#3510)
- **PR Description** Resolves https://github.com/jesseduffield/lazygit/issues/3421 The error is "Expected exactly one original SHA, found 0" but the merge commit hash (`d6a7a04c626e40071133de26ebe8fdd225caa5c0`) is present in the rebase TODO file. ![image](https://github.com/jesseduffield/lazygit/assets/13722457/2e6d5fdb-af9f-4eae-9972-8e51a77ba614) ![image](https://github.com/jesseduffield/lazygit/assets/13722457/65dd4b1b-b080-47b0-9079-71c5e0d76cd2) However, the commit is missed during search because the filter is only looking for pick commits: https://github.com/jesseduffield/lazygit/blob/580818e935e19a67f7fe1bbb148224a95781879c/pkg/utils/rebase_todo.go#L238 Checking for merge commits as well fixes the issue. I believe only pick and merge should be valid here. If already in an interactive rebase, lazygit only allows amending to the current HEAD commit. When that happens, this whole interactive rebase logic is bypassed and lazygit just performs `git commit --amend`: https://github.com/jesseduffield/lazygit/blob/580818e935e19a67f7fe1bbb148224a95781879c/pkg/gui/controllers/local_commits_controller.go#L668 This is the reason why amending to a HEAD merge commit currently works whereas non-HEAD does not.
-rw-r--r--pkg/utils/rebase_todo.go2
-rw-r--r--pkg/utils/rebase_todo_test.go17
2 files changed, 17 insertions, 2 deletions
diff --git a/pkg/utils/rebase_todo.go b/pkg/utils/rebase_todo.go
index fca1944f1..216d56f26 100644
--- a/pkg/utils/rebase_todo.go
+++ b/pkg/utils/rebase_todo.go
@@ -235,7 +235,7 @@ func MoveFixupCommitDown(fileName string, originalHash string, fixupHash string,
func moveFixupCommitDown(todos []todo.Todo, originalHash string, fixupHash string) ([]todo.Todo, error) {
isOriginal := func(t todo.Todo) bool {
- return t.Command == todo.Pick && equalHash(t.Commit, originalHash)
+ return (t.Command == todo.Pick || t.Command == todo.Merge) && equalHash(t.Commit, originalHash)
}
isFixup := func(t todo.Todo) bool {
diff --git a/pkg/utils/rebase_todo_test.go b/pkg/utils/rebase_todo_test.go
index 9e7e6ca97..913b055cd 100644
--- a/pkg/utils/rebase_todo_test.go
+++ b/pkg/utils/rebase_todo_test.go
@@ -284,7 +284,6 @@ func TestRebaseCommands_moveFixupCommitDown(t *testing.T) {
expectedErr: nil,
},
{
- // TODO: is this something we actually want to support?
name: "fixup commit is separated from original commit",
todos: []todo.Todo{
{Command: todo.Pick, Commit: "original"},
@@ -301,6 +300,22 @@ func TestRebaseCommands_moveFixupCommitDown(t *testing.T) {
expectedErr: nil,
},
{
+ name: "fixup commit is separated from original merge commit",
+ todos: []todo.Todo{
+ {Command: todo.Merge, Commit: "original"},
+ {Command: todo.Pick, Commit: "other"},
+ {Command: todo.Pick, Commit: "fixup"},
+ },
+ originalHash: "original",
+ fixupHash: "fixup",
+ expectedTodos: []todo.Todo{
+ {Command: todo.Merge, Commit: "original"},
+ {Command: todo.Fixup, Commit: "fixup"},
+ {Command: todo.Pick, Commit: "other"},
+ },
+ expectedErr: nil,
+ },
+ {
name: "More original hashes than expected",
todos: []todo.Todo{
{Command: todo.Pick, Commit: "original"},