1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-07-05 00:59:19 +02:00

Add a root item ("/") if files at top level have changed

This commit is contained in:
Stefan Haller
2025-03-01 07:25:26 +01:00
parent 0b42cfb568
commit 26459523f5
61 changed files with 663 additions and 448 deletions

View File

@ -509,7 +509,7 @@ func (self *CommitFilesController) enterCommitFile(node *filetree.CommitFileNode
} }
func (self *CommitFilesController) handleToggleCommitFileDirCollapsed(node *filetree.CommitFileNode) error { func (self *CommitFilesController) handleToggleCommitFileDirCollapsed(node *filetree.CommitFileNode) error {
self.context().CommitFileTreeViewModel.ToggleCollapsed(node.GetPath()) self.context().CommitFileTreeViewModel.ToggleCollapsed(node.GetInternalPath())
self.c.PostRefreshUpdate(self.context()) self.c.PostRefreshUpdate(self.context())

View File

@ -1078,7 +1078,7 @@ func (self *FilesController) handleToggleDirCollapsed() error {
return nil return nil
} }
self.context().FileTreeViewModel.ToggleCollapsed(node.GetPath()) self.context().FileTreeViewModel.ToggleCollapsed(node.GetInternalPath())
self.c.PostRefreshUpdate(self.c.Contexts().Files) self.c.PostRefreshUpdate(self.c.Contexts().Files)

View File

@ -14,7 +14,7 @@ func BuildTreeFromFiles(files []*models.File) *Node[models.File] {
var curr *Node[models.File] var curr *Node[models.File]
for _, file := range files { for _, file := range files {
splitPath := split(file.Path) splitPath := split("./" + file.Path)
curr = root curr = root
outer: outer:
for i := range splitPath { for i := range splitPath {
@ -40,6 +40,11 @@ func BuildTreeFromFiles(files []*models.File) *Node[models.File] {
continue outer continue outer
} }
if i == 0 && len(files) == 1 && len(splitPath) == 2 {
// skip the root item when there's only one file at top level; we don't need it in that case
continue outer
}
newChild := &Node[models.File]{ newChild := &Node[models.File]{
path: path, path: path,
File: setFile, File: setFile,
@ -70,7 +75,7 @@ func BuildTreeFromCommitFiles(files []*models.CommitFile) *Node[models.CommitFil
var curr *Node[models.CommitFile] var curr *Node[models.CommitFile]
for _, file := range files { for _, file := range files {
splitPath := split(file.Path) splitPath := split("./" + file.Path)
curr = root curr = root
outer: outer:
for i := range splitPath { for i := range splitPath {
@ -89,6 +94,11 @@ func BuildTreeFromCommitFiles(files []*models.CommitFile) *Node[models.CommitFil
} }
} }
if i == 0 && len(files) == 1 && len(splitPath) == 2 {
// skip the root item when there's only one file at top level; we don't need it in that case
continue outer
}
newChild := &Node[models.CommitFile]{ newChild := &Node[models.CommitFile]{
path: path, path: path,
File: setFile, File: setFile,

View File

@ -35,15 +35,16 @@ func TestBuildTreeFromFiles(t *testing.T) {
path: "", path: "",
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
path: "dir1", path: "./dir1",
CompressionLevel: 1,
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "dir1/a"}, File: &models.File{Path: "dir1/a"},
path: "dir1/a", path: "./dir1/a",
}, },
{ {
File: &models.File{Path: "dir1/b"}, File: &models.File{Path: "dir1/b"},
path: "dir1/b", path: "./dir1/b",
}, },
}, },
}, },
@ -64,24 +65,29 @@ func TestBuildTreeFromFiles(t *testing.T) {
path: "", path: "",
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
path: "dir1/dir3", path: ".",
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "dir1/dir3/a"}, path: "./dir1/dir3",
path: "dir1/dir3/a", Children: []*Node[models.File]{
{
File: &models.File{Path: "dir1/dir3/a"},
path: "./dir1/dir3/a",
},
},
CompressionLevel: 1,
}, },
},
CompressionLevel: 1,
},
{
path: "dir2/dir4",
Children: []*Node[models.File]{
{ {
File: &models.File{Path: "dir2/dir4/b"}, path: "./dir2/dir4",
path: "dir2/dir4/b", Children: []*Node[models.File]{
{
File: &models.File{Path: "dir2/dir4/b"},
path: "./dir2/dir4/b",
},
},
CompressionLevel: 1,
}, },
}, },
CompressionLevel: 1,
}, },
}, },
}, },
@ -100,12 +106,17 @@ func TestBuildTreeFromFiles(t *testing.T) {
path: "", path: "",
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "a"}, path: ".",
path: "a", Children: []*Node[models.File]{
}, {
{ File: &models.File{Path: "a"},
File: &models.File{Path: "b"}, path: "./a",
path: "b", },
{
File: &models.File{Path: "b"},
path: "./b",
},
},
}, },
}, },
}, },
@ -126,20 +137,25 @@ func TestBuildTreeFromFiles(t *testing.T) {
}, },
expected: &Node[models.File]{ expected: &Node[models.File]{
path: "", path: "",
// it is a little strange that we're not bubbling up our merge conflict
// here but we are technically still in tree mode and that's the rule
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "a"}, path: ".",
path: "a", // it is a little strange that we're not bubbling up our merge conflict
}, // here but we are technically still in tree mode and that's the rule
{ Children: []*Node[models.File]{
File: &models.File{Path: "b"}, {
path: "b", File: &models.File{Path: "a"},
}, path: "./a",
{ },
File: &models.File{Path: "z", HasMergeConflicts: true}, {
path: "z", File: &models.File{Path: "b"},
path: "./b",
},
{
File: &models.File{Path: "z", HasMergeConflicts: true},
path: "./z",
},
},
}, },
}, },
}, },
@ -183,12 +199,12 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "dir1/a"}, File: &models.File{Path: "dir1/a"},
path: "dir1/a", path: "./dir1/a",
CompressionLevel: 0, CompressionLevel: 0,
}, },
{ {
File: &models.File{Path: "dir1/b"}, File: &models.File{Path: "dir1/b"},
path: "dir1/b", path: "./dir1/b",
CompressionLevel: 0, CompressionLevel: 0,
}, },
}, },
@ -209,12 +225,12 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "dir1/a"}, File: &models.File{Path: "dir1/a"},
path: "dir1/a", path: "./dir1/a",
CompressionLevel: 0, CompressionLevel: 0,
}, },
{ {
File: &models.File{Path: "dir2/b"}, File: &models.File{Path: "dir2/b"},
path: "dir2/b", path: "./dir2/b",
CompressionLevel: 0, CompressionLevel: 0,
}, },
}, },
@ -235,11 +251,11 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "a"}, File: &models.File{Path: "a"},
path: "a", path: "./a",
}, },
{ {
File: &models.File{Path: "b"}, File: &models.File{Path: "b"},
path: "b", path: "./b",
}, },
}, },
}, },
@ -277,27 +293,27 @@ func TestBuildFlatTreeFromFiles(t *testing.T) {
Children: []*Node[models.File]{ Children: []*Node[models.File]{
{ {
File: &models.File{Path: "c1", HasMergeConflicts: true}, File: &models.File{Path: "c1", HasMergeConflicts: true},
path: "c1", path: "./c1",
}, },
{ {
File: &models.File{Path: "c2", HasMergeConflicts: true}, File: &models.File{Path: "c2", HasMergeConflicts: true},
path: "c2", path: "./c2",
}, },
{ {
File: &models.File{Path: "b1", Tracked: true}, File: &models.File{Path: "b1", Tracked: true},
path: "b1", path: "./b1",
}, },
{ {
File: &models.File{Path: "b2", Tracked: true}, File: &models.File{Path: "b2", Tracked: true},
path: "b2", path: "./b2",
}, },
{ {
File: &models.File{Path: "a1", Tracked: false}, File: &models.File{Path: "a1", Tracked: false},
path: "a1", path: "./a1",
}, },
{ {
File: &models.File{Path: "a2", Tracked: false}, File: &models.File{Path: "a2", Tracked: false},
path: "a2", path: "./a2",
}, },
}, },
}, },
@ -340,15 +356,16 @@ func TestBuildTreeFromCommitFiles(t *testing.T) {
path: "", path: "",
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
path: "dir1", path: "./dir1",
CompressionLevel: 1,
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
File: &models.CommitFile{Path: "dir1/a"}, File: &models.CommitFile{Path: "dir1/a"},
path: "dir1/a", path: "./dir1/a",
}, },
{ {
File: &models.CommitFile{Path: "dir1/b"}, File: &models.CommitFile{Path: "dir1/b"},
path: "dir1/b", path: "./dir1/b",
}, },
}, },
}, },
@ -369,24 +386,29 @@ func TestBuildTreeFromCommitFiles(t *testing.T) {
path: "", path: "",
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
path: "dir1/dir3", path: ".",
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
File: &models.CommitFile{Path: "dir1/dir3/a"}, path: "./dir1/dir3",
path: "dir1/dir3/a", Children: []*Node[models.CommitFile]{
{
File: &models.CommitFile{Path: "dir1/dir3/a"},
path: "./dir1/dir3/a",
},
},
CompressionLevel: 1,
}, },
},
CompressionLevel: 1,
},
{
path: "dir2/dir4",
Children: []*Node[models.CommitFile]{
{ {
File: &models.CommitFile{Path: "dir2/dir4/b"}, path: "./dir2/dir4",
path: "dir2/dir4/b", Children: []*Node[models.CommitFile]{
{
File: &models.CommitFile{Path: "dir2/dir4/b"},
path: "./dir2/dir4/b",
},
},
CompressionLevel: 1,
}, },
}, },
CompressionLevel: 1,
}, },
}, },
}, },
@ -405,12 +427,17 @@ func TestBuildTreeFromCommitFiles(t *testing.T) {
path: "", path: "",
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
File: &models.CommitFile{Path: "a"}, path: ".",
path: "a", Children: []*Node[models.CommitFile]{
}, {
{ File: &models.CommitFile{Path: "a"},
File: &models.CommitFile{Path: "b"}, path: "./a",
path: "b", },
{
File: &models.CommitFile{Path: "b"},
path: "./b",
},
},
}, },
}, },
}, },
@ -454,12 +481,12 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) {
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
File: &models.CommitFile{Path: "dir1/a"}, File: &models.CommitFile{Path: "dir1/a"},
path: "dir1/a", path: "./dir1/a",
CompressionLevel: 0, CompressionLevel: 0,
}, },
{ {
File: &models.CommitFile{Path: "dir1/b"}, File: &models.CommitFile{Path: "dir1/b"},
path: "dir1/b", path: "./dir1/b",
CompressionLevel: 0, CompressionLevel: 0,
}, },
}, },
@ -480,12 +507,12 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) {
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
File: &models.CommitFile{Path: "dir1/a"}, File: &models.CommitFile{Path: "dir1/a"},
path: "dir1/a", path: "./dir1/a",
CompressionLevel: 0, CompressionLevel: 0,
}, },
{ {
File: &models.CommitFile{Path: "dir2/b"}, File: &models.CommitFile{Path: "dir2/b"},
path: "dir2/b", path: "./dir2/b",
CompressionLevel: 0, CompressionLevel: 0,
}, },
}, },
@ -506,11 +533,11 @@ func TestBuildFlatTreeFromCommitFiles(t *testing.T) {
Children: []*Node[models.CommitFile]{ Children: []*Node[models.CommitFile]{
{ {
File: &models.CommitFile{Path: "a"}, File: &models.CommitFile{Path: "a"},
path: "a", path: "./a",
}, },
{ {
File: &models.CommitFile{Path: "b"}, File: &models.CommitFile{Path: "b"},
path: "b", path: "./b",
}, },
}, },
}, },

View File

@ -20,7 +20,7 @@ type Node[T any] struct {
Children []*Node[T] Children []*Node[T]
// path of the file/directory // path of the file/directory
// private; use GetPath() to access // private; use either GetPath() or GetInternalPath() to access
path string path string
// rather than render a tree as: // rather than render a tree as:
@ -47,7 +47,19 @@ func (self *Node[T]) GetFile() *T {
return self.File return self.File
} }
// This returns the logical path from the user's point of view. It is the
// relative path from the root of the repository.
// Use this for display, or when you want to perform some action on the path
// (e.g. a git command).
func (self *Node[T]) GetPath() string { func (self *Node[T]) GetPath() string {
return strings.TrimPrefix(self.path, "./")
}
// This returns the internal path from the tree's point of view. It's the same
// as GetPath(), but prefixed with "./" for the root item.
// Use this when interacting with the tree itself, e.g. when calling
// ToggleCollapsed.
func (self *Node[T]) GetInternalPath() string {
return self.path return self.path
} }

View File

@ -91,11 +91,11 @@ func renderAux[T any](
arr := []string{} arr := []string{}
if !isRoot { if !isRoot {
isCollapsed := collapsedPaths.IsCollapsed(node.GetPath()) isCollapsed := collapsedPaths.IsCollapsed(node.GetInternalPath())
arr = append(arr, renderLine(node, treeDepth, visualDepth, isCollapsed)) arr = append(arr, renderLine(node, treeDepth, visualDepth, isCollapsed))
} }
if collapsedPaths.IsCollapsed(node.GetPath()) { if collapsedPaths.IsCollapsed(node.GetInternalPath()) {
return arr return arr
} }
@ -293,7 +293,13 @@ func getColorForChangeStatus(changeStatus string) style.TextStyle {
} }
func fileNameAtDepth(node *filetree.Node[models.File], depth int) string { func fileNameAtDepth(node *filetree.Node[models.File], depth int) string {
splitName := split(node.GetPath()) splitName := split(node.GetInternalPath())
if depth == 0 && splitName[0] == "." {
if len(splitName) == 1 {
return "/"
}
depth = 1
}
name := join(splitName[depth:]) name := join(splitName[depth:])
if node.File != nil && node.File.IsRename() { if node.File != nil && node.File.IsRename() {
@ -314,7 +320,13 @@ func fileNameAtDepth(node *filetree.Node[models.File], depth int) string {
} }
func commitFileNameAtDepth(node *filetree.Node[models.CommitFile], depth int) string { func commitFileNameAtDepth(node *filetree.Node[models.CommitFile], depth int) string {
splitName := split(node.GetPath()) splitName := split(node.GetInternalPath())
if depth == 0 && splitName[0] == "." {
if len(splitName) == 1 {
return "/"
}
depth = 1
}
name := join(splitName[depth:]) name := join(splitName[depth:])
return name return name

View File

@ -48,10 +48,11 @@ func TestRenderFileTree(t *testing.T) {
}, },
showLineChanges: true, showLineChanges: true,
expected: []string{ expected: []string{
" M test +1 -1", "▼ /",
" M test2 +1", " M test +1 -1",
" M test3 -1", " M test2 +1",
" M test4", " M test3 -1",
" M test4",
}, },
}, },
{ {
@ -66,16 +67,17 @@ func TestRenderFileTree(t *testing.T) {
}, },
expected: toStringSlice( expected: toStringSlice(
` `
▶ dir1 ▼ /
dir2 dir1
▼ dir2 ▼ dir2
M file3 ▼ dir2
M file4 M file3
M file5 M file4
M file1 M file5
M file1
`, `,
), ),
collapsedPaths: []string{"dir1"}, collapsedPaths: []string{"./dir1"},
}, },
} }
@ -127,16 +129,17 @@ func TestRenderCommitFileTree(t *testing.T) {
}, },
expected: toStringSlice( expected: toStringSlice(
` `
▶ dir1 ▼ /
dir2 dir1
▼ dir2 ▼ dir2
D file3 ▼ dir2
M file4 D file3
M file5 M file4
M file1 M file5
M file1
`, `,
), ),
collapsedPaths: []string{"dir1"}, collapsedPaths: []string{"./dir1"},
}, },
} }

View File

@ -72,8 +72,9 @@ var ResetToUpstream = NewIntegrationTest(NewIntegrationTestArgs{
Contains("hard commit"), Contains("hard commit"),
) )
t.Views().Files().Lines( t.Views().Files().Lines(
Equals("A file-1"), Equals("▼ /"),
Equals("A file-2"), Equals(" A file-1"),
Equals(" A file-2"),
) )
// hard reset // hard reset

View File

@ -21,19 +21,23 @@ var Commit = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("?? myfile").IsSelected(), Equals("▼ /").IsSelected(),
Equals("?? myfile2"), Equals(" ?? myfile"),
Equals(" ?? myfile2"),
). ).
SelectNextItem().
PressPrimaryAction(). // stage file PressPrimaryAction(). // stage file
Lines( Lines(
Equals("A myfile").IsSelected(), Equals("▼ /"),
Equals("?? myfile2"), Equals(" A myfile").IsSelected(),
Equals(" ?? myfile2"),
). ).
SelectNextItem(). SelectNextItem().
PressPrimaryAction(). // stage other file PressPrimaryAction(). // stage other file
Lines( Lines(
Equals("A myfile"), Equals("▼ /"),
Equals("A myfile2").IsSelected(), Equals(" A myfile"),
Equals(" A myfile2").IsSelected(),
). ).
Press(keys.Files.CommitChanges) Press(keys.Files.CommitChanges)
@ -54,8 +58,9 @@ var Commit = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("A myfile"), Equals("▼ /"),
Equals("A myfile2"), Equals(" A myfile"),
Equals(" A myfile2"),
) )
}, },
}) })

View File

@ -25,6 +25,12 @@ var CommitSwitchToEditor = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines(
Equals("▼ /").IsSelected(),
Equals(" ?? file1"),
Equals(" ?? file2"),
).
SelectNextItem().
PressPrimaryAction(). // stage one of the files PressPrimaryAction(). // stage one of the files
Press(keys.Files.CommitChanges) Press(keys.Files.CommitChanges)
@ -45,6 +51,9 @@ var CommitSwitchToEditor = NewIntegrationTest(NewIntegrationTestArgs{
// Now check that the preserved commit message was cleared: // Now check that the preserved commit message was cleared:
t.Views().Files(). t.Views().Files().
Focus(). Focus().
Lines(
Equals("?? file2"),
).
PressPrimaryAction(). // stage the other file PressPrimaryAction(). // stage the other file
Press(keys.Files.CommitChanges) Press(keys.Files.CommitChanges)

View File

@ -43,13 +43,14 @@ var DiscardOldFileChanges = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir1").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ▼ subd1"), Equals(" ▼ dir1"),
Equals(" A subfile0"), Equals(" subd1"),
Equals(" A d1_file0"), Equals(" A subfile0"),
Equals("▼ dir2"), Equals(" A d1_file0"),
Equals(" A d2_file1"), Equals(" dir2"),
Equals(" A d2_file2"), Equals(" A d2_file1"),
Equals(" A d2_file2"),
). ).
NavigateToLine(Contains("d1_file0")). NavigateToLine(Contains("d1_file0")).
Press(keys.Universal.Remove) Press(keys.Universal.Remove)
@ -62,11 +63,12 @@ var DiscardOldFileChanges = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir1/subd1"), Equals("▼ /"),
Equals(" A subfile0"), Equals(" ▼ dir1/subd1"),
Equals("▼ dir2"), Equals(" A subfile0"),
Equals(" A d2_file1").IsSelected(), Equals(" dir2"),
Equals(" A d2_file2"), Equals(" A d2_file1").IsSelected(),
Equals(" A d2_file2"),
). ).
PressEscape() PressEscape()

View File

@ -20,6 +20,12 @@ var Reword = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines(
Equals("▼ /").IsSelected(),
Contains("myfile"),
Contains("myfile2"),
).
SelectNextItem().
PressPrimaryAction(). PressPrimaryAction().
Press(keys.Files.CommitChanges) Press(keys.Files.CommitChanges)

View File

@ -21,7 +21,12 @@ var Staged = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
SelectedLine(Contains("myfile")). Lines(
Equals("▼ /").IsSelected(),
Contains("myfile"),
Contains("myfile2"),
).
SelectNextItem().
PressPrimaryAction(). // stage the file PressPrimaryAction(). // stage the file
PressEnter() PressEnter()

View File

@ -22,7 +22,12 @@ var StagedWithoutHooks = NewIntegrationTest(NewIntegrationTestArgs{
// stage the file // stage the file
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
SelectedLine(Contains("myfile")). Lines(
Equals("▼ /").IsSelected(),
Contains("myfile"),
Contains("myfile2"),
).
SelectNextItem().
PressPrimaryAction(). PressPrimaryAction().
PressEnter() PressEnter()

View File

@ -21,7 +21,12 @@ var Unstaged = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
SelectedLine(Contains("myfile")). Lines(
Equals("▼ /").IsSelected(),
Contains("myfile"),
Contains("myfile2"),
).
SelectNextItem().
PressEnter() PressEnter()
t.Views().Staging(). t.Views().Staging().

View File

@ -18,8 +18,9 @@ var Filter = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("UU file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("UU file2"), Equals(" UU file1"),
Equals(" UU file2"),
). ).
Press(keys.Files.OpenStatusFilter). Press(keys.Files.OpenStatusFilter).
Tap(func() { Tap(func() {
@ -29,10 +30,11 @@ var Filter = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("UU file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("UU file2"), Equals(" UU file1"),
Equals(" UU file2"),
// now we see the non-merge conflict file // now we see the non-merge conflict file
Equals("A file3"), Equals(" A file3"),
) )
}, },
}) })

View File

@ -18,9 +18,11 @@ var ResolveMultipleFiles = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("UU file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("UU file2"), Equals(" UU file1"),
Equals(" UU file2"),
). ).
SelectNextItem().
PressEnter() PressEnter()
t.Views().MergeConflicts(). t.Views().MergeConflicts().

View File

@ -20,9 +20,11 @@ var ResolveNoAutoStage = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("UU file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("UU file2"), Equals(" UU file1"),
Equals(" UU file2"),
). ).
SelectNextItem().
PressEnter() PressEnter()
t.Views().MergeConflicts(). t.Views().MergeConflicts().
@ -38,8 +40,9 @@ var ResolveNoAutoStage = NewIntegrationTest(NewIntegrationTestArgs{
IsFocused(). IsFocused().
// Resolving the conflict didn't auto-stage it // Resolving the conflict didn't auto-stage it
Lines( Lines(
Equals("UU file1").IsSelected(), Equals("▼ /"),
Equals("UU file2"), Equals(" UU file1").IsSelected(),
Equals(" UU file2"),
). ).
// So do that manually // So do that manually
PressPrimaryAction(). PressPrimaryAction().

View File

@ -68,6 +68,7 @@ var CustomCommandsSubmenu = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("▼ /"),
Contains("myfile-commits"), Contains("myfile-commits"),
Contains("myfile-files"), Contains("myfile-files"),
) )

View File

@ -21,26 +21,27 @@ var CollapseExpand = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ?? file-one"), Equals(" ▼ dir"),
Equals("▼ dir2"), Equals(" ?? file-one"),
Equals(" ?? file-two"), Equals(" ▼ dir2"),
Equals(" ?? file-two"),
) )
t.Views().Files(). t.Views().Files().
Press(keys.Files.CollapseAll). Press(keys.Files.CollapseAll).
Lines( Lines(
Equals("▶ dir"), Equals("▶ /"),
Equals("▶ dir2"),
) )
t.Views().Files(). t.Views().Files().
Press(keys.Files.ExpandAll). Press(keys.Files.ExpandAll).
Lines( Lines(
Equals("▼ dir").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ?? file-one"), Equals(" ▼ dir"),
Equals("▼ dir2"), Equals(" ?? file-one"),
Equals(" ?? file-two"), Equals(" ▼ dir2"),
Equals(" ?? file-two"),
) )
}, },
}) })

View File

@ -29,33 +29,35 @@ var DiscardRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir1").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ?? file-1a"), Equals(" ▼ dir1"),
Equals(" ?? file-1b"), Equals(" ?? file-1a"),
Equals("▼ dir2"), Equals(" ?? file-1b"),
Equals(" ?? file-2a"), Equals(" ▼ dir2"),
Equals(" M file-2b"), Equals(" ?? file-2a"),
Equals("▼ dir3"), Equals(" M file-2b"),
Equals(" ?? file-3a"), Equals(" ▼ dir3"),
Equals(" M file-3b"), Equals(" ?? file-3a"),
Equals("?? file-a"), Equals(" M file-3b"),
Equals("?? file-b"), Equals(" ?? file-a"),
Equals(" ?? file-b"),
). ).
NavigateToLine(Contains("file-1b")). NavigateToLine(Contains("file-1b")).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("file-2a")). NavigateToLine(Contains("file-2a")).
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-1a"), Equals(" ▼ dir1"),
Equals(" ?? file-1b").IsSelected(), Equals(" ?? file-1a"),
Equals("▼ dir2").IsSelected(), Equals(" ?? file-1b").IsSelected(),
Equals(" ?? file-2a").IsSelected(), Equals(" ▼ dir2").IsSelected(),
Equals(" M file-2b"), Equals(" ?? file-2a").IsSelected(),
Equals("▼ dir3"), Equals(" M file-2b"),
Equals(" ?? file-3a"), Equals(" ▼ dir3"),
Equals(" M file-3b"), Equals(" ?? file-3a"),
Equals("?? file-a"), Equals(" M file-3b"),
Equals("?? file-b"), Equals(" ?? file-a"),
Equals(" ?? file-b"),
). ).
// Discard // Discard
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
@ -66,24 +68,26 @@ var DiscardRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-1a"), Equals(" ▼ dir1"),
Equals("▼ dir3").IsSelected(), Equals(" ?? file-1a"),
Equals(" ?? file-3a"), Equals(" ▼ dir3").IsSelected(),
Equals(" M file-3b"), Equals(" ?? file-3a"),
Equals("?? file-a"), Equals(" M file-3b"),
Equals("?? file-b"), Equals(" ?? file-a"),
Equals(" ?? file-b"),
). ).
// Verify you can discard collapsed directories in range select // Verify you can discard collapsed directories in range select
PressEnter(). PressEnter().
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("file-a")). NavigateToLine(Contains("file-a")).
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-1a"), Equals(" ▼ dir1"),
Equals("▶ dir3").IsSelected(), Equals(" ?? file-1a"),
Equals("?? file-a").IsSelected(), Equals(" ▶ dir3").IsSelected(),
Equals("?? file-b"), Equals(" ?? file-a").IsSelected(),
Equals(" ?? file-b"),
). ).
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
Tap(func() { Tap(func() {
@ -93,9 +97,10 @@ var DiscardRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-1a"), Equals(" ▼ dir1"),
Equals("?? file-b").IsSelected(), Equals(" ?? file-1a"),
Equals(" ?? file-b").IsSelected(),
) )
}, },
}) })

View File

@ -24,16 +24,18 @@ var DiscardStagedChanges = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals(" M file2").IsSelected(), Equals("▼ /").IsSelected(),
Equals("?? file3"), Equals(" M file2"),
Equals(" M fileToRemove"), Equals(" ?? file3"),
Equals(" M fileToRemove"),
). ).
NavigateToLine(Contains(`fileToRemove`)). NavigateToLine(Contains(`fileToRemove`)).
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals(" M file2"), Equals("▼ /"),
Equals("?? file3"), Equals(" M file2"),
Equals("M fileToRemove").IsSelected(), Equals(" ?? file3"),
Equals(" M fileToRemove").IsSelected(),
). ).
Press(keys.Files.ViewResetOptions) Press(keys.Files.ViewResetOptions)
@ -42,8 +44,9 @@ var DiscardStagedChanges = NewIntegrationTest(NewIntegrationTestArgs{
// staged file has been removed // staged file has been removed
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals(" M file2"), Equals("▼ /"),
Equals("?? file3").IsSelected(), Equals(" M file2"),
Equals(" ?? file3").IsSelected(),
) )
// the file should have the same content that it originally had, given that that was committed already // the file should have the same content that it originally had, given that that was committed already

View File

@ -30,13 +30,15 @@ var DiscardUnstagedDirChanges = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ▼ subdir"), Equals(" ▼ dir"),
Equals(" ?? unstaged-file-one"), Equals(" ▼ subdir"),
Equals(" MM file-one"), Equals(" ?? unstaged-file-one"),
Equals(" ?? unstaged-file-two"), Equals(" MM file-one"),
Equals("?? unstaged-file-three"), Equals(" ?? unstaged-file-two"),
Equals(" ?? unstaged-file-three"),
). ).
SelectNextItem().
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
Tap(func() { Tap(func() {
t.ExpectPopup().Menu(). t.ExpectPopup().Menu().
@ -45,10 +47,11 @@ var DiscardUnstagedDirChanges = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("▼ dir").IsSelected(), Equals("▼ /"),
Equals(" M file-one"), Equals(" ▼ dir").IsSelected(),
Equals(" M file-one"),
// this guy remains untouched because it wasn't inside the 'dir' directory // this guy remains untouched because it wasn't inside the 'dir' directory
Equals("?? unstaged-file-three"), Equals(" ?? unstaged-file-three"),
) )
t.FileSystem().FileContent("dir/file-one", Equals("original content\nnew content\n")) t.FileSystem().FileContent("dir/file-one", Equals("original content\nnew content\n"))

View File

@ -26,9 +26,11 @@ var DiscardUnstagedFileChanges = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("MM file-one").IsSelected(), Equals("▼ /").IsSelected(),
Equals("AM file-two"), Equals(" MM file-one"),
Equals(" AM file-two"),
). ).
SelectNextItem().
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
Tap(func() { Tap(func() {
t.ExpectPopup().Menu(). t.ExpectPopup().Menu().
@ -37,13 +39,15 @@ var DiscardUnstagedFileChanges = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("M file-one").IsSelected(), Equals("▼ /"),
Equals("AM file-two"), Equals(" M file-one").IsSelected(),
Equals(" AM file-two"),
). ).
SelectNextItem(). SelectNextItem().
Lines( Lines(
Equals("M file-one"), Equals("▼ /"),
Equals("AM file-two").IsSelected(), Equals(" M file-one"),
Equals(" AM file-two").IsSelected(),
). ).
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
Tap(func() { Tap(func() {
@ -53,8 +57,9 @@ var DiscardUnstagedFileChanges = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("M file-one"), Equals("▼ /"),
Equals("A file-two").IsSelected(), Equals(" M file-one"),
Equals(" A file-two").IsSelected(),
) )
t.FileSystem().FileContent("file-one", Equals("original content\nnew content\n")) t.FileSystem().FileContent("file-one", Equals("original content\nnew content\n"))

View File

@ -26,27 +26,29 @@ var DiscardUnstagedRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir1").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" ?? file-b"), Equals(" ?? file-a"),
Equals("▼ dir2"), Equals(" ?? file-b"),
Equals(" A file-c"), Equals(" ▼ dir2"),
Equals(" M file-d"), Equals(" A file-c"),
Equals("?? file-e"), Equals(" M file-d"),
Equals("?? file-f"), Equals(" ?? file-e"),
Equals(" ?? file-f"),
). ).
NavigateToLine(Contains("file-b")). NavigateToLine(Contains("file-b")).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("file-c")). NavigateToLine(Contains("file-c")).
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" ?? file-b").IsSelected(), Equals(" ?? file-a"),
Equals("▼ dir2").IsSelected(), Equals(" ?? file-b").IsSelected(),
Equals(" A file-c").IsSelected(), Equals(" ▼ dir2").IsSelected(),
Equals(" M file-d"), Equals(" A file-c").IsSelected(),
Equals("?? file-e"), Equals(" M file-d"),
Equals("?? file-f"), Equals(" ?? file-e"),
Equals(" ?? file-f"),
). ).
// Discard // Discard
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
@ -60,14 +62,15 @@ var DiscardUnstagedRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
// file-c is still there because it contained no unstaged changes // file-c is still there because it contained no unstaged changes
// file-d is gone because it was selected via dir2 and contained only unstaged changes // file-d is gone because it was selected via dir2 and contained only unstaged changes
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals("▼ dir2"), Equals(" ?? file-a"),
Equals(" ▼ dir2"),
// Re-selecting file-c because it's where the selected line index // Re-selecting file-c because it's where the selected line index
// was before performing the action. // was before performing the action.
Equals(" A file-c").IsSelected(), Equals(" A file-c").IsSelected(),
Equals("?? file-e"), Equals(" ?? file-e"),
Equals("?? file-f"), Equals(" ?? file-f"),
) )
}, },
}) })

View File

@ -21,11 +21,17 @@ var DiscardVariousChanges = NewIntegrationTest(NewIntegrationTestArgs{
label string label string
} }
t.Views().Files().
IsFocused().
TopLines(
Equals("▼ /").IsSelected(),
)
discardOneByOne := func(files []statusFile) { discardOneByOne := func(files []statusFile) {
for _, file := range files { for _, file := range files {
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
SelectedLine(Contains(file.status + " " + file.label)). NavigateToLine(Contains(file.status + " " + file.label)).
Press(keys.Universal.Remove) Press(keys.Universal.Remove)
t.ExpectPopup().Menu(). t.ExpectPopup().Menu().

View File

@ -19,14 +19,16 @@ var DiscardVariousChangesRangeSelect = NewIntegrationTest(NewIntegrationTestArgs
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("UA added-them-changed-us.txt").IsSelected(), Equals("▼ /").IsSelected(),
Equals("AA both-added.txt"), Equals(" UA added-them-changed-us.txt"),
Equals("DD both-deleted.txt"), Equals(" AA both-added.txt"),
Equals("UU both-modded.txt"), Equals(" DD both-deleted.txt"),
Equals("AU changed-them-added-us.txt"), Equals(" UU both-modded.txt"),
Equals("UD deleted-them.txt"), Equals(" AU changed-them-added-us.txt"),
Equals("DU deleted-us.txt"), Equals(" UD deleted-them.txt"),
Equals(" DU deleted-us.txt"),
). ).
SelectNextItem().
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("deleted-us.txt")). NavigateToLine(Contains("deleted-us.txt")).
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
@ -42,17 +44,18 @@ var DiscardVariousChangesRangeSelect = NewIntegrationTest(NewIntegrationTestArgs
Cancel() Cancel()
}). }).
Lines( Lines(
Equals("AM added-changed.txt").IsSelected(), Equals("▼ /").IsSelected(),
Equals("MD change-delete.txt"), Equals(" AM added-changed.txt"),
Equals("D delete-change.txt"), Equals(" MD change-delete.txt"),
Equals("D deleted-staged.txt"), Equals(" D delete-change.txt"),
Equals(" D deleted.txt"), Equals(" D deleted-staged.txt"),
Equals("MM double-modded.txt"), Equals(" D deleted.txt"),
Equals("M modded-staged.txt"), Equals(" MM double-modded.txt"),
Equals(" M modded.txt"), Equals(" M modded-staged.txt"),
Equals("A new-staged.txt"), Equals(" M modded.txt"),
Equals("?? new.txt"), Equals(" A new-staged.txt"),
Equals("R renamed.txt → renamed2.txt"), Equals(" ?? new.txt"),
Equals(" R renamed.txt → renamed2.txt"),
). ).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("renamed.txt")). NavigateToLine(Contains("renamed.txt")).

View File

@ -20,10 +20,12 @@ var Gitignore = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("?? .gitignore").IsSelected(), Equals("▼ /").IsSelected(),
Equals("?? toExclude"), Equals(" ?? .gitignore"),
Equals("?? toIgnore"), Equals(" ?? toExclude"),
Equals(" ?? toIgnore"),
). ).
SelectNextItem().
Press(keys.Files.IgnoreFile). Press(keys.Files.IgnoreFile).
// ensure we can't exclude the .gitignore file // ensure we can't exclude the .gitignore file
Tap(func() { Tap(func() {

View File

@ -31,6 +31,7 @@ var RememberCommitMessageAfterFail = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ /"),
Contains("bad"), Contains("bad"),
Contains("one"), Contains("one"),
). ).
@ -40,6 +41,7 @@ var RememberCommitMessageAfterFail = NewIntegrationTest(NewIntegrationTestArgs{
t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("Git command failed")).Confirm() t.ExpectPopup().Alert().Title(Equals("Error")).Content(Contains("Git command failed")).Confirm()
}). }).
NavigateToLine(Contains("bad")).
Press(keys.Universal.Remove). // remove file that triggers pre-commit hook to fail Press(keys.Universal.Remove). // remove file that triggers pre-commit hook to fail
Tap(func() { Tap(func() {
t.ExpectPopup().Menu(). t.ExpectPopup().Menu().

View File

@ -21,8 +21,9 @@ var RenameSimilarityThresholdChange = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("D original"), Equals("▼ /"),
Equals("A renamed"), Equals(" D original"),
Equals(" A renamed"),
). ).
Press(keys.Universal.DecreaseRenameSimilarityThreshold). Press(keys.Universal.DecreaseRenameSimilarityThreshold).
Tap(func() { Tap(func() {

View File

@ -21,12 +21,13 @@ var StageChildrenRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ baz").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ?? file"), Equals(" ▼ baz"),
Equals("▼ bazbam"), Equals(" ?? file"),
Equals(" ?? file"), Equals(" ▼ bazbam"),
Equals("?? foo"), Equals(" ?? file"),
Equals("?? foobar"), Equals(" ?? foo"),
Equals(" ?? foobar"),
). ).
// Select everything // Select everything
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
@ -34,12 +35,13 @@ var StageChildrenRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
// Stage // Stage
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("▼ baz").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" A file").IsSelected(), Equals(" ▼ baz").IsSelected(),
Equals("▼ bazbam").IsSelected(), Equals(" A file").IsSelected(),
Equals(" A file").IsSelected(), Equals(" ▼ bazbam").IsSelected(),
Equals("A foo").IsSelected(), Equals(" A file").IsSelected(),
Equals("A foobar").IsSelected(), Equals(" A foo").IsSelected(),
Equals(" A foobar").IsSelected(),
) )
}, },
}) })

View File

@ -23,28 +23,33 @@ var StageDeletedRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals(" D file-a").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" D file-b"), Equals(" D file-a"),
Equals(" D file-b"),
). ).
SelectNextItem().
// Stage a single deleted file // Stage a single deleted file
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("D file-a").IsSelected(), Equals("▼ /"),
Equals(" D file-b"), Equals(" D file-a").IsSelected(),
Equals(" D file-b"),
). ).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("file-b")). NavigateToLine(Contains("file-b")).
// Stage both files while a deleted file is already staged // Stage both files while a deleted file is already staged
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("D file-a").IsSelected(), Equals("▼ /"),
Equals("D file-b").IsSelected(), Equals(" D file-a").IsSelected(),
Equals(" D file-b").IsSelected(),
). ).
// Unstage; back to everything being unstaged // Unstage; back to everything being unstaged
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals(" D file-a").IsSelected(), Equals("▼ /"),
Equals(" D file-b").IsSelected(), Equals(" D file-a").IsSelected(),
Equals(" D file-b").IsSelected(),
) )
}, },
}) })

View File

@ -26,14 +26,15 @@ var StageRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir1").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" ?? file-b"), Equals(" ?? file-a"),
Equals("▼ dir2"), Equals(" ?? file-b"),
Equals(" ?? file-c"), Equals(" ▼ dir2"),
Equals(" M file-d"), Equals(" ?? file-c"),
Equals("?? file-e"), Equals(" M file-d"),
Equals("?? file-f"), Equals(" ?? file-e"),
Equals(" ?? file-f"),
). ).
NavigateToLine(Contains("file-b")). NavigateToLine(Contains("file-b")).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
@ -41,27 +42,29 @@ var StageRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
// Stage // Stage
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" A file-b").IsSelected(), Equals(" ?? file-a"),
Equals("▼ dir2").IsSelected(), Equals(" A file-b").IsSelected(),
Equals(" A file-c").IsSelected(), Equals(" ▼ dir2").IsSelected(),
Equals(" A file-c").IsSelected(),
// Staged because dir2 was part of the selection when he hit space // Staged because dir2 was part of the selection when he hit space
Equals(" M file-d"), Equals(" M file-d"),
Equals("?? file-e"), Equals(" ?? file-e"),
Equals("?? file-f"), Equals(" ?? file-f"),
). ).
// Unstage; back to everything being unstaged // Unstage; back to everything being unstaged
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" ?? file-b").IsSelected(), Equals(" ?? file-a"),
Equals("▼ dir2").IsSelected(), Equals(" ?? file-b").IsSelected(),
Equals(" ?? file-c").IsSelected(), Equals(" ▼ dir2").IsSelected(),
Equals(" M file-d"), Equals(" ?? file-c").IsSelected(),
Equals("?? file-e"), Equals(" M file-d"),
Equals("?? file-f"), Equals(" ?? file-e"),
Equals(" ?? file-f"),
). ).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("dir2")). NavigateToLine(Contains("dir2")).
@ -69,38 +72,41 @@ var StageRangeSelect = NewIntegrationTest(NewIntegrationTestArgs{
// Collapse the directory // Collapse the directory
PressEnter(). PressEnter().
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" ?? file-b"), Equals(" ?? file-a"),
Equals("▶ dir2").IsSelected(), Equals(" ?? file-b"),
Equals("?? file-e"), Equals(" ▶ dir2").IsSelected(),
Equals("?? file-f"), Equals(" ?? file-e"),
Equals(" ?? file-f"),
). ).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("file-e")). NavigateToLine(Contains("file-e")).
// Stage // Stage
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" ?? file-b"), Equals(" ?? file-a"),
Equals("▶ dir2").IsSelected(), Equals(" ?? file-b"),
Equals("A file-e").IsSelected(), Equals(" ▶ dir2").IsSelected(),
Equals("?? file-f"), Equals(" A file-e").IsSelected(),
Equals(" ?? file-f"),
). ).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("dir2")). NavigateToLine(Contains("dir2")).
// Expand the directory again to verify it's been staged // Expand the directory again to verify it's been staged
PressEnter(). PressEnter().
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ?? file-a"), Equals(" ▼ dir1"),
Equals(" ?? file-b"), Equals(" ?? file-a"),
Equals("▼ dir2").IsSelected(), Equals(" ?? file-b"),
Equals(" A file-c"), Equals(" ▼ dir2").IsSelected(),
Equals(" M file-d"), Equals(" A file-c"),
Equals("A file-e"), Equals(" M file-d"),
Equals("?? file-f"), Equals(" A file-e"),
Equals(" ?? file-f"),
) )
}, },
}) })

View File

@ -29,8 +29,9 @@ var FilterByFileStatus = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Focus(). Focus().
Lines( Lines(
Equals("A file-staged-but-untracked").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" M file-tracked"), Equals(" A file-staged-but-untracked"),
Equals(" M file-tracked"),
). ).
Press(keys.Files.OpenStatusFilter). Press(keys.Files.OpenStatusFilter).
Tap(func() { Tap(func() {
@ -50,8 +51,9 @@ var FilterByFileStatus = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("A file-staged-but-untracked").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" M file-tracked"), Equals(" A file-staged-but-untracked"),
Equals(" M file-tracked"),
). ).
Press(keys.Files.OpenStatusFilter). Press(keys.Files.OpenStatusFilter).
Tap(func() { Tap(func() {
@ -61,8 +63,9 @@ var FilterByFileStatus = NewIntegrationTest(NewIntegrationTestArgs{
Confirm() Confirm()
}). }).
Lines( Lines(
Equals("A file-staged-but-untracked").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" M file-tracked"), Equals(" A file-staged-but-untracked"),
Equals(" M file-tracked"),
) )
}, },
}) })

View File

@ -61,15 +61,17 @@ var NestedFilter = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("A apple").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A grape"), Equals(" A apple"),
Equals("A orange"), Equals(" A grape"),
Equals(" A orange"),
). ).
FilterOrSearch("grape"). FilterOrSearch("grape").
Lines( Lines(
Equals("A apple"), Equals("▼ /"),
Equals("A grape").IsSelected(), Equals(" A apple"),
Equals("A orange"), Equals(" A grape").IsSelected(),
Equals(" A orange"),
). ).
PressEnter() PressEnter()
@ -87,9 +89,10 @@ var NestedFilter = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("A apple"), Equals("▼ /"),
Equals("A grape").IsSelected(), Equals(" A apple"),
Equals("A orange"), Equals(" A grape").IsSelected(),
Equals(" A orange"),
). ).
Tap(func() { Tap(func() {
t.Views().Search().IsVisible().Content(Contains("matches for 'grape'")) t.Views().Search().IsVisible().Content(Contains("matches for 'grape'"))
@ -100,9 +103,10 @@ var NestedFilter = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Search().IsInvisible() t.Views().Search().IsInvisible()
}). }).
Lines( Lines(
Equals("A apple"), Equals("▼ /"),
Equals("A grape").IsSelected(), Equals(" A apple"),
Equals("A orange"), Equals(" A grape").IsSelected(),
Equals(" A orange"),
). ).
// escape to sub-commits view // escape to sub-commits view
PressEscape() PressEscape()

View File

@ -69,13 +69,15 @@ var NestedFilterTransient = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("A file-one").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A file-two"), Equals(" A file-one"),
Equals(" A file-two"),
). ).
FilterOrSearch("two"). FilterOrSearch("two").
Lines( Lines(
Equals("A file-one"), Equals("▼ /"),
Equals("A file-two").IsSelected(), Equals(" A file-one"),
Equals(" A file-two").IsSelected(),
) )
t.Views().Branches(). t.Views().Branches().
@ -96,8 +98,9 @@ var NestedFilterTransient = NewIntegrationTest(NewIntegrationTestArgs{
IsFocused(). IsFocused().
// the search on the commit-files context has been cancelled // the search on the commit-files context has been cancelled
Lines( Lines(
Equals("A file-one").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A file-two"), Equals(" A file-one"),
Equals(" A file-two"),
). ).
Tap(func() { Tap(func() {
t.Views().Search().IsInvisible() t.Views().Search().IsInvisible()

View File

@ -40,6 +40,7 @@ func postFilterTest(t *TestDriver) {
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ /"),
Contains(`filterFile`), Contains(`filterFile`),
Contains(`otherFile`), Contains(`otherFile`),
) )

View File

@ -26,9 +26,11 @@ var ApplyInReverse = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("A file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A file2"), Equals(" A file1"),
Equals(" A file2"),
). ).
SelectNextItem().
PressPrimaryAction() PressPrimaryAction()
t.Views().Information().Content(Contains("Building patch")) t.Views().Information().Content(Contains("Building patch"))

View File

@ -34,9 +34,11 @@ var ApplyInReverseWithConflict = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("M file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("M file2"), Equals(" M file1"),
Equals(" M file2"),
). ).
SelectNextItem().
// Add both files to the patch; the first will conflict, the second won't // Add both files to the patch; the first will conflict, the second won't
PressPrimaryAction(). PressPrimaryAction().
Tap(func() { Tap(func() {
@ -81,9 +83,11 @@ var ApplyInReverseWithConflict = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Focus(). Focus().
Lines( Lines(
Equals("M file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("M file2"), Equals(" M file1"),
) Equals(" M file2"),
).
SelectNextItem()
t.Views().Main(). t.Views().Main().
ContainsLines( ContainsLines(

View File

@ -31,10 +31,12 @@ var MoveRangeToIndex = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("M file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A file2"), Equals(" M file1"),
Equals("A file3"), Equals(" A file2"),
Equals(" A file3"),
). ).
SelectNextItem().
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("file2")). NavigateToLine(Contains("file2")).
PressPrimaryAction() PressPrimaryAction()
@ -55,8 +57,9 @@ var MoveRangeToIndex = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Focus(). Focus().
Lines( Lines(
Equals("M file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A file2"), Equals(" M file1"),
Equals(" A file2"),
) )
t.Views().Main(). t.Views().Main().

View File

@ -66,11 +66,12 @@ var MoveToEarlierCommit = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" M file1"), Equals(" ▼ dir"),
Equals(" D file2"), Equals(" M file1"),
Equals(" A file3"), Equals(" D file2"),
Equals("A unrelated-file"), Equals(" A file3"),
Equals(" A unrelated-file"),
). ).
PressEscape() PressEscape()

View File

@ -66,11 +66,12 @@ var MoveToEarlierCommitNoKeepEmpty = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" M file1"), Equals(" ▼ dir"),
Equals(" D file2"), Equals(" M file1"),
Equals(" A file3"), Equals(" D file2"),
Equals("A unrelated-file"), Equals(" A file3"),
Equals(" A unrelated-file"),
). ).
PressEscape() PressEscape()
}, },

View File

@ -26,9 +26,11 @@ var MoveToIndex = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Contains("file1").IsSelected(), Equals("▼ /").IsSelected(),
Contains("file1"),
Contains("file2"), Contains("file2"),
). ).
SelectNextItem().
PressPrimaryAction() PressPrimaryAction()
t.Views().Information().Content(Contains("Building patch")) t.Views().Information().Content(Contains("Building patch"))

View File

@ -66,11 +66,12 @@ var MoveToLaterCommit = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" M file1"), Equals(" ▼ dir"),
Equals(" D file2"), Equals(" M file1"),
Equals(" A file3"), Equals(" D file2"),
Equals("A unrelated-file"), Equals(" A file3"),
Equals(" A unrelated-file"),
). ).
PressEscape() PressEscape()

View File

@ -67,9 +67,11 @@ var MoveToLaterCommitPartialHunk = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Contains("file1").IsSelected(), Equals("▼ /").IsSelected(),
Contains("file1"),
Contains("unrelated-file"), Contains("unrelated-file"),
). ).
SelectNextItem().
Tap(func() { Tap(func() {
t.Views().Main(). t.Views().Main().
Content(Contains("+1st line\n 2nd line")) Content(Contains("+1st line\n 2nd line"))

View File

@ -26,9 +26,11 @@ var RemoveFromCommit = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Contains("file1").IsSelected(), Equals("▼ /").IsSelected(),
Contains("file1"),
Contains("file2"), Contains("file2"),
). ).
SelectNextItem().
PressPrimaryAction() PressPrimaryAction()
t.Views().Information().Content(Contains("Building patch")) t.Views().Information().Content(Contains("Building patch"))

View File

@ -27,9 +27,10 @@ var SelectAllFiles = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("A file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A file2"), Equals(" A file1"),
Equals("A file3"), Equals(" A file2"),
Equals(" A file3"),
). ).
Press(keys.Files.ToggleStagedAll) Press(keys.Files.ToggleStagedAll)

View File

@ -33,10 +33,12 @@ var SpecificSelection = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Contains("direct-file").IsSelected(), Equals("▼ /").IsSelected(),
Contains("direct-file"),
Contains("hunk-file"), Contains("hunk-file"),
Contains("line-file"), Contains("line-file"),
). ).
SelectNextItem().
PressPrimaryAction(). PressPrimaryAction().
Tap(func() { Tap(func() {
t.Views().Information().Content(Contains("Building patch")) t.Views().Information().Content(Contains("Building patch"))

View File

@ -34,28 +34,30 @@ var ToggleRange = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir1").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" A file1-a"), Equals(" ▼ dir1"),
Equals(" A file2-a"), Equals(" A file1-a"),
Equals(" A file3-a"), Equals(" A file2-a"),
Equals("▼ dir2"), Equals(" A file3-a"),
Equals(" A file1-b"), Equals(" ▼ dir2"),
Equals(" A file2-b"), Equals(" A file1-b"),
Equals(" A file3-b"), Equals(" A file2-b"),
Equals(" A file3-b"),
). ).
NavigateToLine(Contains("file1-a")). NavigateToLine(Contains("file1-a")).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("file3-a")). NavigateToLine(Contains("file3-a")).
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ● file1-a").IsSelected(), Equals(" ▼ dir1"),
Equals(" ● file2-a").IsSelected(), Equals(" ● file1-a").IsSelected(),
Equals(" ● file3-a").IsSelected(), Equals(" ● file2-a").IsSelected(),
Equals("▼ dir2"), Equals(" ● file3-a").IsSelected(),
Equals(" A file1-b"), Equals(" ▼ dir2"),
Equals(" A file2-b"), Equals(" A file1-b"),
Equals(" A file3-b"), Equals(" A file2-b"),
Equals(" A file3-b"),
). ).
PressEscape(). PressEscape().
NavigateToLine(Contains("file3-b")). NavigateToLine(Contains("file3-b")).
@ -69,39 +71,42 @@ var ToggleRange = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("▼ dir1"), Equals("▼ /"),
Equals(" ● file1-a"), Equals(" ▼ dir1"),
Equals(" ● file2-a"), Equals(" ● file1-a"),
Equals(" ● file3-a"), Equals(" ● file2-a"),
Equals("▼ dir2"), Equals(" ● file3-a"),
Equals(" A file1-b"), Equals(" ▼ dir2"),
Equals(" A file2-b"), Equals(" A file1-b"),
Equals(" file3-b").IsSelected(), Equals(" A file2-b"),
Equals(" ◐ file3-b").IsSelected(),
). ).
NavigateToLine(Contains("dir1")). NavigateToLine(Contains("dir1")).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
NavigateToLine(Contains("dir2")). NavigateToLine(Contains("dir2")).
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("▼ dir1").IsSelected(), Equals("▼ /"),
Equals(" ● file1-a").IsSelected(), Equals(" ▼ dir1").IsSelected(),
Equals(" ● file2-a").IsSelected(), Equals(" ● file1-a").IsSelected(),
Equals(" ● file3-a").IsSelected(), Equals(" ● file2-a").IsSelected(),
Equals("▼ dir2").IsSelected(), Equals(" ● file3-a").IsSelected(),
Equals(" ● file1-b"), Equals(" ▼ dir2").IsSelected(),
Equals(" ● file2-b"), Equals(" ● file1-b"),
Equals(" ● file3-b"), Equals(" ● file2-b"),
Equals(" ● file3-b"),
). ).
PressPrimaryAction(). PressPrimaryAction().
Lines( Lines(
Equals("▼ dir1").IsSelected(), Equals("▼ /"),
Equals(" A file1-a").IsSelected(), Equals(" ▼ dir1").IsSelected(),
Equals(" A file2-a").IsSelected(), Equals(" A file1-a").IsSelected(),
Equals(" A file3-a").IsSelected(), Equals(" A file2-a").IsSelected(),
Equals("▼ dir2").IsSelected(), Equals(" A file3-a").IsSelected(),
Equals(" A file1-b"), Equals(" ▼ dir2").IsSelected(),
Equals(" A file2-b"), Equals(" A file1-b"),
Equals(" A file3-b"), Equals(" A file2-b"),
Equals(" A file3-b"),
) )
}, },
}) })

View File

@ -48,9 +48,11 @@ var Patch = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Contains("file1").IsSelected(), Equals("▼ /").IsSelected(),
Contains("file1"),
Contains("file2"), Contains("file2"),
). ).
SelectNextItem().
PressPrimaryAction() PressPrimaryAction()
t.Views().Information().Content(Contains("Building patch")) t.Views().Information().Content(Contains("Building patch"))

View File

@ -22,9 +22,11 @@ var DiscardAllChanges = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
IsFocused(). IsFocused().
Lines( Lines(
Equals(" M file1").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" M file2"), Equals(" M file1"),
Equals(" M file2"),
). ).
SelectNextItem().
PressEnter() PressEnter()
t.Views().Staging(). t.Views().Staging().
@ -44,7 +46,7 @@ var DiscardAllChanges = NewIntegrationTest(NewIntegrationTestArgs{
// because there are no more changes in file1 we switch to file2 // because there are no more changes in file1 we switch to file2
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals(" M file2").IsSelected(), Equals(" M file2"),
) )
}). }).
// assert we are still in the staging panel, but now looking at the changes of the other file // assert we are still in the staging panel, but now looking at the changes of the other file

View File

@ -30,9 +30,11 @@ var ApplyPatch = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Contains("myfile").IsSelected(), Equals("▼ /").IsSelected(),
Contains("myfile"),
Contains("myfile2"), Contains("myfile2"),
). ).
SelectNextItem().
PressPrimaryAction() PressPrimaryAction()
t.Views().Information().Content(Contains("Building patch")) t.Views().Information().Content(Contains("Building patch"))

View File

@ -23,8 +23,9 @@ var StashAndKeepIndex = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("M file-staged"), Equals("▼ /"),
Equals(" M file-unstaged"), Equals(" M file-staged"),
Equals(" M file-unstaged"),
). ).
Press(keys.Files.ViewStashOptions) Press(keys.Files.ViewStashOptions)
@ -49,8 +50,9 @@ var StashAndKeepIndex = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().CommitFiles(). t.Views().CommitFiles().
IsFocused(). IsFocused().
Lines( Lines(
Equals("M file-staged"), Equals("▼ /"),
Equals("M file-unstaged"), Equals(" M file-staged"),
Equals(" M file-unstaged"),
) )
}, },
}) })

View File

@ -22,8 +22,9 @@ var StashIncludingUntrackedFiles = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("A file_1"), Equals("▼ /"),
Equals("?? file_2"), Equals(" A file_1"),
Equals(" ?? file_2"),
). ).
Press(keys.Files.ViewStashOptions) Press(keys.Files.ViewStashOptions)

View File

@ -23,8 +23,9 @@ var StashStaged = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("M file-staged"), Equals("▼ /"),
Equals(" M file-unstaged"), Equals(" M file-staged"),
Equals(" M file-unstaged"),
). ).
Press(keys.Files.ViewStashOptions) Press(keys.Files.ViewStashOptions)

View File

@ -23,8 +23,9 @@ var StashUnstaged = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("M file-staged"), Equals("▼ /"),
Equals(" M file-unstaged"), Equals(" M file-staged"),
Equals(" M file-unstaged"),
). ).
Press(keys.Files.ViewStashOptions) Press(keys.Files.ViewStashOptions)

View File

@ -44,9 +44,11 @@ var Add = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files().Focus(). t.Views().Files().Focus().
Lines( Lines(
Equals("A .gitmodules").IsSelected(), Equals("▼ /").IsSelected(),
Equals("A my_submodule_path (submodule)"), Equals(" A .gitmodules"),
Equals(" A my_submodule_path (submodule)"),
). ).
SelectNextItem().
Tap(func() { Tap(func() {
t.Views().Main().Content( t.Views().Main().Content(
Contains("[submodule \"my_submodule\"]"). Contains("[submodule \"my_submodule\"]").

View File

@ -35,9 +35,11 @@ var Remove = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files().Focus(). t.Views().Files().Focus().
Lines( Lines(
Equals("M .gitmodules").IsSelected(), Equals("▼ /").IsSelected(),
Equals("D my_submodule_path"), Equals(" M .gitmodules"),
) Equals(" D my_submodule_path"),
).
SelectNextItem()
t.Views().Main().Content( t.Views().Main().Content(
Contains("-[submodule \"my_submodule_name\"]"). Contains("-[submodule \"my_submodule_name\"]").

View File

@ -39,9 +39,10 @@ var RemoveNested = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files().IsFocused(). t.Views().Files().IsFocused().
Lines( Lines(
Equals("▼ modules").IsSelected(), Equals("▼ /").IsSelected(),
Equals(" D innerSubPath"), Equals(" ▼ modules"),
Equals("M .gitmodules"), Equals(" D innerSubPath"),
Equals(" M .gitmodules"),
). ).
NavigateToLine(Contains(".gitmodules")) NavigateToLine(Contains(".gitmodules"))

View File

@ -71,15 +71,17 @@ var Reset = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files().Focus(). t.Views().Files().Focus().
Lines( Lines(
Equals(" M my_submodule_path (submodule)"), Equals("▼ /"),
Equals("?? other_file").IsSelected(), Equals(" M my_submodule_path (submodule)"),
Equals(" ?? other_file").IsSelected(),
). ).
// Verify we can't use range select on submodules // Verify we can't use range select on submodules
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
SelectPreviousItem(). SelectPreviousItem().
Lines( Lines(
Equals(" M my_submodule_path (submodule)").IsSelected(), Equals("▼ /"),
Equals("?? other_file").IsSelected(), Equals(" M my_submodule_path (submodule)").IsSelected(),
Equals(" ?? other_file").IsSelected(),
). ).
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
Tap(func() { Tap(func() {
@ -87,8 +89,9 @@ var Reset = NewIntegrationTest(NewIntegrationTestArgs{
}). }).
Press(keys.Universal.ToggleRangeSelect). Press(keys.Universal.ToggleRangeSelect).
Lines( Lines(
Equals(" M my_submodule_path (submodule)").IsSelected(), Equals("▼ /"),
Equals("?? other_file"), Equals(" M my_submodule_path (submodule)").IsSelected(),
Equals(" ?? other_file"),
). ).
Press(keys.Universal.Remove). Press(keys.Universal.Remove).
Tap(func() { Tap(func() {

View File

@ -57,8 +57,9 @@ var UndoCommit = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files(). t.Views().Files().
Lines( Lines(
Equals("A file"), Equals("▼ /"),
Equals(" M other-file"), Equals(" A file"),
Equals(" M other-file"),
) )
t.Views().Commits().Focus(). t.Views().Commits().Focus().
@ -84,8 +85,9 @@ var UndoCommit = NewIntegrationTest(NewIntegrationTestArgs{
t.Views().Files().Focus(). t.Views().Files().Focus().
Lines( Lines(
Equals("A file"), Equals("▼ /"),
Equals(" M other-file").IsSelected(), Equals(" A file"),
Equals(" M other-file").IsSelected(),
). ).
Press(keys.Universal.PrevItem). Press(keys.Universal.PrevItem).
Press(keys.Universal.Remove). Press(keys.Universal.Remove).