Commit e2d94e0719cb4eed4757f4cef946b1c29ef971f0

Authored by Andrew8xx8
1 parent 1b7b17d1

State machine added for merge_status field

app/models/merge_request.rb
... ... @@ -53,16 +53,32 @@ class MergeRequest < ActiveRecord::Base
53 53  
54 54 BROKEN_DIFF = "--broken-diff"
55 55  
56   - UNCHECKED = 1
57   - CAN_BE_MERGED = 2
58   - CANNOT_BE_MERGED = 3
  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
  70 +
  71 + state :can_be_merged
  72 +
  73 + state :cannot_be_merged
  74 + end
59 75  
60 76 serialize :st_commits
61 77 serialize :st_diffs
62 78  
63 79 validates :source_branch, presence: true
64 80 validates :target_branch, presence: true
65   - validate :validate_branches
  81 + validate :validate_branches
66 82  
67 83 scope :merged, -> { with_state(:merged) }
68 84  
... ... @@ -84,13 +100,9 @@ class MergeRequest < ActiveRecord::Base
84 100 end
85 101 end
86 102  
  103 + # DEPRECATED: Please use human_merge_status_name instead
87 104 def human_merge_status
88   - merge_statuses = {
89   - CAN_BE_MERGED => "can_be_merged",
90   - CANNOT_BE_MERGED => "cannot_be_merged",
91   - UNCHECKED => "unchecked"
92   - }
93   - merge_statuses[self.merge_status]
  105 + human_merge_status_name
94 106 end
95 107  
96 108 def validate_branches
... ... @@ -104,26 +116,12 @@ class MergeRequest < ActiveRecord::Base
104 116 self.reloaded_diffs
105 117 end
106 118  
107   - def unchecked?
108   - merge_status == UNCHECKED
109   - end
110   -
111   - def mark_as_unchecked
112   - self.merge_status = UNCHECKED
113   - self.save
114   - end
115   -
116   - def can_be_merged?
117   - merge_status == CAN_BE_MERGED
118   - end
119   -
120 119 def check_if_can_be_merged
121   - self.merge_status = if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged?
122   - CAN_BE_MERGED
123   - else
124   - CANNOT_BE_MERGED
125   - end
126   - self.save
  120 + if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged?
  121 + mark_as_mergeable
  122 + else
  123 + mark_as_unmergeable
  124 + end
127 125 end
128 126  
129 127 def diffs
... ... @@ -178,11 +176,6 @@ class MergeRequest < ActiveRecord::Base
178 176 commits.any? && opened?
179 177 end
180 178  
181   - def mark_as_unmergable
182   - self.merge_status = CANNOT_BE_MERGED
183   - self.save
184   - end
185   -
186 179 def reloaded_commits
187 180 if opened? && unmerged_commits.any?
188 181 self.st_commits = unmerged_commits
... ... @@ -217,7 +210,7 @@ class MergeRequest < ActiveRecord::Base
217 210 true
218 211 end
219 212 rescue
220   - self.mark_as_unmergable
  213 + mark_as_unmergeable
221 214 false
222 215 end
223 216  
... ...
app/views/merge_requests/_show.html.haml
... ... @@ -29,7 +29,7 @@
29 29 $(function(){
30 30 merge_request = new MergeRequest({
31 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 33 url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}",
34 34 ci_enable: #{@project.gitlab_ci? ? "true" : "false"},
35 35 current_status: "#{@merge_request.human_merge_status}",
... ...
spec/models/merge_request_spec.rb
... ... @@ -32,6 +32,12 @@ describe MergeRequest do
32 32 it { should_not allow_mass_assignment_of(:project_id) }
33 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 41 describe 'modules' do
36 42 it { should include_module(Issuable) }
37 43 end
... ...