From 2dc848506cb465cd46006b4a2a6dca2bdc5cf89d Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Thu, 1 Oct 2020 22:13:32 +1000 Subject: bulk submodule menu --- pkg/commands/files.go | 8 +------ pkg/commands/submodules.go | 36 +++++++++++++++++++++++++++- pkg/config/app_config.go | 1 + pkg/gui/confirmation_panel.go | 4 ++++ pkg/gui/keybindings.go | 7 ++++++ pkg/gui/submodules_panel.go | 55 +++++++++++++++++++++++++++++++++++++++++++ pkg/i18n/english.go | 20 +++++++++++++++- 7 files changed, 122 insertions(+), 9 deletions(-) (limited to 'pkg') diff --git a/pkg/commands/files.go b/pkg/commands/files.go index d4560076f..05aa89978 100644 --- a/pkg/commands/files.go +++ b/pkg/commands/files.go @@ -251,13 +251,7 @@ func (c *GitCommand) ResetAndClean() error { } if len(submoduleConfigs) > 0 { - for _, config := range submoduleConfigs { - if err := c.SubmoduleStash(config); err != nil { - return err - } - } - - if err := c.SubmoduleUpdateAll(); err != nil { + if err := c.ResetSubmodules(submoduleConfigs); err != nil { return err } } diff --git a/pkg/commands/submodules.go b/pkg/commands/submodules.go index 1444890f7..53a201c1e 100644 --- a/pkg/commands/submodules.go +++ b/pkg/commands/submodules.go @@ -123,7 +123,15 @@ func (c *GitCommand) SubmoduleUpdateUrl(name string, path string, newUrl string) return err } - return c.OSCommand.RunCommand("git submodule sync %s", path) + if err := c.OSCommand.RunCommand("git submodule sync %s", path); err != nil { + return err + } + + if err := c.OSCommand.RunCommand("git submodule update --init %s", path); err != nil { + return err + } + + return nil } func (c *GitCommand) SubmoduleInit(path string) error { @@ -133,3 +141,29 @@ func (c *GitCommand) SubmoduleInit(path string) error { func (c *GitCommand) SubmoduleUpdate(path string) error { return c.OSCommand.RunCommand("git submodule update --init %s", path) } + +func (c *GitCommand) SubmoduleBulkInitCmdStr() string { + return "git submodule init" +} + +func (c *GitCommand) SubmoduleBulkUpdateCmdStr() string { + return "git submodule update" +} + +func (c *GitCommand) SubmoduleForceBulkUpdateCmdStr() string { + return "git submodule update --force" +} + +func (c *GitCommand) SubmoduleBulkDeinitCmdStr() string { + return "git submodule deinit --all --force" +} + +func (c *GitCommand) ResetSubmodules(submodules []*models.SubmoduleConfig) error { + for _, submodule := range submodules { + if err := c.SubmoduleStash(submodule); err != nil { + return err + } + } + + return c.SubmoduleUpdateAll() +} diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index 28742c6cf..6558f9d3b 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -396,6 +396,7 @@ keybinding: submodules: init: 'i' update: 'u' + bulkMenu: 'b' `) } diff --git a/pkg/gui/confirmation_panel.go b/pkg/gui/confirmation_panel.go index 103b6a084..1035a2f0e 100644 --- a/pkg/gui/confirmation_panel.go +++ b/pkg/gui/confirmation_panel.go @@ -244,6 +244,10 @@ func (gui *Gui) createErrorPanel(message string) error { } func (gui *Gui) surfaceError(err error) error { + if err == nil { + return nil + } + for _, sentinelError := range gui.sentinelErrorsArr() { if err == sentinelError { return err diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 5cd794dcc..97b720b49 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -1621,6 +1621,13 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { Handler: gui.forSubmodule(gui.handleSubmoduleInit), Description: gui.Tr.SLocalize("initSubmodule"), }, + { + ViewName: "files", + Contexts: []string{SUBMODULES_CONTEXT_KEY}, + Key: gui.getKey("submodules.bulkMenu"), + Handler: gui.wrappedHandler(gui.handleBulkSubmoduleActionsMenu), + Description: gui.Tr.SLocalize("viewBulkSubmoduleOptions"), + }, } for _, viewName := range []string{"status", "branches", "files", "commits", "commitFiles", "stash", "menu"} { diff --git a/pkg/gui/submodules_panel.go b/pkg/gui/submodules_panel.go index c620efbbe..9e7b89a08 100644 --- a/pkg/gui/submodules_panel.go +++ b/pkg/gui/submodules_panel.go @@ -194,6 +194,61 @@ func (gui *Gui) handleResetRemoveSubmodule(submodule *models.SubmoduleConfig) er return gui.createMenu(submodule.Name, menuItems, createMenuOptions{showCancel: true}) } +func (gui *Gui) handleBulkSubmoduleActionsMenu() error { + menuItems := []*menuItem{ + { + displayStrings: []string{gui.Tr.SLocalize("bulkInitSubmodules"), utils.ColoredString(gui.GitCommand.SubmoduleBulkInitCmdStr(), color.FgGreen)}, + onPress: func() error { + return gui.WithWaitingStatus(gui.Tr.SLocalize("runningCommand"), func() error { + if err := gui.OSCommand.RunCommand(gui.GitCommand.SubmoduleBulkInitCmdStr()); err != nil { + return gui.surfaceError(err) + } + + return gui.refreshSidePanels(refreshOptions{scope: []int{SUBMODULES}}) + }) + }, + }, + { + displayStrings: []string{gui.Tr.SLocalize("bulkUpdateSubmodules"), utils.ColoredString(gui.GitCommand.SubmoduleBulkUpdateCmdStr(), color.FgYellow)}, + onPress: func() error { + return gui.WithWaitingStatus(gui.Tr.SLocalize("runningCommand"), func() error { + if err := gui.OSCommand.RunCommand(gui.GitCommand.SubmoduleBulkUpdateCmdStr()); err != nil { + return gui.surfaceError(err) + } + + return gui.refreshSidePanels(refreshOptions{scope: []int{SUBMODULES}}) + }) + }, + }, + { + displayStrings: []string{gui.Tr.SLocalize("submoduleStashAndReset"), utils.ColoredString(fmt.Sprintf("git stash in each submodule && %s", gui.GitCommand.SubmoduleForceBulkUpdateCmdStr()), color.FgRed)}, + onPress: func() error { + return gui.WithWaitingStatus(gui.Tr.SLocalize("runningCommand"), func() error { + if err := gui.GitCommand.ResetSubmodules(gui.State.Submodules); err != nil { + return gui.surfaceError(err) + } + + return gui.refreshSidePanels(refreshOptions{scope: []int{SUBMODULES}}) + }) + }, + }, + { + displayStrings: []string{gui.Tr.SLocalize("bulkDeinitSubmodules"), utils.ColoredString(gui.GitCommand.SubmoduleBulkDeinitCmdStr(), color.FgRed)}, + onPress: func() error { + return gui.WithWaitingStatus(gui.Tr.SLocalize("runningCommand"), func() error { + if err := gui.OSCommand.RunCommand(gui.GitCommand.SubmoduleBulkDeinitCmdStr()); err != nil { + return gui.surfaceError(err) + } + + return gui.refreshSidePanels(refreshOptions{scope: []int{SUBMODULES}}) + }) + }, + }, + } + + return gui.createMenu(gui.Tr.SLocalize("bulkSubmoduleOptions"), menuItems, createMenuOptions{showCancel: true}) +} + func (gui *Gui) handleUpdateSubmodule(submodule *models.SubmoduleConfig) error { return gui.WithWaitingStatus(gui.Tr.SLocalize("updatingSubmoduleStatus"), func() error { err := gui.GitCommand.SubmoduleUpdate(submodule.Path) diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 4d84326fe..9c79ccb7d 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -1193,7 +1193,7 @@ func addEnglish(i18nObject *i18n.Bundle) error { Other: "running custom command", }, &i18n.Message{ ID: "submoduleStashAndReset", - Other: "stash uncommitted submodule changes and reset", + Other: "stash uncommitted submodule changes and update", }, &i18n.Message{ ID: "andResetSubmodules", Other: "and reset submodules", @@ -1254,6 +1254,24 @@ func addEnglish(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "updatingSubmoduleStatus", Other: "updating submodule", + }, &i18n.Message{ + ID: "bulkInitSubmodules", + Other: "bulk init submodules", + }, &i18n.Message{ + ID: "bulkUpdateSubmodules", + Other: "bulk update submodules", + }, &i18n.Message{ + ID: "bulkDeinitSubmodules", + Other: "bulk deinit submodules", + }, &i18n.Message{ + ID: "viewBulkSubmoduleOptions", + Other: "view bulk submodule options", + }, &i18n.Message{ + ID: "bulkSubmoduleOptions", + Other: "bulk submodule options", + }, &i18n.Message{ + ID: "runningCommand", + Other: "running command", }, ) } -- cgit v1.2.3