authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-25 15:56:04 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-25 15:56:04 -07:00
log323e0de9e0a8128868f75dbd88c930ae178887bb
tree5b1cbaf7096818d2414583ee01299b270adf487a
parentcd870a26189555cfa57dd40a95de5704a9fa1dce
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

Repository: add initMailmap


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

git.zig+31
......@@ -712,6 +712,7 @@ pub const Repository = struct {
712712 commits: std.StringArrayHashMapUnmanaged(Commit),
713713 trees: std.StringArrayHashMapUnmanaged(Tree),
714714 tags: std.StringArrayHashMapUnmanaged(Tag),
715 mailmap: std.hash_map.StringHashMapUnmanaged([]const u8),
715716
716717 pub const CacheBehavior = enum { no_cache, cache };
717718
......@@ -726,6 +727,7 @@ pub const Repository = struct {
726727 .commits = .empty,
727728 .trees = .empty,
728729 .tags = .empty,
730 .mailmap = .empty,
729731 };
730732 }
731733
......@@ -744,6 +746,35 @@ pub const Repository = struct {
744746 for (r.trees.values()) |*v| r.gpa.free(v.children);
745747 r.trees.deinit(r.gpa);
746748 r.tags.deinit(r.gpa);
749 r.mailmap.deinit(r.gpa);
750 }
751
752 pub fn initMailmap(r: *Repository) !void {
753 const headid = try getHEAD(r.gpa, r.gitdir) orelse return;
754 const head = try r.getCommitA(headid.id, .cache);
755 const tree = try r.getTreeA(head.tree.id, .cache);
756 const blob = tree.get(".mailmap") orelse return;
757 if (blob.id != .blob) return;
758 const mailmap_content = try r.getBlobA(blob.id.blob.id, .cache);
759
760 var mailmap: std.hash_map.StringHashMapUnmanaged([]const u8) = .empty;
761 if (mailmap_content.len > 0) {
762 var iter = std.mem.splitScalar(u8, mailmap_content, '\n');
763 while (iter.next()) |line| {
764 if (std.mem.startsWith(u8, line, "#")) continue;
765 var jter = std.mem.splitScalar(u8, line, '<');
766 var first: ?[]const u8 = null;
767 while (jter.next()) |fntry| {
768 const email = fntry[0 .. std.mem.indexOfScalar(u8, fntry, '>') orelse continue];
769 if (first == null) {
770 first = email;
771 continue;
772 }
773 try mailmap.put(r.gpa, email, first.?);
774 }
775 }
776 }
777 r.mailmap = mailmap;
747778 }
748779
749780 pub fn getObject(r: *Repository, oid: Id, cache_behavior: CacheBehavior) anyerror!?GitObject {