diff --git a/src/build/adapter_filesystem.cc b/src/build/adapter_filesystem.cc index cb787b6c..9f2bc3f6 100644 --- a/src/build/adapter_filesystem.cc +++ b/src/build/adapter_filesystem.cc @@ -2,22 +2,23 @@ #include -#include // assert -#include // std::ofstream -#include // std::unique_lock +#include // assert +#include // std::ofstream +#include // std::unique_lock +#include // std::string_view namespace sourcemeta::one { -BuildAdapterFilesystem::BuildAdapterFilesystem(std::string dependency_extension) - : extension{std::move(dependency_extension)} { - assert(!this->extension.empty()); - assert(this->extension.starts_with(".")); -} +constexpr std::string_view DEPS_EXTENSION{".deps"}; + +BuildAdapterFilesystem::BuildAdapterFilesystem( + const std::filesystem::path &output_root) + : root{std::filesystem::canonical(output_root)} {} auto BuildAdapterFilesystem::dependencies_path(const node_type &path) const -> node_type { assert(path.is_absolute()); - return path.string() + this->extension; + return path.string() + std::string{DEPS_EXTENSION}; } auto BuildAdapterFilesystem::read_dependencies(const node_type &path) const @@ -37,7 +38,13 @@ auto BuildAdapterFilesystem::read_dependencies(const node_type &path) const } if (!line.empty()) { - deps.emplace_back(line); + std::filesystem::path dependency{line}; + if (!dependency.is_absolute()) { + dependency = + std::filesystem::weakly_canonical(this->root / dependency); + } + + deps.emplace_back(std::move(dependency)); } } @@ -63,8 +70,13 @@ auto BuildAdapterFilesystem::write_dependencies( std::filesystem::create_directories(deps_path.parent_path()); std::ofstream deps_stream{deps_path}; assert(!deps_stream.fail()); - for (const auto &node : dependencies) { - deps_stream << node.string() << "\n"; + for (const auto &dependency : dependencies) { + const auto relative{dependency.lexically_relative(this->root)}; + if (!relative.empty() && *relative.begin() != "..") { + deps_stream << relative.string() << "\n"; + } else { + deps_stream << dependency.string() << "\n"; + } } deps_stream.flush(); diff --git a/src/build/include/sourcemeta/one/build_adapter_filesystem.h b/src/build/include/sourcemeta/one/build_adapter_filesystem.h index 05937d26..51709cda 100644 --- a/src/build/include/sourcemeta/one/build_adapter_filesystem.h +++ b/src/build/include/sourcemeta/one/build_adapter_filesystem.h @@ -12,19 +12,16 @@ #include // std::filesystem #include // std::optional #include // std::shared_mutex -#include // std::string #include // std::unordered_map namespace sourcemeta::one { -/// @ingroup build class SOURCEMETA_ONE_BUILD_EXPORT BuildAdapterFilesystem { public: using node_type = std::filesystem::path; using mark_type = std::filesystem::file_time_type; - BuildAdapterFilesystem() = default; - BuildAdapterFilesystem(std::string dependency_extension); + BuildAdapterFilesystem(const std::filesystem::path &output_root); [[nodiscard]] auto dependencies_path(const node_type &path) const -> node_type; @@ -39,18 +36,9 @@ class SOURCEMETA_ONE_BUILD_EXPORT BuildAdapterFilesystem { const mark_type right) const -> bool; private: -// Exporting symbols that depends on the standard C++ library is considered -// safe. -// https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-2-c4275?view=msvc-170&redirectedfrom=MSDN -#if defined(_MSC_VER) -#pragma warning(disable : 4251 4275) -#endif - std::string extension{".deps"}; + std::filesystem::path root; std::unordered_map marks; std::shared_mutex mutex; -#if defined(_MSC_VER) -#pragma warning(default : 4251 4275) -#endif }; } // namespace sourcemeta::one diff --git a/src/build/include/sourcemeta/one/build_types.h b/src/build/include/sourcemeta/one/build_types.h index 5066e415..085c8b06 100644 --- a/src/build/include/sourcemeta/one/build_types.h +++ b/src/build/include/sourcemeta/one/build_types.h @@ -6,14 +6,11 @@ namespace sourcemeta::one { -/// @ingroup build template using BuildDynamicCallback = std::function; -/// @ingroup build template using BuildDependencies = std::vector; -/// @ingroup build template using BuildHandler = std::function &, diff --git a/src/index/CMakeLists.txt b/src/index/CMakeLists.txt index fb210e82..fb20f954 100644 --- a/src/index/CMakeLists.txt +++ b/src/index/CMakeLists.txt @@ -1,6 +1,6 @@ sourcemeta_executable(NAMESPACE sourcemeta PROJECT one NAME index FOLDER "One/Index" - SOURCES index.cc adapter.h output.h generators.h explorer.h) + SOURCES index.cc output.h generators.h explorer.h) set_target_properties(sourcemeta_one_index PROPERTIES OUTPUT_NAME sourcemeta-one-index) diff --git a/src/index/adapter.h b/src/index/adapter.h deleted file mode 100644 index d75c1d4b..00000000 --- a/src/index/adapter.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef SOURCEMETA_ONE_INDEX_ADAPTER_H_ -#define SOURCEMETA_ONE_INDEX_ADAPTER_H_ - -#include - -#include // std::filesystem -#include // std::optional - -namespace sourcemeta::one { - -class Adapter : public sourcemeta::one::BuildAdapterFilesystem { -public: - Adapter(std::filesystem::path output_root) - : root{std::filesystem::canonical(output_root)} {} - - [[nodiscard]] auto read_dependencies(const node_type &path) const - -> std::optional> { - auto result{BuildAdapterFilesystem::read_dependencies(path)}; - if (result.has_value()) { - for (auto &dependency : result.value()) { - if (!dependency.is_absolute()) { - dependency = - std::filesystem::weakly_canonical(this->root / dependency); - } - } - } - - return result; - } - - auto write_dependencies( - const node_type &path, - const sourcemeta::one::BuildDependencies &dependencies) - -> void { - sourcemeta::one::BuildDependencies relativized; - relativized.reserve(dependencies.size()); - for (const auto &dependency : dependencies) { - const auto relative{dependency.lexically_relative(this->root)}; - if (!relative.empty() && *relative.begin() != "..") { - relativized.emplace_back(relative); - } else { - relativized.emplace_back(dependency); - } - } - - BuildAdapterFilesystem::write_dependencies(path, relativized); - } - -private: - std::filesystem::path root; -}; - -} // namespace sourcemeta::one - -#endif diff --git a/src/index/index.cc b/src/index/index.cc index 4882be48..d91ceeeb 100644 --- a/src/index/index.cc +++ b/src/index/index.cc @@ -13,7 +13,6 @@ #include #include -#include "adapter.h" #include "explorer.h" #include "generators.h" #include "output.h" @@ -208,7 +207,7 @@ static auto index_main(const std::string_view &program, ///////////////////////////////////////////////////////////////////////////// const auto schemas_path{output.path() / "schemas"}; - sourcemeta::one::Adapter adapter{output.path()}; + sourcemeta::one::BuildAdapterFilesystem adapter{output.path()}; // Mainly to not screw up the logs std::mutex mutex; const auto concurrency{app.contains("concurrency") diff --git a/test/unit/build/build_adapter_filesystem_e2e_test.cc b/test/unit/build/build_adapter_filesystem_e2e_test.cc index a81fafd8..3282e75d 100644 --- a/test/unit/build/build_adapter_filesystem_e2e_test.cc +++ b/test/unit/build/build_adapter_filesystem_e2e_test.cc @@ -52,7 +52,7 @@ auto HANDLER_MIRROR_CONTEXT_NODE_WITHOUT_CALLBACK( TEST(Build_Adapter_Filesystem_e2e, simple_cache_miss_hit) { using Adapter = sourcemeta::one::BuildAdapterFilesystem; using Context = std::uint64_t; - Adapter adapter; + Adapter adapter{BINARY_DIRECTORY}; const auto base_path{std::filesystem::path{BINARY_DIRECTORY} / "simple_cache_miss_hit"}; @@ -111,7 +111,7 @@ TEST(Build_Adapter_Filesystem_e2e, simple_cache_miss_hit) { TEST(Build_Adapter_Filesystem_e2e, dynamic_dependency) { using Adapter = sourcemeta::one::BuildAdapterFilesystem; using Context = Adapter::node_type; - Adapter adapter; + Adapter adapter{BINARY_DIRECTORY}; const auto base_path{std::filesystem::path{BINARY_DIRECTORY} / "dynamic_dependency"}; @@ -138,7 +138,7 @@ TEST(Build_Adapter_Filesystem_e2e, dynamic_dependency) { TEST(Build_Adapter_Filesystem_e2e, missing_dynamic_dependency) { using Adapter = sourcemeta::one::BuildAdapterFilesystem; using Context = Adapter::node_type; - Adapter adapter; + Adapter adapter{BINARY_DIRECTORY}; const auto base_path{std::filesystem::path{BINARY_DIRECTORY} / "missing_dynamic_dependency"}; diff --git a/test/unit/build/build_adapter_filesystem_test.cc b/test/unit/build/build_adapter_filesystem_test.cc index b01a2c7e..55e90de5 100644 --- a/test/unit/build/build_adapter_filesystem_test.cc +++ b/test/unit/build/build_adapter_filesystem_test.cc @@ -2,26 +2,18 @@ #include -#include - #include "build_test_utils.h" TEST(Build_Adapter_Filesystem, dependencies_path) { - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; const auto result{adapter.dependencies_path("/foo/bar.baz")}; EXPECT_EQ(result, "/foo/bar.baz.deps"); } -TEST(Build_Adapter_Filesystem, dependencies_path_with_custom_extension) { - sourcemeta::one::BuildAdapterFilesystem adapter{".custom-deps"}; - const auto result{adapter.dependencies_path("/foo/bar.baz")}; - EXPECT_EQ(result, "/foo/bar.baz.custom-deps"); -} - TEST(Build_Adapter_Filesystem, read_dependencies_stub_1) { const std::filesystem::path stub{std::filesystem::path{TEST_DIRECTORY} / "deps_stub_1.json"}; - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; const auto dependencies{adapter.read_dependencies(stub)}; EXPECT_TRUE(dependencies.has_value()); EXPECT_EQ(dependencies.value().size(), 2); @@ -34,7 +26,7 @@ TEST(Build_Adapter_Filesystem, read_dependencies_stub_1) { TEST(Build_Adapter_Filesystem, read_dependencies_not_exists) { const std::filesystem::path stub{std::filesystem::path{TEST_DIRECTORY} / "unknown"}; - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; const auto dependencies{adapter.read_dependencies(stub)}; EXPECT_FALSE(dependencies.has_value()); } @@ -52,7 +44,7 @@ TEST(Build_Adapter_Filesystem, write_dependencies_1) { WRITE_FILE(node, "test"); - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; adapter.write_dependencies(node, dependencies); const auto back{adapter.read_dependencies(node)}; EXPECT_TRUE(back.has_value()); @@ -69,7 +61,7 @@ TEST(Build_Adapter_Filesystem, write_dependencies_1) { TEST(Build_Adapter_Filesystem, mark_stub_1) { const std::filesystem::path stub{std::filesystem::path{TEST_DIRECTORY} / "deps_stub_1.json.deps"}; - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; const auto mark{adapter.mark(stub)}; EXPECT_TRUE(mark.has_value()); } @@ -77,7 +69,7 @@ TEST(Build_Adapter_Filesystem, mark_stub_1) { TEST(Build_Adapter_Filesystem, mark_stub_not_exists) { const std::filesystem::path stub{std::filesystem::path{TEST_DIRECTORY} / "unknown"}; - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; const auto mark{adapter.mark(stub)}; EXPECT_FALSE(mark.has_value()); } @@ -85,7 +77,7 @@ TEST(Build_Adapter_Filesystem, mark_stub_not_exists) { TEST(Build_Adapter_Filesystem, is_newer_than_same_with_refresh) { const std::filesystem::path file{std::filesystem::path{BINARY_DIRECTORY} / "is_newer_than_same"}; - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; WRITE_FILE(file, "test"); adapter.refresh(file); const auto mark{adapter.mark(file)}; @@ -97,7 +89,7 @@ TEST(Build_Adapter_Filesystem, is_newer_than_same_without_refresh) { const std::filesystem::path file{std::filesystem::path{BINARY_DIRECTORY} / "is_newer_than_same"}; WRITE_FILE(file, "test"); - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; const auto mark{adapter.mark(file)}; EXPECT_TRUE(mark.has_value()); EXPECT_FALSE(adapter.is_newer_than(mark.value(), mark.value())); @@ -109,7 +101,7 @@ TEST(Build_Adapter_Filesystem, is_newer_than) { const std::filesystem::path file_2{std::filesystem::path{BINARY_DIRECTORY} / "is_newer_than" / "2.txt"}; - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; WRITE_FILE(file_1, "test_1"); adapter.refresh(file_1); @@ -132,7 +124,7 @@ TEST(Build_Adapter_Filesystem, is_newer_than_with_update) { const std::filesystem::path file_2{std::filesystem::path{BINARY_DIRECTORY} / "is_newer_than_with_update" / "2.txt"}; - sourcemeta::one::BuildAdapterFilesystem adapter; + sourcemeta::one::BuildAdapterFilesystem adapter{BINARY_DIRECTORY}; WRITE_FILE(file_1, "test_1"); adapter.refresh(file_1);