From 1f344bd93258fac03b6ea82c15dd5dad41ee20fa Mon Sep 17 00:00:00 2001 From: Paul Cristian Sarbu Date: Mon, 29 Aug 2022 11:35:15 +0200 Subject: Git CAS: Move Git tree ops to fake repo wrapper class --- src/buildtool/file_system/git_repo.hpp | 59 ++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'src/buildtool/file_system/git_repo.hpp') diff --git a/src/buildtool/file_system/git_repo.hpp b/src/buildtool/file_system/git_repo.hpp index ae0c183b..6103d879 100644 --- a/src/buildtool/file_system/git_repo.hpp +++ b/src/buildtool/file_system/git_repo.hpp @@ -28,6 +28,25 @@ using git_repository = struct git_repository; /// existing ODB, allowing thread-safe operations. class GitRepo { public: + // Stores the data for defining a single Git tree entry, which consists of + // a name (flat basename) and an object type (file/executable/tree). + struct tree_entry_t { + tree_entry_t(std::string n, ObjectType t) + : name{std::move(n)}, type{t} {} + std::string name; + ObjectType type; + [[nodiscard]] auto operator==(tree_entry_t const& other) const noexcept + -> bool { + return name == other.name and type == other.type; + } + }; + + // Tree entries by raw id. The same id might refer to multiple entries. + // Note that sharding by id is used as this format enables a more efficient + // internal implementation for creating trees. + using tree_entries_t = + std::unordered_map>; + GitRepo() = delete; // no default ctor // allow only move, no copy @@ -55,6 +74,46 @@ class GitRepo { [[nodiscard]] auto IsRepoFake() const noexcept -> bool; + /// \brief Read entries from tree in CAS. + /// Reading a tree must be backed by an object database. Therefore, a real + /// repository is required. + /// \param id The object id. + /// \param is_hex_id Specify whether `id` is hex string or raw. + [[nodiscard]] auto ReadTree(std::string const& id, + bool is_hex_id = false) const noexcept + -> std::optional; + + /// \brief Create a flat tree from entries and store tree in CAS. + /// Creating a tree must be backed by an object database. Therefore, a real + /// repository is required. Furthermore, all entries must be available in + /// the underlying object database and object types must correctly reflect + /// the type of the object found in the database. + /// \param entries The entries to create the tree from. + /// \returns The raw object id as string, if successful. + [[nodiscard]] auto CreateTree(GitRepo::tree_entries_t const& entries) + const noexcept -> std::optional; + + /// \brief Read entries from tree data (without object db). + /// \param data The tree object as plain data. + /// \param id The object id. + /// \param is_hex_id Specify whether `id` is hex string or raw. + /// \returns The tree entries. + [[nodiscard]] static auto ReadTreeData(std::string const& data, + std::string const& id, + bool is_hex_id = false) noexcept + -> std::optional; + + /// \brief Create a flat shallow (without objects in db) tree and return it. + /// Creates a tree object from the entries without access to the actual + /// blobs. Objects are not required to be available in the underlying object + /// database. It is sufficient to provide the raw object id and and object + /// type for every entry. + /// \param entries The entries to create the tree from. + /// \returns A pair of raw object id and the tree object content. + [[nodiscard]] static auto CreateShallowTree( + GitRepo::tree_entries_t const& entries) noexcept + -> std::optional>; + ~GitRepo() noexcept; private: -- cgit v1.2.3