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 | 2 | before_filter :authenticate_user! |
| 3 | 3 | before_filter :project |
| 4 | 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 | 6 | layout "project" |
| 7 | 7 | |
| 8 | 8 | # Authorize |
| ... | ... | @@ -95,6 +95,22 @@ class MergeRequestsController < ApplicationController |
| 95 | 95 | end |
| 96 | 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 | 114 | def destroy |
| 99 | 115 | @merge_request.destroy |
| 100 | 116 | ... | ... |
config/routes.rb
| ... | ... | @@ -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 | ... | ... |