Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 24 additions & 12 deletions src/build/adapter_filesystem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,23 @@

#include <sourcemeta/core/io.h>

#include <cassert> // assert
#include <fstream> // std::ofstream
#include <mutex> // std::unique_lock
#include <cassert> // assert
#include <fstream> // std::ofstream
#include <mutex> // std::unique_lock
#include <string_view> // 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
Expand All @@ -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));
}
}

Expand All @@ -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();
Expand Down
16 changes: 2 additions & 14 deletions src/build/include/sourcemeta/one/build_adapter_filesystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,16 @@
#include <filesystem> // std::filesystem
#include <optional> // std::optional
#include <shared_mutex> // std::shared_mutex
#include <string> // std::string
#include <unordered_map> // 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;
Expand All @@ -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<node_type, mark_type> marks;
std::shared_mutex mutex;
#if defined(_MSC_VER)
#pragma warning(default : 4251 4275)
#endif
};

} // namespace sourcemeta::one
Expand Down
3 changes: 0 additions & 3 deletions src/build/include/sourcemeta/one/build_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@

namespace sourcemeta::one {

/// @ingroup build
template <typename NodeType>
using BuildDynamicCallback = std::function<void(const NodeType &)>;

/// @ingroup build
template <typename NodeType> using BuildDependencies = std::vector<NodeType>;

/// @ingroup build
template <typename Context, typename NodeType>
using BuildHandler =
std::function<void(const NodeType &, const BuildDependencies<NodeType> &,
Expand Down
2 changes: 1 addition & 1 deletion src/index/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)

Expand Down
55 changes: 0 additions & 55 deletions src/index/adapter.h

This file was deleted.

3 changes: 1 addition & 2 deletions src/index/index.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
#include <sourcemeta/one/shared.h>
#include <sourcemeta/one/web.h>

#include "adapter.h"
#include "explorer.h"
#include "generators.h"
#include "output.h"
Expand Down Expand Up @@ -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")
Expand Down
6 changes: 3 additions & 3 deletions test/unit/build/build_adapter_filesystem_e2e_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"};
Expand Down Expand Up @@ -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"};
Expand All @@ -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"};
Expand Down
28 changes: 10 additions & 18 deletions test/unit/build/build_adapter_filesystem_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,18 @@

#include <sourcemeta/one/build.h>

#include <fstream>

#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);
Expand All @@ -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());
}
Expand All @@ -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());
Expand All @@ -69,23 +61,23 @@ 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());
}

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());
}

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)};
Expand All @@ -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()));
Expand All @@ -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);
Expand All @@ -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);
Expand Down