╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────╮ │← previous│ ╰──────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │697 │ │698 // build a `.repo_commits` route (a null ref_or_oid = the default branch). │ │699 // always carries the `commits` marker so the bare route doesn't collide │ │695 - // with the files root. a non-empty `path` filters the diff pane to that │ │696 - // file and requires a ref. │ │697 - pub fn repoCommitsRoute(identity: []const u8, ref_or_oid: ?RefOrOid, value: []const u8, start: usize, path: []const u8, base_oid: []const u8) ?RoutablePage {│ │698 - if (ref_or_oid == null and (value.len != 0 or path.len != 0)) return null; │ │700 + // with the files root. │ │701 + pub fn repoCommitsRoute(identity: []const u8, ref_or_oid: ?RefOrOid, value: []const u8, base_oid: []const u8) ?RoutablePage { │ │702 + if (ref_or_oid == null and value.len != 0) return null; │ │703 return .{ .repo_commits = .{ │ │704 .name = Array(repo_identity_max_len).from(identity) orelse return null, │ │705 .ref_or_oid = ref_or_oid, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────╮ │706 .value = Array(ref_route_max_len).from(value) orelse return null, │ │707 .base_oid = Array(ref_route_max_len).from(base_oid) orelse return null,│ │704 - .content = .{ .diff = .{ │ │705 - .start = start, │ │706 - .path = Array(repo_route_max_len).from(path) orelse return null, │ │707 - } }, │ │708 } }; │ │709 } │ │710 │ ╰────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────╮ │746 .ref_or_oid = ref_or_oid, │ │747 .value = Array(ref_route_max_len).from(value) orelse return null, │ │748 .base_oid = Array(ref_route_max_len).from(base_oid) orelse return null,│ │749 - .content = .message, │ │749 + .message = true, │ │750 } }; │ │751 } │ │752 │ ╰────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1091 if (c.search.len != 0) try out.writer.print("/" ++ search_seg ++ "{s}", .{c.search.slice()}); │ │1092 if (c.from.len != 0) try out.writer.print("/" ++ from_seg ++ "{s}", .{c.from.slice()}); │ │1093 if (c.merge.len != 0) try out.writer.print("/" ++ merge_seg ++ "{s}", .{c.merge.slice()}); │ │1094 - switch (c.content) { │ │1095 - .diff => |d| { │ │1096 - if (d.start != 0) try out.writer.print("/" ++ start_seg ++ "{d}", .{d.start}); │ │1097 - if (d.path.len != 0) try out.writer.print("/" ++ path_seg ++ "{s}", .{d.path.slice()});│ │1098 - }, │ │1099 - .message => try out.writer.print("/" ++ message_seg, .{}), │ │1100 - } │ │1094 + if (c.message) try out.writer.print("/" ++ message_seg, .{}); │ │1095 break :blk out.written(); │ │1096 }, │ │1097 .repo_diff => |d| blk: { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1244 .fork_diff => |d| blk: { │ │1245 var out: std.Io.Writer.Allocating = .init(arena.allocator()); │ │1246 try out.writer.print(fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/diff", .{ d.fork.name.slice(), d.fork.id.slice() }); │ │1247 + if (d.oid.len != 0) try out.writer.print("/object:{s}/" ++ base_seg ++ "{s}", .{ d.oid.slice(), d.base_oid.slice() });│ │1248 if (d.start != 0) try out.writer.print("/" ++ start_seg ++ "{d}", .{d.start}); │ │1249 if (d.path.len != 0) try out.writer.print("/" ++ path_seg ++ "{s}", .{d.path.slice()}); │ │1250 break :blk out.written(); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1262 var out: std.Io.Writer.Allocating = .init(arena.allocator()); │ │1263 try out.writer.print(fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/" ++ commits_seg, .{ c.fork.name.slice(), c.fork.id.slice() }); │ │1264 if (c.oid.len != 0) try out.writer.print("/object:{s}", .{c.oid.slice()}); │ │1270 - switch (c.content) { │ │1271 - .diff => |d| { │ │1272 - if (d.start != 0) try out.writer.print("/" ++ start_seg ++ "{d}", .{d.start}); │ │1273 - if (d.path.len != 0) try out.writer.print("/" ++ path_seg ++ "{s}", .{d.path.slice()}); │ │1274 - }, │ │1275 - .message => try out.writer.print("/" ++ message_seg, .{}), │ │1276 - } │ │1265 + if (c.message) try out.writer.print("/" ++ message_seg, .{}); │ │1266 break :blk out.written(); │ │1267 }, │ │1268 .fork_new_repo => |f| try std.fmt.allocPrint(arena.allocator(), fork_segment ++ "{s}/" ++ patch_seg ++ "{s}/new-repo", .{ f.name.slice(), f.id.slice() }),│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1316 var params = Params{}; │ │1317 if (std.mem.eql(u8, tab, "diff")) { │ │1318 params.scanPairs(&segments) catch return null; │ │1330 - if (!params.only(&.{.start})) return null; │ │1331 - return forkDiffRoute(identity, id, params.start() orelse return null, pathValue(segments.rest()) orelse return null); │ │1319 + if (!params.only(&.{ .start, .object, .base })) return null; │ │1320 + const ref = params.ref() catch return null; │ │1321 + const oid = if (ref) |value| if (value.kind == .object) value.value else return null else ""; │ │1322 + return forkDiffRoute(identity, id, oid, params.values.get(.base) orelse "", params.start() orelse return null, pathValue(segments.rest()) orelse return null);│ │1323 } │ │1324 if (std.mem.eql(u8, tab, files_seg)) { │ │1325 params.scanPairs(&segments) catch return null; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1334 } │ │1335 if (std.mem.eql(u8, tab, commits_seg)) { │ │1336 params.scanPairs(&segments) catch return null; │ │1346 - if (!params.only(&.{ .start, .object })) return null; │ │1347 - const start = params.start() orelse return null; │ │1337 + if (!params.only(&.{.object})) return null; │ │1338 const ref = params.ref() catch return null; │ │1339 const oid = if (ref) |value| if (value.kind == .object) value.value else return null else "";│ │1340 if (std.mem.eql(u8, segments.rest(), message_seg)) │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1351 - return if (start == 0 and oid.len != 0) forkCommitMessageRoute(identity, id, oid) else null; │ │1352 - const file_path = pathValue(segments.rest()) orelse return null; │ │1353 - return forkCommitsRoute(identity, id, oid, start, file_path); │ │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 } │ │1344 if (std.mem.eql(u8, tab, "new-repo")) return if (segments.next() == null) forkNewRepoRoute(identity, id) else null;│ │1345 if (std.mem.eql(u8, tab, "new-user")) return if (segments.next() == null) forkNewUserRoute(identity, id) else null;│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1701 if (!params.only(&.{.merge}) or segments.next() != null) return null; │ │1702 return repoCommitsMergeRoute(pair, oid); │ │1703 } │ │1715 - if (!params.only(&.{ .start, .branch, .tag, .object, .base, .search, .from })) return null;│ │1704 + if (!params.only(&.{ .branch, .tag, .object, .base, .search, .from })) return null; │ │1705 const base_oid = params.values.get(.base) orelse ""; │ │1706 const search = params.values.get(.search) orelse ""; │ │1707 const from = params.values.get(.from) orelse ""; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯