Commit 411d84f385364be987380da5f0216048073609c9
1 parent
cd74f9da
Exists in
master
and in
4 other branches
Better merge handling. show if MR can be accepted or not
Showing
6 changed files
with
83 additions
and
58 deletions
Show diff stats
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 < ActiveRecord::Base | @@ -56,8 +60,21 @@ class MergeRequest < 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 < ActiveRecord::Base | @@ -123,8 +140,7 @@ class MergeRequest < 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 < ActiveRecord::Base | @@ -153,6 +169,16 @@ class MergeRequest < 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 | | 62 | |
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 | ||
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 |
db/schema.rb
@@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version => 20120329170745) do | @@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version => 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 => 20120329170745) do | @@ -43,8 +43,8 @@ ActiveRecord::Schema.define(:version => 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 => 20120329170745) do | @@ -59,12 +59,12 @@ ActiveRecord::Schema.define(:version => 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 => 20120329170745) do | @@ -74,8 +74,8 @@ ActiveRecord::Schema.define(:version => 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 => 20120329170745) do | @@ -88,8 +88,8 @@ ActiveRecord::Schema.define(:version => 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 => 20120329170745) do | @@ -112,8 +112,8 @@ ActiveRecord::Schema.define(:version => 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 => 20120329170745) do | @@ -146,8 +146,8 @@ ActiveRecord::Schema.define(:version => 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 => 20120329170745) do | @@ -166,16 +166,16 @@ ActiveRecord::Schema.define(:version => 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 |