aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/config.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-04 06:22:47 +0100
committereldritch horrors <pennae@lix.systems>2024-03-04 07:11:25 +0100
commit4018fcb9b8d622e7bac1310a689c90dac9109137 (patch)
treea1f1571a076242962b07449234b71b4c1e7c12d8 /src/libutil/config.cc
parenta2d5e803cf16e048f30f0334114759f81f6c5d20 (diff)
Merge pull request #9233 from bouk/bouk/apply-config-inner
config: add included files into parsedContents before applying (cherry picked from commit 82359eba6b692691ef08a71196ef25a61bc4d3d3) Change-Id: Idde3177010fec7b8bafe6088c3c23d5caf491845
Diffstat (limited to 'src/libutil/config.cc')
-rw-r--r--src/libutil/config.cc26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/libutil/config.cc b/src/libutil/config.cc
index 5748a93d7..2535b410f 100644
--- a/src/libutil/config.cc
+++ b/src/libutil/config.cc
@@ -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});
}
-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()) {
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);
auto p = absPath(tokens[1], dirOf(path));
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) {
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())),
});
};
+}
+
+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
for (const auto & [name, value] : parsedContents)
@@ -152,14 +162,6 @@ void AbstractConfig::applyConfig(const std::string & contents, const std::string
set(name, value);
}
-void AbstractConfig::applyConfigFile(const Path & path)
-{
- try {
- std::string contents = readFile(path);
- applyConfig(contents, path);
- } catch (SysError &) { }
-}
-
void Config::resetOverridden()
{
for (auto & s : _settings)