Skip to content

Commit c40da76

Browse files
committed
fix relative paths in settings
1 parent fd2813f commit c40da76

7 files changed

Lines changed: 31 additions & 13 deletions

File tree

src/cpp/firestarr.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,17 @@ int main(const int argc, const char* const argv[])
6060
fs::logging::debug("Compiled on: %s", COMPILED_ON);
6161
parser.show_help_and_exit();
6262
}
63-
static const auto dir_log = settings.log_directory();
63+
// HACK: know saving settings made output_directory already
6464
static const auto dir_out = settings.output_directory;
65-
make_directory_recursive(dir_log.c_str());
65+
static const auto dir_log = settings.log_directory();
6666
if (dir_log != dir_out)
6767
{
68+
make_directory_recursive(dir_log.c_str());
6869
logging::warning(
6970
"Log file (%s) is being written outside the output directory (%s)",
7071
settings.log_file.c_str(),
7172
dir_out.c_str()
7273
);
73-
make_directory_recursive(dir_out.c_str());
7474
}
7575
const auto opened_log = Log::openLogFile(settings.log_file.c_str());
7676
if (!opened_log)

src/cpp/fs/ArgumentParser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ ArgumentParser::ArgumentParser(
323323
auto dir_settings = std::filesystem::exists(output_directory + "settings.ini")
324324
? output_directory
325325
: binary_directory_;
326-
Settings::setRoot(binary_directory_, dir_settings);
326+
Settings::setRoot(binary_directory_, std::filesystem::absolute(dir_settings));
327327
logging::check_fatal(nullptr != PARSER, "Parser initialized multiple times");
328328
PARSER = this;
329329
add_usages(usages);

src/cpp/fs/Environment.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ Environment Environment::loadEnvironment(
6969
auto found_best = false;
7070
if (!perimeter.empty())
7171
{
72-
for_info = make_unique<GridBase>(read_header(perimeter));
72+
LazyPath p{path, perimeter};
73+
for_info = make_unique<GridBase>(read_header(p.canonical()));
7374
logging::info("Perimeter projection is %s", for_info->proj4().c_str());
7475
}
7576
for (const auto& raster : rasters)

src/cpp/fs/Model.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,8 @@ void Model::makeStarts(
350350
if (!perim.empty())
351351
{
352352
logging::note("Initializing from perimeter %s", string(perim).c_str());
353-
perimeter_ = make_shared<Perimeter>(perim, point, *env_);
353+
LazyPath p{settings.output_directory, perim};
354+
perimeter_ = make_shared<Perimeter>(p.canonical(), point, *env_);
354355
// HACK: if perimeter is only one cell then use position not perimeter so it can bounce if
355356
// non-fuel
356357
const auto& burned = perimeter_->burned;
@@ -1220,7 +1221,8 @@ int Model::runScenarios(
12201221
}
12211222
else
12221223
{
1223-
model.readWeather(yesterday, start_point.latitude(), weather_input);
1224+
const LazyPath wx{settings.output_directory, weather_input};
1225+
model.readWeather(yesterday, start_point.latitude(), wx.canonical());
12241226
if (model.wx_.empty())
12251227
{
12261228
logging::fatal("No weather provided");

src/cpp/fs/Settings.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ Settings::Settings(const string dir_binary, const string dir_settings)
191191
}
192192
in.close();
193193
}
194+
if (settings_.first.empty())
195+
{
196+
// could work if all arguments were specified as cli args (not currently possible)
197+
logging::warning("Settings file %s is empty", filename.c_str());
198+
}
194199
if (const auto value = get_value(settings_, "OUTPUT_DIRECTORY", false); "INVALID" != value)
195200
{
196201
output_directory = value;
@@ -359,10 +364,12 @@ Settings::Settings(const string dir_binary, const string dir_settings)
359364
}
360365
void Settings::saveTo(const string& output_directory) const noexcept
361366
{
367+
make_directory_recursive(output_directory.c_str());
362368
const pushd dir{output_directory};
363369
const auto filename = string(output_directory) + "settings.ini";
364370
ofstream out{filename};
365371
auto put = [&](const string& key, const string& comment, const auto& value) {
372+
// FIX: use original string instead of parsed and stringified input so nothing can change
366373
static constexpr auto MAX_PRECISION = std::numeric_limits<double>::digits10 + 1;
367374
// make sure we don't lose precision or results will differ when run with settings file
368375
out << "# " << comment << "\n";
@@ -373,7 +380,6 @@ void Settings::saveTo(const string& output_directory) const noexcept
373380
// auto abs = std::filesystem::absolute(output_directory).lexically_normal();
374381
auto abs = dir.current_directory;
375382
auto relative = [&](const string& path) {
376-
const pushd dir{output_directory};
377383
// return std::filesystem::relative(path.c_str(), abs.c_str());
378384
return std::filesystem::relative(path.c_str());
379385
// return path;

src/cpp/fs/Util.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "Log.h"
55
#include "TimeUtil.h"
66
// HACK: complains when importing otherwise
7+
#include <filesystem>
78
#include <regex>
89
#ifdef _WIN32
910
#include <direct.h>
@@ -309,13 +310,17 @@ string get_canonical_path(const char* const dir_root, string path)
309310
#endif
310311
if (!path.starts_with("/"))
311312
{
312-
const pushd dir{dir_root};
313-
// not an absolute path
314-
// if binary path starts with ./ then ignore it
315-
std::filesystem::path p =
316-
(0 == strcmp("./", dir_root) || 0 == strcmp(".\\", dir_root)) ? path : (dir_root + path);
317313
try
318314
{
315+
// not an absolute path so should be relative to root
316+
const pushd dir{dir_root};
317+
auto p = std::filesystem::absolute(std::filesystem::relative(path));
318+
logging::note(
319+
"Relative to %s path %s becomes %s",
320+
dir_root,
321+
p.c_str(),
322+
std::filesystem::canonical(p).c_str()
323+
);
319324
#ifdef _WIN32
320325
path = std::filesystem::canonical(p).generic_string();
321326
#else

src/cpp/fs/Util.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,10 @@ class LazyPath
500500
public:
501501
LazyPath() = default;
502502
LazyPath(const string dir_root, const string path) : dir_root_{dir_root}, path_{path} { }
503+
LazyPath(const string_view dir_root, const string_view path)
504+
: LazyPath(string(dir_root), string(path))
505+
{ }
506+
bool empty() const { return path_.empty(); }
503507
const char* canonical() const
504508
{
505509
if (nullptr == canonical_path_)

0 commit comments

Comments
 (0)