| ... | ... | @@ -226,12 +226,11 @@ fn parseCommitUserAndAt(input: string) !UserAndAt { |
| 226 | 226 | const time_part = maybe_bad_parser.next() orelse return error.BadCommitTime; |
| 227 | 227 | const email_part = maybe_bad_parser.next() orelse return error.BadCommitEmail; |
| 228 | 228 | const name_part = maybe_bad_parser.rest(); |
| 229 | | _ = tz_part; |
| 230 | 229 | std.debug.assert(email_part[0] == '<'); |
| 231 | 230 | std.debug.assert(email_part[email_part.len - 1] == '>'); |
| 232 | 231 | const name = name_part; |
| 233 | 232 | 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); |
| 235 | 234 | |
| 236 | 235 | return .{ |
| 237 | 236 | .name = name, |
| ... | ... | @@ -240,6 +239,20 @@ fn parseCommitUserAndAt(input: string) !UserAndAt { |
| 240 | 239 | }; |
| 241 | 240 | } |
| 242 | 241 | |
| 242 | fn 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 | |
| 243 | 256 | pub const Commit = struct { |
| 244 | 257 | tree: TreeId, |
| 245 | 258 | parents: []const CommitId, |