Merge branch 'gitaly-conflicts-find-commit' into 'master'
Partially revert "Revert "Merge branch 'gitaly-mandatory-20180703-jv' into 'master'"" See merge request gitlab-org/gitlab-ce!20422
This commit is contained in:
commit
bf9fd9c3fc
4 changed files with 6 additions and 106 deletions
|
@ -63,12 +63,8 @@ module Gitlab
|
||||||
# This saves us an RPC round trip.
|
# This saves us an RPC round trip.
|
||||||
return nil if commit_id.include?(':')
|
return nil if commit_id.include?(':')
|
||||||
|
|
||||||
commit = repo.gitaly_migrate(:find_commit) do |is_enabled|
|
commit = repo.wrapped_gitaly_errors do
|
||||||
if is_enabled
|
|
||||||
repo.gitaly_commit_client.find_commit(commit_id)
|
repo.gitaly_commit_client.find_commit(commit_id)
|
||||||
else
|
|
||||||
rugged_find(repo, commit_id)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
decorate(repo, commit) if commit
|
decorate(repo, commit) if commit
|
||||||
|
@ -78,12 +74,6 @@ module Gitlab
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def rugged_find(repo, commit_id)
|
|
||||||
obj = repo.rev_parse_target(commit_id)
|
|
||||||
|
|
||||||
obj.is_a?(Rugged::Commit) ? obj : nil
|
|
||||||
end
|
|
||||||
|
|
||||||
# Get last commit for HEAD
|
# Get last commit for HEAD
|
||||||
#
|
#
|
||||||
# Ex.
|
# Ex.
|
||||||
|
|
|
@ -12,14 +12,8 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def conflicts
|
def conflicts
|
||||||
@conflicts ||= begin
|
@conflicts ||= @target_repository.wrapped_gitaly_errors do
|
||||||
@target_repository.gitaly_migrate(:conflicts_list_conflict_files) do |is_enabled|
|
|
||||||
if is_enabled
|
|
||||||
gitaly_conflicts_client(@target_repository).list_conflict_files.to_a
|
gitaly_conflicts_client(@target_repository).list_conflict_files.to_a
|
||||||
else
|
|
||||||
rugged_list_conflict_files
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
rescue GRPC::FailedPrecondition => e
|
rescue GRPC::FailedPrecondition => e
|
||||||
raise Gitlab::Git::Conflict::Resolver::ConflictSideMissing.new(e.message)
|
raise Gitlab::Git::Conflict::Resolver::ConflictSideMissing.new(e.message)
|
||||||
|
@ -28,12 +22,8 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def resolve_conflicts(source_repository, resolution, source_branch:, target_branch:)
|
def resolve_conflicts(source_repository, resolution, source_branch:, target_branch:)
|
||||||
source_repository.gitaly_migrate(:conflicts_resolve_conflicts) do |is_enabled|
|
source_repository.wrapped_gitaly_errors do
|
||||||
if is_enabled
|
|
||||||
gitaly_conflicts_client(source_repository).resolve_conflicts(@target_repository, resolution, source_branch, target_branch)
|
gitaly_conflicts_client(source_repository).resolve_conflicts(@target_repository, resolution, source_branch, target_branch)
|
||||||
else
|
|
||||||
rugged_resolve_conflicts(source_repository, resolution, source_branch, target_branch)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -61,57 +51,6 @@ module Gitlab
|
||||||
def gitaly_conflicts_client(repository)
|
def gitaly_conflicts_client(repository)
|
||||||
repository.gitaly_conflicts_client(@our_commit_oid, @their_commit_oid)
|
repository.gitaly_conflicts_client(@our_commit_oid, @their_commit_oid)
|
||||||
end
|
end
|
||||||
|
|
||||||
def write_resolved_file_to_index(repository, index, file, params)
|
|
||||||
if params[:sections]
|
|
||||||
resolved_lines = file.resolve_lines(params[:sections])
|
|
||||||
new_file = resolved_lines.map { |line| line[:full_line] }.join("\n")
|
|
||||||
|
|
||||||
new_file << "\n" if file.our_blob.data.end_with?("\n")
|
|
||||||
elsif params[:content]
|
|
||||||
new_file = file.resolve_content(params[:content])
|
|
||||||
end
|
|
||||||
|
|
||||||
our_path = file.our_path
|
|
||||||
|
|
||||||
oid = repository.rugged.write(new_file, :blob)
|
|
||||||
index.add(path: our_path, oid: oid, mode: file.our_mode)
|
|
||||||
index.conflict_remove(our_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
def rugged_list_conflict_files
|
|
||||||
target_index = @target_repository.rugged.merge_commits(@our_commit_oid, @their_commit_oid)
|
|
||||||
|
|
||||||
# We don't need to do `with_repo_branch_commit` here, because the target
|
|
||||||
# project always fetches source refs when creating merge request diffs.
|
|
||||||
conflict_files(@target_repository, target_index)
|
|
||||||
end
|
|
||||||
|
|
||||||
def rugged_resolve_conflicts(source_repository, resolution, source_branch, target_branch)
|
|
||||||
source_repository.with_repo_branch_commit(@target_repository, target_branch) do
|
|
||||||
index = source_repository.rugged.merge_commits(@our_commit_oid, @their_commit_oid)
|
|
||||||
conflicts = conflict_files(source_repository, index)
|
|
||||||
|
|
||||||
resolution.files.each do |file_params|
|
|
||||||
conflict_file = conflict_for_path(conflicts, file_params[:old_path], file_params[:new_path])
|
|
||||||
|
|
||||||
write_resolved_file_to_index(source_repository, index, conflict_file, file_params)
|
|
||||||
end
|
|
||||||
|
|
||||||
unless index.conflicts.empty?
|
|
||||||
missing_files = index.conflicts.map { |file| file[:ours][:path] }
|
|
||||||
|
|
||||||
raise ResolutionError, "Missing resolutions for the following files: #{missing_files.join(', ')}"
|
|
||||||
end
|
|
||||||
|
|
||||||
commit_params = {
|
|
||||||
message: resolution.commit_message,
|
|
||||||
parents: [@our_commit_oid, @their_commit_oid]
|
|
||||||
}
|
|
||||||
|
|
||||||
source_repository.commit_index(resolution.user, source_branch, index, commit_params)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -84,23 +84,5 @@ describe MergeRequests::Conflicts::ListService do
|
||||||
|
|
||||||
expect(service.can_be_resolved_in_ui?).to be_falsey
|
expect(service.can_be_resolved_in_ui?).to be_falsey
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with gitaly disabled', :skip_gitaly_mock do
|
|
||||||
it 'returns a falsey value when the MR has a missing ref after a force push' do
|
|
||||||
merge_request = create_merge_request('conflict-resolvable')
|
|
||||||
service = conflicts_service(merge_request)
|
|
||||||
allow_any_instance_of(Rugged::Repository).to receive(:merge_commits).and_raise(Rugged::OdbError)
|
|
||||||
|
|
||||||
expect(service.can_be_resolved_in_ui?).to be_falsey
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns a falsey value when the MR has a missing revision after a force push' do
|
|
||||||
merge_request = create_merge_request('conflict-resolvable')
|
|
||||||
service = conflicts_service(merge_request)
|
|
||||||
allow(merge_request).to receive_message_chain(:target_branch_head, :raw, :id).and_return(Gitlab::Git::BLANK_SHA)
|
|
||||||
|
|
||||||
expect(service.can_be_resolved_in_ui?).to be_falsey
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -123,17 +123,6 @@ describe MergeRequests::Conflicts::ResolveService do
|
||||||
expect(merge_request_from_fork.source_branch_head.parents.map(&:id))
|
expect(merge_request_from_fork.source_branch_head.parents.map(&:id))
|
||||||
.to eq(['404fa3fc7c2c9b5dacff102f353bdf55b1be2813', target_head])
|
.to eq(['404fa3fc7c2c9b5dacff102f353bdf55b1be2813', target_head])
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when gitaly is disabled', :skip_gitaly_mock do
|
|
||||||
it 'gets conflicts from the source project' do
|
|
||||||
# REFACTOR NOTE: We used to test that `project.repository.rugged` wasn't
|
|
||||||
# used in this case, but since the refactor, for simplification,
|
|
||||||
# we always use that repository for read only operations.
|
|
||||||
expect(forked_project.repository.rugged).to receive(:merge_commits).and_call_original
|
|
||||||
|
|
||||||
subject
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue