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')
-rw-r--r--lib/gitlab/gitaly_client/commit_service.rb43
-rw-r--r--lib/gitlab/gitaly_client/conflict_files_stitcher.rb1
-rw-r--r--lib/gitlab/gitaly_client/conflicts_service.rb5
-rw-r--r--lib/gitlab/gitaly_client/ref_service.rb39
-rw-r--r--lib/gitlab/gitaly_client/remote_service.rb29
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb48
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
)