summaryrefslogtreecommitdiffstats
path: root/main.go
blob: aa157c1080200fa5e31ae4aa19b4b9b78fd7ec4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package main

import (
	"errors"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"os/exec"
	"os/user"
	"path/filepath"

	"github.com/davecgh/go-spew/spew"

	"github.com/jesseduffield/gocui"
	"github.com/jesseduffield/lazygit/pkg/app"
	"github.com/jesseduffield/lazygit/pkg/config"
	git "gopkg.in/src-d/go-git.v4"
)

// ErrSubProcess is raised when we are running a subprocess
var (
	ErrSubprocess = errors.New("running subprocess")
	subprocess    *exec.Cmd

	commit  string
	version = "unversioned"
	date    string

	debuggingFlag = flag.Bool("debug", false, "a boolean")
	versionFlag   = flag.Bool("v", false, "Print the current version")

	w *git.Worktree
	r *git.Repository
)

func homeDirectory() string {
	usr, err := user.Current()
	if err != nil {
		log.Fatal(err)
	}
	return usr.HomeDir
}

func projectPath(path string) string {
	gopath := os.Getenv("GOPATH")
	return filepath.FromSlash(gopath + "/src/github.com/jesseduffield/lazygit/" + path)
}

func devLog(objects ...interface{}) {
	localLog("development.log", objects...)
}

func objectLog(object interface{}) {
	if !*debuggingFlag {
		return
	}
	str := spew.Sdump(object)
	localLog("development.log", str)
}

func commandLog(objects ...interface{}) {
	localLog("commands.log", objects...)
}

func localLog(path string, objects ...interface{}) {
	if !*debuggingFlag {
		return
	}
	f, err := os.OpenFile(projectPath(path), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
	if err != nil {
		panic(err.Error())
	}
	defer f.Close()
	log.SetOutput(f)
	for _, object := range objects {
		log.Println(fmt.Sprint(object))
	}
}

// when building the binary, `version` is set as a compile-time variable, along
// with `date` and `commit`. If this program has been opened directly via go,
// we will populate the `version` with VERSION in the lazygit root directory
func fallbackVersion() string {
	path := projectPath("VERSION")
	byteVersion, err := ioutil.ReadFile(path)
	if err != nil {
		return "unversioned"
	}
	return string(byteVersion)
}

func setupWorktree() {
	var err error
	r, err = git.PlainOpen(".")
	if err != nil {
		panic(err)
	}

	w, err = r.Worktree()
	if err != nil {
		panic(err)
	}
}

func main() {
	flag.Parse()
	if version == "unversioned" {
		version = fallbackVersion()
	}
	if *versionFlag {
		fmt.Printf("commit=%s, build date=%s, version=%s", commit, date, version)
		os.Exit(0)
	}
	appConfig := &config.AppConfig{
		Name:      "lazygit",
		Version:   version,
		Commit:    commit,
		BuildDate: date,
		Debug:     *debuggingFlag,
	}
	app, err := app.NewApp(appConfig)
	app.Log.Info(err)

	app.GitCommand.SetupGit()
	// TODO remove this once r, w not used
	setupWorktree()

	app.Gui.Run()

	for {
		if err := run(); err != nil {
			if err == gocui.ErrQuit {
				break
			} else if err == ErrSubprocess {
				subprocess.Run()
			} else {
				log.Panicln(err)
			}
		}
	}
}