diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2020-10-01 08:18:16 +1000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2020-10-02 08:09:42 +1000 |
commit | da3e00823f733743c2bd8076d13955dbed9fcbae (patch) | |
tree | 0b9a5dfa358fe8e1d0b0d53ebb897282548a4581 /pkg/gui | |
parent | f3be2b3e68a49742ee88053a1d029926bc0d1819 (diff) |
allow submodule init and show submodule diff with a prefix
Diffstat (limited to 'pkg/gui')
-rw-r--r-- | pkg/gui/files_panel.go | 11 | ||||
-rw-r--r-- | pkg/gui/keybindings.go | 27 | ||||
-rw-r--r-- | pkg/gui/main_panels.go | 18 | ||||
-rw-r--r-- | pkg/gui/pty.go | 6 | ||||
-rw-r--r-- | pkg/gui/submodules_panel.go | 121 | ||||
-rw-r--r-- | pkg/gui/tasks_adapter.go | 4 |
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 } |