╭ changed ───────────╮ │src/ui/Repo/Refs.zig│ ╰────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │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 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯