summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2024-01-18 11:12:30 +1100
committerJesse Duffield <jessedduffield@gmail.com>2024-01-24 20:51:00 +1100
commit798225d9e1830ff0029ce6948514e8d98c9a8f61 (patch)
tree8a3c3b4a064b41893e2b726de9ec5bda3f249fce
parentb7d4db2446c1914fb9093b7f0513136cf48fc134 (diff)
Move file discard action into files controller
It's better just having all the keybindings in one file especially when you want to share code
-rw-r--r--pkg/gui/controllers.go2
-rw-r--r--pkg/gui/controllers/files_controller.go135
-rw-r--r--pkg/gui/controllers/files_remove_controller.go175
3 files changed, 135 insertions, 177 deletions
diff --git a/pkg/gui/controllers.go b/pkg/gui/controllers.go
index b4cbec79e..5837704b5 100644
--- a/pkg/gui/controllers.go
+++ b/pkg/gui/controllers.go
@@ -172,7 +172,6 @@ func (gui *Gui) resetHelpersAndControllers() {
branchesController := controllers.NewBranchesController(common)
gitFlowController := controllers.NewGitFlowController(common)
- filesRemoveController := controllers.NewFilesRemoveController(common)
stashController := controllers.NewStashController(common)
commitFilesController := controllers.NewCommitFilesController(common)
patchExplorerControllerFactory := controllers.NewPatchExplorerControllerFactory(common)
@@ -297,7 +296,6 @@ func (gui *Gui) resetHelpersAndControllers() {
controllers.AttachControllers(gui.State.Contexts.Files,
filesController,
- filesRemoveController,
)
controllers.AttachControllers(gui.State.Contexts.Tags,
diff --git a/pkg/gui/controllers/files_controller.go b/pkg/gui/controllers/files_controller.go
index ed2c5c28b..395ea6d31 100644
--- a/pkg/gui/controllers/files_controller.go
+++ b/pkg/gui/controllers/files_controller.go
@@ -9,6 +9,7 @@ import (
"github.com/jesseduffield/lazygit/pkg/gui/context"
"github.com/jesseduffield/lazygit/pkg/gui/filetree"
"github.com/jesseduffield/lazygit/pkg/gui/types"
+ "github.com/jesseduffield/lazygit/pkg/utils"
)
type FilesController struct {
@@ -125,6 +126,13 @@ func (self *FilesController) GetKeybindings(opts types.KeybindingsOpts) []*types
Description: self.c.Tr.FileEnter,
},
{
+ Key: opts.GetKey(opts.Config.Universal.Remove),
+ Handler: self.withItem(self.remove),
+ GetDisabledReason: self.require(self.singleItemSelected()),
+ Description: self.c.Tr.ViewDiscardOptions,
+ OpensMenu: true,
+ },
+ {
Key: opts.GetKey(opts.Config.Commits.ViewResetOptions),
Handler: self.createResetToUpstreamMenu,
Description: self.c.Tr.ViewResetToUpstreamOptions,
@@ -963,3 +971,130 @@ func (self *FilesController) fetchAux(task gocui.Task) (err error) {
return err
}
+
+func (self *FilesController) remove(node *filetree.FileNode) error {
+ var menuItems []*types.MenuItem
+ if node.File == nil {
+ menuItems = []*types.MenuItem{
+ {
+ Label: self.c.Tr.DiscardAllChanges,
+ OnPress: func() error {
+ self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInDirectory)
+ if err := self.c.Git().WorkingTree.DiscardAllDirChanges(node); err != nil {
+ return self.c.Error(err)
+ }
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
+ },
+ Key: self.c.KeybindingsOpts().GetKey(self.c.UserConfig.Keybinding.Files.ConfirmDiscard),
+ Tooltip: utils.ResolvePlaceholderString(
+ self.c.Tr.DiscardAllTooltip,
+ map[string]string{
+ "path": node.GetPath(),
+ },
+ ),
+ },
+ }
+
+ if node.GetHasStagedChanges() && node.GetHasUnstagedChanges() {
+ menuItems = append(menuItems, &types.MenuItem{
+ Label: self.c.Tr.DiscardUnstagedChanges,
+ OnPress: func() error {
+ self.c.LogAction(self.c.Tr.Actions.DiscardUnstagedChangesInDirectory)
+ if err := self.c.Git().WorkingTree.DiscardUnstagedDirChanges(node); err != nil {
+ return self.c.Error(err)
+ }
+
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
+ },
+ Key: 'u',
+ Tooltip: utils.ResolvePlaceholderString(
+ self.c.Tr.DiscardUnstagedTooltip,
+ map[string]string{
+ "path": node.GetPath(),
+ },
+ ),
+ })
+ }
+ } else {
+ file := node.File
+
+ submodules := self.c.Model().Submodules
+ if file.IsSubmodule(submodules) {
+ submodule := file.SubmoduleConfig(submodules)
+
+ menuItems = []*types.MenuItem{
+ {
+ Label: self.c.Tr.SubmoduleStashAndReset,
+ OnPress: func() error {
+ return self.ResetSubmodule(submodule)
+ },
+ },
+ }
+ } else {
+ menuItems = []*types.MenuItem{
+ {
+ Label: self.c.Tr.DiscardAllChanges,
+ OnPress: func() error {
+ self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInFile)
+ if err := self.c.Git().WorkingTree.DiscardAllFileChanges(file); err != nil {
+ return self.c.Error(err)
+ }
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
+ },
+ Key: self.c.KeybindingsOpts().GetKey(self.c.UserConfig.Keybinding.Files.ConfirmDiscard),
+ Tooltip: utils.ResolvePlaceholderString(
+ self.c.Tr.DiscardAllTooltip,
+ map[string]string{
+ "path": node.GetPath(),
+ },
+ ),
+ },
+ }
+
+ if file.HasStagedChanges && file.HasUnstagedChanges {
+ menuItems = append(menuItems, &types.MenuItem{
+ Label: self.c.Tr.DiscardUnstagedChanges,
+ OnPress: func() error {
+ self.c.LogAction(self.c.Tr.Actions.DiscardAllUnstagedChangesInFile)
+ if err := self.c.Git().WorkingTree.DiscardUnstagedFileChanges(file); err != nil {
+ return self.c.Error(err)
+ }
+
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
+ },
+ Key: 'u',
+ Tooltip: utils.ResolvePlaceholderString(
+ self.c.Tr.DiscardUnstagedTooltip,
+ map[string]string{
+ "path": node.GetPath(),
+ },
+ ),
+ })
+ }
+ }
+ }
+
+ return self.c.Menu(types.CreateMenuOptions{Title: node.GetPath(), Items: menuItems})
+}
+
+func (self *FilesController) ResetSubmodule(submodule *models.SubmoduleConfig) error {
+ return self.c.WithWaitingStatus(self.c.Tr.ResettingSubmoduleStatus, func(gocui.Task) error {
+ self.c.LogAction(self.c.Tr.Actions.ResetSubmodule)
+
+ file := self.c.Helpers().WorkingTree.FileForSubmodule(submodule)
+ if file != nil {
+ if err := self.c.Git().WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil {
+ return self.c.Error(err)
+ }
+ }
+
+ if err := self.c.Git().Submodule.Stash(submodule); err != nil {
+ return self.c.Error(err)
+ }
+ if err := self.c.Git().Submodule.Reset(submodule); err != nil {
+ return self.c.Error(err)
+ }
+
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.SUBMODULES}})
+ })
+}
diff --git a/pkg/gui/controllers/files_remove_controller.go b/pkg/gui/controllers/files_remove_controller.go
deleted file mode 100644
index 57314c61b..000000000
--- a/pkg/gui/controllers/files_remove_controller.go
+++ /dev/null
@@ -1,175 +0,0 @@
-package controllers
-
-import (
- "github.com/jesseduffield/gocui"
- "github.com/jesseduffield/lazygit/pkg/commands/models"
- "github.com/jesseduffield/lazygit/pkg/gui/filetree"
- "github.com/jesseduffield/lazygit/pkg/gui/types"
- "github.com/jesseduffield/lazygit/pkg/utils"
-)
-
-// splitting this action out into its own file because it's self-contained
-
-type FilesRemoveController struct {
- baseController
- *ListControllerTrait[*filetree.FileNode]
- c *ControllerCommon
-}
-
-var _ types.IController = &FilesRemoveController{}
-
-func NewFilesRemoveController(
- c *ControllerCommon,
-) *FilesRemoveController {
- return &FilesRemoveController{
- baseController: baseController{},
- c: c,
- ListControllerTrait: NewListControllerTrait[*filetree.FileNode](
- c,
- c.Contexts().Files,
- c.Contexts().Files.GetSelected,
- c.Contexts().Files.GetSelectedItems,
- ),
- }
-}
-
-func (self *FilesRemoveController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
- bindings := []*types.Binding{
- {
- Key: opts.GetKey(opts.Config.Universal.Remove),
- Handler: self.withItem(self.remove),
- GetDisabledReason: self.require(self.singleItemSelected()),
- Description: self.c.Tr.ViewDiscardOptions,
- OpensMenu: true,
- },
- }
-
- return bindings
-}
-
-func (self *FilesRemoveController) remove(node *filetree.FileNode) error {
- var menuItems []*types.MenuItem
- if node.File == nil {
- menuItems = []*types.MenuItem{
- {
- Label: self.c.Tr.DiscardAllChanges,
- OnPress: func() error {
- self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInDirectory)
- if err := self.c.Git().WorkingTree.DiscardAllDirChanges(node); err != nil {
- return self.c.Error(err)
- }
- return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
- },
- Key: self.c.KeybindingsOpts().GetKey(self.c.UserConfig.Keybinding.Files.ConfirmDiscard),
- Tooltip: utils.ResolvePlaceholderString(
- self.c.Tr.DiscardAllTooltip,
- map[string]string{
- "path": node.GetPath(),
- },
- ),
- },
- }
-
- if node.GetHasStagedChanges() && node.GetHasUnstagedChanges() {
- menuItems = append(menuItems, &types.MenuItem{
- Label: self.c.Tr.DiscardUnstagedChanges,
- OnPress: func() error {
- self.c.LogAction(self.c.Tr.Actions.DiscardUnstagedChangesInDirectory)
- if err := self.c.Git().WorkingTree.DiscardUnstagedDirChanges(node); err != nil {
- return self.c.Error(err)
- }
-
- return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
- },
- Key: 'u',
- Tooltip: utils.ResolvePlaceholderString(
- self.c.Tr.DiscardUnstagedTooltip,
- map[string]string{
- "path": node.GetPath(),
- },
- ),
- })
- }
- } else {
- file := node.File
-
- submodules := self.c.Model().Submodules
- if file.IsSubmodule(submodules) {
- submodule := file.SubmoduleConfig(submodules)
-
- menuItems = []*types.MenuItem{
- {
- Label: self.c.Tr.SubmoduleStashAndReset,
- OnPress: func() error {
- return self.ResetSubmodule(submodule)
- },
- },
- }
- } else {
- menuItems = []*types.MenuItem{
- {
- Label: self.c.Tr.DiscardAllChanges,
- OnPress: func() error {
- self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInFile)
- if err := self.c.Git().WorkingTree.DiscardAllFileChanges(file); err != nil {
- return self.c.Error(err)
- }
- return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
- },
- Key: self.c.KeybindingsOpts().GetKey(self.c.UserConfig.Keybinding.Files.ConfirmDiscard),
- Tooltip: utils.ResolvePlaceholderString(
- self.c.Tr.DiscardAllTooltip,
- map[string]string{
- "path": node.GetPath(),
- },
- ),
- },
- }
-
- if file.HasStagedChanges && file.HasUnstagedChanges {
- menuItems = append(menuItems, &types.MenuItem{
- Label: self.c.Tr.DiscardUnstagedChanges,
- OnPress: func() error {
- self.c.LogAction(self.c.Tr.Actions.DiscardAllUnstagedChangesInFile)
- if err := self.c.Git().WorkingTree.DiscardUnstagedFileChanges(file); err != nil {
- return self.c.Error(err)
- }
-
- return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.WORKTREES}})
- },
- Key: 'u',
- Tooltip: utils.ResolvePlaceholderString(
- self.c.Tr.DiscardUnstagedTooltip,
- map[string]string{
- "path": node.GetPath(),
- },
- ),
- })
- }
- }
- }
-
- return self.c.Menu(types.CreateMenuOptions{Title: node.GetPath(), Items: menuItems})
-}
-
-func (self *FilesRemoveController) ResetSubmodule(submodule *models.SubmoduleConfig) error {
- return self.c.WithWaitingStatus(self.c.Tr.ResettingSubmoduleStatus, func(gocui.Task) error {
- self.c.LogAction(self.c.Tr.Actions.ResetSubmodule)
-
- file := self.c.Helpers().WorkingTree.FileForSubmodule(submodule)
- if file != nil {
- if err := self.c.Git().WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil {
- return self.c.Error(err)
- }
- }
-
- if err := self.c.Git().Submodule.Stash(submodule); err != nil {
- return self.c.Error(err)
- }
- if err := self.c.Git().Submodule.Reset(submodule); err != nil {
- return self.c.Error(err)
- }
-
- return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.FILES, types.SUBMODULES}})
- })
-}