authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-06-25 12:56:07 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-06-25 12:56:07 -07:00
log3835107c3034398b00c58b6341d017a4893b9126
tree8f2abc1dbda0ba73a25e34e5e9f758c1d0927c37
parent597e9945f6e210c7e6591888b3a283f4076fae56

parse timezone part


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

git.zig+15-2
......@@ -226,12 +226,11 @@ fn parseCommitUserAndAt(input: string) !UserAndAt {
226226 const time_part = maybe_bad_parser.next() orelse return error.BadCommitTime;
227227 const email_part = maybe_bad_parser.next() orelse return error.BadCommitEmail;
228228 const name_part = maybe_bad_parser.rest();
229 _ = tz_part;
230229 std.debug.assert(email_part[0] == '<');
231230 std.debug.assert(email_part[email_part.len - 1] == '>');
232231 const name = name_part;
233232 const email = std.mem.trim(u8, email_part, "<>");
234 const at = time.DateTime.initUnix(try std.fmt.parseInt(u64, time_part, 10));
233 const at = parseAt(time_part, tz_part);
235234
236235 return .{
237236 .name = name,
......@@ -240,6 +239,20 @@ fn parseCommitUserAndAt(input: string) !UserAndAt {
240239 };
241240}
242241
242fn parseAt(time_part: string, tz_part: string) time.DateTime {
243 var at = time.DateTime.initUnix(std.fmt.parseInt(u64, time_part, 10) catch unreachable);
244 std.debug.assert(tz_part.len == 5);
245 std.debug.assert(tz_part[0] == '-' or tz_part[0] == '+');
246 const sign: i8 = if (tz_part[0] == '+') 1 else -1;
247 const hrs = std.fmt.parseInt(u8, tz_part[1..][0..2], 10) catch unreachable;
248 const mins = std.fmt.parseInt(u8, tz_part[3..][0..2], 10) catch unreachable;
249 if (sign > 0) at = at.addHours(hrs);
250 if (sign > 0) at = at.addMins(mins);
251 // if (sign < 0) at = at.subHours(hrs); // TODO:
252 // if (sign < 0) at = at.subMins(mins); // TODO:
253 return at;
254}
255
243256pub const Commit = struct {
244257 tree: TreeId,
245258 parents: []const CommitId,