Commit 78d620b3b63fdd78b2cd1e4386822f93a701bc42
1 parent
8ee0993f
Exists in
master
and in
4 other branches
Raw gitlab automerge feature
Showing
3 changed files
with
44 additions
and
1 deletions
Show diff stats
app/controllers/merge_requests_controller.rb
| @@ -2,7 +2,7 @@ class MergeRequestsController < ApplicationController | @@ -2,7 +2,7 @@ class MergeRequestsController < ApplicationController | ||
| 2 | before_filter :authenticate_user! | 2 | before_filter :authenticate_user! |
| 3 | before_filter :project | 3 | before_filter :project |
| 4 | before_filter :module_enabled | 4 | before_filter :module_enabled |
| 5 | - before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs] | 5 | + before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs, :automerge] |
| 6 | layout "project" | 6 | layout "project" |
| 7 | 7 | ||
| 8 | # Authorize | 8 | # Authorize |
| @@ -95,6 +95,22 @@ class MergeRequestsController < ApplicationController | @@ -95,6 +95,22 @@ class MergeRequestsController < ApplicationController | ||
| 95 | end | 95 | end |
| 96 | end | 96 | end |
| 97 | 97 | ||
| 98 | + def automerge | ||
| 99 | + message = "" | ||
| 100 | + if GitlabMerge.new(@merge_request).merge | ||
| 101 | + @merge_request.update_attributes( | ||
| 102 | + :author_id_of_changes => current_user.id, | ||
| 103 | + :closed => true | ||
| 104 | + ) | ||
| 105 | + @merge_request.reload_code | ||
| 106 | + message = "Successfully merged" | ||
| 107 | + else | ||
| 108 | + message = "Can not be merged" | ||
| 109 | + end | ||
| 110 | + | ||
| 111 | + redirect_to [@merge_request.project, @merge_request], :alert => message | ||
| 112 | + end | ||
| 113 | + | ||
| 98 | def destroy | 114 | def destroy |
| 99 | @merge_request.destroy | 115 | @merge_request.destroy |
| 100 | 116 |
config/routes.rb
| @@ -102,6 +102,7 @@ Gitlab::Application.routes.draw do | @@ -102,6 +102,7 @@ Gitlab::Application.routes.draw do | ||
| 102 | resources :merge_requests do | 102 | resources :merge_requests do |
| 103 | member do | 103 | member do |
| 104 | get :diffs | 104 | get :diffs |
| 105 | + get :automerge | ||
| 105 | end | 106 | end |
| 106 | 107 | ||
| 107 | collection do | 108 | collection do |
| @@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
| 1 | +class GitlabMerge | ||
| 2 | + attr_accessor :project, :merge_path, :merge_request | ||
| 3 | + | ||
| 4 | + def initialize(merge_request) | ||
| 5 | + self.merge_request = merge_request | ||
| 6 | + self.project = merge_request.project | ||
| 7 | + self.merge_path = File.join(Rails.root, "tmp", "merge_repo", project.path) | ||
| 8 | + FileUtils.rm_rf(merge_path) | ||
| 9 | + FileUtils.mkdir_p merge_path | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + def merge | ||
| 13 | + self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path) | ||
| 14 | + output = "" | ||
| 15 | + Dir.chdir(merge_path) do | ||
| 16 | + merge_repo = Grit::Repo.new('.') | ||
| 17 | + output = merge_repo.git.pull({}, "origin", merge_request.source_branch) | ||
| 18 | + if output =~ /Automatic merge failed/ | ||
| 19 | + return false | ||
| 20 | + else | ||
| 21 | + merge_repo.git.push({}, "origin", merge_request.target_branch) | ||
| 22 | + return true | ||
| 23 | + end | ||
| 24 | + end | ||
| 25 | + end | ||
| 26 | +end |