╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1239 else │ │1240 try std.fmt.allocPrint(arena.allocator(), "{s}/events/{s}{s}", .{ prefix, @tagName(e.view), moment }); │ │1241 }, │ │1242 - .repo_new_repo => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/new-repo", .{try repoUrlPrefix(arena, name.slice())}), │ │1243 - .repo_new_user => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/new-user", .{try repoUrlPrefix(arena, name.slice())}), │ │1242 + .repo_repo_new => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/repo/new", .{try repoUrlPrefix(arena, name.slice())}), │ │1243 + .repo_user_new => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/user/new", .{try repoUrlPrefix(arena, name.slice())}), │ │1244 .repo_user => |name| try std.fmt.allocPrint(arena.allocator(), "{s}/user", .{try repoUrlPrefix(arena, name.slice())}), │ │1245 .fork_patch => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}", .{ f.name.slice(), f.id.slice() }),│ │1246 .fork_diff => |d| blk: { │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1267 if (c.message) try out.writer.print("/" ++ message_seg, .{}); │ │1268 break :blk out.written(); │ │1269 }, │ │1270 - .fork_new_repo => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/new-repo", .{ f.name.slice(), f.id.slice() }),│ │1271 - .fork_new_user => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/new-user", .{ f.name.slice(), f.id.slice() }),│ │1270 + .fork_repo_new => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/repo/new", .{ f.name.slice(), f.id.slice() }),│ │1271 + .fork_user_new => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/user/new", .{ f.name.slice(), f.id.slice() }),│ │1272 .fork_user => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/user", .{ f.name.slice(), f.id.slice() }), │ │1273 }; │ │1274 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1282 const params = listParams(&segments, &.{ .start, .search }) orelse return null; │ │1283 return withEncodedSearch(.{ .home_users = .{ .start = params.start() orelse return null } }, params.values.get(.search) orelse "");│ │1284 } │ │1285 - // "user/<name>[/repos[/search:<s>][/start:<n>]|/new-repo|/new-user|/user]" │ │1285 + // "user/<name>[/repos[/search:<s>][/start:<n>]|/repo/new|/user[/new]]" │ │1286 if (std.mem.eql(u8, first, "user")) { │ │1287 const name = segments.next() orelse return .home_user; │ │1288 if (name.len == 0) return null; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1289 // "/user/new" is the home page's new user tab, not a user │ │1290 - if (std.mem.eql(u8, name, "new") and segments.peek() == null) return .home_new_user; │ │1290 + if (std.mem.eql(u8, name, "new") and segments.peek() == null) return .home_user_new; │ │1291 const parsed = Array(evt.User.name_max_len).from(name) orelse return null; // name too long│ │1292 const sub = segments.next() orelse return .{ .user_repos = .{ .name = parsed } }; │ │1293 if (std.mem.eql(u8, sub, "repos")) { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1295 return withEncodedSearch(.{ .user_repos = .{ .name = parsed, .start = params.start() orelse return null } }, params.values.get(.search) orelse ""); │ │1296 } │ │1297 if (std.mem.eql(u8, sub, "forks")) return .{ .user_forks = .{ .name = parsed, .start = listStart(&segments) orelse return null } }; │ │1298 - if (std.mem.eql(u8, sub, "new-repo")) return if (segments.next() == null) .{ .user_new_repo = parsed } else null; │ │1299 - if (std.mem.eql(u8, sub, "new-user")) return if (segments.next() == null) .{ .user_new_user = parsed } else null; │ │1300 - if (std.mem.eql(u8, sub, "user")) return if (segments.next() == null) .{ .user_user = parsed } else null; │ │1298 + if (std.mem.eql(u8, sub, "repo")) return if (isNewTail(&segments)) .{ .user_repo_new = parsed } else null; │ │1299 + if (std.mem.eql(u8, sub, "user")) return if (segments.peek() == null) .{ .user_user = parsed } else if (isNewTail(&segments)) .{ .user_user_new = parsed } else null;│ │1300 return null; // unknown sub-path │ │1301 } │ │1302 // "fork/<forker>/<reponame>/patch:<id>[/files|/commits]"; the │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1341 return if (oid.len != 0) forkCommitMessageRoute(identity, id, oid) else null; │ │1342 return if (segments.rest().len == 0) forkCommitsRoute(identity, id, oid) else null; │ │1343 } │ │1345 - if (std.mem.eql(u8, tab, "new-repo")) return if (segments.next() == null) forkNewRepoRoute(identity, id) else null; │ │1346 - if (std.mem.eql(u8, tab, "new-user")) return if (segments.next() == null) forkNewUserRoute(identity, id) else null; │ │1347 - if (std.mem.eql(u8, tab, "user")) return if (segments.next() == null) forkUserRoute(identity, id) else null; │ │1344 + if (std.mem.eql(u8, tab, "repo")) return if (isNewTail(&segments)) forkRepoNewRoute(identity, id) else null; │ │1345 + if (std.mem.eql(u8, tab, "user")) return if (segments.peek() == null) forkUserRoute(identity, id) else if (isNewTail(&segments)) forkUserNewRoute(identity, id) else null;│ │1346 return null; │ │1347 } │ │1348 // "repo/<username>/<reponame>[/<tab tail>]"; the bare pair is the │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1351 const rest = segments.rest(); // "username/reponame[/...]" │ │1352 const owner = segments.next() orelse return null; │ │1353 // "/repo/new" is the home page's new repo tab, not a repo │ │1356 - if (std.mem.eql(u8, owner, "new") and segments.peek() == null) return .home_new_repo;│ │1354 + if (std.mem.eql(u8, owner, "new") and segments.peek() == null) return .home_repo_new;│ │1355 const repo_name = segments.next() orelse return null; │ │1356 // reject an empty username or reponame │ │1357 if (owner.len == 0 or repo_name.len == 0) return null; │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────╮ │1402 .repo_discussions => |*t| t.name.slice(), │ │1403 .repo_events => |*e| e.name.slice(), │ │1404 .repo_undo => |*u| u.name.slice(), │ │1407 - .repo_new_repo, .repo_new_user, .repo_user => |*name| name.slice(),│ │1405 + .repo_repo_new, .repo_user_new, .repo_user => |*name| name.slice(),│ │1406 else => null, │ │1407 }; │ │1408 } │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────╮ │1413 .fork_diff => |*d| &d.fork, │ │1414 .fork_files => |*f| &f.fork, │ │1415 .fork_commits => |*f| &f.fork,│ │1418 - .fork_new_repo => |*f| f, │ │1419 - .fork_new_user => |*f| f, │ │1416 + .fork_repo_new => |*f| f, │ │1417 + .fork_user_new => |*f| f, │ │1418 .fork_user => |*f| f, │ │1419 else => null, │ │1420 }; │ ╰────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1428 .user => switch (self) { │ │1429 .user_repos => |u| .{ .user_repos = .{ .name = u.name } }, │ │1430 .user_forks => |u| .{ .user_repos = .{ .name = u.name } }, │ │1433 - .user_new_repo, .user_new_user, .user_user => |name| .{ .user_repos = .{ .name = name } },│ │1431 + .user_repo_new, .user_user_new, .user_user => |name| .{ .user_repos = .{ .name = name } },│ │1432 else => self, │ │1433 }, │ │1434 // every repo route stores the same identity, so it always fits │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯