diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-19 12:08:42 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-08-19 12:08:42 +0300 |
commit | b76ae638462ab0f673e5915986070518dd3f9ad3 (patch) | |
tree | bdab0533383b52873be0ec0eb4d3c66598ff8b91 /lib/gitlab/gitaly_client | |
parent | 434373eabe7b4be9593d18a585fb763f1e5f1a6f (diff) |
Add latest changes from gitlab-org/gitlab@14-2-stable-eev14.2.0-rc42
Diffstat (limited to 'lib/gitlab/gitaly_client')
-rw-r--r-- | lib/gitlab/gitaly_client/commit_service.rb | 43 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/conflict_files_stitcher.rb | 1 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/conflicts_service.rb | 5 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/ref_service.rb | 39 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/remote_service.rb | 29 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/repository_service.rb | 48 |
6 files changed, 91 insertions, 74 deletions
diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb index b894207f0aa..fa616a252e4 100644 --- a/lib/gitlab/gitaly_client/commit_service.rb +++ b/lib/gitlab/gitaly_client/commit_service.rb @@ -111,17 +111,22 @@ module Gitlab nil end - def tree_entries(repository, revision, path, recursive) + def tree_entries(repository, revision, path, recursive, pagination_params) request = Gitaly::GetTreeEntriesRequest.new( repository: @gitaly_repo, revision: encode_binary(revision), path: path.present? ? encode_binary(path) : '.', - recursive: recursive + recursive: recursive, + pagination_params: pagination_params ) + request.sort = Gitaly::GetTreeEntriesRequest::SortBy::TREES_FIRST if pagination_params response = GitalyClient.call(@repository.storage, :commit_service, :get_tree_entries, request, timeout: GitalyClient.medium_timeout) - response.flat_map do |message| + cursor = nil + + entries = response.flat_map do |message| + cursor = message.pagination_cursor if message.pagination_cursor message.entries.map do |gitaly_tree_entry| Gitlab::Git::Tree.new( id: gitaly_tree_entry.oid, @@ -135,6 +140,8 @@ module Gitlab ) end end + + [entries, cursor] end def commit_count(ref, options = {}) @@ -248,16 +255,42 @@ module Gitlab consume_commits_response(response) end - def list_commits(revisions) + def list_commits(revisions, reverse: false) request = Gitaly::ListCommitsRequest.new( repository: @gitaly_repo, - revisions: Array.wrap(revisions) + revisions: Array.wrap(revisions), + reverse: reverse ) response = GitalyClient.call(@repository.storage, :commit_service, :list_commits, request, timeout: GitalyClient.medium_timeout) consume_commits_response(response) end + # List all commits which are new in the repository. If commits have been pushed into the repo + def list_new_commits(revisions, allow_quarantine: false) + git_env = Gitlab::Git::HookEnv.all(@gitaly_repo.gl_repository) + if allow_quarantine && git_env['GIT_OBJECT_DIRECTORY_RELATIVE'].present? + # If we have a quarantine environment, then we can optimize the check + # by doing a ListAllCommitsRequest. Instead of walking through + # references, we just walk through all quarantined objects, which is + # a lot more efficient. To do so, we throw away any alternate object + # directories, which point to the main object directory of the + # repository, and only keep the object directory which points into + # the quarantine object directory. + quarantined_repo = @gitaly_repo.dup + quarantined_repo.git_alternate_object_directories = Google::Protobuf::RepeatedField.new(:string) + + request = Gitaly::ListAllCommitsRequest.new( + repository: quarantined_repo + ) + + response = GitalyClient.call(@repository.storage, :commit_service, :list_all_commits, request, timeout: GitalyClient.medium_timeout) + consume_commits_response(response) + else + list_commits(Array.wrap(revisions) + %w[--not --all]) + end + end + def list_commits_by_oid(oids) return [] if oids.empty? diff --git a/lib/gitlab/gitaly_client/conflict_files_stitcher.rb b/lib/gitlab/gitaly_client/conflict_files_stitcher.rb index 38ec910111c..b1278e3bfac 100644 --- a/lib/gitlab/gitaly_client/conflict_files_stitcher.rb +++ b/lib/gitlab/gitaly_client/conflict_files_stitcher.rb @@ -43,6 +43,7 @@ module Gitlab def conflict_from_gitaly_file_header(header) { + ancestor: { path: header.ancestor_path }, ours: { path: header.our_path, mode: header.our_mode }, theirs: { path: header.their_path } } diff --git a/lib/gitlab/gitaly_client/conflicts_service.rb b/lib/gitlab/gitaly_client/conflicts_service.rb index 300800189f1..982454b117e 100644 --- a/lib/gitlab/gitaly_client/conflicts_service.rb +++ b/lib/gitlab/gitaly_client/conflicts_service.rb @@ -14,11 +14,12 @@ module Gitlab @their_commit_oid = their_commit_oid end - def list_conflict_files + def list_conflict_files(allow_tree_conflicts: false) request = Gitaly::ListConflictFilesRequest.new( repository: @gitaly_repo, our_commit_oid: @our_commit_oid, - their_commit_oid: @their_commit_oid + their_commit_oid: @their_commit_oid, + allow_tree_conflicts: allow_tree_conflicts ) response = GitalyClient.call(@repository.storage, :conflicts_service, :list_conflict_files, request, timeout: GitalyClient.long_timeout) GitalyClient::ConflictFilesStitcher.new(response, @gitaly_repo) diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb index ac2db99ee01..7097d5bd181 100644 --- a/lib/gitlab/gitaly_client/ref_service.rb +++ b/lib/gitlab/gitaly_client/ref_service.rb @@ -62,24 +62,6 @@ module Gitlab encode!(response.name.dup) end - def list_new_commits(newrev) - request = Gitaly::ListNewCommitsRequest.new( - repository: @gitaly_repo, - commit_id: newrev - ) - - commits = [] - - response = GitalyClient.call(@storage, :ref_service, :list_new_commits, request, timeout: GitalyClient.medium_timeout) - response.each do |msg| - msg.commits.each do |c| - commits << Gitlab::Git::Commit.new(@repository, c) - end - end - - commits - end - def list_new_blobs(newrev, limit = 0, dynamic_timeout: nil) request = Gitaly::ListNewBlobsRequest.new( repository: @gitaly_repo, @@ -196,6 +178,27 @@ module Gitlab messages end + def get_tag_signatures(tag_ids) + request = Gitaly::GetTagSignaturesRequest.new(repository: @gitaly_repo, tag_revisions: tag_ids) + response = GitalyClient.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 + def pack_refs request = Gitaly::PackRefsRequest.new(repository: @gitaly_repo) diff --git a/lib/gitlab/gitaly_client/remote_service.rb b/lib/gitlab/gitaly_client/remote_service.rb index 487127b7b74..535b987f91c 100644 --- a/lib/gitlab/gitaly_client/remote_service.rb +++ b/lib/gitlab/gitaly_client/remote_service.rb @@ -26,25 +26,7 @@ module Gitlab @storage = repository.storage end - 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 - - 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 - - # The remote_name parameter is deprecated and will be removed soon. - def find_remote_root_ref(remote_name, remote_url, authorization) + def find_remote_root_ref(remote_url, authorization) request = Gitaly::FindRemoteRootRefRequest.new(repository: @gitaly_repo, remote_url: remote_url, http_authorization_header: authorization) @@ -55,18 +37,13 @@ module Gitlab encode_utf8(response.ref) end - def update_remote_mirror(ref_name, remote_url, only_branches_matching, ssh_key: nil, known_hosts: nil, keep_divergent_refs: false) + def update_remote_mirror(remote_url, 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 ) - if remote_url - first_request.remote = Gitaly::UpdateRemoteMirrorRequest::Remote.new(url: remote_url) - else - first_request.ref_name = ref_name - end - + first_request.remote = Gitaly::UpdateRemoteMirrorRequest::Remote.new(url: remote_url) 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 diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb index 009aeaf868a..2e26b3341a2 100644 --- a/lib/gitlab/gitaly_client/repository_service.rb +++ b/lib/gitlab/gitaly_client/repository_service.rb @@ -73,18 +73,21 @@ module Gitlab # rubocop: disable Metrics/ParameterLists # The `remote` parameter is going away soonish anyway, at which point the # Rubocop warning can be enabled again. - def fetch_remote(remote, url:, refmap:, ssh_auth:, forced:, no_tags:, timeout:, prune: true, check_tags_changed: false) + def fetch_remote(url, refmap:, ssh_auth:, forced:, no_tags:, timeout:, prune: true, check_tags_changed: false, http_authorization_header: "") request = Gitaly::FetchRemoteRequest.new( - repository: @gitaly_repo, remote: remote, force: forced, - no_tags: no_tags, timeout: timeout, no_prune: !prune, - check_tags_changed: check_tags_changed + repository: @gitaly_repo, + force: forced, + no_tags: no_tags, + timeout: timeout, + no_prune: !prune, + check_tags_changed: check_tags_changed, + remote_params: Gitaly::Remote.new( + url: url, + mirror_refmaps: Array.wrap(refmap).map(&:to_s), + http_authorization_header: http_authorization_header + ) ) - if url - request.remote_params = Gitaly::Remote.new(url: url, - mirror_refmaps: Array.wrap(refmap).map(&:to_s)) - end - if ssh_auth&.ssh_mirror_url? if ssh_auth.ssh_key_auth? && ssh_auth.ssh_private_key.present? request.ssh_key = ssh_auth.ssh_private_key @@ -263,34 +266,33 @@ module Gitlab GitalyClient.call(@storage, :repository_service, :write_ref, request, timeout: GitalyClient.fast_timeout) end - def set_config(entries) - return if entries.empty? - - request = Gitaly::SetConfigRequest.new(repository: @gitaly_repo) - entries.each do |key, value| - request.entries << build_set_config_entry(key, value) - end - + def set_full_path(path) GitalyClient.call( @storage, :repository_service, - :set_config, - request, + :set_full_path, + Gitaly::SetFullPathRequest.new( + repository: @gitaly_repo, + path: path + ), timeout: GitalyClient.fast_timeout ) nil end - def delete_config(keys) - return if keys.empty? + def set_config(entries) + return if entries.empty? - request = Gitaly::DeleteConfigRequest.new(repository: @gitaly_repo, keys: keys) + request = Gitaly::SetConfigRequest.new(repository: @gitaly_repo) + entries.each do |key, value| + request.entries << build_set_config_entry(key, value) + end GitalyClient.call( @storage, :repository_service, - :delete_config, + :set_config, request, timeout: GitalyClient.fast_timeout ) |