SlHelpers
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 
18 namespace SlGit {
19 
20 class Blob;
21 class Commit;
22 class TreeEntry;
23 
27 class Tree : public TypedObject<git_tree> {
28  using GitTy = git_tree;
29 
30  friend class Commit;
31  friend class Repo;
32 public:
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(); }
54 private:
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 
64 class TreeBuilder {
65  using GitTy = git_treebuilder;
67 
68  friend class Repo;
69 public:
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  }
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(); }
98 private:
99  explicit TreeBuilder(GitTy *TB) noexcept : m_treeBuilder(TB) { }
100 
101  Holder m_treeBuilder;
102 };
103 
107 class TreeEntry {
108  using GitTy = git_tree_entry;
110 
111  friend class Tree;
112 public:
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(); }
134 private:
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 }
Definition: Blob.h:11
bool insert(const std::filesystem::path &file, const Blob &blob) const noexcept
Add file to this TreeBuilder, having blob as a content.
size_t entryCount() const noexcept
Get count of entries in this TreeBuilder.
Definition: Tree.h:87
std::optional< std::string > catFile(const Repo &repo) const noexcept
Cat this TreeEntry.
Git Object class – base for Blob, Commit, Tag, Tree.
Definition: Object.h:65
std::string idStr() const noexcept
Get OID (SHA) of this Object – as a string.
Definition: Tree.h:118
std::optional< Tree > write(const Repo &repo) const noexcept
Write this TreeBuilder to the repo and return the built Tree.
bool clear() const noexcept
Wipe out this TreeBuilder.
Definition: Tree.h:79
static std::string oidToStr(const git_oid &id)
Convert OID id to string.
Definition: Helpers.h:20
GitTy * tree() const noexcept
Get the stored pointer to libgit2&#39;s git_tree.
Definition: Tree.h:53
The most important Git class.
Definition: Repo.h:45
bool walk(const WalkCallback &CB, const git_treewalk_mode &mode=GIT_TREEWALK_PRE) const
Walk this Tree and call CB for every entry.
const std::function< int(const std::string &root, const TreeEntry &entry)> WalkCallback
A callback for walk()
Definition: Tree.h:35
Commit is a representation of a git commit.
Definition: Commit.h:21
git_filemode_t filemode() const noexcept
Get permissions of this TreeEntry.
Definition: Tree.h:125
Blob is a representation of a git blob.
Definition: Blob.h:16
GitTy * treeEntry() const noexcept
Get the stored pointer to libgit2&#39;s git_tree_entry.
Definition: Tree.h:131
TreeEntry treeEntryByIndex(size_t idx) const noexcept
Get an entry on the idx-th position.
Tree is a representation of a git tree.
Definition: Tree.h:27
size_t entryCount() const noexcept
Get count of entries in this Tree.
Definition: Tree.h:39
GitTy * treeBuilder() const noexcept
Get the stored pointer to libgit2&#39;s git_treebuilder.
Definition: Tree.h:95
std::optional< TreeEntry > treeEntryByPath(const std::string &path) const noexcept
Get an entry corresponding to path.
const git_oid * id() const noexcept
Get OID (SHA) of this Object.
Definition: Tree.h:116
git_tree * typed() const noexcept
Get the stored pointer typed to one of libgit2&#39;s types.
Definition: Object.h:83
std::optional< std::string > catFile(const std::string &file) const noexcept
Cat a file in this Tree.
The TreeEntry represents a libgit2&#39;s tree builder.
Definition: Tree.h:64
The TreeEntry represents one git tree entry.
Definition: Tree.h:107
git_object_t type() const noexcept
Get type of this TreeEntry (GIT_OBJECT_TREE, GIT_OBJECT_BLOB, ...)
Definition: Tree.h:123
Tag is a representation of a git tag.
Definition: Tag.h:23
const Repo & repo() const
Get the Repo this Object lives in.
Definition: Object.h:38
std::string name() const noexcept
Get name of this TreeEntry.
Definition: Tree.h:121