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 | ... | ... |