summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2018-08-18 13:22:05 +1000
committerJesse Duffield <jessedduffield@gmail.com>2018-08-18 13:22:05 +1000
commit10fdb5a609f8edcb426f01611179718235c4d4a0 (patch)
treef6bd13d729982b587da548cb3f043987ee65b514
parent4dc6d40b5a2d7b7ba882c92f3c62b7122fcd849d (diff)
support writing back to user config
-rw-r--r--pkg/app/app.go2
-rw-r--r--pkg/config/app_config.go68
-rw-r--r--pkg/gui/gui.go23
3 files changed, 65 insertions, 28 deletions
diff --git a/pkg/app/app.go b/pkg/app/app.go
index e18a98dc4..98da0b0fa 100644
--- a/pkg/app/app.go
+++ b/pkg/app/app.go
@@ -60,7 +60,7 @@ func NewApp(config config.AppConfigurer) (*App, error) {
if err != nil {
return nil, err
}
- app.Gui, err = gui.NewGui(app.Log, app.GitCommand, app.OSCommand, app.Tr, config.GetUserConfig(), config.GetVersion())
+ app.Gui, err = gui.NewGui(app.Log, app.GitCommand, app.OSCommand, app.Tr, config)
if err != nil {
return nil, err
}
diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go
index f34848123..c9ab1b1d0 100644
--- a/pkg/config/app_config.go
+++ b/pkg/config/app_config.go
@@ -28,6 +28,7 @@ type AppConfigurer interface {
GetBuildDate() string
GetName() string
GetUserConfig() *viper.Viper
+ InsertToUserConfig(string, string) error
}
// NewAppConfig makes a new app config
@@ -78,31 +79,70 @@ func (c *AppConfig) GetUserConfig() *viper.Viper {
return c.UserConfig
}
-// LoadUserConfig gets the user's config
-func LoadUserConfig() (*viper.Viper, error) {
+func newViper() (*viper.Viper, error) {
v := viper.New()
v.SetConfigType("yaml")
- defaults := getDefaultConfig()
- err := v.ReadConfig(bytes.NewBuffer(defaults))
+ v.SetConfigName("config")
+ return v, nil
+}
+
+// LoadUserConfig gets the user's config
+func LoadUserConfig() (*viper.Viper, error) {
+ v, err := newViper()
if err != nil {
+ panic(err)
+ }
+ if err = LoadDefaultConfig(v); err != nil {
return nil, err
}
- v.SetConfigName("config")
+ if err = LoadUserConfigFromFile(v); err != nil {
+ return nil, err
+ }
+ return v, nil
+}
+// LoadDefaultConfig loads in the defaults defined in this file
+func LoadDefaultConfig(v *viper.Viper) error {
+ defaults := getDefaultConfig()
+ return v.ReadConfig(bytes.NewBuffer(defaults))
+}
+
+// LoadUserConfigFromFile Loads the user config from their config file, creating
+// the file as an empty config if it does not exist
+func LoadUserConfigFromFile(v *viper.Viper) error {
// chucking my name there is not for vanity purposes, the xdg spec (and that
// function) requires a vendor name. May as well line up with github
configDirs := configdir.New("jesseduffield", "lazygit")
folder := configDirs.QueryFolderContainsFile("config.yml")
- if folder != nil {
- configData, err := folder.ReadFile("config.yml")
- if err != nil {
- return nil, err
- }
- if err = v.MergeConfig(bytes.NewReader(configData)); err != nil {
- return nil, err
- }
+ if folder == nil {
+ // create the file as an empty config and load it
+ folders := configDirs.QueryFolders(configdir.Global)
+ folders[0].WriteFile("config.yml", []byte{})
+ folder = configDirs.QueryFolderContainsFile("config.yml")
}
- return v, nil
+ v.AddConfigPath(folder.Path)
+ if err := v.MergeInConfig(); err != nil {
+ return err
+ }
+ return nil
+}
+
+// InsertToUserConfig adds a key/value pair to the user's config and saves it
+func (c *AppConfig) InsertToUserConfig(key, value string) error {
+ // making a new viper object so that we're not writing any defaults back
+ // to the user's config file
+ v, err := newViper()
+ if err != nil {
+ return err
+ }
+ if err = LoadUserConfigFromFile(v); err != nil {
+ return err
+ }
+ v.Set(key, value)
+ if err := v.WriteConfig(); err != nil {
+ return err
+ }
+ return nil
}
func getDefaultConfig() []byte {
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go
index 71bfdbc48..21a7f5ebc 100644
--- a/pkg/gui/gui.go
+++ b/pkg/gui/gui.go
@@ -19,8 +19,8 @@ import (
"github.com/golang-collections/collections/stack"
"github.com/jesseduffield/gocui"
"github.com/jesseduffield/lazygit/pkg/commands"
+ "github.com/jesseduffield/lazygit/pkg/config"
"github.com/jesseduffield/lazygit/pkg/i18n"
- "github.com/spf13/viper"
)
// OverlappingEdges determines if panel edges overlap
@@ -59,10 +59,9 @@ type Gui struct {
Log *logrus.Logger
GitCommand *commands.GitCommand
OSCommand *commands.OSCommand
- Version string
SubProcess *exec.Cmd
State guiState
- Config *viper.Viper
+ Config config.AppConfigurer
Tr *i18n.Localizer
Errors SentinelErrors
}
@@ -79,11 +78,10 @@ type guiState struct {
Conflicts []commands.Conflict
EditHistory *stack.Stack
Platform commands.Platform
- Version string
}
// NewGui builds a new gui handler
-func NewGui(log *logrus.Logger, gitCommand *commands.GitCommand, oSCommand *commands.OSCommand, tr *i18n.Localizer, userConfig *viper.Viper, version string) (*Gui, error) {
+func NewGui(log *logrus.Logger, gitCommand *commands.GitCommand, oSCommand *commands.OSCommand, tr *i18n.Localizer, config config.AppConfigurer) (*Gui, error) {
initialState := guiState{
Files: make([]commands.File, 0),
PreviousView: "files",
@@ -94,16 +92,14 @@ func NewGui(log *logrus.Logger, gitCommand *commands.GitCommand, oSCommand *comm
Conflicts: make([]commands.Conflict, 0),
EditHistory: stack.New(),
Platform: *oSCommand.Platform,
- Version: version,
}
gui := &Gui{
Log: log,
GitCommand: gitCommand,
OSCommand: oSCommand,
- Version: version,
State: initialState,
- Config: userConfig,
+ Config: config,
Tr: tr,
}
@@ -116,7 +112,7 @@ func (gui *Gui) scrollUpMain(g *gocui.Gui, v *gocui.View) error {
mainView, _ := g.View("main")
ox, oy := mainView.Origin()
if oy >= 1 {
- return mainView.SetOrigin(ox, oy-gui.Config.GetInt("gui.scrollHeight"))
+ return mainView.SetOrigin(ox, oy-gui.Config.GetUserConfig().GetInt("gui.scrollHeight"))
}
return nil
}
@@ -125,7 +121,7 @@ func (gui *Gui) scrollDownMain(g *gocui.Gui, v *gocui.View) error {
mainView, _ := g.View("main")
ox, oy := mainView.Origin()
if oy < len(mainView.BufferLines()) {
- return mainView.SetOrigin(ox, oy+gui.Config.GetInt("gui.scrollHeight"))
+ return mainView.SetOrigin(ox, oy+gui.Config.GetUserConfig().GetInt("gui.scrollHeight"))
}
return nil
}
@@ -153,6 +149,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
commitsStashBoundary := height - 5 // height - 5
minimumHeight := 16
minimumWidth := 10
+ version := gui.Config.GetVersion()
panelSpacing := 1
if OverlappingEdges {
@@ -231,7 +228,7 @@ func (gui *Gui) layout(g *gocui.Gui) error {
v.FgColor = gocui.ColorWhite
}
- if v, err := g.SetView("options", -1, optionsTop, width-len(gui.Version)-2, optionsTop+2, 0); err != nil {
+ if v, err := g.SetView("options", -1, optionsTop, width-len(version)-2, optionsTop+2, 0); err != nil {
if err != gocui.ErrUnknownView {
return err
}
@@ -252,14 +249,14 @@ func (gui *Gui) layout(g *gocui.Gui) error {
}
}
- if v, err := g.SetView("version", width-len(gui.Version)-1, optionsTop, width, optionsTop+2, 0); err != nil {
+ if v, err := g.SetView("version", width-len(version)-1, optionsTop, width, optionsTop+2, 0); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.BgColor = gocui.ColorDefault
v.FgColor = gocui.ColorGreen
v.Frame = false
- gui.renderString(g, "version", gui.Version)
+ gui.renderString(g, "version", version)
// these are only called once
gui.handleFileSelect(g, filesView)