╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1068 else │ │1069 try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/forks/" ++ start_seg ++ "{d}", .{ u.name.slice(), u.start }),│ │1070 .user_new_repo => |name| try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/new-repo", .{name.slice()}), │ │1071 + .user_new_user => |name| try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/new-user", .{name.slice()}), │ │1072 .user_auth => |name| try std.fmt.allocPrint(arena.allocator(), user_segment ++ "{s}/auth", .{name.slice()}), │ │1073 .repo_files => |f| blk: { │ │1074 const prefix = try repoUrlPrefix(arena, f.name.slice()); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1244 try std.fmt.allocPrint(arena.allocator(), "{s}/events/{s}{s}", .{ prefix, @tagName(e.view), moment }); │ │1245 }, │ │1246 .repo_new_repo => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/new-repo", .{try repoUrlPrefix(arena, name.slice())}), │ │1247 + .repo_new_user => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/new-user", .{try repoUrlPrefix(arena, name.slice())}), │ │1248 .repo_auth => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/auth", .{try repoUrlPrefix(arena, name.slice())}), │ │1249 .fork_patch => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}", .{ f.name.slice(), f.id.slice() }),│ │1250 .fork_diff => |d| blk: { │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1277 break :blk out.written(); │ │1278 }, │ │1279 .fork_new_repo => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/new-repo", .{ f.name.slice(), f.id.slice() }),│ │1280 + .fork_new_user => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/new-user", .{ f.name.slice(), f.id.slice() }),│ │1281 .fork_auth => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/auth", .{ f.name.slice(), f.id.slice() }), │ │1282 }; │ │1283 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1292 return withEncodedSearch(.{ .home_users = .{ .start = params.start() orelse return null } }, params.values.get(.search) orelse "");│ │1293 } │ │1294 if (std.mem.eql(u8, first, "auth")) return if (segments.next() == null) .home_auth else null; │ │1282 - // "user/<name>[/repos[/search:<s>][/start:<n>]|/new-repo|/auth]" │ │1295 + // "user/<name>[/repos[/search:<s>][/start:<n>]|/new-repo|/new-user|/auth]" │ │1296 if (std.mem.eql(u8, first, "user")) { │ │1297 const name = segments.next() orelse return null; │ │1298 if (name.len == 0) return null; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1299 + // "/user/new" is the home page's new user tab, not a user │ │1300 + if (std.mem.eql(u8, name, "new") and segments.peek() == null) return .home_new_user; │ │1301 const parsed = Array(evt.User.name_max_len).from(name) orelse return null; // name too long│ │1302 const sub = segments.next() orelse return .{ .user_repos = .{ .name = parsed } }; │ │1303 if (std.mem.eql(u8, sub, "repos")) { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1306 } │ │1307 if (std.mem.eql(u8, sub, "forks")) return .{ .user_forks = .{ .name = parsed, .start = listStart(&segments) orelse return null } };│ │1308 if (std.mem.eql(u8, sub, "new-repo")) return if (segments.next() == null) .{ .user_new_repo = parsed } else null; │ │1309 + if (std.mem.eql(u8, sub, "new-user")) return if (segments.next() == null) .{ .user_new_user = parsed } else null; │ │1310 if (std.mem.eql(u8, sub, "auth")) return if (segments.next() == null) .{ .user_auth = parsed } else null; │ │1311 return null; // unknown sub-path │ │1312 } │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1353 return forkCommitsRoute(identity, id, oid, start, file_path); │ │1354 } │ │1355 if (std.mem.eql(u8, tab, "new-repo")) return if (segments.next() == null) forkNewRepoRoute(identity, id) else null;│ │1356 + if (std.mem.eql(u8, tab, "new-user")) return if (segments.next() == null) forkNewUserRoute(identity, id) else null;│ │1357 if (std.mem.eql(u8, tab, "auth")) return if (segments.next() == null) forkAuthRoute(identity, id) else null; │ │1358 return null; │ │1359 } │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────╮ │1414 .repo_discussions => |*t| t.name.slice(), │ │1415 .repo_events => |*e| e.name.slice(), │ │1416 .repo_undo => |*u| u.name.slice(), │ │1400 - .repo_new_repo, .repo_auth => |*name| name.slice(), │ │1417 + .repo_new_repo, .repo_new_user, .repo_auth => |*name| name.slice(),│ │1418 else => null, │ │1419 }; │ │1420 } │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────╮ │1426 .fork_files => |*f| &f.fork, │ │1427 .fork_commits => |*f| &f.fork,│ │1428 .fork_new_repo => |*f| f, │ │1429 + .fork_new_user => |*f| f, │ │1430 .fork_auth => |*f| f, │ │1431 else => null, │ │1432 }; │ ╰────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1440 .user => switch (self) { │ │1441 .user_repos => |u| .{ .user_repos = .{ .name = u.name } }, │ │1442 .user_forks => |u| .{ .user_repos = .{ .name = u.name } }, │ │1425 - .user_new_repo, .user_auth => |name| .{ .user_repos = .{ .name = name } }, │ │1443 + .user_new_repo, .user_new_user, .user_auth => |name| .{ .user_repos = .{ .name = name } },│ │1444 else => self, │ │1445 }, │ │1446 // every repo route stores the same identity, so it always fits │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯