aboutsummaryrefslogtreecommitdiff
path: root/src/root.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/root.zig')
-rw-r--r--src/root.zig53
1 files changed, 45 insertions, 8 deletions
diff --git a/src/root.zig b/src/root.zig
index 73222be..9552bc5 100644
--- a/src/root.zig
+++ b/src/root.zig
@@ -1,6 +1,7 @@
const std = @import("std");
const testing = std.testing;
const Allocator = std.mem.Allocator;
+const galloc = @import("galloc.zig");
const git = @cImport({
@cInclude("git2.h");
@@ -12,7 +13,41 @@ const GitError = error{
OpenError,
};
-pub fn initGit() GitError!void {
+const git_allocator = extern struct {
+ gmalloc: ?*const fn (size: usize, payload: ?*anyopaque) callconv(.C) ?*anyopaque,
+ grealloc: ?*const fn (ptr: ?*anyopaque, size: usize, payload: ?*anyopaque) callconv(.C) ?*anyopaque,
+ gfree: ?*const fn (ptr: ?*anyopaque) callconv(.C) void,
+};
+
+pub var alloc: galloc.GitAllocator = undefined;
+
+fn malloc(size: usize, _: ?*anyopaque) callconv(.C) ?*anyopaque {
+ std.debug.print("MALLOC {}\n", .{size});
+ return alloc.malloc(size);
+}
+
+fn relloc(ptr: ?*anyopaque, size: usize, _: ?*anyopaque) callconv(.C) ?*anyopaque {
+ std.debug.print("REALLOC {} {?}\n", .{ size, ptr });
+ const new_ptr = alloc.realloc(ptr, size);
+ return new_ptr;
+}
+
+fn free(ptr: ?*anyopaque) callconv(.C) void {
+ std.debug.print("FREE\n", .{});
+ alloc.free(ptr);
+}
+
+pub fn initGit(a: std.mem.Allocator) GitError!void {
+ alloc = galloc.GitAllocator.init(a);
+
+ const cAlloc = git_allocator{
+ .gmalloc = malloc,
+ .grealloc = relloc,
+ .gfree = free,
+ };
+
+ _ = git.git_libgit2_opts(git.GIT_OPT_SET_ALLOCATOR, &cAlloc);
+
const code = git.git_libgit2_init();
if (code < 0) {
return GitError.InitError;
@@ -20,6 +55,7 @@ pub fn initGit() GitError!void {
}
pub fn deInitGit() !void {
+ defer alloc.deinit();
const code = git.git_libgit2_shutdown();
if (code < 0) {
return GitError.DeinitError;
@@ -30,20 +66,20 @@ pub const Repository = struct {
allocator: Allocator = undefined,
repository: ?*git.git_repository = null,
- pub fn init(alloc: Allocator) !Repository {
+ pub fn init(a: Allocator) !Repository {
return Repository{
- .allocator = alloc,
+ .allocator = a,
};
}
- pub fn open(self: Repository, path: []const u8) GitError!void {
- const code = git.git_repository_open(@constCast(&self.repository), path.ptr);
+ pub fn open(self: *Repository, path: []const u8) GitError!void {
+ const code = git.git_repository_open(@ptrCast(&self.repository), path.ptr);
if (code < 0) {
return GitError.OpenError;
}
}
- pub fn deinit(self: Repository) !void {
+ pub fn deinit(self: *Repository) void {
if (self.repository) |repo| {
git.git_repository_free(repo);
}
@@ -51,15 +87,16 @@ pub const Repository = struct {
};
test "init deinit" {
- try initGit();
+ try initGit(testing.allocator);
try deInitGit();
}
test "open repository" {
- try initGit();
+ try initGit(testing.allocator);
var repository = try Repository.init(std.testing.allocator);
try repository.open(".");
+ repository.deinit();
try deInitGit();
}