From d9548b5d00af09f0ee23ea4692ff5bb8edbef0be Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Sun, 2 Jan 2022 10:34:33 +1100 Subject: start breaking up git struct --- pkg/commands/files.go | 4 +- pkg/commands/git.go | 4 ++ pkg/commands/submodules.go | 92 ++++++++++++++++++++++++++------------------- pkg/gui/submodules_panel.go | 32 ++++++++-------- 4 files changed, 76 insertions(+), 56 deletions(-) diff --git a/pkg/commands/files.go b/pkg/commands/files.go index ef9c50187..530ad9a14 100644 --- a/pkg/commands/files.go +++ b/pkg/commands/files.go @@ -318,13 +318,13 @@ func (c *GitCommand) RemoveUntrackedFiles() error { // ResetAndClean removes all unstaged changes and removes all untracked files func (c *GitCommand) ResetAndClean() error { - submoduleConfigs, err := c.GetSubmoduleConfigs() + submoduleConfigs, err := c.Submodules.GetConfigs() if err != nil { return err } if len(submoduleConfigs) > 0 { - if err := c.ResetSubmodules(submoduleConfigs); err != nil { + if err := c.Submodules.ResetSubmodules(submoduleConfigs); err != nil { return err } } diff --git a/pkg/commands/git.go b/pkg/commands/git.go index aa06e6367..1f30c1d26 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -56,6 +56,8 @@ type GitCommand struct { GetCmdWriter func() io.Writer Cmd oscommands.ICmdObjBuilder + + Submodules SubmoduleCommands } // NewGitCommand it runs git commands @@ -106,6 +108,8 @@ func NewGitCommand( Tags: loaders.NewTagLoader(cmn, cmd), } + gitCommand.Submodules = NewSubmoduleCommands(cmn, cmd, dotGitDir) + gitCommand.PatchManager = patch.NewPatchManager(gitCommand.Log, gitCommand.ApplyPatch, gitCommand.ShowFileDiff) return gitCommand, nil diff --git a/pkg/commands/submodules.go b/pkg/commands/submodules.go index 29a9ab700..fba676a07 100644 --- a/pkg/commands/submodules.go +++ b/pkg/commands/submodules.go @@ -10,6 +10,7 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/models" "github.com/jesseduffield/lazygit/pkg/commands/oscommands" + "github.com/jesseduffield/lazygit/pkg/common" ) // .gitmodules looks like this: @@ -17,7 +18,22 @@ import ( // path = blah/mysubmodule // url = git@github.com:subbo.git -func (c *GitCommand) GetSubmoduleConfigs() ([]*models.SubmoduleConfig, error) { +type SubmoduleCommands struct { + *common.Common + + cmd oscommands.ICmdObjBuilder + dotGitDir string +} + +func NewSubmoduleCommands(common *common.Common, cmd oscommands.ICmdObjBuilder, dotGitDir string) SubmoduleCommands { + return SubmoduleCommands{ + Common: common, + cmd: cmd, + dotGitDir: dotGitDir, + } +} + +func (self *SubmoduleCommands) GetConfigs() ([]*models.SubmoduleConfig, error) { file, err := os.Open(".gitmodules") if err != nil { if os.IsNotExist(err) { @@ -63,36 +79,36 @@ func (c *GitCommand) GetSubmoduleConfigs() ([]*models.SubmoduleConfig, error) { return configs, nil } -func (c *GitCommand) SubmoduleStash(submodule *models.SubmoduleConfig) error { +func (self *SubmoduleCommands) Stash(submodule *models.SubmoduleConfig) error { // if the path does not exist then it hasn't yet been initialized so we'll swallow the error // because the intention here is to have no dirty worktree state if _, err := os.Stat(submodule.Path); os.IsNotExist(err) { - c.Log.Infof("submodule path %s does not exist, returning", submodule.Path) + self.Log.Infof("submodule path %s does not exist, returning", submodule.Path) return nil } - return c.Cmd.New("git -C " + c.Cmd.Quote(submodule.Path) + " stash --include-untracked").Run() + return self.cmd.New("git -C " + self.cmd.Quote(submodule.Path) + " stash --include-untracked").Run() } -func (c *GitCommand) SubmoduleReset(submodule *models.SubmoduleConfig) error { - return c.Cmd.New("git submodule update --init --force -- " + c.Cmd.Quote(submodule.Path)).Run() +func (self *SubmoduleCommands) Reset(submodule *models.SubmoduleConfig) error { + return self.cmd.New("git submodule update --init --force -- " + self.cmd.Quote(submodule.Path)).Run() } -func (c *GitCommand) SubmoduleUpdateAll() error { +func (self *SubmoduleCommands) UpdateAll() error { // not doing an --init here because the user probably doesn't want that - return c.Cmd.New("git submodule update --force").Run() + return self.cmd.New("git submodule update --force").Run() } -func (c *GitCommand) SubmoduleDelete(submodule *models.SubmoduleConfig) error { +func (self *SubmoduleCommands) Delete(submodule *models.SubmoduleConfig) error { // based on https://gist.github.com/myusuf3/7f645819ded92bda6677 - if err := c.Cmd.New("git submodule deinit --force -- " + c.Cmd.Quote(submodule.Path)).Run(); err != nil { + if err := self.cmd.New("git submodule deinit --force -- " + self.cmd.Quote(submodule.Path)).Run(); err != nil { if strings.Contains(err.Error(), "did not match any file(s) known to git") { - if err := c.Cmd.New("git config --file .gitmodules --remove-section submodule." + c.Cmd.Quote(submodule.Name)).Run(); err != nil { + if err := self.cmd.New("git config --file .gitmodules --remove-section submodule." + self.cmd.Quote(submodule.Name)).Run(); err != nil { return err } - if err := c.Cmd.New("git config --remove-section submodule." + c.Cmd.Quote(submodule.Name)).Run(); err != nil { + if err := self.cmd.New("git config --remove-section submodule." + self.cmd.Quote(submodule.Name)).Run(); err != nil { return err } @@ -102,69 +118,69 @@ func (c *GitCommand) SubmoduleDelete(submodule *models.SubmoduleConfig) error { } } - if err := c.Cmd.New("git rm --force -r " + submodule.Path).Run(); err != nil { + if err := self.cmd.New("git rm --force -r " + submodule.Path).Run(); err != nil { // if the directory isn't there then that's fine - c.Log.Error(err) + self.Log.Error(err) } - return os.RemoveAll(filepath.Join(c.DotGitDir, "modules", submodule.Path)) + return os.RemoveAll(filepath.Join(self.dotGitDir, "modules", submodule.Path)) } -func (c *GitCommand) SubmoduleAdd(name string, path string, url string) error { - return c.Cmd. +func (self *SubmoduleCommands) Add(name string, path string, url string) error { + return self.cmd. New( fmt.Sprintf( "git submodule add --force --name %s -- %s %s ", - c.Cmd.Quote(name), - c.Cmd.Quote(url), - c.Cmd.Quote(path), + self.cmd.Quote(name), + self.cmd.Quote(url), + self.cmd.Quote(path), )). Run() } -func (c *GitCommand) SubmoduleUpdateUrl(name string, path string, newUrl string) error { +func (self *SubmoduleCommands) UpdateUrl(name string, path string, newUrl string) error { // the set-url command is only for later git versions so we're doing it manually here - if err := c.Cmd.New("git config --file .gitmodules submodule." + c.Cmd.Quote(name) + ".url " + c.Cmd.Quote(newUrl)).Run(); err != nil { + if err := self.cmd.New("git config --file .gitmodules submodule." + self.cmd.Quote(name) + ".url " + self.cmd.Quote(newUrl)).Run(); err != nil { return err } - if err := c.Cmd.New("git submodule sync -- " + c.Cmd.Quote(path)).Run(); err != nil { + if err := self.cmd.New("git submodule sync -- " + self.cmd.Quote(path)).Run(); err != nil { return err } return nil } -func (c *GitCommand) SubmoduleInit(path string) error { - return c.Cmd.New("git submodule init -- " + c.Cmd.Quote(path)).Run() +func (self *SubmoduleCommands) Init(path string) error { + return self.cmd.New("git submodule init -- " + self.cmd.Quote(path)).Run() } -func (c *GitCommand) SubmoduleUpdate(path string) error { - return c.Cmd.New("git submodule update --init -- " + c.Cmd.Quote(path)).Run() +func (self *SubmoduleCommands) Update(path string) error { + return self.cmd.New("git submodule update --init -- " + self.cmd.Quote(path)).Run() } -func (c *GitCommand) SubmoduleBulkInitCmdObj() oscommands.ICmdObj { - return c.Cmd.New("git submodule init") +func (self *SubmoduleCommands) BulkInitCmdObj() oscommands.ICmdObj { + return self.cmd.New("git submodule init") } -func (c *GitCommand) SubmoduleBulkUpdateCmdObj() oscommands.ICmdObj { - return c.Cmd.New("git submodule update") +func (self *SubmoduleCommands) BulkUpdateCmdObj() oscommands.ICmdObj { + return self.cmd.New("git submodule update") } -func (c *GitCommand) SubmoduleForceBulkUpdateCmdObj() oscommands.ICmdObj { - return c.Cmd.New("git submodule update --force") +func (self *SubmoduleCommands) ForceBulkUpdateCmdObj() oscommands.ICmdObj { + return self.cmd.New("git submodule update --force") } -func (c *GitCommand) SubmoduleBulkDeinitCmdObj() oscommands.ICmdObj { - return c.Cmd.New("git submodule deinit --all --force") +func (self *SubmoduleCommands) BulkDeinitCmdObj() oscommands.ICmdObj { + return self.cmd.New("git submodule deinit --all --force") } -func (c *GitCommand) ResetSubmodules(submodules []*models.SubmoduleConfig) error { +func (self *SubmoduleCommands) ResetSubmodules(submodules []*models.SubmoduleConfig) error { for _, submodule := range submodules { - if err := c.SubmoduleStash(submodule); err != nil { + if err := self.Stash(submodule); err != nil { return err } } - return c.SubmoduleUpdateAll() + return self.UpdateAll() } diff --git a/pkg/gui/submodules_panel.go b/pkg/gui/submodules_panel.go index 91b28b509..30d08a61e 100644 --- a/pkg/gui/submodules_panel.go +++ b/pkg/gui/submodules_panel.go @@ -50,7 +50,7 @@ func (gui *Gui) submodulesRenderToMain() error { } func (gui *Gui) refreshStateSubmoduleConfigs() error { - configs, err := gui.GitCommand.GetSubmoduleConfigs() + configs, err := gui.GitCommand.Submodules.GetConfigs() if err != nil { return err } @@ -79,7 +79,7 @@ func (gui *Gui) removeSubmodule(submodule *models.SubmoduleConfig) error { title: gui.Tr.RemoveSubmodule, prompt: fmt.Sprintf(gui.Tr.RemoveSubmodulePrompt, submodule.Name), handleConfirm: func() error { - if err := gui.GitCommand.WithSpan(gui.Tr.Spans.RemoveSubmodule).SubmoduleDelete(submodule); err != nil { + if err := gui.GitCommand.WithSpan(gui.Tr.Spans.RemoveSubmodule).Submodules.Delete(submodule); err != nil { return gui.surfaceError(err) } @@ -114,10 +114,10 @@ func (gui *Gui) resetSubmodule(submodule *models.SubmoduleConfig) error { } } - if err := gitCommand.SubmoduleStash(submodule); err != nil { + if err := gitCommand.Submodules.Stash(submodule); err != nil { return gui.surfaceError(err) } - if err := gitCommand.SubmoduleReset(submodule); err != nil { + if err := gitCommand.Submodules.Reset(submodule); err != nil { return gui.surfaceError(err) } @@ -140,7 +140,7 @@ func (gui *Gui) handleAddSubmodule() error { initialContent: submoduleName, handleConfirm: func(submodulePath string) error { return gui.WithWaitingStatus(gui.Tr.LcAddingSubmoduleStatus, func() error { - err := gui.GitCommand.WithSpan(gui.Tr.Spans.AddSubmodule).SubmoduleAdd(submoduleName, submodulePath, submoduleUrl) + err := gui.GitCommand.WithSpan(gui.Tr.Spans.AddSubmodule).Submodules.Add(submoduleName, submodulePath, submoduleUrl) gui.handleCredentialsPopup(err) return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) @@ -160,7 +160,7 @@ func (gui *Gui) handleEditSubmoduleUrl(submodule *models.SubmoduleConfig) error initialContent: submodule.Url, handleConfirm: func(newUrl string) error { return gui.WithWaitingStatus(gui.Tr.LcUpdatingSubmoduleUrlStatus, func() error { - err := gui.GitCommand.WithSpan(gui.Tr.Spans.UpdateSubmoduleUrl).SubmoduleUpdateUrl(submodule.Name, submodule.Path, newUrl) + err := gui.GitCommand.WithSpan(gui.Tr.Spans.UpdateSubmoduleUrl).Submodules.UpdateUrl(submodule.Name, submodule.Path, newUrl) gui.handleCredentialsPopup(err) return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) @@ -171,7 +171,7 @@ func (gui *Gui) handleEditSubmoduleUrl(submodule *models.SubmoduleConfig) error func (gui *Gui) handleSubmoduleInit(submodule *models.SubmoduleConfig) error { return gui.WithWaitingStatus(gui.Tr.LcInitializingSubmoduleStatus, func() error { - err := gui.GitCommand.WithSpan(gui.Tr.Spans.InitialiseSubmodule).SubmoduleInit(submodule.Path) + err := gui.GitCommand.WithSpan(gui.Tr.Spans.InitialiseSubmodule).Submodules.Init(submodule.Path) gui.handleCredentialsPopup(err) return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) @@ -211,10 +211,10 @@ func (gui *Gui) handleResetRemoveSubmodule(submodule *models.SubmoduleConfig) er func (gui *Gui) handleBulkSubmoduleActionsMenu() error { menuItems := []*menuItem{ { - displayStrings: []string{gui.Tr.LcBulkInitSubmodules, style.FgGreen.Sprint(gui.GitCommand.SubmoduleBulkInitCmdObj().ToString())}, + displayStrings: []string{gui.Tr.LcBulkInitSubmodules, style.FgGreen.Sprint(gui.GitCommand.Submodules.BulkInitCmdObj().ToString())}, onPress: func() error { return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkInitialiseSubmodules).SubmoduleBulkInitCmdObj().Run() + err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkInitialiseSubmodules).Submodules.BulkInitCmdObj().Run() if err != nil { return gui.surfaceError(err) } @@ -224,10 +224,10 @@ func (gui *Gui) handleBulkSubmoduleActionsMenu() error { }, }, { - displayStrings: []string{gui.Tr.LcBulkUpdateSubmodules, style.FgYellow.Sprint(gui.GitCommand.SubmoduleBulkUpdateCmdObj().ToString())}, + displayStrings: []string{gui.Tr.LcBulkUpdateSubmodules, style.FgYellow.Sprint(gui.GitCommand.Submodules.BulkUpdateCmdObj().ToString())}, onPress: func() error { return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - if err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkUpdateSubmodules).SubmoduleBulkUpdateCmdObj().Run(); err != nil { + if err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkUpdateSubmodules).Submodules.BulkUpdateCmdObj().Run(); err != nil { return gui.surfaceError(err) } @@ -236,10 +236,10 @@ func (gui *Gui) handleBulkSubmoduleActionsMenu() error { }, }, { - displayStrings: []string{gui.Tr.LcSubmoduleStashAndReset, style.FgRed.Sprintf("git stash in each submodule && %s", gui.GitCommand.SubmoduleForceBulkUpdateCmdObj().ToString())}, + displayStrings: []string{gui.Tr.LcSubmoduleStashAndReset, style.FgRed.Sprintf("git stash in each submodule && %s", gui.GitCommand.Submodules.ForceBulkUpdateCmdObj().ToString())}, onPress: func() error { return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - if err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkStashAndResetSubmodules).ResetSubmodules(gui.State.Submodules); err != nil { + if err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkStashAndResetSubmodules).Submodules.ResetSubmodules(gui.State.Submodules); err != nil { return gui.surfaceError(err) } @@ -248,10 +248,10 @@ func (gui *Gui) handleBulkSubmoduleActionsMenu() error { }, }, { - displayStrings: []string{gui.Tr.LcBulkDeinitSubmodules, style.FgRed.Sprint(gui.GitCommand.SubmoduleBulkDeinitCmdObj().ToString())}, + displayStrings: []string{gui.Tr.LcBulkDeinitSubmodules, style.FgRed.Sprint(gui.GitCommand.Submodules.BulkDeinitCmdObj().ToString())}, onPress: func() error { return gui.WithWaitingStatus(gui.Tr.LcRunningCommand, func() error { - if err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkDeinitialiseSubmodules).SubmoduleBulkDeinitCmdObj().Run(); err != nil { + if err := gui.GitCommand.WithSpan(gui.Tr.Spans.BulkDeinitialiseSubmodules).Submodules.BulkDeinitCmdObj().Run(); err != nil { return gui.surfaceError(err) } @@ -266,7 +266,7 @@ func (gui *Gui) handleBulkSubmoduleActionsMenu() error { func (gui *Gui) handleUpdateSubmodule(submodule *models.SubmoduleConfig) error { return gui.WithWaitingStatus(gui.Tr.LcUpdatingSubmoduleStatus, func() error { - err := gui.GitCommand.WithSpan(gui.Tr.Spans.UpdateSubmodule).SubmoduleUpdate(submodule.Path) + err := gui.GitCommand.WithSpan(gui.Tr.Spans.UpdateSubmodule).Submodules.Update(submodule.Path) gui.handleCredentialsPopup(err) return gui.refreshSidePanels(refreshOptions{scope: []RefreshableView{SUBMODULES}}) -- cgit v1.2.3