From 92dd80c3e3af0c399261272889cc21c5efaaac08 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Wed, 12 Jun 2024 12:13:07 +0200 Subject: [PATCH] Suspend lazygit when continuing a rebase with exec todos It's likely that the exec todos are some kind of lengthy build task whose output the user will want to see in the terminal. --- .../helpers/merge_and_rebase_helper.go | 21 ++++++++++++++++++- .../interactive_rebase/show_exec_todos.go | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/pkg/gui/controllers/helpers/merge_and_rebase_helper.go b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go index c2aa1418a..c5ad78c47 100644 --- a/pkg/gui/controllers/helpers/merge_and_rebase_helper.go +++ b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go @@ -9,10 +9,12 @@ import ( "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands/git_commands" + "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/types/enums" "github.com/jesseduffield/lazygit/pkg/gui/types" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/samber/lo" + "github.com/stefanhaller/git-todo-parser/todo" ) type MergeAndRebaseHelper struct { @@ -110,7 +112,12 @@ func (self *MergeAndRebaseHelper) genericMergeCommand(command string) error { // we should end up with a command like 'git merge --continue' // it's impossible for a rebase to require a commit so we'll use a subprocess only if it's a merge - if status == enums.REBASE_MODE_MERGING && command != REBASE_OPTION_ABORT && self.c.UserConfig.Git.Merging.ManualCommit { + needsSubprocess := (status == enums.REBASE_MODE_MERGING && command != REBASE_OPTION_ABORT && self.c.UserConfig.Git.Merging.ManualCommit) || + // but we'll also use a subprocess if we have exec todos; those are likely to be lengthy build + // tasks whose output the user will want to see in the terminal + (status == enums.REBASE_MODE_REBASING && command != REBASE_OPTION_ABORT && self.hasExecTodos()) + + if needsSubprocess { // TODO: see if we should be calling more of the code from self.Git.Rebase.GenericMergeOrRebaseAction return self.c.RunSubprocessAndRefresh( self.c.Git().Rebase.GenericMergeOrRebaseActionCmdObj(commandType, command), @@ -123,6 +130,18 @@ func (self *MergeAndRebaseHelper) genericMergeCommand(command string) error { return nil } +func (self *MergeAndRebaseHelper) hasExecTodos() bool { + for _, commit := range self.c.Model().Commits { + if commit.Status != models.StatusRebasing { + break + } + if commit.Action == todo.Exec { + return true + } + } + return false +} + var conflictStrings = []string{ "Failed to merge in the changes", "When you have resolved this problem", diff --git a/pkg/integration/tests/interactive_rebase/show_exec_todos.go b/pkg/integration/tests/interactive_rebase/show_exec_todos.go index bf10737e4..b66036d02 100644 --- a/pkg/integration/tests/interactive_rebase/show_exec_todos.go +++ b/pkg/integration/tests/interactive_rebase/show_exec_todos.go @@ -38,7 +38,7 @@ var ShowExecTodos = NewIntegrationTest(NewIntegrationTestArgs{ ). Tap(func() { t.Common().ContinueRebase() - t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("Rebasing (4/4)Executing: false")).Confirm() + t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("exit status 1")).Confirm() }). Lines( Contains("CI ◯ <-- YOU ARE HERE --- commit 03"),