From ef9182151e4a222a65ef55bc4ef06a25ecb2d895 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Mon, 13 Jun 2022 13:30:13 +0200 Subject: FileRoot: support content description For some file roots, in particular git trees, we can give a complete selfcontained description of the content without accessing any external resources. For those, add a method to return such a complete description that will be used to compute the keys of content-defined repositories. --- src/buildtool/file_system/file_root.hpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/buildtool/file_system/file_root.hpp') diff --git a/src/buildtool/file_system/file_root.hpp b/src/buildtool/file_system/file_root.hpp index 66ceb68a..747ca896 100644 --- a/src/buildtool/file_system/file_root.hpp +++ b/src/buildtool/file_system/file_root.hpp @@ -11,6 +11,7 @@ #include #include "gsl-lite/gsl-lite.hpp" +#include "nlohmann/json.hpp" #include "src/buildtool/common/artifact_description.hpp" #include "src/buildtool/compatibility/compatibility.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" @@ -82,6 +83,8 @@ class FileRoot { using root_t = std::variant; public: + static constexpr auto kGitTreeMarker = "git tree"; + class DirectoryEntries { friend class FileRoot; @@ -252,6 +255,22 @@ class FileRoot { return std::nullopt; } + // Return a complete description of the content of this root, if that can be + // done without any file-system access. + [[nodiscard]] auto ContentDescription() const noexcept + -> std::optional { + try { + if (std::holds_alternative(root_)) { + nlohmann::json j; + j.push_back(kGitTreeMarker); + j.push_back(std::get(root_).tree->Hash()); + return j; + } + } catch (...) { + } + return std::nullopt; + } + // Indicates that subsequent calls to `Exists()`, `IsFile()`, // `IsDirectory()`, and `FileType()` on contents of the same directory will // be served without any additional file system lookups. -- cgit v1.2.3