config/File: implement the "include" directive
This is an experimental draft. More needs to be done.
This commit is contained in:
parent
57729683b6
commit
d06ef76e58
2
NEWS
2
NEWS
|
@ -1,4 +1,6 @@
|
||||||
ver 0.21 (not yet released)
|
ver 0.21 (not yet released)
|
||||||
|
* configuration
|
||||||
|
- add "include" directive, allows including config files
|
||||||
* protocol
|
* protocol
|
||||||
- "tagtypes" can be used to hide tags
|
- "tagtypes" can be used to hide tags
|
||||||
- "find" and "search" can sort
|
- "find" and "search" can sort
|
||||||
|
|
|
@ -410,6 +410,14 @@ systemctl start mpd.socket</programlisting>
|
||||||
device "iec958:CARD=Intel,DEV=0"
|
device "iec958:CARD=Intel,DEV=0"
|
||||||
mixer_control "PCM"
|
mixer_control "PCM"
|
||||||
}</programlisting>
|
}</programlisting>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <varname>include</varname> directive can be used to
|
||||||
|
include settings from another file; the given file name is
|
||||||
|
relative to the current file:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<programlisting>include "other.conf"</programlisting>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="config_music_directory">
|
<section id="config_music_directory">
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "Templates.hxx"
|
#include "Templates.hxx"
|
||||||
#include "util/Tokenizer.hxx"
|
#include "util/Tokenizer.hxx"
|
||||||
#include "util/StringStrip.hxx"
|
#include "util/StringStrip.hxx"
|
||||||
|
#include "util/StringAPI.hxx"
|
||||||
#include "util/Domain.hxx"
|
#include "util/Domain.hxx"
|
||||||
#include "util/RuntimeError.hxx"
|
#include "util/RuntimeError.hxx"
|
||||||
#include "fs/Path.hxx"
|
#include "fs/Path.hxx"
|
||||||
|
@ -152,8 +153,11 @@ ReadConfigParam(ConfigData &config_data, BufferedReader &reader,
|
||||||
reader.GetLineNumber()));
|
reader.GetLineNumber()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param directory the directory used to resolve relative paths
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
ReadConfigFile(ConfigData &config_data, BufferedReader &reader)
|
ReadConfigFile(ConfigData &config_data, BufferedReader &reader, Path directory)
|
||||||
{
|
{
|
||||||
while (true) {
|
while (true) {
|
||||||
char *line = reader.ReadLine();
|
char *line = reader.ReadLine();
|
||||||
|
@ -171,6 +175,16 @@ ReadConfigFile(ConfigData &config_data, BufferedReader &reader)
|
||||||
const char *name = tokenizer.NextWord();
|
const char *name = tokenizer.NextWord();
|
||||||
assert(name != nullptr);
|
assert(name != nullptr);
|
||||||
|
|
||||||
|
if (StringIsEqual(name, "include")) {
|
||||||
|
// TODO: allow absolute path specifications
|
||||||
|
// TODO: detect recusion
|
||||||
|
// TODO: Config{Block,Param} have only line number but no file name
|
||||||
|
// TODO: support wildcards (include "conf.d/*.conf")
|
||||||
|
// TODO: add "include_optional"
|
||||||
|
ReadConfigFile(config_data, directory / AllocatedPath::FromUTF8Throw(ExpectValueAndEnd(tokenizer)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* get the definition of that option, and check the
|
/* get the definition of that option, and check the
|
||||||
"repeatable" flag */
|
"repeatable" flag */
|
||||||
|
|
||||||
|
@ -202,7 +216,7 @@ ReadConfigFile(ConfigData &config_data, Path path)
|
||||||
BufferedReader reader(file);
|
BufferedReader reader(file);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ReadConfigFile(config_data, reader);
|
ReadConfigFile(config_data, reader, path.GetDirectoryName());
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::throw_with_nested(FormatRuntimeError("Error in %s line %u",
|
std::throw_with_nested(FormatRuntimeError("Error in %s line %u",
|
||||||
path_utf8.c_str(),
|
path_utf8.c_str(),
|
||||||
|
|
Loading…
Reference in New Issue