forked from lix-project/lix
Merge pull request #9233 from bouk/bouk/apply-config-inner
config: add included files into parsedContents before applying (cherry picked from commit82359eba6b
) Change-Id:Idde3177010fec7b8bafe6088c3c23d5caf491845
This commit is contained in:
parent
a2d5e803cf
commit
4018fcb9b8
|
@ -111,7 +111,14 @@ Settings::Settings()
|
||||||
|
|
||||||
void loadConfFile()
|
void loadConfFile()
|
||||||
{
|
{
|
||||||
globalConfig.applyConfigFile(settings.nixConfDir + "/nix.conf");
|
auto applyConfigFile = [&](const Path & path) {
|
||||||
|
try {
|
||||||
|
std::string contents = readFile(path);
|
||||||
|
globalConfig.applyConfig(contents, path);
|
||||||
|
} catch (SysError &) { }
|
||||||
|
};
|
||||||
|
|
||||||
|
applyConfigFile(settings.nixConfDir + "/nix.conf");
|
||||||
|
|
||||||
/* We only want to send overrides to the daemon, i.e. stuff from
|
/* We only want to send overrides to the daemon, i.e. stuff from
|
||||||
~/.nix/nix.conf or the command line. */
|
~/.nix/nix.conf or the command line. */
|
||||||
|
@ -119,7 +126,7 @@ void loadConfFile()
|
||||||
|
|
||||||
auto files = settings.nixUserConfFiles;
|
auto files = settings.nixUserConfFiles;
|
||||||
for (auto file = files.rbegin(); file != files.rend(); file++) {
|
for (auto file = files.rbegin(); file != files.rend(); file++) {
|
||||||
globalConfig.applyConfigFile(*file);
|
applyConfigFile(*file);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto nixConfEnv = getEnv("NIX_CONFIG");
|
auto nixConfEnv = getEnv("NIX_CONFIG");
|
||||||
|
|
|
@ -86,10 +86,9 @@ void Config::getSettings(std::map<std::string, SettingInfo> & res, bool overridd
|
||||||
res.emplace(opt.first, SettingInfo{opt.second.setting->to_string(), opt.second.setting->description});
|
res.emplace(opt.first, SettingInfo{opt.second.setting->to_string(), opt.second.setting->description});
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractConfig::applyConfig(const std::string & contents, const std::string & path) {
|
|
||||||
unsigned int pos = 0;
|
|
||||||
|
|
||||||
std::vector<std::pair<std::string, std::string>> parsedContents;
|
static void applyConfigInner(const std::string & contents, const std::string & path, std::vector<std::pair<std::string, std::string>> & parsedContents) {
|
||||||
|
unsigned int pos = 0;
|
||||||
|
|
||||||
while (pos < contents.size()) {
|
while (pos < contents.size()) {
|
||||||
std::string line;
|
std::string line;
|
||||||
|
@ -120,7 +119,12 @@ void AbstractConfig::applyConfig(const std::string & contents, const std::string
|
||||||
throw UsageError("illegal configuration line '%1%' in '%2%'", line, path);
|
throw UsageError("illegal configuration line '%1%' in '%2%'", line, path);
|
||||||
auto p = absPath(tokens[1], dirOf(path));
|
auto p = absPath(tokens[1], dirOf(path));
|
||||||
if (pathExists(p)) {
|
if (pathExists(p)) {
|
||||||
applyConfigFile(p);
|
try {
|
||||||
|
std::string includedContents = readFile(path);
|
||||||
|
applyConfigInner(includedContents, p, parsedContents);
|
||||||
|
} catch (SysError &) {
|
||||||
|
// TODO: Do we actually want to ignore this? Or is it better to fail?
|
||||||
|
}
|
||||||
} else if (!ignoreMissing) {
|
} else if (!ignoreMissing) {
|
||||||
throw Error("file '%1%' included from '%2%' not found", p, path);
|
throw Error("file '%1%' included from '%2%' not found", p, path);
|
||||||
}
|
}
|
||||||
|
@ -140,6 +144,12 @@ void AbstractConfig::applyConfig(const std::string & contents, const std::string
|
||||||
concatStringsSep(" ", Strings(i, tokens.end())),
|
concatStringsSep(" ", Strings(i, tokens.end())),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void AbstractConfig::applyConfig(const std::string & contents, const std::string & path) {
|
||||||
|
std::vector<std::pair<std::string, std::string>> parsedContents;
|
||||||
|
|
||||||
|
applyConfigInner(contents, path, parsedContents);
|
||||||
|
|
||||||
// First apply experimental-feature related settings
|
// First apply experimental-feature related settings
|
||||||
for (const auto & [name, value] : parsedContents)
|
for (const auto & [name, value] : parsedContents)
|
||||||
|
@ -152,14 +162,6 @@ void AbstractConfig::applyConfig(const std::string & contents, const std::string
|
||||||
set(name, value);
|
set(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractConfig::applyConfigFile(const Path & path)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
std::string contents = readFile(path);
|
|
||||||
applyConfig(contents, path);
|
|
||||||
} catch (SysError &) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
void Config::resetOverridden()
|
void Config::resetOverridden()
|
||||||
{
|
{
|
||||||
for (auto & s : _settings)
|
for (auto & s : _settings)
|
||||||
|
|
|
@ -82,12 +82,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void applyConfig(const std::string & contents, const std::string & path = "<unknown>");
|
void applyConfig(const std::string & contents, const std::string & path = "<unknown>");
|
||||||
|
|
||||||
/**
|
|
||||||
* Applies a nix configuration file
|
|
||||||
* - path: the location of the config file to apply
|
|
||||||
*/
|
|
||||||
void applyConfigFile(const Path & path);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets the `overridden` flag of all Settings
|
* Resets the `overridden` flag of all Settings
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -20,7 +20,7 @@ cat > "$NIX_CONF_DIR"/nix.conf <<EOF
|
||||||
build-users-group =
|
build-users-group =
|
||||||
keep-derivations = false
|
keep-derivations = false
|
||||||
sandbox = false
|
sandbox = false
|
||||||
experimental-features = nix-command flakes
|
experimental-features = nix-command
|
||||||
gc-reserved-space = 0
|
gc-reserved-space = 0
|
||||||
substituters =
|
substituters =
|
||||||
flake-registry = $TEST_ROOT/registry.json
|
flake-registry = $TEST_ROOT/registry.json
|
||||||
|
@ -31,6 +31,7 @@ EOF
|
||||||
|
|
||||||
cat > "$NIX_CONF_DIR"/nix.conf.extra <<EOF
|
cat > "$NIX_CONF_DIR"/nix.conf.extra <<EOF
|
||||||
fsync-metadata = false
|
fsync-metadata = false
|
||||||
|
extra-experimental-features = flakes
|
||||||
!include nix.conf.extra.not-there
|
!include nix.conf.extra.not-there
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue