╭ changed ──────╮ │src/ui/User.zig│ ╰───────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────────────────────────────────────────────────────────────╮ │21 pub const page_size = 20; // how many repos one window of the repos tab shows│ │22 │ │23 pub const ForkItem = struct { │ │24 + id: []const u8, │ │25 target: []const u8, │ │26 title: []const u8, │ │27 }; │ ╰─────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │118 var order_key: [@sizeOf(u64) + evt.event_id_size]u8 = undefined; │ │119 _ = try kv.key_cursor.readBytes(&order_key); │ │120 const fork_id = order_key[@sizeOf(u64)..]; │ │121 + const fork_id_hex = std.fmt.bytesToHex(fork_id.*, .lower); │ │122 const record = (try evt.Fork.readById(DB, hash_kind, haxy_moment, arena, fork_id)) orelse continue; │ │123 │ │124 const repo_cursor = try repo_records.getCursor(hash.hashInt(hash_kind, record.event.repo_id)) orelse continue;│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │128 │ │129 var title: []const u8 = "(unavailable)"; │ │130 if (session.io) |io| if (session.repos_dir) |repos_dir| { │ │129 - const id_hex = std.fmt.bytesToHex(fork_id.*, .lower); │ │130 - const path = try fork.forkPath(arena.allocator(), repos_dir, &id_hex); │ │131 + const path = try fork.forkPath(arena.allocator(), repos_dir, &fork_id_hex); │ │132 if (rp.Repo(.xit, .{}).open(io, arena.child_allocator, .{ .path = path, .require_repo_root = true })) |opened| {│ │133 var fork_repo = opened; │ │134 defer fork_repo.deinit(io, arena.child_allocator); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────╮ │137 } else |_| {} │ │138 } else |_| {} │ │139 }; │ │139 - try forks.append(arena.allocator(), .{ .target = target, .title = title });│ │140 + try forks.append(arena.allocator(), .{ │ │141 + .id = try arena.allocator().dupe(u8, &fork_id_hex), │ │142 + .target = target, │ │143 + .title = title, │ │144 + }); │ │145 } │ │146 forks_next_start = if (end < count) end else null; │ │147 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │224 var items: std.ArrayList(ui.widget.FlowBox.Item) = .empty; │ │225 if (data.forks_start > 0) │ │226 try items.append(aa, .{ .text = "← previous", .link = try std.fmt.allocPrint(aa, "a:/user/{s}/forks/start:{d}", .{ data.user.name, data.forks_start -| page_size }) });│ │222 - for (data.forks) |fork_item| │ │223 - try items.append(aa, .{ .text = try std.fmt.allocPrint(aa, "{s}\n{s}", .{ fork_item.target, fork_item.title }), .link = "" }); │ │227 + for (data.forks) |fork_item| { │ │228 + const route = ui.RoutablePage.forkPatchRoute(fork_item.target, fork_item.id) orelse return error.RouteTooLong; │ │229 + try items.append(aa, .{ │ │230 + .text = try std.fmt.allocPrint(aa, "{s}\n{s}", .{ fork_item.target, fork_item.title }), │ │231 + .link = try std.fmt.allocPrint(aa, "a:{s}", .{try route.toUrl(session.page_arena)}), │ │232 + }); │ │233 + } │ │234 if (data.forks_next_start) |next_start| │ │235 try items.append(aa, .{ .text = "next →", .link = try std.fmt.allocPrint(aa, "a:/user/{s}/forks/start:{d}", .{ data.user.name, next_start }) }); │ │236 try list.setItems(allocator, items.items); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯