mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-09-14 01:26:24 -04:00
With the recently added external change detection, it happens more often now that we refresh the commits list because an agent made a commit in the background. In this case, if we keep the selection index the same, it now points at a different commit, making the main view show a different commit too, which is confusing and annoying. To fix this, track the selected commit and range anchor by hash before reloading, then restore those rows if both hashes still exist. This also allows us to get rid of some bespoke code that did this for the specific cases of reverting a commit or cherry-picking commits, because those are now handled by the generic mechanism.
102 lines
2.8 KiB
Go
102 lines
2.8 KiB
Go
package cherry_pick
|
|
|
|
import (
|
|
"github.com/jesseduffield/lazygit/pkg/config"
|
|
. "github.com/jesseduffield/lazygit/pkg/integration/components"
|
|
"github.com/jesseduffield/lazygit/pkg/integration/tests/shared"
|
|
)
|
|
|
|
var CherryPickConflicts = NewIntegrationTest(NewIntegrationTestArgs{
|
|
Description: "Cherry pick commits from the subcommits view, with conflicts",
|
|
ExtraCmdArgs: []string{},
|
|
Skip: false,
|
|
SetupConfig: func(config *config.AppConfig) {
|
|
config.GetUserConfig().Git.LocalBranchSortOrder = "recency"
|
|
},
|
|
SetupRepo: func(shell *Shell) {
|
|
shared.MergeConflictsSetup(shell)
|
|
},
|
|
Run: func(t *TestDriver, keys config.KeybindingConfig) {
|
|
t.Views().Branches().
|
|
Focus().
|
|
Lines(
|
|
Contains("first-change-branch"),
|
|
Contains("second-change-branch"),
|
|
Contains("original-branch"),
|
|
).
|
|
SelectNextItem().
|
|
PressEnter()
|
|
|
|
t.Views().SubCommits().
|
|
IsFocused().
|
|
TopLines(
|
|
Contains("second-change-branch unrelated change"),
|
|
Contains("second change"),
|
|
).
|
|
Press(keys.Commits.CherryPickCopy).
|
|
Tap(func() {
|
|
t.Views().Information().Content(Contains("1 commit copied"))
|
|
}).
|
|
SelectNextItem().
|
|
Press(keys.Commits.CherryPickCopy)
|
|
|
|
t.Views().Information().Content(Contains("2 commits copied"))
|
|
|
|
t.Views().Commits().
|
|
Focus().
|
|
TopLines(
|
|
Contains("first change").IsSelected(),
|
|
).
|
|
Press(keys.Commits.PasteCommits)
|
|
|
|
t.ExpectPopup().Alert().
|
|
Title(Equals("Cherry-pick")).
|
|
Content(Contains("Are you sure you want to cherry-pick the 2 copied commit(s) onto this branch?")).
|
|
Confirm()
|
|
|
|
t.Common().AcknowledgeConflicts()
|
|
|
|
// cherry pick selection is not cleared when there are conflicts, so that the user
|
|
// is able to abort and try again without having to re-copy the commits
|
|
t.Views().Information().Content(Contains("2 commits copied"))
|
|
|
|
t.Views().Files().
|
|
IsFocused().
|
|
SelectedLine(Contains("file")).
|
|
PressEnter()
|
|
|
|
t.Views().MergeConflicts().
|
|
IsFocused().
|
|
// picking 'Second change'
|
|
SelectNextItem().
|
|
PressPrimaryAction()
|
|
|
|
t.Common().ContinueOnConflictsResolved("cherry-pick")
|
|
|
|
t.Views().Files().IsEmpty()
|
|
|
|
t.Views().Commits().
|
|
Focus().
|
|
TopLines(
|
|
Contains("second-change-branch unrelated change"),
|
|
Contains("second change"),
|
|
Contains("first change").IsSelected(),
|
|
).
|
|
SelectPreviousItem().
|
|
Tap(func() {
|
|
// because we picked 'Second change' when resolving the conflict,
|
|
// we now see this commit as having replaced First Change with Second Change,
|
|
// as opposed to replacing 'Original' with 'Second change'
|
|
t.Views().Main().
|
|
Content(Contains("-First Change")).
|
|
Content(Contains("+Second Change"))
|
|
|
|
t.Views().Information().Content(Contains("2 commits copied"))
|
|
}).
|
|
PressEscape().
|
|
Tap(func() {
|
|
t.Views().Information().Content(DoesNotContain("commits copied"))
|
|
})
|
|
},
|
|
})
|