1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-01-20 05:19:24 +02:00

initial commit

This commit is contained in:
Jesse Duffield 2018-05-19 11:16:34 +10:00
parent bcd5e65878
commit 023a39a903
3 changed files with 159 additions and 0 deletions

96
gitcommands.go Normal file
View File

@ -0,0 +1,96 @@
// Go has various value types including strings,
// integers, floats, booleans, etc. Here are a few
// basic examples.
package gitgot
import (
"fmt"
// "log"
"os/exec"
"os"
"strings"
"regexp"
"runtime"
)
// Map (from https://gobyexample.com/collection-functions)
func Map(vs []string, f func(string) string) []string {
vsm := make([]string, len(vs))
for i, v := range vs {
vsm[i] = f(v)
}
return vsm
}
func sanitisedFileString(fileString string) string {
r := regexp.MustCompile("\\s| \\(new commits\\)|.* ")
fileString = r.ReplaceAllString(fileString, "")
return fileString
}
func filesByMatches(statusString string, targets []string) []string {
files := make([]string, 0)
for _, target := range targets {
if strings.Index(statusString, target) == -1 {
continue
}
r := regexp.MustCompile("(?s)" + target + ".*?\n\n(.*?)\n\n")
// fmt.Println(r)
matchedFileStrings := strings.Split(r.FindStringSubmatch(statusString)[1], "\n")
// fmt.Println(matchedFileStrings)
matchedFiles := Map(matchedFileStrings, sanitisedFileString)
// fmt.Println(matchedFiles)
files = append(files, matchedFiles...)
}
breakHere()
// fmt.Println(files)
return files
}
func breakHere() {
if len(os.Args) > 1 && os.Args[1] == "debug" {
runtime.Breakpoint()
}
}
func filesToStage(statusString string) []string {
targets := []string{"Changes not staged for commit:", "Untracked files:"}
return filesByMatches(statusString, targets)
}
func filesToUnstage(statusString string) []string {
targets := []string{"Changes to be committed:"}
return filesByMatches(statusString, targets)
}
func runCommand(cmd string) (string, error) {
splitCmd := strings.Split(cmd, " ")
// fmt.Println(splitCmd)
cmdOut, err := exec.Command(splitCmd[0], splitCmd[1:]...).Output()
// if err != nil {
// os.Exit(1)
// }
return string(cmdOut), err
}
func testGettingFiles() {
statusString, _ := runCommand("git status")
fmt.Println(filesToStage(statusString))
fmt.Println(filesToUnstage(statusString))
runCommand("git add hello-world.go")
}

52
gui.go Normal file
View File

@ -0,0 +1,52 @@
package gitgot
import (
"fmt"
"log"
"github.com/jroimartin/gocui"
)
func main() {
g, err := gocui.NewGui(gocui.OutputNormal)
if err != nil {
log.Panicln(err)
}
defer g.Close()
g.SetManagerFunc(layout)
if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
log.Panicln(err)
}
if err := g.SetKeybinding("", 'a', gocui.ModNone, quit); err != nil {
log.Panicln(err)
}
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
log.Panicln(err)
}
}
func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()
if v, err := g.SetView("hello", maxX/2-7, maxY/2, maxX/2+7, maxY/2+2); err != nil {
if err != gocui.ErrUnknownView {
return err
}
fmt.Fprintln(v, "Hello world!")
}
if v2, err := g.SetView("hello2", maxX/2-7, maxY/2, maxX/2+7, maxY/2+2); err != nil {
if err != gocui.ErrUnknownView {
return err
}
fmt.Fprintln(v2, "Hello world 2!")
}
return nil
}
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}

11
main.go Normal file
View File

@ -0,0 +1,11 @@
package main
import (
"./gitgot"
)
func main() {
testGettingFiles()
}