diff options
author | Смердокрыл <smerdokryl@gmail.com> | 2023-06-09 21:36:03 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-04-07 12:05:20 +0200 |
commit | 2fca5545553bcb368096d27bd1f72cda99e52520 (patch) | |
tree | 66042597a5558f97e8832ceb39d5ca1b69da3d22 /src/common/Configuration/Config.cpp | |
parent | 018e66bc914e3e39b01e15a51ad683a5e881d156 (diff) |
Core/Config: Implement reading config overrides from subdirectory (#29068)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
(cherry picked from commit 74a4dc46b49e1902f44a36b5b3155ad103d8f3da)
Diffstat (limited to 'src/common/Configuration/Config.cpp')
-rw-r--r-- | src/common/Configuration/Config.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index baf5d5bf11c..e8d7ebea477 100644 --- a/src/common/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp @@ -18,7 +18,7 @@ #include "Config.h" #include "Log.h" #include "StringConvert.h" -#include "Util.h" +#include <boost/filesystem/operations.hpp> #include <boost/property_tree/ini_parser.hpp> #include <algorithm> #include <cstdlib> @@ -26,6 +26,7 @@ #include <mutex> namespace bpt = boost::property_tree; +namespace fs = boost::filesystem; namespace { @@ -159,6 +160,8 @@ bool ConfigMgr::LoadAdditionalFile(std::string file, bool keepOnReload, std::str if (!LoadFile(file, fullTree, error)) return false; + std::lock_guard<std::mutex> lock(_configLock); + for (bpt::ptree::value_type const& child : fullTree.begin()->second) _config.put_child(bpt::ptree::path_type(child.first, '/'), child.second); @@ -168,6 +171,32 @@ bool ConfigMgr::LoadAdditionalFile(std::string file, bool keepOnReload, std::str return true; } +bool ConfigMgr::LoadAdditionalDir(std::string const& dir, bool keepOnReload, std::vector<std::string>& loadedFiles, std::vector<std::string>& errors) +{ + fs::path dirPath = dir; + if (!fs::exists(dirPath) || !fs::is_directory(dirPath)) + return true; + + for (fs::directory_entry const& f : fs::recursive_directory_iterator(dirPath)) + { + if (!fs::is_regular_file(f)) + continue; + + fs::path configFile = fs::absolute(f); + if (configFile.extension() != ".conf") + continue; + + std::string fileName = configFile.generic_string(); + std::string error; + if (LoadAdditionalFile(fileName, keepOnReload, error)) + loadedFiles.push_back(std::move(fileName)); + else + errors.push_back(std::move(error)); + } + + return errors.empty(); +} + std::vector<std::string> ConfigMgr::OverrideWithEnvVariablesIfAny() { std::lock_guard<std::mutex> lock(_configLock); |