authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-09 15:25:53 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-09 15:25:53 -07:00
log5a5c5a4d3fecd3ec489ff57474ddecd8b86aa845
treecb4db0b07d0848d51d6c4eee5f8a8ae396516497
parent768bbb26340830e58fce6570ca7ba07b0218ffbf
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

add parseTag and Tag


1 files changed, 33 insertions(+), 0 deletions(-)

git.zig+33
......@@ -833,6 +833,39 @@ pub const Ref = struct {
833833 label: string,
834834};
835835
836pub fn parseTag(tagfile: string) !Tag {
837 const t = tracer.trace(@src(), "", .{});
838 defer t.end();
839
840 var iter = std.mem.splitScalar(u8, tagfile, '\n');
841 var result: Tag = undefined;
842 result.tagger = null;
843 const object = extras.trimPrefixEnsure(iter.next().?, "object ").?;
844 std.debug.assert(object.len == 40);
845 result.object = object[0..40];
846 const ty = extras.trimPrefixEnsure(iter.next().?, "type ").?;
847 result.type = std.meta.stringToEnum(OidKind, ty).?;
848 const tag = extras.trimPrefixEnsure(iter.next().?, "tag ").?;
849 _ = tag;
850
851 while (true) {
852 const line = iter.next() orelse break;
853 if (line.len == 0) break;
854 const space = std.mem.indexOfScalar(u8, line, ' ').?;
855 const k = line[0..space];
856 if (std.mem.eql(u8, k, "tagger")) result.tagger = try parseCommitUserAndAt(line[space + 1 ..]);
857 }
858 result.message = iter.rest();
859 return result;
860}
861
862pub const Tag = struct {
863 object: Id,
864 type: OidKind,
865 tagger: ?UserAndAt,
866 message: string,
867};
868
836869// TODO make this inspect .git/objects
837870pub fn getBlame(alloc: std.mem.Allocator, dir: nfs.Dir, at: CommitId, sub_path: string) !string {
838871 const t = tracer.trace(@src(), " {s} -- {s}", .{ at.id, sub_path });