srctree

Gregory Mullen parent 7d2c55d1 d18b228f
refactor git commits tests to add fuzz test

inlinesplit
src/git.zig added: 65, removed: 37, total 28
@@ -1,16 +1,16 @@
pub const Actor = @import("git/actor.zig");
pub const Agent = @import("git/agent.zig");
pub const Blob = @import("git/blob.zig");
pub const Commit = @import("git/Commit.zig");
pub const Pack = @import("git/pack.zig");
pub const Tree = @import("git/tree.zig");
pub const Remote = @import("git/remote.zig");
pub const Branch = @import("git/Branch.zig");
pub const ChangeSet = @import("git/changeset.zig");
pub const Commit = @import("git/Commit.zig");
pub const Object = @import("git/Object.zig");
pub const Pack = @import("git/pack.zig");
pub const Remote = @import("git/remote.zig");
pub const Repo = @import("git/Repo.zig");
pub const SHA = @import("git/SHA.zig");
pub const Tag = @import("git/Tag.zig");
pub const Repo = @import("git/Repo.zig");
pub const Branch = @import("git/Branch.zig");
pub const Object = @import("git/Object.zig");
pub const Tree = @import("git/tree.zig");
 
/// TODO for commitish
/// direct
@@ -51,6 +51,19 @@ pub fn commitishRepo(rev: []const u8, repo: Repo) bool {
 
test {
std.testing.refAllDecls(@This());
_ = &Actor;
_ = &Agent;
_ = &Blob;
_ = &Branch;
_ = &ChangeSet;
_ = &Commit;
_ = &Object;
_ = &Pack;
_ = &Remote;
_ = &Repo;
_ = &SHA;
_ = &Tag;
_ = &Tree;
}
 
test "read" {
@@ -411,30 +424,6 @@ test "list remotes" {
try std.testing.expectEqualStrings("gr.ht", remotes[1].name);
}
 
test "parse commit" {
const commit_data =
\\tree 863dce25c7370ca052f0efddd1e3aa73569fb37b
\\parent ac7bc0f8c6d88e2595d6147f79d88b91476acdde
\\author Gregory Mullen <github@gr.ht> 1747760721 -0700
\\committer Gregory Mullen <github@gr.ht> 1747760721 -0700
\\
\\clean up blame.zig
;
 
const commit = try Commit.init(SHA.init("ac7bc0f8c6d88e2595d6147f79d88b91476acdde"), commit_data);
const parents: [9]?SHA = .{ SHA.init("ac7bc0f8c6d88e2595d6147f79d88b91476acdde"), null, null, null, null, null, null, null, null };
try std.testing.expectEqualSlices(?SHA, &parents, &commit.parent);
try std.testing.expectEqual(SHA.init("863dce25c7370ca052f0efddd1e3aa73569fb37b"), commit.tree);
try std.testing.expectEqualStrings("Gregory Mullen", commit.author.name);
try std.testing.expectEqualStrings("github@gr.ht", commit.author.email);
try std.testing.expectEqual(1747760721, commit.author.timestamp);
try std.testing.expectEqualStrings("-0700", commit.author.tzstr);
try std.testing.expectEqualStrings("Gregory Mullen", commit.committer.name);
try std.testing.expectEqualStrings("github@gr.ht", commit.committer.email);
try std.testing.expectEqual(1747760721, commit.committer.timestamp);
try std.testing.expectEqualStrings("-0700", commit.committer.tzstr);
}
 
const std = @import("std");
const Allocator = std.mem.Allocator;
const eql = std.mem.eql;
 
src/git/Commit.zig added: 65, removed: 37, total 28
@@ -59,8 +59,8 @@ pub fn init(sha: SHA, data: []const u8) !Commit {
} else return error.MalformedHeader;
}
var message = lines.rest();
var title: ?[]const u8 = null;
var body: ?[]const u8 = null;
var title: []const u8 = message;
var body: []const u8 = "";
if (indexOf(u8, message, "\n\n")) |nl| {
title = message[0..nl];
body = message[nl + 2 ..];
@@ -72,8 +72,8 @@ pub fn init(sha: SHA, data: []const u8) !Commit {
.author = author orelse return error.AuthorMissing,
.committer = committer orelse return error.CommitterMissing,
.message = message,
.title = title orelse message,
.body = body orelse "",
.title = title,
.body = body,
.gpgsig = null, // TODO still unimplemented
};
}
@@ -165,6 +165,45 @@ fn gpgSig(itr: *std.mem.SplitIterator(u8, .sequence)) !void {
return error.InvalidGpgsig;
}
 
test "parse commit" {
const commit_data =
\\tree 863dce25c7370ca052f0efddd1e3aa73569fb37b
\\parent ac7bc0f8c6d88e2595d6147f79d88b91476acdde
\\author Gregory Mullen <github@gr.ht> 1747760721 -0700
\\committer Gregory Mullen <github@gr.ht> 1747760721 -0700
\\
\\clean up blame.zig
;
 
const commit = try Commit.init(SHA.init("ac7bc0f8c6d88e2595d6147f79d88b91476acdde"), commit_data);
const parents: [9]?SHA = .{ SHA.init("ac7bc0f8c6d88e2595d6147f79d88b91476acdde"), null, null, null, null, null, null, null, null };
try std.testing.expectEqualSlices(?SHA, &parents, &commit.parent);
try std.testing.expectEqual(SHA.init("863dce25c7370ca052f0efddd1e3aa73569fb37b"), commit.tree);
try std.testing.expectEqualStrings("Gregory Mullen", commit.author.name);
try std.testing.expectEqualStrings("github@gr.ht", commit.author.email);
try std.testing.expectEqual(1747760721, commit.author.timestamp);
try std.testing.expectEqualStrings("-0700", commit.author.tzstr);
try std.testing.expectEqualStrings("Gregory Mullen", commit.committer.name);
try std.testing.expectEqualStrings("github@gr.ht", commit.committer.email);
try std.testing.expectEqual(1747760721, commit.committer.timestamp);
try std.testing.expectEqualStrings("-0700", commit.committer.tzstr);
}
 
test "fuzz" {
const Context = struct {
fn testOne(context: @This(), input: []const u8) anyerror!void {
_ = context;
if (input.len < 20) return;
if (init(.init(input[0..20]), input[20..])) |_| {
try std.testing.expect(false);
} else |_| {
return;
}
}
};
try std.testing.fuzz(Context{}, Context.testOne, .{});
}
 
const SHA = @import("SHA.zig");
const Repo = @import("Repo.zig");
const Tree = @import("tree.zig");