summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2016-04-04 15:37:08 +0000
committerDouwe Maan <douwe@gitlab.com>2016-04-04 15:37:08 +0000
commitf505c753b02a7a0b41cc42a85ac15017af4ed86f (patch)
treed1ea34378c2fcf74db0c0b1937f14d3df84d4ff4 /app
parent5e8740eef01ff5263a8b75a96d2109dfae2c63c0 (diff)
parenta6b5b50e14885a82530794c6ea35c940305244dd (diff)
downloadgitlab-ce-f505c753b02a7a0b41cc42a85ac15017af4ed86f.tar.gz
Merge branch 'fix_remove_fork_link' into 'master'
Remove fork link closes all merge requests opened on source project Currently, if you: - create a fork - open a merge request on the source project - remove the fork link The created MR cannot be closed. With this MR, all pending MR is closed when the fork link is removed. See merge request !3189
Diffstat (limited to 'app')
-rw-r--r--app/controllers/projects_controller.rb2
-rw-r--r--app/models/merge_request.rb1
-rw-r--r--app/models/project.rb10
-rw-r--r--app/services/projects/unlink_fork_service.rb19
4 files changed, 21 insertions, 11 deletions
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 62f53664db3..8c3a74c8236 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -71,7 +71,7 @@ class ProjectsController < Projects::ApplicationController
def remove_fork
return access_denied! unless can?(current_user, :remove_fork_project, @project)
- if @project.unlink_fork
+ if ::Projects::UnlinkForkService.new(@project, current_user).execute
flash[:notice] = 'The fork relationship has been removed.'
end
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 45c3b0a3a66..bf185cb5dd8 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -135,6 +135,7 @@ class MergeRequest < ActiveRecord::Base
scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) }
scope :by_milestone, ->(milestone) { where(milestone_id: milestone) }
scope :of_projects, ->(ids) { where(target_project_id: ids) }
+ scope :from_project, ->(project) { where(source_project_id: project.id) }
scope :merged, -> { with_state(:merged) }
scope :closed_and_merged, -> { with_states(:closed, :merged) }
diff --git a/app/models/project.rb b/app/models/project.rb
index c5022fd4ffc..3e1f04b4158 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -931,16 +931,6 @@ class Project < ActiveRecord::Base
self.builds_enabled = true
end
- def unlink_fork
- if forked?
- forked_from_project.lfs_objects.find_each do |lfs_object|
- lfs_object.projects << self
- end
-
- forked_project_link.destroy
- end
- end
-
def any_runners?(&block)
if runners.active.any?(&block)
return true
diff --git a/app/services/projects/unlink_fork_service.rb b/app/services/projects/unlink_fork_service.rb
new file mode 100644
index 00000000000..315c3e16292
--- /dev/null
+++ b/app/services/projects/unlink_fork_service.rb
@@ -0,0 +1,19 @@
+module Projects
+ class UnlinkForkService < BaseService
+ def execute
+ return unless @project.forked?
+
+ @project.forked_from_project.lfs_objects.find_each do |lfs_object|
+ lfs_object.projects << @project
+ end
+
+ merge_requests = @project.forked_from_project.merge_requests.opened.from_project(@project)
+
+ merge_requests.each do |mr|
+ MergeRequests::CloseService.new(@project, @current_user).execute(mr)
+ end
+
+ @project.forked_project_link.destroy
+ end
+ end
+end