╭ changed ────╮ │build.zig.zon│ ╰─────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 3 .version = "0.0.0", │ │ 4 .dependencies = .{ │ │ 5 .xit = .{ │ │ 6 - .url = "git+https://github.com/xit-vcs/xit#94a1a29da09ccffd18ef57451b0ced33d9e21cd9",│ │ 7 - .hash = "xit-0.0.0-Ub3nDFNsUAHyTDMlk3x-R7AikTDk9s4jJg__2F2ZtieH", │ │ 6 + .url = "git+https://github.com/xit-vcs/xit#1fa752a2a83f87b2f7ebb36440c116a0a06cb01e",│ │ 7 + .hash = "xit-0.0.0-Ub3nDICBUAE0UNyDap2vcRqarHXvhBG4HasjLm0FkOYD", │ │ 8 }, │ │ 9 }, │ │10 .paths = .{ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───────────╮ │src/ui/Repo/Refs.zig│ ╰────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │68 const tags_after: usize = if (kind == .tag) after else 0; │ │69 var result = try emptyResult(arena, identity, kind, after); │ │70 │ │71 - // xit seeks each iterator straight to its window; the git backend can't │ │72 - // seek, so it starts at the beginning and collectWindow discards the │ │73 - // entries before the window. │ │74 - const can_seek = repo_kind == .xit; │ │71 + var branch_iter = repo.listBranches(io, gpa, .{ .index = branches_after }) catch return result; │ │72 + defer branch_iter.deinit(); │ │73 + const branches = try collectWindow(aa, &branch_iter, branches_after); │ │74 │ │76 - var branch_iter = repo.listBranches(io, gpa, if (can_seek) .{ .index = branches_after } else .beginning) catch return result;│ │77 - defer branch_iter.deinit(io); │ │78 - const branches = try collectWindow(io, aa, &branch_iter, branches_after, if (can_seek) 0 else branches_after); │ │75 + var tag_iter = repo.listTags(io, gpa, .{ .index = tags_after }) catch return result; │ │76 + defer tag_iter.deinit(); │ │77 + const tags = try collectWindow(aa, &tag_iter, tags_after); │ │78 │ │80 - var tag_iter = repo.listTags(io, gpa, if (can_seek) .{ .index = tags_after } else .beginning) catch return result; │ │81 - defer tag_iter.deinit(io); │ │82 - const tags = try collectWindow(io, aa, &tag_iter, tags_after, if (can_seek) 0 else tags_after); │ │83 - │ │79 result.branches = branches.names; │ │80 result.tags = tags.names; │ │81 result.branches_next_after = branches.next_after; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ 83 return result; │ │ 84 } │ │ 85 │ │ 91 -// window a ref iterator without materializing the whole list. `skip` entries │ │ 92 -// are discarded first, for backends whose iterators can't seek. │ │ 93 -fn collectWindow(io: std.Io, aa: std.mem.Allocator, iter: anytype, after: usize, skip: usize) !Window {│ │ 94 - for (0..skip) |_| { │ │ 95 - if (try iter.next(io) == null) break; │ │ 96 - } │ │ 86 +// collect one window from a ref iterator already seeked to the window start │ │ 87 +fn collectWindow(aa: std.mem.Allocator, iter: anytype, after: usize) !Window { │ │ 88 var names = try std.ArrayListUnmanaged([]const u8).initCapacity(aa, page_size); │ │ 89 while (names.items.len < page_size) { │ │ 99 - const ref = try iter.next(io) orelse break; │ │ 90 + const ref = try iter.next() orelse break; │ │ 91 names.appendAssumeCapacity(try aa.dupe(u8, ref.name)); │ │ 92 } │ │102 - const has_more = (try iter.next(io)) != null; │ │ 93 + const has_more = (try iter.next()) != null; │ │ 94 return .{ .names = names.items, .next_after = if (has_more) after + page_size else null }; │ │ 95 } │ │ 96 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯