summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-10-01 22:13:32 +1000
committerJesse Duffield <jessedduffield@gmail.com>2020-10-02 08:09:42 +1000
commit2dc848506cb465cd46006b4a2a6dca2bdc5cf89d (patch)
tree58ea3cbafe116ced5bd7fbf7197c6cecc6ac0db8
parent9125e3c0c6f9c2f83ba74f33b5899054b8641218 (diff)
bulk submodule menu
-rw-r--r--docs/Config.md1
-rw-r--r--pkg/commands/files.go8
-rw-r--r--pkg/commands/submodules.go36
-rw-r--r--pkg/config/app_config.go1
-rw-r--r--pkg/gui/confirmation_panel.go4
-rw-r--r--pkg/gui/keybindings.go7
-rw-r--r--pkg/gui/submodules_panel.go55
-rw-r--r--pkg/i18n/english.go20
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",
},
)
}