Commit 90748cf724d4b019c954d316621b04cefd69dbaf
1 parent
464cd59d
Exists in
master
and in
4 other branches
Merge Button v1 complete
Showing
6 changed files
with
31 additions
and
25 deletions
Show diff stats
app/controllers/merge_requests_controller.rb
| @@ -102,6 +102,7 @@ class MergeRequestsController < ApplicationController | @@ -102,6 +102,7 @@ class MergeRequestsController < ApplicationController | ||
| 102 | 102 | ||
| 103 | def automerge | 103 | def automerge |
| 104 | render_404 unless @merge_request.open? && @merge_request.can_be_merged? | 104 | render_404 unless @merge_request.open? && @merge_request.can_be_merged? |
| 105 | + return access_denied! unless can?(current_user, :accept_mr, @project) | ||
| 105 | @merge_request.automerge!(current_user) | 106 | @merge_request.automerge!(current_user) |
| 106 | end | 107 | end |
| 107 | 108 |
app/models/ability.rb
| @@ -46,6 +46,7 @@ class Ability | @@ -46,6 +46,7 @@ class Ability | ||
| 46 | :admin_team_member, | 46 | :admin_team_member, |
| 47 | :admin_merge_request, | 47 | :admin_merge_request, |
| 48 | :admin_note, | 48 | :admin_note, |
| 49 | + :accept_mr, | ||
| 49 | :admin_wiki | 50 | :admin_wiki |
| 50 | ] if project.master_access_for?(user) || project.owner == user | 51 | ] if project.master_access_for?(user) || project.owner == user |
| 51 | 52 |
app/models/merge_request.rb
| @@ -73,7 +73,7 @@ class MergeRequest < ActiveRecord::Base | @@ -73,7 +73,7 @@ class MergeRequest < ActiveRecord::Base | ||
| 73 | end | 73 | end |
| 74 | 74 | ||
| 75 | def check_if_can_be_merged | 75 | def check_if_can_be_merged |
| 76 | - self.state = if GitlabMerge.new(self).can_be_merged? | 76 | + self.state = if GitlabMerge.new(self, self.author).can_be_merged? |
| 77 | CAN_BE_MERGED | 77 | CAN_BE_MERGED |
| 78 | else | 78 | else |
| 79 | CANNOT_BE_MERGED | 79 | CANNOT_BE_MERGED |
| @@ -175,7 +175,7 @@ class MergeRequest < ActiveRecord::Base | @@ -175,7 +175,7 @@ class MergeRequest < ActiveRecord::Base | ||
| 175 | end | 175 | end |
| 176 | 176 | ||
| 177 | def automerge!(current_user) | 177 | def automerge!(current_user) |
| 178 | - if GitlabMerge.new(self).merge | 178 | + if GitlabMerge.new(self, current_user).merge |
| 179 | self.merge!(current_user.id) | 179 | self.merge!(current_user.id) |
| 180 | true | 180 | true |
| 181 | end | 181 | end |
app/views/merge_requests/show.html.haml
| @@ -52,7 +52,8 @@ | @@ -52,7 +52,8 @@ | ||
| 52 | Closed by #{@merge_request.closed_event.author_name} | 52 | Closed by #{@merge_request.closed_event.author_name} |
| 53 | %small #{time_ago_in_words(@merge_request.closed_event.created_at)} ago. | 53 | %small #{time_ago_in_words(@merge_request.closed_event.created_at)} ago. |
| 54 | 54 | ||
| 55 | -- if @merge_request.open? && @commits.any? | 55 | + |
| 56 | +- if @merge_request.open? && @commits.any? && can?(current_user, :accept_mr, @project) | ||
| 56 | - if @merge_request.can_be_merged? | 57 | - if @merge_request.can_be_merged? |
| 57 | .ui-box.padded | 58 | .ui-box.padded |
| 58 | %p | 59 | %p |
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" | ||
| 34 | - t.datetime "updated_at" | 33 | + t.datetime "created_at", :null => false |
| 34 | + t.datetime "updated_at", :null => false | ||
| 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" | ||
| 47 | - t.datetime "updated_at" | 46 | + t.datetime "created_at", :null => false |
| 47 | + t.datetime "updated_at", :null => false | ||
| 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" | ||
| 63 | - t.datetime "updated_at" | 62 | + t.datetime "created_at", :null => false |
| 63 | + t.datetime "updated_at", :null => false | ||
| 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.integer "state", :default => 1, :null => false | 67 | + t.boolean "auto_merge", :default => true, :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" | ||
| 78 | - t.datetime "updated_at" | 77 | + t.datetime "created_at", :null => false |
| 78 | + t.datetime "updated_at", :null => false | ||
| 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" | ||
| 92 | - t.datetime "updated_at" | 91 | + t.datetime "created_at", :null => false |
| 92 | + t.datetime "updated_at", :null => false | ||
| 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" | ||
| 116 | - t.datetime "updated_at" | 115 | + t.datetime "created_at", :null => false |
| 116 | + t.datetime "updated_at", :null => false | ||
| 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" | ||
| 150 | - t.datetime "updated_at" | 149 | + t.datetime "created_at", :null => false |
| 150 | + t.datetime "updated_at", :null => false | ||
| 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" | ||
| 170 | - t.datetime "updated_at" | 169 | + t.datetime "created_at", :null => false |
| 170 | + t.datetime "updated_at", :null => false | ||
| 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" | ||
| 178 | - t.datetime "updated_at" | 177 | + t.datetime "created_at", :null => false |
| 178 | + t.datetime "updated_at", :null => false | ||
| 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
| 1 | class GitlabMerge | 1 | class GitlabMerge |
| 2 | - attr_accessor :project, :merge_path, :merge_request | 2 | + attr_accessor :project, :merge_path, :merge_request, :user |
| 3 | 3 | ||
| 4 | - def initialize(merge_request) | 4 | + def initialize(merge_request, user) |
| 5 | + self.user = user | ||
| 5 | self.merge_request = merge_request | 6 | self.merge_request = merge_request |
| 6 | self.project = merge_request.project | 7 | self.project = merge_request.project |
| 7 | self.merge_path = File.join(Rails.root, "tmp", "merge_repo", project.path, merge_request.id.to_s) | 8 | self.merge_path = File.join(Rails.root, "tmp", "merge_repo", project.path, merge_request.id.to_s) |
| @@ -30,7 +31,9 @@ class GitlabMerge | @@ -30,7 +31,9 @@ class GitlabMerge | ||
| 30 | self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path) | 31 | self.project.repo.git.clone({:branch => merge_request.target_branch}, project.url_to_repo, merge_path) |
| 31 | Dir.chdir(merge_path) do | 32 | Dir.chdir(merge_path) do |
| 32 | merge_repo = Grit::Repo.new('.') | 33 | merge_repo = Grit::Repo.new('.') |
| 33 | - output = merge_repo.git.pull({}, "origin", merge_request.source_branch) | 34 | + merge_repo.git.sh "git config user.name \"#{user.name}\"" |
| 35 | + merge_repo.git.sh "git config user.email \"#{user.email}\"" | ||
| 36 | + output = merge_repo.git.pull({}, "--no-ff", "origin", merge_request.source_branch) | ||
| 34 | yield(merge_repo, output) | 37 | yield(merge_repo, output) |
| 35 | end | 38 | end |
| 36 | end | 39 | end |