╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │63 .user => blk: { │ │64 const haxy_moment = session.haxy_moment orelse return error.NoMoment; │ │65 break :blk switch (route) { │ │66 - .user_repos => |u| .{ .user = try User.init(arena, haxy_moment, u.name, u.start) }, │ │67 - .user_settings, .user_auth => |name| .{ .user = try User.init(arena, haxy_moment, name, 0) }, │ │66 + .user_repos => |u| .{ .user = try User.init(arena, session, haxy_moment, u.name, u.start, 0) }, │ │67 + .user_forks => |u| .{ .user = try User.init(arena, session, haxy_moment, u.name, 0, u.start) }, │ │68 + .user_settings, .user_auth => |name| .{ .user = try User.init(arena, session, haxy_moment, name, 0, 0) },│ │69 else => return error.UnexpectedRoute, │ │70 }; │ │71 }, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │72 .repo => switch (route) { │ │72 - .repo_files, .repo_commits, .repo_refs, .repo_issues, .repo_discussions, .repo_events, .repo_settings, .repo_auth => .{ .repo = try Repo.init(arena, session, route) }, │ │73 + .repo_files, .repo_commits, .repo_refs, .repo_issues, .repo_patches, .repo_discussions, .repo_events, .repo_settings, .repo_auth => .{ .repo = try Repo.init(arena, session, route) },│ │74 else => return error.UnexpectedRoute, │ │75 }, │ │76 }; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────╮ │ 94 home_settings, │ │ 95 home_auth, │ │ 96 user_repos: struct { name: Array(evt.User.name_max_len), start: usize = 0 },│ │ 97 + user_forks: struct { name: Array(evt.User.name_max_len), start: usize = 0 },│ │ 98 user_settings: Array(evt.User.name_max_len), │ │ 99 user_auth: Array(evt.User.name_max_len), │ │100 repo_files: RepoFilesRoute, │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────╮ │124 // the comment shown in the detail pane (empty = the issue thread).│ │125 comment: Array(evt.event_id_size * 2) = .{}, │ │126 }, │ │127 + repo_patches: struct { │ │128 + name: Array(repo_route_max_len), │ │129 + tag: Array(patch_tag_route_max_len) = .{}, │ │130 + selected: Array(evt.event_id_size * 2) = .{}, │ │131 + theirs: Array(theirs_route_max_len) = .{}, │ │132 + view: PatchesView = .open, │ │133 + comments_start: usize = 0, │ │134 + comment: Array(evt.event_id_size * 2) = .{}, │ │135 + }, │ │136 repo_discussions: struct { │ │137 name: Array(repo_route_max_len), │ │138 tag: Array(discussion_tag_route_max_len) = .{}, │ ╰────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │151 │ │152 pub const IssuesView = enum { open, closed, tags, new, edit, description, new_comment, edit_comment, remove, conflicts, resolve }; │ │153 │ │154 + pub const PatchesView = enum { open, closed, merged, tags, new, drafts, edit, description, new_comment, edit_comment, remove, conflicts, resolve };│ │155 + │ │156 pub const DiscussionsView = enum { recent, tags, new, edit, description, new_comment, edit_comment, remove }; │ │157 │ │158 pub const EventsView = enum { active, removed }; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────╮ │244 const line_seg = @tagName(Params.ParamKey.line) ++ ":"; │ │245 const theirs_seg = @tagName(Params.ParamKey.theirs) ++ ":"; │ │246 const issue_seg = "issue:"; │ │247 + const patch_seg = "patch:"; │ │248 const discuss_seg = "discuss:"; │ │249 const comment_seg = "comment:"; │ │250 // marks a files or commits route's trailing path: the value is the raw│ ╰────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────╮ │266 │ │267 // a url-encoded tag can grow to three bytes per source byte. │ │268 pub const issue_tag_route_max_len = evt.Issue.tag_max_len * 3; │ │269 + pub const patch_tag_route_max_len = evt.Patch.tag_max_len * 3; │ │270 pub const discussion_tag_route_max_len = evt.Discussion.tag_max_len * 3; │ │271 │ │272 // caps the resolve view's theirs: field list (a longer one doesn't route).│ ╰────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │409 return .{ .repo_issues = .{ │ │410 .name = Array(repo_route_max_len).from(identity) orelse return null, │ │411 .tag = Array(issue_tag_route_max_len).from(tag) orelse return null, │ │412 + .selected = Array(evt.event_id_size * 2).from(selected) orelse return null, │ │413 + .view = switch (status) { │ │414 + .open => .open, │ │415 + .closed => .closed, │ │416 + }, │ │417 + } }; │ │418 + } │ │419 + │ │420 + pub fn repoPatchesRoute(identity: []const u8, status: evt.Patch.Status, tag: []const u8, selected: []const u8) ?RoutablePage {│ │421 + return .{ .repo_patches = .{ │ │422 + .name = Array(repo_route_max_len).from(identity) orelse return null, │ │423 + .tag = Array(patch_tag_route_max_len).from(tag) orelse return null, │ │424 .selected = Array(evt.event_id_size * 2).from(selected) orelse return null, │ │425 .view = switch (status) { │ │426 .open => .open, │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────╮ │427 .closed => .closed,│ │428 + .merged => .merged,│ │429 }, │ │430 } }; │ │431 } │ ╰────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │432 │ │433 + pub fn repoPatchesDraftsRoute(identity: []const u8) ?RoutablePage { │ │434 + return .{ .repo_patches = .{ │ │435 + .name = Array(repo_route_max_len).from(identity) orelse return null, │ │436 + .view = .drafts, │ │437 + } }; │ │438 + } │ │439 + │ │440 pub fn repoDiscussionsRoute(identity: []const u8, tag: []const u8, selected: []const u8) ?RoutablePage {│ │441 return .{ .repo_discussions = .{ │ │442 .name = Array(repo_route_max_len).from(identity) orelse return null, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯