1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-06-06 23:46:13 +02:00

Merge branch 'master' into feature/use-dep

This commit is contained in:
Jesse Duffield 2018-08-06 19:11:53 +10:00
commit 15f982daae
7 changed files with 193 additions and 179 deletions

View File

@ -1,7 +1,8 @@
# lazygit
# lazygit [![Go Report Card](https://goreportcard.com/badge/github.com/jesseduffield/lazygit)](https://goreportcard.com/report/github.com/jesseduffield/lazygit)
A simple terminal UI for git commands, written in Go with the [gocui](https://github.com/jroimartin/gocui "gocui") library.
are YOU tired of typing every git command directly into the terminal, but you're too stubborn to use Sourcetree because you'll never forgive Atlassian for making Jira? This is the app for you!
Are YOU tired of typing every git command directly into the terminal, but you're too stubborn to use Sourcetree because you'll never forgive Atlassian for making Jira? This is the app for you!
[Tutorial](https://www.youtube.com/watch?v=VDXvbHZYeKY)
@ -10,11 +11,11 @@ are YOU tired of typing every git command directly into the terminal, but you're
## Installation
In a terminal call this command:
`go get github.com/jesseduffield/lazygit`
(if you don't have Go installed, you can follow the installation guide [Here](https://golang.org/doc/install)
(if you don't have Go installed, you can follow the installation guide [here](https://golang.org/doc/install).
then just call `lazygit` in your terminal inside a git repository
Then just call `lazygit` in your terminal inside a git repository.
If you want, you can also add an alias for this with `echo "alias lg='lazygit'" >> ~/.zshrc` (or whichever rc file you're using)
If you want, you can also add an alias for this with `echo "alias lg='lazygit'" >> ~/.zshrc` (or whichever rc file you're using).
## Cool features
- Adding files easily
@ -31,4 +32,4 @@ If you want, you can also add an alias for this with `echo "alias lg='lazygit'"
![Viewing Commit Diffs](https://image.ibb.co/gPD02o/capture.png)
## Work in progress
This is still a work in progress so there's still bugs to iron out and as this is my first project in Go the code could no doubt use an increase in quality, but I'll be improving on it whenever I find the time. If you have any feedback feel free to raise an issue/submit a PR.
This is still a work in progress so there's still bugs to iron out and as this is my first project in Go the code could no doubt use an increase in quality, but I'll be improving on it whenever I find the time. If you have any feedback feel free to [raise an issue](https://github.com/jesseduffield/lazygit/issues)/[submit a PR](https://github.com/jesseduffield/lazygit/pulls).

View File

@ -63,10 +63,11 @@ func createPromptPanel(g *gocui.Gui, currentView *gocui.View, title string, hand
return err
}
confirmationView.Editable = true
g.Cursor = true
confirmationView.Editable = true
confirmationView.Title = title
confirmationView.FgColor = gocui.ColorWhite
switchFocus(g, currentView, confirmationView)
return setKeyBindings(g, handleYes, nil)
}
@ -87,6 +88,7 @@ func createConfirmationPanel(g *gocui.Gui, currentView *gocui.View, title, promp
return err
}
confirmationView.Title = title
confirmationView.FgColor = gocui.ColorWhite
renderString(g, "confirmation", prompt)
switchFocus(g, currentView, confirmationView)
return setKeyBindings(g, handleYes, handleNo)
@ -101,10 +103,8 @@ func setKeyBindings(g *gocui.Gui, handleYes, handleNo func(*gocui.Gui, *gocui.Vi
if err := g.SetKeybinding("confirmation", gocui.KeyEnter, gocui.ModNone, wrappedConfirmationFunction(handleYes)); err != nil {
return err
}
if err := g.SetKeybinding("confirmation", gocui.KeyEsc, gocui.ModNone, wrappedConfirmationFunction(handleNo)); err != nil {
return err
}
return nil
return g.SetKeybinding("confirmation", gocui.KeyEsc, gocui.ModNone, wrappedConfirmationFunction(handleNo))
}
func createMessagePanel(g *gocui.Gui, currentView *gocui.View, title, prompt string) error {

View File

@ -59,11 +59,8 @@ func handleFilePress(g *gocui.Gui, v *gocui.View) error {
if err := refreshFiles(g); err != nil {
return err
}
if err := handleFileSelect(g, v); err != nil {
return err
}
return nil
return handleFileSelect(g, v)
}
func getSelectedFile(g *gocui.Gui) (GitFile, error) {
@ -163,8 +160,8 @@ func handleCommitPress(g *gocui.Gui, filesView *gocui.View) error {
if message == "" {
return createErrorPanel(g, "You cannot commit without a commit message")
}
if err := gitCommit(message); err != nil {
panic(err)
if output, err := gitCommit(message); err != nil {
return createErrorPanel(g, output)
}
refreshFiles(g)
return refreshCommits(g)
@ -180,8 +177,10 @@ func genericFileOpen(g *gocui.Gui, v *gocui.View, open func(string) (string, err
}
return nil
}
_, err = open(file.Name)
return err
if output, err := open(file.Name); err != nil {
return createErrorPanel(g, output)
}
return nil
}
func handleFileOpen(g *gocui.Gui, v *gocui.View) error {

View File

@ -119,8 +119,7 @@ func runDirectCommand(command string) (string, error) {
Command("bash", "-c", command).
CombinedOutput()
devLog("run direct command time for command: ", command, time.Now().Sub(timeStart))
return string(cmdOut), err
return sanitisedCommandOutput(cmdOut, err)
}
func branchStringParts(branchString string) (string, string) {
@ -299,13 +298,21 @@ func gitCheckout(branch string, force bool) (string, error) {
return runCommand("git checkout " + forceArg + branch)
}
func sanitisedCommandOutput(output []byte, err error) (string, error) {
outputString := string(output)
if outputString == "" && err != nil {
return err.Error(), err
}
return outputString, err
}
func runCommand(command string) (string, error) {
commandStartTime := time.Now()
commandLog(command)
splitCmd := strings.Split(command, " ")
cmdOut, err := exec.Command(splitCmd[0], splitCmd[1:]...).CombinedOutput()
devLog("run command time: ", time.Now().Sub(commandStartTime))
return string(cmdOut), err
return sanitisedCommandOutput(cmdOut, err)
}
func openFile(filename string) (string, error) {
@ -441,9 +448,8 @@ func removeFile(file GitFile) error {
return err
}
func gitCommit(message string) error {
_, err := runDirectCommand("git commit -m \"" + message + "\"")
return err
func gitCommit(message string) (string, error) {
return runDirectCommand("git commit -m \"" + message + "\"")
}
func gitPull() (string, error) {

28
gui.go
View File

@ -10,6 +10,7 @@ import (
"time"
// "strings"
"github.com/golang-collections/collections/stack"
"github.com/jesseduffield/gocui"
)
@ -124,6 +125,9 @@ func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("files", 's', gocui.ModNone, handleSublimeFileOpen); err != nil {
return err
}
if err := g.SetKeybinding("files", 'v', gocui.ModNone, handleVsCodeFileOpen); err != nil {
return err
}
if err := g.SetKeybinding("files", 'i', gocui.ModNone, handleIgnoreFile); err != nil {
return err
}
@ -193,15 +197,14 @@ func keybindings(g *gocui.Gui) error {
if err := g.SetKeybinding("stash", 'k', gocui.ModNone, handleStashPop); err != nil {
return err
}
if err := g.SetKeybinding("stash", 'd', gocui.ModNone, handleStashDrop); err != nil {
return err
}
return nil
return g.SetKeybinding("stash", 'd', gocui.ModNone, handleStashDrop)
}
func layout(g *gocui.Gui) error {
g.Highlight = true
g.SelFgColor = gocui.AttrBold
g.SelFgColor = gocui.ColorWhite | gocui.AttrBold
g.FgColor = gocui.ColorBlack
width, height := g.Size()
leftSideWidth := width / 3
statusFilesBoundary := 2
@ -225,10 +228,10 @@ func layout(g *gocui.Gui) error {
v.Wrap = true
}
return nil
} else {
g.DeleteView("limit")
}
g.DeleteView("limit")
optionsTop := height - 2
// hiding options if there's not enough space
if height < 30 {
@ -242,6 +245,7 @@ func layout(g *gocui.Gui) error {
}
v.Title = "Diff"
v.Wrap = true
v.FgColor = gocui.ColorWhite
}
if v, err := g.SetView("status", 0, 0, leftSideWidth, statusFilesBoundary, gocui.BOTTOM|gocui.RIGHT); err != nil {
@ -249,6 +253,7 @@ func layout(g *gocui.Gui) error {
return err
}
v.Title = "Status"
v.FgColor = gocui.ColorWhite
}
filesView, err := g.SetView("files", 0, statusFilesBoundary+panelSpacing, leftSideWidth, filesBranchesBoundary, gocui.TOP|gocui.BOTTOM)
@ -258,6 +263,7 @@ func layout(g *gocui.Gui) error {
}
filesView.Highlight = true
filesView.Title = "Files"
v.FgColor = gocui.ColorWhite
}
if v, err := g.SetView("branches", 0, filesBranchesBoundary+panelSpacing, leftSideWidth, commitsBranchesBoundary, gocui.TOP|gocui.BOTTOM); err != nil {
@ -265,7 +271,7 @@ func layout(g *gocui.Gui) error {
return err
}
v.Title = "Branches"
v.FgColor = gocui.ColorWhite
}
if v, err := g.SetView("commits", 0, commitsBranchesBoundary+panelSpacing, leftSideWidth, commitsStashBoundary, gocui.TOP|gocui.BOTTOM); err != nil {
@ -273,7 +279,7 @@ func layout(g *gocui.Gui) error {
return err
}
v.Title = "Commits"
v.FgColor = gocui.ColorWhite
}
if v, err := g.SetView("stash", 0, commitsStashBoundary+panelSpacing, leftSideWidth, optionsTop, gocui.TOP|gocui.RIGHT); err != nil {
@ -281,13 +287,15 @@ func layout(g *gocui.Gui) error {
return err
}
v.Title = "Stash"
v.FgColor = gocui.ColorWhite
}
if v, err := g.SetView("options", -1, optionsTop, width, optionsTop+2, 0); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.BgColor = gocui.ColorBlue
v.BgColor = gocui.ColorDefault
v.FgColor = gocui.ColorBlue
v.Frame = false
v.Title = "Options"