diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index 7337da7..c656b9f 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -314,6 +314,7 @@ keybinding: toggleDragSelect-alt: 'V' packages: link: 'l' + build: 'b' `) } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index c6eeb12..e6ab413 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -445,6 +445,12 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleInstall), }, + { + ViewName: "packages", + Key: gui.getKey("packages.build"), + Modifier: gocui.ModNone, + Handler: gui.wrappedHandler(gui.handleBuild), + }, } for _, viewName := range []string{"status", "packages", "deps", "scripts", "menu"} { diff --git a/pkg/gui/packages_panel.go b/pkg/gui/packages_panel.go index af54089..62d1300 100644 --- a/pkg/gui/packages_panel.go +++ b/pkg/gui/packages_panel.go @@ -130,7 +130,7 @@ func (gui *Gui) handleLinkPackage(g *gocui.Gui, v *gocui.View) error { } cmd := gui.OSCommand.ExecutableFromString(cmdStr) - if err := gui.newPtyTask("main", cmd); err != nil { + if err := gui.newPtyTask("main", cmd, cmdStr); err != nil { gui.Log.Error(err) } @@ -138,8 +138,50 @@ func (gui *Gui) handleLinkPackage(g *gocui.Gui, v *gocui.View) error { } func (gui *Gui) handleInstall() error { - cmd := gui.OSCommand.ExecutableFromString("npm install") - if err := gui.newPtyTask("main", cmd); err != nil { + selectedPkg := gui.getSelectedPackage() + if selectedPkg == nil { + return nil + } + + currentPkg := gui.currentPackage() + if currentPkg == nil { + return nil + } + + var cmdStr string + if selectedPkg == currentPkg { + cmdStr = "npm install" + } else { + cmdStr = "npm install --prefix " + selectedPkg.Path + } + + cmd := gui.OSCommand.ExecutableFromString(cmdStr) + if err := gui.newPtyTask("main", cmd, cmdStr); err != nil { + gui.Log.Error(err) + } + return nil +} + +func (gui *Gui) handleBuild() error { + selectedPkg := gui.getSelectedPackage() + if selectedPkg == nil { + return nil + } + + currentPkg := gui.currentPackage() + if currentPkg == nil { + return nil + } + + var cmdStr string + if selectedPkg == currentPkg { + cmdStr = "npm run build" + } else { + cmdStr = "npm run build --prefix " + selectedPkg.Path + } + + cmd := gui.OSCommand.ExecutableFromString(cmdStr) + if err := gui.newPtyTask("main", cmd, cmdStr); err != nil { gui.Log.Error(err) } return nil diff --git a/pkg/gui/pty.go b/pkg/gui/pty.go index f98f4f8..289b0c7 100644 --- a/pkg/gui/pty.go +++ b/pkg/gui/pty.go @@ -3,10 +3,13 @@ package gui import ( + "fmt" "io" "os/exec" "github.com/creack/pty" + "github.com/fatih/color" + "github.com/jesseduffield/lazynpm/pkg/utils" ) func (gui *Gui) onResize() error { @@ -31,7 +34,7 @@ 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, cmdStr string) error { go func() { view, err := gui.g.View(viewName) if err != nil { @@ -40,6 +43,8 @@ func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd) error { view.Clear() + fmt.Fprint(view, utils.ColoredString(fmt.Sprintf("+ %s\n\n", cmdStr), color.FgYellow)) + // _, height := view.Size() // _, oy := view.Origin() @@ -68,6 +73,8 @@ func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd) error { _, _ = io.Copy(view, ptmx) + fmt.Fprint(view, utils.ColoredString("\ncommand has completed", color.FgGreen)) + onClose() // if err := manager.NewTask(manager.NewCmdTask(ptmx, cmd, height+oy+10, onClose)); err != nil { diff --git a/pkg/gui/pty_windows.go b/pkg/gui/pty_windows.go index f5f6110..b233de8 100644 --- a/pkg/gui/pty_windows.go +++ b/pkg/gui/pty_windows.go @@ -8,6 +8,6 @@ func (gui *Gui) onResize() error { return nil } -func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd) error { +func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd, cmdStr string) error { return gui.newCmdTask(viewName, cmd) } diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go index 388cd5a..392ea84 100644 --- a/pkg/gui/view_helpers.go +++ b/pkg/gui/view_helpers.go @@ -338,7 +338,7 @@ func (gui *Gui) renderGlobalOptions() error { fmt.Sprintf("%s %s %s %s", gui.getKeyDisplay("universal.prevBlock"), gui.getKeyDisplay("universal.nextBlock"), gui.getKeyDisplay("universal.prevItem"), gui.getKeyDisplay("universal.nextItem")): gui.Tr.SLocalize("navigate"), fmt.Sprintf("%s/%s", gui.getKeyDisplay("universal.return"), gui.getKeyDisplay("universal.quit")): gui.Tr.SLocalize("close"), gui.getKeyDisplay("universal.optionMenu"): gui.Tr.SLocalize("menu"), - "1-5": gui.Tr.SLocalize("jump"), + "1-4": gui.Tr.SLocalize("jump"), }) }