╭ changed ──────╮ │src/ui/Repo.zig│ ╰───────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭────────────────────────────────────────────────────────╮ │25 pub const Undo = @import("./Repo/Undo.zig"); │ │26 pub const Events = @import("./Repo/Events.zig"); │ │27 pub const Settings = @import("./Repo/Settings.zig");│ │28 +pub const Roles = @import("./Repo/Roles.zig"); │ │29 pub const Quit = @import("./Quit.zig"); │ │30 │ │31 header: Header, │ ╰────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────╮ │221 .repo_events => |*e| e.selected.slice(), │ │222 else => "", │ │223 }; │ │224 + const roles_start: usize = switch (route) { │ │225 + .repo_roles => |r| r.start, │ │226 + else => 0, │ │227 + }; │ │228 │ │229 // where the on-disk repo lives (null keeps the views' empty fallback), plus│ │230 // the repo and owner-name metadata the header shows. local mode already │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │312 try evt.consume(.local, .repo, repo_kind, opened.self_repo_opts, io, gpa, opened, evt.events_ref, &.{}); │ │313 try pch.refreshBranches(.local, repo_kind, opened.self_repo_opts, io, gpa, opened, null, null); │ │314 } │ │310 - if (session.data.host_kind == .server and handle.canUndo()) settings = .{ │ │311 - .identity = try arena.allocator().dupe(u8, repo_identity.identity), │ │312 - .name = repo.event.name, │ │313 - .description = repo.event.description, │ │314 - .access = repo.event.read_access, │ │315 - .discuss_role = repo.event.discuss_role, │ │316 - .issue_role = repo.event.issue_role, │ │317 - .patch_role = repo.event.patch_role, │ │318 - .hash_kind = opened.self_repo_opts.hash, │ │319 - }; │ │315 + if (session.data.host_kind == .server and handle.canUndo()) { │ │316 + // a server page always resolved its repo id │ │317 + const repo_id = repo_id_maybe orelse unreachable; │ │318 + settings = .{ │ │319 + .identity = try arena.allocator().dupe(u8, repo_identity.identity), │ │320 + .name = repo.event.name, │ │321 + .description = repo.event.description, │ │322 + .access = repo.event.read_access, │ │323 + .discuss_role = repo.event.discuss_role, │ │324 + .issue_role = repo.event.issue_role, │ │325 + .patch_role = repo.event.patch_role, │ │326 + .hash_kind = opened.self_repo_opts.hash, │ │327 + .view = if (route == .repo_roles) .roles else .settings, │ │328 + .roles = try Roles.init(io, gpa, arena, session.haxy_moment orelse return error.NoMoment, session.users_dir orelse return error.NoMoment, repo_identity.identity, repo.event.user_id[0..evt.event_id_size], &repo_id, roles_start),│ │329 + }; │ │330 + } │ │331 // tabs switch in-page, so every tab's data is read here │ │332 if (repo_kind == .xit and handle.canWrite()) { │ │333 undo_data = Undo.init(opened.self_repo_opts, arena, opened, session.haxy_moment, repo_identity.identity, undo_index, handle) catch |err| switch (err) { │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │379 }; │ │380 }; │ │381 if (route == .repo_undo and undo_data == null) return error.NotFound; │ │371 - if (route == .repo_repo and settings == null) return error.NotFound; │ │382 + if ((route == .repo_settings or route == .repo_roles) and settings == null) return error.NotFound;│ │383 if (undo_data) |*undo| undo.clear = undo_clear; │ │384 discussions.repo_source = source; │ │385 issues.repo_source = source; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────╮ │591 .repo_refs => |*v| if (v.focusHeader(root_focus)) return, │ │592 .repo_events => |*v| if (v.focusHeader(root_focus)) return, │ │593 .repo_undo => |*v| if (v.focusHeader(root_focus)) return, │ │594 + .repo_settings => |*v| if (v.focusHeader(root_focus)) return,│ │595 else => {}, │ │596 }; │ │597 index = stack_index; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯