1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-02-09 13:47:11 +02:00

First good success

This commit is contained in:
mjarkk 2018-10-20 17:37:55 +02:00
parent 727ba9f42e
commit 12425f0aa7
7 changed files with 109 additions and 13 deletions

View File

@ -92,8 +92,7 @@ func (c *OSCommand) RunCommandWithOutputLive(command string, output func(string)
for scanner.Scan() {
toWrite := output(re.ReplaceAllString(scanner.Text(), ""))
if len(toWrite) > 0 {
_, err := tty.Write([]byte(toWrite + "\n"))
logrus.Error(err.Error())
_, _ = tty.Write([]byte(toWrite + "\n"))
}
}
}()

View File

@ -3,6 +3,7 @@ package gui
import (
"strconv"
"strings"
"sync"
"github.com/jesseduffield/gocui"
)
@ -51,6 +52,71 @@ func (gui *Gui) handleCommitFocused(g *gocui.Gui, v *gocui.View) error {
return gui.renderString(g, "options", message)
}
var unamePassMessage = ""
var waitForGroup sync.WaitGroup
var waitForGroupActie = false
// waitForPassUname wait for a username or password input from the pushPassUname popup
func (gui *Gui) waitForPassUname(g *gocui.Gui, currentView *gocui.View, passOrUname string) string {
pushPassUnameView := gui.getPushPassUnameView(g)
if passOrUname == "username" {
pushPassUnameView.Title = gui.Tr.SLocalize("PushUsername")
// pushPassUnameView.Mask = 1
} else {
pushPassUnameView.Title = gui.Tr.SLocalize("PushPassword")
pushPassUnameView.Mask = '*'
}
g.Update(func(g *gocui.Gui) error {
g.SetViewOnTop("pushPassUname")
gui.switchFocus(g, currentView, pushPassUnameView)
gui.RenderCommitLength()
return nil
})
waitForGroupActie = true
waitForGroup.Add(1)
waitForGroup.Wait()
return unamePassMessage
}
func (gui *Gui) handlePushConfirm(g *gocui.Gui, v *gocui.View) error {
message := gui.trimmedContent(v)
unamePassMessage = message
if waitForGroupActie {
defer waitForGroup.Done()
}
gui.refreshFiles(g)
v.Clear()
v.SetCursor(0, 0)
g.SetViewOnBottom("pushPassUname")
gui.switchFocus(g, v, gui.getFilesView(g))
return gui.refreshCommits(g)
}
func (gui *Gui) handlePushClose(g *gocui.Gui, v *gocui.View) error {
g.SetViewOnBottom("pushPassUname")
unamePassMessage = ""
if waitForGroupActie {
defer waitForGroup.Done()
}
return gui.switchFocus(g, v, gui.getFilesView(g))
}
func (gui *Gui) handlePushFocused(g *gocui.Gui, v *gocui.View) error {
if _, err := g.SetViewOnTop("pushPassUname"); err != nil {
return err
}
message := gui.Tr.TemplateLocalize(
"CloseConfirm",
Teml{
"keyBindClose": "esc",
"keyBindConfirm": "enter",
},
)
return gui.renderString(g, "options", message)
}
func (gui *Gui) simpleEditor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) {
switch {
case key == gocui.KeyBackspace || key == gocui.KeyBackspace2:

View File

@ -85,6 +85,7 @@ func (gui *Gui) prepareConfirmationPanel(currentView *gocui.View, title, prompt
func (gui *Gui) onNewPopupPanel() {
gui.g.SetViewOnBottom("commitMessage")
gui.g.SetViewOnBottom("pushPassUname")
}
func (gui *Gui) createConfirmationPanel(g *gocui.Gui, currentView *gocui.View, title, prompt string, handleConfirm, handleClose func(*gocui.Gui, *gocui.View) error) error {

View File

@ -355,22 +355,21 @@ func (gui *Gui) pullFiles(g *gocui.Gui, v *gocui.View) error {
return nil
}
func (gui *Gui) pushWithForceFlag(currentView *gocui.View, force bool) error {
func (gui *Gui) pushWithForceFlag(g *gocui.Gui, currentView *gocui.View, force bool) error {
if err := gui.createMessagePanel(gui.g, currentView, "", gui.Tr.SLocalize("PushWait")); err != nil {
return err
}
go func() {
branchName := gui.State.Branches[0].Name
err := gui.GitCommand.Push(branchName, force, func(passOrUname string) string {
if passOrUname == "password" {
// TODO: ask for password
return "some password"
}
// TODO: ask for username
return "some username"
return gui.waitForPassUname(g, currentView, passOrUname)
})
if err != nil {
_ = gui.createErrorPanel(gui.g, err.Error())
errMessage := err.Error()
if errMessage == "exit status 128" {
errMessage = gui.Tr.SLocalize("PassUnameWrong")
}
_ = gui.createErrorPanel(gui.g, errMessage)
} else {
_ = gui.closeConfirmationPrompt(gui.g)
_ = gui.refreshCommits(gui.g)
@ -384,10 +383,10 @@ func (gui *Gui) pushFiles(g *gocui.Gui, v *gocui.View) error {
// if we have pullables we'll ask if the user wants to force push
_, pullables := gui.GitCommand.UpstreamDifferenceCount()
if pullables == "?" || pullables == "0" {
return gui.pushWithForceFlag(v, false)
return gui.pushWithForceFlag(g, v, false)
}
err := gui.createConfirmationPanel(g, nil, gui.Tr.SLocalize("ForcePush"), gui.Tr.SLocalize("ForcePushPrompt"), func(g *gocui.Gui, v *gocui.View) error {
return gui.pushWithForceFlag(v, true)
return gui.pushWithForceFlag(g, v, true)
}, nil)
return err
}

View File

@ -268,6 +268,20 @@ func (gui *Gui) layout(g *gocui.Gui) error {
}
}
if gui.getPushPassUnameView(g) == nil {
// doesn't matter where this view starts because it will be hidden
if pushPassUnameView, err := g.SetView("pushPassUname", 0, 0, width/2, height/2, 0); err != nil {
if err != gocui.ErrUnknownView {
return err
}
g.SetViewOnBottom("pushPassUname")
pushPassUnameView.Title = gui.Tr.SLocalize("PushUsername")
pushPassUnameView.FgColor = gocui.ColorWhite
pushPassUnameView.Editable = true
pushPassUnameView.Editor = gocui.EditorFunc(gui.simpleEditor)
}
}
if appStatusView, err := g.SetView("appStatus", -1, optionsTop, width, optionsTop+2, 0); err != nil {
if err != gocui.ErrUnknownView {
return err

View File

@ -372,6 +372,16 @@ func (gui *Gui) GetKeybindings() []*Binding {
Key: gocui.KeyEsc,
Modifier: gocui.ModNone,
Handler: gui.handleCommitClose,
}, {
ViewName: "pushPassUname",
Key: gocui.KeyEnter,
Modifier: gocui.ModNone,
Handler: gui.handlePushConfirm,
}, {
ViewName: "pushPassUname",
Key: gocui.KeyEsc,
Modifier: gocui.ModNone,
Handler: gui.handlePushClose,
}, {
ViewName: "menu",
Key: gocui.KeyEsc,

View File

@ -94,6 +94,8 @@ func (gui *Gui) newLineFocused(g *gocui.Gui, v *gocui.View) error {
return nil
case "commitMessage":
return gui.handleCommitFocused(g, v)
case "pushPassUname":
return gui.handlePushFocused(g, v)
case "main":
// TODO: pull this out into a 'view focused' function
gui.refreshMergePanel(g)
@ -288,6 +290,11 @@ func (gui *Gui) getCommitMessageView(g *gocui.Gui) *gocui.View {
return v
}
func (gui *Gui) getPushPassUnameView(g *gocui.Gui) *gocui.View {
v, _ := g.View("pushPassUname")
return v
}
func (gui *Gui) getBranchesView(g *gocui.Gui) *gocui.View {
v, _ := g.View("branches")
return v
@ -304,7 +311,7 @@ func (gui *Gui) currentViewName(g *gocui.Gui) string {
func (gui *Gui) resizeCurrentPopupPanel(g *gocui.Gui) error {
v := g.CurrentView()
if v.Name() == "commitMessage" || v.Name() == "confirmation" {
if v.Name() == "commitMessage" || v.Name() == "pushPassUname" || v.Name() == "confirmation" {
return gui.resizePopupPanel(g, v)
}
return nil