OSDN Git Service

State machine added for merge_status field
authorAndrew8xx8 <avk@8xx8.ru>
Wed, 20 Feb 2013 13:15:01 +0000 (17:15 +0400)
committerAndrew8xx8 <avk@8xx8.ru>
Wed, 20 Feb 2013 13:49:48 +0000 (17:49 +0400)
app/models/merge_request.rb
app/views/merge_requests/_show.html.haml
spec/models/merge_request_spec.rb

index 06aa9f3..05ebf44 100644 (file)
@@ -53,16 +53,32 @@ class MergeRequest < ActiveRecord::Base
 
   BROKEN_DIFF = "--broken-diff"
 
-  UNCHECKED = 1
-  CAN_BE_MERGED = 2
-  CANNOT_BE_MERGED = 3
+  state_machine :merge_status, initial: :unchecked do
+    event :mark_as_unchecked do
+      transition [:can_be_merged, :cannot_be_merged] => :unchecked
+    end
+
+    event :mark_as_mergeable do
+      transition unchecked: :can_be_merged
+    end
+
+    event :mark_as_unmergeable do
+      transition unchecked: :cannot_be_merged
+    end
+
+    state :unchecked 
+
+    state :can_be_merged
+
+    state :cannot_be_merged
+  end
 
   serialize :st_commits
   serialize :st_diffs
 
   validates :source_branch, presence: true
   validates :target_branch, presence: true
-  validate :validate_branches
+  validate  :validate_branches
 
   scope :merged, -> { with_state(:merged) }
 
@@ -84,13 +100,9 @@ class MergeRequest < ActiveRecord::Base
     end
   end
 
+  # DEPRECATED: Please use human_merge_status_name instead
   def human_merge_status
-    merge_statuses = {
-      CAN_BE_MERGED =>  "can_be_merged",
-      CANNOT_BE_MERGED => "cannot_be_merged",
-      UNCHECKED => "unchecked"
-    }
-    merge_statuses[self.merge_status]
+    human_merge_status_name
   end
 
   def validate_branches
@@ -104,26 +116,12 @@ class MergeRequest < ActiveRecord::Base
     self.reloaded_diffs
   end
 
-  def unchecked?
-    merge_status == UNCHECKED
-  end
-
-  def mark_as_unchecked
-    self.merge_status = UNCHECKED
-    self.save
-  end
-
-  def can_be_merged?
-    merge_status == CAN_BE_MERGED
-  end
-
   def check_if_can_be_merged
-    self.merge_status = if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged?
-                   CAN_BE_MERGED
-                 else
-                   CANNOT_BE_MERGED
-                 end
-    self.save
+    if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged?
+      mark_as_mergeable
+    else
+      mark_as_unmergeable
+    end
   end
 
   def diffs
@@ -178,11 +176,6 @@ class MergeRequest < ActiveRecord::Base
       commits.any? && opened?
   end
 
-  def mark_as_unmergable
-    self.merge_status = CANNOT_BE_MERGED
-    self.save
-  end
-
   def reloaded_commits
     if opened? && unmerged_commits.any?
       self.st_commits = unmerged_commits
@@ -217,7 +210,7 @@ class MergeRequest < ActiveRecord::Base
       true
     end
   rescue
-    self.mark_as_unmergable
+    mark_as_unmergeable
     false
   end
 
index ae2cfe9..b1e282a 100644 (file)
@@ -29,7 +29,7 @@
   $(function(){
     merge_request = new MergeRequest({
       url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
-      check_enable: #{@merge_request.merge_status == MergeRequest::UNCHECKED ? "true" : "false"},
+      check_enable: #{@merge_request.unchecked? ? "true" : "false"},
       url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}",
       ci_enable: #{@project.gitlab_ci? ? "true" : "false"},
       current_status: "#{@merge_request.human_merge_status}",
index e61bf44..dbae019 100644 (file)
@@ -32,6 +32,12 @@ describe MergeRequest do
     it { should_not allow_mass_assignment_of(:project_id) }
   end
 
+  describe "Respond to" do
+    it { should respond_to(:unchecked?) }
+    it { should respond_to(:can_be_merged?) }
+    it { should respond_to(:cannot_be_merged?) }
+  end
   describe 'modules' do
     it { should include_module(Issuable) }
   end