summaryrefslogtreecommitdiffstats
path: root/pkg/gui
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2020-10-01 08:18:16 +1000
committerJesse Duffield <jessedduffield@gmail.com>2020-10-02 08:09:42 +1000
commitda3e00823f733743c2bd8076d13955dbed9fcbae (patch)
tree0b9a5dfa358fe8e1d0b0d53ebb897282548a4581 /pkg/gui
parentf3be2b3e68a49742ee88053a1d029926bc0d1819 (diff)
allow submodule init and show submodule diff with a prefix
Diffstat (limited to 'pkg/gui')
-rw-r--r--pkg/gui/files_panel.go11
-rw-r--r--pkg/gui/keybindings.go27
-rw-r--r--pkg/gui/main_panels.go18
-rw-r--r--pkg/gui/pty.go6
-rw-r--r--pkg/gui/submodules_panel.go121
-rw-r--r--pkg/gui/tasks_adapter.go4
6 files changed, 85 insertions, 102 deletions
diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go
index d70309a6a..9877d1602 100644
--- a/pkg/gui/files_panel.go
+++ b/pkg/gui/files_panel.go
@@ -446,17 +446,6 @@ func (gui *Gui) refreshStateFiles() error {
return nil
}
-func (gui *Gui) refreshStateSubmoduleConfigs() error {
- configs, err := gui.GitCommand.GetSubmoduleConfigs()
- if err != nil {
- return err
- }
-
- gui.State.Submodules = configs
-
- return nil
-}
-
func (gui *Gui) handlePullFiles(g *gocui.Gui, v *gocui.View) error {
if gui.popupPanelFocused() {
return nil
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index 1c1fa6c9a..992f32313 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -1562,13 +1562,6 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
},
{
ViewName: "files",
- Contexts: []string{SUBMODULES_CONTEXT_KEY},
- Key: gui.getKey("universal.goInto"),
- Handler: gui.wrappedHandler(gui.handleSubmoduleEnter),
- Description: gui.Tr.SLocalize("enterSubmodule"),
- },
- {
- ViewName: "files",
Key: gui.getKey("universal.nextTab"),
Handler: gui.handleNextTab,
Description: gui.Tr.SLocalize("nextTab"),
@@ -1587,18 +1580,25 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Description: gui.Tr.SLocalize("copySubmoduleNameToClipboard"),
},
{
+ ViewName: "files",
+ Contexts: []string{SUBMODULES_CONTEXT_KEY},
+ Key: gui.getKey("universal.goInto"),
+ Handler: gui.forSubmodule(gui.handleSubmoduleEnter),
+ Description: gui.Tr.SLocalize("enterSubmodule"),
+ },
+ {
ViewName: "files",
Contexts: []string{SUBMODULES_CONTEXT_KEY},
Key: gui.getKey("universal.remove"),
- Handler: gui.wrappedHandler(gui.handleRemoveSubmodule),
+ Handler: gui.forSubmodule(gui.handleRemoveSubmodule),
Description: gui.Tr.SLocalize("removeSubmodule"),
},
{
ViewName: "files",
Contexts: []string{SUBMODULES_CONTEXT_KEY},
Key: gui.getKey("u"),
- Handler: gui.wrappedHandler(gui.handleResetSubmodule),
+ Handler: gui.forSubmodule(gui.handleResetSubmodule),
Description: gui.Tr.SLocalize("submoduleStashAndReset"),
},
{
@@ -1612,9 +1612,16 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
ViewName: "files",
Contexts: []string{SUBMODULES_CONTEXT_KEY},
Key: gui.getKey("universal.edit"),
- Handler: gui.wrappedHandler(gui.handleEditSubmoduleUrl),
+ Handler: gui.forSubmodule(gui.handleEditSubmoduleUrl),
Description: gui.Tr.SLocalize("editSubmoduleUrl"),
},
+ {
+ ViewName: "files",
+ Contexts: []string{SUBMODULES_CONTEXT_KEY},
+ Key: gui.getKey("submodules.init"),
+ Handler: gui.forSubmodule(gui.handleSubmoduleInit),
+ Description: gui.Tr.SLocalize("initSubmodule"),
+ },
}
for _, viewName := range []string{"status", "branches", "files", "commits", "commitFiles", "stash", "menu"} {
diff --git a/pkg/gui/main_panels.go b/pkg/gui/main_panels.go
index 3cff20be6..68c28ff23 100644
--- a/pkg/gui/main_panels.go
+++ b/pkg/gui/main_panels.go
@@ -62,7 +62,8 @@ func (gui *Gui) createRenderStringWithoutScrollTask(str string) *renderStringWit
}
type runCommandTask struct {
- cmd *exec.Cmd
+ cmd *exec.Cmd
+ prefix string
}
func (t *runCommandTask) GetKind() int {
@@ -73,8 +74,13 @@ func (gui *Gui) createRunCommandTask(cmd *exec.Cmd) *runCommandTask {
return &runCommandTask{cmd: cmd}
}
+func (gui *Gui) createRunCommandTaskWithPrefix(cmd *exec.Cmd, prefix string) *runCommandTask {
+ return &runCommandTask{cmd: cmd, prefix: prefix}
+}
+
type runPtyTask struct {
- cmd *exec.Cmd
+ cmd *exec.Cmd
+ prefix string
}
func (t *runPtyTask) GetKind() int {
@@ -85,6 +91,10 @@ func (gui *Gui) createRunPtyTask(cmd *exec.Cmd) *runPtyTask {
return &runPtyTask{cmd: cmd}
}
+func (gui *Gui) createRunPtyTaskWithPrefix(cmd *exec.Cmd, prefix string) *runPtyTask {
+ return &runPtyTask{cmd: cmd, prefix: prefix}
+}
+
type runFunctionTask struct {
f func(chan struct{}) error
}
@@ -113,11 +123,11 @@ func (gui *Gui) runTaskForView(viewName string, task updateTask) error {
case RUN_COMMAND:
specificTask := task.(*runCommandTask)
- return gui.newCmdTask(viewName, specificTask.cmd)
+ return gui.newCmdTask(viewName, specificTask.cmd, specificTask.prefix)
case RUN_PTY:
specificTask := task.(*runPtyTask)
- return gui.newPtyTask(viewName, specificTask.cmd)
+ return gui.newPtyTask(viewName, specificTask.cmd, specificTask.prefix)
}
return nil
diff --git a/pkg/gui/pty.go b/pkg/gui/pty.go
index 68cc3991f..03590cd40 100644
--- a/pkg/gui/pty.go
+++ b/pkg/gui/pty.go
@@ -30,13 +30,13 @@ func (gui *Gui) onResize() error {
// which is just an io.Reader. the pty package lets us wrap a command in a
// pseudo-terminal meaning we'll get the behaviour we want from the underlying
// command.
-func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd) error {
+func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd, prefix string) error {
width, _ := gui.getMainView().Size()
pager := gui.GitCommand.GetPager(width)
if pager == "" {
// if we're not using a custom pager we don't need to use a pty
- return gui.newCmdTask(viewName, cmd)
+ return gui.newCmdTask(viewName, cmd, prefix)
}
cmd.Env = append(cmd.Env, "GIT_PAGER="+pager)
@@ -66,7 +66,7 @@ func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd) error {
return err
}
- if err := manager.NewTask(manager.NewCmdTask(ptmx, cmd, height+oy+10, onClose)); err != nil {
+ if err := manager.NewTask(manager.NewCmdTask(ptmx, cmd, prefix, height+oy+10, onClose)); err != nil {
return err
}
diff --git a/pkg/gui/submodules_panel.go b/pkg/gui/submodules_panel.go
index d0beeb87e..d9951f2f0 100644
--- a/pkg/gui/submodules_panel.go
+++ b/pkg/gui/submodules_panel.go
@@ -7,6 +7,7 @@ import (
"strings"
"github.com/fatih/color"
+ "github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazygit/pkg/commands/models"
"github.com/jesseduffield/lazygit/pkg/utils"
)
@@ -26,16 +27,21 @@ func (gui *Gui) handleSubmoduleSelect() error {
if submodule == nil {
task = gui.createRenderStringTask("No submodules")
} else {
- // TODO: we want to display the path, name, url, and a diff. We really need to be able to pipe commands together. We can always pipe commands together and just not do it asynchronously, but what if it's an expensive diff to obtain? I think that makes the most sense now though.
-
- task = gui.createRenderStringTask(
- fmt.Sprintf(
- "Name: %s\nPath: %s\nUrl: %s\n",
- utils.ColoredString(submodule.Name, color.FgGreen),
- utils.ColoredString(submodule.Path, color.FgYellow),
- utils.ColoredString(submodule.Url, color.FgCyan),
- ),
+ prefix := fmt.Sprintf(
+ "Name: %s\nPath: %s\nUrl: %s\n\n",
+ utils.ColoredString(submodule.Name, color.FgGreen),
+ utils.ColoredString(submodule.Path, color.FgYellow),
+ utils.ColoredString(submodule.Url, color.FgCyan),
)
+
+ file := gui.fileForSubmodule(submodule)
+ if file == nil {
+ task = gui.createRenderStringTask(prefix)
+ } else {
+ cmdStr := gui.GitCommand.WorktreeFileDiffCmdStr(file, false, !file.HasUnstagedChanges && file.HasStagedChanges)
+ cmd := gui.OSCommand.ExecutableFromString(cmdStr)
+ task = gui.createRunCommandTaskWithPrefix(cmd, prefix)
+ }
}
return gui.refreshMainViews(refreshMainOpts{
@@ -46,12 +52,18 @@ func (gui *Gui) handleSubmoduleSelect() error {
})
}
-func (gui *Gui) handleSubmoduleEnter() error {
- submodule := gui.getSelectedSubmodule()
- if submodule == nil {
- return nil
+func (gui *Gui) refreshStateSubmoduleConfigs() error {
+ configs, err := gui.GitCommand.GetSubmoduleConfigs()
+ if err != nil {
+ return err
}
+ gui.State.Submodules = configs
+
+ return nil
+}
+
+func (gui *Gui) handleSubmoduleEnter(submodule *models.SubmoduleConfig) error {
return gui.enterSubmodule(submodule)
}
@@ -65,12 +77,7 @@ func (gui *Gui) enterSubmodule(submodule *models.SubmoduleConfig) error {
return gui.dispatchSwitchToRepo(submodule.Path)
}
-func (gui *Gui) handleRemoveSubmodule() error {
- submodule := gui.getSelectedSubmodule()
- if submodule == nil {
- return nil
- }
-
+func (gui *Gui) handleRemoveSubmodule(submodule *models.SubmoduleConfig) error {
return gui.ask(askOpts{
title: gui.Tr.SLocalize("RemoveSubmodule"),
prompt: gui.Tr.SLocalizef("RemoveSubmodulePrompt", submodule.Name),
@@ -84,13 +91,8 @@ func (gui *Gui) handleRemoveSubmodule() error {
})
}
-func (gui *Gui) handleResetSubmodule() error {
+func (gui *Gui) handleResetSubmodule(submodule *models.SubmoduleConfig) error {
return gui.WithWaitingStatus(gui.Tr.SLocalize("resettingSubmoduleStatus"), func() error {
- submodule := gui.getSelectedSubmodule()
- if submodule == nil {
- return nil
- }
-
return gui.resetSubmodule(submodule)
})
}
@@ -140,12 +142,7 @@ func (gui *Gui) handleAddSubmodule() error {
})
}
-func (gui *Gui) handleEditSubmoduleUrl() error {
- submodule := gui.getSelectedSubmodule()
- if submodule == nil {
- return nil
- }
-
+func (gui *Gui) handleEditSubmoduleUrl(submodule *models.SubmoduleConfig) error {
return gui.prompt(gui.Tr.SLocalizef("updateSubmoduleUrl", submodule.Name), submodule.Url, func(newUrl string) error {
return gui.WithWaitingStatus(gui.Tr.SLocalize("updatingSubmoduleUrlStatus"), func() error {
err := gui.GitCommand.SubmoduleUpdateUrl(submodule.Name, submodule.Path, newUrl)
@@ -156,44 +153,24 @@ func (gui *Gui) handleEditSubmoduleUrl() error {
})
}
-// func (gui *Gui) handleEditsubmodule(g *gocui.Gui, v *gocui.View) error {
-// submodule := gui.getSelectedSubmodule()
-// if submodule == nil {
-// return nil
-// }
-
-// editNameMessage := gui.Tr.TemplateLocalize(
-// "editsubmoduleName",
-// Teml{
-// "submoduleName": submodule.Name,
-// },
-// )
-
-// return gui.prompt(editNameMessage, submodule.Name, func(updatedsubmoduleName string) error {
-// if updatedsubmoduleName != submodule.Name {
-// if err := gui.GitCommand.Renamesubmodule(submodule.Name, updatedsubmoduleName); err != nil {
-// return gui.surfaceError(err)
-// }
-// }
-
-// editUrlMessage := gui.Tr.TemplateLocalize(
-// "editsubmoduleUrl",
-// Teml{
-// "submoduleName": updatedsubmoduleName,
-// },
-// )
-
-// urls := submodule.Urls
-// url := ""
-// if len(urls) > 0 {
-// url = urls[0]
-// }
-
-// return gui.prompt(editUrlMessage, url, func(updatedsubmoduleUrl string) error {
-// if err := gui.GitCommand.UpdatesubmoduleUrl(updatedsubmoduleName, updatedsubmoduleUrl); err != nil {
-// return gui.surfaceError(err)
-// }
-// return gui.refreshSidePanels(refreshOptions{scope: []int{BRANCHES, submoduleS}})
-// })
-// })
-// }
+func (gui *Gui) handleSubmoduleInit(submodule *models.SubmoduleConfig) error {
+ return gui.WithWaitingStatus(gui.Tr.SLocalize("initializingSubmoduleStatus"), func() error {
+ err := gui.GitCommand.SubmoduleInit(submodule.Path)
+ gui.handleCredentialsPopup(err)
+
+ return gui.refreshSidePanels(refreshOptions{scope: []int{SUBMODULES}})
+ })
+}
+
+func (gui *Gui) forSubmodule(callback func(*models.SubmoduleConfig) error) func(g *gocui.Gui, v *gocui.View) error {
+ return gui.wrappedHandler(
+ func() error {
+ submodule := gui.getSelectedSubmodule()
+ if submodule == nil {
+ return nil
+ }
+
+ return callback(submodule)
+ },
+ )
+}
diff --git a/pkg/gui/tasks_adapter.go b/pkg/gui/tasks_adapter.go
index 91ca92a79..8df7acd3e 100644
--- a/pkg/gui/tasks_adapter.go
+++ b/pkg/gui/tasks_adapter.go
@@ -8,7 +8,7 @@ import (
"github.com/jesseduffield/lazygit/pkg/tasks"
)
-func (gui *Gui) newCmdTask(viewName string, cmd *exec.Cmd) error {
+func (gui *Gui) newCmdTask(viewName string, cmd *exec.Cmd, prefix string) error {
gui.Log.WithField(
"command",
strings.Join(cmd.Args, " "),
@@ -34,7 +34,7 @@ func (gui *Gui) newCmdTask(viewName string, cmd *exec.Cmd) error {
return err
}
- if err := manager.NewTask(manager.NewCmdTask(r, cmd, height+oy+10, nil)); err != nil {
+ if err := manager.NewTask(manager.NewCmdTask(r, cmd, prefix, height+oy+10, nil)); err != nil {
return err
}