diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2022-02-13 18:04:09 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2022-03-17 19:13:40 +1100 |
commit | 8a555dd62ebdb985041f421dca650b941007afc1 (patch) | |
tree | 79262b68dfa7013ffdc1380ff313a967f1adfe45 /pkg/gui/controllers/files_remove_controller.go | |
parent | bef26b9634a6a4c85028dcb1577161ed2c662b4e (diff) |
refactor
Diffstat (limited to 'pkg/gui/controllers/files_remove_controller.go')
-rw-r--r-- | pkg/gui/controllers/files_remove_controller.go | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/pkg/gui/controllers/files_remove_controller.go b/pkg/gui/controllers/files_remove_controller.go new file mode 100644 index 000000000..521167c33 --- /dev/null +++ b/pkg/gui/controllers/files_remove_controller.go @@ -0,0 +1,157 @@ +package controllers + +import ( + "github.com/jesseduffield/lazygit/pkg/commands/models" + "github.com/jesseduffield/lazygit/pkg/gui/context" + "github.com/jesseduffield/lazygit/pkg/gui/filetree" + "github.com/jesseduffield/lazygit/pkg/gui/types" +) + +// splitting this action out into its own file because it's self-contained + +type FilesRemoveController struct { + baseController + *controllerCommon +} + +var _ types.IController = &FilesRemoveController{} + +func NewFilesRemoveController( + common *controllerCommon, +) *FilesRemoveController { + return &FilesRemoveController{ + baseController: baseController{}, + controllerCommon: common, + } +} + +func (self *FilesRemoveController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding { + bindings := []*types.Binding{ + { + Key: opts.GetKey(opts.Config.Universal.Remove), + Handler: self.checkSelectedFileNode(self.remove), + Description: self.c.Tr.LcViewDiscardOptions, + OpensMenu: true, + }, + } + + return bindings +} + +func (self *FilesRemoveController) remove(node *filetree.FileNode) error { + var menuItems []*types.MenuItem + if node.File == nil { + menuItems = []*types.MenuItem{ + { + DisplayString: self.c.Tr.LcDiscardAllChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInDirectory) + if err := self.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}}) + }, + }, + } + + if node.GetHasStagedChanges() && node.GetHasUnstagedChanges() { + menuItems = append(menuItems, &types.MenuItem{ + DisplayString: self.c.Tr.LcDiscardUnstagedChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardUnstagedChangesInDirectory) + if err := self.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}}) + }, + }) + } + } else { + file := node.File + + submodules := self.model.Submodules + if file.IsSubmodule(submodules) { + submodule := file.SubmoduleConfig(submodules) + + menuItems = []*types.MenuItem{ + { + DisplayString: self.c.Tr.LcSubmoduleStashAndReset, + OnPress: func() error { + return self.ResetSubmodule(submodule) + }, + }, + } + } else { + menuItems = []*types.MenuItem{ + { + DisplayString: self.c.Tr.LcDiscardAllChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardAllChangesInFile) + if err := self.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}}) + }, + }, + } + + if file.HasStagedChanges && file.HasUnstagedChanges { + menuItems = append(menuItems, &types.MenuItem{ + DisplayString: self.c.Tr.LcDiscardUnstagedChanges, + OnPress: func() error { + self.c.LogAction(self.c.Tr.Actions.DiscardAllUnstagedChangesInFile) + if err := self.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}}) + }, + }) + } + } + } + + 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.LcResettingSubmoduleStatus, func() error { + self.c.LogAction(self.c.Tr.Actions.ResetSubmodule) + + file := self.helpers.WorkingTree.FileForSubmodule(submodule) + if file != nil { + if err := self.git.WorkingTree.UnStageFile(file.Names(), file.Tracked); err != nil { + return self.c.Error(err) + } + } + + if err := self.git.Submodule.Stash(submodule); err != nil { + return self.c.Error(err) + } + if err := self.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}}) + }) +} + +func (self *FilesRemoveController) checkSelectedFileNode(callback func(*filetree.FileNode) error) func() error { + return func() error { + node := self.context().GetSelectedFileNode() + if node == nil { + return nil + } + + return callback(node) + } +} + +func (self *FilesRemoveController) Context() types.Context { + return self.context() +} + +func (self *FilesRemoveController) context() *context.WorkingTreeContext { + return self.contexts.Files +} |