Class: Gitlab::GitalyClient::RefService
Constant Summary
collapse
- TAGS_SORT_KEY =
{
'name' => Gitaly::FindAllTagsRequest::SortBy::Key::REFNAME,
'updated' => Gitaly::FindAllTagsRequest::SortBy::Key::CREATORDATE,
'version' => Gitaly::FindAllTagsRequest::SortBy::Key::VERSION_REFNAME
}.freeze
- TAGS_SORT_DIRECTION =
{
'asc' => Gitaly::SortDirection::ASCENDING,
'desc' => Gitaly::SortDirection::DESCENDING
}.freeze
- AMBIGUOUS_REFERENCE =
'reference is ambiguous'
EncodingHelper::BOM_UTF8, EncodingHelper::ENCODING_CONFIDENCE_THRESHOLD, EncodingHelper::ESCAPED_CHARS, EncodingHelper::UNICODE_REPLACEMENT_CHARACTER
Instance Attribute Summary
#repository_actor
Instance Method Summary
collapse
-
#branch_names_contains_sha(sha, limit: 0) ⇒ Object
Limit: 0 implies no limit, thus all tag names will be returned.
-
#branches ⇒ Object
-
#default_branch_name(head_only: false) ⇒ Object
-
#delete_refs(refs: [], except_with_prefixes: []) ⇒ Object
-
#find_branch(branch_name) ⇒ Object
-
#find_refs_by_oid(oid:, limit:, ref_patterns: nil) ⇒ Object
-
#find_tag(tag_name) ⇒ Object
-
#get_tag_messages(tag_ids) ⇒ Object
-
#get_tag_signatures(tag_ids) ⇒ Object
-
#initialize(repository) ⇒ RefService
constructor
‘repository’ is a Gitlab::Git::Repository.
-
#list_refs(patterns = [Gitlab::Git::BRANCH_REF_PREFIX], pointing_at_oids: [], peel_tags: false) ⇒ Object
peel_tags slows down the request by a factor of 3-4.
-
#local_branches(sort_by: nil, pagination_params: nil) ⇒ Object
-
#merged_branches(branch_names = []) ⇒ Object
-
#ref_exists?(ref_name) ⇒ Boolean
-
#remote_branches(remote_name) ⇒ Object
-
#tag_names_contains_sha(sha, limit: 0) ⇒ Object
Limit: 0 implies no limit, thus all tag names will be returned.
-
#tags(sort_by: nil, pagination_params: nil) ⇒ Object
-
#update_refs(ref_list:) ⇒ Object
#gitaly_client_call, #gitaly_feature_flag_actors, #group_actor, #project_actor, #user_actor
#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) ⇒ RefService
‘repository’ is a Gitlab::Git::Repository
23
24
25
26
27
28
29
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 23
def initialize(repository)
@repository = repository
@gitaly_repo = repository.gitaly_repository
@storage = repository.storage
self.repository_actor = repository
end
|
Instance Method Details
#branch_names_contains_sha(sha, limit: 0) ⇒ Object
Limit: 0 implies no limit, thus all tag names will be returned
192
193
194
195
196
197
198
199
200
201
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 192
def branch_names_contains_sha(sha, limit: 0)
request = Gitaly::ListBranchNamesContainingCommitRequest.new(
repository: @gitaly_repo,
commit_id: sha,
limit: limit
)
response = gitaly_client_call(@storage, :ref_service, :list_branch_names_containing_commit, request, timeout: GitalyClient.medium_timeout)
consume_ref_contains_sha_response(response, :branch_names)
end
|
#branches ⇒ Object
31
32
33
34
35
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 31
def branches
request = Gitaly::FindAllBranchesRequest.new(repository: @gitaly_repo)
response = gitaly_client_call(@storage, :ref_service, :find_all_branches, request, timeout: GitalyClient.fast_timeout)
consume_find_all_branches_response(response)
end
|
#default_branch_name(head_only: false) ⇒ Object
53
54
55
56
57
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 53
def default_branch_name(head_only: false)
request = Gitaly::FindDefaultBranchNameRequest.new(repository: @gitaly_repo, head_only: head_only)
response = gitaly_client_call(@storage, :ref_service, :find_default_branch_name, request, timeout: GitalyClient.fast_timeout)
Gitlab::Git.branch_name(response.name)
end
|
#delete_refs(refs: [], except_with_prefixes: []) ⇒ Object
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 156
def delete_refs(refs: [], except_with_prefixes: [])
request = Gitaly::DeleteRefsRequest.new(
repository: @gitaly_repo,
refs: refs.map { |r| encode_binary(r) },
except_with_prefix: except_with_prefixes.map { |r| encode_binary(r) }
)
response = gitaly_client_call(@repository.storage, :ref_service, :delete_refs, request, timeout: GitalyClient.medium_timeout)
raise Gitlab::Git::Repository::GitError, response.git_error if response.git_error.present?
rescue GRPC::BadStatus => e
detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error.try(:error)
when :invalid_format
raise Gitlab::Git::InvalidRefFormatError, "references have an invalid format: #{detailed_error.invalid_format.refs.join(",")}"
when :references_locked
raise Gitlab::Git::ReferencesLockedError
else
raise e
end
end
|
#find_branch(branch_name) ⇒ Object
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 82
def find_branch(branch_name)
request = Gitaly::FindBranchRequest.new(
repository: @gitaly_repo,
name: encode_binary(branch_name)
)
response = gitaly_client_call(@repository.storage, :ref_service, :find_branch, request, timeout: GitalyClient.medium_timeout)
branch = response.branch
return unless branch
target_commit = Gitlab::Git::Commit.decorate(@repository, branch.target_commit)
Gitlab::Git::Branch.new(@repository, branch.name.dup, branch.target_commit.id, target_commit)
rescue GRPC::BadStatus => e
raise e unless e.message.include?(AMBIGUOUS_REFERENCE)
raise Gitlab::Git::AmbiguousRef, "branch is ambiguous: #{branch_name}"
end
|
#find_refs_by_oid(oid:, limit:, ref_patterns: nil) ⇒ Object
252
253
254
255
256
257
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 252
def find_refs_by_oid(oid:, limit:, ref_patterns: nil)
request = Gitaly::FindRefsByOIDRequest.new(repository: @gitaly_repo, sort_field: :refname, oid: oid, limit: limit, ref_patterns: ref_patterns)
response = gitaly_client_call(@storage, :ref_service, :find_refs_by_oid, request, timeout: GitalyClient.medium_timeout)
response&.refs&.to_a
end
|
#find_tag(tag_name) ⇒ Object
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 100
def find_tag(tag_name)
return if tag_name.blank?
request = Gitaly::FindTagRequest.new(
repository: @gitaly_repo,
tag_name: encode_binary(tag_name)
)
response = gitaly_client_call(@repository.storage, :ref_service, :find_tag, request, timeout: GitalyClient.medium_timeout)
tag = response.tag
return unless tag
Gitlab::Git::Tag.new(@repository, tag)
rescue GRPC::BadStatus => e
detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error.try(:error)
when :tag_not_found
raise Gitlab::Git::UnknownRef, "tag does not exist: #{tag_name}"
else
raise e
end
end
|
#get_tag_messages(tag_ids) ⇒ Object
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 203
def get_tag_messages(tag_ids)
request = Gitaly::GetTagMessagesRequest.new(repository: @gitaly_repo, tag_ids: tag_ids)
messages = Hash.new { |h, k| h[k] = +''.b }
current_tag_id = nil
response = gitaly_client_call(@storage, :ref_service, :get_tag_messages, request, timeout: GitalyClient.fast_timeout)
response.each do |rpc_message|
current_tag_id = rpc_message.tag_id if rpc_message.tag_id.present?
messages[current_tag_id] << rpc_message.message
end
messages
end
|
#get_tag_signatures(tag_ids) ⇒ Object
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 218
def get_tag_signatures(tag_ids)
request = Gitaly::GetTagSignaturesRequest.new(repository: @gitaly_repo, tag_revisions: tag_ids)
response = gitaly_client_call(@repository.storage, :ref_service, :get_tag_signatures, request, timeout: GitalyClient.fast_timeout)
signatures = Hash.new { |h, k| h[k] = [+''.b, +''.b] }
current_tag_id = nil
response.each do |message|
message.signatures.each do |tag_signature|
current_tag_id = tag_signature.tag_id if tag_signature.tag_id.present?
signatures[current_tag_id].first << tag_signature.signature
signatures[current_tag_id].last << tag_signature.content
end
end
signatures
rescue GRPC::InvalidArgument => ex
raise ArgumentError, ex
end
|
#list_refs(patterns = [Gitlab::Git::BRANCH_REF_PREFIX], pointing_at_oids: [], peel_tags: false) ⇒ Object
peel_tags slows down the request by a factor of 3-4
240
241
242
243
244
245
246
247
248
249
250
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 240
def list_refs(patterns = [Gitlab::Git::BRANCH_REF_PREFIX], pointing_at_oids: [], peel_tags: false)
request = Gitaly::ListRefsRequest.new(
repository: @gitaly_repo,
patterns: patterns,
pointing_at_oids: pointing_at_oids,
peel_tags: peel_tags
)
response = gitaly_client_call(@storage, :ref_service, :list_refs, request, timeout: GitalyClient.fast_timeout)
consume_list_refs_response(response)
end
|
#local_branches(sort_by: nil, pagination_params: nil) ⇒ Object
59
60
61
62
63
64
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 59
def local_branches(sort_by: nil, pagination_params: nil)
request = Gitaly::FindLocalBranchesRequest.new(repository: @gitaly_repo, pagination_params: )
request.sort_by = sort_local_branches_by_param(sort_by) if sort_by
response = gitaly_client_call(@storage, :ref_service, :find_local_branches, request, timeout: GitalyClient.fast_timeout)
consume_find_local_branches_response(response)
end
|
#merged_branches(branch_names = []) ⇒ Object
43
44
45
46
47
48
49
50
51
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 43
def merged_branches(branch_names = [])
request = Gitaly::FindAllBranchesRequest.new(
repository: @gitaly_repo,
merged_only: true,
merged_branches: branch_names.map { |s| encode_binary(s) }
)
response = gitaly_client_call(@storage, :ref_service, :find_all_branches, request, timeout: GitalyClient.fast_timeout)
consume_find_all_branches_response(response)
end
|
#ref_exists?(ref_name) ⇒ Boolean
74
75
76
77
78
79
80
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 74
def ref_exists?(ref_name)
request = Gitaly::RefExistsRequest.new(repository: @gitaly_repo, ref: encode_binary(ref_name))
response = gitaly_client_call(@storage, :ref_service, :ref_exists, request, timeout: GitalyClient.fast_timeout)
response.value
rescue GRPC::InvalidArgument => e
raise ArgumentError, e.message
end
|
#remote_branches(remote_name) ⇒ Object
37
38
39
40
41
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 37
def remote_branches(remote_name)
request = Gitaly::FindAllRemoteBranchesRequest.new(repository: @gitaly_repo, remote_name: remote_name)
response = gitaly_client_call(@storage, :ref_service, :find_all_remote_branches, request, timeout: GitalyClient.medium_timeout)
consume_find_all_remote_branches_response(remote_name, response)
end
|
#tag_names_contains_sha(sha, limit: 0) ⇒ Object
Limit: 0 implies no limit, thus all tag names will be returned
180
181
182
183
184
185
186
187
188
189
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 180
def tag_names_contains_sha(sha, limit: 0)
request = Gitaly::ListTagNamesContainingCommitRequest.new(
repository: @gitaly_repo,
commit_id: sha,
limit: limit
)
response = gitaly_client_call(@storage, :ref_service, :list_tag_names_containing_commit, request, timeout: GitalyClient.medium_timeout)
consume_ref_contains_sha_response(response, :tag_names)
end
|
66
67
68
69
70
71
72
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 66
def tags(sort_by: nil, pagination_params: nil)
request = Gitaly::FindAllTagsRequest.new(repository: @gitaly_repo, pagination_params: )
request.sort_by = sort_tags_by_param(sort_by) if sort_by
response = gitaly_client_call(@storage, :ref_service, :find_all_tags, request, timeout: GitalyClient.medium_timeout)
consume_tags_response(response)
end
|
#update_refs(ref_list:) ⇒ Object
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
# File 'lib/gitlab/gitaly_client/ref_service.rb', line 125
def update_refs(ref_list:)
request = Enumerator.new do |y|
ref_list.each_slice(100) do |refs|
updates = refs.map do |ref_pair|
Gitaly::UpdateReferencesRequest::Update.new(
old_object_id: ref_pair[:old_sha],
new_object_id: ref_pair[:new_sha],
reference: encode_binary(ref_pair[:reference])
)
end
y.yield Gitaly::UpdateReferencesRequest.new(repository: @gitaly_repo, updates: updates)
end
end
gitaly_client_call(@repository.storage, :ref_service, :update_references, request, timeout: GitalyClient.long_timeout)
rescue GRPC::BadStatus => e
detailed_error = GitalyClient.decode_detailed_error(e)
case detailed_error.try(:error)
when :invalid_format
raise Gitlab::Git::InvalidRefFormatError, "references have an invalid format: #{detailed_error.invalid_format.refs.join(",")}"
when :references_locked
raise Gitlab::Git::ReferencesLockedError
when :reference_state_mismatch
raise Gitlab::Git::ReferenceStateMismatchError
else
raise e
end
end
|