1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-04-09 07:24:03 +02:00

Ask to auto-stage unstaged files when continuing a rebase after resolving conflicts

This commit is contained in:
Stefan Haller 2024-08-31 17:39:56 +02:00
parent 3cffed9412
commit ba21d4e651
5 changed files with 118 additions and 0 deletions

View File

@ -247,6 +247,36 @@ func (self *MergeAndRebaseHelper) PromptToContinueRebase() error {
Title: self.c.Tr.Continue,
Prompt: self.c.Tr.ConflictsResolved,
HandleConfirm: func() error {
// By the time we get here, we might have unstaged changes again,
// e.g. if the user had to fix build errors after resolving the
// conflicts, but after lazygit opened the prompt already. Ask again
// to auto-stage these.
// Need to refresh the files to be really sure if this is the case.
// We would otherwise be relying on lazygit's auto-refresh on focus,
// but this is not supported by all terminals or on all platforms.
if err := self.c.Refresh(types.RefreshOptions{
Mode: types.SYNC, Scope: []types.RefreshableView{types.FILES},
}); err != nil {
return err
}
root := self.c.Contexts().Files.FileTreeViewModel.GetRoot()
if root.GetHasUnstagedChanges() {
return self.c.Confirm(types.ConfirmOpts{
Title: self.c.Tr.Continue,
Prompt: self.c.Tr.UnstagedFilesAfterConflictsResolved,
HandleConfirm: func() error {
self.c.LogAction(self.c.Tr.Actions.StageAllFiles)
if err := self.c.Git().WorkingTree.StageAll(); err != nil {
return err
}
return self.genericMergeCommand(REBASE_OPTION_CONTINUE)
},
})
}
return self.genericMergeCommand(REBASE_OPTION_CONTINUE)
},
})

View File

@ -296,6 +296,7 @@ type TranslationSet struct {
ReflogCommitsTitle string
ConflictsResolved string
Continue string
UnstagedFilesAfterConflictsResolved string
RebasingTitle string
RebasingFromBaseCommitTitle string
SimpleRebase string
@ -1278,6 +1279,7 @@ func EnglishTranslationSet() *TranslationSet {
GlobalTitle: "Global keybindings",
ConflictsResolved: "All merge conflicts resolved. Continue?",
Continue: "Continue",
UnstagedFilesAfterConflictsResolved: "Files have been modified since conflicts were resolved. Auto-stage them and continue?",
Keybindings: "Keybindings",
KeybindingsMenuSectionLocal: "Local",
KeybindingsMenuSectionGlobal: "Global",

View File

@ -0,0 +1,76 @@
package branch
import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
"github.com/jesseduffield/lazygit/pkg/integration/tests/shared"
)
var RebaseConflictsFixBuildErrors = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Rebase onto another branch, deal with the conflicts. While continue prompt is showing, fix build errors; get another prompt when continuing.",
ExtraCmdArgs: []string{},
Skip: false,
SetupConfig: func(config *config.AppConfig) {},
SetupRepo: func(shell *Shell) {
shared.MergeConflictsSetup(shell)
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
t.Views().Commits().TopLines(
Contains("first change"),
Contains("original"),
)
t.Views().Branches().
Focus().
Lines(
Contains("first-change-branch"),
Contains("second-change-branch"),
Contains("original-branch"),
).
SelectNextItem().
Press(keys.Branches.RebaseBranch)
t.ExpectPopup().Menu().
Title(Equals("Rebase 'first-change-branch'")).
Select(Contains("Simple rebase")).
Confirm()
t.Common().AcknowledgeConflicts()
t.Views().Files().
IsFocused().
SelectedLine(Contains("file")).
PressEnter()
t.Views().MergeConflicts().
IsFocused().
SelectNextItem().
PressPrimaryAction()
t.Views().Information().Content(Contains("Rebasing"))
popup := t.ExpectPopup().Confirmation().
Title(Equals("Continue")).
Content(Contains("All merge conflicts resolved. Continue?"))
// While the popup is showing, fix some build errors
t.Shell().UpdateFile("file", "make it compile again")
// Continue
popup.Confirm()
t.ExpectPopup().Confirmation().
Title(Equals("Continue")).
Content(Contains("Files have been modified since conflicts were resolved. Auto-stage them and continue?")).
Confirm()
t.Views().Information().Content(DoesNotContain("Rebasing"))
t.Views().Commits().TopLines(
Contains("first change"),
Contains("second-change-branch unrelated change"),
Contains("second change"),
Contains("original"),
)
},
})

View File

@ -94,6 +94,15 @@ var DiscardAllDirChanges = NewIntegrationTest(NewIntegrationTestArgs{
}).
Tap(func() {
t.Common().ContinueOnConflictsResolved()
t.ExpectPopup().Confirmation().
Title(Equals("Continue")).
Content(Contains("Files have been modified since conflicts were resolved. Auto-stage them and continue?")).
Cancel()
t.GlobalPress(keys.Universal.CreateRebaseOptionsMenu)
t.ExpectPopup().Menu().
Title(Equals("Merge options")).
Select(Contains("continue")).
Confirm()
}).
Lines(
Contains("dir").IsSelected(),

View File

@ -51,6 +51,7 @@ var tests = []*components.IntegrationTest{
branch.RebaseAbortOnConflict,
branch.RebaseAndDrop,
branch.RebaseCancelOnConflict,
branch.RebaseConflictsFixBuildErrors,
branch.RebaseCopiedBranch,
branch.RebaseDoesNotAutosquash,
branch.RebaseFromMarkedBase,