╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────╮ │561 var route = repoThreadRoute(kind, identity, "", selected) orelse return null;│ │562 switch (route) { │ │563 .repo_issues => |*thread| thread.view = .edit, │ │564 + .repo_patches => |*thread| thread.view = .edit, │ │565 .repo_discussions => |*thread| thread.view = .edit, │ │566 else => unreachable, │ │567 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────╮ │574 var route = repoThreadRoute(kind, identity, "", selected) orelse return null;│ │575 switch (route) { │ │576 .repo_issues => |*thread| thread.view = .description, │ │577 + .repo_patches => |*thread| thread.view = .description, │ │578 .repo_discussions => |*thread| thread.view = .description, │ │579 else => unreachable, │ │580 } │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │597 pub fn repoIssuesResolveRoute(identity: []const u8, selected: []const u8, theirs: []const u8) ?RoutablePage { │ │598 if (selected.len == 0) return null; │ │599 return .{ .repo_issues = .{ │ │600 + .name = Array(repo_route_max_len).from(identity) orelse return null, │ │601 + .selected = Array(evt.event_id_size * 2).from(selected) orelse return null, │ │602 + .theirs = Array(theirs_route_max_len).from(theirs) orelse return null, │ │603 + .view = .resolve, │ │604 + } }; │ │605 + } │ │606 + │ │607 + pub fn repoPatchesConflictsRoute(identity: []const u8, start: []const u8) ?RoutablePage { │ │608 + return .{ .repo_patches = .{ │ │609 + .name = Array(repo_route_max_len).from(identity) orelse return null, │ │610 + .selected = Array(evt.event_id_size * 2).from(start) orelse return null, │ │611 + .view = .conflicts, │ │612 + } }; │ │613 + } │ │614 + │ │615 + pub fn repoPatchesResolveRoute(identity: []const u8, selected: []const u8, theirs: []const u8) ?RoutablePage {│ │616 + if (selected.len == 0) return null; │ │617 + return .{ .repo_patches = .{ │ │618 .name = Array(repo_route_max_len).from(identity) orelse return null, │ │619 .selected = Array(evt.event_id_size * 2).from(selected) orelse return null, │ │620 .theirs = Array(theirs_route_max_len).from(theirs) orelse return null, │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │664 try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/repos", .{u.name.slice()}) │ │665 else │ │666 try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/repos/" ++ start_seg ++ "{d}", .{ u.name.slice(), u.start }),│ │667 + .user_forks => |u| if (u.start == 0) │ │668 + try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/forks", .{u.name.slice()}) │ │669 + else │ │670 + try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/forks/" ++ start_seg ++ "{d}", .{ u.name.slice(), u.start }),│ │671 .user_settings => |name| try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/settings", .{name.slice()}), │ │672 .user_auth => |name| try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/auth", .{name.slice()}), │ │673 .repo_files => |f| blk: { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │734 try std.fmt.allocPrint(arena.allocator(), "{s}/issues/{s}", .{ prefix, @tagName(i.view) }) │ │735 else │ │736 try std.fmt.allocPrint(arena.allocator(), "{s}/issues/{s}/" ++ tag_filter_seg ++ "{s}", .{ prefix, @tagName(i.view), i.tag.slice() }); │ │737 + }, │ │738 + .repo_patches => |p| blk: { │ │739 + const prefix = try repoUrlPrefix(arena, p.name.slice()); │ │740 + if (p.view == .edit) break :blk try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/edit", .{ prefix, p.selected.slice() }); │ │741 + if (p.view == .description) break :blk try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/description", .{ prefix, p.selected.slice() }); │ │742 + if (p.view == .resolve) break :blk if (p.theirs.len == 0) │ │743 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/resolve", .{ prefix, p.selected.slice() }) │ │744 + else │ │745 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/" ++ theirs_seg ++ "{s}/resolve", .{ prefix, p.selected.slice(), p.theirs.slice() }); │ │746 + if (p.view == .new_comment) break :blk if (p.comment.len == 0) │ │747 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/new", .{ prefix, p.selected.slice() }) │ │748 + else │ │749 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/" ++ comment_seg ++ "{s}/new", .{ prefix, p.selected.slice(), p.comment.slice() }); │ │750 + if (p.view == .edit_comment) break :blk try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/" ++ comment_seg ++ "{s}/edit", .{ prefix, p.selected.slice(), p.comment.slice() });│ │751 + if (p.view == .remove) break :blk if (p.comment.len == 0) │ │752 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/remove", .{ prefix, p.selected.slice() }) │ │753 + else │ │754 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/" ++ comment_seg ++ "{s}/remove", .{ prefix, p.selected.slice(), p.comment.slice() }); │ │755 + if (p.view == .conflicts) break :blk if (p.selected.len == 0) │ │756 + try std.fmt.allocPrint(arena.allocator(), "{s}/patches/conflicts", .{prefix}) │ │757 + else │ │758 + try std.fmt.allocPrint(arena.allocator(), "{s}/patches/" ++ start_seg ++ "{s}/conflicts", .{ prefix, p.selected.slice() }); │ │759 + if (p.comment.len != 0) break :blk if (p.comments_start == 0) │ │760 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/" ++ comment_seg ++ "{s}", .{ prefix, p.selected.slice(), p.comment.slice() }) │ │761 + else │ │762 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/" ++ comment_seg ++ "{s}/" ++ start_seg ++ "{d}", .{ prefix, p.selected.slice(), p.comment.slice(), p.comments_start });│ │763 + if (p.selected.len != 0) break :blk if (p.comments_start == 0) │ │764 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}", .{ prefix, p.selected.slice() }) │ │765 + else │ │766 + try std.fmt.allocPrint(arena.allocator(), "{s}/" ++ patch_seg ++ "{s}/" ++ start_seg ++ "{d}", .{ prefix, p.selected.slice(), p.comments_start }); │ │767 + break :blk if (p.tag.len == 0) │ │768 + try std.fmt.allocPrint(arena.allocator(), "{s}/patches/{s}", .{ prefix, @tagName(p.view) }) │ │769 + else │ │770 + try std.fmt.allocPrint(arena.allocator(), "{s}/patches/{s}/" ++ tag_filter_seg ++ "{s}", .{ prefix, @tagName(p.view), p.tag.slice() }); │ │771 }, │ │772 .repo_discussions => |t| blk: { │ │773 const prefix = try repoUrlPrefix(arena, t.name.slice()); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │823 const parsed = Array(evt.User.name_max_len).from(name) orelse return null; // name too long │ │824 const sub = segments.next() orelse return .{ .user_repos = .{ .name = parsed } }; │ │825 if (std.mem.eql(u8, sub, "repos")) return .{ .user_repos = .{ .name = parsed, .start = listStart(&segments) orelse return null } };│ │826 + if (std.mem.eql(u8, sub, "forks")) return .{ .user_forks = .{ .name = parsed, .start = listStart(&segments) orelse return null } };│ │827 if (std.mem.eql(u8, sub, "settings")) return if (segments.next() == null) .{ .user_settings = parsed } else null; │ │828 if (std.mem.eql(u8, sub, "auth")) return if (segments.next() == null) .{ .user_auth = parsed } else null; │ │829 return null; // unknown sub-path │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────╮ │865 pub fn fullHeight(self: RoutablePage) bool { │ │866 return switch (self) { │ │867 .repo_issues => |i| i.view == .resolve, │ │868 + .repo_patches => |p| p.view == .resolve,│ │869 else => false, │ │870 }; │ │871 } │ ╰─────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────╮ │878 .repo_commits => |*c| c.name.slice(), │ │879 .repo_refs => |*r| r.name.slice(), │ │880 .repo_issues => |*i| i.name.slice(), │ │881 + .repo_patches => |*p| p.name.slice(), │ │882 .repo_discussions => |*t| t.name.slice(), │ │883 .repo_events => |*e| e.name.slice(), │ │884 .repo_settings, .repo_auth => |*name| name.slice(),│ ╰────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────╮ │893 .home => .default, │ │894 .user => switch (self) { │ │895 .user_repos => |u| .{ .user_repos = .{ .name = u.name } }, │ │896 + .user_forks => |u| .{ .user_repos = .{ .name = u.name } }, │ │897 .user_settings, .user_auth => |name| .{ .user_repos = .{ .name = name } },│ │898 else => self, │ │899 }, │ ╰───────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │905 pub fn parent(self: RoutablePage) PageKind { │ │906 return switch (self) { │ │907 .home_users, .home_repos, .home_settings, .home_auth => .home, │ │800 - .user_repos, .user_settings, .user_auth => .user, │ │801 - .repo_files, .repo_commits, .repo_refs, .repo_issues, .repo_discussions, .repo_events, .repo_settings, .repo_auth => .repo, │ │908 + .user_repos, .user_forks, .user_settings, .user_auth => .user, │ │909 + .repo_files, .repo_commits, .repo_refs, .repo_issues, .repo_patches, .repo_discussions, .repo_events, .repo_settings, .repo_auth => .repo,│ │910 }; │ │911 } │ │912 │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯