╭ changed ─────────────╮ │src/ui/Fork/Header.zig│ ╰──────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │69 │ │70 try ui.widget.addBackButton(allocator, &title_box, session); │ │71 │ │72 - // the user's name links to their page. │ │72 + // the forker's name links to their page. │ │73 { │ │74 var text_buf: [evt.User.name_max_len + 1]u8 = undefined; │ │75 - const text = try std.fmt.bufPrint(&text_buf, "{s}/", .{data.owner_name}); │ │76 - var owner = try wgt.TextBox.init(allocator, text, .{ .border_style = .hidden, .wrap_kind = .none }); │ │77 - errdefer owner.deinit(allocator); │ │78 - owner.getFocus().mode = .all; │ │79 - owner.getFocus().kind = .{ .custom = try std.fmt.allocPrint(aa, "a:/user/{s}", .{data.owner_name}) }; │ │75 + const text = try std.fmt.bufPrint(&text_buf, "{s}/", .{data.forker_name}); │ │76 + var forker = try wgt.TextBox.init(allocator, text, .{ .border_style = .hidden, .wrap_kind = .none }); │ │77 + errdefer forker.deinit(allocator); │ │78 + forker.getFocus().mode = .all; │ │79 + forker.getFocus().kind = .{ .custom = try std.fmt.allocPrint(aa, "a:/user/{s}", .{data.forker_name}) }; │ │80 first_group_width += try xitui.width.displayWidth(text) + 2; │ │81 - try title_box.children.put(allocator, owner.getFocus().id, .{ .widget = .{ .text_box = owner }, .rect = null, .min_size = null }); │ │81 + try title_box.children.put(allocator, forker.getFocus().id, .{ .widget = .{ .text_box = forker }, .rect = null, .min_size = null });│ │82 } │ │83 │ │84 // the title links to the target repository. │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──────╮ │src/ui/User.zig│ ╰───────────────╯ ╭────────────────────────────────────────────────────────────╮ │22 │ │23 pub const ForkItem = struct { │ │24 id: []const u8, │ │25 - // the fork route's identity, which names the forker│ │26 - identity: []const u8, │ │27 - target: []const u8, │ │25 + // the target repo's name │ │26 + name: []const u8, │ │27 title: []const u8, │ │28 }; │ │29 │ ╰────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │120 const owner_id = record.event.repo_user_id[0..evt.event_id_size]; │ │121 const target_repo = (try evt.readRepoById(io, gpa, arena, users_dir, owner_id, record.event.repo_id)) orelse continue;│ │122 if (evt.Repo.roleOf(target_repo, session.userId()) == .none) continue; │ │124 - const owner = (try evt.User.readById(DB, hash_kind, haxy_moment, arena, owner_id)) orelse continue; │ │123 │ │124 var title: []const u8 = "(unavailable)"; │ │125 const path = try fork.forkPath(arena.allocator(), users_dir, &user_id, &fork_id); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │132 } else |_| {} │ │133 try forks.append(arena.allocator(), .{ │ │134 .id = try arena.allocator().dupe(u8, &fork_id_hex), │ │137 - .identity = try std.fmt.allocPrint(arena.allocator(), "{s}/{s}", .{ user.event.name, target_repo.event.name }),│ │138 - .target = try std.fmt.allocPrint(arena.allocator(), "{s}/{s}", .{ owner.event.name, target_repo.event.name }), │ │135 + .name = target_repo.event.name, │ │136 .title = title, │ │137 }); │ │138 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │197 if (data.forks_start > 0) │ │198 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 }) });│ │199 for (data.forks) |fork_item| { │ │203 - const route = ui.RoutablePage.forkPatchRoute(fork_item.identity, fork_item.id) orelse return error.RouteTooLong; │ │200 + // the fork route names the forker │ │201 + const identity = try std.fmt.allocPrint(aa, "{s}/{s}", .{ data.user.name, fork_item.name }); │ │202 + const route = ui.RoutablePage.forkPatchRoute(identity, fork_item.id) orelse return error.RouteTooLong; │ │203 try items.append(aa, .{ │ │205 - .text = try std.fmt.allocPrint(aa, "{s}\n{s}", .{ fork_item.target, fork_item.title }), │ │204 + .text = try std.fmt.allocPrint(aa, "{s} - {s}", .{ fork_item.name, fork_item.title }), │ │205 .link = try std.fmt.allocPrint(aa, "a:{s}", .{try route.toUrl(session.page_arena)}), │ │206 }); │ │207 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │379 // clicking a repo opens its page; the "a:" prefix makes the web │ │380 // renderer emit an <a href="/repo/alice/foo"> anchor. │ │381 try items.append(aa, .{ │ │383 - .text = try std.fmt.allocPrint(aa, "{s} - {s}", .{ repo.event.name, repo.event.description }), │ │382 + .text = if (repo.event.description.len == 0) repo.event.name else try std.fmt.allocPrint(aa, "{s} - {s}", .{ repo.event.name, repo.event.description }),│ │383 .link = try std.fmt.allocPrint(aa, "a:/repo/{s}/{s}", .{ data.user.name, repo.event.name }), │ │384 }); │ │385 if (data.repos_next_start) |next_start| { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯