authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-14 16:32:35 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-04-14 16:32:35 -07:00
logaab76ed99df4ae89826b4ab5dc120d560daeb4cc
treec192f1f99e8e65657017ffbbe97e53a09a46fc89
parentccc66e62cea05f084b9704c8ea99375d16ee5ac5
signaturebadge-check Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

migrate tests


2 files changed, 75 insertions(+), 24 deletions(-)

git.zig+34
...@@ -1016,6 +1016,7 @@ pub const Repository = struct {...@@ -1016,6 +1016,7 @@ pub const Repository = struct {
1016 }1016 }
1017 const base_pack_offset = pack_offset - offset;1017 const base_pack_offset = pack_offset - offset;
1018 const base_obj = try r.getPackedObject(arena, null, pack_index, base_pack_offset);1018 const base_obj = try r.getPackedObject(arena, null, pack_index, base_pack_offset);
1019 defer r.gpa.free(base_obj.content);
1019 // std.log.debug("base: type={s} content=[{d}]", .{ @tagName(base_obj.type), base_obj.content.len });1020 // std.log.debug("base: type={s} content=[{d}]", .{ @tagName(base_obj.type), base_obj.content.len });
1020 return r.getDeltadObject(maybe_oid, &packedobj_fbs, size, base_obj);1021 return r.getDeltadObject(maybe_oid, &packedobj_fbs, size, base_obj);
1021 },1022 },
...@@ -1103,11 +1104,32 @@ pub const Repository = struct {...@@ -1103,11 +1104,32 @@ pub const Repository = struct {
1103 return obj;1104 return obj;
1104 }1105 }
11051106
1107 pub fn getObjectA(r: *Repository, arena: std.mem.Allocator, oid: Id) !GitObject {
1108 return (try r.getObject(arena, oid)).?;
1109 }
1110
1111 pub fn getObjectC(r: *Repository, arena: std.mem.Allocator, oid: Id) ![]const u8 {
1112 return (try r.getObjectA(arena, oid)).content;
1113 }
1114
1106 const GitObject = struct {1115 const GitObject = struct {
1107 type: RefType,1116 type: RefType,
1108 content: []const u8,1117 content: []const u8,
1109 };1118 };
11101119
1120 pub fn getBlob(r: *Repository, arena: std.mem.Allocator, id: BlobId) !?[]const u8 {
1121 if (try r.getObject(arena, id.id)) |obj| {
1122 if (obj.type == .blob) {
1123 return obj.content;
1124 }
1125 }
1126 return null;
1127 }
1128
1129 pub fn getBlobA(r: *Repository, arena: std.mem.Allocator, id: Id) ![]const u8 {
1130 return (try r.getBlob(arena, .{ .id = id })).?;
1131 }
1132
1111 pub fn getCommit(r: *Repository, arena: std.mem.Allocator, id: CommitId) !?struct { CommitId, Commit } {1133 pub fn getCommit(r: *Repository, arena: std.mem.Allocator, id: CommitId) !?struct { CommitId, Commit } {
1112 const t = tracer.trace(@src(), " {s}", .{id.id});1134 const t = tracer.trace(@src(), " {s}", .{id.id});
1113 defer t.end();1135 defer t.end();
...@@ -1125,6 +1147,10 @@ pub const Repository = struct {...@@ -1125,6 +1147,10 @@ pub const Repository = struct {
1125 return null;1147 return null;
1126 }1148 }
11271149
1150 pub fn getCommitA(r: *Repository, arena: std.mem.Allocator, id: Id) !Commit {
1151 return (try r.getCommit(arena, .{ .id = id })).?.@"1";
1152 }
1153
1128 pub fn getTree(r: *Repository, arena: std.mem.Allocator, id: TreeId) !?struct { TreeId, Tree } {1154 pub fn getTree(r: *Repository, arena: std.mem.Allocator, id: TreeId) !?struct { TreeId, Tree } {
1129 const t = tracer.trace(@src(), " {s}", .{id.id});1155 const t = tracer.trace(@src(), " {s}", .{id.id});
1130 defer t.end();1156 defer t.end();
...@@ -1175,6 +1201,10 @@ pub const Repository = struct {...@@ -1175,6 +1201,10 @@ pub const Repository = struct {
1175 return null;1201 return null;
1176 }1202 }
11771203
1204 pub fn getTreeA(r: *Repository, arena: std.mem.Allocator, id: Id) !Tree {
1205 return (try r.getTree(arena, .{ .id = id })).?.@"1";
1206 }
1207
1178 pub fn getTag(r: *Repository, arena: std.mem.Allocator, id: TagId) !?struct { TagId, Tag } {1208 pub fn getTag(r: *Repository, arena: std.mem.Allocator, id: TagId) !?struct { TagId, Tag } {
1179 const t = tracer.trace(@src(), " {s}", .{id.id});1209 const t = tracer.trace(@src(), " {s}", .{id.id});
1180 defer t.end();1210 defer t.end();
...@@ -1192,6 +1222,10 @@ pub const Repository = struct {...@@ -1192,6 +1222,10 @@ pub const Repository = struct {
1192 return null;1222 return null;
1193 }1223 }
11941224
1225 pub fn getTagA(r: *Repository, arena: std.mem.Allocator, id: Id) !Tag {
1226 return (try r.getTag(arena, .{ .id = id })).?.@"1";
1227 }
1228
1195 pub fn getHeads(r: *Repository, arena: std.mem.Allocator) ![]Ref {1229 pub fn getHeads(r: *Repository, arena: std.mem.Allocator) ![]Ref {
1196 const t = tracer.trace(@src(), "", .{});1230 const t = tracer.trace(@src(), "", .{});
1197 defer t.end();1231 defer t.end();
test.zig+41-24
...@@ -5,30 +5,29 @@ const expect = @import("expect").expect;...@@ -5,30 +5,29 @@ const expect = @import("expect").expect;
5const nfs = @import("nfs");5const nfs = @import("nfs");
66
7test {7test {
8 _ = &git.version;8 const gpa = std.testing.allocator;
9 _ = &git.getHEAD;
10 _ = &git.getTags;
11 _ = &git.revList;
12}
13
14test {
15 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);9 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
16 defer arena.deinit();10 defer arena.deinit();
17 const alloc = arena.allocator();11 const alloc = arena.allocator();
18 const git_dir = try nfs.cwd().openDir(".git", .{});12 const git_dir = try nfs.cwd().openDir(".git", .{});
19 defer git_dir.close();13 defer git_dir.close();
20 const branch_refs = try git.getBranches(alloc, git_dir);14 var repo: git.Repository = .init(git_dir, gpa);
15 defer repo.deinit();
16 const branch_refs = try repo.getHeads(alloc);
21 const branch_names = try extras.mapBy(alloc, branch_refs, .label);17 const branch_names = try extras.mapBy(alloc, branch_refs, .label);
22 try expect(branch_names).toEqualStringSlice(&.{"master"});18 try expect(branch_names).toEqualStringSlice(&.{"master"});
23}19}
2420
25test {21test {
22 const gpa = std.testing.allocator;
26 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);23 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
27 defer arena.deinit();24 defer arena.deinit();
28 const alloc = arena.allocator();25 const alloc = arena.allocator();
29 const git_dir = try nfs.cwd().openDir(".git", .{});26 const git_dir = try nfs.cwd().openDir(".git", .{});
30 defer git_dir.close();27 defer git_dir.close();
31 try expect(try git.getObjectContent(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).toEqualString(28 var repo: git.Repository = .init(git_dir, gpa);
29 defer repo.deinit();
30 try expect(try repo.getObjectC(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).toEqualString(
32 \\tree 5403fecad0fde9120535321f222a061abc2849d931 \\tree 5403fecad0fde9120535321f222a061abc2849d9
33 \\parent c39f57f6bb01664a7146ddbfc3debe76ec135f4432 \\parent c39f57f6bb01664a7146ddbfc3debe76ec135f44
34 \\author Meghan Denny <hello@nektro.net> 1692246864 -070033 \\author Meghan Denny <hello@nektro.net> 1692246864 -0700
...@@ -40,43 +39,55 @@ test {...@@ -40,43 +39,55 @@ test {
40}39}
4140
42test {41test {
42 const gpa = std.testing.allocator;
43 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);43 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
44 defer arena.deinit();44 defer arena.deinit();
45 const alloc = arena.allocator();45 const alloc = arena.allocator();
46 const git_dir = try nfs.cwd().openDir(".git", .{});46 const git_dir = try nfs.cwd().openDir(".git", .{});
47 defer git_dir.close();47 defer git_dir.close();
48 try expect(try git.getObjectSize(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).toEqual(229);48 var repo: git.Repository = .init(git_dir, gpa);
49 try expect(try git.getObjectSize(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).toEqual(45 + 47 + 55 + 58 + 0 + 18 + 6);49 defer repo.deinit();
50 try expect((try repo.getObjectC(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).len).toEqual(229);
51 try expect((try repo.getObjectC(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).len).toEqual(45 + 47 + 55 + 58 + 0 + 18 + 6);
50}52}
5153
52test {54test {
55 const gpa = std.testing.allocator;
53 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);56 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
54 defer arena.deinit();57 defer arena.deinit();
55 const alloc = arena.allocator();58 const alloc = arena.allocator();
56 const git_dir = try nfs.cwd().openDir(".git", .{});59 const git_dir = try nfs.cwd().openDir(".git", .{});
57 defer git_dir.close();60 defer git_dir.close();
58 try expect(try git.isType(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e", .blob)).toEqual(false);61 var repo: git.Repository = .init(git_dir, gpa);
59 try expect(try git.isType(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e", .tree)).toEqual(false);62 defer repo.deinit();
60 try expect(try git.isType(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e", .commit)).toEqual(true);63 try expect((try repo.getObjectA(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).type == .blob).toEqual(false);
61 try expect(try git.isType(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e", .tag)).toEqual(false);64 try expect((try repo.getObjectA(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).type == .tree).toEqual(false);
65 try expect((try repo.getObjectA(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).type == .commit).toEqual(true);
66 try expect((try repo.getObjectA(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).type == .tag).toEqual(false);
62}67}
6368
64test {69test {
70 const gpa = std.testing.allocator;
65 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);71 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
66 defer arena.deinit();72 defer arena.deinit();
67 const alloc = arena.allocator();73 const alloc = arena.allocator();
68 const git_dir = try nfs.cwd().openDir(".git", .{});74 const git_dir = try nfs.cwd().openDir(".git", .{});
69 defer git_dir.close();75 defer git_dir.close();
70 try expect(try git.getType(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).toEqual(.commit);76 var repo: git.Repository = .init(git_dir, gpa);
77 defer repo.deinit();
78 try expect((try repo.getObjectA(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e")).type).toEqual(.commit);
71}79}
7280
73test {81test {
82 const gpa = std.testing.allocator;
74 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);83 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
75 defer arena.deinit();84 defer arena.deinit();
76 const alloc = arena.allocator();85 const alloc = arena.allocator();
77 const git_dir = try nfs.cwd().openDir(".git", .{});86 const git_dir = try nfs.cwd().openDir(".git", .{});
78 defer git_dir.close();87 defer git_dir.close();
79 const c = try git.parseCommit(alloc, try git.getObjectContent(alloc, git_dir, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e"));88 var repo: git.Repository = .init(git_dir, gpa);
89 defer repo.deinit();
90 const c = try repo.getCommitA(alloc, "a542da41f1f0c59fdd0e1527cf5ff9de3f6a0c8e");
80 try expect(c.tree.id).toEqualString("5403fecad0fde9120535321f222a061abc2849d9");91 try expect(c.tree.id).toEqualString("5403fecad0fde9120535321f222a061abc2849d9");
81 try expect(c.parents.len).toEqual(1);92 try expect(c.parents.len).toEqual(1);
82 try expect(c.parents[0].id).toEqualString("c39f57f6bb01664a7146ddbfc3debe76ec135f44");93 try expect(c.parents[0].id).toEqualString("c39f57f6bb01664a7146ddbfc3debe76ec135f44");
...@@ -93,30 +104,36 @@ test {...@@ -93,30 +104,36 @@ test {
93}104}
94105
95test {106test {
107 const gpa = std.testing.allocator;
96 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);108 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
97 defer arena.deinit();109 defer arena.deinit();
98 const alloc = arena.allocator();110 const alloc = arena.allocator();
99 const git_dir = try nfs.cwd().openDir(".git", .{});111 const git_dir = try nfs.cwd().openDir(".git", .{});
100 defer git_dir.close();112 defer git_dir.close();
101 try expect(try git.getObjectContent(alloc, git_dir, "5403fecad0fde9120535321f222a061abc2849d9")).toEqualString(113 var repo: git.Repository = .init(git_dir, gpa);
114 defer repo.deinit();
115 try expect(try repo.getObjectC(alloc, "5403fecad0fde9120535321f222a061abc2849d9")).toEqualString(
102 // zig fmt: off116 // zig fmt: off
103 "100644 blob 8e8d2ceba4b327ce9db93f988492d0e21a461012\t.gitattributes\n" ++117 "100644 .gitattributes\x00" ++ .{0x8e,0x8d,0x2c,0xeb,0xa4,0xb3,0x27,0xce,0x9d,0xb9,0x3f,0x98,0x84,0x92,0xd0,0xe2,0x1a,0x46,0x10,0x12} ++
104 "100644 blob bb2a57bd81d13975f2a74ae5dd0e652de07bb8a7\t.gitignore\n" ++118 "100644 .gitignore\x00" ++ .{0xbb,0x2a,0x57,0xbd,0x81,0xd1,0x39,0x75,0xf2,0xa7,0x4a,0xe5,0xdd,0x0e,0x65,0x2d,0xe0,0x7b,0xb8,0xa7} ++
105 "100644 blob 37be0c1cfa4f097edbb1fb5c0585cd18cb08df13\tLICENSE\n" ++119 "100644 LICENSE\x00" ++ .{0x37,0xbe,0x0c,0x1c,0xfa,0x4f,0x09,0x7e,0xdb,0xb1,0xfb,0x5c,0x05,0x85,0xcd,0x18,0xcb,0x08,0xdf,0x13} ++
106 "100644 blob b229eadbd5d6655c2dfbaca5a5f68f2f8f3c5454\tgit.zig\n" ++120 "100644 git.zig\x00" ++ .{0xb2,0x29,0xea,0xdb,0xd5,0xd6,0x65,0x5c,0x2d,0xfb,0xac,0xa5,0xa5,0xf6,0x8f,0x2f,0x8f,0x3c,0x54,0x54} ++
107 "100644 blob bb3f1c135632cfca760bd84fb18acdab8dae8ec3\tzig.mod\n" ++121 "100644 zig.mod\x00" ++ .{0xbb,0x3f,0x1c,0x13,0x56,0x32,0xcf,0xca,0x76,0x0b,0xd8,0x4f,0xb1,0x8a,0xcd,0xab,0x8d,0xae,0x8e,0xc3} ++
108 ""122 ""
109 // zig fmt: on123 // zig fmt: on
110 );124 );
111}125}
112126
113test {127test {
128 const gpa = std.testing.allocator;
114 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);129 var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
115 defer arena.deinit();130 defer arena.deinit();
116 const alloc = arena.allocator();131 const alloc = arena.allocator();
117 const git_dir = try nfs.cwd().openDir(".git", .{});132 const git_dir = try nfs.cwd().openDir(".git", .{});
118 defer git_dir.close();133 defer git_dir.close();
119 const t = try git.parseTree(alloc, try git.getObjectContent(alloc, git_dir, "5403fecad0fde9120535321f222a061abc2849d9"));134 var repo: git.Repository = .init(git_dir, gpa);
135 defer repo.deinit();
136 const t = try repo.getTreeA(alloc, "5403fecad0fde9120535321f222a061abc2849d9");
120 // TODO: test fields when we upgrade to 0.14 and have decl literals137 // TODO: test fields when we upgrade to 0.14 and have decl literals
121 // try expect(try extras.mapBy(alloc, t.children, .id)).toEqualSlice(&.{138 // try expect(try extras.mapBy(alloc, t.children, .id)).toEqualSlice(&.{
122 // .{ .blob = .{ .id = "8e8d2ceba4b327ce9db93f988492d0e21a461012" } },139 // .{ .blob = .{ .id = "8e8d2ceba4b327ce9db93f988492d0e21a461012" } },