chore: use file_access abstraction in builtin_script

This commit is contained in:
Marcus Holland-Moritz 2023-12-30 16:45:18 +01:00
parent 619abd8dc1
commit 46e6fbb721
4 changed files with 20 additions and 16 deletions

View File

@ -32,11 +32,12 @@
namespace dwarfs { namespace dwarfs {
class entry_transformer; class entry_transformer;
class file_access;
class logger; class logger;
class builtin_script : public script { class builtin_script : public script {
public: public:
builtin_script(logger& lgr); builtin_script(logger& lgr, std::shared_ptr<file_access const> fa);
~builtin_script(); ~builtin_script();
void set_root_path(std::filesystem::path const& path) { void set_root_path(std::filesystem::path const& path) {

View File

@ -20,7 +20,6 @@
*/ */
#include <cassert> #include <cassert>
#include <fstream>
#include <regex> #include <regex>
#include <unordered_set> #include <unordered_set>
@ -29,6 +28,7 @@
#include "dwarfs/builtin_script.h" #include "dwarfs/builtin_script.h"
#include "dwarfs/entry_interface.h" #include "dwarfs/entry_interface.h"
#include "dwarfs/entry_transformer.h" #include "dwarfs/entry_transformer.h"
#include "dwarfs/file_access.h"
#include "dwarfs/logger.h" #include "dwarfs/logger.h"
#include "dwarfs/util.h" #include "dwarfs/util.h"
@ -56,7 +56,7 @@ struct filter_rule {
template <typename LoggerPolicy> template <typename LoggerPolicy>
class builtin_script_ : public builtin_script::impl { class builtin_script_ : public builtin_script::impl {
public: public:
explicit builtin_script_(logger& lgr); builtin_script_(logger& lgr, std::shared_ptr<file_access const> fa);
void set_root_path(std::filesystem::path const& path) override; void set_root_path(std::filesystem::path const& path) override;
void add_filter_rule(std::string const& rule) override; void add_filter_rule(std::string const& rule) override;
@ -85,6 +85,7 @@ class builtin_script_ : public builtin_script::impl {
std::string root_path_; std::string root_path_;
std::vector<filter_rule> filter_; std::vector<filter_rule> filter_;
std::vector<std::unique_ptr<entry_transformer>> transformer_; std::vector<std::unique_ptr<entry_transformer>> transformer_;
std::shared_ptr<file_access const> fa_;
}; };
template <typename LoggerPolicy> template <typename LoggerPolicy>
@ -179,8 +180,10 @@ auto builtin_script_<LoggerPolicy>::compile_filter_rule(std::string const& rule)
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
builtin_script_<LoggerPolicy>::builtin_script_(logger& lgr) builtin_script_<LoggerPolicy>::builtin_script_(
: log_(lgr) {} logger& lgr, std::shared_ptr<file_access const> fa)
: log_{lgr}
, fa_{std::move(fa)} {}
template <typename LoggerPolicy> template <typename LoggerPolicy>
void builtin_script_<LoggerPolicy>::set_root_path( void builtin_script_<LoggerPolicy>::set_root_path(
@ -212,13 +215,8 @@ void builtin_script_<LoggerPolicy>::add_filter_rule(
fmt::format("recursion detected while opening file: {}", file)); fmt::format("recursion detected while opening file: {}", file));
} }
std::ifstream ifs(file); auto ifs = fa_->open_input(file);
add_filter_rules(seen_files, ifs->is());
if (!ifs.is_open()) {
throw std::runtime_error(fmt::format("error opening file: {}", file));
}
add_filter_rules(seen_files, ifs);
seen_files.erase(file); seen_files.erase(file);
} else { } else {
@ -277,9 +275,10 @@ void builtin_script_<LoggerPolicy>::transform(entry_interface& ei) {
} }
} }
builtin_script::builtin_script(logger& lgr) builtin_script::builtin_script(logger& lgr,
std::shared_ptr<file_access const> fa)
: impl_(make_unique_logging_object<impl, builtin_script_, logger_policies>( : impl_(make_unique_logging_object<impl, builtin_script_, logger_policies>(
lgr)) {} lgr, std::move(fa))) {}
builtin_script::~builtin_script() = default; builtin_script::~builtin_script() = default;

View File

@ -881,7 +881,7 @@ int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
std::shared_ptr<script> script; std::shared_ptr<script> script;
if (!filter.empty() or vm.count("chmod")) { if (!filter.empty() or vm.count("chmod")) {
auto bs = std::make_shared<builtin_script>(lgr); auto bs = std::make_shared<builtin_script>(lgr, iol.file);
if (!filter.empty()) { if (!filter.empty()) {
bs->set_root_path(path); bs->set_root_path(path);

View File

@ -860,10 +860,13 @@ class filter_test
public: public:
test::test_logger lgr; test::test_logger lgr;
std::shared_ptr<builtin_script> scr; std::shared_ptr<builtin_script> scr;
std::shared_ptr<test::test_file_access> tfa;
std::shared_ptr<test::os_access_mock> input; std::shared_ptr<test::os_access_mock> input;
void SetUp() override { void SetUp() override {
scr = std::make_shared<builtin_script>(lgr); tfa = std::make_shared<test::test_file_access>();
scr = std::make_shared<builtin_script>(lgr, tfa);
scr->set_root_path(""); scr->set_root_path("");
input = std::make_shared<test::os_access_mock>(); input = std::make_shared<test::os_access_mock>();
@ -1000,6 +1003,7 @@ class filter_test
void TearDown() override { void TearDown() override {
scr.reset(); scr.reset();
input.reset(); input.reset();
tfa.reset();
} }
}; };