1# frozen_string_literal: true 2 3module Gitlab 4 module Git 5 class ObjectPool 6 # GL_REPOSITORY has to be passed for Gitlab::Git::Repositories, but not 7 # used for ObjectPools. 8 GL_REPOSITORY = "" 9 10 delegate :exists?, :size, to: :repository 11 delegate :delete, to: :object_pool_service 12 13 attr_reader :storage, :relative_path, :source_repository, :gl_project_path 14 15 def initialize(storage, relative_path, source_repository, gl_project_path) 16 @storage = storage 17 @relative_path = relative_path 18 @source_repository = source_repository 19 @gl_project_path = gl_project_path 20 end 21 22 def create 23 object_pool_service.create(source_repository) 24 end 25 26 def link(to_link_repo) 27 object_pool_service.link_repository(to_link_repo) 28 end 29 30 def gitaly_object_pool 31 Gitaly::ObjectPool.new(repository: to_gitaly_repository) 32 end 33 34 def to_gitaly_repository 35 Gitlab::GitalyClient::Util.repository(storage, relative_path, GL_REPOSITORY, gl_project_path) 36 end 37 38 # Allows for reusing other RPCs by 'tricking' Gitaly to think its a repository 39 def repository 40 @repository ||= Gitlab::Git::Repository.new(storage, relative_path, GL_REPOSITORY, gl_project_path) 41 end 42 43 def fetch 44 object_pool_service.fetch(source_repository) 45 end 46 47 private 48 49 def object_pool_service 50 @object_pool_service ||= Gitlab::GitalyClient::ObjectPoolService.new(self) 51 end 52 53 def relative_path_to(pool_member_path) 54 pool_path = Pathname.new("#{relative_path}#{File::SEPARATOR}") 55 56 Pathname.new(pool_member_path).relative_path_from(pool_path).to_s 57 end 58 end 59 end 60end 61