From ba327e69ec4b2214f12f577cd86a37c65ea2f3e9 Mon Sep 17 00:00:00 2001
From: Sean McGivern <sean@gitlab.com>
Date: Thu, 4 Aug 2016 14:20:04 +0100
Subject: [PATCH] Move resolving code to ResolveService

---
 .../projects/merge_requests_controller.rb     |  2 +-
 app/models/repository.rb                      |  8 +++++
 .../merge_requests/resolve_service.rb         | 31 +++++++++++++++++++
 lib/gitlab/conflict/file.rb                   |  8 -----
 lib/gitlab/conflict/file_collection.rb        | 21 -------------
 5 files changed, 40 insertions(+), 30 deletions(-)
 create mode 100644 app/services/merge_requests/resolve_service.rb

diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 040dceff142..27d54f6b46f 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 e56bac509a4..01b02ccc0dc 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 00000000000..adc71b0c2bc
--- /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 6284b0dd377..3560fae5b09 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 04a75f9edc3..e8157fb9e91 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]
-- 
GitLab