╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─────────────╮ │src/ui/Repo/Issues.zig│ ╰──────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │892 { │ │893 var items: std.ArrayList(ui.TagFlow.Item) = .empty; │ │894 defer items.deinit(allocator); │ │895 - var tag_iter = evt.Issue.tagIterator(entry.issue.tags); │ │895 + var tag_iter = evt.Issue.tagIterator(entry.issue.event.tags); │ │896 while (tag_iter.next()) |tag| { │ │897 if (tag.len == 0) continue; │ │898 try items.append(allocator, .{ .text = tag, .link = try tagLink(self.session.page_arena, self.data.identity, splitStatus(index), tag) });│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │910 // it's cut at the last whole line and links to the /description page, │ │911 // which shows the whole thing. │ │912 self.description_id[index] = blk: { │ │913 - const whole = entry.issue.description; │ │913 + const whole = entry.issue.event.description; │ │914 const cut_short = !description_page and whole.len > max_description_size; │ │915 const shown = if (cut_short) │ │916 std.mem.trimEnd(u8, whole[0 .. std.mem.lastIndexOfScalar(u8, whole[0..max_description_size], '\n') orelse 0], " \t\r\n")│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1264 }, │ │1265 } │ │1266 │ │1267 - const route = ui.RoutablePage.repoIssuesRoute(self.data.identity, entry.issue.status, "", entry.id) orelse return; │ │1267 + const route = ui.RoutablePage.repoIssuesRoute(self.data.identity, entry.issue.event.status, "", entry.id) orelse return;│ │1268 try self.session.navigate(route); │ │1269 } │ │1270 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────╮ │1278 const sel = self.detailed_index[index] orelse return; │ │1279 const entry = self.window(index).issues[sel]; │ │1280 │ │1281 - const status: evt.Issue.Status = switch (entry.issue.status) { │ │1281 + const status: evt.Issue.Status = switch (entry.issue.event.status) {│ │1282 .open => .closed, │ │1283 .closed => .open, │ │1284 }; │ ╰──────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──────╮ │src/ui/User.zig│ ╰───────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────╮ │19 pub const page_size = 20; // how many repos one window of the repos tab shows │ │20 │ │21 header: Header, │ │22 -user: evt.User.Safe, │ │23 -repos: []const evt.Repo, │ │22 +user: evt.User.Public, │ │23 +repos: []const evt.Repo.Record, │ │24 repos_start: usize, // the repos window this page was built with, mirrored into the url│ │25 repos_next_start: ?usize, // the `start` for the "next" row, or null on the last window│ │26 settings: Settings, │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │50 │ │51 const user = (try evt.User.readById(DB, hash_kind, haxy_moment, arena, user_id)) orelse return error.NotFound;│ │52 │ │53 - var repos: std.ArrayList(evt.Repo) = .empty; │ │53 + var repos: std.ArrayList(evt.Repo.Record) = .empty; │ │54 var repos_next_start: ?usize = null; │ │55 │ │56 // the user-id->repo-id-set index maps each user to a set of their repo event │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │80 const event_id = order_key[@sizeOf(u64)..]; │ │81 const repo_cursor = try event_id_to_repo.getCursor(hash.hashInt(hash_kind, event_id)) orelse continue;│ │82 const repo_map = try DB.HashMap(.read_only).init(repo_cursor); │ │83 - const repo_event = try evt.read(evt.Repo, DB, hash_kind, arena, repo_map); │ │83 + const repo_event = try evt.read(evt.Repo.Record, DB, hash_kind, arena, repo_map); │ │84 try repos.append(arena.allocator(), repo_event); │ │85 } │ │86 repos_next_start = if (end < count) end else null; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────╮ │88 } │ │89 │ │90 return .{ │ │91 - .header = try Header.init(arena, user.name), │ │92 - .user = evt.User.Safe.init(user), │ │91 + .header = try Header.init(arena, user.event.name),│ │92 + .user = evt.project(evt.User.Public, user.event), │ │93 .repos = repos.items, │ │94 .repos_start = start, │ │95 .repos_next_start = repos_next_start, │ ╰──────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │145 // clicking a repo opens its page; the "a:" prefix makes the web │ │146 // renderer emit an <a href="/repo/alice/foo"> anchor. │ │147 try items.append(aa, .{ │ │148 - .text = try std.fmt.allocPrint(aa, "{s} - {s}", .{ repo.name, repo.description }), │ │149 - .link = try std.fmt.allocPrint(aa, "a:/repo/{s}/{s}", .{ data.user.name, repo.name }), │ │148 + .text = try std.fmt.allocPrint(aa, "{s} - {s}", .{ repo.event.name, repo.event.description }), │ │149 + .link = try std.fmt.allocPrint(aa, "a:/repo/{s}/{s}", .{ data.user.name, repo.event.name }), │ │150 }); │ │151 if (data.repos_next_start) |next_start| │ │152 try items.append(aa, .{ .text = "next →", .link = try std.fmt.allocPrint(aa, "a:/user/{s}/repos/start:{d}", .{ data.user.name, next_start }) });│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭───────────────────────────────────────────╮ │354 arena: *std.heap.ArenaAllocator, │ │355 request: *std.http.Server.Request,│ │356 host: Host, │ │357 -) !?evt.User { │ │357 +) !?evt.User.Record { │ │358 const remote = switch (host) { │ │359 .remote => |remote| remote, │ │360 .local => return null, │ ╰───────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯