diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 040dceff142dcdfed81325bea8d6da2115247153..27d54f6b46f319e68236f3e643f6014d9b07a43e 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -150,7 +150,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController def resolve_conflicts begin - Gitlab::Conflict::FileCollection.new(@merge_request).resolve_conflicts!(params, user: current_user) + MergeRequests::ResolveService.new(project, current_user, params).execute(@merge_request) head :ok rescue Gitlab::Conflict::File::MissingResolution => e diff --git a/app/models/repository.rb b/app/models/repository.rb index e56bac509a4ed1e774778c68b998565b8b1218b9..01b02ccc0dcad4a6a4945a51aced46dca0fc6000 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -869,6 +869,14 @@ class Repository end end + def resolve_conflicts(user, branch, params) + commit_with_hooks(user, branch) do + committer = user_to_committer(user) + + Rugged::Commit.create(rugged, params.merge(author: committer, committer: committer)) + end + end + def check_revert_content(commit, base_branch) source_sha = find_branch(base_branch).target.sha args = [commit.id, source_sha] diff --git a/app/services/merge_requests/resolve_service.rb b/app/services/merge_requests/resolve_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..adc71b0c2bcfb47ff7e5cda058af6197a06e2ace --- /dev/null +++ b/app/services/merge_requests/resolve_service.rb @@ -0,0 +1,31 @@ +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 diff --git a/lib/gitlab/conflict/file.rb b/lib/gitlab/conflict/file.rb index 6284b0dd3776966d52df087e614ef2b387549eb2..3560fae5b091a96654cdced3ccf28713a65722b0 100644 --- a/lib/gitlab/conflict/file.rb +++ b/lib/gitlab/conflict/file.rb @@ -28,14 +28,6 @@ module Gitlab parent_file: self) end - def resolve!(resolution, index:, rugged:) - new_file = resolve_lines(resolution).map(&:text).join("\n") - - oid = rugged.write(new_file, :blob) - index.add(path: our_path, oid: oid, mode: our_mode) - index.conflict_remove(our_path) - end - def resolve_lines(resolution) section_id = nil diff --git a/lib/gitlab/conflict/file_collection.rb b/lib/gitlab/conflict/file_collection.rb index 04a75f9edc3d71deee4a83c8d4f7ff89283085fb..e8157fb9e91c8feddba5cdb727306d0cef634347 100644 --- a/lib/gitlab/conflict/file_collection.rb +++ b/lib/gitlab/conflict/file_collection.rb @@ -20,27 +20,6 @@ module Gitlab @merge_index ||= repository.rugged.merge_commits(our_commit, their_commit) end - def resolve_conflicts!(params, user:) - resolutions = params[:sections] - commit_message = params[:commit_message] || default_commit_message - rugged = repository.rugged - committer = repository.user_to_committer(user) - - files.each do |file| - file.resolve!(resolutions, index: merge_index, rugged: rugged) - end - - new_tree = merge_index.write_tree(rugged) - - Rugged::Commit.create(rugged, - author: committer, - committer: committer, - tree: new_tree, - message: commit_message, - parents: [our_commit, their_commit].map(&:oid), - update_ref: Gitlab::Git::BRANCH_REF_PREFIX + merge_request.source_branch) - end - def files @files ||= merge_index.conflicts.map do |conflict| raise ConflictSideMissing unless conflict[:theirs] && conflict[:ours]