aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/git.zig59
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()));
+}