Commit d7b667fee238cfd457bdc143a37585ac931cf4ad
Exists in
master
and in
4 other branches
Merge branch 'state-machine-stage-2' of https://github.com/Undev/gitlabhq into U…
…ndev-state-machine-stage-2 Conflicts: app/models/merge_request.rb
Showing
10 changed files
with
97 additions
and
82 deletions
Show diff stats
app/controllers/merge_requests_controller.rb
| @@ -75,7 +75,7 @@ class MergeRequestsController < ProjectResourceController | @@ -75,7 +75,7 @@ class MergeRequestsController < ProjectResourceController | ||
| 75 | if @merge_request.unchecked? | 75 | if @merge_request.unchecked? |
| 76 | @merge_request.check_if_can_be_merged | 76 | @merge_request.check_if_can_be_merged |
| 77 | end | 77 | end |
| 78 | - render json: {merge_status: @merge_request.human_merge_status} | 78 | + render json: {merge_status: @merge_request.human_merge_status_name} |
| 79 | rescue Gitlab::SatelliteNotExistError | 79 | rescue Gitlab::SatelliteNotExistError |
| 80 | render json: {merge_status: :no_satellite} | 80 | render json: {merge_status: :no_satellite} |
| 81 | end | 81 | end |
app/models/merge_request.rb
| @@ -24,6 +24,8 @@ require Rails.root.join("lib/static_model") | @@ -24,6 +24,8 @@ require Rails.root.join("lib/static_model") | ||
| 24 | class MergeRequest < ActiveRecord::Base | 24 | class MergeRequest < ActiveRecord::Base |
| 25 | include Issuable | 25 | include Issuable |
| 26 | 26 | ||
| 27 | + BROKEN_DIFF = "--broken-diff" | ||
| 28 | + | ||
| 27 | attr_accessible :title, :assignee_id, :target_branch, :source_branch, :milestone_id, | 29 | attr_accessible :title, :assignee_id, :target_branch, :source_branch, :milestone_id, |
| 28 | :author_id_of_changes, :state_event | 30 | :author_id_of_changes, :state_event |
| 29 | 31 | ||
| @@ -51,52 +53,42 @@ class MergeRequest < ActiveRecord::Base | @@ -51,52 +53,42 @@ class MergeRequest < ActiveRecord::Base | ||
| 51 | state :merged | 53 | state :merged |
| 52 | end | 54 | end |
| 53 | 55 | ||
| 54 | - BROKEN_DIFF = "--broken-diff" | 56 | + state_machine :merge_status, initial: :unchecked do |
| 57 | + event :mark_as_unchecked do | ||
| 58 | + transition [:can_be_merged, :cannot_be_merged] => :unchecked | ||
| 59 | + end | ||
| 60 | + | ||
| 61 | + event :mark_as_mergeable do | ||
| 62 | + transition unchecked: :can_be_merged | ||
| 63 | + end | ||
| 64 | + | ||
| 65 | + event :mark_as_unmergeable do | ||
| 66 | + transition unchecked: :cannot_be_merged | ||
| 67 | + end | ||
| 68 | + | ||
| 69 | + state :unchecked | ||
| 55 | 70 | ||
| 56 | - UNCHECKED = 1 | ||
| 57 | - CAN_BE_MERGED = 2 | ||
| 58 | - CANNOT_BE_MERGED = 3 | 71 | + state :can_be_merged |
| 72 | + | ||
| 73 | + state :cannot_be_merged | ||
| 74 | + end | ||
| 59 | 75 | ||
| 60 | serialize :st_commits | 76 | serialize :st_commits |
| 61 | serialize :st_diffs | 77 | serialize :st_diffs |
| 62 | 78 | ||
| 63 | validates :source_branch, presence: true | 79 | validates :source_branch, presence: true |
| 64 | validates :target_branch, presence: true | 80 | validates :target_branch, presence: true |
| 65 | - validate :validate_branches | 81 | + validate :validate_branches |
| 66 | 82 | ||
| 67 | scope :merged, -> { with_state(:merged) } | 83 | scope :merged, -> { with_state(:merged) } |
| 84 | + scope :by_branch, ->(branch_name) { where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name) } | ||
| 85 | + scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) } | ||
| 86 | + scope :by_milestone, ->(milestone) { where(milestone_id: milestone) } | ||
| 68 | 87 | ||
| 69 | # Closed scope for merge request should return | 88 | # Closed scope for merge request should return |
| 70 | # both merged and closed mr's | 89 | # both merged and closed mr's |
| 71 | scope :closed, -> { with_states(:closed, :merged) } | 90 | scope :closed, -> { with_states(:closed, :merged) } |
| 72 | 91 | ||
| 73 | - class << self | ||
| 74 | - def find_all_by_branch(branch_name) | ||
| 75 | - where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name) | ||
| 76 | - end | ||
| 77 | - | ||
| 78 | - def cared(user) | ||
| 79 | - where('assignee_id = :user OR author_id = :user', user: user.id) | ||
| 80 | - end | ||
| 81 | - | ||
| 82 | - def find_all_by_branch(branch_name) | ||
| 83 | - where("source_branch LIKE :branch OR target_branch LIKE :branch", branch: branch_name) | ||
| 84 | - end | ||
| 85 | - | ||
| 86 | - def find_all_by_milestone(milestone) | ||
| 87 | - where("milestone_id = :milestone_id", milestone_id: milestone) | ||
| 88 | - end | ||
| 89 | - end | ||
| 90 | - | ||
| 91 | - def human_merge_status | ||
| 92 | - merge_statuses = { | ||
| 93 | - CAN_BE_MERGED => "can_be_merged", | ||
| 94 | - CANNOT_BE_MERGED => "cannot_be_merged", | ||
| 95 | - UNCHECKED => "unchecked" | ||
| 96 | - } | ||
| 97 | - merge_statuses[self.merge_status] | ||
| 98 | - end | ||
| 99 | - | ||
| 100 | def validate_branches | 92 | def validate_branches |
| 101 | if target_branch == source_branch | 93 | if target_branch == source_branch |
| 102 | errors.add :base, "You can not use same branch for source and target branches" | 94 | errors.add :base, "You can not use same branch for source and target branches" |
| @@ -108,26 +100,12 @@ class MergeRequest < ActiveRecord::Base | @@ -108,26 +100,12 @@ class MergeRequest < ActiveRecord::Base | ||
| 108 | self.reloaded_diffs | 100 | self.reloaded_diffs |
| 109 | end | 101 | end |
| 110 | 102 | ||
| 111 | - def unchecked? | ||
| 112 | - merge_status == UNCHECKED | ||
| 113 | - end | ||
| 114 | - | ||
| 115 | - def mark_as_unchecked | ||
| 116 | - self.merge_status = UNCHECKED | ||
| 117 | - self.save | ||
| 118 | - end | ||
| 119 | - | ||
| 120 | - def can_be_merged? | ||
| 121 | - merge_status == CAN_BE_MERGED | ||
| 122 | - end | ||
| 123 | - | ||
| 124 | def check_if_can_be_merged | 103 | def check_if_can_be_merged |
| 125 | - self.merge_status = if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? | ||
| 126 | - CAN_BE_MERGED | ||
| 127 | - else | ||
| 128 | - CANNOT_BE_MERGED | ||
| 129 | - end | ||
| 130 | - self.save | 104 | + if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? |
| 105 | + mark_as_mergeable | ||
| 106 | + else | ||
| 107 | + mark_as_unmergeable | ||
| 108 | + end | ||
| 131 | end | 109 | end |
| 132 | 110 | ||
| 133 | def diffs | 111 | def diffs |
| @@ -182,11 +160,6 @@ class MergeRequest < ActiveRecord::Base | @@ -182,11 +160,6 @@ class MergeRequest < ActiveRecord::Base | ||
| 182 | commits.any? && opened? | 160 | commits.any? && opened? |
| 183 | end | 161 | end |
| 184 | 162 | ||
| 185 | - def mark_as_unmergable | ||
| 186 | - self.merge_status = CANNOT_BE_MERGED | ||
| 187 | - self.save | ||
| 188 | - end | ||
| 189 | - | ||
| 190 | def reloaded_commits | 163 | def reloaded_commits |
| 191 | if opened? && unmerged_commits.any? | 164 | if opened? && unmerged_commits.any? |
| 192 | self.st_commits = unmerged_commits | 165 | self.st_commits = unmerged_commits |
| @@ -221,7 +194,7 @@ class MergeRequest < ActiveRecord::Base | @@ -221,7 +194,7 @@ class MergeRequest < ActiveRecord::Base | ||
| 221 | true | 194 | true |
| 222 | end | 195 | end |
| 223 | rescue | 196 | rescue |
| 224 | - self.mark_as_unmergable | 197 | + mark_as_unmergeable |
| 225 | false | 198 | false |
| 226 | end | 199 | end |
| 227 | 200 |
app/models/project.rb
| @@ -321,7 +321,7 @@ class Project < ActiveRecord::Base | @@ -321,7 +321,7 @@ class Project < ActiveRecord::Base | ||
| 321 | c_ids = self.repository.commits_between(oldrev, newrev).map(&:id) | 321 | c_ids = self.repository.commits_between(oldrev, newrev).map(&:id) |
| 322 | 322 | ||
| 323 | # Update code for merge requests | 323 | # Update code for merge requests |
| 324 | - mrs = self.merge_requests.opened.find_all_by_branch(branch_name).all | 324 | + mrs = self.merge_requests.opened.by_branch(branch_name).all |
| 325 | mrs.each { |merge_request| merge_request.reload_code; merge_request.mark_as_unchecked } | 325 | mrs.each { |merge_request| merge_request.reload_code; merge_request.mark_as_unchecked } |
| 326 | 326 | ||
| 327 | # Close merge requests | 327 | # Close merge requests |
app/views/merge_requests/_show.html.haml
| @@ -29,10 +29,10 @@ | @@ -29,10 +29,10 @@ | ||
| 29 | $(function(){ | 29 | $(function(){ |
| 30 | merge_request = new MergeRequest({ | 30 | merge_request = new MergeRequest({ |
| 31 | url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}", | 31 | url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}", |
| 32 | - check_enable: #{@merge_request.merge_status == MergeRequest::UNCHECKED ? "true" : "false"}, | 32 | + check_enable: #{@merge_request.unchecked? ? "true" : "false"}, |
| 33 | url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}", | 33 | url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}", |
| 34 | ci_enable: #{@project.gitlab_ci? ? "true" : "false"}, | 34 | ci_enable: #{@project.gitlab_ci? ? "true" : "false"}, |
| 35 | - current_status: "#{@merge_request.human_merge_status}", | 35 | + current_status: "#{@merge_request.human_merge_status_name}", |
| 36 | action: "#{controller.action_name}" | 36 | action: "#{controller.action_name}" |
| 37 | }); | 37 | }); |
| 38 | }); | 38 | }); |
db/migrate/20130220124204_add_new_merge_status_to_merge_request.rb
0 → 100644
db/migrate/20130220125544_convert_merge_status_in_merge_request.rb
0 → 100644
| @@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
| 1 | +class ConvertMergeStatusInMergeRequest < ActiveRecord::Migration | ||
| 2 | + def up | ||
| 3 | + MergeRequest.transaction do | ||
| 4 | + MergeRequest.where(merge_status: 1).update_all("new_merge_status = 'unchecked'") | ||
| 5 | + MergeRequest.where(merge_status: 2).update_all("new_merge_status = 'can_be_merged'") | ||
| 6 | + MergeRequest.where(merge_status: 3).update_all("new_merge_status = 'cannot_be_merged'") | ||
| 7 | + end | ||
| 8 | + end | ||
| 9 | + | ||
| 10 | + def down | ||
| 11 | + MergeRequest.transaction do | ||
| 12 | + MergeRequest.where(new_merge_status: :unchecked).update_all("merge_status = 1") | ||
| 13 | + MergeRequest.where(new_merge_status: :can_be_merged).update_all("merge_status = 2") | ||
| 14 | + MergeRequest.where(new_merge_status: :cannot_be_merged).update_all("merge_status = 3") | ||
| 15 | + end | ||
| 16 | + end | ||
| 17 | +end |
db/migrate/20130220125545_remove_merge_status_from_merge_request.rb
0 → 100644
db/migrate/20130220133245_rename_new_merge_status_to_merge_status_in_milestone.rb
0 → 100644
db/schema.rb
| @@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
| 11 | # | 11 | # |
| 12 | # It's strongly recommended to check this file into your version control system. | 12 | # It's strongly recommended to check this file into your version control system. |
| 13 | 13 | ||
| 14 | -ActiveRecord::Schema.define(:version => 20130218141554) do | 14 | +ActiveRecord::Schema.define(:version => 20130220133245) do |
| 15 | 15 | ||
| 16 | create_table "events", :force => true do |t| | 16 | create_table "events", :force => true do |t| |
| 17 | t.string "target_type" | 17 | t.string "target_type" |
| @@ -68,19 +68,19 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | @@ -68,19 +68,19 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | ||
| 68 | add_index "keys", ["user_id"], :name => "index_keys_on_user_id" | 68 | add_index "keys", ["user_id"], :name => "index_keys_on_user_id" |
| 69 | 69 | ||
| 70 | create_table "merge_requests", :force => true do |t| | 70 | create_table "merge_requests", :force => true do |t| |
| 71 | - t.string "target_branch", :null => false | ||
| 72 | - t.string "source_branch", :null => false | ||
| 73 | - t.integer "project_id", :null => false | 71 | + t.string "target_branch", :null => false |
| 72 | + t.string "source_branch", :null => false | ||
| 73 | + t.integer "project_id", :null => false | ||
| 74 | t.integer "author_id" | 74 | t.integer "author_id" |
| 75 | t.integer "assignee_id" | 75 | t.integer "assignee_id" |
| 76 | t.string "title" | 76 | t.string "title" |
| 77 | - t.datetime "created_at", :null => false | ||
| 78 | - t.datetime "updated_at", :null => false | 77 | + t.datetime "created_at", :null => false |
| 78 | + t.datetime "updated_at", :null => false | ||
| 79 | t.text "st_commits", :limit => 2147483647 | 79 | t.text "st_commits", :limit => 2147483647 |
| 80 | t.text "st_diffs", :limit => 2147483647 | 80 | t.text "st_diffs", :limit => 2147483647 |
| 81 | - t.integer "merge_status", :default => 1, :null => false | ||
| 82 | t.integer "milestone_id" | 81 | t.integer "milestone_id" |
| 83 | t.string "state" | 82 | t.string "state" |
| 83 | + t.string "merge_status" | ||
| 84 | end | 84 | end |
| 85 | 85 | ||
| 86 | add_index "merge_requests", ["assignee_id"], :name => "index_merge_requests_on_assignee_id" | 86 | add_index "merge_requests", ["assignee_id"], :name => "index_merge_requests_on_assignee_id" |
| @@ -106,11 +106,11 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | @@ -106,11 +106,11 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | ||
| 106 | add_index "milestones", ["project_id"], :name => "index_milestones_on_project_id" | 106 | add_index "milestones", ["project_id"], :name => "index_milestones_on_project_id" |
| 107 | 107 | ||
| 108 | create_table "namespaces", :force => true do |t| | 108 | create_table "namespaces", :force => true do |t| |
| 109 | - t.string "name", :null => false | ||
| 110 | - t.string "path", :null => false | ||
| 111 | - t.integer "owner_id", :null => false | ||
| 112 | - t.datetime "created_at", :null => false | ||
| 113 | - t.datetime "updated_at", :null => false | 109 | + t.string "name", :null => false |
| 110 | + t.string "path", :null => false | ||
| 111 | + t.integer "owner_id", :null => false | ||
| 112 | + t.datetime "created_at", :null => false | ||
| 113 | + t.datetime "updated_at", :null => false | ||
| 114 | t.string "type" | 114 | t.string "type" |
| 115 | end | 115 | end |
| 116 | 116 | ||
| @@ -142,16 +142,16 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | @@ -142,16 +142,16 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | ||
| 142 | t.string "name" | 142 | t.string "name" |
| 143 | t.string "path" | 143 | t.string "path" |
| 144 | t.text "description" | 144 | t.text "description" |
| 145 | - t.datetime "created_at", :null => false | ||
| 146 | - t.datetime "updated_at", :null => false | 145 | + t.datetime "created_at", :null => false |
| 146 | + t.datetime "updated_at", :null => false | ||
| 147 | t.integer "creator_id" | 147 | t.integer "creator_id" |
| 148 | t.string "default_branch" | 148 | t.string "default_branch" |
| 149 | - t.boolean "issues_enabled", :default => true, :null => false | ||
| 150 | - t.boolean "wall_enabled", :default => true, :null => false | ||
| 151 | - t.boolean "merge_requests_enabled", :default => true, :null => false | ||
| 152 | - t.boolean "wiki_enabled", :default => true, :null => false | 149 | + t.boolean "issues_enabled", :default => true, :null => false |
| 150 | + t.boolean "wall_enabled", :default => true, :null => false | ||
| 151 | + t.boolean "merge_requests_enabled", :default => true, :null => false | ||
| 152 | + t.boolean "wiki_enabled", :default => true, :null => false | ||
| 153 | t.integer "namespace_id" | 153 | t.integer "namespace_id" |
| 154 | - t.boolean "public", :default => false, :null => false | 154 | + t.boolean "public", :default => false, :null => false |
| 155 | end | 155 | end |
| 156 | 156 | ||
| 157 | add_index "projects", ["creator_id"], :name => "index_projects_on_owner_id" | 157 | add_index "projects", ["creator_id"], :name => "index_projects_on_owner_id" |
| @@ -230,8 +230,8 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | @@ -230,8 +230,8 @@ ActiveRecord::Schema.define(:version => 20130218141554) do | ||
| 230 | t.string "name" | 230 | t.string "name" |
| 231 | t.string "path" | 231 | t.string "path" |
| 232 | t.integer "owner_id" | 232 | t.integer "owner_id" |
| 233 | - t.datetime "created_at", :null => false | ||
| 234 | - t.datetime "updated_at", :null => false | 233 | + t.datetime "created_at", :null => false |
| 234 | + t.datetime "updated_at", :null => false | ||
| 235 | end | 235 | end |
| 236 | 236 | ||
| 237 | create_table "users", :force => true do |t| | 237 | create_table "users", :force => true do |t| |
spec/models/merge_request_spec.rb
| @@ -32,6 +32,12 @@ describe MergeRequest do | @@ -32,6 +32,12 @@ describe MergeRequest do | ||
| 32 | it { should_not allow_mass_assignment_of(:project_id) } | 32 | it { should_not allow_mass_assignment_of(:project_id) } |
| 33 | end | 33 | end |
| 34 | 34 | ||
| 35 | + describe "Respond to" do | ||
| 36 | + it { should respond_to(:unchecked?) } | ||
| 37 | + it { should respond_to(:can_be_merged?) } | ||
| 38 | + it { should respond_to(:cannot_be_merged?) } | ||
| 39 | + end | ||
| 40 | + | ||
| 35 | describe 'modules' do | 41 | describe 'modules' do |
| 36 | it { should include_module(Issuable) } | 42 | it { should include_module(Issuable) } |
| 37 | end | 43 | end |