Skip to content

Commit

Permalink
more progress
Browse files Browse the repository at this point in the history
  • Loading branch information
jesseduffield committed Apr 11, 2020
1 parent c5b6899 commit 69aa500
Show file tree
Hide file tree
Showing 9 changed files with 211 additions and 37 deletions.
2 changes: 2 additions & 0 deletions pkg/config/app_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,7 @@ keybinding:
undo: 'z'
redo: '<c-z>'
install: 'i'
update: 'u'
cleanInstall: 'I'
status:
checkForUpdate: 'u'
Expand All @@ -314,6 +315,7 @@ keybinding:
toggleDragSelect-alt: 'V'
packages:
link: 'l'
globalLink: 'L'
build: 'b'
`)
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/gui/confirmation_panel.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,8 @@ func (gui *Gui) createLoaderPanel(g *gocui.Gui, currentView *gocui.View, prompt
}

// it is very important that within this function we never include the original prompt in any error messages, because it may contain e.g. a user password
func (gui *Gui) createConfirmationPanel(g *gocui.Gui, currentView *gocui.View, returnFocusOnClose bool, title, prompt string, handleConfirm, handleClose func(*gocui.Gui, *gocui.View) error) error {
return gui.createPopupPanel(g, currentView, title, prompt, false, returnFocusOnClose, false, handleConfirm, handleClose)
func (gui *Gui) createConfirmationPanel(currentView *gocui.View, returnFocusOnClose bool, title, prompt string, handleConfirm, handleClose func(*gocui.Gui, *gocui.View) error) error {
return gui.createPopupPanel(gui.g, currentView, title, prompt, false, returnFocusOnClose, false, handleConfirm, handleClose)
}

func (gui *Gui) createPromptPanel(currentView *gocui.View, title string, initialContent string, handleConfirm func(*gocui.Gui, *gocui.View) error) error {
Expand Down Expand Up @@ -176,7 +176,7 @@ func (gui *Gui) createSpecificErrorPanel(message string, nextView *gocui.View, w
return err
}

return gui.createConfirmationPanel(gui.g, nextView, true, gui.Tr.SLocalize("Error"), coloredMessage, nil, nil)
return gui.createConfirmationPanel(nextView, true, gui.Tr.SLocalize("Error"), coloredMessage, nil, nil)
}

func (gui *Gui) createErrorPanel(message string) error {
Expand Down
43 changes: 43 additions & 0 deletions pkg/gui/dependencies_panel.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package gui

import (
"fmt"
"path/filepath"

"github.com/fatih/color"
"github.com/go-errors/errors"
"github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazynpm/pkg/commands"
"github.com/jesseduffield/lazynpm/pkg/gui/presentation"
Expand Down Expand Up @@ -47,3 +49,44 @@ func (gui *Gui) linkPathMap() map[string]bool {
}
return linkPathMap
}

func (gui *Gui) handleDepInstall() error {
dep := gui.getSelectedDependency()
if dep == nil {
return nil
}

cmdStr := fmt.Sprintf("npm install %s", dep.Name)
cmd := gui.OSCommand.ExecutableFromString(cmdStr)
if err := gui.newPtyTask("main", cmd, cmdStr); err != nil {
gui.Log.Error(err)
}
return nil
}

func (gui *Gui) handleDepUpdate() error {
dep := gui.getSelectedDependency()
if dep == nil {
return nil
}

cmdStr := fmt.Sprintf("npm update %s", dep.Name)
cmd := gui.OSCommand.ExecutableFromString(cmdStr)
if err := gui.newPtyTask("main", cmd, cmdStr); err != nil {
gui.Log.Error(err)
}
return nil
}

func (gui *Gui) handleOpenDepPackageConfig() error {
selectedDep := gui.getSelectedDependency()
if selectedDep == nil {
return nil
}

if selectedDep.PackageConfig == nil {
return gui.surfaceError(errors.New("dependency not in node_modules"))
}

return gui.openFile(filepath.Join("node_modules", selectedDep.Name, "package.json"))
}
21 changes: 16 additions & 5 deletions pkg/gui/gui.go
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ func (gui *Gui) runCommand() error {

func (gui *Gui) loadNewRepo() error {
gui.Updater.CheckForNewUpdate(gui.onBackgroundUpdateCheckFinish, false)
if err := gui.updateRecentRepoList(); err != nil {
if err := gui.updateRecentPackagesList(); err != nil {
return err
}
gui.waitForIntro.Done()
Expand All @@ -311,9 +311,9 @@ func (gui *Gui) loadNewRepo() error {
return nil
}

// updateRecentRepoList registers the fact that we opened lazynpm in this package,
// updateRecentPackagesList registers the fact that we opened lazynpm in this package,
// so that appears in the packages view next time we open the program in another package
func (gui *Gui) updateRecentRepoList() error {
func (gui *Gui) updateRecentPackagesList() error {
ok, err := gui.NpmManager.ChdirToPackageRoot()
if err != nil {
return err
Expand Down Expand Up @@ -347,6 +347,17 @@ func (gui *Gui) sendPackageToTop(path string) error {
return gui.Config.SaveAppState()
}

func (gui *Gui) removePackage(path string) error {
recentPackages := gui.Config.GetAppState().RecentPackages
index, ok := utils.StringIndex(recentPackages, path)
if !ok {
return nil
}
recentPackages = append(recentPackages[:index], recentPackages[index+1:]...)
gui.Config.GetAppState().RecentPackages = recentPackages
return gui.Config.SaveAppState()
}

// newRecentPackagesList returns a new repo list with a new entry but only when it doesn't exist yet
func newRecentPackagesList(recentPackages []string, currentPackage string) (bool, []string) {
isNew := true
Expand Down Expand Up @@ -385,11 +396,11 @@ func (gui *Gui) showShamelessSelfPromotionMessage(done chan struct{}) error {
return gui.Config.WriteToUserConfig("startupPopupVersion", StartupPopupVersion)
}

return gui.createConfirmationPanel(gui.g, nil, true, gui.Tr.SLocalize("ShamelessSelfPromotionTitle"), gui.Tr.SLocalize("ShamelessSelfPromotionMessage"), onConfirm, onConfirm)
return gui.createConfirmationPanel(nil, true, gui.Tr.SLocalize("ShamelessSelfPromotionTitle"), gui.Tr.SLocalize("ShamelessSelfPromotionMessage"), onConfirm, onConfirm)
}

func (gui *Gui) promptAnonymousReporting(done chan struct{}) error {
return gui.createConfirmationPanel(gui.g, nil, true, gui.Tr.SLocalize("AnonymousReportingTitle"), gui.Tr.SLocalize("AnonymousReportingPrompt"), func(g *gocui.Gui, v *gocui.View) error {
return gui.createConfirmationPanel(nil, true, gui.Tr.SLocalize("AnonymousReportingTitle"), gui.Tr.SLocalize("AnonymousReportingPrompt"), func(g *gocui.Gui, v *gocui.View) error {
done <- struct{}{}
return gui.Config.WriteToUserConfig("reporting", "on")
}, func(g *gocui.Gui, v *gocui.View) error {
Expand Down
80 changes: 63 additions & 17 deletions pkg/gui/keybindings.go
Original file line number Diff line number Diff line change
Expand Up @@ -438,31 +438,77 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
ViewName: "packages",
Key: gui.getKey("universal.select"),
Modifier: gocui.ModNone,
Handler: gui.handleCheckoutPackage,
Handler: gui.wrappedHandler(gui.handleCheckoutPackage),
},
{
ViewName: "packages",
Key: gui.getKey("packages.link"),
Modifier: gocui.ModNone,
Handler: gui.handleLinkPackage,
ViewName: "packages",
Key: gui.getKey("packages.link"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleLinkPackage),
Description: "npm link <package> (or unlink if already linked)",
},
{
ViewName: "",
Key: gui.getKey("universal.install"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleInstall),
ViewName: "packages",
Key: gui.getKey("packages.globalLink"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleGlobalLinkPackage),
Description: "`npm link` package (or unlink if already linked)",
},
{
ViewName: "packages",
Key: gui.getKey("packages.build"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleBuild),
ViewName: "packages",
Key: gui.getKey("universal.remove"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleRemovePackage),
Description: "remove package from list",
},
{
ViewName: "scripts",
Key: gui.getKey("universal.select"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleRunScript),
ViewName: "packages",
Key: gui.getKey("universal.install"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleInstall),
Description: "`npm install` package",
},
{
ViewName: "packages",
Key: gui.getKey("packages.build"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleBuild),
Description: "`npm run build` package",
},
{
ViewName: "packages",
Key: gui.getKey("universal.openFile"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleOpenPackageConfig),
Description: "open package.json",
},
{
ViewName: "scripts",
Key: gui.getKey("universal.select"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleRunScript),
Description: "`npm run` script",
},
{
ViewName: "deps",
Key: gui.getKey("universal.install"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleDepInstall),
Description: "`npm install` dependency",
},
{
ViewName: "deps",
Key: gui.getKey("universal.openFile"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleOpenDepPackageConfig),
Description: "open package.json",
},
{
ViewName: "deps",
Key: gui.getKey("universal.update"),
Modifier: gocui.ModNone,
Handler: gui.wrappedHandler(gui.handleDepUpdate),
Description: "`npm update` dependency",
},
}

Expand Down
80 changes: 71 additions & 9 deletions pkg/gui/packages_panel.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package gui

import (
"fmt"
"path/filepath"

"github.com/fatih/color"
"github.com/go-errors/errors"
"github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazynpm/pkg/commands"
"github.com/jesseduffield/lazynpm/pkg/gui/presentation"
Expand Down Expand Up @@ -84,7 +86,7 @@ func (gui *Gui) refreshStatePackages() error {
return nil
}

func (gui *Gui) handleCheckoutPackage(g *gocui.Gui, v *gocui.View) error {
func (gui *Gui) handleCheckoutPackage() error {
selectedPkg := gui.getSelectedPackage()

if selectedPkg == nil {
Expand All @@ -102,7 +104,7 @@ func (gui *Gui) handleCheckoutPackage(g *gocui.Gui, v *gocui.View) error {
return gui.refreshPackages()
}

func (gui *Gui) handleLinkPackage(g *gocui.Gui, v *gocui.View) error {
func (gui *Gui) handleLinkPackage() error {
// if it's the current package we should globally link it, otherwise we should link it to here
selectedPkg := gui.getSelectedPackage()
if selectedPkg == nil {
Expand All @@ -116,14 +118,14 @@ func (gui *Gui) handleLinkPackage(g *gocui.Gui, v *gocui.View) error {

var cmdStr string
if selectedPkg == currentPkg {
if selectedPkg.LinkedGlobally {
cmdStr = "npm unlink"
} else {
cmdStr = "npm link"
}
return gui.surfaceError(errors.New("Cannot link a package to itself"))
}

if gui.linkPathMap()[selectedPkg.Path] {
cmdStr = fmt.Sprintf("npm unlink --no-save %s", selectedPkg.Config.Name)
} else {
if gui.linkPathMap()[selectedPkg.Path] {
cmdStr = fmt.Sprintf("npm unlink --no-save %s", selectedPkg.Config.Name)
if !selectedPkg.LinkedGlobally {
cmdStr = fmt.Sprintf("npm link %s", selectedPkg.Path)
} else {
cmdStr = fmt.Sprintf("npm link %s", selectedPkg.Config.Name)
}
Expand All @@ -137,6 +139,36 @@ func (gui *Gui) handleLinkPackage(g *gocui.Gui, v *gocui.View) error {
return nil
}

func (gui *Gui) handleGlobalLinkPackage() error {
selectedPkg := gui.getSelectedPackage()
if selectedPkg == nil {
return nil
}

currentPkg := gui.currentPackage()
if currentPkg == nil {
return nil
}

if selectedPkg != currentPkg {
return gui.surfaceError(errors.New("You can only globally link the current package. Hit space on this package to make it the current package."))
}

var cmdStr string
if selectedPkg.LinkedGlobally {
cmdStr = "npm unlink"
} else {
cmdStr = "npm link"
}

cmd := gui.OSCommand.ExecutableFromString(cmdStr)
if err := gui.newPtyTask("main", cmd, cmdStr); err != nil {
gui.Log.Error(err)
}

return nil
}

func (gui *Gui) handleInstall() error {
selectedPkg := gui.getSelectedPackage()
if selectedPkg == nil {
Expand Down Expand Up @@ -186,3 +218,33 @@ func (gui *Gui) handleBuild() error {
}
return nil
}

func (gui *Gui) handleOpenPackageConfig() error {
selectedPkg := gui.getSelectedPackage()
if selectedPkg == nil {
return nil
}

return gui.openFile(filepath.Join(selectedPkg.Path, "package.json"))
}

func (gui *Gui) handleRemovePackage() error {
selectedPkg := gui.getSelectedPackage()
if selectedPkg == nil {
return nil
}

currentPkg := gui.currentPackage()
if currentPkg == nil {
return nil
}

if selectedPkg == currentPkg {
return gui.createErrorPanel("Cannot remove current package")
}

return gui.createConfirmationPanel(gui.getPackagesView(), true, "Remove package", "Do you want to remove this package from the list? It won't actually be removed from the filesystem, but as far as lazynpm is concerned it'll be as good as dead. You won't have to worry about it no more.", func(*gocui.Gui, *gocui.View) error {
return gui.removePackage(selectedPkg.Path)
},
nil)
}
2 changes: 1 addition & 1 deletion pkg/gui/quitting.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (gui *Gui) quit(v *gocui.View) error {
}

if gui.Config.GetUserConfig().GetBool("confirmOnQuit") {
return gui.createConfirmationPanel(gui.g, v, true, "", gui.Tr.SLocalize("ConfirmQuit"), func(g *gocui.Gui, v *gocui.View) error {
return gui.createConfirmationPanel(v, true, "", gui.Tr.SLocalize("ConfirmQuit"), func(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}, nil)
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/gui/updates.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ func (gui *Gui) showUpdatePrompt(newVersion string) error {
title := "New version available!"
message := "Download latest version? (enter/esc)"
currentView := gui.g.CurrentView()
return gui.createConfirmationPanel(gui.g, currentView, true, title, message, func(g *gocui.Gui, v *gocui.View) error {
return gui.createConfirmationPanel(currentView, true, title, message, func(g *gocui.Gui, v *gocui.View) error {
gui.startUpdating(newVersion)
return nil
}, nil)
Expand Down Expand Up @@ -57,7 +57,7 @@ func (gui *Gui) onUpdateFinish(err error) error {
func (gui *Gui) createUpdateQuitConfirmation(g *gocui.Gui, v *gocui.View) error {
title := "Currently Updating"
message := "An update is in progress. Are you sure you want to quit?"
return gui.createConfirmationPanel(gui.g, v, true, title, message, func(g *gocui.Gui, v *gocui.View) error {
return gui.createConfirmationPanel(v, true, title, message, func(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}, nil)
}
Loading

0 comments on commit 69aa500

Please sign in to comment.