authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-25 19:53:32 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-06-25 19:53:32 -07:00
log12685a4cfdc92dc8e660952339373af15ecf2f07
treea094e63009dc8574b065b9989990173875557ead
parent4899f990d79d506ad2b6051c73fdcd8638dfef09
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

getRefs: add a field to be the commit it points at


1 files changed, 15 insertions(+), 9 deletions(-)

git.zig+15-9
......@@ -1196,7 +1196,9 @@ pub const Repository = struct {
11961196 const t = tracer.trace(@src(), "", .{});
11971197 defer t.end();
11981198
1199 return r.getRefs(arena, "heads");
1199 const refs = try r.getRefs(arena, "heads");
1200 for (refs) |*e| e.commit = e.oid;
1201 return refs;
12001202 }
12011203
12021204 pub fn getTags(r: *Repository, arena: std.mem.Allocator) ![]Ref {
......@@ -1210,16 +1212,16 @@ pub const Repository = struct {
12101212 const t = tracer.trace(@src(), "", .{});
12111213 defer t.end();
12121214
1213 var map: std.StringArrayHashMapUnmanaged(Id) = .empty;
1215 var map: std.StringArrayHashMapUnmanaged(struct { Id, ?Id }) = .empty;
12141216 try r.addPackedRefs(&map, arena, kind);
12151217 try r.addDirRefs(&map, arena, kind);
12161218 var list: std.ArrayListUnmanaged(Ref) = .empty;
12171219 try list.ensureUnusedCapacity(arena, map.count());
1218 for (map.keys(), map.values()) |label, oid| list.appendAssumeCapacity(.{ .oid = oid, .label = label });
1220 for (map.keys(), map.values()) |label, vals| list.appendAssumeCapacity(.{ .label = label, .oid = vals[0], .commit = vals[1] });
12191221 return list.items;
12201222 }
12211223
1222 fn addPackedRefs(r: *Repository, map: *std.StringArrayHashMapUnmanaged(Id), arena: std.mem.Allocator, comptime kind: [:0]const u8) !void {
1224 fn addPackedRefs(r: *Repository, map: *std.StringArrayHashMapUnmanaged(struct { Id, ?Id }), arena: std.mem.Allocator, comptime kind: [:0]const u8) !void {
12231225 const t = tracer.trace(@src(), "", .{});
12241226 defer t.end();
12251227
......@@ -1233,18 +1235,21 @@ pub const Repository = struct {
12331235 var iter = std.mem.splitScalar(u8, content, '\n');
12341236 while (iter.next()) |line| {
12351237 if (line.len == 0) break;
1236 if (line[0] == '^') continue;
12371238 if (line[0] == '#') continue;
1239 if (line[0] == '^') {
1240 map.values()[map.count() - 1][1] = ensureObjId(CommitId, try arena.dupe(u8, line[1..])).id;
1241 continue;
1242 }
12381243 std.debug.assert(extras.matchesAll(u8, line[0..40], std.ascii.isHex));
12391244 std.debug.assert(line[40] == ' ');
12401245 const rest = extras.trimPrefixEnsure(line[41..], "refs/" ++ kind ++ "/") orelse continue;
12411246 const oid = try arena.dupe(u8, line[0..40]);
12421247 const label = try arena.dupeZ(u8, rest);
1243 try map.put(arena, label, oid[0..40]);
1248 try map.put(arena, label, .{ oid[0..40], null });
12441249 }
12451250 }
12461251
1247 fn addDirRefs(r: *Repository, map: *std.StringArrayHashMapUnmanaged(Id), arena: std.mem.Allocator, comptime kind: [:0]const u8) !void {
1252 fn addDirRefs(r: *Repository, map: *std.StringArrayHashMapUnmanaged(struct { Id, ?Id }), arena: std.mem.Allocator, comptime kind: [:0]const u8) !void {
12481253 const t = tracer.trace(@src(), "", .{});
12491254 defer t.end();
12501255
......@@ -1258,7 +1263,7 @@ pub const Repository = struct {
12581263 defer file.close();
12591264 const label = try arena.dupeZ(u8, entry.path);
12601265 const oid = try file.readAlloc(arena, 40);
1261 try map.put(arena, label, oid[0..40]);
1266 try map.put(arena, label, .{ oid[0..40], null });
12621267 }
12631268 }
12641269
......@@ -1990,8 +1995,9 @@ pub const Tag = struct {
19901995};
19911996
19921997pub const Ref = struct {
1993 oid: Id,
19941998 label: string,
1999 oid: Id,
2000 commit: ?Id,
19952001};
19962002
19972003pub fn findFirstUnset(set: std.bit_set.DynamicBitSetUnmanaged, after: usize) ?usize {