Commit 411d84f385364be987380da5f0216048073609c9

Authored by randx
1 parent cd74f9da

Better merge handling. show if MR can be accepted or not

app/controllers/merge_requests_controller.rb
@@ -45,6 +45,10 @@ class MergeRequestsController < ApplicationController @@ -45,6 +45,10 @@ class MergeRequestsController < ApplicationController
45 # or from cache if already merged 45 # or from cache if already merged
46 @commits = @merge_request.commits 46 @commits = @merge_request.commits
47 47
  48 + if @merge_request.unchecked?
  49 + @merge_request.check_if_can_be_merged
  50 + end
  51 +
48 respond_to do |format| 52 respond_to do |format|
49 format.html 53 format.html
50 format.js 54 format.js
@@ -96,23 +100,8 @@ class MergeRequestsController < ApplicationController @@ -96,23 +100,8 @@ class MergeRequestsController < ApplicationController
96 end 100 end
97 101
98 def automerge 102 def automerge
99 - render_404 unless @merge_request.open?  
100 -  
101 - message = ""  
102 -  
103 - if GitlabMerge.new(@merge_request).merge  
104 - @merge_request.merge!(current_user.id)  
105 - message = "Successfully merged"  
106 - else  
107 - @merge_request.mark_as_unmergable  
108 - message = "Can not be merged"  
109 - end  
110 -  
111 - redirect_to [@merge_request.project, @merge_request], :alert => message  
112 - rescue => ex  
113 - @merge_request.mark_as_unmergable  
114 - message = "Can not be merged"  
115 - ensure 103 + render_404 unless @merge_request.open? && @merge_request.can_be_merged?
  104 + message = @merge_request.automerge! ? "Successfully merged" : "Can not be merged"
116 redirect_to [@merge_request.project, @merge_request], :alert => message 105 redirect_to [@merge_request.project, @merge_request], :alert => message
117 end 106 end
118 107
app/models/merge_request.rb
1 require File.join(Rails.root, "app/models/commit") 1 require File.join(Rails.root, "app/models/commit")
2 2
3 class MergeRequest < ActiveRecord::Base 3 class MergeRequest < ActiveRecord::Base
  4 + UNCHECKED = 1
  5 + CAN_BE_MERGED = 2
  6 + CANNOT_BE_MERGED = 3
  7 +
4 belongs_to :project 8 belongs_to :project
5 belongs_to :author, :class_name => "User" 9 belongs_to :author, :class_name => "User"
6 belongs_to :assignee, :class_name => "User" 10 belongs_to :assignee, :class_name => "User"
@@ -56,8 +60,21 @@ class MergeRequest &lt; ActiveRecord::Base @@ -56,8 +60,21 @@ class MergeRequest &lt; ActiveRecord::Base
56 self.reloaded_diffs 60 self.reloaded_diffs
57 end 61 end
58 62
  63 + def unchecked?
  64 + state == UNCHECKED
  65 + end
  66 +
59 def can_be_merged? 67 def can_be_merged?
60 - auto_merge 68 + state == CAN_BE_MERGED
  69 + end
  70 +
  71 + def check_if_can_be_merged
  72 + self.state = if GitlabMerge.new(self).can_be_merged?
  73 + CAN_BE_MERGED
  74 + else
  75 + CANNOT_BE_MERGED
  76 + end
  77 + self.save
61 end 78 end
62 79
63 def new? 80 def new?
@@ -123,8 +140,7 @@ class MergeRequest &lt; ActiveRecord::Base @@ -123,8 +140,7 @@ class MergeRequest &lt; ActiveRecord::Base
123 end 140 end
124 141
125 def mark_as_unmergable 142 def mark_as_unmergable
126 - self.auto_merge = false  
127 - save 143 + # TODO: write some code here
128 end 144 end
129 145
130 def reloaded_commits 146 def reloaded_commits
@@ -153,6 +169,16 @@ class MergeRequest &lt; ActiveRecord::Base @@ -153,6 +169,16 @@ class MergeRequest &lt; ActiveRecord::Base
153 :author_id => user_id 169 :author_id => user_id
154 ) 170 )
155 end 171 end
  172 +
  173 + def automerge!
  174 + if GitlabMerge.new(self).merge
  175 + self.merge!(current_user.id)
  176 + true
  177 + end
  178 + rescue
  179 + self.mark_as_unmergable
  180 + false
  181 + end
156 end 182 end
157 # == Schema Information 183 # == Schema Information
158 # 184 #
app/views/merge_requests/show.html.haml
@@ -54,18 +54,18 @@ @@ -54,18 +54,18 @@
54 54
55 - if @merge_request.open? && @commits.any? 55 - if @merge_request.open? && @commits.any?
56 - if @merge_request.can_be_merged? 56 - if @merge_request.can_be_merged?
57 - .alert-message.block-message.success  
58 - %p You can try to merge this request with GitLab. If failed you can always do it manually 57 + .alert-message.info
  58 + %p
  59 + You can accept this request automatically. If you still want to do it manually - #{link_to "click here", "#", :class => "how_to_merge_link cwhite", :title => "How To Merge"} for instructions
59 .alert-actions 60 .alert-actions
60 - = link_to "Try Merge it!", automerge_project_merge_request_path(@project, @merge_request), :class => "btn small success" 61 + = link_to "Accept Merge Request", automerge_project_merge_request_path(@project, @merge_request), :class => "btn small info"
61 &nbsp; 62 &nbsp;
62 - = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge" 63 +
63 - else 64 - else
64 - .alert-message.block-message  
65 - %p This request cant be merged with GitLab. You should do it manually  
66 - .alert-actions  
67 - %span.btn.small.disabled Try Merge it!  
68 - = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded success", :title => "How To Merge" 65 + .alert-message
  66 + %p
  67 + %strong This request cant be merged with GitLab. You should do it manually &nbsp;
  68 + = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge"
69 69
70 70
71 = render "merge_requests/commits" 71 = render "merge_requests/commits"
db/migrate/20120329170745_add_automerge_to_merge_request.rb
1 class AddAutomergeToMergeRequest < ActiveRecord::Migration 1 class AddAutomergeToMergeRequest < ActiveRecord::Migration
2 def change 2 def change
3 - add_column :merge_requests, :auto_merge, :boolean, :null => false, :default => true  
4 - 3 + add_column :merge_requests, :state, :integer, :null => false, :default => 1
5 end 4 end
6 end 5 end
@@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
30 t.integer "assignee_id" 30 t.integer "assignee_id"
31 t.integer "author_id" 31 t.integer "author_id"
32 t.integer "project_id" 32 t.integer "project_id"
33 - t.datetime "created_at", :null => false  
34 - t.datetime "updated_at", :null => false 33 + t.datetime "created_at"
  34 + t.datetime "updated_at"
35 t.boolean "closed", :default => false, :null => false 35 t.boolean "closed", :default => false, :null => false
36 t.integer "position", :default => 0 36 t.integer "position", :default => 0
37 t.boolean "critical", :default => false, :null => false 37 t.boolean "critical", :default => false, :null => false
@@ -43,8 +43,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -43,8 +43,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
43 43
44 create_table "keys", :force => true do |t| 44 create_table "keys", :force => true do |t|
45 t.integer "user_id" 45 t.integer "user_id"
46 - t.datetime "created_at", :null => false  
47 - t.datetime "updated_at", :null => false 46 + t.datetime "created_at"
  47 + t.datetime "updated_at"
48 t.text "key" 48 t.text "key"
49 t.string "title" 49 t.string "title"
50 t.string "identifier" 50 t.string "identifier"
@@ -59,12 +59,12 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -59,12 +59,12 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
59 t.integer "assignee_id" 59 t.integer "assignee_id"
60 t.string "title" 60 t.string "title"
61 t.boolean "closed", :default => false, :null => false 61 t.boolean "closed", :default => false, :null => false
62 - t.datetime "created_at", :null => false  
63 - t.datetime "updated_at", :null => false 62 + t.datetime "created_at"
  63 + t.datetime "updated_at"
64 t.text "st_commits" 64 t.text "st_commits"
65 t.text "st_diffs" 65 t.text "st_diffs"
66 t.boolean "merged", :default => false, :null => false 66 t.boolean "merged", :default => false, :null => false
67 - t.boolean "auto_merge", :default => true, :null => false 67 + t.integer "state", :default => 1, :null => false
68 end 68 end
69 69
70 add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id" 70 add_index "merge_requests", ["project_id"], :name => "index_merge_requests_on_project_id"
@@ -74,8 +74,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -74,8 +74,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
74 t.string "noteable_id" 74 t.string "noteable_id"
75 t.string "noteable_type" 75 t.string "noteable_type"
76 t.integer "author_id" 76 t.integer "author_id"
77 - t.datetime "created_at", :null => false  
78 - t.datetime "updated_at", :null => false 77 + t.datetime "created_at"
  78 + t.datetime "updated_at"
79 t.integer "project_id" 79 t.integer "project_id"
80 t.string "attachment" 80 t.string "attachment"
81 t.string "line_code" 81 t.string "line_code"
@@ -88,8 +88,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -88,8 +88,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
88 t.string "name" 88 t.string "name"
89 t.string "path" 89 t.string "path"
90 t.text "description" 90 t.text "description"
91 - t.datetime "created_at", :null => false  
92 - t.datetime "updated_at", :null => false 91 + t.datetime "created_at"
  92 + t.datetime "updated_at"
93 t.boolean "private_flag", :default => true, :null => false 93 t.boolean "private_flag", :default => true, :null => false
94 t.string "code" 94 t.string "code"
95 t.integer "owner_id" 95 t.integer "owner_id"
@@ -112,8 +112,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -112,8 +112,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
112 t.text "content" 112 t.text "content"
113 t.integer "author_id", :null => false 113 t.integer "author_id", :null => false
114 t.integer "project_id", :null => false 114 t.integer "project_id", :null => false
115 - t.datetime "created_at", :null => false  
116 - t.datetime "updated_at", :null => false 115 + t.datetime "created_at"
  116 + t.datetime "updated_at"
117 t.string "file_name" 117 t.string "file_name"
118 t.datetime "expires_at" 118 t.datetime "expires_at"
119 end 119 end
@@ -146,8 +146,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -146,8 +146,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
146 t.datetime "last_sign_in_at" 146 t.datetime "last_sign_in_at"
147 t.string "current_sign_in_ip" 147 t.string "current_sign_in_ip"
148 t.string "last_sign_in_ip" 148 t.string "last_sign_in_ip"
149 - t.datetime "created_at", :null => false  
150 - t.datetime "updated_at", :null => false 149 + t.datetime "created_at"
  150 + t.datetime "updated_at"
151 t.string "name" 151 t.string "name"
152 t.boolean "admin", :default => false, :null => false 152 t.boolean "admin", :default => false, :null => false
153 t.integer "projects_limit", :default => 10 153 t.integer "projects_limit", :default => 10
@@ -166,16 +166,16 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do @@ -166,16 +166,16 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
166 create_table "users_projects", :force => true do |t| 166 create_table "users_projects", :force => true do |t|
167 t.integer "user_id", :null => false 167 t.integer "user_id", :null => false
168 t.integer "project_id", :null => false 168 t.integer "project_id", :null => false
169 - t.datetime "created_at", :null => false  
170 - t.datetime "updated_at", :null => false 169 + t.datetime "created_at"
  170 + t.datetime "updated_at"
171 t.integer "project_access", :default => 0, :null => false 171 t.integer "project_access", :default => 0, :null => false
172 end 172 end
173 173
174 create_table "web_hooks", :force => true do |t| 174 create_table "web_hooks", :force => true do |t|
175 t.string "url" 175 t.string "url"
176 t.integer "project_id" 176 t.integer "project_id"
177 - t.datetime "created_at", :null => false  
178 - t.datetime "updated_at", :null => false 177 + t.datetime "created_at"
  178 + t.datetime "updated_at"
179 end 179 end
180 180
181 create_table "wikis", :force => true do |t| 181 create_table "wikis", :force => true do |t|
lib/gitlab_merge.rb
@@ -4,23 +4,34 @@ class GitlabMerge @@ -4,23 +4,34 @@ class GitlabMerge
4 def initialize(merge_request) 4 def initialize(merge_request)
5 self.merge_request = merge_request 5 self.merge_request = merge_request
6 self.project = merge_request.project 6 self.project = merge_request.project
7 - self.merge_path = File.join(Rails.root, "tmp", "merge_repo", project.path) 7 + self.merge_path = File.join(Rails.root, "tmp", "merge_repo", project.path, merge_request.id.to_s)
8 FileUtils.rm_rf(merge_path) 8 FileUtils.rm_rf(merge_path)
9 FileUtils.mkdir_p merge_path 9 FileUtils.mkdir_p merge_path
10 end 10 end
11 11
  12 + def can_be_merged?
  13 + pull do |repo, output|
  14 + !(output =~ /Automatic merge failed/)
  15 + end
  16 + end
  17 +
12 def merge 18 def merge
  19 + pull do |repo, output|
  20 + if output =~ /Automatic merge failed/
  21 + false
  22 + else
  23 + repo.git.push({}, "origin", merge_request.target_branch)
  24 + true
  25 + end
  26 + end
  27 + end
  28 +
  29 + def pull
13 self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path) 30 self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path)
14 - output = ""  
15 Dir.chdir(merge_path) do 31 Dir.chdir(merge_path) do
16 merge_repo = Grit::Repo.new('.') 32 merge_repo = Grit::Repo.new('.')
17 output = merge_repo.git.pull({}, "origin", merge_request.source_branch) 33 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 34 + yield(merge_repo, output)
24 end 35 end
25 end 36 end
26 end 37 end