summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandx <dmitriy.zaporozhets@gmail.com>2012-03-29 18:03:05 +0300
committerrandx <dmitriy.zaporozhets@gmail.com>2012-03-29 18:03:05 +0300
commit78d620b3b63fdd78b2cd1e4386822f93a701bc42 (patch)
tree4dd832c46f62778d34c18bdb91319ea7415793fe
parent8ee0993fdf783ad12823ff817cd531df0bc363eb (diff)
downloadgitlab-ce-78d620b3b63fdd78b2cd1e4386822f93a701bc42.tar.gz
Raw gitlab automerge feature
-rw-r--r--app/controllers/merge_requests_controller.rb18
-rw-r--r--config/routes.rb1
-rw-r--r--lib/gitlab_merge.rb26
3 files changed, 44 insertions, 1 deletions
diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb
index f882028fcab..609589d6b0b 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 eb999f26ba2..a1c54565f49 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 00000000000..85cc1667f65
--- /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