diff --git a/lib/ApplicationFeatures/ConfigFeature.cpp b/lib/ApplicationFeatures/ConfigFeature.cpp index 79d734c9e9..eea0303f92 100644 --- a/lib/ApplicationFeatures/ConfigFeature.cpp +++ b/lib/ApplicationFeatures/ConfigFeature.cpp @@ -24,6 +24,7 @@ #include +#include "ApplicationFeatures/VersionFeature.h" #include "Basics/ArangoGlobalContext.h" #include "Basics/FileUtils.h" #include "Basics/StringUtils.h" @@ -88,6 +89,15 @@ void ConfigFeature::loadConfigFile(std::shared_ptr options, return; } + bool fatal = true; + + auto version = dynamic_cast( + application_features::ApplicationServer::lookupFeature("Version")); + + if (version != nullptr && version->printVersion()) { + fatal = false; + } + // always prefer an explicitly given config file if (!_file.empty()) { if (!FileUtils::exists(_file)) { @@ -189,8 +199,8 @@ void ConfigFeature::loadConfigFile(std::shared_ptr options, LOG_TOPIC(DEBUG, Logger::CONFIG) << "loading '" << filename << "'"; - if (!parser.parse(filename)) { - if (filename.empty()) { + if (filename.empty()) { + if (fatal) { size_t i = 0; std::string locationMsg = "(tried locations: "; for (auto const& it : locations) { @@ -200,8 +210,14 @@ void ConfigFeature::loadConfigFile(std::shared_ptr options, locationMsg += "'" + FileUtils::buildFilename(it, basename) + "'"; } locationMsg += ")"; - options->failNotice(locationMsg); + options->failNotice("cannot find configuration file\n\n" + locationMsg); + exit(EXIT_FAILURE); + } else { + return; } + } + + if (!parser.parse(filename)) { exit(EXIT_FAILURE); } } diff --git a/lib/ApplicationFeatures/VersionFeature.h b/lib/ApplicationFeatures/VersionFeature.h index a4caa0203c..e090ffe9b1 100644 --- a/lib/ApplicationFeatures/VersionFeature.h +++ b/lib/ApplicationFeatures/VersionFeature.h @@ -34,6 +34,9 @@ class VersionFeature final : public application_features::ApplicationFeature { void collectOptions(std::shared_ptr) override final; void validateOptions(std::shared_ptr) override final; + public: + bool printVersion() const { return _printVersion; } + private: bool _printVersion; }; diff --git a/lib/ProgramOptions/IniFileParser.h b/lib/ProgramOptions/IniFileParser.h index acd09bc964..f8c9678ea5 100644 --- a/lib/ProgramOptions/IniFileParser.h +++ b/lib/ProgramOptions/IniFileParser.h @@ -65,7 +65,8 @@ class IniFileParser { // errors that occur during parse are reported to _options bool parse(std::string const& filename) { if (filename.empty()) { - return _options->fail("unable to open configuration file: no configuration file specified"); + return _options->fail( + "unable to open configuration file: no configuration file specified"); } std::ifstream ifs(filename, std::ifstream::in); @@ -130,7 +131,7 @@ class IniFileParser { auto dn = basics::FileUtils::dirname(filename); include = basics::FileUtils::buildFilename(dn, include); } - + LOG_TOPIC(DEBUG, Logger::CONFIG) << "reading include file '" << include << "'";