SlHelpers
Loading...
Searching...
No Matches
Tree.h
1// SPDX-License-Identifier: GPL-2.0-only
2
3#pragma once
4
5#include <filesystem>
6#include <functional>
7#include <optional>
8#include <string>
9
10#include <git2.h>
11
12#include "../helpers/Unique.h"
13
14#include "Helpers.h"
15#include "Object.h"
16#include "Repo.h"
17
18namespace SlGit {
19
20class Blob;
21class Commit;
22class TreeEntry;
23
27class Tree : public TypedObject<git_tree> {
28 using GitTy = git_tree;
29
30 friend class Commit;
31 friend class Repo;
32public:
34 using WalkCallback = const std::function<int(const std::string &root,
35 const TreeEntry &entry)>;
36 Tree() = delete;
37
39 size_t entryCount() const noexcept { return git_tree_entrycount(tree()); }
40
42 bool walk(const WalkCallback &CB, const git_treewalk_mode &mode = GIT_TREEWALK_PRE) const;
43
45 std::optional<TreeEntry> treeEntryByPath(const std::string &path) const noexcept;
47 TreeEntry treeEntryByIndex(size_t idx) const noexcept;
48
50 std::optional<std::string> catFile(const std::string &file) const noexcept;
51
53 GitTy *tree() const noexcept { return typed(); }
54private:
55 static int walkCB(const char *root, const git_tree_entry *entry, void *payload);
56
57 friend class Tag;
58 explicit Tree(const Repo &repo, GitTy *tree) noexcept : TypedObject(repo, tree) {}
59};
60
64class TreeBuilder {
65 using GitTy = git_treebuilder;
66 using Holder = SlHelpers::UniqueHolder<GitTy>;
67
68 friend class Repo;
69public:
70 TreeBuilder() = delete;
71
73 bool insert(const std::filesystem::path &file, const Blob &blob) const noexcept;
75 bool remove(const std::filesystem::path &file) const noexcept {
76 return !Repo::setLastError(git_treebuilder_remove(treeBuilder(), file.c_str()));
77 }
78
79 bool clear() const noexcept {
80 return !Repo::setLastError(git_treebuilder_clear(treeBuilder()));
81 }
82
84 std::optional<Tree> write(const Repo &repo) const noexcept;
85
87 size_t entryCount() const noexcept { return git_treebuilder_entrycount(treeBuilder()); }
88
90 const git_tree_entry *get(const std::filesystem::path &file) const noexcept {
91 return git_treebuilder_get(treeBuilder(), file.c_str());
92 }
93
95 GitTy *treeBuilder() const noexcept { return m_treeBuilder.get(); }
97 operator GitTy *() const noexcept { return treeBuilder(); }
98private:
99 explicit TreeBuilder(GitTy *TB) noexcept : m_treeBuilder(TB) { }
100
101 Holder m_treeBuilder;
102};
103
107class TreeEntry {
108 using GitTy = git_tree_entry;
109 using Holder = SlHelpers::UniqueHolder<GitTy>;
110
111 friend class Tree;
112public:
113 TreeEntry() = delete;
114
116 const git_oid *id() const noexcept { return git_tree_entry_id(treeEntry()); }
118 std::string idStr() const noexcept { return Helpers::oidToStr(*id()); }
119
121 std::string name() const noexcept { return git_tree_entry_name(treeEntry()); }
123 git_object_t type() const noexcept { return git_tree_entry_type(treeEntry()); }
125 git_filemode_t filemode() const noexcept { return git_tree_entry_filemode(treeEntry()); }
126
128 std::optional<std::string> catFile(const Repo &repo) const noexcept;
129
131 GitTy *treeEntry() const noexcept { return m_treeEntry.get(); }
133 operator GitTy *() const noexcept { return treeEntry(); }
134private:
135 explicit TreeEntry(GitTy *entry, bool free = true) noexcept : m_treeEntry(entry, free) { }
136 explicit TreeEntry(const GitTy *entry) noexcept :
137 m_treeEntry(const_cast<GitTy *>(entry), false) { }
138
139 Holder m_treeEntry;
140};
141
142}
Blob is a representation of a git blob.
Definition Blob.h:16
Commit is a representation of a git commit.
Definition Commit.h:21
static std::string oidToStr(const git_oid &id)
Convert OID id to string.
Definition Helpers.h:20
const Repo & repo() const
Get the Repo this Object lives in.
Definition Object.h:38
The most important Git class.
Definition Repo.h:45
Tag is a representation of a git tag.
Definition Tag.h:23
The TreeEntry represents a libgit2's tree builder.
Definition Tree.h:64
bool clear() const noexcept
Wipe out this TreeBuilder.
Definition Tree.h:79
size_t entryCount() const noexcept
Get count of entries in this TreeBuilder.
Definition Tree.h:87
const git_tree_entry * get(const std::filesystem::path &file) const noexcept
Get a tree entry for file in this TreeBuilder.
Definition Tree.h:90
bool insert(const std::filesystem::path &file, const Blob &blob) const noexcept
Add file to this TreeBuilder, having blob as a content.
GitTy * treeBuilder() const noexcept
Get the stored pointer to libgit2's git_treebuilder.
Definition Tree.h:95
bool remove(const std::filesystem::path &file) const noexcept
Remove file from this TreeBuilder.
Definition Tree.h:75
std::optional< Tree > write(const Repo &repo) const noexcept
Write this TreeBuilder to the repo and return the built Tree.
The TreeEntry represents one git tree entry.
Definition Tree.h:107
std::optional< std::string > catFile(const Repo &repo) const noexcept
Cat this TreeEntry.
GitTy * treeEntry() const noexcept
Get the stored pointer to libgit2's git_tree_entry.
Definition Tree.h:131
std::string idStr() const noexcept
Get OID (SHA) of this Object – as a string.
Definition Tree.h:118
git_filemode_t filemode() const noexcept
Get permissions of this TreeEntry.
Definition Tree.h:125
git_object_t type() const noexcept
Get type of this TreeEntry (GIT_OBJECT_TREE, GIT_OBJECT_BLOB, ...).
Definition Tree.h:123
std::string name() const noexcept
Get name of this TreeEntry.
Definition Tree.h:121
const git_oid * id() const noexcept
Get OID (SHA) of this Object.
Definition Tree.h:116
Tree is a representation of a git tree.
Definition Tree.h:27
const std::function< int(const std::string &root, const TreeEntry &entry)> WalkCallback
A callback for walk().
Definition Tree.h:34
GitTy * tree() const noexcept
Get the stored pointer to libgit2's git_tree.
Definition Tree.h:53
TreeEntry treeEntryByIndex(size_t idx) const noexcept
Get an entry on the idx-th position.
std::optional< TreeEntry > treeEntryByPath(const std::string &path) const noexcept
Get an entry corresponding to path.
size_t entryCount() const noexcept
Get count of entries in this Tree.
Definition Tree.h:39
bool walk(const WalkCallback &CB, const git_treewalk_mode &mode=GIT_TREEWALK_PRE) const
Walk this Tree and call CB for every entry.
std::optional< std::string > catFile(const std::string &file) const noexcept
Cat a file in this Tree.
Git Object class – base for Blob, Commit, Tag, Tree.
Definition Object.h:65
git_tree * typed() const noexcept
Definition Object.h:83
Wrapper around std::unique_ptr for easier re-definition of free.
Definition Unique.h:41