86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
module Gitlab
 | 
						|
  module GitalyClient
 | 
						|
    class BlobService
 | 
						|
      include Gitlab::EncodingHelper
 | 
						|
 | 
						|
      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
 | 
						|
        )
 | 
						|
        response = GitalyClient.call(@gitaly_repo.storage_name, :blob_service, :get_blob, request)
 | 
						|
 | 
						|
        data = ''
 | 
						|
        blob = nil
 | 
						|
        response.each do |msg|
 | 
						|
          if blob.nil?
 | 
						|
            blob = msg
 | 
						|
          end
 | 
						|
 | 
						|
          data << msg.data
 | 
						|
        end
 | 
						|
 | 
						|
        return nil if blob.oid.blank?
 | 
						|
 | 
						|
        Gitlab::Git::Blob.new(
 | 
						|
          id: blob.oid,
 | 
						|
          size: blob.size,
 | 
						|
          data: data,
 | 
						|
          binary: Gitlab::Git::Blob.binary?(data)
 | 
						|
        )
 | 
						|
      end
 | 
						|
 | 
						|
      def batch_lfs_pointers(blob_ids)
 | 
						|
        return [] if blob_ids.empty?
 | 
						|
 | 
						|
        request = Gitaly::GetLFSPointersRequest.new(
 | 
						|
          repository: @gitaly_repo,
 | 
						|
          blob_ids: blob_ids
 | 
						|
        )
 | 
						|
 | 
						|
        response = GitalyClient.call(@gitaly_repo.storage_name, :blob_service, :get_lfs_pointers, request)
 | 
						|
 | 
						|
        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
 | 
						|
 | 
						|
      def get_blobs(revision_paths, limit = -1)
 | 
						|
        return [] if revision_paths.empty?
 | 
						|
 | 
						|
        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: revision_paths,
 | 
						|
          limit: limit
 | 
						|
        )
 | 
						|
 | 
						|
        response = GitalyClient.call(
 | 
						|
          @gitaly_repo.storage_name,
 | 
						|
          :blob_service,
 | 
						|
          :get_blobs,
 | 
						|
          request,
 | 
						|
          timeout: GitalyClient.default_timeout
 | 
						|
        )
 | 
						|
 | 
						|
        GitalyClient::BlobsStitcher.new(response)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |