Skip to content

Commit c7fda63

Browse files
Print config info (#2583)
* Implement print_config_info application command
1 parent 2dbe547 commit c7fda63

File tree

5 files changed

+93
-44
lines changed

5 files changed

+93
-44
lines changed

application/F3DConfigFileTools.cxx

Lines changed: 67 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,15 @@
99

1010
#include <filesystem>
1111
#include <fstream>
12-
#include <set>
1312
#include <vector>
1413

1514
namespace fs = std::filesystem;
1615

17-
namespace
18-
{
1916
//----------------------------------------------------------------------------
20-
/**
21-
* Recover a OS-specific vector of potential config file directories
22-
*/
23-
std::vector<fs::path> GetConfigPaths(const std::string& configSearch)
17+
std::vector<fs::path> F3DConfigFileTools::GetConfigPaths(const std::string& configSearch)
2418
{
2519
std::vector<fs::path> paths;
2620

27-
fs::path configPath;
2821
std::vector<fs::path> dirsToCheck = {
2922

3023
#ifdef __APPLE__
@@ -60,28 +53,44 @@ std::vector<fs::path> GetConfigPaths(const std::string& configSearch)
6053
configNames.emplace_back(configSearch);
6154
}
6255

63-
for (const auto& configName : configNames)
64-
{
65-
configPath = dir / (configName);
66-
if (fs::exists(configPath))
67-
{
68-
f3d::log::debug("Config file found: ", configPath.string());
69-
paths.emplace_back(configPath);
70-
}
71-
else
72-
{
73-
f3d::log::debug("Candidate config file not found: ", configPath.string());
74-
}
75-
}
56+
std::transform(configNames.begin(), configNames.end(), std::back_inserter(paths),
57+
[&dir](const auto& configName) { return dir / configName; });
7658
}
7759
catch (const fs::filesystem_error&)
7860
{
79-
f3d::log::error("Error recovering configuration file path: ", configPath.string());
61+
f3d::log::error("Error recovering configuration file path");
8062
}
8163
}
8264

8365
return paths;
8466
}
67+
68+
//----------------------------------------------------------------------------
69+
void F3DConfigFileTools::PrintConfigInfo(const std::vector<fs::path>& configPaths)
70+
{
71+
if (!configPaths.empty())
72+
{
73+
f3d::log::info("Found available config path");
74+
}
75+
76+
for (const fs::path& path : configPaths)
77+
{
78+
std::error_code ec;
79+
const bool exists = fs::exists(path, ec);
80+
81+
if (ec)
82+
{
83+
f3d::log::info("Error while checking config path: ", path, " : ", ec.message());
84+
}
85+
else if (exists)
86+
{
87+
f3d::log::info("Config file found: ", path);
88+
}
89+
else
90+
{
91+
f3d::log::info("Candidate config file not found: ", path);
92+
}
93+
}
8594
}
8695

8796
//----------------------------------------------------------------------------
@@ -110,44 +119,58 @@ F3DConfigFileTools::ParsedConfigFiles F3DConfigFileTools::ReadConfigFiles(
110119
std::vector<fs::path> configPaths;
111120
if (!configSearch.empty())
112121
{
113-
configPaths = ::GetConfigPaths(configSearch);
122+
configPaths = F3DConfigFileTools::GetConfigPaths(configSearch);
114123
}
115124
else
116125
{
117126
// Collapse full path into an absolute path
118127
configPaths.emplace_back(f3d::utils::collapsePath(userConfig));
119128
}
120129

130+
if (f3d::log::getVerboseLevel() == f3d::log::VerboseLevel::DEBUG)
131+
{
132+
F3DConfigFileTools::PrintConfigInfo(configPaths);
133+
}
134+
121135
// Recover actual individual config file paths
122136
std::vector<fs::path> actualConfigFilePaths;
137+
bool explicitConfigMissing = false;
123138
for (auto configPath : configPaths)
124139
{
125-
// Recover an absolute canonical path to config file
126140
try
127141
{
142+
if (!fs::exists(configPath))
143+
{
144+
if (!explicitConfigMissing && !userConfig.empty() && configSearch.empty())
145+
{
146+
f3d::log::error("Configuration file does not exist");
147+
explicitConfigMissing = true;
148+
}
149+
continue;
150+
}
151+
152+
// Recover an absolute canonical path to config file
128153
configPath = fs::canonical(fs::path(configPath)).string();
129-
}
130-
catch (const fs::filesystem_error&)
131-
{
132-
f3d::log::error("Configuration file does not exist: ", configPath.string(), " , ignoring it");
133-
continue;
134-
}
135154

136-
// Recover all config files if needed in directories
137-
if (fs::is_directory(configPath))
138-
{
139-
f3d::log::debug("Using config directory ", configPath.string());
140-
const size_t oldSize = actualConfigFilePaths.size();
141-
auto dirIter = fs::directory_iterator(configPath);
142-
std::copy(std::filesystem::begin(dirIter), std::filesystem::end(dirIter),
143-
std::back_inserter(actualConfigFilePaths));
144-
// directory_iterator is not ordered, enforce alphabetical ordering for the added files.
145-
std::sort(actualConfigFilePaths.begin() + oldSize, actualConfigFilePaths.end());
155+
// Recover all config files if needed in directories
156+
if (fs::is_directory(configPath))
157+
{
158+
f3d::log::debug("Using config directory ", configPath.string());
159+
const size_t oldSize = actualConfigFilePaths.size();
160+
auto dirIter = fs::directory_iterator(configPath);
161+
std::copy(fs::begin(dirIter), fs::end(dirIter), std::back_inserter(actualConfigFilePaths));
162+
// directory_iterator is not ordered, enforce alphabetical ordering for the added files.
163+
std::sort(actualConfigFilePaths.begin() + oldSize, actualConfigFilePaths.end());
164+
}
165+
else
166+
{
167+
f3d::log::debug("Using config file ", configPath.string());
168+
actualConfigFilePaths.emplace_back(configPath);
169+
}
146170
}
147-
else
171+
catch (const fs::filesystem_error& e)
148172
{
149-
f3d::log::debug("Using config file ", configPath.string());
150-
actualConfigFilePaths.emplace_back(configPath);
173+
f3d::log::error("Error while locating config path: ", e.what());
151174
}
152175
}
153176

@@ -337,5 +360,5 @@ F3DConfigFileTools::ParsedConfigFiles F3DConfigFileTools::ReadConfigFiles(
337360
}
338361
}
339362
return F3DConfigFileTools::ParsedConfigFiles{ std::move(optionsEntries),
340-
std::move(imperativeOptionsEntries), std::move(bindingsEntries) };
363+
std::move(imperativeOptionsEntries), std::move(bindingsEntries), std::move(configPaths) };
341364
}

application/F3DConfigFileTools.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,19 @@ struct ParsedConfigFiles
1919
F3DOptionsTools::OptionsEntries Options;
2020
F3DOptionsTools::OptionsEntries ImperativeOptions;
2121
BindingsEntries Bindings;
22+
std::vector<std::filesystem::path> ConfigPaths;
2223
};
2324

25+
/**
26+
* Recover a OS-specific vector of potential config file directories
27+
*/
28+
std::vector<std::filesystem::path> GetConfigPaths(const std::string& configSearch);
29+
30+
/**
31+
* Print information about all candidate config files/directories (usually from GetConfigPaths)
32+
*/
33+
void PrintConfigInfo(const std::vector<std::filesystem::path>& configPaths);
34+
2435
/**
2536
* Read config files using userConfig if any, return a ParsedConfigFiles
2637
* containing ordered optionDict, ordered imperative optionDict and ordered bindingsEntries

application/F3DStarter.cxx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,8 @@ class F3DStarter::F3DInternals
10031003
F3DOptionsTools::OptionsEntries DynamicOptionsEntries;
10041004
F3DOptionsTools::OptionsEntries ImperativeConfigOptionsEntries;
10051005
F3DConfigFileTools::BindingsEntries ConfigBindingsEntries;
1006+
std::vector<fs::path> ConfigPaths;
1007+
std::string UserConfig;
10061008
std::unique_ptr<f3d::engine> Engine;
10071009
std::vector<std::pair<std::string, std::vector<fs::path>>> FilesGroups;
10081010
std::vector<fs::path> LoadedFiles;
@@ -1077,6 +1079,8 @@ int F3DStarter::Start(int argc, char** argv)
10771079
}
10781080
}
10791081

1082+
this->Internals->UserConfig = config;
1083+
10801084
bool renderToStdout = false;
10811085
iter = cliOptionsDict.find("output");
10821086
if (iter != cliOptionsDict.end())
@@ -1105,6 +1109,7 @@ int F3DStarter::Start(int argc, char** argv)
11051109
{
11061110
F3DConfigFileTools::ParsedConfigFiles parsedConfigFiles =
11071111
F3DConfigFileTools::ReadConfigFiles(config);
1112+
this->Internals->ConfigPaths = parsedConfigFiles.ConfigPaths;
11081113
this->Internals->ConfigOptionsEntries = parsedConfigFiles.Options;
11091114
this->Internals->ImperativeConfigOptionsEntries = parsedConfigFiles.ImperativeOptions;
11101115
this->Internals->ConfigBindingsEntries = parsedConfigFiles.Bindings;
@@ -2199,6 +2204,13 @@ void F3DStarter::AddCommands()
21992204
return candidates;
22002205
};
22012206

2207+
interactor.addCommand("print_config_info",
2208+
[this](const std::vector<std::string>&)
2209+
{
2210+
auto parsed = F3DConfigFileTools::ReadConfigFiles(this->Internals->UserConfig);
2211+
F3DConfigFileTools::PrintConfigInfo(parsed.ConfigPaths);
2212+
});
2213+
22022214
interactor.addCommand(
22032215
"remove_current_file_group",
22042216
[this](const std::vector<std::string>&)

application/testing/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1330,6 +1330,7 @@ f3d_test(NAME TestCommandScriptAzimuth DATA dragon.vtu SCRIPT TestCommandScriptA
13301330
f3d_test(NAME TestCommandScriptInvalidCommand DATA dragon.vtu SCRIPT TestCommandScriptInvalid.txt REGEXP "Command: \"INVALID_COMMAND_1\" is not recognized, ignoring" NO_BASELINE) # INVALID_COMMAND_1
13311331
f3d_test(NAME TestCommandScriptMissingFile DATA dragon.vtu SCRIPT TestCommandScriptMissingFile.txt REGEXP "Unable to open command script file" NO_BASELINE)
13321332
f3d_test(NAME TestCommandScriptPrintScene DATA dragon.vtu SCRIPT TestCommandScriptPrintScene.txt REGEXP "Camera position: 2.23745, 3.83305, 507.598" NO_BASELINE) # print_scene_info
1333+
f3d_test(NAME TestCommandScriptPrintConfig DATA dragon.vtu SCRIPT TestCommandScriptPrintConfig.txt REGEXP "Found available config path" NO_BASELINE) # print_config_info
13331334
f3d_test(NAME TestCommandScriptPrintColoring DATA dragon.vtu SCRIPT TestCommandScriptPrintColoring.txt REGEXP "Not coloring" NO_BASELINE) # print_coloring_info
13341335
f3d_test(NAME TestCommandScriptPrintMesh DATA dragon.vtu SCRIPT TestCommandScriptPrintMesh.txt REGEXP "Number of points: 13268" NO_BASELINE) # print_mesh_info
13351336
f3d_test(NAME TestCommandScriptPrintOptions DATA dragon.vtu SCRIPT TestCommandScriptPrintOptions.txt REGEXP "interactor.invert_zoom: false" NO_BASELINE) # print_options_info
@@ -1700,6 +1701,7 @@ if(NOT WIN32)
17001701
f3d_test(NAME TestOutputFrameCountNoAnimationTooLong DATA cow.vtp ARGS --output=${_f3d_test_invalid_folder}/frame_{frame}.png REGEXP "Could not write output" NO_BASELINE NO_OUTPUT)
17011702
f3d_test(NAME TestOutputWithReferenceTooLong DATA suzanne.ply ARGS --reference=file.png --output=${_f3d_test_invalid_folder}/file.ext REGEXP "File name too long" NO_BASELINE NO_OUTPUT)
17021703
f3d_test(NAME TestOutputWithExistingReferenceTooLong DATA suzanne.ply ARGS --reference=${F3D_SOURCE_DIR}/testing/data/world.png --output=${_f3d_test_invalid_folder}/file.ext REGEXP "File name too long" NO_BASELINE NO_OUTPUT)
1704+
f3d_test(NAME TestConfigTooLong CONFIG ${_f3d_test_invalid_folder}/invalid.json REGEXP "File name too long" NO_RENDER NO_BASELINE)
17031705

17041706
if(NOT APPLE)
17051707

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
print_config_info

0 commit comments

Comments
 (0)