62 lines
1.4 KiB
Ruby
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
|