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 45 # or from cache if already merged
46 46 @commits = @merge_request.commits
47 47  
  48 + if @merge_request.unchecked?
  49 + @merge_request.check_if_can_be_merged
  50 + end
  51 +
48 52 respond_to do |format|
49 53 format.html
50 54 format.js
... ... @@ -96,23 +100,8 @@ class MergeRequestsController < ApplicationController
96 100 end
97 101  
98 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 105 redirect_to [@merge_request.project, @merge_request], :alert => message
117 106 end
118 107  
... ...
app/models/merge_request.rb
1 1 require File.join(Rails.root, "app/models/commit")
2 2  
3 3 class MergeRequest < ActiveRecord::Base
  4 + UNCHECKED = 1
  5 + CAN_BE_MERGED = 2
  6 + CANNOT_BE_MERGED = 3
  7 +
4 8 belongs_to :project
5 9 belongs_to :author, :class_name => "User"
6 10 belongs_to :assignee, :class_name => "User"
... ... @@ -56,8 +60,21 @@ class MergeRequest &lt; ActiveRecord::Base
56 60 self.reloaded_diffs
57 61 end
58 62  
  63 + def unchecked?
  64 + state == UNCHECKED
  65 + end
  66 +
59 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 78 end
62 79  
63 80 def new?
... ... @@ -123,8 +140,7 @@ class MergeRequest &lt; ActiveRecord::Base
123 140 end
124 141  
125 142 def mark_as_unmergable
126   - self.auto_merge = false
127   - save
  143 + # TODO: write some code here
128 144 end
129 145  
130 146 def reloaded_commits
... ... @@ -153,6 +169,16 @@ class MergeRequest &lt; ActiveRecord::Base
153 169 :author_id => user_id
154 170 )
155 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 182 end
157 183 # == Schema Information
158 184 #
... ...
app/views/merge_requests/show.html.haml
... ... @@ -54,18 +54,18 @@
54 54  
55 55 - if @merge_request.open? && @commits.any?
56 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 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 &nbsp;
62   - = link_to "Show how to merge", "#", :class => "how_to_merge_link btn small padded", :title => "How To Merge"
  63 +
63 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 71 = render "merge_requests/commits"
... ...
db/migrate/20120329170745_add_automerge_to_merge_request.rb
1 1 class AddAutomergeToMergeRequest < ActiveRecord::Migration
2 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 4 end
6 5 end
... ...
db/schema.rb
... ... @@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
30 30 t.integer "assignee_id"
31 31 t.integer "author_id"
32 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 35 t.boolean "closed", :default => false, :null => false
36 36 t.integer "position", :default => 0
37 37 t.boolean "critical", :default => false, :null => false
... ... @@ -43,8 +43,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
43 43  
44 44 create_table "keys", :force => true do |t|
45 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 48 t.text "key"
49 49 t.string "title"
50 50 t.string "identifier"
... ... @@ -59,12 +59,12 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
59 59 t.integer "assignee_id"
60 60 t.string "title"
61 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 64 t.text "st_commits"
65 65 t.text "st_diffs"
66 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 68 end
69 69  
70 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 74 t.string "noteable_id"
75 75 t.string "noteable_type"
76 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 79 t.integer "project_id"
80 80 t.string "attachment"
81 81 t.string "line_code"
... ... @@ -88,8 +88,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
88 88 t.string "name"
89 89 t.string "path"
90 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 93 t.boolean "private_flag", :default => true, :null => false
94 94 t.string "code"
95 95 t.integer "owner_id"
... ... @@ -112,8 +112,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
112 112 t.text "content"
113 113 t.integer "author_id", :null => false
114 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 117 t.string "file_name"
118 118 t.datetime "expires_at"
119 119 end
... ... @@ -146,8 +146,8 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
146 146 t.datetime "last_sign_in_at"
147 147 t.string "current_sign_in_ip"
148 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 151 t.string "name"
152 152 t.boolean "admin", :default => false, :null => false
153 153 t.integer "projects_limit", :default => 10
... ... @@ -166,16 +166,16 @@ ActiveRecord::Schema.define(:version =&gt; 20120329170745) do
166 166 create_table "users_projects", :force => true do |t|
167 167 t.integer "user_id", :null => false
168 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 171 t.integer "project_access", :default => 0, :null => false
172 172 end
173 173  
174 174 create_table "web_hooks", :force => true do |t|
175 175 t.string "url"
176 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 179 end
180 180  
181 181 create_table "wikis", :force => true do |t|
... ...
lib/gitlab_merge.rb
... ... @@ -4,23 +4,34 @@ class GitlabMerge
4 4 def initialize(merge_request)
5 5 self.merge_request = merge_request
6 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 8 FileUtils.rm_rf(merge_path)
9 9 FileUtils.mkdir_p merge_path
10 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 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 30 self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path)
14   - output = ""
15 31 Dir.chdir(merge_path) do
16 32 merge_repo = Grit::Repo.new('.')
17 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 35 end
25 36 end
26 37 end
... ...