summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortwonegatives <whitewhiteheaven@gmail.com>2016-12-14 17:37:31 +0300
committertwonegatives <whitewhiteheaven@gmail.com>2017-01-14 12:22:30 +0300
commit85e0b99471b58078e1e50494ae26eb13430d3a9f (patch)
treedf3d2fdb18a1b315cf77fdd9536bd99046d5313a
parentf14228f0f2f69a967c483e4aa4ef1568e5fdc49b (diff)
downloadgitlab-ce-85e0b99471b58078e1e50494ae26eb13430d3a9f.tar.gz
Notify the user who set auto-merge when merge conflict occurs
-rw-r--r--app/helpers/todos_helper.rb1
-rw-r--r--app/models/merge_request.rb4
-rw-r--r--app/models/todo.rb8
-rw-r--r--app/services/todo_service.rb15
-rw-r--r--app/views/dashboard/todos/_todo.html.haml2
-rw-r--r--changelogs/unreleased/23524-notify-automerge-user-of-failed-build.yml6
-rw-r--r--spec/factories/todos.rb4
-rw-r--r--spec/models/merge_request_spec.rb10
-rw-r--r--spec/services/todo_service_spec.rb9
9 files changed, 52 insertions, 7 deletions
diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb
index 3c039b43f5d..56c05cb54e6 100644
--- a/app/helpers/todos_helper.rb
+++ b/app/helpers/todos_helper.rb
@@ -14,6 +14,7 @@ module TodosHelper
when Todo::BUILD_FAILED then 'The build failed for'
when Todo::MARKED then 'added a todo for'
when Todo::APPROVAL_REQUIRED then 'set you as an approver for'
+ when Todo::UNMERGEABLE then 'Could not merge'
end
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index b73d7acefea..22a3a5fe42e 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -91,6 +91,10 @@ class MergeRequest < ActiveRecord::Base
around_transition do |merge_request, transition, block|
Gitlab::Timeless.timeless(merge_request, &block)
end
+
+ after_transition unchecked: :cannot_be_merged do |merge_request, transition|
+ TodoService.new.merge_request_became_unmergeable(merge_request)
+ end
end
validates :source_project, presence: true, unless: [:allow_broken, :importing?, :closed_without_fork?]
diff --git a/app/models/todo.rb b/app/models/todo.rb
index f5ade1cc293..4c99aa0d3be 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -6,13 +6,15 @@ class Todo < ActiveRecord::Base
BUILD_FAILED = 3
MARKED = 4
APPROVAL_REQUIRED = 5 # This is an EE-only feature
+ UNMERGEABLE = 6
ACTION_NAMES = {
ASSIGNED => :assigned,
MENTIONED => :mentioned,
BUILD_FAILED => :build_failed,
MARKED => :marked,
- APPROVAL_REQUIRED => :approval_required
+ APPROVAL_REQUIRED => :approval_required,
+ UNMERGEABLE => :unmergeable
}
belongs_to :author, class_name: "User"
@@ -66,6 +68,10 @@ class Todo < ActiveRecord::Base
end
end
+ def unmergeable?
+ action == UNMERGEABLE
+ end
+
def build_failed?
action == BUILD_FAILED
end
diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb
index d67c166275a..1bd6ce416ab 100644
--- a/app/services/todo_service.rb
+++ b/app/services/todo_service.rb
@@ -123,7 +123,15 @@ class TodoService
mark_pending_todos_as_done(merge_request, merge_request.author)
mark_pending_todos_as_done(merge_request, merge_request.merge_user) if merge_request.merge_when_build_succeeds?
end
-
+
+ # When a merge request could not be automatically merged due to its unmergeable state we should:
+ #
+ # * create a todo for a merge_user
+ #
+ def merge_request_became_unmergeable(merge_request)
+ create_unmergeable_todo(merge_request, merge_request.merge_user) if merge_request.merge_when_build_succeeds?
+ end
+
# When create a note we should:
#
# * mark all pending todos related to the noteable for the note author as done
@@ -245,6 +253,11 @@ class TodoService
create_todos(todo_author, attributes)
end
+ def create_unmergeable_todo(merge_request, merge_user)
+ attributes = attributes_for_todo(merge_request.project, merge_request, merge_user, Todo::UNMERGEABLE)
+ create_todos(merge_user, attributes)
+ end
+
def attributes_for_target(target)
attributes = {
project_id: target.project.id,
diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml
index cc077fad32a..7fe175c1419 100644
--- a/app/views/dashboard/todos/_todo.html.haml
+++ b/app/views/dashboard/todos/_todo.html.haml
@@ -3,7 +3,7 @@
.todo-item.todo-block
.todo-title.title
- - unless todo.build_failed?
+ - unless todo.build_failed? || todo.unmergeable?
= todo_target_state_pill(todo)
%span.author-name
diff --git a/changelogs/unreleased/23524-notify-automerge-user-of-failed-build.yml b/changelogs/unreleased/23524-notify-automerge-user-of-failed-build.yml
index 4b6f9d1efe9..268be6b9b83 100644
--- a/changelogs/unreleased/23524-notify-automerge-user-of-failed-build.yml
+++ b/changelogs/unreleased/23524-notify-automerge-user-of-failed-build.yml
@@ -1,4 +1,4 @@
---
-title: Create a TODO for user who set auto-merge when a build fails
-merge_request:
-author:
+title: Create a TODO for user who set auto-merge when a build fails, merge conflict occurs
+merge_request: 8056
+author: twonegatives
diff --git a/spec/factories/todos.rb b/spec/factories/todos.rb
index 866e663f026..dc247e2d96d 100644
--- a/spec/factories/todos.rb
+++ b/spec/factories/todos.rb
@@ -27,6 +27,10 @@ FactoryGirl.define do
action { Todo::APPROVAL_REQUIRED }
end
+ trait :unmergeable do
+ action { Todo::UNMERGEABLE }
+ end
+
trait :done do
state :done
end
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 1b71d00eb8f..59e629edf4c 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -740,10 +740,12 @@ describe MergeRequest, models: true do
subject { create(:merge_request, source_project: project, merge_status: :unchecked) }
context 'when it is not broken and has no conflicts' do
- it 'is marked as mergeable' do
+ before do
allow(subject).to receive(:broken?) { false }
allow(project.repository).to receive(:can_be_merged?).and_return(true)
+ end
+ it 'is marked as mergeable' do
expect { subject.check_if_can_be_merged }.to change { subject.merge_status }.to('can_be_merged')
end
end
@@ -754,6 +756,12 @@ describe MergeRequest, models: true do
it 'becomes unmergeable' do
expect { subject.check_if_can_be_merged }.to change { subject.merge_status }.to('cannot_be_merged')
end
+
+ it 'creates Todo on unmergeability' do
+ expect_any_instance_of(TodoService).to receive(:merge_request_became_unmergeable).with(subject)
+
+ subject.check_if_can_be_merged
+ end
end
context 'when it has conflicts' do
diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb
index d8a9ca20b36..13d584a8975 100644
--- a/spec/services/todo_service_spec.rb
+++ b/spec/services/todo_service_spec.rb
@@ -489,6 +489,15 @@ describe TodoService, services: true do
end
end
+ describe '#merge_request_became_unmergeable' do
+ it 'creates a pending todo for a merge_user' do
+ mr_unassigned.update(merge_when_build_succeeds: true, merge_user: admin)
+ service.merge_request_became_unmergeable(mr_unassigned)
+
+ should_create_todo(user: admin, author: admin, target: mr_unassigned, action: Todo::UNMERGEABLE)
+ end
+ end
+
describe '#mark_todo' do
it 'creates a todo from a merge request' do
service.mark_todo(mr_unassigned, author)