gitlab-org--gitlab-foss/app/finders/repositories/tree_finder.rb

62 lines
1.4 KiB
Ruby

# frozen_string_literal: true
module Repositories
class TreeFinder < GitRefsFinder
attr_reader :user_project
CommitMissingError = Class.new(StandardError)
def initialize(user_project, params = {})
super(user_project.repository, params)
@user_project = user_project
end
def execute(gitaly_pagination: false)
raise CommitMissingError unless commit_exists?
request_params = { recursive: recursive }
request_params[:pagination_params] = pagination_params if gitaly_pagination
tree = user_project.repository.tree(commit.id, path, **request_params)
tree.sorted_entries
end
def total
# This is inefficient and we'll look at replacing this implementation
Gitlab::Cache.fetch_once([user_project, repository.commit, :tree_size, commit.id, path, recursive]) do
user_project.repository.tree(commit.id, path, recursive: recursive).entries.size
end
end
def commit_exists?
commit.present?
end
private
def commit
@commit ||= user_project.commit(ref)
end
def ref
params[:ref] || user_project.default_branch
end
def path
params[:path]
end
def recursive
params[:recursive]
end
def pagination_params
{
limit: params[:per_page] || Kaminari.config.default_per_page,
page_token: params[:page_token]
}
end
end
end