debian-mirror-gitlab/lib/gitlab/gitaly_client/blob_service.rb

169 lines
4.4 KiB
Ruby
Raw Normal View History

2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
2017-09-10 17:25:29 +05:30
module Gitlab
module GitalyClient
class BlobService
2018-03-17 18:26:18 +05:30
include Gitlab::EncodingHelper
2017-09-10 17:25:29 +05:30
def initialize(repository)
@gitaly_repo = repository.gitaly_repository
end
def get_blob(oid:, limit:)
request = Gitaly::GetBlobRequest.new(
repository: @gitaly_repo,
oid: oid,
limit: limit
)
2018-11-08 19:23:39 +05:30
response = GitalyClient.call(@gitaly_repo.storage_name, :blob_service, :get_blob, request, timeout: GitalyClient.fast_timeout)
2020-07-28 23:09:34 +05:30
consume_blob_response(response)
2017-09-10 17:25:29 +05:30
end
2018-03-17 18:26:18 +05:30
def batch_lfs_pointers(blob_ids)
return [] if blob_ids.empty?
request = Gitaly::GetLFSPointersRequest.new(
repository: @gitaly_repo,
blob_ids: blob_ids
)
2018-11-08 19:23:39 +05:30
response = GitalyClient.call(@gitaly_repo.storage_name, :blob_service, :get_lfs_pointers, request, timeout: GitalyClient.medium_timeout)
2018-03-27 19:54:05 +05:30
map_lfs_pointers(response)
2018-03-17 18:26:18 +05:30
end
def get_blobs(revision_paths, limit = -1)
return [] if revision_paths.empty?
2019-07-31 22:56:46 +05:30
request_revision_paths = revision_paths.map do |rev, path|
2018-03-17 18:26:18 +05:30
Gitaly::GetBlobsRequest::RevisionPath.new(revision: rev, path: encode_binary(path))
end
request = Gitaly::GetBlobsRequest.new(
repository: @gitaly_repo,
2019-07-31 22:56:46 +05:30
revision_paths: request_revision_paths,
2018-03-17 18:26:18 +05:30
limit: limit
)
response = GitalyClient.call(
@gitaly_repo.storage_name,
:blob_service,
:get_blobs,
request,
2020-07-28 23:09:34 +05:30
timeout: GitalyClient.fast_timeout)
2018-03-17 18:26:18 +05:30
GitalyClient::BlobsStitcher.new(response)
end
2018-03-27 19:54:05 +05:30
2019-12-21 20:55:43 +05:30
def get_blob_types(revision_paths, limit = -1)
return {} if revision_paths.empty?
request_revision_paths = revision_paths.map do |rev, path|
Gitaly::GetBlobsRequest::RevisionPath.new(revision: rev, path: encode_binary(path))
end
request = Gitaly::GetBlobsRequest.new(
repository: @gitaly_repo,
revision_paths: request_revision_paths,
limit: limit
)
response = GitalyClient.call(
@gitaly_repo.storage_name,
:blob_service,
:get_blobs,
request,
timeout: GitalyClient.fast_timeout
)
map_blob_types(response)
end
2018-12-13 13:39:08 +05:30
def get_new_lfs_pointers(revision, limit, not_in, dynamic_timeout = nil)
2018-03-27 19:54:05 +05:30
request = Gitaly::GetNewLFSPointersRequest.new(
repository: @gitaly_repo,
revision: encode_binary(revision),
limit: limit || 0
)
if not_in.nil? || not_in == :all
request.not_in_all = true
else
request.not_in_refs += not_in
end
2018-12-13 13:39:08 +05:30
timeout =
if dynamic_timeout
[dynamic_timeout, GitalyClient.medium_timeout].min
else
GitalyClient.medium_timeout
end
response = GitalyClient.call(
@gitaly_repo.storage_name,
:blob_service,
:get_new_lfs_pointers,
request,
timeout: timeout
)
2018-03-27 19:54:05 +05:30
map_lfs_pointers(response)
end
2020-04-22 19:07:51 +05:30
def get_all_lfs_pointers
request = Gitaly::GetAllLFSPointersRequest.new(
repository: @gitaly_repo
2018-03-27 19:54:05 +05:30
)
2018-11-08 19:23:39 +05:30
response = GitalyClient.call(@gitaly_repo.storage_name, :blob_service, :get_all_lfs_pointers, request, timeout: GitalyClient.medium_timeout)
2018-03-27 19:54:05 +05:30
map_lfs_pointers(response)
end
private
2020-07-28 23:09:34 +05:30
def consume_blob_response(response)
data = []
blob = nil
response.each do |msg|
if blob.nil?
blob = msg
end
data << msg.data
end
return if blob.oid.blank?
data = data.join
Gitlab::Git::Blob.new(
id: blob.oid,
size: blob.size,
data: data,
binary: Gitlab::Git::Blob.binary?(data)
)
end
2018-03-27 19:54:05 +05:30
def map_lfs_pointers(response)
response.flat_map do |message|
message.lfs_pointers.map do |lfs_pointer|
Gitlab::Git::Blob.new(
id: lfs_pointer.oid,
size: lfs_pointer.size,
data: lfs_pointer.data,
binary: Gitlab::Git::Blob.binary?(lfs_pointer.data)
)
end
end
end
2019-12-21 20:55:43 +05:30
def map_blob_types(response)
types = {}
response.each do |msg|
types[msg.path.dup.force_encoding('utf-8')] = msg.type.downcase
end
types
end
2017-09-10 17:25:29 +05:30
end
end
end