| ... | @@ -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(); |
| 1198 | | 1198 | |
| 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 | } |
| 1201 | | 1203 | |
| 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(); |
| 1212 | | 1214 | |
| 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 | } |
| 1221 | | 1223 | |
| 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(); |
| 1225 | | 1227 | |
| ... | @@ -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 | } |
| 1246 | | 1251 | |
| 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(); |
| 1250 | | 1255 | |
| ... | @@ -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 | } |
| 1264 | | 1269 | |
| ... | @@ -1990,8 +1995,9 @@ pub const Tag = struct { | ... | @@ -1990,8 +1995,9 @@ pub const Tag = struct { |
| 1990 | }; | 1995 | }; |
| 1991 | | 1996 | |
| 1992 | pub const Ref = struct { | 1997 | pub const Ref = struct { |
| 1993 | oid: Id, | | |
| 1994 | label: string, | 1998 | label: string, |
| | 1999 | oid: Id, |
| | 2000 | commit: ?Id, |
| 1995 | }; | 2001 | }; |
| 1996 | | 2002 | |
| 1997 | pub fn findFirstUnset(set: std.bit_set.DynamicBitSetUnmanaged, after: usize) ?usize { | 2003 | pub fn findFirstUnset(set: std.bit_set.DynamicBitSetUnmanaged, after: usize) ?usize { |