32 lines
1 KiB
Ruby
32 lines
1 KiB
Ruby
|
module MergeRequests
|
||
|
class ResolveService < MergeRequests::BaseService
|
||
|
attr_accessor :conflicts, :rugged, :merge_index
|
||
|
|
||
|
def execute(merge_request)
|
||
|
@conflicts = merge_request.conflicts
|
||
|
@rugged = project.repository.rugged
|
||
|
@merge_index = conflicts.merge_index
|
||
|
|
||
|
conflicts.files.each do |file|
|
||
|
write_resolved_file_to_index(file, params[:sections])
|
||
|
end
|
||
|
|
||
|
commit_params = {
|
||
|
message: params[:commit_message] || conflicts.default_commit_message,
|
||
|
parents: [conflicts.our_commit, conflicts.their_commit].map(&:oid),
|
||
|
tree: merge_index.write_tree(rugged)
|
||
|
}
|
||
|
|
||
|
project.repository.resolve_conflicts(current_user, merge_request.source_branch, commit_params)
|
||
|
end
|
||
|
|
||
|
def write_resolved_file_to_index(file, resolutions)
|
||
|
new_file = file.resolve_lines(resolutions).map(&:text).join("\n")
|
||
|
our_path = file.our_path
|
||
|
|
||
|
merge_index.add(path: our_path, oid: rugged.write(new_file, :blob), mode: file.our_mode)
|
||
|
merge_index.conflict_remove(our_path)
|
||
|
end
|
||
|
end
|
||
|
end
|