This repository was archived by the owner on Jan 19, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathpack_builder.cpp
More file actions
132 lines (102 loc) · 3.91 KB
/
Copy pathpack_builder.cpp
File metadata and controls
132 lines (102 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <cppgit2/pack_builder.hpp>
#include <functional>
namespace cppgit2 {
pack_builder::pack_builder() : c_ptr_(nullptr), owner_(ownership::libgit2) {}
pack_builder::pack_builder(git_packbuilder *c_ptr, ownership owner)
: c_ptr_(c_ptr), owner_(owner) {}
pack_builder::~pack_builder() {
if (c_ptr_ && owner_ == ownership::user)
git_packbuilder_free(c_ptr_);
}
void pack_builder::for_each_object(
std::function<void(void *object_data, size_t object_size)> visitor) {
struct visitor_wrapper {
std::function<void(void *object_data, size_t object_size)> fn;
};
visitor_wrapper wrapper;
wrapper.fn = visitor;
auto callback_c = [](void *buffer, size_t size, void *payload) {
auto wrapper = reinterpret_cast<visitor_wrapper *>(payload);
wrapper->fn(buffer, size);
return 0;
};
if (git_packbuilder_foreach(c_ptr_, callback_c, (void *)(&wrapper)))
throw git_exception();
}
oid pack_builder::hash() { return oid(git_packbuilder_hash(c_ptr_)); }
oid pack_builder::id() const { return oid(git_packbuilder_hash(c_ptr_)); }
void pack_builder::insert_commit(const oid &commit_id) {
if (git_packbuilder_insert_commit(c_ptr_, commit_id.c_ptr()))
throw git_exception();
}
void pack_builder::insert_object(const oid &commit_id,
const std::string &name) {
auto name_c = name.empty() ? nullptr : name.c_str();
if (git_packbuilder_insert(c_ptr_, commit_id.c_ptr(), name_c))
throw git_exception();
}
void pack_builder::insert_object_recursively(const oid &commit_id,
const std::string &name) {
auto name_c = name.empty() ? nullptr : name.c_str();
if (git_packbuilder_insert_recur(c_ptr_, commit_id.c_ptr(), name_c))
throw git_exception();
}
void pack_builder::insert_tree(const oid &tree_id) {
if (git_packbuilder_insert_tree(c_ptr_, tree_id.c_ptr()))
throw git_exception();
}
void pack_builder::insert_revwalk(const revwalk &walk) {
if (git_packbuilder_insert_walk(c_ptr_, walk.c_ptr_))
throw git_exception();
}
size_t pack_builder::size() const {
return git_packbuilder_object_count(c_ptr_);
}
void pack_builder::set_progress_callback(
std::function<void(int, uint32_t, uint32_t)> callback) {
// Wrap user provided visitor in a callback fn
struct visitor_wrapper {
std::function<void(int, uint32_t, uint32_t)> fn;
};
visitor_wrapper wrapper;
wrapper.fn = callback;
// Prepare callback function to pass to git_packbuilder_set_callbacks(...)
auto callback_c = [](int stage, uint32_t current, uint32_t total,
void *payload) {
auto wrapper = reinterpret_cast<visitor_wrapper *>(payload);
wrapper->fn(stage, current, total);
return 0;
};
if (git_packbuilder_set_callbacks(c_ptr_, callback_c, (void *)(&wrapper)))
throw git_exception();
}
void pack_builder::set_threads(unsigned int num_threads) {
if (git_packbuilder_set_threads(c_ptr_, num_threads))
throw git_exception();
}
void pack_builder::write(
const std::string &path, unsigned int mode,
std::function<void(const indexer::progress &)> &progress_callback) {
struct visitor_wrapper {
std::function<void(const indexer::progress &)> fn;
};
visitor_wrapper wrapper;
wrapper.fn = progress_callback;
auto callback_c = [](const git_indexer_progress *stats, void *payload) {
auto wrapper = reinterpret_cast<visitor_wrapper *>(payload);
wrapper->fn(indexer::progress(stats));
return 0;
};
if (git_packbuilder_write(c_ptr_, path.c_str(), mode, callback_c,
(void *)(&wrapper)))
throw git_exception();
}
data_buffer pack_builder::write_to_buffer() {
data_buffer result;
if (git_packbuilder_write_buf(result.c_ptr(), c_ptr_))
throw git_exception();
return result;
}
size_t pack_builder::written() const { return git_packbuilder_written(c_ptr_); }
const git_packbuilder *pack_builder::c_ptr() const { return c_ptr_; }
} // namespace cppgit2