Integrate CommitsFinder with GitalyKeysetPager
Summary
Update GitalyKeysetPager to recognize and work with the new CommitsFinder class, enabling standard keyset pagination header generation.
Parent Issue
This is part of #595504 (closed) (Epic: Refactor Commits API to use standard keyset pagination patterns)
Background
GitLab's GitalyKeysetPager orchestrates keyset pagination for git objects, handling:
- Detecting when keyset pagination is requested
- Calling the finder with
gitaly_pagination: true - Generating
LinkandX-NEXT-CURSORheaders viaHeaderBuilder
We need to integrate CommitsFinder with this existing infrastructure.
Proposed Implementation
Update lib/gitlab/pagination/gitaly_keyset_pager.rb
The pager should recognize CommitsFinder and handle its CommitCollectionWithNextCursor response type.
# In GitalyKeysetPager, add support for CommitsFinder
def paginate(finder)
return paginate_via_gitaly(finder) if keyset_pagination_enabled?(finder)
# ... existing offset pagination
end
private
def keyset_pagination_enabled?(finder)
return false unless params[:pagination] == 'keyset'
finder.is_a?(CommitsFinder) ||
finder.is_a?(BranchesFinder) ||
finder.is_a?(TagsFinder) ||
finder.is_a?(Repositories::TreeFinder)
endUpdate lib/gitlab/pagination/keyset/header_builder.rb
Ensure HeaderBuilder can extract cursor from CommitCollectionWithNextCursor:
def next_cursor(collection)
case collection
when Repositories::CommitCollectionWithNextCursor
collection.next_cursor
# ... existing cases
end
endAcceptance Criteria
-
GitalyKeysetPagerrecognizesCommitsFinder -
HeaderBuilderextracts cursor fromCommitCollectionWithNextCursor - Add feature flag
commits_keyset_paginationfor safe rollout - Unit tests for pager integration
- Integration tests verifying header generation
Reference Files
lib/gitlab/pagination/gitaly_keyset_pager.rblib/gitlab/pagination/keyset/header_builder.rblib/gitlab/pagination/keyset/pager.rb
References
- Parent epic: #595504 (closed)
- Depends on: CommitsFinder issue