╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────╮ │2327 io: ?std.Io = null, │ │2328 admin_repo: ?*rp.Repo(.xit, evt.admin_repo_opts) = null, │ │2329 users_dir: ?[]const u8 = null, │ │2331 - // the notify worker's queue, null where no worker runs │ │2332 - dirty_repos: ?*notify.DirtyRepos = null, │ │2330 // the single on-disk repo this session views, when running in local mode │ │2331 // (haxy invoked with no arguments inside a repo). null on the server paths,│ │2332 // which resolve repos from the admin db instead. │ ╰──────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────╮ │2712 .local => .local, │ │2713 .server => .{ .server = .{ │ │2714 .users_dir = self.users_dir orelse unreachable, │ │2718 - .dirty_repos = self.dirty_repos, │ │2715 .admin_repo_path = (self.admin_repo orelse unreachable).core.work_path,│ │2716 } }, │ │2717 }; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──────╮ │src/ui/Repo.zig│ ╰───────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │443 const gpa = arena.child_allocator; │ │444 │ │445 { │ │446 - // the owner's plain data, which holds the subscriber index │ │446 + // the owner's plain data, which holds the tier index │ │447 var owner_repo = (try evt.openUserRepo(io, gpa, users_dir, owner_id)) orelse return error.NotFound;│ │448 defer owner_repo.deinit(io, gpa); │ │449 const owner_moment = try notify.latestMoment(&owner_repo); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │479 ) !void { │ │480 const items = try arena.allocator().dupe(std.meta.Elem(@TypeOf(window.items)), window.items); │ │481 for (items) |*entry| { │ │482 - const thread_id = try evt.parseEventId(entry.id); │ │483 - // muting drops the user from the index, so membership alone decides │ │484 - const subscribed = if (owner_moment) |moment| try notify.isSubscribed(moment, &notify.idOf(repo_id, &thread_id), user_id) else false;│ │485 - entry.notify_action = if (subscribed) .mute else .subscribe; │ │482 + const notif_id = notify.idOf(repo_id, &try evt.parseEventId(entry.id)); │ │483 + // muting drops the user from every tier, so membership alone decides │ │484 + const notified = if (owner_moment) |moment| try notify.isNotified(moment, &notif_id, user_id) else false; │ │485 + entry.notify_action = if (notified) .mute else .subscribe; │ │486 } │ │487 window.items = items; │ │488 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭────────────────────────────────────────────╮ │44 server: struct { │ │45 admin_repo_path: []const u8, │ │46 users_dir: []const u8, │ │47 - dirty_repos: *notify.DirtyRepos,│ │47 session_store: SessionStore, │ │48 git_http_port: ?u16, │ │49 git_ssh_port: ?u16, │ ╰────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │54 pub fn event(self: Host) evt.Host { │ │55 return switch (self) { │ │56 .local => .local, │ │58 - .server => |server| .{ .server = .{ .users_dir = server.users_dir, .dirty_repos = server.dirty_repos, .admin_repo_path = server.admin_repo_path } },│ │57 + .server => |server| .{ .server = .{ .users_dir = server.users_dir, .admin_repo_path = server.admin_repo_path } }, │ │58 }; │ │59 } │ │60 }; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯