Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/gitaly_client/ref_service.rb')
-rw-r--r--lib/gitlab/gitaly_client/ref_service.rb31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb
index 45edfd4cbbf..c251c126b07 100644
--- a/lib/gitlab/gitaly_client/ref_service.rb
+++ b/lib/gitlab/gitaly_client/ref_service.rb
@@ -122,6 +122,37 @@ module Gitlab
end
end
+ 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
+
def delete_refs(refs: [], except_with_prefixes: [])
request = Gitaly::DeleteRefsRequest.new(
repository: @gitaly_repo,