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:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-03-18 23:02:30 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-03-18 23:02:30 +0300
commit41fe97390ceddf945f3d967b8fdb3de4c66b7dea (patch)
tree9c8d89a8624828992f06d892cd2f43818ff5dcc8 /lib/gitlab/gitaly_client
parent0804d2dc31052fb45a1efecedc8e06ce9bc32862 (diff)
Add latest changes from gitlab-org/gitlab@14-9-stable-eev14.9.0-rc42
Diffstat (limited to 'lib/gitlab/gitaly_client')
-rw-r--r--lib/gitlab/gitaly_client/commit_service.rb2
-rw-r--r--lib/gitlab/gitaly_client/operation_service.rb81
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb14
-rw-r--r--lib/gitlab/gitaly_client/wiki_service.rb5
4 files changed, 63 insertions, 39 deletions
diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb
index c2b4182f609..0e3f9c2598d 100644
--- a/lib/gitlab/gitaly_client/commit_service.rb
+++ b/lib/gitlab/gitaly_client/commit_service.rb
@@ -212,7 +212,7 @@ module Gitlab
)
response = GitalyClient.call(@repository.storage, :diff_service, :diff_stats, request, timeout: GitalyClient.medium_timeout)
- response.flat_map(&:stats)
+ response.flat_map { |rsp| rsp.stats.to_a }
end
def find_changed_paths(commits)
diff --git a/lib/gitlab/gitaly_client/operation_service.rb b/lib/gitlab/gitaly_client/operation_service.rb
index adbf07de1b9..4637bf2e3ff 100644
--- a/lib/gitlab/gitaly_client/operation_service.rb
+++ b/lib/gitlab/gitaly_client/operation_service.rb
@@ -119,10 +119,6 @@ module Gitlab
response = GitalyClient.call(@repository.storage, :operation_service,
:user_merge_to_ref, request, timeout: GitalyClient.long_timeout)
- if pre_receive_error = response.pre_receive_error.presence
- raise Gitlab::Git::PreReceiveError, pre_receive_error
- end
-
response.commit_id
end
@@ -153,10 +149,6 @@ module Gitlab
second_response = response_enum.next
- if second_response.pre_receive_error.present?
- raise Gitlab::Git::PreReceiveError, second_response.pre_receive_error
- end
-
branch_update = second_response.branch_update
return if branch_update.nil?
raise Gitlab::Git::CommitError, 'failed to apply merge to branch' unless branch_update.commit_id.present?
@@ -164,16 +156,20 @@ module Gitlab
Gitlab::Git::OperationService::BranchUpdate.from_gitaly(branch_update)
rescue GRPC::BadStatus => e
- decoded_error = decode_detailed_error(e)
-
- raise unless decoded_error.present?
-
- # We simply ignore any reference update errors which are typically an
- # indicator of multiple RPC calls trying to update the same reference
- # at the same point in time.
- return if decoded_error.is_a?(Gitlab::Git::ReferenceUpdateError)
+ detailed_error = decode_detailed_error(e)
- raise decoded_error
+ case detailed_error&.error
+ when :access_check
+ access_check_error = detailed_error.access_check
+ # These messages were returned from internal/allowed API calls
+ raise Gitlab::Git::PreReceiveError.new(fallback_message: access_check_error.error_message)
+ when :reference_update
+ # We simply ignore any reference update errors which are typically an
+ # indicator of multiple RPC calls trying to update the same reference
+ # at the same point in time.
+ else
+ raise
+ end
ensure
request_enum.close
end
@@ -267,6 +263,19 @@ module Gitlab
perform_next_gitaly_rebase_request(response_enum)
rebase_sha
+ rescue GRPC::BadStatus => e
+ detailed_error = decode_detailed_error(e)
+
+ case detailed_error&.error
+ when :access_check
+ access_check_error = detailed_error.access_check
+ # These messages were returned from internal/allowed API calls
+ raise Gitlab::Git::PreReceiveError.new(fallback_message: access_check_error.error_message)
+ when :rebase_conflict
+ raise Gitlab::Git::Repository::GitError, e.details
+ else
+ raise e
+ end
ensure
request_enum.close
end
@@ -295,6 +304,26 @@ module Gitlab
end
response.squash_sha
+ rescue GRPC::BadStatus => e
+ detailed_error = decode_detailed_error(e)
+
+ case detailed_error&.error
+ when :resolve_revision, :rebase_conflict
+ # Theoretically, we could now raise specific errors based on the type
+ # of the detailed error. Most importantly, we get error details when
+ # Gitaly was not able to resolve the `start_sha` or `end_sha` via a
+ # ResolveRevisionError, and we get information about which files are
+ # conflicting via a MergeConflictError.
+ #
+ # We don't do this now though such that we can maintain backwards
+ # compatibility with the minimum required set of changes during the
+ # transitory period where we're migrating UserSquash to use
+ # structured errors. We thus continue to just return a GitError, like
+ # we previously did.
+ raise Gitlab::Git::Repository::GitError, e.details
+ else
+ raise
+ end
end
def user_update_submodule(user:, submodule:, commit_sha:, branch:, message:)
@@ -492,23 +521,7 @@ module Gitlab
prefix = %r{type\.googleapis\.com\/gitaly\.(?<error_type>.+)}
error_type = prefix.match(detailed_error.type_url)[:error_type]
- detailed_error = Gitaly.const_get(error_type, false).decode(detailed_error.value)
-
- case detailed_error.error
- when :access_check
- access_check_error = detailed_error.access_check
- # These messages were returned from internal/allowed API calls
- Gitlab::Git::PreReceiveError.new(fallback_message: access_check_error.error_message)
- when :reference_update
- reference_update_error = detailed_error.reference_update
- Gitlab::Git::ReferenceUpdateError.new(err.details,
- reference_update_error.reference_name,
- reference_update_error.old_oid,
- reference_update_error.new_oid)
- else
- # We're handling access_check only for now, but we'll add more detailed error types
- nil
- end
+ Gitaly.const_get(error_type, false).decode(detailed_error.value)
rescue NameError, NoMethodError
# Error Class might not be known to ruby yet
nil
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index 73848dfff5d..5c447dfd417 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -21,6 +21,16 @@ module Gitlab
response.exists
end
+ def optimize_repository
+ request = Gitaly::OptimizeRepositoryRequest.new(repository: @gitaly_repo)
+ GitalyClient.call(@storage, :repository_service, :optimize_repository, request, timeout: GitalyClient.long_timeout)
+ end
+
+ def prune_unreachable_objects
+ request = Gitaly::PruneUnreachableObjectsRequest.new(repository: @gitaly_repo)
+ GitalyClient.call(@storage, :repository_service, :prune_unreachable_objects, request, timeout: GitalyClient.long_timeout)
+ end
+
def garbage_collect(create_bitmap, prune:)
request = Gitaly::GarbageCollectRequest.new(repository: @gitaly_repo, create_bitmap: create_bitmap, prune: prune)
GitalyClient.call(@storage, :repository_service, :garbage_collect, request, timeout: GitalyClient.long_timeout)
@@ -97,8 +107,8 @@ module Gitlab
end
# rubocop: enable Metrics/ParameterLists
- def create_repository
- request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo)
+ def create_repository(default_branch = nil)
+ request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo, default_branch: default_branch)
GitalyClient.call(@storage, :repository_service, :create_repository, request, timeout: GitalyClient.fast_timeout)
end
diff --git a/lib/gitlab/gitaly_client/wiki_service.rb b/lib/gitlab/gitaly_client/wiki_service.rb
index 3613cd01122..ca839b232cf 100644
--- a/lib/gitlab/gitaly_client/wiki_service.rb
+++ b/lib/gitlab/gitaly_client/wiki_service.rb
@@ -64,12 +64,13 @@ module Gitlab
GitalyClient.call(@repository.storage, :wiki_service, :wiki_update_page, enum, timeout: GitalyClient.medium_timeout)
end
- def find_page(title:, version: nil, dir: nil)
+ def find_page(title:, version: nil, dir: nil, load_content: true)
request = Gitaly::WikiFindPageRequest.new(
repository: @gitaly_repo,
title: encode_binary(title),
revision: encode_binary(version),
- directory: encode_binary(dir)
+ directory: encode_binary(dir),
+ skip_content: !load_content
)
response = GitalyClient.call(@repository.storage, :wiki_service, :wiki_find_page, request, timeout: GitalyClient.fast_timeout)