| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "ConfigFileReader.h" | ||
| 2 | #include "Tools.h" | ||
| 3 | #include <cstdlib> | ||
| 4 | #include <filesystem> | ||
| 5 | #include <sstream> | ||
| 6 | |||
| 7 | namespace iguana { | ||
| 8 | |||
| 9 | 51 | ConfigFileReader::ConfigFileReader(std::string_view name) | |
| 10 | 51 | : Object(name) | |
| 11 | { | ||
| 12 | // the algorithms need to know where the config files are; | ||
| 13 | // first, add config files from installation prefix; since this | ||
| 14 | // is added first, it's the lowest priority in the configuration | ||
| 15 | // search path | ||
| 16 |
2/4✓ Branch 7 → 8 taken 51 times.
✗ Branch 7 → 65 not taken.
✓ Branch 8 → 9 taken 51 times.
✗ Branch 8 → 43 not taken.
|
51 | AddDirectory(GetConfigInstallationPrefix()); |
| 17 | // next, add `IGUANA_CONFIG_PATH` paths, which provides: | ||
| 18 | // - user override of the configuration path(s) | ||
| 19 | // - a fallback, if `GetConfigInstallationPrefix` is wrong, which happens | ||
| 20 | // if the Iguana installation is relocated | ||
| 21 | 51 | auto user_paths_env_var = std::getenv("IGUANA_CONFIG_PATH"); | |
| 22 |
1/2✗ Branch 15 → 16 not taken.
✓ Branch 15 → 42 taken 51 times.
|
51 | if(user_paths_env_var != nullptr) { |
| 23 | ✗ | std::istringstream user_paths_stream(user_paths_env_var); | |
| 24 | std::string user_path_token; | ||
| 25 | decltype(m_directories) user_paths; | ||
| 26 | ✗ | while(getline(user_paths_stream, user_path_token, ':')) // tokenize `IGUANA_CONFIG_PATH` | |
| 27 | ✗ | user_paths.push_front(user_path_token); | |
| 28 | ✗ | for(auto const& user_path : user_paths) // add the paths in the correct order | |
| 29 | ✗ | AddDirectory(user_path); | |
| 30 | // after these default paths have been added, the user | ||
| 31 | // may still override by calling `AddDirectory` etc. themselves | ||
| 32 | ✗ | } | |
| 33 | 51 | } | |
| 34 | |||
| 35 | 51 | std::string ConfigFileReader::GetConfigInstallationPrefix() | |
| 36 | { | ||
| 37 | 51 | return IGUANA_ETCDIR; | |
| 38 | } | ||
| 39 | |||
| 40 | 102 | void ConfigFileReader::AddDirectory(std::string const& dir) | |
| 41 | { | ||
| 42 |
2/2✓ Branch 2 → 3 taken 60 times.
✓ Branch 2 → 13 taken 42 times.
|
102 | if(dir == "") |
| 43 | return; // handle unset directory name | ||
| 44 |
2/6✓ Branch 6 → 7 taken 60 times.
✗ Branch 6 → 14 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 10 taken 60 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 17 not taken.
|
60 | m_log->Trace("Add directory {}", dir); |
| 45 | 60 | m_directories.push_front(dir); | |
| 46 | } | ||
| 47 | |||
| 48 | 99 | void ConfigFileReader::AddFile(std::string const& name) | |
| 49 | { | ||
| 50 |
2/2✓ Branch 2 → 3 taken 42 times.
✓ Branch 2 → 4 taken 57 times.
|
99 | if(name == "") |
| 51 | 42 | return; // handle unset file name | |
| 52 |
3/4✓ Branch 7 → 8 taken 54 times.
✓ Branch 7 → 31 taken 3 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 54 times.
|
111 | auto full_name = FindFile(name); |
| 53 |
2/8✓ Branch 17 → 18 taken 54 times.
✗ Branch 17 → 37 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 21 taken 54 times.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 40 not taken.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 46 not taken.
|
54 | m_log->Trace(" ===> Add file {}", full_name); |
| 54 |
1/2✓ Branch 23 → 24 taken 54 times.
✗ Branch 23 → 43 not taken.
|
54 | m_files.push_front(full_name); |
| 55 | } | ||
| 56 | |||
| 57 | 6 | void ConfigFileReader::PrintDirectories(Logger::Level const level) | |
| 58 | { | ||
| 59 |
1/2✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 22 not taken.
|
6 | if(m_log->GetLevel() <= level) { |
| 60 | 6 | m_log->Print(level, "{:=^60}", " Configuration file search path order: "); | |
| 61 | 6 | m_log->Print(level, " - ./"); | |
| 62 |
2/2✓ Branch 19 → 7 taken 12 times.
✓ Branch 19 → 20 taken 6 times.
|
18 | for(auto const& dir : m_directories) |
| 63 |
4/8✓ Branch 10 → 11 taken 12 times.
✗ Branch 10 → 23 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 14 taken 12 times.
✓ Branch 16 → 17 taken 6 times.
✓ Branch 16 → 18 taken 6 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 26 not taken.
|
24 | m_log->Print(level, " - {}", dir); |
| 64 | 6 | m_log->Print(level, "{:=^60}", ""); | |
| 65 | } | ||
| 66 | 6 | } | |
| 67 | |||
| 68 | 57 | std::string ConfigFileReader::FindFile(std::string name) | |
| 69 | { | ||
| 70 |
1/2✗ Branch 2 → 3 not taken.
✓ Branch 2 → 5 taken 57 times.
|
57 | if(name == "") |
| 71 | ✗ | return ""; // handle unset file name | |
| 72 |
1/2✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 57 times.
|
114 | name = tools::ExpandTilde(name); // expand `~` -> `$HOME` |
| 73 |
3/6✓ Branch 15 → 16 taken 57 times.
✗ Branch 15 → 92 not taken.
✓ Branch 16 → 17 taken 3 times.
✓ Branch 16 → 19 taken 54 times.
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 95 not taken.
|
57 | m_log->Trace("Searching for file '{}' in:", name); |
| 74 | // first try `./` or assume `name` is a relative or absolute path + filename | ||
| 75 |
2/2✓ Branch 27 → 28 taken 56 times.
✓ Branch 27 → 29 taken 1 time.
|
114 | auto found_local = std::filesystem::exists(name); |
| 76 |
2/2✓ Branch 27 → 28 taken 56 times.
✓ Branch 27 → 29 taken 1 time.
|
57 | m_log->Trace(" - ./{}", found_local ? " - FOUND" : ""); |
| 77 |
2/2✓ Branch 30 → 31 taken 1 time.
✓ Branch 30 → 32 taken 56 times.
|
57 | if(found_local) |
| 78 | 1 | return name; | |
| 79 | // then search each entry of `m_directories` | ||
| 80 |
2/2✓ Branch 77 → 33 taken 64 times.
✓ Branch 77 → 78 taken 3 times.
|
67 | for(auto const& dir : m_directories) { |
| 81 | 64 | std::string filename = dir + "/" + name; | |
| 82 |
3/4✓ Branch 43 → 44 taken 64 times.
✗ Branch 43 → 114 not taken.
✓ Branch 49 → 50 taken 11 times.
✓ Branch 49 → 51 taken 53 times.
|
128 | auto found = std::filesystem::exists(filename); |
| 83 |
4/10✓ Branch 49 → 50 taken 11 times.
✓ Branch 49 → 51 taken 53 times.
✓ Branch 55 → 56 taken 64 times.
✗ Branch 55 → 108 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 59 taken 64 times.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 111 not taken.
✗ Branch 114 → 115 not taken.
✗ Branch 114 → 117 not taken.
|
128 | m_log->Trace(" - {}{}", dir, found ? " - FOUND" : ""); |
| 84 |
2/2✓ Branch 61 → 62 taken 53 times.
✓ Branch 61 → 69 taken 11 times.
|
64 | if(found) |
| 85 | 53 | return filename; | |
| 86 | } | ||
| 87 | // throw exception if not found anywhere | ||
| 88 |
2/6✓ Branch 81 → 82 taken 3 times.
✗ Branch 81 → 120 not taken.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 85 taken 3 times.
✗ Branch 120 → 121 not taken.
✗ Branch 120 → 123 not taken.
|
3 | m_log->Error("Cannot find configuration file named '{}'", name); |
| 89 | 3 | PrintDirectories(Logger::error); | |
| 90 |
1/2✓ Branch 89 → 90 taken 3 times.
✗ Branch 89 → 126 not taken.
|
3 | throw std::runtime_error("configuration file not found"); |
| 91 | } | ||
| 92 | |||
| 93 | 100 | std::string ConfigFileReader::ConvertAlgoNameToConfigName(std::string_view algo_name, std::string_view ext) | |
| 94 | { | ||
| 95 | 100 | std::string result = std::string(algo_name); | |
| 96 | std::string::size_type it = 0; | ||
| 97 |
2/2✓ Branch 5 → 4 taken 86 times.
✓ Branch 5 → 6 taken 100 times.
|
186 | while((it = result.find("::", it)) != std::string::npos) |
| 98 |
1/2✓ Branch 4 → 5 taken 86 times.
✗ Branch 4 → 51 not taken.
|
86 | result.replace(it, 2, "/"); |
| 99 |
5/12✓ Branch 8 → 9 taken 100 times.
✗ Branch 8 → 45 not taken.
✓ Branch 11 → 12 taken 100 times.
✗ Branch 11 → 33 not taken.
✓ Branch 22 → 23 taken 100 times.
✗ Branch 22 → 25 not taken.
✓ Branch 27 → 28 taken 27 times.
✓ Branch 27 → 30 taken 73 times.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 48 not taken.
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 54 not taken.
|
500 | return "algorithms/" + result + "/Config." + std::string(ext); |
| 100 | } | ||
| 101 | |||
| 102 | } | ||
| 103 |