Documentation
¶
Index ¶
Constants ¶
const ( BASE_BRANCH = "base-branch" TOP_BRANCH = "top-branch" BASE_COMMIT = "base-commit" TOP_COMMIT = "top-commit" )
Variables ¶
var AdvancedInteractiveRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "It begins an interactive rebase and verifies to have the possibility of editing the commits of the branch before proceeding with the actual rebase", ExtraCmdArgs: []string{}, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. NewBranch(BASE_BRANCH). EmptyCommit(BASE_COMMIT). NewBranch(TOP_BRANCH). EmptyCommit(TOP_COMMIT) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains(TOP_COMMIT), Contains(BASE_COMMIT), ) t.Views().Branches(). Focus(). NavigateToLine(Contains(BASE_BRANCH)). Press(keys.Branches.RebaseBranch) t.ExpectPopup().Menu(). Title(Equals(fmt.Sprintf("Rebase '%s'", TOP_BRANCH))). Select(Contains("Interactive rebase")). Confirm() t.Views().Commits(). IsFocused(). Lines( Contains("─── Pending rebase todos"), Contains(TOP_COMMIT), Contains("─── Commits"), Contains(BASE_COMMIT), ). NavigateToLine(Contains(TOP_COMMIT)). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains(TOP_COMMIT).Contains("edit"), Contains("─── Commits"), Contains(BASE_COMMIT), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("─── Pending rebase todos"), Contains("─── Commits"), Contains(TOP_COMMIT), Contains(BASE_COMMIT), ) }, })
var AmendCommitWithConflict = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Amends a staged file to a commit, causing a conflict there.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("file", "1\n").Commit("one") shell.UpdateFileAndAdd("file", "1\n2\n").Commit("two") shell.UpdateFileAndAdd("file", "1\n2\n3\n").Commit("three") shell.UpdateFileAndAdd("file", "1\n2\n4\n") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("three"), Contains("two"), Contains("one"), ). NavigateToLine(Contains("two")). Press(keys.Commits.AmendToCommit). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Amend commit")). Content(Contains("Are you sure you want to amend this commit with your staged files?")). Confirm() t.Common().AcknowledgeConflicts() }). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("three"), Contains("fixup").Contains("<-- CONFLICT --- fixup! two"), Contains("─── Commits"), Contains("two"), Contains("one"), ) t.Views().Files(). IsFocused(). Lines( Contains("UU file"), ). PressEnter() t.Views().MergeConflicts(). IsFocused(). TopLines( Contains("1"), Contains("2"), Contains("<<<<<<< HEAD"), Contains("======="), Contains("4"), Contains(">>>>>>>"), ). SelectNextItem(). PressPrimaryAction() t.Common().ContinueOnConflictsResolved("rebase") t.Common().AcknowledgeConflicts() t.Views().Commits(). Lines( Contains("─── Pending rebase todos"), Contains("<-- CONFLICT --- three"), Contains("─── Commits"), Contains("two"), Contains("one"), ) }, })
var AmendFirstCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Amends a staged file to the first (initial) commit.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2). CreateFileAndAdd("fixup-file", "fixup content") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Commits.AmendToCommit). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Amend commit")). Content(Contains("Are you sure you want to amend this commit with your staged files?")). Confirm() }). Lines( Contains("commit-02"), Contains("commit-01").IsSelected(), ) t.Views().Main(). Content(Contains("fixup content")) }, })
var AmendFixupCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Amends a staged file to a fixup commit, and checks that other unrelated fixup commits are not auto-squashed.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). CreateFileAndAdd("first-fixup-file", "").Commit("fixup! commit-01"). CreateNCommitsStartingAt(2, 2). CreateFileAndAdd("unrelated-fixup-file", "fixup 03").Commit("fixup! commit-03"). CreateFileAndAdd("fixup-file", "fixup 01") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("fixup! commit-03"), Contains("commit-03"), Contains("commit-02"), Contains("fixup! commit-01"), Contains("commit-01"), ). NavigateToLine(Contains("fixup! commit-01")). Press(keys.Commits.AmendToCommit). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Amend commit")). Content(Contains("Are you sure you want to amend this commit with your staged files?")). Confirm() }). Lines( Contains("fixup! commit-03"), Contains("commit-03"), Contains("commit-02"), Contains("fixup! commit-01").IsSelected(), Contains("commit-01"), ) t.Views().Main(). Content(Contains("fixup 01")) }, })
var AmendHeadCommitDuringRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Amends the current head commit from the commits panel during a rebase.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(3) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-02").IsSelected(), Contains("commit-01"), ) t.Shell().CreateFile("fixup-file", "fixup content") t.Views().Files(). Focus(). Press(keys.Files.RefreshFiles). Lines( Contains("??").Contains("fixup-file").IsSelected(), ). PressPrimaryAction() t.Views().Commits(). Focus(). Press(keys.Commits.AmendToCommit). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Amend commit")). Content(Contains("Are you sure you want to amend this commit with your staged files?")). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-02").IsSelected(), Contains("commit-01"), ) t.Views().Main(). Content(Contains("fixup content")) }, })
var AmendMerge = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Amends a staged file to a merge commit.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. NewBranch("development-branch"). CreateFileAndAdd("initial-file", "initial file content"). Commit("initial commit"). NewBranch("feature-branch"). CreateFileAndAdd("new-feature-file", "new content"). Commit("new feature commit"). Checkout("development-branch"). Merge("feature-branch"). CreateFileAndAdd(postMergeFilename, postMergeFileContent) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { mergeCommitMessage := "Merge branch 'feature-branch' into development-branch" t.Views().Commits(). Lines( Contains(mergeCommitMessage), Contains("new feature commit"), Contains("initial commit"), ) t.Views().Commits(). Focus(). Press(keys.Commits.AmendToCommit) t.ExpectPopup().Confirmation(). Title(Equals("Amend commit")). Content(Contains("Are you sure you want to amend this commit with your staged files?")). Confirm() t.Views().Commits(). Lines( Contains(mergeCommitMessage), Contains("new feature commit"), Contains("initial commit"), ) t.Views().Main(). Content(Contains(postMergeFilename)). Content(Contains("++" + postMergeFileContent)) }, })
var AmendNonHeadCommitDuringRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Tries to amend a commit that is not the head while already rebasing, resulting in an error message", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(3) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-02"), Contains("commit-01"), ) for _, commit := range []string{"commit-01", "commit-03"} { t.Views().Commits(). NavigateToLine(Contains(commit)). Press(keys.Commits.AmendToCommit) t.ExpectToast(Contains("Can't perform this action during a rebase")) } }, })
var DeleteUpdateRefTodo = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Delete an update-ref item from the rebase todo list", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. NewBranch("branch1"). CreateNCommits(3). NewBranch("branch2"). CreateNCommitsStartingAt(3, 4) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-06"), Contains("pick").Contains("CI commit-05"), Contains("pick").Contains("CI commit-04"), Contains("update-ref").Contains("branch1"), Contains("pick").Contains("CI commit-03"), Contains("pick").Contains("CI commit-02"), Contains("─── Commits"), Contains("CI ○ commit-01"), ). NavigateToLine(Contains("update-ref")). Press(keys.Universal.Remove). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Drop commit")). Content(Contains("Are you sure you want to delete the selected update-ref todo(s)?")). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-06"), Contains("pick").Contains("CI commit-05"), Contains("pick").Contains("CI commit-04"), Contains("pick").Contains("CI commit-03").IsSelected(), Contains("pick").Contains("CI commit-02"), Contains("─── Commits"), Contains("CI ○ commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Remove). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("CI ○ commit-06"), Contains("CI ○ commit-05"), Contains("CI ○ commit-04"), Contains("CI ○ commit-03"), Contains("CI ○ commit-01"), ) t.Views().Branches(). Lines( Contains("branch2"), Contains("branch1"), ) }, })
var DontShowBranchHeadsForTodoItems = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Check that branch heads are shown for normal commits during interactive rebase, but not for todo items", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. NewBranch("branch1"). CreateNCommits(2). NewBranch("branch2"). CreateNCommitsStartingAt(4, 3). NewBranch("branch3"). CreateNCommitsStartingAt(3, 7) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI commit-09"), Contains("CI commit-08"), Contains("CI commit-07"), Contains("CI * commit-06"), Contains("CI commit-05"), Contains("CI commit-04"), Contains("CI commit-03"), Contains("CI * commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-04")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-09"), Contains("pick").Contains("CI commit-08"), Contains("pick").Contains("CI commit-07"), Contains("update-ref").Contains("branch2"), Contains("pick").Contains("CI commit-06"), Contains("pick").Contains("CI commit-05"), Contains("─── Commits"), Contains("CI commit-04"), Contains("CI commit-03"), Contains("CI * commit-02"), Contains("CI commit-01"), ) }, })
var DragKeepsSelectionHighlighted = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Keep the original commit range highlighted while dragging sideways", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(5) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.RangeSelectDown). ClickAndHold(1, 1). SelectedLines( Contains("commit-05"), Contains("commit-04"), Contains("commit-03"), ). MouseMove(10, 1). SelectedLines( Contains("commit-05"), Contains("commit-04"), Contains("commit-03"), ). MouseRelease() }, })
var DragToReorder = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Drag a selected commit range multiple rows in one operation", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(5) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Press(keys.Universal.RangeSelectDown). TopLines( Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). ClickAndHold(1, 1). MouseMove(1, 3). TopLines( Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("drop here"), Contains("commit-01"), ). PressEscape(). TopLines( Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). MouseMove(1, 4). TopLines( Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). MouseRelease(). ClickAndHold(1, 1). TopLines( Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). MouseMove(1, 3). TopLines( Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("drop here"), Contains("commit-01"), ). SelectNextItem(). SelectedLines( Contains("commit-03"), ). MouseRelease(). TopLines( Contains("commit-03"), Contains("commit-02"), Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-01"), ). ClickAndHold(1, 2). MouseMove(1, 0). TopLines( Contains("drop here"), Contains("commit-03"), Contains("commit-02"), Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-01"), ). MouseRelease(). TopLines( Contains("commit-05").IsSelected(), Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). ClickAndHold(1, 1). MouseRelease(). SelectedLines( Contains("commit-04"), ) }, })
var DragToReorderInRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Drag rebase todos without allowing real commits to move", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(5) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-05"), Contains("commit-04"), Contains("commit-03"), Contains("commit-02"), Contains("─── Commits"), Contains("commit-01").IsSelected(), ). NavigateToLine(Contains("commit-05")). ClickAndHold(1, 1). MouseMove(1, 6). Lines( Contains("─── Pending rebase todos"), Contains("commit-05").IsSelected(), Contains("commit-04"), Contains("commit-03"), Contains("commit-02"), Contains("drop here"), Contains("─── Commits"), Contains("commit-01"), ). MouseRelease(). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-03"), Contains("commit-02"), Contains("commit-05").IsSelected(), Contains("─── Commits"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). ClickAndHold(1, 6). MouseMove(1, 4). SelectedLines( Contains("commit-05"), Contains("─── Commits"), Contains("commit-01"), ). MouseRelease(). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-03"), Contains("commit-02"), Contains("commit-05").IsSelected(), Contains("─── Commits").IsSelected(), Contains("commit-01").IsSelected(), ) }, })
var DragToReorderWithAutoscroll = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Keep scrolling commits while a dragged commit is held at the panel edge", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(40) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). TopLines( Contains("commit-40").IsSelected(), ). ClickAndHold(1, 0). MouseMoveToBottom(1). OriginYAtLeast(3). MouseRelease(). SelectedLines( Contains("commit-40"), ). SelectedLineIdxAtLeast(3). GotoTop(). TopLines( Contains("commit-39").IsSelected(), ) }, })
var DropCommitInCopiedBranchWithUpdateRef = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Drops a commit in a branch that is a copy of another branch, and verify that the other branch is left alone", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. NewBranch("branch1"). CreateNCommits(3). NewBranch("branch2") shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI * commit-03").IsSelected(), Contains("CI commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Remove). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Drop commit")). Content(Equals("Are you sure you want to drop the selected commit(s)?")). Confirm() }). Lines( Contains("CI commit-03"), Contains("CI commit-01"), ) t.Views().Branches(). Focus(). NavigateToLine(Contains("branch1")). PressPrimaryAction() t.Views().Commits().Lines( Contains("CI commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ) }, })
var DropMergeCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Drops a merge commit outside of an interactive rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shared.CreateMergeCommit(shell) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI ◎─╮ Merge branch 'second-change-branch' into first-change-branch").IsSelected(), Contains("CI │ ○ * second-change-branch unrelated change"), Contains("CI │ ○ second change"), Contains("CI ○ │ first change"), Contains("CI ○─╯ * original"), Contains("CI ○ three"), Contains("CI ○ two"), Contains("CI ○ one"), ). Press(keys.Universal.Remove). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Drop commit")). Content(Equals("Are you sure you want to drop the selected merge commit? Note that it will also drop all the commits that were merged in by it.")). Confirm() }). Lines( Contains("CI ○ first change").IsSelected(), Contains("CI ○ * original"), Contains("CI ○ three"), Contains("CI ○ two"), Contains("CI ○ one"), ) }, })
var DropTodoCommitWithUpdateRef = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Drops a commit during interactive rebase when there is an update-ref in the git-rebase-todo file", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.MainBranches = []string{"master"} config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). NewBranch("branch1"). CreateNCommitsStartingAt(3, 2). NewBranch("branch2"). CreateNCommitsStartingAt(3, 5) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI commit-07").IsSelected(), Contains("CI commit-06"), Contains("CI commit-05"), Contains("CI * commit-04"), Contains("CI commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-07"), Contains("pick").Contains("CI commit-06"), Contains("pick").Contains("CI commit-05"), Contains("update-ref").Contains("branch1").DoesNotContain("*"), Contains("pick").Contains("CI commit-04"), Contains("pick").Contains("CI commit-03"), Contains("─── Commits"), Contains("CI commit-02").IsSelected(), Contains("CI commit-01"), ). Tap(func() { t.Views().Main().Content(Contains("commit-02")) }). NavigateToLine(Contains("commit-06")). Press(keys.Universal.Remove) t.Common().ContinueRebase() t.Views().Commits(). IsFocused(). Lines( Contains("CI commit-07"), Contains("CI commit-05"), Contains("CI * commit-04"), Contains("CI commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ) }, })
var DropWithCustomCommentChar = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Drops a commit with the 'core.commentChar' option set to a custom character", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.SetConfig("core.commentChar", ";") shell.CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits().Focus(). Lines( Contains("commit-02").IsSelected(), Contains("commit-01"), ). Press(keys.Universal.Remove). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Drop commit")). Content(Equals("Are you sure you want to drop the selected commit(s)?")). Confirm() }). Lines( Contains("commit-01").IsSelected(), ) }, })
var EditAndAutoAmend = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Edit a commit, make a change and stage it, then continue the rebase to auto-amend the commit", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(3) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-02").IsSelected(), Contains("commit-01"), ) t.Shell().CreateFile("fixup-file", "fixup content") t.Views().Files(). Focus(). Press(keys.Files.RefreshFiles). Lines( Contains("??").Contains("fixup-file").IsSelected(), ). PressPrimaryAction() t.Common().ContinueRebase() t.Views().Commits(). Focus(). Lines( Contains("commit-03"), Contains("commit-02").IsSelected(), Contains("commit-01"), ) t.Views().Main(). Content(Contains("fixup content")) }, })
var EditFirstCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Edits the first commit, just to show that it's possible", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-02"), Contains("─── Commits"), Contains("commit-01").IsSelected(), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("commit-02"), Contains("commit-01"), ) }, })
var EditLastCommitOfStackedBranch = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Edit and amend the last commit of a branch in a stack of branches, and ensure that it doesn't break the stack", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.MainBranches = []string{"master"} config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). NewBranch("branch1"). CreateNCommitsStartingAt(2, 2). NewBranch("branch2"). CreateNCommitsStartingAt(2, 4) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI commit-05").IsSelected(), Contains("CI commit-04"), Contains("CI * commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-03")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-05"), Contains("pick").Contains("CI commit-04"), Contains("update-ref").Contains("branch1"), Contains("─── Commits"), Contains("CI * commit-03").IsSelected(), Contains("CI commit-02"), Contains("CI commit-01"), ) t.Shell().CreateFile("fixup-file", "fixup content") t.Views().Files(). Focus(). Press(keys.Files.RefreshFiles). Lines( Contains("??").Contains("fixup-file").IsSelected(), ). PressPrimaryAction(). Press(keys.Files.AmendLastCommit) t.ExpectPopup().Confirmation(). Title(Equals("Amend last commit")). Content(Contains("Are you sure you want to amend last commit?")). Confirm() t.Common().ContinueRebase() t.Views().Commits(). Focus(). Lines( Contains("CI commit-05"), Contains("CI commit-04"), Contains("CI * commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ) }, })
var EditNonTodoCommitDuringRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Tries to edit a non-todo commit while already rebasing, resulting in an error message", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02").IsSelected(), Contains("commit-01"), ). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("─── Commits"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit) t.ExpectToast(Contains("Disabled: When rebasing, this action only works on a selection of TODO commits.")) }, })
var EditRangeSelectDownToMergeOutsideRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Select a range of commits (the last one being a merge commit) to edit outside of a rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shared.CreateMergeCommit(shell) shell.CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). TopLines( Contains("CI ○ commit-02").IsSelected(), Contains("CI ○ commit-01"), Contains("Merge branch 'second-change-branch' into first-change-branch"), ). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("edit CI commit-02").IsSelected(), Contains("edit CI commit-01").IsSelected(), Contains("─── Commits").IsSelected(), Contains(" CI ◎─╮ Merge branch 'second-change-branch' into first-change-branch").IsSelected(), Contains(" CI │ ○ * second-change-branch unrelated change"), Contains(" CI │ ○ second change"), Contains(" CI ○ │ first change"), Contains(" CI ○─╯ * original"), Contains(" CI ○ three"), Contains(" CI ○ two"), Contains(" CI ○ one"), ) }, })
var EditRangeSelectOutsideRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Select a range of commits to edit outside of a rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shared.CreateMergeCommit(shell) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). TopLines( Contains("Merge branch 'second-change-branch' into first-change-branch").IsSelected(), ). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.RangeSelectDown). Lines( Contains("CI ◎─╮ Merge branch 'second-change-branch' into first-change-branch").IsSelected(), Contains("CI │ ○ * second-change-branch unrelated change").IsSelected(), Contains("CI │ ○ second change").IsSelected(), Contains("CI ○ │ first change").IsSelected(), Contains("CI ○─╯ * original").IsSelected(), Contains("CI ○ three").IsSelected(), Contains("CI ○ two"), Contains("CI ○ one"), ). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("merge CI Merge branch 'second-change-branch' into first-change-branch").IsSelected(), Contains("edit CI first change").IsSelected(), Contains("edit CI * second-change-branch unrelated change").IsSelected(), Contains("edit CI second change").IsSelected(), Contains("edit CI * original").IsSelected(), Contains("─── Commits").IsSelected(), Contains(" CI ○ three").IsSelected(), Contains(" CI ○ two"), Contains(" CI ○ one"), ) }, })
var EditTheConflCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Swap two commits, causing a conflict; then try to interact with the 'confl' commit, which results in an error.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("myfile", "one") shell.Commit("commit one") shell.UpdateFileAndAdd("myfile", "two") shell.Commit("commit two") shell.UpdateFileAndAdd("myfile", "three") shell.Commit("commit three") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit three").IsSelected(), Contains("commit two"), Contains("commit one"), ). Press(keys.Commits.MoveDownCommit). Tap(func() { t.Common().AcknowledgeConflicts() }). Focus(). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit two"), Contains("pick").Contains("<-- CONFLICT --- commit three"), Contains("─── Commits"), Contains("commit one"), ). NavigateToLine(Contains("<-- CONFLICT --- commit three")). Press(keys.Commits.RenameCommit) t.ExpectToast(Contains("Disabled: Rewording commits while interactively rebasing is not currently supported")) }, })
var FixupFirstCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Tries to fixup the first commit, which results in an error message", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Commits.MarkCommitAsFixup). Tap(func() { t.ExpectToast(Equals("Disabled: There's no commit below to squash into")) }). Lines( Contains("commit-02"), Contains("commit-01"), ) }, })
var FixupKeepMessage = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Fixup a commit, keeping its commit message", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateFileAndAdd("file1.txt", "File1 Content\n").Commit("First Commit"). CreateFileAndAdd("file2.txt", "File2 Content\n").Commit("Second Commit"). CreateFileAndAdd("file3.txt", "File3 Content\n").Commit("Third Commit") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("Third Commit"), Contains("Second Commit"), Contains("First Commit"), ). NavigateToLine(Contains("Second Commit")). Press(keys.Commits.MarkCommitAsFixup). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Fixup")). Select(Contains("use this commit's message")). Confirm() }). Lines( Contains("Third Commit"), Contains("Second Commit").IsSelected(), ) t.Views().Main(). Content(Contains("Second Commit")). Content(DoesNotContain("First Commit")). Content(Contains("+File1 Content")). Content(Contains("+File2 Content")) }, })
var FixupKeepMessageRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Set fixup -C flag on a fixup commit during interactive rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateFileAndAdd("file1.txt", "File1 Content\n").Commit("First Commit"). CreateFileAndAdd("file2.txt", "File2 Content\n").Commit("Second Commit"). CreateFileAndAdd("file3.txt", "File3 Content\n").Commit("Third Commit") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("Third Commit"), Contains("Second Commit"), Contains("First Commit"), ). NavigateToLine(Contains("First Commit")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick CI Third Commit"), Contains("pick CI Second Commit"), Contains("─── Commits"), Contains("First Commit").IsSelected(), ). NavigateToLine(Contains("Second Commit")). Press(keys.Commits.MarkCommitAsFixup). Lines( Contains("─── Pending rebase todos"), Contains("pick CI Third Commit"), Contains("fixup CI Second Commit").IsSelected(), Contains("─── Commits"), Contains("First Commit"), ). Press(keys.Commits.SetFixupMessage). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Set fixup message")). Select(Contains("use this commit's message")). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("pick CI Third Commit"), Contains("fixup -C CI Second Commit").IsSelected(), Contains("─── Commits"), Contains("First Commit"), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("Third Commit"), Contains("Second Commit").IsSelected(), ) t.Views().Main(). Content(Contains("Second Commit")). Content(DoesNotContain("First Commit")). Content(Contains("+File1 Content")). Content(Contains("+File2 Content")) }, })
var FixupSecondCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Fixup the second commit into the first (initial)", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateFileAndAdd("file1.txt", "File1 Content\n").Commit("First Commit"). CreateFileAndAdd("file2.txt", "Fixup Content\n").Commit("Fixup Commit Message"). CreateFileAndAdd("file3.txt", "File3 Content\n").Commit("Third Commit") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("Third Commit"), Contains("Fixup Commit Message"), Contains("First Commit"), ). NavigateToLine(Contains("Fixup Commit Message")). Press(keys.Commits.MarkCommitAsFixup). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Fixup")). Confirm() }). Lines( Contains("Third Commit"), Contains("First Commit").IsSelected(), ) t.Views().Main(). Content(Contains("First Commit")). Content(DoesNotContain("Fixup Commit Message")). Content(Contains("+File1 Content")). Content(Contains("+Fixup Content")) }, })
var InteractiveRebaseOfCopiedBranch = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Check that interactively rebasing a branch that is a copy of another branch doesn't affect the original branch", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. NewBranch("branch1"). CreateNCommits(3). NewBranch("branch2") shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI * commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-03"), Contains("pick").Contains("CI commit-02"), Contains("─── Commits"), Contains("CI commit-01"), ) }, })
var InteractiveRebaseWithConflictForEditCommand = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rebase a branch interactively, and edit a commit that will conflict", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(cfg *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.EmptyCommit("initial commit") shell.CreateFileAndAdd("file.txt", "master content") shell.Commit("master commit") shell.NewBranchFrom("branch", "master^") shell.CreateNCommits(3) shell.CreateFileAndAdd("file.txt", "branch content") shell.Commit("this will conflict") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("this will conflict").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), Contains("initial commit"), ) t.Views().Branches(). Focus(). NavigateToLine(Contains("master")). Press(keys.Branches.RebaseBranch) t.ExpectPopup().Menu(). Title(Equals("Rebase 'branch'")). Select(Contains("Interactive rebase")). Confirm() t.Views().Commits(). IsFocused(). NavigateToLine(Contains("this will conflict")). Press(keys.Universal.Edit) t.Common().ContinueRebase() t.ExpectPopup().Menu(). Title(Equals("Conflicts!")). Cancel() t.Views().Commits(). Lines( Contains("─── Pending rebase todos"), Contains("edit").Contains("<-- CONFLICT --- this will conflict").IsSelected(), Contains("─── Commits"), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), Contains("master commit"), Contains("initial commit"), ) }, })
var MidRebaseRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Do various things with range selection in the commits view when mid-rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(10) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). TopLines( Contains("commit-10").IsSelected(), ). NavigateToLine(Contains("commit-05")). Press(keys.Universal.Edit). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("pick").Contains("commit-07"), Contains("pick").Contains("commit-06"), Contains("─── Commits"), Contains("commit-05").IsSelected(), Contains("commit-04"), ). SelectPreviousItem(). Press(keys.Universal.RangeSelectUp). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("pick").Contains("commit-07").IsSelected(), Contains("pick").Contains("commit-06").IsSelected(), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Commits.MarkCommitAsFixup). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("fixup").Contains("commit-07").IsSelected(), Contains("fixup").Contains("commit-06").IsSelected(), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Commits.PickCommit). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("pick").Contains("commit-07").IsSelected(), Contains("pick").Contains("commit-06").IsSelected(), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Universal.Edit). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("edit").Contains("commit-07").IsSelected(), Contains("edit").Contains("commit-06").IsSelected(), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Commits.SquashDown). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("squash").Contains("commit-07").IsSelected(), Contains("squash").Contains("commit-06").IsSelected(), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Commits.MoveDownCommit). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("squash").Contains("commit-07").IsSelected(), Contains("squash").Contains("commit-06").IsSelected(), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). Press(keys.Commits.MoveUpCommit). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("squash").Contains("commit-07").IsSelected(), Contains("squash").Contains("commit-06").IsSelected(), Contains("pick").Contains("commit-08"), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Commits.MoveUpCommit). TopLines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-10"), Contains("squash").Contains("commit-07").IsSelected(), Contains("squash").Contains("commit-06").IsSelected(), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Commits.MoveUpCommit). TopLines( Contains("─── Pending rebase todos"), Contains("squash").Contains("commit-07").IsSelected(), Contains("squash").Contains("commit-06").IsSelected(), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). Press(keys.Commits.MoveUpCommit). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). TopLines( Contains("─── Pending rebase todos"), Contains("squash").Contains("commit-07").IsSelected(), Contains("squash").Contains("commit-06").IsSelected(), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08"), Contains("─── Commits"), Contains("commit-05"), Contains("commit-04"), ). NavigateToLine(Contains("commit-08")). Press(keys.Universal.RangeSelectDown). TopLines( Contains("─── Pending rebase todos"), Contains("squash").Contains("commit-07"), Contains("squash").Contains("commit-06"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08").IsSelected(), Contains("─── Commits").IsSelected(), Contains("commit-05").IsSelected(), Contains("commit-04"), ). Press(keys.Commits.MarkCommitAsFixup). Tap(func() { t.ExpectToast(Contains("Disabled: When rebasing, this action only works on a selection of TODO commits.")) }). TopLines( Contains("─── Pending rebase todos"), Contains("squash").Contains("commit-07"), Contains("squash").Contains("commit-06"), Contains("pick").Contains("commit-10"), Contains("pick").Contains("commit-09"), Contains("pick").Contains("commit-08").IsSelected(), Contains("─── Commits").IsSelected(), Contains("commit-05").IsSelected(), Contains("commit-04"), ). Tap(func() { t.Common().ContinueRebase() }). TopLines( Contains("commit-10"), Contains("commit-09"), Contains("commit-08"), Contains("commit-05"), Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), ) }, })
var Move = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Directly move a commit all the way down and all the way back up", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(4) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). Lines( Contains("commit-03"), Contains("commit-04").IsSelected(), Contains("commit-02"), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-04").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), Contains("commit-04").IsSelected(), ). Press(keys.Commits.MoveDownCommit). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), Contains("commit-04").IsSelected(), ). Press(keys.Commits.MoveUpCommit). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-04").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). Lines( Contains("commit-03"), Contains("commit-04").IsSelected(), Contains("commit-02"), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). Lines( Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). Lines( Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ) }, })
var MoveAcrossBranchBoundaryOutsideRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Move a commit across a branch boundary in a stack of branches", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.MainBranches = []string{"master"} config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). NewBranch("branch1"). CreateNCommitsStartingAt(2, 2). NewBranch("branch2"). CreateNCommitsStartingAt(2, 4) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI commit-05").IsSelected(), Contains("CI commit-04"), Contains("CI * commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-04")). Press(keys.Commits.MoveDownCommit). Lines( Contains("CI commit-05"), Contains("CI * commit-03"), Contains("CI commit-04").IsSelected(), Contains("CI commit-02"), Contains("CI commit-01"), ) }, })
var MoveInRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Via a single interactive rebase move a commit all the way up then back down then slightly back up again and apply the change", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(4) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-03"), Contains("commit-02"), Contains("─── Commits"), Contains("commit-01").IsSelected(), ). SelectPreviousItem(). Press(keys.Commits.MoveUpCommit). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-02").IsSelected(), Contains("commit-03"), Contains("─── Commits"), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). Lines( Contains("─── Pending rebase todos"), Contains("commit-02").IsSelected(), Contains("commit-04"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). Lines( Contains("─── Pending rebase todos"), Contains("commit-02").IsSelected(), Contains("commit-04"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-02").IsSelected(), Contains("commit-03"), Contains("─── Commits"), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-03"), Contains("commit-02").IsSelected(), Contains("─── Commits"), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-03"), Contains("commit-02").IsSelected(), Contains("─── Commits"), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-02").IsSelected(), Contains("commit-03"), Contains("─── Commits"), Contains("commit-01"), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("commit-04"), Contains("commit-02").IsSelected(), Contains("commit-03"), Contains("commit-01"), ) }, })
var MoveTodoDownWithRapidKeypresses = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Move a todo down two slots with two keypresses in rapid succession", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateNCommits(4) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-04"), Contains("commit-03"), Contains("commit-02"), Contains("─── Commits"), Contains("commit-01").IsSelected(), ). NavigateToLine(Contains("commit-04")). PressRapidly(keys.Commits.MoveDownCommit, keys.Commits.MoveDownCommit). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-04"), Contains("commit-01"), ) }, })
The second keypress arrives before the refresh triggered by the first one has rebuilt the commits model. The handler reads the selected todo from the model at the already-advanced selection index, so with the stale, pre-move model it grabs the todo the first move swapped with and moves that one back down — turning the two presses into a net no-op instead of moving the selected todo down two slots. This is what happens when holding down the move-down key to move a todo several slots.
We continue the rebase and assert the resulting commit order rather than asserting the todo list, because the two presses also spawn two racing refreshes whose updates can land in either order, so what the todo list shows in the broken state is not deterministic (it can even disagree with the todo file). The rebase replays what's in the file.
var MoveUpdateRefTodo = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Move an update-ref item in the rebase todo list", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. NewBranch("branch1"). CreateNCommits(3). NewBranch("branch2"). CreateNCommitsStartingAt(3, 4) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). NavigateToLine(Contains("commit-01")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-06"), Contains("pick").Contains("CI commit-05"), Contains("pick").Contains("CI commit-04"), Contains("update-ref").Contains("branch1"), Contains("pick").Contains("CI commit-03"), Contains("pick").Contains("CI commit-02"), Contains("─── Commits"), Contains("CI ○ commit-01"), ). NavigateToLine(Contains("update-ref")). Press(keys.Commits.MoveUpCommit). Press(keys.Commits.MoveUpCommit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-06"), Contains("update-ref").Contains("branch1"), Contains("pick").Contains("CI commit-05"), Contains("pick").Contains("CI commit-04"), Contains("pick").Contains("CI commit-03"), Contains("pick").Contains("CI commit-02"), Contains("─── Commits"), Contains("CI ○ commit-01"), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("CI ○ commit-06"), Contains("CI ○ * commit-05"), Contains("CI ○ commit-04"), Contains("CI ○ commit-03"), Contains("CI ○ commit-02"), Contains("CI ○ commit-01"), ) }, })
var MoveWithCustomCommentChar = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Directly moves a commit down and back up with the 'core.commentChar' option set to a custom character", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.SetConfig("core.commentChar", ";") shell.CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits().Focus(). Lines( Contains("commit-02").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). Lines( Contains("commit-01"), Contains("commit-02").IsSelected(), ). Press(keys.Commits.MoveUpCommit). Lines( Contains("commit-02").IsSelected(), Contains("commit-01"), ) }, })
var OutsideRebaseRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Do various things with range selection in the commits view when outside rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(10) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). TopLines( Contains("commit-10").IsSelected(), ). Press(keys.Universal.RangeSelectDown). TopLines( Contains("commit-10").IsSelected(), Contains("commit-09").IsSelected(), Contains("commit-08"), ). Press(keys.Universal.Remove). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Drop commit")). Content(Contains("Are you sure you want to drop the selected commit(s)?")). Confirm() }). TopLines( Contains("commit-08").IsSelected(), Contains("commit-07"), ). Press(keys.Universal.RangeSelectDown). TopLines( Contains("commit-08").IsSelected(), Contains("commit-07").IsSelected(), Contains("commit-06"), ). Press(keys.Commits.SquashDown). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Squash")). Content(Contains("Are you sure you want to squash the selected commit(s) into the commit below?")). Confirm() }). TopLines( Contains("commit-06").IsSelected(), Contains("commit-05"), Contains("commit-04"), ). Tap(func() { t.Views().Main(). ContainsLines( Contains("commit-06"), AnyString(), Contains("commit-07"), AnyString(), Contains("commit-08"), ) }). Press(keys.Universal.RangeSelectDown). TopLines( Contains("commit-06").IsSelected(), Contains("commit-05").IsSelected(), Contains("commit-04"), ). Press(keys.Commits.MarkCommitAsFixup). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Fixup")). Confirm() }). TopLines( Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), ). Tap(func() { t.Views().Main(). Content( Contains("commit-04"). DoesNotContain("commit-06"). DoesNotContain("commit-05"), ) }). Press(keys.Universal.RangeSelectDown). TopLines( Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), Contains("commit-02"), ). Press(keys.Commits.MoveDownCommit). TopLines( Contains("commit-02"), Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.MoveDownCommit). TopLines( Contains("commit-02"), Contains("commit-01"), Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), ). Press(keys.Commits.MoveDownCommit). TopLines( Contains("commit-02"), Contains("commit-01"), Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), ). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). Press(keys.Commits.MoveUpCommit). TopLines( Contains("commit-02"), Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). TopLines( Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), Contains("commit-02"), Contains("commit-01"), ). Press(keys.Commits.MoveUpCommit). Tap(func() { t.ExpectToast(Contains("Disabled: Cannot move any further")) }). TopLines( Contains("commit-04").IsSelected(), Contains("commit-03").IsSelected(), Contains("commit-02"), Contains("commit-01"), ) }, })
var PickRescheduled = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Makes a pick during a rebase fail because it would overwrite an untracked file", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("file1", "1\n").Commit("one") shell.UpdateFileAndAdd("file2", "2\n").Commit("two") shell.UpdateFileAndAdd("file3", "3\n").Commit("three") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("three").IsSelected(), Contains("two"), Contains("one"), ). NavigateToLine(Contains("one")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("three"), Contains("pick").Contains("two"), Contains("─── Commits"), Contains("one").IsSelected(), ). Tap(func() { t.Shell().CreateFile("file3", "other content\n") t.Common().ContinueRebase() t.ExpectPopup().Alert().Title(Equals("Error")). Content(Contains("The following untracked working tree files would be overwritten by merge"). Contains("Please move or remove them before you merge.")). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("three"), Contains("─── Commits"), Contains("two"), Contains("one"), ) }, })
var QuickStart = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Quick-starts an interactive rebase in several contexts", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.NewBranch("main") shell.EmptyCommit("initial commit") shell.EmptyCommit("last main commit") shell.NewBranch("feature-branch") shell.NewBranch("branch-to-merge") shell.NewBranch("branch-with-merge-commit") shell.Checkout("feature-branch") shell.EmptyCommit("feature-branch one") shell.EmptyCommit("feature-branch two") shell.Checkout("branch-to-merge") shell.EmptyCommit("branch-to-merge one") shell.EmptyCommit("branch-to-merge two") shell.Checkout("branch-with-merge-commit") shell.EmptyCommit("branch-with-merge one") shell.EmptyCommit("branch-with-merge two") shell.Merge("branch-to-merge") shell.EmptyCommit("branch-with-merge three") shell.Checkout("main") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("last main commit"), Contains("initial commit"), ). Press(keys.Commits.StartInteractiveRebase) t.ExpectPopup().Alert(). Title(Equals("Error")). Content(Equals("Cannot start interactive rebase: the HEAD commit is a merge commit or is present on the main branch, so there is no appropriate base commit to start the rebase from. You can start an interactive rebase from a specific commit by selecting the commit and pressing `e`.")). Confirm() t.Views().Branches(). Focus(). NavigateToLine(Contains("feature-branch")). Press(keys.Universal.Select) t.Views().Commits(). Focus(). Lines( Contains("feature-branch two").IsSelected(), Contains("feature-branch one"), Contains("last main commit"), Contains("initial commit"), ). Press(keys.Commits.StartInteractiveRebase). Lines( Contains("─── Pending rebase todos"), Contains("feature-branch two").IsSelected(), Contains("feature-branch one"), Contains("─── Commits"), Contains("last main commit"), Contains("initial commit"), ). Press(keys.Commits.StartInteractiveRebase) t.ExpectToast(Equals("Disabled: Can't perform this action during a rebase")) t.Common().AbortRebase() t.Views().Branches(). Focus(). NavigateToLine(Contains("branch-with-merge-commit")). Press(keys.Universal.Select) t.Views().Commits(). Focus(). Lines( Contains("branch-with-merge three").IsSelected(), Contains("Merge branch 'branch-to-merge'"), Contains("branch-to-merge two"), Contains("branch-to-merge one"), Contains("branch-with-merge two"), Contains("branch-with-merge one"), Contains("last main commit"), Contains("initial commit"), ). Press(keys.Commits.StartInteractiveRebase). Lines( Contains("─── Pending rebase todos"), Contains("branch-with-merge three").IsSelected(), Contains("─── Commits"), Contains("Merge branch 'branch-to-merge'"), Contains("branch-to-merge two"), Contains("branch-to-merge one"), Contains("branch-with-merge two"), Contains("branch-with-merge one"), Contains("last main commit"), Contains("initial commit"), ) }, })
var QuickStartKeepSelection = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Starts an interactive rebase and checks that the same commit stays selected", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.MainBranches = []string{"master"} config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). NewBranch("branch1"). CreateNCommitsStartingAt(3, 2). NewBranch("branch2"). CreateNCommitsStartingAt(3, 5) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI commit-07").IsSelected(), Contains("CI commit-06"), Contains("CI commit-05"), Contains("CI * commit-04"), Contains("CI commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Commits.StartInteractiveRebase). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-07"), Contains("pick").Contains("CI commit-06"), Contains("pick").Contains("CI commit-05"), Contains("update-ref").Contains("branch1"), Contains("pick").Contains("CI commit-04"), Contains("pick").Contains("CI commit-03"), Contains("CI commit-02").IsSelected(), Contains("─── Commits"), Contains("CI commit-01"), ) }, })
var QuickStartKeepSelectionRange = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Starts an interactive rebase and checks that the same commit range stays selected", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.MainBranches = []string{"master"} config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). NewBranch("branch1"). CreateNCommitsStartingAt(2, 2). NewBranch("branch2"). CreateNCommitsStartingAt(2, 4). NewBranch("branch3"). CreateNCommitsStartingAt(2, 6) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). NavigateToLine(Contains("commit-04")). Press(keys.Universal.RangeSelectDown). Press(keys.Universal.RangeSelectDown). Lines( Contains("CI commit-07"), Contains("CI commit-06"), Contains("CI * commit-05"), Contains("CI commit-04").IsSelected(), Contains("CI * commit-03").IsSelected(), Contains("CI commit-02").IsSelected(), Contains("CI commit-01"), ). Press(keys.Commits.StartInteractiveRebase). Lines( Contains("─── Pending rebase todos"), Contains("CI commit-07"), Contains("CI commit-06"), Contains("update-ref").Contains("branch2"), Contains("CI commit-05"), Contains("CI commit-04").IsSelected(), Contains("update-ref").Contains("branch1").IsSelected(), Contains("CI commit-03").IsSelected(), Contains("CI commit-02").IsSelected(), Contains("─── Commits"), Contains("CI commit-01"), ) }, })
var Rebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Begins an interactive rebase, then fixups, drops, and squashes some commits", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.EmptyCommit("initial commit") shell.EmptyCommit("first commit to edit") shell.EmptyCommit("commit to squash") shell.EmptyCommit("second commit to edit") shell.EmptyCommit("commit to drop") shell.CreateFileAndAdd("fixup-commit-file", "fixup-commit-file") shell.Commit("commit to fixup") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit to fixup"), Contains("commit to drop"), Contains("second commit to edit"), Contains("commit to squash"), Contains("first commit to edit"), Contains("initial commit"), ). NavigateToLine(Contains("first commit to edit")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), MatchesRegexp("pick.*commit to fixup"), MatchesRegexp("pick.*commit to drop"), MatchesRegexp("pick.*second commit to edit"), MatchesRegexp("pick.*commit to squash"), Contains("─── Commits"), Contains("first commit to edit").IsSelected(), Contains("initial commit"), ). SelectPreviousItem(). Press(keys.Commits.SquashDown). Lines( Contains("─── Pending rebase todos"), MatchesRegexp("pick.*commit to fixup"), MatchesRegexp("pick.*commit to drop"), MatchesRegexp("pick.*second commit to edit"), MatchesRegexp("squash.*commit to squash").IsSelected(), Contains("─── Commits"), Contains("first commit to edit"), Contains("initial commit"), ). SelectPreviousItem(). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), MatchesRegexp("pick.*commit to fixup"), MatchesRegexp("pick.*commit to drop"), MatchesRegexp("edit.*second commit to edit").IsSelected(), MatchesRegexp("squash.*commit to squash"), Contains("─── Commits"), Contains("first commit to edit"), Contains("initial commit"), ). SelectPreviousItem(). Press(keys.Universal.Remove). Lines( Contains("─── Pending rebase todos"), MatchesRegexp("pick.*commit to fixup"), MatchesRegexp("drop.*commit to drop").IsSelected(), MatchesRegexp("edit.*second commit to edit"), MatchesRegexp("squash.*commit to squash"), Contains("─── Commits"), Contains("first commit to edit"), Contains("initial commit"), ). SelectPreviousItem(). Press(keys.Commits.MarkCommitAsFixup). Lines( Contains("─── Pending rebase todos"), MatchesRegexp("fixup.*commit to fixup").IsSelected(), MatchesRegexp("drop.*commit to drop"), MatchesRegexp("edit.*second commit to edit"), MatchesRegexp("squash.*commit to squash"), Contains("─── Commits"), Contains("first commit to edit"), Contains("initial commit"), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("─── Pending rebase todos"), MatchesRegexp("fixup.*commit to fixup").IsSelected(), MatchesRegexp("drop.*commit to drop"), Contains("─── Commits"), Contains("second commit to edit"), MatchesRegexp("first commit to edit"), Contains("initial commit"), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("second commit to edit").IsSelected(), Contains("first commit to edit"), Contains("initial commit"), ). Tap(func() { t.Views().Main().Content( Contains("second commit to edit"). Contains("fixup-commit-file"). DoesNotContain("commit to fixup"), ) }). SelectNextItem(). Tap(func() { t.Views().Main().Content( Contains("first commit to edit"). Contains("commit to squash"), ) }) }, })
var RebaseWithCommitThatBecomesEmpty = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Performs a rebase involving a commit that becomes empty during the rebase, and gets dropped.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.EmptyCommit("initial commit") shell.CreateFileAndAdd("file", "change 1\n") shell.Commit("master change 1") shell.UpdateFileAndAdd("file", "change 1\nchange 2\n") shell.Commit("master change 2") shell.NewBranchFrom("branch", "HEAD^^") shell.CreateFileAndAdd("file", "change 1\nchange 2\n") shell.Commit("branch change") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Branches(). Focus(). NavigateToLine(Contains("master")). Press(keys.Branches.RebaseBranch) t.ExpectPopup().Menu(). Title(Equals("Rebase 'branch'")). Select(Contains("Simple rebase")). Confirm() t.Views().Commits(). Lines( Contains("master change 2"), Contains("master change 1"), Contains("initial commit"), ) }, })
var RevertDuringRebaseWhenStoppedOnEdit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Revert a series of commits while stopped in a rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(cfg *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.EmptyCommit("master commit 1") shell.EmptyCommit("master commit 2") shell.NewBranch("branch") shell.CreateNCommits(4) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-04").IsSelected(), Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), Contains("master commit 2"), Contains("master commit 1"), ). NavigateToLine(Contains("commit-03")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-04"), Contains("─── Commits"), Contains("commit-03").IsSelected(), Contains("commit-02"), Contains("commit-01"), Contains("master commit 2"), Contains("master commit 1"), ). SelectNextItem(). Press(keys.Universal.RangeSelectDown). Press(keys.Commits.RevertCommit). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Revert commit")). Content(MatchesRegexp(`Are you sure you want to revert \w+?`)). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("commit-04"), Contains("─── Commits"), Contains(`Revert "commit-01"`), Contains(`Revert "commit-02"`), Contains("commit-03"), Contains("commit-02").IsSelected(), Contains("commit-01").IsSelected(), Contains("master commit 2"), Contains("master commit 1"), ) }, })
var RevertMultipleCommitsInInteractiveRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Reverts a range of commits, the first of which conflicts, in the middle of an interactive rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(cfg *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("myfile", "") shell.Commit("add empty file") shell.CreateFileAndAdd("otherfile", "") shell.Commit("unrelated change 1") shell.CreateFileAndAdd("myfile", "first line\n") shell.Commit("add first line") shell.UpdateFileAndAdd("myfile", "first line\nsecond line\n") shell.Commit("add second line") shell.EmptyCommit("unrelated change 2") shell.EmptyCommit("unrelated change 3") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI ○ unrelated change 3").IsSelected(), Contains("CI ○ unrelated change 2"), Contains("CI ○ add second line"), Contains("CI ○ add first line"), Contains("CI ○ unrelated change 1"), Contains("CI ○ add empty file"), ). NavigateToLine(Contains("add second line")). Press(keys.Universal.Edit). SelectNextItem(). Press(keys.Universal.RangeSelectDown). Press(keys.Commits.RevertCommit). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Revert commit")). Content(Equals("Are you sure you want to revert the selected commits?")). Confirm() t.ExpectPopup().Menu(). Title(Equals("Conflicts!")). Select(Contains("View conflicts")). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("CI unrelated change 3"), Contains("CI unrelated change 2"), Contains("─── Pending reverts"), Contains("revert").Contains("CI unrelated change 1"), Contains("revert").Contains("CI <-- CONFLICT --- add first line"), Contains("─── Commits"), Contains("CI ○ add second line"), Contains("CI ○ add first line"), Contains("CI ○ unrelated change 1"), Contains("CI ○ add empty file"), ) t.Views().Options().Content(Contains("View revert options: m")) t.Views().Information().Content(Contains("Reverting (Reset)")) t.Views().Files().IsFocused(). Lines( Contains("UU myfile").IsSelected(), ). PressEnter() t.Views().MergeConflicts().IsFocused(). SelectNextItem(). PressPrimaryAction() t.ExpectPopup().Alert(). Title(Equals("Continue")). Content(Contains("All merge conflicts resolved. Continue the revert?")). Confirm() t.Views().Commits(). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI unrelated change 3"), Contains("pick").Contains("CI unrelated change 2"), Contains("─── Commits"), Contains(`CI ○ Revert "unrelated change 1"`), Contains(`CI ○ Revert "add first line"`), Contains("CI ○ add second line"), Contains("CI ○ add first line"), Contains("CI ○ unrelated change 1"), Contains("CI ○ add empty file"), ) t.Views().Options().Content(Contains("View rebase options: m")) t.Views().Information().Content(Contains("Rebasing (Reset)")) t.Common().ContinueRebase() t.Views().Commits(). Lines( Contains("CI ○ unrelated change 3"), Contains("CI ○ unrelated change 2"), Contains(`CI ○ Revert "unrelated change 1"`), Contains(`CI ○ Revert "add first line"`), Contains("CI ○ add second line"), Contains("CI ○ add first line"), Contains("CI ○ unrelated change 1"), Contains("CI ○ add empty file"), ) }, })
var RevertSingleCommitInInteractiveRebase = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Reverts a commit that conflicts in the middle of an interactive rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("myfile", "") shell.Commit("add empty file") shell.CreateFileAndAdd("myfile", "first line\n") shell.Commit("add first line") shell.UpdateFileAndAdd("myfile", "first line\nsecond line\n") shell.Commit("add second line") shell.EmptyCommit("unrelated change 1") shell.EmptyCommit("unrelated change 2") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI ○ unrelated change 2").IsSelected(), Contains("CI ○ unrelated change 1"), Contains("CI ○ add second line"), Contains("CI ○ add first line"), Contains("CI ○ add empty file"), ). NavigateToLine(Contains("add second line")). Press(keys.Universal.Edit). SelectNextItem(). Press(keys.Commits.RevertCommit). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Revert commit")). Content(MatchesRegexp(`Are you sure you want to revert \w+?`)). Confirm() t.ExpectPopup().Menu(). Title(Equals("Conflicts!")). Select(Contains("View conflicts")). Cancel() }). Lines( Contains("─── Pending rebase todos"), Contains("CI unrelated change 2"), Contains("CI unrelated change 1"), Contains("─── Pending reverts"), Contains("revert").Contains("CI <-- CONFLICT --- add first line"), Contains("─── Commits"), Contains("CI ○ add second line"), Contains("CI ○ add first line").IsSelected(), Contains("CI ○ add empty file"), ). Press(keys.Commits.MoveDownCommit). Tap(func() { t.ExpectToast(Equals("Disabled: This action is not allowed while cherry-picking or reverting")) }). Press(keys.Universal.Remove). Tap(func() { t.ExpectToast(Equals("Disabled: This action is not allowed while cherry-picking or reverting")) }) t.Views().Options().Content(Contains("View revert options: m")) t.Views().Information().Content(Contains("Reverting (Reset)")) t.Views().Files().Focus(). Lines( Contains("UU myfile").IsSelected(), ). PressEnter() t.Views().MergeConflicts().IsFocused(). SelectNextItem(). PressPrimaryAction() t.ExpectPopup().Alert(). Title(Equals("Continue")). Content(Contains("All merge conflicts resolved. Continue the revert?")). Confirm() t.Views().Commits(). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI unrelated change 2"), Contains("pick").Contains("CI unrelated change 1"), Contains("─── Commits"), Contains(`CI ○ Revert "add first line"`), Contains("CI ○ add second line"), Contains("CI ○ add first line"), Contains("CI ○ add empty file"), ) t.Views().Options().Content(Contains("View rebase options: m")) t.Views().Information().Content(Contains("Rebasing (Reset)")) t.Common().ContinueRebase() t.Views().Commits(). Lines( Contains("CI ○ unrelated change 2"), Contains("CI ○ unrelated change 1"), Contains(`CI ○ Revert "add first line"`), Contains("CI ○ add second line"), Contains("CI ○ add first line"), Contains("CI ○ add empty file"), ) }, })
var RewordCommitWithEditorAndFail = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rewords a commit with editor, and fails because an empty commit message is given", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) { }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(3). SetConfig("core.editor", "sh -c 'echo </dev/null >.git/COMMIT_EDITMSG'") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03").IsSelected(), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Commits.RenameCommitWithEditor). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Reword in editor")). Content(Contains("Are you sure you want to reword this commit in your editor?")). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-02").IsSelected(), Contains("commit-01"), ) t.ExpectPopup().Alert(). Title(Equals("Error")). Content(Contains("exit status 1")) }, })
var RewordFirstCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rewords the first commit, just to show that it's possible", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Commits.RenameCommit). Tap(func() { t.ExpectPopup().CommitMessagePanel(). Title(Equals("Reword commit")). InitialText(Equals("commit-01")). Clear(). Type("renamed 01"). Confirm() }). Lines( Contains("commit-02"), Contains("renamed 01"), ) }, })
var RewordLastCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rewords the last (HEAD) commit", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.RenameCommit). Tap(func() { t.ExpectPopup().CommitMessagePanel(). Title(Equals("Reword commit")). InitialText(Equals("commit-02")). Clear(). Type("renamed 02"). Confirm() }). Lines( Contains("renamed 02"), Contains("commit-01"), ) }, })
var RewordLastCommitOfStackedBranch = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rewords the last commit of a branch in the middle of a stack", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.MainBranches = []string{"master"} config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). NewBranch("branch1"). CreateNCommitsStartingAt(2, 2). NewBranch("branch2"). CreateNCommitsStartingAt(2, 4) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI commit-05").IsSelected(), Contains("CI commit-04"), Contains("CI * commit-03"), Contains("CI commit-02"), Contains("CI commit-01"), ). NavigateToLine(Contains("commit-03")). Press(keys.Commits.RenameCommit). Tap(func() { t.ExpectPopup().CommitMessagePanel(). Title(Equals("Reword commit")). InitialText(Equals("commit-03")). Clear(). Type("renamed 03"). Confirm() }). Lines( Contains("CI commit-05"), Contains("CI commit-04"), Contains("CI * renamed 03"), Contains("CI commit-02"), Contains("CI commit-01"), ) }, })
var RewordMergeCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rewords a merge commit which is not the current head commit", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. EmptyCommit("base"). NewBranch("first-branch"). CreateFileAndAdd("file1.txt", "content"). Commit("one"). Checkout("master"). Merge("first-branch"). NewBranch("second-branch"). EmptyCommit("two") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("CI ○ two").IsSelected(), Contains("CI ◎─╮ Merge branch 'first-branch'"), Contains("CI │ ○ one"), Contains("CI ○─╯ base"), ). SelectNextItem(). Press(keys.Commits.RenameCommit). Tap(func() { t.ExpectPopup().CommitMessagePanel(). Title(Equals("Reword commit")). InitialText(Equals("Merge branch 'first-branch'")). Clear(). Type("renamed merge"). Confirm() }). Lines( Contains("CI ○ two"), Contains("CI ◎─╮ renamed merge").IsSelected(), Contains("CI │ ○ one"), Contains("CI ○ ╯ base"), ) }, })
var RewordYouAreHereCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rewords the current HEAD commit in an interactive rebase", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(3) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03").IsSelected(), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-02").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.RenameCommit). Tap(func() { t.ExpectPopup().CommitMessagePanel(). Title(Equals("Reword commit")). InitialText(Equals("commit-02")). Clear(). Type("renamed 02"). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("renamed 02").IsSelected(), Contains("commit-01"), ) }, })
var RewordYouAreHereCommitWithEditor = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Rewords the current HEAD commit in an interactive rebase with editor", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) { }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(3). SetConfig("core.editor", "sh -c 'echo renamed 02 >.git/COMMIT_EDITMSG'") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03").IsSelected(), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("commit-02").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.RenameCommitWithEditor). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Reword in editor")). Content(Contains("Are you sure you want to reword this commit in your editor?")). Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("commit-03"), Contains("─── Commits"), Contains("renamed 02").IsSelected(), Contains("commit-01"), ) }, })
var ShowExecTodos = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Show exec todos in the rebase todo list", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(cfg *config.AppConfig) { cfg.GetUserConfig().CustomCommands = []config.CustomCommand{ { Key: config.Keybinding{"X"}, Context: "commits", Command: "git -c core.editor=: rebase -i -x false HEAD^^", }, } }, SetupRepo: func(shell *Shell) { shell. NewBranch("branch1"). CreateNCommits(3) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Press(config.Keybinding{"X"}). Tap(func() { t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("Rebasing (2/4)Executing: false")).Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("exec").Contains("false"), Contains("pick").Contains("CI commit-03"), Contains("─── Commits"), Contains("CI ○ commit-02"), Contains("CI ○ commit-01"), ). Tap(func() { t.Common().ContinueRebase() t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("exit status 1")).Confirm() }). Lines( Contains("─── Pending rebase todos"), Contains("─── Commits"), Contains("CI ○ commit-03"), Contains("CI ○ commit-02"), Contains("CI ○ commit-01"), ). Tap(func() { t.Common().ContinueRebase() }). Lines( Contains("CI ○ commit-03"), Contains("CI ○ commit-02"), Contains("CI ○ commit-01"), ) }, })
var SquashDownFirstCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Tries to squash down the first commit, which results in an error message", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Commits.SquashDown). Tap(func() { t.ExpectToast(Equals("Disabled: There's no commit below to squash into")) }). Lines( Contains("commit-02"), Contains("commit-01"), ) }, })
var SquashDownSecondCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Squash down the second commit into the first (initial)", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(3) }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Commits.SquashDown). Tap(func() { t.ExpectPopup().Confirmation(). Title(Equals("Squash")). Content(Equals("Are you sure you want to squash the selected commit(s) into the commit below?")). Confirm() }). Lines( Contains("commit-03"), Contains("commit-01").IsSelected(), ) t.Views().Main(). Content(Contains(" commit-01\n \n commit-02")). Content(Contains("+file01 content")). Content(Contains("+file02 content")) }, })
var SquashFixupsAbove = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Squashes all fixups above a commit and checks that the selected line stays correct.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(3). CreateFileAndAdd("fixup-file", "fixup content") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-03"), Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-02")). Press(keys.Commits.CreateFixupCommit). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Create fixup commit")). Select(Contains("fixup! commit")). Confirm() }). Lines( Contains("fixup! commit-02"), Contains("commit-03"), Contains("commit-02").IsSelected(), Contains("commit-01"), ). Press(keys.Commits.SquashAboveCommits). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Apply fixup commits")). Select(Contains("Above the selected commit")). Confirm() }). Lines( Contains("commit-03"), Contains("commit-02").IsSelected(), Contains("commit-01"), ) t.Views().Main(). Content(Contains("fixup content")) }, })
var SquashFixupsAboveFirstCommit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Squashes all fixups above the first (initial) commit.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateNCommits(2). CreateFileAndAdd("fixup-file", "fixup content") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit-02"), Contains("commit-01"), ). NavigateToLine(Contains("commit-01")). Press(keys.Commits.CreateFixupCommit). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Create fixup commit")). Select(Contains("fixup! commit")). Confirm() }). NavigateToLine(Contains("commit-01").DoesNotContain("fixup!")). Press(keys.Commits.SquashAboveCommits). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Apply fixup commits")). Select(Contains("Above the selected commit")). Confirm() }). Lines( Contains("commit-02"), Contains("commit-01").IsSelected(), ) t.Views().Main(). Content(Contains("fixup content")) }, })
var SquashFixupsInCurrentBranch = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Squashes all fixups in the current branch.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell. CreateFileAndAdd("file1", "file1"). Commit("master commit"). NewBranch("branch"). UpdateFileAndAdd("file1", "changed file1"). Commit("fixup! master commit"). CreateNCommits(2). CreateFileAndAdd("fixup-file", "fixup content"). Commit("fixup! commit-01") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). SelectNextItem(). SelectNextItem(). Lines( Contains("fixup! commit-01"), Contains("commit-02"), Contains("commit-01").IsSelected(), Contains("fixup! master commit"), Contains("master commit"), ). Press(keys.Commits.SquashAboveCommits). Tap(func() { t.ExpectPopup().Menu(). Title(Equals("Apply fixup commits")). Select(Contains("In current branch")). Confirm() }). Lines( Contains("commit-02"), Contains("commit-01").IsSelected(), Contains("fixup! master commit"), Contains("master commit"), ) t.Views().Main(). Content(Contains("fixup content")) }, })
var SwapInRebaseWithConflict = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Via an edit-triggered rebase, swap two commits, causing a conflict. Then resolve the conflict and continue", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("myfile", "one") shell.Commit("commit one") shell.UpdateFileAndAdd("myfile", "two") shell.Commit("commit two") shell.UpdateFileAndAdd("myfile", "three") shell.Commit("commit three") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit three").IsSelected(), Contains("commit two"), Contains("commit one"), ). NavigateToLine(Contains("commit one")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit three"), Contains("commit two"), Contains("─── Commits"), Contains("commit one").IsSelected(), ). SelectPreviousItem(). Press(keys.Commits.MoveUpCommit). Lines( Contains("─── Pending rebase todos"), Contains("commit two").IsSelected(), Contains("commit three"), Contains("─── Commits"), Contains("commit one"), ). Tap(func() { t.Common().ContinueRebase() }) handleConflictsFromSwap(t, "pick") }, })
var SwapInRebaseWithConflictAndEdit = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Via an edit-triggered rebase, swap two commits, causing a conflict, then edit the commit that will conflict.", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("myfile", "one") shell.Commit("commit one") shell.UpdateFileAndAdd("myfile", "two") shell.Commit("commit two") shell.UpdateFileAndAdd("myfile", "three") shell.Commit("commit three") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit three").IsSelected(), Contains("commit two"), Contains("commit one"), ). NavigateToLine(Contains("commit one")). Press(keys.Universal.Edit). Lines( Contains("─── Pending rebase todos"), Contains("commit three"), Contains("commit two"), Contains("─── Commits"), Contains("commit one").IsSelected(), ). NavigateToLine(Contains("commit two")). Press(keys.Commits.MoveUpCommit). Lines( Contains("─── Pending rebase todos"), Contains("commit two").IsSelected(), Contains("commit three"), Contains("─── Commits"), Contains("commit one"), ). NavigateToLine(Contains("commit three")). Press(keys.Universal.Edit). SelectPreviousItem(). Tap(func() { t.Common().ContinueRebase() }) handleConflictsFromSwap(t, "edit") }, })
var SwapWithConflict = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Directly swap two commits, causing a conflict. Then resolve the conflict and continue", ExtraCmdArgs: []string{}, Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { shell.CreateFileAndAdd("myfile", "one") shell.Commit("commit one") shell.UpdateFileAndAdd("myfile", "two") shell.Commit("commit two") shell.UpdateFileAndAdd("myfile", "three") shell.Commit("commit three") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Lines( Contains("commit three").IsSelected(), Contains("commit two"), Contains("commit one"), ). Press(keys.Commits.MoveDownCommit) handleConflictsFromSwap(t, "pick") }, })
var ViewFilesOfTodoEntries = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Check that files of a pick todo can be viewed, but files of an update-ref todo can't", ExtraCmdArgs: []string{}, Skip: false, GitVersion: AtLeast("2.38.0"), SetupConfig: func(config *config.AppConfig) { config.GetUserConfig().Git.Log.ShowGraph = "never" }, SetupRepo: func(shell *Shell) { shell. CreateNCommits(1). NewBranch("branch1"). CreateNCommitsStartingAt(1, 2). NewBranch("branch2"). CreateNCommitsStartingAt(1, 3) shell.SetConfig("rebase.updateRefs", "true") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { t.Views().Commits(). Focus(). Press(keys.Commits.StartInteractiveRebase). Lines( Contains("─── Pending rebase todos"), Contains("pick").Contains("CI commit-03").IsSelected(), Contains("update-ref").Contains("branch1"), Contains("pick").Contains("CI commit-02"), Contains("─── Commits"), Contains("CI commit-01"), ). Press(keys.Universal.GoInto) t.Views().CommitFiles(). IsFocused(). Lines( Contains("file03.txt"), ). PressEscape() t.Views().Commits(). IsFocused(). NavigateToLine(Contains("update-ref")). Press(keys.Universal.GoInto) t.ExpectToast(Equals("Disabled: Selected item does not have files to view")) }, })
Functions ¶
This section is empty.
Types ¶
This section is empty.
Source Files
¶
- advanced_interactive_rebase.go
- amend_commit_with_conflict.go
- amend_first_commit.go
- amend_fixup_commit.go
- amend_head_commit_during_rebase.go
- amend_merge.go
- amend_non_head_commit_during_rebase.go
- delete_update_ref_todo.go
- dont_show_branch_heads_for_todo_items.go
- drag_keeps_selection_highlighted.go
- drag_to_reorder.go
- drag_to_reorder_in_rebase.go
- drag_to_reorder_with_autoscroll.go
- drop_commit_in_copied_branch_with_update_ref.go
- drop_merge_commit.go
- drop_todo_commit_with_update_ref.go
- drop_with_custom_comment_char.go
- edit_and_auto_amend.go
- edit_first_commit.go
- edit_last_commit_of_stacked_branch.go
- edit_non_todo_commit_during_rebase.go
- edit_range_select_down_to_merge_outside_rebase.go
- edit_range_select_outside_rebase.go
- edit_the_confl_commit.go
- fixup_first_commit.go
- fixup_keep_message.go
- fixup_keep_message_rebase.go
- fixup_second_commit.go
- interactive_rebase_of_copied_branch.go
- interactive_rebase_with_conflict_for_edit_command.go
- mid_rebase_range_select.go
- move.go
- move_across_branch_boundary_outside_rebase.go
- move_in_rebase.go
- move_todo_down_with_rapid_keypresses.go
- move_update_ref_todo.go
- move_with_custom_comment_char.go
- outside_rebase_range_select.go
- pick_rescheduled.go
- quick_start.go
- quick_start_keep_selection.go
- quick_start_keep_selection_range.go
- rebase.go
- rebase_with_commit_that_becomes_empty.go
- revert_during_rebase_when_stopped_on_edit.go
- revert_multiple_commits_in_interactive_rebase.go
- revert_single_commit_in_interactive_rebase.go
- reword_commit_with_editor_and_fail.go
- reword_first_commit.go
- reword_last_commit.go
- reword_last_commit_of_stacked_branch.go
- reword_merge_commit.go
- reword_you_are_here_commit.go
- reword_you_are_here_commit_with_editor.go
- shared.go
- show_exec_todos.go
- squash_down_first_commit.go
- squash_down_second_commit.go
- squash_fixups_above.go
- squash_fixups_above_first_commit.go
- squash_fixups_in_current_branch.go
- swap_in_rebase_with_conflict.go
- swap_in_rebase_with_conflict_and_edit.go
- swap_with_conflict.go
- view_files_of_todo_entries.go