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 | 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 < 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 < 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 < 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 | |
| 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 | |
| 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
db/schema.rb
| ... | ... | @@ -30,8 +30,8 @@ ActiveRecord::Schema.define(:version => 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 => 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 => 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 => 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 => 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 => 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 => 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 => 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 | ... | ... |