about summary refs log tree commit diff
path: root/src/libutil
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2018-02-13T13·16-0500
committerShea Levy <shea@shealevy.com>2018-02-13T13·16-0500
commit6eb1040e909ab83fbc03983724d9c6ec223c4495 (patch)
tree979e10a32a8d7c82afce42abd9286e1efba53688 /src/libutil
parentf471aacff213047390951620f5f9799dc745f167 (diff)
Allow includes from nix.conf
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/config.cc26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/libutil/config.cc b/src/libutil/config.cc
index d46ca65a38..0e502769ed 100644
--- a/src/libutil/config.cc
+++ b/src/libutil/config.cc
@@ -80,7 +80,31 @@ void Config::applyConfigFile(const Path & path, bool fatal)
             vector<string> tokens = tokenizeString<vector<string> >(line);
             if (tokens.empty()) continue;
 
-            if (tokens.size() < 2 || tokens[1] != "=")
+            if (tokens.size() < 2)
+                throw UsageError("illegal configuration line '%1%' in '%2%'", line, path);
+
+            auto include = false;
+            auto ignoreMissing = false;
+            if (tokens[0] == "include")
+                include = true;
+            else if (tokens[0] == "!include") {
+                include = true;
+                ignoreMissing = true;
+            }
+
+            if (include) {
+                if (tokens.size() != 2)
+                    throw UsageError("illegal configuration line '%1%' in '%2%'", line, path);
+                auto p = absPath(tokens[1], dirOf(path));
+                if (pathExists(p)) {
+                    applyConfigFile(p, fatal);
+                } else if (!ignoreMissing) {
+                    throw Error("file '%1%' included from '%2%' not found", p, path);
+                }
+                continue;
+            }
+
+            if (tokens[1] != "=")
                 throw UsageError("illegal configuration line '%1%' in '%2%'", line, path);
 
             string name = tokens[0];