summaryrefslogtreecommitdiff
path: root/lib/gitlab/gitaly_client
diff options
context:
space:
mode:
authorAlejandro Rodríguez <alejorro70@gmail.com>2017-12-05 19:18:20 -0300
committerAlejandro Rodríguez <alejorro70@gmail.com>2017-12-27 15:14:25 -0300
commit0aa87bbe13ca74a791bf5c70a12d8e7f6876fd5a (patch)
tree969685fa1afcde794cc216edd31030fb06d54559 /lib/gitlab/gitaly_client
parent351f205c0580e43ace9d5a47e0b923ffb7cda3b8 (diff)
downloadgitlab-ce-0aa87bbe13ca74a791bf5c70a12d8e7f6876fd5a.tar.gz
Incorporate ConflictsService.ResolveConflicts Gitaly RPC
Diffstat (limited to 'lib/gitlab/gitaly_client')
-rw-r--r--lib/gitlab/gitaly_client/conflicts_service.rb46
1 files changed, 42 insertions, 4 deletions
diff --git a/lib/gitlab/gitaly_client/conflicts_service.rb b/lib/gitlab/gitaly_client/conflicts_service.rb
index 6508e436301..49513ebeecd 100644
--- a/lib/gitlab/gitaly_client/conflicts_service.rb
+++ b/lib/gitlab/gitaly_client/conflicts_service.rb
@@ -1,16 +1,20 @@
module Gitlab
module GitalyClient
class ConflictsService
- def initialize(repository)
+ MAX_MSG_SIZE = 128.kilobytes.freeze
+
+ def initialize(repository, our_commit_oid, their_commit_oid)
@gitaly_repo = repository.gitaly_repository
@repository = repository
+ @our_commit_oid = our_commit_oid
+ @their_commit_oid = their_commit_oid
end
- def list_conflict_files(our_commit_oid, their_commit_oid)
+ def list_conflict_files
request = Gitaly::ListConflictFilesRequest.new(
repository: @gitaly_repo,
- our_commit_oid: our_commit_oid,
- their_commit_oid: their_commit_oid
+ our_commit_oid: @our_commit_oid,
+ their_commit_oid: @their_commit_oid
)
response = GitalyClient.call(@repository.storage, :conflicts_service, :list_conflict_files, request)
files = []
@@ -38,6 +42,27 @@ module Gitlab
files
end
+ def resolve_conflicts(target_repository, user, files, source_branch, target_branch, commit_message)
+ reader = GitalyClient.binary_stringio(files.to_json)
+
+ req_enum = Enumerator.new do |y|
+ header = resolve_conflicts_request_header(target_repository, user, source_branch, target_branch, commit_message)
+ y.yield Gitaly::ResolveConflictsRequest.new(header: header)
+
+ until reader.eof?
+ chunk = reader.read(MAX_MSG_SIZE)
+
+ y.yield Gitaly::ResolveConflictsRequest.new(files_json: chunk)
+ end
+ end
+
+ response = GitalyClient.call(@repository.storage, :conflicts_service, :resolve_conflicts, req_enum, remote_storage: target_repository.storage)
+
+ if response.resolution_error.present?
+ raise Gitlab::Git::Conflict::Resolver::ResolutionError, response.resolution_error
+ end
+ end
+
private
def conflict_file_from_gitaly(header, content)
@@ -55,6 +80,19 @@ module Gitlab
theirs: { path: header.their_path }
}
end
+
+ def resolve_conflicts_request_header(target_repository, user, source_branch, target_branch, commit_message)
+ Gitaly::ResolveConflictsRequestHeader.new(
+ repository: @gitaly_repo,
+ our_commit_oid: @our_commit_oid,
+ target_repository: target_repository.gitaly_repository,
+ their_commit_oid: @their_commit_oid,
+ source_branch: source_branch,
+ target_branch: target_branch,
+ commit_message: commit_message,
+ user: Gitlab::Git::User.from_gitlab(user).to_gitaly
+ )
+ end
end
end
end