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 Link and X-NEXT-CURSOR headers via HeaderBuilder

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)
end

Update 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
end

Acceptance Criteria

  • GitalyKeysetPager recognizes CommitsFinder
  • HeaderBuilder extracts cursor from CommitCollectionWithNextCursor
  • Add feature flag commits_keyset_pagination for safe rollout
  • Unit tests for pager integration
  • Integration tests verifying header generation

Reference Files

  • lib/gitlab/pagination/gitaly_keyset_pager.rb
  • lib/gitlab/pagination/keyset/header_builder.rb
  • lib/gitlab/pagination/keyset/pager.rb

References