diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/git.zig | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/git.zig b/src/git.zig index 4803103..99991f0 100644 --- a/src/git.zig +++ b/src/git.zig @@ -8,6 +8,7 @@ const git = @cImport({ }); const GitError = error{ + RepsitoryNotInitialized, RepositoryAlreadyInitialized, Unkown, @@ -130,14 +131,33 @@ pub fn deinit() !void { try err(git.git_libgit2_shutdown()); } +pub const Commit = struct { + commit: *git.git_commit = undefined, + + pub fn fromGitCommit(c: *git.git_commit) Commit { + return Commit{ .commit = c }; + } +}; + pub const Repository = struct { repository: ?*git.git_repository = null, + reference: ?*git.git_reference = null, fn validateInit(self: *Repository) GitError!void { if (self.repository != null) return GitError.RepositoryAlreadyInitialized; } + fn validateNotInit(self: *Repository) GitError!void { + if (self.repository == null) + return GitError.RepsitoryNotInitialized; + } + + fn validateRef(self: *Repository) GitError!void { + if (self.ref != null) + return GitError.RepositoryAlreadyInitialized; + } + pub fn open(self: *Repository, path: []const u8) GitError!void { try self.validateInit(); try err(git.git_repository_open(@ptrCast(&self.repository), path.ptr)); @@ -148,7 +168,30 @@ pub const Repository = struct { try err(git.git_repository_init(@ptrCast(&self.repository), path.ptr, if (bare) 1 else 0)); } + pub fn setRef(self: *Repository, ref_name: []const u8) GitError!void { + try self.validateNotInit(); + + if (self.reference) |ref| { + git.git_reference_free(ref); + self.reference = null; + } + + try err(git.git_reference_dwim(@ptrCast(&self.reference), self.repository, ref_name.ptr)); + } + + pub fn referenceName(self: *Repository) []const u8 { + if (self.reference) |ref| { + return std.mem.span(git.git_reference_name(ref)); + } + + return ""; + } + pub fn deinit(self: *Repository) void { + if (self.reference) |ref| { + git.git_reference_free(ref); + } + if (self.repository) |repo| { git.git_repository_free(repo); } @@ -207,3 +250,19 @@ test "init repository bare" { try tmp.open(full_path); } + +test "set reference" { + try init(testing.allocator); + defer deinit() catch {}; + + var repository = Repository{}; + defer repository.deinit(); + + try repository.open("."); + + try repository.setRef("zig"); + try testing.expect(std.mem.eql(u8, "refs/heads/zig", repository.referenceName())); + + try repository.setRef("master"); + try testing.expect(std.mem.eql(u8, "refs/heads/master", repository.referenceName())); +} |