diff --git a/pkg/commands/models/status_line_node.go b/pkg/commands/models/status_line_node.go index 042a0fceb..f2031888b 100644 --- a/pkg/commands/models/status_line_node.go +++ b/pkg/commands/models/status_line_node.go @@ -7,7 +7,8 @@ import ( type StatusLineNode struct { Children []*StatusLineNode File *File - Name string + Name string // e.g. 'mydir' + Path string // e.g. '/path/to/mydir' Collapsed bool } diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 8a388f9a0..06a57af60 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -21,14 +21,14 @@ import ( // list panel functions -// func (gui *Gui) getSelectedStatusNode() *models.StatusLineNode { -// selectedLine := gui.State.Panels.Files.SelectedLineIdx -// if selectedLine == -1 { -// return nil -// } +func (gui *Gui) getSelectedStatusNode() *models.StatusLineNode { + selectedLine := gui.State.Panels.Files.SelectedLineIdx + if selectedLine == -1 { + return nil + } -// return gui.State.StatusLineManager.GetItemAtIndex(selectedLine) -// } + return gui.State.StatusLineManager.GetItemAtIndex(selectedLine) +} func (gui *Gui) getSelectedFile() *models.File { selectedLine := gui.State.Panels.Files.SelectedLineIdx @@ -202,22 +202,39 @@ func (gui *Gui) enterFile(forceSecondaryFocused bool, selectedLineIdx int) error } func (gui *Gui) handleFilePress() error { - file := gui.getSelectedFile() - if file == nil { + node := gui.getSelectedStatusNode() + if node == nil { return nil } - if file.HasInlineMergeConflicts { - return gui.handleSwitchToMerge() - } + // need to stage or unstage depending on situation. If we have a merge conflict we can't do anything - if file.HasUnstagedChanges { - if err := gui.GitCommand.StageFile(file.Name); err != nil { - return gui.surfaceError(err) + if node.IsLeaf() { + file := node.File + + if file.HasInlineMergeConflicts { + return gui.handleSwitchToMerge() + } + + if file.HasUnstagedChanges { + if err := gui.GitCommand.StageFile(file.Name); err != nil { + return gui.surfaceError(err) + } + } else { + if err := gui.GitCommand.UnStageFile(file.Name, file.Tracked); err != nil { + return gui.surfaceError(err) + } } } else { - if err := gui.GitCommand.UnStageFile(file.Name, file.Tracked); err != nil { - return gui.surfaceError(err) + if node.HasUnstagedChanges() { + if err := gui.GitCommand.StageFile(node.Path); err != nil { + return gui.surfaceError(err) + } + } else { + // pretty sure it doesn't matter that we're always passing true here + if err := gui.GitCommand.UnStageFile(node.Path, true); err != nil { + return gui.surfaceError(err) + } } } diff --git a/pkg/gui/status_line_manager.go b/pkg/gui/status_line_manager.go index 9510e744f..f786c1bc4 100644 --- a/pkg/gui/status_line_manager.go +++ b/pkg/gui/status_line_manager.go @@ -77,12 +77,12 @@ func (m *StatusLineManager) renderAux(s *models.StatusLineNode, prefix string, d } if s.Collapsed { - return []string{fmt.Sprintf("%s%s %s", prefix, s.Name, COLLAPSED_ARROW)} + return []string{fmt.Sprintf("%s %s", getLine(), COLLAPSED_ARROW)} } arr := []string{} if !isRoot { - arr = append(arr, fmt.Sprintf("%s%s %s", prefix, s.Name, EXPANDED_ARROW)) + arr = append(arr, fmt.Sprintf("%s %s", getLine(), EXPANDED_ARROW)) } newPrefix := prefix diff --git a/pkg/gui/status_tree.go b/pkg/gui/status_tree.go index 758f308a7..77a02ce51 100644 --- a/pkg/gui/status_tree.go +++ b/pkg/gui/status_tree.go @@ -2,6 +2,7 @@ package gui import ( "os" + "path/filepath" "sort" "strings" @@ -33,6 +34,7 @@ func GetTreeFromStatusFiles(files []*models.File) *models.StatusLineNode { } newChild := &models.StatusLineNode{ Name: dir, + Path: filepath.Join(split[:i+1]...), File: setFile, } curr.Children = append(curr.Children, newChild)