interactive_rebase

package
v0.41.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 22, 2024 License: MIT Imports: 4 Imported by: 0

Documentation

Index

Constants

View Source
const (
	BASE_BRANCH = "base-branch"
	TOP_BRANCH  = "top-branch"
	BASE_COMMIT = "base-commit"
	TOP_COMMIT  = "top-commit"
)

Variables

View Source
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' onto '%s'", TOP_BRANCH, BASE_BRANCH))).
			Select(Contains("Interactive rebase")).
			Confirm()
		t.Views().Commits().
			IsFocused().
			Lines(
				Contains(TOP_COMMIT),
				Contains(BASE_COMMIT).Contains("YOU ARE HERE"),
			).
			NavigateToLine(Contains(TOP_COMMIT)).
			Press(keys.Universal.Edit).
			Lines(
				Contains(TOP_COMMIT).Contains("edit"),
				Contains(BASE_COMMIT).Contains("YOU ARE HERE"),
			).
			Tap(func() {
				t.Common().ContinueRebase()
			}).
			Lines(
				Contains(TOP_COMMIT).Contains("YOU ARE HERE"),
				Contains(BASE_COMMIT),
			)
	},
})
View Source
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("pick").Contains("three"),
				Contains("conflict").Contains("<-- YOU ARE HERE --- fixup! two"),
				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()

		t.Common().AcknowledgeConflicts()

		t.Views().Commits().
			Lines(
				Contains("<-- YOU ARE HERE --- three"),
				Contains("two"),
				Contains("one"),
			)
	},
})
View Source
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"))
	},
})
View Source
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"))
	},
})
View Source
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("commit 03"),
				Contains("<-- YOU ARE HERE --- 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("commit 03"),
				Contains("<-- YOU ARE HERE --- commit 02").IsSelected(),
				Contains("commit 01"),
			)

		t.Views().Main().
			Content(Contains("fixup content"))
	},
})
View Source
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))
	},
})
View Source
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("commit 03"),
				Contains("<-- YOU ARE HERE --- 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"))
		}
	},
})
View Source
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("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("CI ◯ <-- YOU ARE HERE --- 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("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("CI ◯ <-- YOU ARE HERE --- 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"),
			)
	},
})
View Source
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.AppState.GitLogShowGraph = "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("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("CI <-- YOU ARE HERE --- commit 04"),
				Contains("CI commit 03"),
				Contains("CI * commit 02"),
				Contains("CI commit 01"),
			)
	},
})
View Source
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.AppState.GitLogShowGraph = "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).
			Focus().
			Lines(
				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("<-- YOU ARE HERE --- commit 02").IsSelected(),
				Contains("CI commit 01"),
			).
			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"),
			)
	},
})
View Source
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(),
			)
	},
})
View Source
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("commit 02"),
				MatchesRegexp("YOU ARE HERE.*commit 01").IsSelected(),
			).
			Tap(func() {
				t.Common().ContinueRebase()
			}).
			Lines(
				Contains("commit 02"),
				Contains("commit 01"),
			)
	},
})
View Source
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("<-- YOU ARE HERE --- 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."))
	},
})
View Source
var EditRangeSelectOutsideRebase = NewIntegrationTest(NewIntegrationTestArgs{
	Description:  "Select a range of commits to edit outside of a rebase",
	ExtraCmdArgs: []string{},
	Skip:         false,
	GitVersion:   AtLeast("2.22.0"),
	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("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("       CI ◯ <-- YOU ARE HERE --- three").IsSelected(),
				Contains("       CI ◯ two"),
				Contains("       CI ◯ one"),
			)
	},
})
View Source
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("pick").Contains("commit two"),
				Contains("conflict").Contains("<-- YOU ARE HERE --- commit three"),
				Contains("commit one"),
			).
			NavigateToLine(Contains("<-- YOU ARE HERE --- commit three")).
			Press(keys.Commits.RenameCommit)

		t.ExpectToast(Contains("Disabled: Rewording commits while interactively rebasing is not currently supported"))
	},
})
View Source
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"),
			)
	},
})
View Source
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().Confirmation().
					Title(Equals("Fixup")).
					Content(Equals("Are you sure you want to 'fixup' the selected commit(s) into the commit below?")).
					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"))
	},
})
View Source
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("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("<-- YOU ARE HERE --- commit 05").IsSelected(),
				Contains("commit 04"),
			).
			SelectPreviousItem().
			Press(keys.Universal.RangeSelectUp).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Commits.MarkCommitAsFixup).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Commits.PickCommit).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Universal.Edit).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Commits.SquashDown).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Commits.MoveDownCommit).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Tap(func() {
				t.ExpectToast(Contains("Disabled: Cannot move any further"))
			}).
			Press(keys.Commits.MoveUpCommit).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Commits.MoveUpCommit).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Commits.MoveUpCommit).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			Press(keys.Commits.MoveUpCommit).
			Tap(func() {
				t.ExpectToast(Contains("Disabled: Cannot move any further"))
			}).
			TopLines(
				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("<-- YOU ARE HERE --- commit 05"),
				Contains("commit 04"),
			).
			NavigateToLine(Contains("commit 08")).
			Press(keys.Universal.RangeSelectDown).
			TopLines(
				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("<-- YOU ARE HERE --- 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("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("<-- YOU ARE HERE --- 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(),
			)
	},
})
View Source
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"),
			)
	},
})
View Source
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("commit 04"),
				Contains("commit 03"),
				Contains("commit 02"),
				Contains("YOU ARE HERE").Contains("commit 01").IsSelected(),
			).
			SelectPreviousItem().
			Press(keys.Commits.MoveUpCommit).
			Lines(
				Contains("commit 04"),
				Contains("commit 02").IsSelected(),
				Contains("commit 03"),
				Contains("YOU ARE HERE").Contains("commit 01"),
			).
			Press(keys.Commits.MoveUpCommit).
			Lines(
				Contains("commit 02").IsSelected(),
				Contains("commit 04"),
				Contains("commit 03"),
				Contains("YOU ARE HERE").Contains("commit 01"),
			).
			Press(keys.Commits.MoveUpCommit).
			Tap(func() {
				t.ExpectToast(Contains("Disabled: Cannot move any further"))
			}).
			Lines(
				Contains("commit 02").IsSelected(),
				Contains("commit 04"),
				Contains("commit 03"),
				Contains("YOU ARE HERE").Contains("commit 01"),
			).
			Press(keys.Commits.MoveDownCommit).
			Lines(
				Contains("commit 04"),
				Contains("commit 02").IsSelected(),
				Contains("commit 03"),
				Contains("YOU ARE HERE").Contains("commit 01"),
			).
			Press(keys.Commits.MoveDownCommit).
			Lines(
				Contains("commit 04"),
				Contains("commit 03"),
				Contains("commit 02").IsSelected(),
				Contains("YOU ARE HERE").Contains("commit 01"),
			).
			Press(keys.Commits.MoveDownCommit).
			Tap(func() {
				t.ExpectToast(Contains("Disabled: Cannot move any further"))
			}).
			Lines(
				Contains("commit 04"),
				Contains("commit 03"),
				Contains("commit 02").IsSelected(),
				Contains("YOU ARE HERE").Contains("commit 01"),
			).
			Press(keys.Commits.MoveUpCommit).
			Lines(
				Contains("commit 04"),
				Contains("commit 02").IsSelected(),
				Contains("commit 03"),
				Contains("YOU ARE HERE").Contains("commit 01"),
			).
			Tap(func() {
				t.Common().ContinueRebase()
			}).
			Lines(
				Contains("commit 04"),
				Contains("commit 02").IsSelected(),
				Contains("commit 03"),
				DoesNotContain("YOU ARE HERE").Contains("commit 01"),
			)
	},
})
View Source
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("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("CI ◯ <-- YOU ARE HERE --- commit 01"),
			).
			NavigateToLine(Contains("update-ref")).
			Press(keys.Commits.MoveUpCommit).
			Press(keys.Commits.MoveUpCommit).
			Lines(
				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("CI ◯ <-- YOU ARE HERE --- 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"),
			)
	},
})
View Source
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"),
			)
	},
})
View Source
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().Confirmation().
					Title(Equals("Fixup")).
					Content(Contains("Are you sure you want to 'fixup' the selected commit(s) into the commit below?")).
					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"),
			)
	},
})
View Source
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("pick").Contains("three"),
				Contains("pick").Contains("two"),
				Contains("<-- YOU ARE HERE --- 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("pick").Contains("three"),
				Contains("<-- YOU ARE HERE --- two"),
				Contains("one"),
			)
	},
})
View Source
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("feature-branch two").IsSelected(),
				Contains("feature-branch one"),
				Contains("last main commit").Contains("YOU ARE HERE"),
				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("branch-with-merge three").IsSelected(),
				Contains("Merge branch 'branch-to-merge'").Contains("YOU ARE HERE"),
				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"),
			)
	},
})
View Source
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.AppState.GitLogShowGraph = "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("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("CI <-- YOU ARE HERE --- commit 01"),
			)
	},
})
View Source
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.AppState.GitLogShowGraph = "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("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("CI <-- YOU ARE HERE --- commit 01"),
			)
	},
})
View Source
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(
				MatchesRegexp("pick.*commit to fixup"),
				MatchesRegexp("pick.*commit to drop"),
				MatchesRegexp("pick.*second commit to edit"),
				MatchesRegexp("pick.*commit to squash"),
				MatchesRegexp("YOU ARE HERE.*first commit to edit").IsSelected(),
				Contains("initial commit"),
			).
			SelectPreviousItem().
			Press(keys.Commits.SquashDown).
			Lines(
				MatchesRegexp("pick.*commit to fixup"),
				MatchesRegexp("pick.*commit to drop"),
				MatchesRegexp("pick.*second commit to edit"),
				MatchesRegexp("squash.*commit to squash").IsSelected(),
				MatchesRegexp("YOU ARE HERE.*first commit to edit"),
				Contains("initial commit"),
			).
			SelectPreviousItem().
			Press(keys.Universal.Edit).
			Lines(
				MatchesRegexp("pick.*commit to fixup"),
				MatchesRegexp("pick.*commit to drop"),
				MatchesRegexp("edit.*second commit to edit").IsSelected(),
				MatchesRegexp("squash.*commit to squash"),
				MatchesRegexp("YOU ARE HERE.*first commit to edit"),
				Contains("initial commit"),
			).
			SelectPreviousItem().
			Press(keys.Universal.Remove).
			Lines(
				MatchesRegexp("pick.*commit to fixup"),
				MatchesRegexp("drop.*commit to drop").IsSelected(),
				MatchesRegexp("edit.*second commit to edit"),
				MatchesRegexp("squash.*commit to squash"),
				MatchesRegexp("YOU ARE HERE.*first commit to edit"),
				Contains("initial commit"),
			).
			SelectPreviousItem().
			Press(keys.Commits.MarkCommitAsFixup).
			Lines(
				MatchesRegexp("fixup.*commit to fixup").IsSelected(),
				MatchesRegexp("drop.*commit to drop"),
				MatchesRegexp("edit.*second commit to edit"),
				MatchesRegexp("squash.*commit to squash"),
				MatchesRegexp("YOU ARE HERE.*first commit to edit"),
				Contains("initial commit"),
			).
			Tap(func() {
				t.Common().ContinueRebase()
			}).
			Lines(
				MatchesRegexp("fixup.*commit to fixup").IsSelected(),
				MatchesRegexp("drop.*commit to drop"),
				MatchesRegexp("YOU ARE HERE.*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"),
				)
			})
	},
})
View Source
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("commit 03"),
				Contains("<-- YOU ARE HERE --- commit 02").IsSelected(),
				Contains("commit 01"),
			)

		t.ExpectPopup().Alert().
			Title(Equals("Error")).
			Content(Contains("exit status 1"))
	},
})
View Source
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"),
			)
	},
})
View Source
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"),
			)
	},
})
View Source
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("commit 03"),
				Contains("<-- YOU ARE HERE --- 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("commit 03"),
				Contains("<-- YOU ARE HERE --- renamed 02").IsSelected(),
				Contains("commit 01"),
			)
	},
})
View Source
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("commit 03"),
				Contains("<-- YOU ARE HERE --- 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("commit 03"),
				Contains("<-- YOU ARE HERE --- renamed 02").IsSelected(),
				Contains("commit 01"),
			)
	},
})
View Source
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"),
			)
	},
})
View Source
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"))
	},
})
View Source
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"))
	},
})
View Source
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"))
	},
})
View Source
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"))
	},
})
View Source
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("commit three"),
				Contains("commit two"),
				Contains("YOU ARE HERE").Contains("commit one").IsSelected(),
			).
			SelectPreviousItem().
			Press(keys.Commits.MoveUpCommit).
			Lines(
				Contains("commit two").IsSelected(),
				Contains("commit three"),
				Contains("YOU ARE HERE").Contains("commit one"),
			).
			Tap(func() {
				t.Common().ContinueRebase()
			})

		handleConflictsFromSwap(t)
	},
})
View Source
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("commit three"),
				Contains("commit two"),
				Contains("<-- YOU ARE HERE --- commit one").IsSelected(),
			).
			NavigateToLine(Contains("commit two")).
			Press(keys.Commits.MoveUpCommit).
			Lines(
				Contains("commit two").IsSelected(),
				Contains("commit three"),
				Contains("<-- YOU ARE HERE --- commit one"),
			).
			NavigateToLine(Contains("commit three")).
			Press(keys.Universal.Edit).
			SelectPreviousItem().
			Tap(func() {
				t.Common().ContinueRebase()
			})

		handleConflictsFromSwap(t)
	},
})
View Source
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)
	},
})
View Source
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.AppState.GitLogShowGraph = "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("pick").Contains("CI commit 03").IsSelected(),
				Contains("update-ref").Contains("branch1"),
				Contains("pick").Contains("CI commit 02"),
				Contains("CI <-- YOU ARE HERE --- 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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL