diff options
author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2025-02-28 17:45:52 +0100 |
---|---|---|
committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2025-02-28 17:45:52 +0100 |
commit | 05ae9d140b5303dbd0491e2647929d8dc4fe8724 (patch) | |
tree | 68191c503d4327c0a64a3729d332a105bf37eebd /src | |
parent | d98ffcfd85e65d8e3a1f3018faa6f6050e20f4f6 (diff) | |
download | cerrado-05ae9d140b5303dbd0491e2647929d8dc4fe8724.tar.gz cerrado-05ae9d140b5303dbd0491e2647929d8dc4fe8724.tar.bz2 cerrado-05ae9d140b5303dbd0491e2647929d8dc4fe8724.zip |
feat: Add setRefzig
Now it is possible to point a repository to a reference.
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())); +} |