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