Class: Gitlab::GitalyClient::BlobService

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

Constant Summary

Constants included from EncodingHelper

EncodingHelper::BOM_UTF8, EncodingHelper::ENCODING_CONFIDENCE_THRESHOLD, EncodingHelper::ESCAPED_CHARS, EncodingHelper::UNICODE_REPLACEMENT_CHARACTER

Instance Attribute Summary

Attributes included from WithFeatureFlagActors

#repository_actor

Instance Method Summary collapse

Methods included from WithFeatureFlagActors

#gitaly_client_call, #gitaly_feature_flag_actors, #group_actor, #project_actor, #user_actor

Methods included from EncodingHelper

#binary_io, #detect_binary?, #detect_encoding, #detect_libgit2_binary?, #encode!, #encode_binary, #encode_utf8, #encode_utf8_no_detect, #encode_utf8_with_escaping!, #encode_utf8_with_replacement_character, #strip_bom, #unquote_path

Constructor Details

#initialize(repository) ⇒ BlobService

Returns a new instance of BlobService.



9
10
11
12
13
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 9

def initialize(repository)
  @gitaly_repo = repository.gitaly_repository

  self.repository_actor = repository
end

Instance Method Details

#batch_lfs_pointers(blob_ids) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 71

def batch_lfs_pointers(blob_ids)
  return [] if blob_ids.empty?

  request = Gitaly::GetLFSPointersRequest.new(
    repository: @gitaly_repo,
    blob_ids: blob_ids
  )

  response = gitaly_client_call(@gitaly_repo.storage_name, :blob_service, :get_lfs_pointers, request, timeout: GitalyClient.medium_timeout)
  map_lfs_pointers(response)
end

#get_all_lfs_pointersObject



149
150
151
152
153
154
155
156
157
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 149

def get_all_lfs_pointers
  request = Gitaly::ListLFSPointersRequest.new(
    repository: @gitaly_repo,
    revisions: [encode_binary("--all")]
  )

  response = gitaly_client_call(@gitaly_repo.storage_name, :blob_service, :list_lfs_pointers, request, timeout: GitalyClient.medium_timeout)
  map_lfs_pointers(response)
end

#get_blob(oid:, limit:) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 15

def get_blob(oid:, limit:)
  request = Gitaly::GetBlobRequest.new(
    repository: @gitaly_repo,
    oid: oid,
    limit: limit
  )
  response = gitaly_client_call(@gitaly_repo.storage_name, :blob_service, :get_blob, request, timeout: GitalyClient.fast_timeout)
  consume_blob_response(response)
end

#get_blob_types(revision_paths, limit = -1)) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 106

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 = gitaly_client_call(
    @gitaly_repo.storage_name,
    :blob_service,
    :get_blobs,
    request,
    timeout: GitalyClient.fast_timeout
  )
  map_blob_types(response)
end

#get_blobs(revision_paths, limit = -1)) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 83

def get_blobs(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 = gitaly_client_call(
    @gitaly_repo.storage_name,
    :blob_service,
    :get_blobs,
    request,
    timeout: GitalyClient.fast_timeout)

  GitalyClient::BlobsStitcher.new(response)
end

#get_new_lfs_pointers(revisions, limit, not_in, dynamic_timeout = nil) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 129

def get_new_lfs_pointers(revisions, limit, not_in, dynamic_timeout = nil)
  request, rpc = create_new_lfs_pointers_request(revisions, limit, not_in)

  timeout =
    if dynamic_timeout
      [dynamic_timeout, GitalyClient.medium_timeout].min
    else
      GitalyClient.medium_timeout
    end

  response = gitaly_client_call(
    @gitaly_repo.storage_name,
    :blob_service,
    rpc,
    request,
    timeout: timeout
  )
  map_lfs_pointers(response)
end

#list_all_blobs(limit: nil, bytes_limit: 0, dynamic_timeout: nil, ignore_alternate_object_directories: false) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 25

def list_all_blobs(limit: nil, bytes_limit: 0, dynamic_timeout: nil, ignore_alternate_object_directories: false)
  repository = @gitaly_repo

  if ignore_alternate_object_directories
    repository = @gitaly_repo.dup.tap do |g_repo|
      g_repo.git_alternate_object_directories = Google::Protobuf::RepeatedField.new(:string)
    end
  end

  request = Gitaly::ListAllBlobsRequest.new(
    repository: repository,
    limit: limit,
    bytes_limit: bytes_limit
  )

  timeout =
    if dynamic_timeout
      [dynamic_timeout, GitalyClient.medium_timeout].min
    else
      GitalyClient.medium_timeout
    end

  response = Gitlab::GitalyClient.call(repository.storage_name, :blob_service, :list_all_blobs, request, timeout: timeout)
  GitalyClient::BlobsStitcher.new(GitalyClient::ListBlobsAdapter.new(response))
end

#list_blobs(revisions, limit: 0, bytes_limit: 0, with_paths: false, dynamic_timeout: nil) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/gitlab/gitaly_client/blob_service.rb', line 51

def list_blobs(revisions, limit: 0, bytes_limit: 0, with_paths: false, dynamic_timeout: nil)
  request = Gitaly::ListBlobsRequest.new(
    repository: @gitaly_repo,
    revisions: Array.wrap(revisions),
    limit: limit,
    bytes_limit: bytes_limit,
    with_paths: with_paths
  )

  timeout =
    if dynamic_timeout
      [dynamic_timeout, GitalyClient.medium_timeout].min
    else
      GitalyClient.medium_timeout
    end

  response = gitaly_client_call(@gitaly_repo.storage_name, :blob_service, :list_blobs, request, timeout: timeout)
  GitalyClient::BlobsStitcher.new(GitalyClient::ListBlobsAdapter.new(response))
end