Commit 78d620b3b63fdd78b2cd1e4386822f93a701bc42

Authored by randx
1 parent 8ee0993f

Raw gitlab automerge feature

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
... ... @@ -102,6 +102,7 @@ Gitlab::Application.routes.draw do
102 102 resources :merge_requests do
103 103 member do
104 104 get :diffs
  105 + get :automerge
105 106 end
106 107  
107 108 collection do
... ...
lib/gitlab_merge.rb 0 → 100644
... ... @@ -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
... ...