config: use all of XDG_CONFIG_DIRS

Previously, config would only be read from XDG_CONFIG_HOME. This change
allows reading config from additional directories, which enables e.g.
per-project binary caches or chroot stores with the help of direnv.
This commit is contained in:
Linus Heckemann 2018-10-25 13:00:21 +02:00
parent 7a9ac91a43
commit f3b8173a93
3 changed files with 17 additions and 1 deletions

View file

@ -78,7 +78,11 @@ void loadConfFile()
~/.nix/nix.conf or the command line. */ ~/.nix/nix.conf or the command line. */
globalConfig.resetOverriden(); globalConfig.resetOverriden();
globalConfig.applyConfigFile(getConfigDir() + "/nix/nix.conf"); auto dirs = getConfigDirs();
// Iterate over them in reverse so that the ones appearing first in the path take priority
for (auto dir = dirs.rbegin(); dir != dirs.rend(); dir++) {
globalConfig.applyConfigFile(*dir + "/nix/nix.conf");
}
} }
unsigned int Settings::getDefaultCores() unsigned int Settings::getDefaultCores()

View file

@ -496,6 +496,15 @@ Path getConfigDir()
return configDir; return configDir;
} }
std::vector<Path> getConfigDirs()
{
Path configHome = getConfigDir();
string configDirs = getEnv("XDG_CONFIG_DIRS");
std::vector<Path> result = tokenizeString<std::vector<string>>(configDirs, ":");
result.insert(result.begin(), configHome);
return result;
}
Path getDataDir() Path getDataDir()
{ {

View file

@ -131,6 +131,9 @@ Path getCacheDir();
/* Return $XDG_CONFIG_HOME or $HOME/.config. */ /* Return $XDG_CONFIG_HOME or $HOME/.config. */
Path getConfigDir(); Path getConfigDir();
/* Return the directories to search for user configuration files */
std::vector<Path> getConfigDirs();
/* Return $XDG_DATA_HOME or $HOME/.local/share. */ /* Return $XDG_DATA_HOME or $HOME/.local/share. */
Path getDataDir(); Path getDataDir();