diff --git a/docs/Config.md b/docs/Config.md index 92e63db58..bc09575bb 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -265,10 +265,19 @@ os: `{{editor}}` in `editCommandTemplate` is replaced with the value of `editCommand`. -### Change config file used +### Overriding default config file location -- Use `--config-file=~/.base_lg_conf,~/.light_theme_lg_conf` or `$LG_CONFIG_FILE="~/.base_lg_conf,~/.light_theme_lg_conf"` -- Change the default config directory `$CONFIG_DIR="~/.config/lazygit"` +To override the default config directory, use `$CONFIG_DIR="~/.config/lazygit"`. This directory contains the config file in addition to some other files lazygit uses to keep track of state across sessions. + +To override the individual config file used, use the `--use-config-file` arg or the `LG_CONFIG_FILE` env var. + +If you want to merge a specific config file into a more general config file, perhaps for the sake of setting some theme-specific options, you can supply a list of comma-separated config file paths, like so: + +```sh +lazygit --use-config-file=~/.base_lg_conf,~/.light_theme_lg_conf +or +LG_CONFIG_FILE="~/.base_lg_conf,~/.light_theme_lg_conf" lazygit +``` ### Recommended Config Values diff --git a/main.go b/main.go index 02088b5bd..0b6a97e64 100644 --- a/main.go +++ b/main.go @@ -62,7 +62,7 @@ func main() { flaggy.String(&gitDir, "g", "git-dir", "equivalent of the --git-dir git argument") customConfig := "" - flaggy.String(&customConfig, "cf", "config-file", "Comma seperated list to custom config file(s)") + flaggy.String(&customConfig, "ucf", "use-config-file", "Comma seperated list to custom config file(s)") flaggy.Parse() diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index dc866e253..03807a3ce 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -57,19 +57,16 @@ func NewAppConfig(name, version, commit, date string, buildSource string, debugg } var userConfigFiles []string - - userConfigFilesOverwrite := os.Getenv("LG_CONFIG_FILE") - deafultConfFiles := true - if userConfigFilesOverwrite != "" { + customConfigFiles := os.Getenv("LG_CONFIG_FILE") + if customConfigFiles != "" { // Load user defined config files - userConfigFiles = strings.Split(userConfigFilesOverwrite, ",") - deafultConfFiles = false + userConfigFiles = strings.Split(customConfigFiles, ",") } else { // Load default config files userConfigFiles = []string{filepath.Join(configDir, ConfigFilename)} } - userConfig, err := loadUserConfigWithDefaults(userConfigFiles, deafultConfFiles) + userConfig, err := loadUserConfigWithDefaults(userConfigFiles) if err != nil { return nil, err } @@ -86,25 +83,28 @@ func NewAppConfig(name, version, commit, date string, buildSource string, debugg } appConfig := &AppConfig{ - Name: "lazygit", - Version: version, - Commit: commit, - BuildDate: date, - Debug: debuggingFlag, - BuildSource: buildSource, - UserConfig: userConfig, - UserConfigFiles: userConfigFiles, - UserConfigDir: configDir, - DeafultConfFiles: deafultConfFiles, - UserConfigPath: filepath.Join(configDir, "config.yml"), - TempDir: tempDir, - AppState: appState, - IsNewRepo: false, + Name: "lazygit", + Version: version, + Commit: commit, + BuildDate: date, + Debug: debuggingFlag, + BuildSource: buildSource, + UserConfig: userConfig, + UserConfigFiles: userConfigFiles, + UserConfigDir: configDir, + UserConfigPath: filepath.Join(configDir, "config.yml"), + TempDir: tempDir, + AppState: appState, + IsNewRepo: false, } return appConfig, nil } +func isCustomConfigFile(path string) bool { + return path != filepath.Join(ConfigDir(), ConfigFilename) +} + func ConfigDir() string { legacyConfigDirectory := configDirForVendor("jesseduffield") if _, err := os.Stat(legacyConfigDirectory); !os.IsNotExist(err) { @@ -128,37 +128,39 @@ func findOrCreateConfigDir() (string, error) { return folder, os.MkdirAll(folder, 0755) } -func loadUserConfigWithDefaults(configFiles []string, deafultConfFiles bool) (*UserConfig, error) { - return loadUserConfig(configFiles, GetDefaultConfig(), deafultConfFiles) +func loadUserConfigWithDefaults(configFiles []string) (*UserConfig, error) { + return loadUserConfig(configFiles, GetDefaultConfig()) } -func loadUserConfig(configFiles []string, base *UserConfig, deafultConfFiles bool) (*UserConfig, error) { - for _, fileName := range configFiles { - content, readConfFileErr := ioutil.ReadFile(fileName) - if readConfFileErr != nil { - if !deafultConfFiles { - return nil, readConfFileErr - } - - _, err := os.Stat(fileName) - if err == nil { - return nil, readConfFileErr - } +func loadUserConfig(configFiles []string, base *UserConfig) (*UserConfig, error) { + for _, path := range configFiles { + if _, err := os.Stat(path); err != nil { if !os.IsNotExist(err) { - return nil, readConfFileErr + return nil, err } - file, err := os.Create(fileName) + // if use has supplied their own custom config file path(s), we assume + // the files have already been created, so we won't go and create them here. + if isCustomConfigFile(path) { + return nil, err + } + + file, err := os.Create(path) if err != nil { if os.IsPermission(err) { + // apparently when people have read-only permissions they prefer us to fail silently continue - } else { - return nil, readConfFileErr } + return nil, err } file.Close() } + content, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + if err := yaml.Unmarshal(content, base); err != nil { return nil, err } @@ -231,7 +233,7 @@ func (c *AppConfig) GetTempDir() string { } func (c *AppConfig) ReloadUserConfig() error { - userConfig, err := loadUserConfigWithDefaults(c.UserConfigFiles, c.DeafultConfFiles) + userConfig, err := loadUserConfigWithDefaults(c.UserConfigFiles) if err != nil { return err } @@ -268,7 +270,13 @@ func (c *AppConfig) SaveAppState() error { return err } - return ioutil.WriteFile(filepath, marshalledAppState, 0644) + err = ioutil.WriteFile(filepath, marshalledAppState, 0644) + if err != nil && os.IsPermission(err) { + // apparently when people have read-only permissions they prefer us to fail silently + return nil + } + + return err } // loadAppState loads recorded AppState from file diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 80131f00d..95c165a71 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -656,11 +656,7 @@ func (gui *Gui) showIntroPopupMessage(done chan struct{}) error { onConfirm := func() error { done <- struct{}{} gui.Config.GetAppState().StartupPopupVersion = StartupPopupVersion - err := gui.Config.SaveAppState() - if err != nil && os.IsPermission(err) { - return nil - } - return err + return gui.Config.SaveAppState() } return gui.ask(askOpts{ diff --git a/pkg/gui/recent_repos_panel.go b/pkg/gui/recent_repos_panel.go index f82b2838a..d1ac4ea30 100644 --- a/pkg/gui/recent_repos_panel.go +++ b/pkg/gui/recent_repos_panel.go @@ -114,11 +114,7 @@ func (gui *Gui) updateRecentRepoList() error { known, recentRepos := newRecentReposList(recentRepos, currentRepo) gui.Config.SetIsNewRepo(known) gui.Config.GetAppState().RecentRepos = recentRepos - err = gui.Config.SaveAppState() - if err != nil && os.IsPermission(err) { - return nil - } - return err + return gui.Config.SaveAppState() } // newRecentReposList returns a new repo list with a new entry but only when it doesn't exist yet diff --git a/pkg/gui/status_panel.go b/pkg/gui/status_panel.go index 2800a6bf2..84eb8af52 100644 --- a/pkg/gui/status_panel.go +++ b/pkg/gui/status_panel.go @@ -119,7 +119,7 @@ func (gui *Gui) askForConfigFile(action func(file string) error) error { confFiles := gui.Config.GetUserConfigFiles() switch len(confFiles) { case 0: - return errors.New("no config file found") + return errors.New(gui.Tr.NoConfigFileFoundErr) case 1: return action(confFiles[0]) default: @@ -133,20 +133,16 @@ func (gui *Gui) askForConfigFile(action func(file string) error) error { }, } } - return gui.createMenu("select config file", menuItems, createMenuOptions{}) + return gui.createMenu(gui.Tr.SelectConfigFile, menuItems, createMenuOptions{}) } } func (gui *Gui) handleOpenConfig() error { - return gui.askForConfigFile(func(file string) error { - return gui.openFile(file) - }) + return gui.askForConfigFile(gui.openFile) } func (gui *Gui) handleEditConfig() error { - return gui.askForConfigFile(func(file string) error { - return gui.editFile(file) - }) + return gui.askForConfigFile(gui.editFile) } func lazygitTitle() string { diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 5a88ba396..8e1ac9647 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -427,6 +427,8 @@ type TranslationSet struct { LcSelectBranch string CreatePullRequest string CreatingPullRequestAtUrl string + SelectConfigFile string + NoConfigFileFoundErr string Spans Spans } @@ -947,6 +949,8 @@ func englishTranslationSet() TranslationSet { LcDefaultBranch: "default branch", LcSelectBranch: "select branch", CreatingPullRequestAtUrl: "Creating pull request at URL: %s", + SelectConfigFile: "Select config file", + NoConfigFileFoundErr: "No config file found", Spans: Spans{ // TODO: combine this with the original keybinding descriptions (those are all in lowercase atm) CheckoutCommit: "Checkout commit", diff --git a/pkg/updates/updates.go b/pkg/updates/updates.go index a190fdb2c..cb5a64788 100644 --- a/pkg/updates/updates.go +++ b/pkg/updates/updates.go @@ -76,11 +76,7 @@ func (u *Updater) getLatestVersionNumber() (string, error) { // RecordLastUpdateCheck records last time an update check was performed func (u *Updater) RecordLastUpdateCheck() error { u.Config.GetAppState().LastUpdateCheck = time.Now().Unix() - err := u.Config.SaveAppState() - if err != nil && os.IsPermission(err) { - return nil - } - return err + return u.Config.SaveAppState() } // expecting version to be of the form `v12.34.56`