1 #include <stdlib.h>
2 #include <assert.h>
3 
4 #include "emacs-module.h"
5 #include "git2.h"
6 
7 #ifdef EGIT_DEBUG
8 #include "egit-debug.h"
9 #endif
10 
11 #include "interface.h"
12 #include "egit-annotated-commit.h"
13 #include "egit-blame.h"
14 #include "egit-blob.h"
15 #include "egit-branch.h"
16 #include "egit-checkout.h"
17 #include "egit-cherrypick.h"
18 #include "egit-clone.h"
19 #include "egit-commit.h"
20 #include "egit-config.h"
21 #include "egit-cred.h"
22 #include "egit-describe.h"
23 #include "egit-diff.h"
24 #include "egit-graph.h"
25 #include "egit-ignore.h"
26 #include "egit-index.h"
27 #include "egit-libgit2.h"
28 #include "egit-merge.h"
29 #include "egit-message.h"
30 #include "egit-object.h"
31 #include "egit-pathspec.h"
32 #include "egit-reference.h"
33 #include "egit-reflog.h"
34 #include "egit-refspec.h"
35 #include "egit-remote.h"
36 #include "egit-repository.h"
37 #include "egit-reset.h"
38 #include "egit-revparse.h"
39 #include "egit-revert.h"
40 #include "egit-revwalk.h"
41 #include "egit-signature.h"
42 #include "egit-status.h"
43 #include "egit-submodule.h"
44 #include "egit-tag.h"
45 #include "egit-transaction.h"
46 #include "egit-tree.h"
47 #include "egit-treebuilder.h"
48 #include "egit.h"
49 
egit_get_type(emacs_env * env,emacs_value _obj)50 egit_type egit_get_type(emacs_env *env, emacs_value _obj)
51 {
52     if (!em_user_ptrp(env, _obj))
53         return EGIT_UNKNOWN;
54     egit_object *obj = (egit_object*) EM_EXTRACT_USER_PTR(_obj);
55     return obj->type;
56 }
57 
egit_assert_type(emacs_env * env,emacs_value obj,egit_type type,emacs_value predicate)58 bool egit_assert_type(emacs_env *env, emacs_value obj, egit_type type, emacs_value predicate)
59 {
60     if (type == egit_get_type(env, obj))
61         return true;
62     em_signal_wrong_type(env, predicate, obj);
63     return false;
64 }
65 
egit_assert_object(emacs_env * env,emacs_value obj)66 bool egit_assert_object(emacs_env *env, emacs_value obj)
67 {
68     egit_type type = egit_get_type(env, obj);
69     if (type == EGIT_COMMIT || type == EGIT_TREE ||
70         type == EGIT_BLOB || type == EGIT_TAG || type == EGIT_OBJECT)
71         return true;
72     em_signal_wrong_type(env, esym_libgit_object_p, obj);
73     return false;
74 }
75 
egit_assert_list(emacs_env * env,egit_type type,emacs_value predicate,emacs_value arg)76 ptrdiff_t egit_assert_list(emacs_env *env, egit_type type, emacs_value predicate, emacs_value arg)
77 {
78     ptrdiff_t nelems = 0;
79 
80     while (em_consp(env, arg)) {
81         emacs_value car = em_car(env, arg);
82         if (!egit_assert_type(env, car, type, predicate))
83             return -1;
84         nelems++;
85         arg = em_cdr(env, arg);
86     }
87 
88     if (EM_EXTRACT_BOOLEAN(arg)) {
89         em_signal_wrong_type(env, esym_listp, arg);
90         return -1;
91     }
92 
93     return nelems;
94 }
95 
egit_finalize(void * _obj)96 void egit_finalize(void* _obj)
97 {
98 #ifdef EGIT_DEBUG
99     egit_signal_finalize(_obj);
100 #endif
101 
102     // The argument type must be void* to make this function work as an Emacs finalizer
103     egit_object *obj = (egit_object*)_obj;
104     egit_object *parent = obj->parent;
105 
106     // For reference-counted types, decref and possibly abort
107     switch (obj->type) {
108     case EGIT_BLAME:
109     case EGIT_DIFF:
110     case EGIT_INDEX:
111     case EGIT_REFLOG:
112     case EGIT_REMOTE:
113     case EGIT_REPOSITORY:
114         obj->refcount--;
115         if (obj->refcount != 0)
116             return;
117     default: break;
118     }
119 
120 #ifdef EGIT_DEBUG
121     egit_signal_free(_obj);
122 #endif
123 
124     // Free the object based on its type
125     // For types that only expose weak pointers to the parent, this should be a no-op
126     switch (obj->type) {
127     case EGIT_COMMIT: case EGIT_TREE: case EGIT_BLOB: case EGIT_TAG: case EGIT_OBJECT:
128         git_object_free(obj->ptr); break;
129     case EGIT_BLAME: git_blame_free(obj->ptr); break;
130     case EGIT_DIFF: git_diff_free(obj->ptr); break;
131     case EGIT_INDEX: git_index_free(obj->ptr); break;
132     case EGIT_REFLOG: git_reflog_free(obj->ptr); break;
133     case EGIT_REMOTE: git_remote_free(obj->ptr); break;
134     case EGIT_REPOSITORY: git_repository_free(obj->ptr); break;
135     case EGIT_REFERENCE: git_reference_free(obj->ptr); break;
136     case EGIT_CONFIG: git_config_free(obj->ptr); break;
137     case EGIT_SIGNATURE: git_signature_free(obj->ptr); break;
138     case EGIT_TRANSACTION: git_transaction_free(obj->ptr); break;
139     case EGIT_SUBMODULE: git_submodule_free(obj->ptr); break;
140     case EGIT_CRED: git_cred_free(obj->ptr); break;
141     case EGIT_ANNOTATED_COMMIT: git_annotated_commit_free(obj->ptr); break;
142     case EGIT_REVWALK: git_revwalk_free(obj->ptr); break;
143     case EGIT_TREEBUILDER: git_treebuilder_free(obj->ptr); break;
144     case EGIT_PATHSPEC: git_pathspec_free(obj->ptr); break;
145     case EGIT_PATHSPEC_MATCH_LIST: git_pathspec_match_list_free(obj->ptr); break;
146     default: break;
147     }
148 
149     // Free the wrapper, then release the reference to the parent, if applicable
150     free(obj);
151     if (parent)
152         egit_finalize(parent);
153 }
154 
egit_wrap(emacs_env * env,egit_type type,const void * data,egit_object * parent)155 emacs_value egit_wrap(emacs_env *env, egit_type type, const void* data, egit_object *parent)
156 {
157     // If it's a git_object, try to be more specific
158     if (type == EGIT_OBJECT) {
159         switch (git_object_type(data)) {
160         case GIT_OBJ_COMMIT: type = EGIT_COMMIT; break;
161         case GIT_OBJ_TREE: type = EGIT_TREE; break;
162         case GIT_OBJ_BLOB: type = EGIT_BLOB; break;
163         case GIT_OBJ_TAG: type = EGIT_TAG; break;
164         default: break;
165         }
166     }
167 
168     // Increase refcounts of owner object(s), if applicable
169     if (parent)
170         parent->refcount++;
171 
172     egit_object *wrapper;
173     wrapper = (egit_object*) malloc(sizeof(egit_object));
174     wrapper->type = type;
175     wrapper->ptr = (void*) data;
176     wrapper->parent = parent;
177 
178     // This has no effect for types that are not reference-counted
179     wrapper->refcount = 1;
180 
181 #ifdef EGIT_DEBUG
182     egit_signal_alloc(wrapper);
183 #endif
184 
185     return EM_USER_PTR(wrapper, egit_finalize);
186 }
187 
188 typedef emacs_value (*func_0)(emacs_env*);
189 typedef emacs_value (*func_1)(emacs_env*, emacs_value);
190 typedef emacs_value (*func_2)(emacs_env*, emacs_value, emacs_value);
191 typedef emacs_value (*func_3)(emacs_env*, emacs_value, emacs_value, emacs_value);
192 typedef emacs_value (*func_4)(emacs_env*, emacs_value, emacs_value, emacs_value,
193                               emacs_value);
194 typedef emacs_value (*func_5)(emacs_env*, emacs_value, emacs_value, emacs_value,
195                               emacs_value, emacs_value);
196 typedef emacs_value (*func_6)(emacs_env*, emacs_value, emacs_value, emacs_value,
197                               emacs_value, emacs_value, emacs_value);
198 typedef emacs_value (*func_7)(emacs_env*, emacs_value, emacs_value, emacs_value,
199                               emacs_value, emacs_value, emacs_value, emacs_value);
200 
201 // Get an argument index, or nil. Useful for simulating optional arguments.
202 #define GET_SAFE(arglist, nargs, index) ((index) < (nargs) ? (arglist)[(index)] : esym_nil)
203 
egit_dispatch_0(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)204 static emacs_value egit_dispatch_0(emacs_env *env, __attribute__((unused)) ptrdiff_t nargs,
205                             __attribute__((unused)) emacs_value *args, void *data)
206 {
207     func_0 func = (func_0) data;
208     return func(env);
209 }
210 
egit_dispatch_1(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)211 static emacs_value egit_dispatch_1(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
212 {
213     func_1 func = (func_1) data;
214     return func(env, GET_SAFE(args, nargs, 0));
215 }
216 
egit_dispatch_2(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)217 static emacs_value egit_dispatch_2(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
218 {
219     func_2 func = (func_2) data;
220     return func(env, GET_SAFE(args, nargs, 0), GET_SAFE(args, nargs, 1));
221 }
222 
egit_dispatch_3(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)223 static emacs_value egit_dispatch_3(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
224 {
225     func_3 func = (func_3) data;
226     return func(env, GET_SAFE(args, nargs, 0), GET_SAFE(args, nargs, 1), GET_SAFE(args, nargs, 2));
227 }
228 
egit_dispatch_4(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)229 static emacs_value egit_dispatch_4(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
230 {
231     func_4 func = (func_4) data;
232     return func(env, GET_SAFE(args, nargs, 0), GET_SAFE(args, nargs, 1), GET_SAFE(args, nargs, 2),
233                 GET_SAFE(args, nargs, 3));
234 }
235 
egit_dispatch_5(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)236 static emacs_value egit_dispatch_5(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
237 {
238     func_5 func = (func_5) data;
239     return func(env, GET_SAFE(args, nargs, 0), GET_SAFE(args, nargs, 1), GET_SAFE(args, nargs, 2),
240                 GET_SAFE(args, nargs, 3), GET_SAFE(args, nargs, 4));
241 }
242 
egit_dispatch_6(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)243 static emacs_value egit_dispatch_6(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
244 {
245     func_6 func = (func_6) data;
246     return func(env, GET_SAFE(args, nargs, 0), GET_SAFE(args, nargs, 1), GET_SAFE(args, nargs, 2),
247                 GET_SAFE(args, nargs, 3), GET_SAFE(args, nargs, 4), GET_SAFE(args, nargs, 5));
248 }
249 
egit_dispatch_7(emacs_env * env,ptrdiff_t nargs,emacs_value * args,void * data)250 static emacs_value egit_dispatch_7(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data)
251 {
252     func_7 func = (func_7) data;
253     return func(env, GET_SAFE(args, nargs, 0), GET_SAFE(args, nargs, 1), GET_SAFE(args, nargs, 2),
254                 GET_SAFE(args, nargs, 3), GET_SAFE(args, nargs, 4), GET_SAFE(args, nargs, 5),
255                 GET_SAFE(args, nargs, 6));
256 }
257 
egit_dispatch_error(emacs_env * env,int retval)258 bool egit_dispatch_error(emacs_env *env, int retval)
259 {
260     if (retval >= 0) return false;
261 
262     const git_error *err = giterr_last();
263     if (!err) return false;
264 
265     emacs_value error = em_findenum_error(err->klass);
266     if (!EM_EXTRACT_BOOLEAN(error))
267         error = esym_giterr;
268 
269     em_signal(env, error, err->message);
270     return true;
271 }
272 
273 EGIT_DOC(typeof, "OBJ", "Return the type of the git pointer OBJ, or nil.");
egit_typeof(emacs_env * env,emacs_value val)274 static emacs_value egit_typeof(emacs_env *env, emacs_value val)
275 {
276     switch (egit_get_type(env, val)) {
277     case EGIT_REPOSITORY: return esym_repository;
278     case EGIT_REFERENCE: return esym_reference;
279     case EGIT_COMMIT: return esym_commit;
280     case EGIT_TREE: return esym_tree;
281     case EGIT_BLOB: return esym_blob;
282     case EGIT_TAG: return esym_tag;
283     case EGIT_OBJECT: return esym_object;
284     case EGIT_BLAME: return esym_blame;
285     case EGIT_BLAME_HUNK: return esym_blame_hunk;
286     case EGIT_CONFIG: return esym_config;
287     case EGIT_TRANSACTION: return esym_transaction;
288     case EGIT_INDEX: return esym_index;
289     case EGIT_INDEX_ENTRY: return esym_index_entry;
290     case EGIT_DIFF: return esym_diff;
291     case EGIT_DIFF_DELTA: return esym_diff_delta;
292     case EGIT_DIFF_BINARY: return esym_diff_binary;
293     case EGIT_DIFF_HUNK: return esym_diff_hunk;
294     case EGIT_DIFF_LINE: return esym_diff_line;
295     case EGIT_PATHSPEC: return esym_pathspec;
296     case EGIT_PATHSPEC_MATCH_LIST: return esym_pathspec_match_list;
297     case EGIT_REMOTE: return esym_remote;
298     case EGIT_REFSPEC: return esym_refspec;
299     case EGIT_SUBMODULE: return esym_submodule;
300     case EGIT_CRED: return esym_cred;
301     case EGIT_ANNOTATED_COMMIT: return esym_annotated_commit;
302     case EGIT_REFLOG: return esym_reflog;
303     case EGIT_REFLOG_ENTRY: return esym_reflog_entry;
304     case EGIT_REVWALK: return esym_revwalk;
305     case EGIT_TREEBUILDER: return esym_treebuilder;
306     default: return esym_nil;
307     }
308 }
309 
310 #define TYPECHECKER(caps, small, text)                                  \
311     EGIT_DOC(small##_p, "OBJ", "Return non-nil if OBJ is a git " text "."); \
312     static emacs_value egit_##small##_p(emacs_env *env, emacs_value obj)\
313     {                                                                   \
314         return egit_get_type(env, obj) == EGIT_##caps ? esym_t : esym_nil;  \
315     }
316 
317 TYPECHECKER(ANNOTATED_COMMIT, annotated_commit, "annotated commit");
318 TYPECHECKER(BLAME, blame, "blame");
319 TYPECHECKER(BLAME_HUNK, blame_hunk, "blame hunk");
320 TYPECHECKER(COMMIT, commit, "commit");
321 TYPECHECKER(BLOB, blob, "blob");
322 TYPECHECKER(CONFIG, config, "config");
323 TYPECHECKER(CRED, cred, "credential");
324 TYPECHECKER(DIFF, diff, "diff");
325 TYPECHECKER(DIFF_DELTA, diff_delta, "diff delta");
326 TYPECHECKER(DIFF_BINARY, diff_binary, "diff binary");
327 TYPECHECKER(DIFF_HUNK, diff_hunk, "diff hunk");
328 TYPECHECKER(DIFF_LINE, diff_line, "diff line");
329 TYPECHECKER(INDEX, index, "index.");
330 TYPECHECKER(INDEX_ENTRY, index_entry, "index entry");
331 TYPECHECKER(PATHSPEC, pathspec, "pathspec");
332 TYPECHECKER(PATHSPEC_MATCH_LIST, pathspec_match_list, "pathspec match list");
333 TYPECHECKER(REFERENCE, reference, "reference");
334 TYPECHECKER(REFLOG, reflog, "reflog");
335 TYPECHECKER(REFLOG_ENTRY, reflog_entry, "reflog entry");
336 TYPECHECKER(REFSPEC, refspec, "refspec");
337 TYPECHECKER(REMOTE, remote, "remote");
338 TYPECHECKER(REPOSITORY, repository, "repository");
339 TYPECHECKER(REVWALK, revwalk, "repository");
340 TYPECHECKER(SIGNATURE, signature, "signature");
341 TYPECHECKER(SUBMODULE, submodule, "submodule");
342 TYPECHECKER(TAG, tag, "tag");
343 TYPECHECKER(TRANSACTION, transaction, "transaction");
344 TYPECHECKER(TREE, tree, "tree");
345 TYPECHECKER(TREEBUILDER, treebuilder, "treebuilder");
346 
347 #undef TYPECHECKER
348 
349 EGIT_DOC(object_p, "OBJ", "Return non-nil if OBJ is a git object.");
egit_object_p(emacs_env * env,emacs_value obj)350 static emacs_value egit_object_p(emacs_env *env, emacs_value obj)
351 {
352     egit_type type = egit_get_type(env, obj);
353     return (type == EGIT_COMMIT || type == EGIT_TREE || type == EGIT_BLOB ||
354             type == EGIT_TAG || type == EGIT_OBJECT) ? esym_t : esym_nil;
355 }
356 
357 #define DEFUN(ename, cname, min_nargs, max_nargs)                       \
358     em_defun(env, (ename),                                              \
359              env->make_function(                                        \
360                  env, (min_nargs), (max_nargs),                         \
361                  egit_dispatch_##max_nargs,                             \
362                  egit_##cname##__doc,                                   \
363                  egit_##cname))
364 
egit_init(emacs_env * env)365 void egit_init(emacs_env *env)
366 {
367     // Debug mode functions
368 #ifdef EGIT_DEBUG
369     DEFUN("libgit--allocs", _allocs, 0, 0);
370     DEFUN("libgit--finalizes", _finalizes, 0, 0);
371     DEFUN("libgit--frees", _frees, 0, 0);
372     DEFUN("libgit--refcount", _refcount, 1, 1);
373     DEFUN("libgit--wrapper", _wrapper, 1, 1);
374     DEFUN("libgit--wrapped", _wrapped, 1, 1);
375     DEFUN("libgit--parent-wrapper", _parent_wrapper, 1, 1);
376 #endif
377 
378     // Type checkers
379     DEFUN("libgit-typeof", typeof, 1, 1);
380     DEFUN("libgit-annotated-commit-p", annotated_commit_p, 1, 1);
381     DEFUN("libgit-blame-p", blame_p, 1, 1);
382     DEFUN("libgit-blame-hunk-p", blame_hunk_p, 1, 1);
383     DEFUN("libgit-blob-p", blob_p, 1, 1);
384     DEFUN("libgit-commit-p", commit_p, 1, 1);
385     DEFUN("libgit-config-p", config_p, 1, 1);
386     DEFUN("libgit-cred-p", cred_p, 1, 1);
387     DEFUN("libgit-diff-p", diff_p, 1, 1);
388     DEFUN("libgit-diff-delta-p", diff_delta_p, 1, 1);
389     DEFUN("libgit-diff-binary-p", diff_binary_p, 1, 1);
390     DEFUN("libgit-diff-hunk-p", diff_hunk_p, 1, 1);
391     DEFUN("libgit-diff-line-p", diff_line_p, 1, 1);
392     DEFUN("libgit-index-p", index_p, 1, 1);
393     DEFUN("libgit-index-entry-p", index_entry_p, 1, 1);
394     DEFUN("libgit-object-p", object_p, 1, 1);
395     DEFUN("libgit-pathspec-p", pathspec_p, 1, 1);
396     DEFUN("libgit-pathspec-match-list-p", pathspec_match_list_p, 1, 1);
397     DEFUN("libgit-reference-p", reference_p, 1, 1);
398     DEFUN("libgit-reflog-p", reflog_p, 1, 1);
399     DEFUN("libgit-reflog-entry-p", reflog_entry_p, 1, 1);
400     DEFUN("libgit-refspec-p", refspec_p, 1, 1);
401     DEFUN("libgit-remote-p", remote_p, 1, 1);
402     DEFUN("libgit-repository-p", repository_p, 1, 1);
403     DEFUN("libgit-revwalk-p", revwalk_p, 1, 1);
404     DEFUN("libgit-signature-p", signature_p, 1, 1);
405     DEFUN("libgit-submodule-p", submodule_p, 1, 1);
406     DEFUN("libgit-tag-p", tag_p, 1, 1);
407     DEFUN("libgit-transaction-p", transaction_p, 1, 1);
408     DEFUN("libgit-tree-p", tree_p, 1, 1);
409     DEFUN("libgit-treebuilder-p", treebuilder_p, 1, 1);
410 
411     // Libgit2 (not namespaced as others!)
412     DEFUN("libgit-feature-p", libgit2_feature_p, 1, 1);
413     DEFUN("libgit-version", libgit2_version, 0, 0);
414 
415     // Annotated commit
416     DEFUN("libgit-annotated-commit-from-ref", annotated_commit_from_ref, 2, 2);
417     DEFUN("libgit-annotated-commit-from-fetchhead", annotated_commit_from_fetchhead, 4, 4);
418     DEFUN("libgit-annotated-commit-from-revspec", annotated_commit_from_revspec, 2, 2);
419     DEFUN("libgit-annotated-commit-lookup", annotated_commit_lookup, 2, 2);
420     DEFUN("libgit-annotated-commit-id", annotated_commit_id, 1, 1);
421 
422     // Blame
423     DEFUN("libgit-blame-file", blame_file, 2, 3);
424     DEFUN("libgit-blame-get-hunk-byindex", blame_get_hunk_byindex, 2, 2);
425     DEFUN("libgit-blame-get-hunk-byline", blame_get_hunk_byline, 2, 2);
426     DEFUN("libgit-blame-get-hunk-count", blame_get_hunk_count, 1, 1);
427 
428     DEFUN("libgit-blame-hunk-commit-id", blame_hunk_commit_id, 1, 2);
429     DEFUN("libgit-blame-hunk-lines", blame_hunk_lines, 1, 1);
430     DEFUN("libgit-blame-hunk-orig-path", blame_hunk_orig_path, 1, 1);
431     DEFUN("libgit-blame-hunk-signature", blame_hunk_signature, 1, 2);
432     DEFUN("libgit-blame-hunk-start-line-number", blame_hunk_start_line_number, 1, 2);
433 
434     // Blob
435     DEFUN("libgit-blob-create-fromdisk", blob_create_fromdisk, 2, 2);
436     DEFUN("libgit-blob-create-fromstring", blob_create_fromstring, 2, 2);
437     DEFUN("libgit-blob-create-fromworkdir", blob_create_fromworkdir, 2, 2);
438     DEFUN("libgit-blob-lookup", blob_lookup, 2, 2);
439     DEFUN("libgit-blob-lookup-prefix", blob_lookup_prefix, 2, 2);
440 
441     DEFUN("libgit-blob-binary-p", blob_binary_p, 1, 1);
442     DEFUN("libgit-blob-filtered-content", blob_filtered_content, 2, 3);
443     DEFUN("libgit-blob-id", blob_id, 1, 1);
444     DEFUN("libgit-blob-owner", blob_owner, 1, 1);
445     DEFUN("libgit-blob-rawcontent", blob_rawcontent, 1, 1);
446     DEFUN("libgit-blob-rawsize", blob_rawsize, 1, 1);
447 
448     // Branch
449     DEFUN("libgit-branch-create", branch_create, 3, 4);
450     DEFUN("libgit-branch-create-from-annotated", branch_create_from_annotated, 3, 4);
451     DEFUN("libgit-branch-lookup", branch_lookup, 2, 3);
452     DEFUN("libgit-branch-delete", branch_delete, 1, 1);
453     DEFUN("libgit-branch-checked-out-p", branch_checked_out_p, 1, 1);
454     DEFUN("libgit-branch-foreach", branch_foreach, 3, 3);
455     DEFUN("libgit-branch-head-p", branch_head_p, 1, 1);
456     DEFUN("libgit-branch-move", branch_move, 2, 3);
457     DEFUN("libgit-branch-name", branch_name, 1, 1);
458     DEFUN("libgit-branch-remote-name", branch_remote_name, 2, 2);
459     DEFUN("libgit-branch-set-upstream", branch_set_upstream, 2, 2);
460     DEFUN("libgit-branch-upstream", branch_upstream, 1, 1);
461     DEFUN("libgit-branch-upstream-name", branch_upstream_name, 2, 2);
462     DEFUN("libgit-branch-upstream-remote", branch_upstream_remote, 2, 2);
463 
464     // Checkout
465     DEFUN("libgit-checkout-head", checkout_head, 1, 2);
466     DEFUN("libgit-checkout-index", checkout_index, 1, 3);
467     DEFUN("libgit-checkout-tree", checkout_tree, 1, 3);
468 
469     // Cherrypick
470     DEFUN("libgit-cherrypick", cherrypick, 2, 5);
471     DEFUN("libgit-cherrypick-commit", cherrypick_commit, 3, 5);
472 
473     // Clone
474     DEFUN("libgit-clone", clone, 2, 2);
475 
476     // Commit
477     DEFUN("libgit-commit-lookup", commit_lookup, 2, 2);
478     DEFUN("libgit-commit-lookup-prefix", commit_lookup_prefix, 2, 2);
479 
480     DEFUN("libgit-commit-author", commit_author, 1, 1);
481     DEFUN("libgit-commit-body", commit_body, 1, 1);
482     DEFUN("libgit-commit-committer", commit_committer, 1, 1);
483     DEFUN("libgit-commit-id", commit_id, 1, 1);
484     DEFUN("libgit-commit-message", commit_message, 1, 1);
485     DEFUN("libgit-commit-nth-gen-ancestor", commit_nth_gen_ancestor, 2, 2);
486     DEFUN("libgit-commit-owner", commit_owner, 1, 1);
487     DEFUN("libgit-commit-parent", commit_parent, 1, 2);
488     DEFUN("libgit-commit-parent-id", commit_parent_id, 1, 2);
489     DEFUN("libgit-commit-parentcount", commit_parentcount, 1, 1);
490     DEFUN("libgit-commit-summary", commit_summary, 1, 1);
491     DEFUN("libgit-commit-time", commit_time, 1, 1);
492     DEFUN("libgit-commit-tree", commit_tree, 1, 1);
493     DEFUN("libgit-commit-tree-id", commit_tree_id, 1, 1);
494 
495     DEFUN("libgit-commit-create", commit_create, 6, 7);
496 
497     // Config
498     DEFUN("libgit-config-new", config_new, 0, 0);
499     DEFUN("libgit-config-open-default", config_open_default, 0, 0);
500     DEFUN("libgit-config-open-global", config_open_global, 1, 1);
501     DEFUN("libgit-config-open-level", config_open_level, 1, 2);
502     DEFUN("libgit-config-open-ondisk", config_open_ondisk, 1, 1);
503     DEFUN("libgit-config-snapshot", config_snapshot, 1, 1);
504 
505     DEFUN("libgit-config-get-bool", config_get_bool, 2, 2);
506     DEFUN("libgit-config-get-int", config_get_int, 2, 2);
507     DEFUN("libgit-config-get-path", config_get_path, 2, 2);
508     DEFUN("libgit-config-get-string", config_get_string, 2, 2);
509     DEFUN("libgit-config-lock", config_lock, 1, 1);
510 
511     DEFUN("libgit-config-set-bool", config_set_bool, 3, 3);
512     DEFUN("libgit-config-set-int", config_set_int, 3, 3);
513     DEFUN("libgit-config-set-string", config_set_string, 3, 3);
514 
515     DEFUN("libgit-config-add-file-ondisk", config_add_file_ondisk, 2, 5);
516     DEFUN("libgit-config-delete-entry", config_delete_entry, 2, 2);
517     DEFUN("libgit-config-delete-multivar", config_delete_multivar, 3, 3);
518 
519     DEFUN("libgit-config-find-global", config_find_global, 0, 0);
520     DEFUN("libgit-config-find-programdata", config_find_programdata, 0, 0);
521     DEFUN("libgit-config-find-system", config_find_system, 0, 0);
522     DEFUN("libgit-config-find-xdg", config_find_xdg, 0, 0);
523 
524     // Cred
525     DEFUN("libgit-cred-default-new", cred_default_new, 0, 0);
526     DEFUN("libgit-cred-ssh-key-from-agent", cred_ssh_key_from_agent, 1, 1);
527     DEFUN("libgit-cred-ssh-key-memory-new", cred_ssh_key_memory_new, 4, 4);
528     DEFUN("libgit-cred-ssh-key-new", cred_ssh_key_new, 4, 4);
529     DEFUN("libgit-cred-username-new", cred_username_new, 1, 1);
530     DEFUN("libgit-cred-userpass-plaintext-new", cred_userpass_plaintext_new, 2, 2);
531     DEFUN("libgit-cred-username-p", cred_username_p, 1, 1);
532 
533     // Describe
534     DEFUN("libgit-describe-commit", describe_commit, 1, 2);
535     DEFUN("libgit-describe-workdir", describe_workdir, 1, 2);
536 
537     // Diff
538     DEFUN("libgit-diff-index-to-index", diff_index_to_index, 3, 4);
539     DEFUN("libgit-diff-index-to-workdir", diff_index_to_workdir, 1, 3);
540     DEFUN("libgit-diff-tree-to-index", diff_tree_to_index, 1, 4);
541     DEFUN("libgit-diff-tree-to-tree", diff_tree_to_tree, 1, 4);
542     DEFUN("libgit-diff-tree-to-workdir", diff_tree_to_workdir, 1, 3);
543     DEFUN("libgit-diff-tree-to-workdir-with-index", diff_tree_to_workdir_with_index, 1, 3);
544     DEFUN("libgit-diff-find-similar", diff_find_similar, 1, 2);
545 
546     DEFUN("libgit-diff-foreach", diff_foreach, 2, 5);
547     DEFUN("libgit-diff-print", diff_print, 1, 3);
548 
549     DEFUN("libgit-diff-delta-file-id", diff_delta_file_id, 1, 2);
550     DEFUN("libgit-diff-delta-file-path", diff_delta_file_path, 1, 2);
551     DEFUN("libgit-diff-delta-nfiles", diff_delta_nfiles, 1, 1);
552     DEFUN("libgit-diff-delta-similarity", diff_delta_similarity, 1, 1);
553     DEFUN("libgit-diff-delta-status", diff_delta_status, 1, 1);
554     DEFUN("libgit-diff-delta-file-exists-p", diff_delta_file_exists_p, 1, 2);
555 
556     DEFUN("libgit-diff-hunk-header", diff_hunk_header, 1, 1);
557     DEFUN("libgit-diff-hunk-lines", diff_hunk_lines, 1, 2);
558     DEFUN("libgit-diff-hunk-start", diff_hunk_start, 1, 2);
559 
560     DEFUN("libgit-diff-line-origin", diff_line_origin, 1, 1);
561     DEFUN("libgit-diff-line-lineno", diff_line_lineno, 2, 2);
562     DEFUN("libgit-diff-line-content", diff_line_content, 1, 1);
563 
564     DEFUN("libgit-diff-get-delta", diff_get_delta, 2, 2);
565     DEFUN("libgit-diff-num-deltas", diff_num_deltas, 1, 2);
566 
567     // Graph
568     DEFUN("libgit-graph-ahead-behind", graph_ahead_behind, 3, 3);
569     DEFUN("libgit-graph-descendant-p", graph_descendant_p, 3, 3);
570 
571     // Ignore
572     DEFUN("libgit-ignore-add-rule", add_rule, 2, 2);
573     DEFUN("libgit-ignore-clear-internal-rules", clear_internal_rules, 1, 1);
574     DEFUN("libgit-ignore-path-ignored-p", path_ignored_p, 2, 2);
575 
576     // Index
577     DEFUN("libgit-index-caps", index_caps, 1, 1);
578     DEFUN("libgit-index-checksum", index_checksum, 1, 1);
579     DEFUN("libgit-index-conflict-foreach", index_conflict_foreach, 2, 2);
580     DEFUN("libgit-index-conflict-get", index_conflict_get, 2, 2);
581     DEFUN("libgit-index-entry-id", index_entry_id, 1, 1);
582     DEFUN("libgit-index-entry-path", index_entry_path, 1, 1);
583     DEFUN("libgit-index-entry-stage", index_entry_stage, 1, 1);
584     DEFUN("libgit-index-entrycount", index_entrycount, 1, 1);
585     DEFUN("libgit-index-get-byindex", index_get_byindex, 2, 2);
586     DEFUN("libgit-index-get-bypath", index_get_bypath, 2, 3);
587     DEFUN("libgit-index-owner", index_owner, 1, 1);
588     DEFUN("libgit-index-path", index_path, 1, 1);
589     DEFUN("libgit-index-version", index_version, 1, 1);
590     DEFUN("libgit-index-conflicts-p", index_conflicts_p, 1, 1);
591 
592     DEFUN("libgit-index-add-all", index_add_all, 1, 4);
593     DEFUN("libgit-index-add-bypath", index_add_bypath, 2, 2);
594     DEFUN("libgit-index-clear", index_clear, 1, 1);
595     DEFUN("libgit-index-read", index_read, 1, 2);
596     DEFUN("libgit-index-write", index_write, 1, 1);
597     DEFUN("libgit-index-write-tree", index_write_tree, 1, 2);
598 
599     // Merge
600     DEFUN("libgit-merge", merge, 2, 4);
601     DEFUN("libgit-merge-analysis", merge_analysis, 2, 2);
602     DEFUN("libgit-merge-base", merge_base, 2, 2);
603     DEFUN("libgit-merge-base-octopus", merge_base_octopus, 2, 2);
604     DEFUN("libgit-merge-bases", merge_bases, 2, 2);
605 
606     // Message
607     DEFUN("libgit-message-prettify", message_prettify, 1, 2);
608     DEFUN("libgit-message-trailers", message_trailers, 1, 1);
609 
610     // Object
611     DEFUN("libgit-object-lookup", object_lookup, 2, 3);
612     DEFUN("libgit-object-lookup-prefix", object_id, 2, 3);
613 
614     DEFUN("libgit-object-id", object_id, 1, 1);
615     DEFUN("libgit-object-owner", object_owner, 1, 1);
616     DEFUN("libgit-object-short-id", object_short_id, 1, 1);
617 
618     // Pathspec
619     DEFUN("libgit-pathspec-new", pathspec_new, 1, 1);
620     DEFUN("libgit-pathspec-matches-path", pathspec_matches_path, 3, 3);
621     DEFUN("libgit-pathspec-match-list-entrycount", pathspec_match_list_entrycount, 1, 1);
622     DEFUN("libgit-pathspec-match-list-entry", pathspec_match_list_entry, 2, 2);
623     DEFUN("libgit-pathspec-match-list-diff-entry", pathspec_match_list_diff_entry, 2, 2);
624     DEFUN("libgit-pathspec-match-list-failed-entrycount", pathspec_match_list_failed_entrycount, 1, 1);
625     DEFUN("libgit-pathspec-match-list-failed-entry", pathspec_match_list_failed_entry, 2, 2);
626     DEFUN("libgit-pathspec-match-workdir", pathspec_match_workdir, 3, 3);
627     DEFUN("libgit-pathspec-match-index", pathspec_match_index, 3, 3);
628     DEFUN("libgit-pathspec-match-tree", pathspec_match_tree, 3, 3);
629     DEFUN("libgit-pathspec-match-diff", pathspec_match_diff, 3, 3);
630 
631     // Reference
632     DEFUN("libgit-reference-create", reference_create, 3, 5);
633     DEFUN("libgit-reference-create-matching", reference_create_matching, 3, 6);
634     DEFUN("libgit-reference-dup", reference_dup, 1, 1);
635     DEFUN("libgit-reference-dwim", reference_dwim, 2, 2);
636     DEFUN("libgit-reference-lookup", reference_lookup, 2, 2);
637 
638     DEFUN("libgit-reference-list", reference_list, 1, 1);
639     DEFUN("libgit-reference-name", reference_name, 1, 1);
640     DEFUN("libgit-reference-owner", reference_owner, 1, 1);
641     DEFUN("libgit-reference-peel", reference_peel, 1, 2);
642     DEFUN("libgit-reference-resolve", reference_resolve, 1, 1);
643     DEFUN("libgit-reference-shorthand", reference_shorthand, 1, 1);
644     DEFUN("libgit-reference-symbolic-target", reference_symbolic_target, 1, 1);
645     DEFUN("libgit-reference-target", reference_target, 1, 1);
646     DEFUN("libgit-reference-target-peel", reference_target, 1, 1);
647     DEFUN("libgit-reference-type", reference_type, 1, 1);
648 
649     DEFUN("libgit-reference-delete", reference_delete, 1, 1);
650     DEFUN("libgit-reference-ensure-log", reference_ensure_log, 2, 2);
651     DEFUN("libgit-reference-remove", reference_delete, 2, 2);
652 
653     DEFUN("libgit-reference-branch-p", reference_branch_p, 1, 1);
654     DEFUN("libgit-reference-direct-p", reference_direct_p, 1, 1);
655     DEFUN("libgit-reference-has-log-p", reference_has_log_p, 2, 2);
656     DEFUN("libgit-reference-name-to-id", reference_name_to_id, 2, 2);
657     DEFUN("libgit-reference-note-p", reference_note_p, 1, 1);
658     DEFUN("libgit-reference-remote-p", reference_remote_p, 1, 1);
659     DEFUN("libgit-reference-symbolic-p", reference_symbolic_p, 1, 1);
660     DEFUN("libgit-reference-tag-p", reference_tag_p, 1, 1);
661     DEFUN("libgit-reference-valid-name-p", reference_valid_name_p, 1, 1);
662 
663     DEFUN("libgit-reference-foreach", reference_foreach, 2, 2);
664     DEFUN("libgit-reference-foreach-glob", reference_foreach_glob, 3, 3);
665     DEFUN("libgit-reference-foreach-name", reference_foreach_name, 2, 2);
666 
667     // Reflog
668     DEFUN("libgit-reflog-read", reflog_read, 1, 2);
669     DEFUN("libgit-reflog-entry-byindex", reflog_entry_byindex, 2, 2);
670     DEFUN("libgit-reflog-entry-committer", reflog_entry_committer, 1, 1);
671     DEFUN("libgit-reflog-entry-id", reflog_entry_id, 1, 2);
672     DEFUN("libgit-reflog-entry-message", reflog_entry_message, 1, 1);
673     DEFUN("libgit-reflog-entrycount", reflog_entrycount, 1, 1);
674     DEFUN("libgit-reflog-append", reflog_append, 3, 4);
675     DEFUN("libgit-reflog-drop", reflog_drop, 2, 3);
676     DEFUN("libgit-reflog-rename", reflog_rename, 3, 3);
677     DEFUN("libgit-reflog-write", reflog_write, 1, 1);
678 
679     // Refspec
680     DEFUN("libgit-refspec-direction", refspec_direction, 1, 1);
681     DEFUN("libgit-refspec-dst", refspec_dst, 1, 1);
682     DEFUN("libgit-refspec-src", refspec_src, 1, 1);
683     DEFUN("libgit-refspec-string", refspec_string, 1, 1);
684     DEFUN("libgit-refspec-dst-matches-p", refspec_dst_matches_p, 2, 2);
685     DEFUN("libgit-refspec-force-p", refspec_force_p, 1, 1);
686     DEFUN("libgit-refspec-src-matches-p", refspec_src_matches_p, 2, 2);
687 
688     // Remote
689     DEFUN("libgit-remote-create", remote_create, 3, 3);
690     DEFUN("libgit-remote-lookup", remote_lookup, 2, 2);
691 
692     DEFUN("libgit-remote-autotag", remote_autotag, 1, 1);
693     DEFUN("libgit-remote-get-refspec", remote_get_refspec, 2, 2);
694     DEFUN("libgit-remote-get-refspecs", remote_get_refspecs, 1, 2);
695     DEFUN("libgit-remote-name", remote_name, 1, 1);
696     DEFUN("libgit-remote-owner", remote_owner, 1, 1);
697     DEFUN("libgit-remote-pushurl", remote_pushurl, 1, 1);
698     DEFUN("libgit-remote-refspec-count", remote_refspec_count, 1, 1);
699     DEFUN("libgit-remote-url", remote_url, 1, 1);
700     DEFUN("libgit-remote-list", remote_list, 1, 1);
701     DEFUN("libgit-remote-valid-name-p", remote_valid_name_p, 1, 1);
702 
703     DEFUN("libgit-remote-add-refspec", remote_add_refspec, 3, 4);
704     DEFUN("libgit-remote-fetch", remote_fetch, 1, 4);
705     DEFUN("libgit-remote-push", remote_push, 1, 3);
706 
707     // Repository
708     DEFUN("libgit-repository-init", repository_init, 1, 2);
709     DEFUN("libgit-repository-open", repository_open, 1, 1);
710     DEFUN("libgit-repository-open-bare", repository_open_bare, 1, 1);
711 
712     DEFUN("libgit-repository-commondir", repository_commondir, 1, 1);
713     DEFUN("libgit-repository-config", repository_config, 1, 1);
714     DEFUN("libgit-repository-get-namespace", repository_get_namespace, 1, 1);
715     DEFUN("libgit-repository-head", repository_head, 1, 1);
716     DEFUN("libgit-repository-head-for-worktree", repository_head_for_worktree, 2, 2);
717     DEFUN("libgit-repository-ident", repository_ident, 1, 1);
718     DEFUN("libgit-repository-index", repository_index, 1, 1);
719     DEFUN("libgit-repository-message", repository_message, 1, 1);
720     DEFUN("libgit-repository-path", repository_path, 1, 1);
721     DEFUN("libgit-repository-state", repository_state, 1, 1);
722     DEFUN("libgit-repository-workdir", repository_workdir, 1, 1);
723 
724     DEFUN("libgit-repository-detach-head", repository_detach_head, 1, 1);
725     DEFUN("libgit-repository-message-remove", repository_message_remove, 1, 1);
726     DEFUN("libgit-repository-set-head", repository_set_head, 2, 2);
727     DEFUN("libgit-repository-set-head-detached", repository_set_head_detached, 2, 2);
728     DEFUN("libgit-repository-set-ident", repository_set_ident, 1, 3);
729     DEFUN("libgit-repository-set-namespace", repository_set_namespace, 2, 2);
730     DEFUN("libgit-repository-set-workdir", repository_set_workdir, 2, 3);
731     DEFUN("libgit-repository-state-cleanup", repository_state_cleanup, 1, 1);
732 
733     DEFUN("libgit-repository-bare-p", repository_bare_p, 1, 1);
734     DEFUN("libgit-repository-empty-p", repository_empty_p, 1, 1);
735     DEFUN("libgit-repository-head-detached-p", repository_empty_p, 1, 1);
736     DEFUN("libgit-repository-head-unborn-p", repository_empty_p, 1, 1);
737     DEFUN("libgit-repository-shallow-p", repository_shallow_p, 1, 1);
738     DEFUN("libgit-repository-worktree-p", repository_worktree_p, 1, 1);
739 
740     DEFUN("libgit-repository-discover", repository_discover, 0, 3);
741 
742     // Reset
743     DEFUN("libgit-reset", reset, 3, 4);
744     DEFUN("libgit-reset-from-annotated", reset_from_annotated, 3, 4);
745     DEFUN("libgit-reset-default", reset_default, 3, 3);
746 
747     // Revert
748     DEFUN("libgit-revert", revert, 2, 5);
749     DEFUN("libgit-revert-commit", revert_commit, 3, 5);
750 
751     // Revparse
752     DEFUN("libgit-revparse", revparse, 2, 2);
753     DEFUN("libgit-revparse-ext", revparse_ext, 2, 2);
754     DEFUN("libgit-revparse-single", revparse_single, 2, 2);
755 
756     // Revwalk
757     DEFUN("libgit-revwalk-new", revwalk_new, 1, 1);
758     DEFUN("libgit-revwalk-repository", revwalk_repository, 1, 1);
759 
760     DEFUN("libgit-revwalk-hide", revwalk_hide, 2, 2);
761     DEFUN("libgit-revwalk-hide-glob", revwalk_hide_glob, 2, 2);
762     DEFUN("libgit-revwalk-hide-head", revwalk_hide_head, 1, 1);
763     DEFUN("libgit-revwalk-hide-ref", revwalk_hide_ref, 2, 2);
764 
765     DEFUN("libgit-revwalk-push", revwalk_push, 2, 2);
766     DEFUN("libgit-revwalk-push-glob", revwalk_push_glob, 2, 2);
767     DEFUN("libgit-revwalk-push-head", revwalk_push_head, 1, 1);
768     DEFUN("libgit-revwalk-push-range", revwalk_push_range, 2, 2);
769     DEFUN("libgit-revwalk-push-ref", revwalk_push_ref, 2, 2);
770 
771     DEFUN("libgit-revwalk-reset", revwalk_reset, 1, 1);
772     DEFUN("libgit-revwalk-simplifiy-first-parent", revwalk_simplify_first_parent, 1, 1);
773     DEFUN("libgit-revwalk-sorting", revwalk_sorting, 1, 2);
774 
775     DEFUN("libgit-revwalk-foreach", revwalk_foreach, 2, 3);
776 
777     // Signature
778     DEFUN("libgit-signature-default", signature_default, 1, 1);
779     DEFUN("libgit-signature-from-string", signature_from_string, 1, 1);
780     DEFUN("libgit-signature-new", signature_new, 3, 3);
781     DEFUN("libgit-signature-now", signature_now, 2, 2);
782     DEFUN("libgit-signature-name", signature_name, 1, 1);
783     DEFUN("libgit-signature-email", signature_email, 1, 1);
784     DEFUN("libgit-signature-time", signature_time, 1, 1);
785 
786     // Status
787     DEFUN("libgit-status-decode", status_decode, 1, 1);
788     DEFUN("libgit-status-file", status_file, 2, 2);
789     DEFUN("libgit-status-should-ignore-p", status_should_ignore_p, 2, 2);
790     DEFUN("libgit-status-foreach-ext", status_foreach_ext, 2, 6);
791 
792     // Submodule
793     DEFUN("libgit-submodule-add-setup", submodule_add_setup, 3, 4);
794     DEFUN("libgit-submodule-lookup", submodule_lookup, 2, 2);
795     DEFUN("libgit-submodule-foreach", submodule_foreach, 2, 2);
796 
797     DEFUN("libgit-submodule-branch", submodule_branch, 1, 1);
798     DEFUN("libgit-submodule-fetch-recurse-submodules", submodule_fetch_recurse_submodules, 1, 1);
799     DEFUN("libgit-submodule-head-id", submodule_head_id, 1, 1);
800     DEFUN("libgit-submodule-ignore", submodule_ignore, 1, 1);
801     DEFUN("libgit-submodule-index-id", submodule_index_id, 1, 1);
802     DEFUN("libgit-submodule-location", submodule_location, 1, 2);
803     DEFUN("libgit-submodule-name", submodule_name, 1, 1);
804     DEFUN("libgit-submodule-open", submodule_open, 1, 1);
805     DEFUN("libgit-submodule-owner", submodule_owner, 1, 1);
806     DEFUN("libgit-submodule-path", submodule_path, 1, 1);
807     DEFUN("libgit-submodule-status", submodule_status, 2, 4);
808     DEFUN("libgit-submodule-update-strategy", submodule_update_strategy, 1, 1);
809     DEFUN("libgit-submodule-url", submodule_url, 1, 1);
810     DEFUN("libgit-submodule-wd-id", submodule_wd_id, 1, 1);
811 
812     DEFUN("libgit-submodule-add-finalize", submodule_add_finalize, 1, 1);
813     DEFUN("libgit-submodule-add-to-index", submodule_add_to_index, 1, 2);
814     DEFUN("libgit-submodule-init", submodule_init, 1, 2);
815     DEFUN("libgit-submodule-reload", submodule_reload, 1, 2);
816     DEFUN("libgit-submodule-repo-init", submodule_repo_init, 1, 2);
817     DEFUN("libgit-submodule-set-branch", submodule_set_branch, 3, 3);
818     DEFUN("libgit-submodule-set-fetch-recurse-submodules", submodule_set_fetch_recurse_submodules, 2, 3);
819     DEFUN("libgit-submodule-set-ignore", submodule_set_ignore, 3, 3);
820     DEFUN("libgit-submodule-set-update", submodule_set_update, 3, 3);
821     DEFUN("libgit-submodule-set-url", submodule_set_url, 3, 3);
822     DEFUN("libgit-submodule-sync", submodule_sync, 1, 1);
823     DEFUN("libgit-submodule-update", submodule_sync, 1, 5);
824 
825     // Tag
826     DEFUN("libgit-tag-lookup", tag_lookup, 2, 2);
827     DEFUN("libgit-tag-lookup-prefix", tag_lookup_prefix, 2, 2);
828     DEFUN("libgit-tag-foreach", tag_foreach, 2, 2);
829     DEFUN("libgit-tag-id", tag_id, 1, 1);
830     DEFUN("libgit-tag-owner", tag_owner, 1, 1);
831     DEFUN("libgit-tag-message", tag_message, 1, 1);
832     DEFUN("libgit-tag-name", tag_name, 1, 1);
833     DEFUN("libgit-tag-peel", tag_peel, 1, 1);
834     DEFUN("libgit-tag-target", tag_target, 1, 1);
835     DEFUN("libgit-tag-target-id", tag_target_id, 1, 1);
836     DEFUN("libgit-tag-target-type", tag_target_type, 1, 1);
837     DEFUN("libgit-tag-list", tag_list, 1, 2);
838 
839     // Transaction
840     DEFUN("libgit-transaction-commit", transaction_commit, 1, 1);
841 
842     // Tree
843     DEFUN("libgit-tree-lookup", tree_lookup, 2, 2);
844     DEFUN("libgit-tree-lookup-prefix", tree_lookup_prefix, 2, 2);
845 
846     DEFUN("libgit-tree-id", tree_id, 1, 1);
847     DEFUN("libgit-tree-owner", tree_owner, 1, 1);
848 
849     DEFUN("libgit-tree-entry-byid", tree_entry_byid, 2, 2);
850     DEFUN("libgit-tree-entry-byindex", tree_entry_byindex, 2, 2);
851     DEFUN("libgit-tree-entry-byname", tree_entry_byname, 2, 2);
852     DEFUN("libgit-tree-entry-bypath", tree_entry_bypath, 2, 2);
853     DEFUN("libgit-tree-entrycount", tree_entrycount, 1, 1);
854 
855     DEFUN("libgit-tree-walk", tree_walk, 3, 3);
856 
857     // Treebuilder
858     DEFUN("libgit-treebuilder-new", treebuilder_new, 1, 2);
859     DEFUN("libgit-treebuilder-entrycount", treebuilder_entrycount, 1, 1);
860     DEFUN("libgit-treebuilder-get", treebuilder_get, 2, 2);
861     DEFUN("libgit-treebuilder-clear", treebuilder_clear, 1, 1);
862     DEFUN("libgit-treebuilder-insert", treebuilder_insert, 4, 4);
863     DEFUN("libgit-treebuilder-remove", treebuilder_remove, 2, 2);
864     DEFUN("libgit-treebuilder-write", treebuilder_write, 1, 1);
865     DEFUN("libgit-treebuilder-filter", treebuilder_filter, 2, 2);
866 }
867