diff options
author | Stefan Haller <stefan@haller-berlin.de> | 2024-04-22 18:58:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-22 18:58:55 +0200 |
commit | b4fbfd20cb411132310a7fed5d16a2df601894bc (patch) | |
tree | a81e2abd9ef9574e0a6ea3b578ff9895346cbaf0 | |
parent | 580818e935e19a67f7fe1bbb148224a95781879c (diff) | |
parent | ef99e47d09f4c3d474c8a239c3cb029c06c241c3 (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.go | 2 | ||||
-rw-r--r-- | pkg/utils/rebase_todo_test.go | 17 |
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"}, |