diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index f882028f..609589d6 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -2,7 +2,7 @@ class MergeRequestsController < ApplicationController before_filter :authenticate_user! before_filter :project before_filter :module_enabled - before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs] + before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs, :automerge] layout "project" # Authorize @@ -95,6 +95,22 @@ class MergeRequestsController < ApplicationController end end + def automerge + message = "" + if GitlabMerge.new(@merge_request).merge + @merge_request.update_attributes( + :author_id_of_changes => current_user.id, + :closed => true + ) + @merge_request.reload_code + message = "Successfully merged" + else + message = "Can not be merged" + end + + redirect_to [@merge_request.project, @merge_request], :alert => message + end + def destroy @merge_request.destroy diff --git a/config/routes.rb b/config/routes.rb index eb999f26..a1c54565 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -102,6 +102,7 @@ Gitlab::Application.routes.draw do resources :merge_requests do member do get :diffs + get :automerge end collection do diff --git a/lib/gitlab_merge.rb b/lib/gitlab_merge.rb new file mode 100644 index 00000000..85cc1667 --- /dev/null +++ b/lib/gitlab_merge.rb @@ -0,0 +1,26 @@ +class GitlabMerge + attr_accessor :project, :merge_path, :merge_request + + def initialize(merge_request) + self.merge_request = merge_request + self.project = merge_request.project + self.merge_path = File.join(Rails.root, "tmp", "merge_repo", project.path) + FileUtils.rm_rf(merge_path) + FileUtils.mkdir_p merge_path + end + + def merge + self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path) + output = "" + Dir.chdir(merge_path) do + merge_repo = Grit::Repo.new('.') + output = merge_repo.git.pull({}, "origin", merge_request.source_branch) + if output =~ /Automatic merge failed/ + return false + else + merge_repo.git.push({}, "origin", merge_request.target_branch) + return true + end + end + end +end