diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2020-10-01 22:13:32 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2020-10-02 08:09:42 +1000 |
commit | 2dc848506cb465cd46006b4a2a6dca2bdc5cf89d (patch) | |
tree | 58ea3cbafe116ced5bd7fbf7197c6cecc6ac0db8 | |
parent | 9125e3c0c6f9c2f83ba74f33b5899054b8641218 (diff) |
bulk submodule menu
-rw-r--r-- | docs/Config.md | 1 | ||||
-rw-r--r-- | pkg/commands/files.go | 8 | ||||
-rw-r--r-- | pkg/commands/submodules.go | 36 | ||||
-rw-r--r-- | pkg/config/app_config.go | 1 | ||||
-rw-r--r-- | pkg/gui/confirmation_panel.go | 4 | ||||
-rw-r--r-- | pkg/gui/keybindings.go | 7 | ||||
-rw-r--r-- | pkg/gui/submodules_panel.go | 55 | ||||
-rw-r--r-- | pkg/i18n/english.go | 20 |
8 files changed, 123 insertions, 9 deletions
diff --git a/docs/Config.md b/docs/Config.md index d64a7b94b..e5ed44b9d 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -167,6 +167,7 @@ Default path for the config file: submodules: init: 'i' update: 'u' + bulkMenu: 'b' ``` ## Platform Defaults 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", }, ) } |