-
Notifications
You must be signed in to change notification settings - Fork 1
/
ext.rs
438 lines (365 loc) · 16.5 KB
/
ext.rs
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
use std::libc::{c_char, c_void, c_int, c_uint, size_t};
/* from <git2/errors.h> */
pub struct git_error {
message: *c_char,
klass: super::GitError,
}
/* from <git2/errors.h> */
pub static GIT_OK:c_int = 0;
pub static GIT_ERROR:c_int = -1;
pub static GIT_ENOTFOUND:c_int = -3;
pub static GIT_EEXISTS:c_int = -4;
pub static GIT_EAMBIGUOUS:c_int = -5;
pub static GIT_EBUFS:c_int = -6;
pub static GIT_EUSER:c_int = -7;
pub static GIT_EBAREREPO:c_int = -8;
pub static GIT_EORPHANEDHEAD:c_int = -9;
pub static GIT_EUNMERGED:c_int = -10;
pub static GIT_ENONFASTFORWARD:c_int = -11;
pub static GIT_EINVALIDSPEC:c_int = -12;
pub static GIT_EMERGECONFLICT:c_int = -13;
pub static GIT_PASSTHROUGH:c_int = -30;
pub static GIT_ITEROVER:c_int = -31;
/* from <git2/remote.h> */
pub enum git_remote_autotag_option_t {
GIT_REMOTE_DOWNLOAD_TAGS_UNSET,
GIT_REMOTE_DOWNLOAD_TAGS_NONE,
GIT_REMOTE_DOWNLOAD_TAGS_AUTO,
GIT_REMOTE_DOWNLOAD_TAGS_ALL
}
/* from <git2/transport.h> */
pub struct git_transport {
set_callbacks: callback_t,
connect: callback_t,
ls: callback_t,
push: callback_t,
negotiate_fetch: callback_t,
download_pack: callback_t,
is_connected: callback_t,
read_flags: callback_t,
cancel: callback_t,
close: callback_t,
free: callback_t,
}
/* from <git2/strarray.h> */
pub struct git_strarray {
strings: **c_char,
count: size_t,
}
/* from <git2/checkout.h> */
type git_checkout_strategy_t = uint;
/** default is a dry run, no actual updates */
static GIT_CHECKOUT_NONE:git_checkout_strategy_t = 0;
/** Allow safe updates that cannot overwrite uncommitted data */
static GIT_CHECKOUT_SAFE:git_checkout_strategy_t = (1u << 0);
/** Allow safe updates plus creation of missing files */
static GIT_CHECKOUT_SAFE_CREATE:git_checkout_strategy_t = (1u << 1);
/** Allow all updates to force working directory to look like index */
static GIT_CHECKOUT_FORCE:git_checkout_strategy_t = (1u << 2);
/** Allow checkout to make safe updates even if conflicts are found */
static GIT_CHECKOUT_ALLOW_CONFLICTS:git_checkout_strategy_t = (1u << 4);
/** Remove untracked files not in index (that are not ignored) */
static GIT_CHECKOUT_REMOVE_UNTRACKED:git_checkout_strategy_t = (1u << 5);
/** Remove ignored files not in index */
static GIT_CHECKOUT_REMOVE_IGNORED:git_checkout_strategy_t = (1u << 6);
/** Only update existing files, don't create new ones */
static GIT_CHECKOUT_UPDATE_ONLY:git_checkout_strategy_t = (1u << 7);
/** Normally checkout updates index entries as it goes; this stops that */
static GIT_CHECKOUT_DONT_UPDATE_INDEX:git_checkout_strategy_t = (1u << 8);
/** Don't refresh index/config/etc before doing checkout */
static GIT_CHECKOUT_NO_REFRESH:git_checkout_strategy_t = (1u << 9);
/** Treat pathspec as simple list of exact match file paths */
static GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH:git_checkout_strategy_t = (1u << 13);
/** Ignore directories in use, they will be left empty */
static GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES:git_checkout_strategy_t = (1u << 18);
/**
* THE FOLLOWING OPTIONS ARE NOT YET IMPLEMENTED
*/
/** Allow checkout to skip unmerged files (NOT IMPLEMENTED) */
static GIT_CHECKOUT_SKIP_UNMERGED:git_checkout_strategy_t = (1u << 10);
/** For unmerged files, checkout stage 2 from index (NOT IMPLEMENTED) */
static GIT_CHECKOUT_USE_OURS:git_checkout_strategy_t = (1u << 11);
/** For unmerged files, checkout stage 3 from index (NOT IMPLEMENTED) */
static GIT_CHECKOUT_USE_THEIRS:git_checkout_strategy_t = (1u << 12);
/** Recursively checkout submodules with same options (NOT IMPLEMENTED) */
static GIT_CHECKOUT_UPDATE_SUBMODULES:git_checkout_strategy_t = (1u << 16);
/** Recursively checkout submodules if HEAD moved in super repo (NOT IMPLEMENTED) */
static GIT_CHECKOUT_UPDATE_SUBMODULES_IF_CHANGED:git_checkout_strategy_t = (1u << 17);
type git_checkout_notify_t = uint;
static GIT_CHECKOUT_NOTIFY_NONE:git_checkout_notify_t = 0;
static GIT_CHECKOUT_NOTIFY_CONFLICT:git_checkout_notify_t = (1u << 0);
static GIT_CHECKOUT_NOTIFY_DIRTY:git_checkout_notify_t = (1u << 1);
static GIT_CHECKOUT_NOTIFY_UPDATED:git_checkout_notify_t = (1u << 2);
static GIT_CHECKOUT_NOTIFY_UNTRACKED:git_checkout_notify_t = (1u << 3);
static GIT_CHECKOUT_NOTIFY_IGNORED:git_checkout_notify_t = (1u << 4);
/* from <git2/checkout.h> */
pub struct git_checkout_opts {
version: c_uint,
checkout_strategy: git_checkout_strategy_t,
disable_filters: c_int,
dir_mode: c_uint,
file_mode: c_uint,
file_open_flags: c_int,
notify_flags: git_checkout_notify_t,
notify_cb: callback_t,
notify_payload: *c_void,
progress_cb: callback_t,
progress_payload: *c_void,
paths: git_strarray,
baseline: *git_tree,
}
/* from <git2/clone.h> */
pub struct git_clone_options {
version: c_uint,
checkout_opts: git_checkout_opts,
bare: c_int,
fetch_progress_cb: callback_t,
fetch_progress_payload: *c_void,
remote_name: *c_char,
pushurl: *c_char,
fetch_spec: *c_char,
push_spec: *c_char,
cred_acquire_cb: callback_t,
cred_acquire_payload: *c_void,
transport: *git_transport,
remote_callbacks: callback_t,
remote_autotag: git_remote_autotag_option_t,
checkout_branch: *c_char,
}
/* from <git2/status.h> */
pub static GIT_STATUS_INDEX_NEW:c_uint = (1u << 0) as c_uint;
pub static GIT_STATUS_INDEX_MODIFIED:c_uint = (1u << 1) as c_uint;
pub static GIT_STATUS_INDEX_DELETED:c_uint = (1u << 2) as c_uint;
pub static GIT_STATUS_INDEX_RENAMED:c_uint = (1u << 3) as c_uint;
pub static GIT_STATUS_INDEX_TYPECHANGE:c_uint = (1u << 4) as c_uint;
pub static GIT_STATUS_WT_NEW:c_uint = (1u << 7) as c_uint;
pub static GIT_STATUS_WT_MODIFIED:c_uint = (1u << 8) as c_uint;
pub static GIT_STATUS_WT_DELETED:c_uint = (1u << 9) as c_uint;
pub static GIT_STATUS_WT_TYPECHANGE:c_uint = (1u << 10) as c_uint;
pub static GIT_STATUS_IGNORED:c_uint = (1u << 14) as c_uint;
/* from <git2/tree.h> */
pub enum git_treewalk_mode {
GIT_TREEWALK_PRE = 0, /* Pre-order */
GIT_TREEWALK_POST = 1, /* Post-order */
}
/* from <git2/types.h> */
pub type git_branch_t = c_uint;
pub static GIT_BRANCH_LOCAL: git_branch_t = 1;
pub static GIT_BRANCH_REMOTE: git_branch_t = 2;
// the storage size of these types are unknown
pub struct git_repository;
pub struct git_reference;
pub struct git_tree_entry;
pub struct git_treebuilder;
pub struct git_index;
pub struct git_object;
pub struct git_diff_list;
pub type git_tree = git_object;
pub type git_commit = git_object;
pub type git_blob = git_object;
#[cfg(target_os = "android")]
#[cfg(target_os = "freebsd")]
#[cfg(target_os = "linux")]
#[cfg(target_os = "macos")]
pub type git_time_t = i64;
#[cfg(target_os = "win32")]
pub type git_time_t = core::libc::types::os::arch::extra::time64_t;
pub type git_off_t = i64;
pub struct git_time {
time: git_time_t,
offset: c_int,
}
pub struct git_signature {
name: *c_char,
email: *c_char,
when: git_time,
}
pub struct git_diff_options {
version: c_uint,
flags: u32,
context_lines: u16,
interhunk_lines: u16,
old_prefix: *c_char,
new_prefix: *c_char,
pathspec: git_strarray,
max_size: git_off_t,
notify_cb: callback_t,
notify_payload: *c_void,
}
// value type of 'crust' functions is *u8
pub type callback_t = *u8;
#[link(name = "git2")]
extern {
/* from <git2/errors.h> */
pub fn giterr_last() -> *git_error;
/* from <git2/repository.h> */
pub fn git_repository_open(out: &mut *git_repository, path: *c_char) -> c_int;
pub fn git_repository_free(repo: *git_repository) -> c_void;
pub fn git_repository_discover(path_out: *mut c_char, path_size: size_t,
start_path: *c_char, across_fs: c_int,
ceiling_dirs: *c_char) -> c_int;
pub fn git_repository_path(repo: *git_repository) -> *c_char;
pub fn git_repository_workdir(repo: *git_repository) -> *c_char;
pub fn git_repository_init(out: &mut *git_repository, path: *c_char, is_bare: c_uint) -> c_int;
pub fn git_repository_head(out: &mut *git_reference, repo: *git_repository) -> c_int;
pub fn git_repository_is_empty(repo: *git_repository) -> c_int;
pub fn git_repository_is_bare(repo: *git_repository) -> c_int;
pub fn git_repository_index(out: &mut *git_index, repo: *git_repository) -> c_int;
/* from <git2/refs.h> */
pub fn git_reference_free(c_ref: *git_reference) -> c_void;
pub fn git_reference_lookup(out: &mut *git_reference, repo: *git_repository,
name: *c_char) -> c_int;
pub fn git_reference_resolve(out: &mut *git_reference, c_ref: *git_reference) -> c_int;
pub fn git_reference_target(c_ref: *git_reference) -> *super::OID;
/* from <git2/threads.h> */
pub fn git_threads_init() -> c_void;
pub fn git_threads_shutdown() -> c_void;
/* from <git2/clone.h> */
pub fn git_clone(out: &mut *git_repository, url: *c_char, local_path: *c_char,
options: *git_clone_options) -> c_int;
/* from <git2/checkout.h> */
pub fn git_checkout_head(repo: *git_repository, opts: *git_checkout_opts) -> c_int;
/* from <git2/index.h> */
pub fn git_index_free(index: *git_index) -> c_void;
pub fn git_index_write(index: *git_index) -> c_int;
pub fn git_index_write_tree(out: &mut super::OID, index: *git_index) -> c_int;
pub fn git_index_add_bypath(index: *git_index, path: *c_char) -> c_int;
pub fn git_index_remove_bypath(index: *git_index, path: *c_char) -> c_int;
pub fn git_index_read_tree(index: *git_index, tree: *git_tree) -> c_int;
pub fn git_index_clear(index: *git_index) -> c_void;
/* from <git2/status.h> */
pub fn git_status_foreach(repo: *git_repository, callback: callback_t,
payload: *c_void) -> c_int;
/* from <git2/branch.h> */
pub fn git_branch_name(out: &mut *c_char, c_ref: *git_reference) -> c_int;
/* from <git2/object.h> */
pub fn git_object_free(object: *git_object) -> c_void;
pub fn git_object_id(obj: *git_object) -> &super::OID;
pub fn git_object_lookup(out: &mut *git_object, repo: *git_repository, id: &super::OID,
otype: super::OType) -> c_int;
/* from <git2/oid.h> */
pub fn git_oid_fromstr(out: &mut super::OID, c_str: *c_char) -> c_int;
pub fn git_oid_fmt(out: *mut u8, oid: &super::OID) -> c_int;
/* from <git2/commit.h> */
pub fn git_commit_message_encoding(commit: *git_commit) -> *c_char;
pub fn git_commit_message(commit: *git_commit) -> *c_char;
pub fn git_commit_committer(commit: *git_commit) -> *git_signature;
pub fn git_commit_author(commit: *git_commit) -> *git_signature;
pub fn git_commit_tree(tree_out: &mut *git_tree, commit: *git_commit) -> c_int;
pub fn git_commit_parentcount(commit: *git_commit) -> c_uint;
pub fn git_commit_parent(out: &mut *git_commit, commit: *git_commit, n: c_uint) -> c_int;
pub fn git_commit_parent_id(commit: *git_commit, n: c_uint) -> *super::OID;
pub fn git_commit_nth_gen_ancestor(ancestor: &mut *git_commit, commit: *git_commit,
n: c_uint) -> c_int;
pub fn git_commit_create(id: &mut super::OID, repo: *git_repository,
update_ref: *c_char, author: &git_signature, committer: &git_signature,
message_encoding: *c_char, message: *c_char, tree: *git_tree,
parent_count: c_int, parents: **git_commit) -> c_int;
/* from <git2/tree.h> */
pub fn git_tree_id(tree: *git_tree) -> *super::OID;
pub fn git_tree_entrycount(tree: *git_tree) -> size_t;
pub fn git_tree_entry_byname(tree: *git_tree, filename: *c_char) -> *git_tree_entry;
pub fn git_tree_entry_byindex(tree: *git_tree, idx: size_t) -> *git_tree_entry;
pub fn git_tree_entry_byoid(tree: *git_tree, oid: &super::OID) -> *git_tree_entry;
pub fn git_tree_entry_bypath(out: &mut *git_tree_entry, tree: *git_tree,
path: *c_char) -> c_int;
pub fn git_tree_entry_dup(entry: *git_tree_entry) -> *git_tree_entry;
pub fn git_tree_entry_free(entry: *git_tree_entry) -> c_void;
pub fn git_tree_entry_name(entry: *git_tree_entry) -> *c_char;
pub fn git_tree_entry_id(entry: *git_tree_entry) -> *super::OID;
pub fn git_tree_entry_type(entry: *git_tree_entry) -> super::OType;
pub fn git_tree_entry_filemode(entry: *git_tree_entry) -> super::FileMode;
pub fn git_tree_entry_cmp(e1: *git_tree_entry, e2: *git_tree_entry) -> c_int;
pub fn git_treebuilder_create(out: &mut *git_treebuilder, source: *git_tree) -> c_int;
pub fn git_treebuilder_clear(bld: *git_treebuilder) -> c_void;
pub fn git_treebuilder_entrycount(bld: *git_treebuilder) -> c_uint;
pub fn git_treebuilder_free(bld: *git_treebuilder) -> c_void;
pub fn git_treebuilder_get(bld: *git_treebuilder, filename: *c_char) -> *git_tree_entry;
pub fn git_treebuilder_insert(out: &mut *git_tree_entry, bld: *git_treebuilder,
filename: *c_char, id: &super::OID, filemode: super::FileMode) -> c_int;
pub fn git_treebuilder_remove(bld: *git_treebuilder, filename: *c_char) -> c_int;
pub fn git_treebuilder_filter(bld: *git_treebuilder, filter: callback_t,
payload: *c_void) -> c_void;
pub fn git_treebuilder_write(id: &mut super::OID, repo: *git_repository,
bld: *git_treebuilder) -> c_int;
pub fn git_tree_walk(tree: *git_tree, mode: git_treewalk_mode, callback: callback_t,
payload: *c_void) -> c_int;
/* from <git2/blob.h> */
pub fn git_blob_rawcontent(blob: *git_blob) -> *c_void;
pub fn git_blob_rawsize(blob: *git_blob) -> git_off_t;
pub fn git_blob_create_fromworkdir(id: &mut super::OID, repo: *git_repository,
relative_path: *c_char) -> c_int;
pub fn git_blob_create_fromdisk(id: &mut super::OID, repo: *git_repository,
path: *c_char) -> c_int;
pub fn git_blob_create_fromchunks(id: &mut super::OID, repo: *git_repository,
hintpath: *c_char, callback: callback_t, payload: *c_void) -> c_int;
pub fn git_blob_create_frombuffer(oid: &mut super::OID, repo: *git_repository,
buffer: *c_void, len: size_t) -> c_int;
pub fn git_blob_is_binary(blob: *git_blob) -> c_int;
/* from <git2/branch.h> */
pub fn git_branch_create(out: &mut *git_reference, repo: *git_repository,
branch_name: *c_char, target: *git_commit, force: c_int) -> c_int;
pub fn git_branch_delete(branch: *git_reference) -> c_int;
pub fn git_branch_foreach(repo: *git_repository, list_flags: c_uint, branch_cb: callback_t,
payload: *c_void) -> c_int;
pub fn git_branch_move(out: &mut *git_reference, branch: *git_reference,
new_branch_name: *c_char, force: c_int) -> c_int;
pub fn git_branch_lookup(out: &mut *git_reference, repo: *git_repository,
branch_name: *c_char, branch_type: git_branch_t) -> c_int;
pub fn git_branch_upstream(out: &mut *git_reference, branch: *git_reference) -> c_int;
pub fn git_branch_set_upstream(branch: *git_reference, upstream_name: *c_char) -> c_int;
pub fn git_branch_upstream_name(tracking_branch_name_out: *mut c_char, buffer_size: size_t,
repo: *git_repository, canonical_branch_name: *c_char) -> c_int;
pub fn git_branch_is_head(branch: *git_reference) -> c_int;
pub fn git_branch_remote_name(remote_name_out: *mut c_char, buffer_size: size_t,
repo: *git_repository, canonical_branch_name: *c_char) -> c_int;
/* from <git2/diff.h> */
pub fn git_diff_list_free(diff: *git_diff_list) -> c_void;
pub fn git_diff_tree_to_tree(diff: &mut *git_diff_list, repo: *git_repository,
old_tree: *git_tree, new_tree: *git_tree, opts: *git_diff_options) -> c_int;
}
/* from <git2/commit.h> */
#[inline]
pub unsafe fn git_commit_lookup(commit: &mut *git_commit, repo: *git_repository,
id: &super::OID) -> c_int
{
git_object_lookup(commit, repo, id, super::GIT_OBJ_COMMIT)
}
#[inline]
pub unsafe fn git_commit_free(commit: *git_commit) -> c_void
{
git_object_free(commit)
}
#[inline]
pub unsafe fn git_commit_id(commit: *git_commit) -> &super::OID
{
git_object_id(commit)
}
/* from <git2/tree.h> */
#[inline]
pub unsafe fn git_tree_free(tree: *git_tree) -> c_void
{
git_object_free(tree)
}
#[inline]
pub unsafe fn git_tree_lookup(out: &mut *git_tree, repo: *git_repository, id: &super::OID) -> c_int
{
git_object_lookup(out, repo, id, super::GIT_OBJ_TREE)
}
/* from <git2/blob.h> */
#[inline]
pub unsafe fn git_blob_id(blob: *git_blob) -> &super::OID
{
git_object_id(blob)
}
#[inline]
pub unsafe fn git_blob_lookup(blob: &mut *git_blob, repo: *git_repository, id: &super::OID)
-> c_int
{
git_object_lookup(blob, repo, id, super::GIT_OBJ_BLOB)
}
#[inline]
pub unsafe fn git_blob_free(blob: *git_blob) -> c_void
{
git_object_free(blob)
}