Class: Gitlab::GitalyClient::RemoteService

Inherits:
Object
  • Object
show all
Includes:
EncodingHelper
Defined in:
lib/gitlab/gitaly_client/remote_service.rb

Constant Summary collapse

MAX_MSG_SIZE =
128.kilobytes.freeze

Constants included from EncodingHelper

EncodingHelper::ENCODING_CONFIDENCE_THRESHOLD

Class Method Summary collapse

Instance Method Summary collapse

Methods included from EncodingHelper

#binary_io, #detect_binary?, #detect_libgit2_binary?, #encode!, #encode_binary, #encode_utf8

Constructor Details

#initialize(repository) ⇒ RemoteService

Returns a new instance of RemoteService.


23
24
25
26
27
# File 'lib/gitlab/gitaly_client/remote_service.rb', line 23

def initialize(repository)
  @repository = repository
  @gitaly_repo = repository.gitaly_repository
  @storage = repository.storage
end

Class Method Details

.exists?(remote_url) ⇒ Boolean

Returns:

  • (Boolean)

10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/gitlab/gitaly_client/remote_service.rb', line 10

def self.exists?(remote_url)
  storage = GitalyClient.random_storage

  request = Gitaly::FindRemoteRepositoryRequest.new(remote: remote_url, storage_name: storage)

  response = GitalyClient.call(storage,
                               :remote_service,
                               :find_remote_repository, request,
                               timeout: GitalyClient.medium_timeout)

  response.exists
end

Instance Method Details

#add_remote(name, url, mirror_refmaps) ⇒ Object


29
30
31
32
33
34
35
36
37
38
# File 'lib/gitlab/gitaly_client/remote_service.rb', line 29

def add_remote(name, url, mirror_refmaps)
  request = Gitaly::AddRemoteRequest.new(
    repository: @gitaly_repo,
    name: name,
    url: url,
    mirror_refmaps: Array.wrap(mirror_refmaps).map(&:to_s)
  )

  GitalyClient.call(@storage, :remote_service, :add_remote, request, timeout: GitalyClient.fast_timeout)
end

#find_remote_root_ref(remote_name) ⇒ Object


46
47
48
49
50
51
52
53
54
55
56
# File 'lib/gitlab/gitaly_client/remote_service.rb', line 46

def find_remote_root_ref(remote_name)
  request = Gitaly::FindRemoteRootRefRequest.new(
    repository: @gitaly_repo,
    remote: remote_name
  )

  response = GitalyClient.call(@storage, :remote_service,
                               :find_remote_root_ref, request, timeout: GitalyClient.medium_timeout)

  encode_utf8(response.ref)
end

#remove_remote(name) ⇒ Object


40
41
42
43
44
# File 'lib/gitlab/gitaly_client/remote_service.rb', line 40

def remove_remote(name)
  request = Gitaly::RemoveRemoteRequest.new(repository: @gitaly_repo, name: name)

  GitalyClient.call(@storage, :remote_service, :remove_remote, request, timeout: GitalyClient.long_timeout).result
end

#update_remote_mirror(ref_name, only_branches_matching, ssh_key: nil, known_hosts: nil, keep_divergent_refs: false) ⇒ Object


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/gitlab/gitaly_client/remote_service.rb', line 58

def update_remote_mirror(ref_name, only_branches_matching, ssh_key: nil, known_hosts: nil, keep_divergent_refs: false)
  req_enum = Enumerator.new do |y|
    first_request = Gitaly::UpdateRemoteMirrorRequest.new(
      repository: @gitaly_repo,
      ref_name: ref_name
    )

    first_request.ssh_key = ssh_key if ssh_key.present?
    first_request.known_hosts = known_hosts if known_hosts.present?
    first_request.keep_divergent_refs = keep_divergent_refs

    y.yield(first_request)

    current_size = 0

    slices = only_branches_matching.slice_before do |branch_name|
      current_size += branch_name.bytesize

      next false if current_size < MAX_MSG_SIZE

      current_size = 0
    end

    slices.each do |slice|
      y.yield Gitaly::UpdateRemoteMirrorRequest.new(only_branches_matching: slice)
    end
  end

  GitalyClient.call(@storage, :remote_service, :update_remote_mirror, req_enum, timeout: GitalyClient.long_timeout)
end