Class: Gitlab::GitalyClient::ConflictsService

Inherits:
Object
  • Object
show all
Includes:
EncodingHelper
Defined in:
lib/gitlab/gitaly_client/conflicts_service.rb

Constant Summary collapse

MAX_MSG_SIZE =
128.kilobytes.freeze

Constants included from EncodingHelper

EncodingHelper::ENCODING_CONFIDENCE_THRESHOLD

Instance Method Summary collapse

Methods included from EncodingHelper

#binary_io, #detect_binary?, #detect_libgit2_binary?, #encode!, #encode_binary, #encode_utf8

Constructor Details

#initialize(repository, our_commit_oid, their_commit_oid) ⇒ ConflictsService

Returns a new instance of ConflictsService.


10
11
12
13
14
15
# File 'lib/gitlab/gitaly_client/conflicts_service.rb', line 10

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

Instance Method Details

#conflicts?Boolean

Returns:

  • (Boolean)

27
28
29
30
31
32
33
34
35
36
# File 'lib/gitlab/gitaly_client/conflicts_service.rb', line 27

def conflicts?
  list_conflict_files.any?
rescue GRPC::FailedPrecondition, GRPC::Unknown
  # The server raises FailedPrecondition when it encounters
  # ConflictSideMissing, which means a conflict exists but its `theirs` or
  # `ours` data is nil due to a non-existent file in one of the trees.
  #
  # GRPC::Unknown comes from Rugged::ReferenceError and Rugged::OdbError.
  true
end

#list_conflict_filesObject


17
18
19
20
21
22
23
24
25
# File 'lib/gitlab/gitaly_client/conflicts_service.rb', line 17

def list_conflict_files
  request = Gitaly::ListConflictFilesRequest.new(
    repository: @gitaly_repo,
    our_commit_oid: @our_commit_oid,
    their_commit_oid: @their_commit_oid
  )
  response = GitalyClient.call(@repository.storage, :conflicts_service, :list_conflict_files, request, timeout: GitalyClient.long_timeout)
  GitalyClient::ConflictFilesStitcher.new(response, @gitaly_repo)
end

#resolve_conflicts(target_repository, resolution, source_branch, target_branch) ⇒ Object


38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/gitlab/gitaly_client/conflicts_service.rb', line 38

def resolve_conflicts(target_repository, resolution, source_branch, target_branch)
  reader = binary_io(resolution.files.to_json)

  req_enum = Enumerator.new do |y|
    header = resolve_conflicts_request_header(target_repository, resolution, source_branch, target_branch)
    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, timeout: GitalyClient.medium_timeout)

  if response.resolution_error.present?
    raise Gitlab::Git::Conflict::Resolver::ResolutionError, response.resolution_error
  end
end