From 2c0520bc4bb34e40ab4b52a8178e62b7ae609f60 Mon Sep 17 00:00:00 2001 From: Ching Pei Yang Date: Tue, 15 Aug 2023 01:36:46 +0200 Subject: Use $XDG_STATE_DIR for state.yml --- pkg/config/app_config.go | 64 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index b5c10f1a0..b9b3eed2c 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -113,21 +113,9 @@ func isCustomConfigFile(path string) bool { } func ConfigDir() string { - legacyConfigDirectory := configDirForVendor("jesseduffield") - if _, err := os.Stat(legacyConfigDirectory); !os.IsNotExist(err) { - return legacyConfigDirectory - } - configDirectory := configDirForVendor("") - return configDirectory -} + _, filePath := findConfigFile("config.yml") -func configDirForVendor(vendor string) string { - envConfigDir := os.Getenv("CONFIG_DIR") - if envConfigDir != "" { - return envConfigDir - } - configDirs := xdg.New(vendor, "lazygit") - return configDirs.ConfigHome() + return filepath.Dir(filePath) } func findOrCreateConfigDir() (string, error) { @@ -256,16 +244,50 @@ func (c *AppConfig) GetTempDir() string { } func configFilePath(filename string) (string, error) { - folder, err := findOrCreateConfigDir() - if err != nil { - return "", err + exists, path := findConfigFile(filename) + + if exists { + return path, nil + } + return path, os.MkdirAll(filepath.Dir(path), 0o755) +} + +// findConfigFile looks for a possibly existing config file. +// This function does NOT create any folders or files. +func findConfigFile(filename string) (exists bool, path string) { + if envConfigDir := os.Getenv("CONFIG_DIR"); envConfigDir != "" { + return true, filepath.Join(envConfigDir, filename) } - return filepath.Join(folder, filename), nil + // look for jesseduffield/lazygit/filename in XDG_CONFIG_HOME and XDG_CONFIG_DIRS + legacyConfigPath, err := xdg.SearchConfigFile(filepath.Join("jesseduffield", "lazygit", filename)) + if err == nil { + return true, legacyConfigPath + } + + // look for lazygit/filename in XDG_CONFIG_HOME and XDG_CONFIG_DIRS + configFilepath, err := xdg.SearchConfigFile(filepath.Join("lazygit", filename)) + if err == nil { + return true, configFilepath + } + + return false, filepath.Join(xdg.ConfigHome, "lazygit", filename) } var ConfigFilename = "config.yml" +// stateFilePath looks for a possibly existing state file. +// if none exist, the default path is returned and all parent directories are created. +func stateFilePath(filename string) (string, error) { + exists, legacyStateFile := findConfigFile(filename) + if exists { + return legacyStateFile, nil + } + + // looks for XDG_STATE_HOME/lazygit/filename + return xdg.StateFile(filepath.Join("lazygit", filename)) +} + // ConfigFilename returns the filename of the default config file func (c *AppConfig) ConfigFilename() string { return filepath.Join(c.UserConfigDir, ConfigFilename) @@ -278,7 +300,7 @@ func (c *AppConfig) SaveAppState() error { return err } - filepath, err := configFilePath("state.yml") + filepath, err := stateFilePath(stateFileName) if err != nil { return err } @@ -292,11 +314,13 @@ func (c *AppConfig) SaveAppState() error { return err } +var stateFileName = "state.yml" + // loadAppState loads recorded AppState from file func loadAppState() (*AppState, error) { appState := getDefaultAppState() - filepath, err := configFilePath("state.yml") + filepath, err := stateFilePath(stateFileName) if err != nil { if os.IsPermission(err) { // apparently when people have read-only permissions they prefer us to fail silently -- cgit v1.2.3