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 {...@@ -1196,7 +1196,9 @@ pub const Repository = struct {
1196 const t = tracer.trace(@src(), "", .{});1196 const t = tracer.trace(@src(), "", .{});
1197 defer t.end();1197 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;
1200 }1202 }
12011203
1202 pub fn getTags(r: *Repository, arena: std.mem.Allocator) ![]Ref {1204 pub fn getTags(r: *Repository, arena: std.mem.Allocator) ![]Ref {
...@@ -1210,16 +1212,16 @@ pub const Repository = struct {...@@ -1210,16 +1212,16 @@ pub const Repository = struct {
1210 const t = tracer.trace(@src(), "", .{});1212 const t = tracer.trace(@src(), "", .{});
1211 defer t.end();1213 defer t.end();
12121214
1213 var map: std.StringArrayHashMapUnmanaged(Id) = .empty;1215 var map: std.StringArrayHashMapUnmanaged(struct { Id, ?Id }) = .empty;
1214 try r.addPackedRefs(&map, arena, kind);1216 try r.addPackedRefs(&map, arena, kind);
1215 try r.addDirRefs(&map, arena, kind);1217 try r.addDirRefs(&map, arena, kind);
1216 var list: std.ArrayListUnmanaged(Ref) = .empty;1218 var list: std.ArrayListUnmanaged(Ref) = .empty;
1217 try list.ensureUnusedCapacity(arena, map.count());1219 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] });
1219 return list.items;1221 return list.items;
1220 }1222 }
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 {
1223 const t = tracer.trace(@src(), "", .{});1225 const t = tracer.trace(@src(), "", .{});
1224 defer t.end();1226 defer t.end();
12251227
...@@ -1233,18 +1235,21 @@ pub const Repository = struct {...@@ -1233,18 +1235,21 @@ pub const Repository = struct {
1233 var iter = std.mem.splitScalar(u8, content, '\n');1235 var iter = std.mem.splitScalar(u8, content, '\n');
1234 while (iter.next()) |line| {1236 while (iter.next()) |line| {
1235 if (line.len == 0) break;1237 if (line.len == 0) break;
1236 if (line[0] == '^') continue;
1237 if (line[0] == '#') continue;1238 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 }
1238 std.debug.assert(extras.matchesAll(u8, line[0..40], std.ascii.isHex));1243 std.debug.assert(extras.matchesAll(u8, line[0..40], std.ascii.isHex));
1239 std.debug.assert(line[40] == ' ');1244 std.debug.assert(line[40] == ' ');
1240 const rest = extras.trimPrefixEnsure(line[41..], "refs/" ++ kind ++ "/") orelse continue;1245 const rest = extras.trimPrefixEnsure(line[41..], "refs/" ++ kind ++ "/") orelse continue;
1241 const oid = try arena.dupe(u8, line[0..40]);1246 const oid = try arena.dupe(u8, line[0..40]);
1242 const label = try arena.dupeZ(u8, rest);1247 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 });
1244 }1249 }
1245 }1250 }
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 {
1248 const t = tracer.trace(@src(), "", .{});1253 const t = tracer.trace(@src(), "", .{});
1249 defer t.end();1254 defer t.end();
12501255
...@@ -1258,7 +1263,7 @@ pub const Repository = struct {...@@ -1258,7 +1263,7 @@ pub const Repository = struct {
1258 defer file.close();1263 defer file.close();
1259 const label = try arena.dupeZ(u8, entry.path);1264 const label = try arena.dupeZ(u8, entry.path);
1260 const oid = try file.readAlloc(arena, 40);1265 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 });
1262 }1267 }
1263 }1268 }
12641269
...@@ -1990,8 +1995,9 @@ pub const Tag = struct {...@@ -1990,8 +1995,9 @@ pub const Tag = struct {
1990};1995};
19911996
1992pub const Ref = struct {1997pub const Ref = struct {
1993 oid: Id,
1994 label: string,1998 label: string,
1999 oid: Id,
2000 commit: ?Id,
1995};2001};
19962002
1997pub fn findFirstUnset(set: std.bit_set.DynamicBitSetUnmanaged, after: usize) ?usize {2003pub fn findFirstUnset(set: std.bit_set.DynamicBitSetUnmanaged, after: usize) ?usize {