diff options
| author | lulalala <mark@goodlife.tw> | 2018-03-28 11:20:12 +0800 |
|---|---|---|
| committer | Mark Chao <mchao@gitlab.com> | 2018-05-17 08:54:47 +0800 |
| commit | 7517105303c264484d8677c81268f9f43ecc5593 (patch) | |
| tree | d8d51563e2e99154f6b768744c1b079d79a2414f /app | |
| parent | bf669717a86e9bbe87ba1f97d4433b79081d2b97 (diff) | |
| download | gitlab-ce-7517105303c264484d8677c81268f9f43ecc5593.tar.gz | |
Add cannot_be_merged_recheck merge_status
First, transitions between can_be_merged & cannot_be_merged are removed,
as they are currently blocked in `check_if_can_be_merged`.
`can_be_merge` always returns to `unchecked` first,
before it can transition to `cannot_be_merged` (and vice versa).
We want to avoid repeated notification triggered by repeated transition
between `cannot_be_merged` & `unchecked`.
So we added `cannot_be_merged_recheck` state, similar to `unchecked`,
but as a mean to remember it’s from cannot_be_merged.
See https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/18042/#note_65945407
Since `unchecked` and `cannot_be_merged_recheck` both mean
“we are in the middle of checking if it is mergeable”,
quite often we need to see if merge_status is in either one of them,
so `check_state?` is added to achieve this.
Diffstat (limited to 'app')
| -rw-r--r-- | app/models/merge_request.rb | 14 | ||||
| -rw-r--r-- | app/models/project_services/drone_ci_service.rb | 2 |
2 files changed, 11 insertions, 5 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 628c61d5d69..ea5057c2a78 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -104,24 +104,30 @@ class MergeRequest < ActiveRecord::Base state_machine :merge_status, initial: :unchecked do event :mark_as_unchecked do - transition [:can_be_merged, :cannot_be_merged] => :unchecked + transition [:can_be_merged] => :unchecked + transition [:cannot_be_merged] => :cannot_be_merged_recheck end event :mark_as_mergeable do - transition [:unchecked, :cannot_be_merged] => :can_be_merged + transition [:unchecked, :cannot_be_merged_recheck] => :can_be_merged end event :mark_as_unmergeable do - transition [:unchecked, :can_be_merged] => :cannot_be_merged + transition [:unchecked, :cannot_be_merged_recheck] => :cannot_be_merged end state :unchecked + state :cannot_be_merged_recheck state :can_be_merged state :cannot_be_merged around_transition do |merge_request, transition, block| Gitlab::Timeless.timeless(merge_request, &block) end + + def check_state?(merge_status) + [:unchecked, :cannot_be_merged_recheck].include?(merge_status.to_sym) + end end validates :source_project, presence: true, unless: [:allow_broken, :importing?, :closed_without_fork?] @@ -602,7 +608,7 @@ class MergeRequest < ActiveRecord::Base end def check_if_can_be_merged - return unless unchecked? && Gitlab::Database.read_write? + return unless self.class.state_machines[:merge_status].check_state?(merge_status) && Gitlab::Database.read_write? can_be_merged = !broken? && project.repository.can_be_merged?(diff_head_sha, target_branch) diff --git a/app/models/project_services/drone_ci_service.rb b/app/models/project_services/drone_ci_service.rb index 71b10fc6bc1..a4bf427ac0b 100644 --- a/app/models/project_services/drone_ci_service.rb +++ b/app/models/project_services/drone_ci_service.rb @@ -115,6 +115,6 @@ class DroneCiService < CiService def merge_request_valid?(data) data[:object_attributes][:state] == 'opened' && - data[:object_attributes][:merge_status] == 'unchecked' + MergeRequest.state_machines[:merge_status].check_state?(data[:object_attributes][:merge_status]) end end |
