From 1183f68e19d26a63293cfab1650a59f3b90a844b Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Sun, 21 Mar 2021 09:06:15 +1100 Subject: better handling of refreshed files --- pkg/commands/git_test.go | 81 ------------------------------------------- pkg/commands/loading_files.go | 35 ------------------- pkg/gui/files_panel.go | 30 ++++++++++------ pkg/gui/status_tree.go | 4 ++- 4 files changed, 23 insertions(+), 127 deletions(-) (limited to 'pkg') diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go index e0955932f..90c32c7dd 100644 --- a/pkg/commands/git_test.go +++ b/pkg/commands/git_test.go @@ -461,87 +461,6 @@ func TestGitCommandCommitAmend(t *testing.T) { assert.NoError(t, err) } -// TestGitCommandMergeStatusFiles is a function. -func TestGitCommandMergeStatusFiles(t *testing.T) { - type scenario struct { - testName string - oldFiles []*models.File - newFiles []*models.File - test func([]*models.File) - } - - scenarios := []scenario{ - { - "Old file and new file are the same", - []*models.File{}, - []*models.File{ - { - Name: "new_file.txt", - }, - }, - func(files []*models.File) { - expected := []*models.File{ - { - Name: "new_file.txt", - }, - } - - assert.Len(t, files, 1) - assert.EqualValues(t, expected, files) - }, - }, - { - "Several files to merge, with some identical", - []*models.File{ - { - Name: "new_file1.txt", - }, - { - Name: "new_file2.txt", - }, - { - Name: "new_file3.txt", - }, - }, - []*models.File{ - { - Name: "new_file4.txt", - }, - { - Name: "new_file5.txt", - }, - { - Name: "new_file1.txt", - }, - }, - func(files []*models.File) { - expected := []*models.File{ - { - Name: "new_file1.txt", - }, - { - Name: "new_file4.txt", - }, - { - Name: "new_file5.txt", - }, - } - - assert.Len(t, files, 3) - assert.EqualValues(t, expected, files) - }, - }, - } - - for _, s := range scenarios { - t.Run(s.testName, func(t *testing.T) { - gitCmd := NewDummyGitCommand() - - s.test(gitCmd.MergeStatusFiles(s.oldFiles, s.newFiles, nil)) - }) - } -} - // TestGitCommandGetCommitDifferences is a function. func TestGitCommandGetCommitDifferences(t *testing.T) { type scenario struct { diff --git a/pkg/commands/loading_files.go b/pkg/commands/loading_files.go index ba3244999..d3757b179 100644 --- a/pkg/commands/loading_files.go +++ b/pkg/commands/loading_files.go @@ -102,38 +102,3 @@ func (c *GitCommand) GitStatus(opts GitStatusOptions) (string, error) { return strings.Join(splitLines, "\n"), nil } - -// MergeStatusFiles merge status files -func (c *GitCommand) MergeStatusFiles(oldFiles, newFiles []*models.File, selectedFile *models.File) []*models.File { - if len(oldFiles) == 0 { - return newFiles - } - - appendedIndexes := []int{} - - // retain position of files we already could see - result := []*models.File{} - for _, oldFile := range oldFiles { - for newIndex, newFile := range newFiles { - if utils.IncludesInt(appendedIndexes, newIndex) { - continue - } - // if we just staged B and in doing so created 'A -> B' and we are currently have oldFile: A and newFile: 'A -> B', we want to wait until we come across B so the our cursor isn't jumping anywhere - waitForMatchingFile := selectedFile != nil && newFile.IsRename() && !selectedFile.IsRename() && newFile.Matches(selectedFile) && !oldFile.Matches(selectedFile) - - if oldFile.Matches(newFile) && !waitForMatchingFile { - result = append(result, newFile) - appendedIndexes = append(appendedIndexes, newIndex) - } - } - } - - // append any new files to the end - for index, newFile := range newFiles { - if !utils.IncludesInt(appendedIndexes, index) { - result = append(result, newFile) - } - } - - return result -} diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 854be0263..4ac212045 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -522,26 +522,36 @@ func (gui *Gui) refreshStateFiles() error { // keep track of where the cursor is currently and the current file names // when we refresh, go looking for a matching name // move the cursor to there. - selectedFile := gui.getSelectedFile() + + selectedNode := gui.getSelectedStatusNode() + getPaths := func(node *models.StatusLineNode) []string { + if node.File != nil && node.File.IsRename() { + return node.File.Names() + } else { + return []string{node.Path} + } + } + selectedPaths := getPaths(selectedNode) + prevSelectedLineIdx := gui.State.Panels.Files.SelectedLineIdx - // get files to stage - // noRenames := gui.State.StatusLineManager.TreeMode files := gui.GitCommand.GetStatusFiles(commands.GetStatusFileOptions{}) - gui.State.StatusLineManager.SetFiles( - gui.GitCommand.MergeStatusFiles(gui.State.StatusLineManager.GetAllFiles(), files, selectedFile), - ) + gui.State.StatusLineManager.SetFiles(files) if err := gui.fileWatcher.addFilesToFileWatcher(files); err != nil { return err } // let's try to find our file again and move the cursor to that - if selectedFile != nil { + if selectedNode != nil { for idx, node := range gui.State.StatusLineManager.GetAllItems() { - // TODO: check that this works - selectedFileHasMoved := node.File != nil && node.File.Matches(selectedFile) && idx != prevSelectedLineIdx - if selectedFileHasMoved { + paths := getPaths(node) + + // If you started off with a rename selected, and now it's broken in two, we want you to jump to the new file, not the old file. + // This is because the new should be in the same position as the rename was meaning less cursor jumping + foundOldFileInRename := selectedNode.File != nil && selectedNode.File.IsRename() && node.Path == selectedNode.File.PreviousName + selectedNodeHasMoved := idx != prevSelectedLineIdx && utils.StringArraysOverlap(paths, selectedPaths) && !foundOldFileInRename + if selectedNodeHasMoved { gui.State.Panels.Files.SelectedLineIdx = idx break } diff --git a/pkg/gui/status_tree.go b/pkg/gui/status_tree.go index 6ff489566..c0abbe0c0 100644 --- a/pkg/gui/status_tree.go +++ b/pkg/gui/status_tree.go @@ -54,11 +54,13 @@ func GetFlatTreeFromStatusFiles(files []*models.File) *models.StatusLineNode { root := &models.StatusLineNode{} for _, file := range files { root.Children = append(root.Children, &models.StatusLineNode{ - Name: file.Name, + Name: file.GetPath(), Path: file.GetPath(), File: file, }) } + root.Sort() + return root } -- cgit v1.2.3