diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2019-02-11 21:02:53 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2019-02-11 21:02:53 +1100 |
commit | 3d343e9b574a2c99ebf5b30dc9a4dac2886f6d73 (patch) | |
tree | ef6b2f8c08a29349bcc56a16260dfefdb3ee872d /pkg/gui/gui.go | |
parent | a3656154906c1117f9c9bbe100aa585e43417897 (diff) | |
parent | 3a607061a2303d9f45d308de652fbebe7300b43c (diff) |
Merge branch 'master' into feature/rebasing
Diffstat (limited to 'pkg/gui/gui.go')
-rw-r--r-- | pkg/gui/gui.go | 98 |
1 files changed, 80 insertions, 18 deletions
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 2b6eccb5d..c33718937 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -1,6 +1,7 @@ package gui import ( + "sync" // "io" // "io/ioutil" @@ -15,6 +16,7 @@ import ( // "strings" + "github.com/fatih/color" "github.com/golang-collections/collections/stack" "github.com/jesseduffield/gocui" "github.com/jesseduffield/lazygit/pkg/commands" @@ -70,6 +72,8 @@ type Gui struct { Errors SentinelErrors Updater *updates.Updater statusManager *statusManager + credentials credentials + waitForIntro sync.WaitGroup } // for now the staging panel state, unlike the other panel states, is going to be @@ -356,6 +360,23 @@ func (gui *Gui) layout(g *gocui.Gui) error { } } + if check, _ := g.View("credentials"); check == nil { + // doesn't matter where this view starts because it will be hidden + if credentialsView, err := g.SetView("credentials", 0, 0, width/2, height/2, 0); err != nil { + if err != gocui.ErrUnknownView { + return err + } + _, err := g.SetViewOnBottom("credentials") + if err != nil { + return err + } + credentialsView.Title = gui.Tr.SLocalize("CredentialsUsername") + credentialsView.FgColor = gocui.ColorWhite + credentialsView.Editable = true + credentialsView.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 @@ -385,6 +406,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { if err := gui.updateRecentRepoList(); err != nil { return err } + gui.waitForIntro.Done() if _, err := gui.g.SetCurrentView(filesView.Name()); err != nil { return err @@ -419,35 +441,54 @@ func (gui *Gui) layout(g *gocui.Gui) error { // here is a good place log some stuff // if you download humanlog and do tail -f development.log | humanlog // this will let you see these branches as prettified json - // gui.Log.Info(utils.AsJson(gui.State.Files)) - + // gui.Log.Info(utils.AsJson(gui.State.Branches[0:4])) return gui.resizeCurrentPopupPanel(g) } func (gui *Gui) promptAnonymousReporting() error { return gui.createConfirmationPanel(gui.g, nil, gui.Tr.SLocalize("AnonymousReportingTitle"), gui.Tr.SLocalize("AnonymousReportingPrompt"), func(g *gocui.Gui, v *gocui.View) error { + gui.waitForIntro.Done() return gui.Config.WriteToUserConfig("reporting", "on") }, func(g *gocui.Gui, v *gocui.View) error { + gui.waitForIntro.Done() return gui.Config.WriteToUserConfig("reporting", "off") }) } -func (gui *Gui) fetch() error { - gui.GitCommand.Fetch() - gui.refreshStatus(gui.g) - return nil +func (gui *Gui) fetch(g *gocui.Gui, v *gocui.View, canAskForCredentials bool) (unamePassOpend bool, err error) { + unamePassOpend = false + err = gui.GitCommand.Fetch(func(passOrUname string) string { + unamePassOpend = true + return gui.waitForPassUname(gui.g, v, passOrUname) + }, canAskForCredentials) + + if canAskForCredentials && err != nil && strings.Contains(err.Error(), "exit status 128") { + colorFunction := color.New(color.FgRed).SprintFunc() + coloredMessage := colorFunction(strings.TrimSpace(gui.Tr.SLocalize("PassUnameWrong"))) + close := func(g *gocui.Gui, v *gocui.View) error { + return nil + } + _ = gui.createConfirmationPanel(g, v, gui.Tr.SLocalize("Error"), coloredMessage, close, close) + } + + gui.refreshStatus(g) + return unamePassOpend, err } -func (gui *Gui) updateLoader() error { - if view, _ := gui.g.View("confirmation"); view != nil { - content := gui.trimmedContent(view) - if strings.Contains(content, "...") { - staticContent := strings.Split(content, "...")[0] + "..." - if err := gui.renderString(gui.g, "confirmation", staticContent+" "+utils.Loader()); err != nil { - return err +func (gui *Gui) updateLoader(g *gocui.Gui) error { + gui.g.Update(func(g *gocui.Gui) error { + if view, _ := g.View("confirmation"); view != nil { + content := gui.trimmedContent(view) + if strings.Contains(content, "...") { + staticContent := strings.Split(content, "...")[0] + "..." + if err := gui.setViewContent(g, view, staticContent+" "+utils.Loader()); err != nil { + return err + } } } - } + return nil + }) + return nil } @@ -490,10 +531,31 @@ func (gui *Gui) Run() error { return err } - gui.goEvery(time.Second*60, gui.fetch) - gui.goEvery(time.Second*2, gui.refreshFiles) - gui.goEvery(time.Millisecond*50, gui.updateLoader) - gui.goEvery(time.Millisecond*50, gui.renderAppStatus) + if gui.Config.GetUserConfig().GetString("reporting") == "undetermined" { + gui.waitForIntro.Add(2) + } else { + gui.waitForIntro.Add(1) + } + + go func() { + gui.waitForIntro.Wait() + isNew := gui.Config.GetIsNewRepo() + if !isNew { + time.After(60 * time.Second) + } + _, err := gui.fetch(g, g.CurrentView(), false) + if err != nil && strings.Contains(err.Error(), "exit status 128") && isNew { + _ = gui.createConfirmationPanel(g, g.CurrentView(), gui.Tr.SLocalize("NoAutomaticGitFetchTitle"), gui.Tr.SLocalize("NoAutomaticGitFetchBody"), nil, nil) + } else { + gui.goEvery(g, time.Second*60, func(g *gocui.Gui) error { + _, err := gui.fetch(g, g.CurrentView(), false) + return err + }) + } + }() + gui.goEvery(g, time.Second*10, gui.refreshFiles) + gui.goEvery(g, time.Millisecond*50, gui.updateLoader) + gui.goEvery(g, time.Millisecond*50, gui.renderAppStatus) g.SetManagerFunc(gui.layout) |