Skip to content
Snippets Groups Projects
Commit e8c72354 authored by Baldinof's avatar Baldinof
Browse files

Close merge requests when removing fork relation

parent 29ac9f64
No related branches found
No related tags found
1 merge request!3189Remove fork link closes all merge requests opened on source project
Loading
@@ -26,6 +26,7 @@ v 8.6.0 (unreleased)
Loading
@@ -26,6 +26,7 @@ v 8.6.0 (unreleased)
- Show labels in dashboard and group milestone views - Show labels in dashboard and group milestone views
- Add main language of a project in the list of projects (Tiago Botelho) - Add main language of a project in the list of projects (Tiago Botelho)
- Add ability to show archived projects on dashboard, explore and group pages - Add ability to show archived projects on dashboard, explore and group pages
- Remove fork link closes all merge requests opened on source project (Florent Baldino)
   
v 8.5.5 v 8.5.5
- Ensure removing a project removes associated Todo entries - Ensure removing a project removes associated Todo entries
Loading
Loading
Loading
@@ -72,7 +72,7 @@ class ProjectsController < ApplicationController
Loading
@@ -72,7 +72,7 @@ class ProjectsController < ApplicationController
def remove_fork def remove_fork
return access_denied! unless can?(current_user, :remove_fork_project, @project) return access_denied! unless can?(current_user, :remove_fork_project, @project)
   
if @project.unlink_fork if @project.unlink_fork(current_user)
flash[:notice] = 'The fork relationship has been removed.' flash[:notice] = 'The fork relationship has been removed.'
end end
end end
Loading
Loading
Loading
@@ -137,6 +137,7 @@ class MergeRequest < ActiveRecord::Base
Loading
@@ -137,6 +137,7 @@ class MergeRequest < ActiveRecord::Base
scope :by_milestone, ->(milestone) { where(milestone_id: milestone) } scope :by_milestone, ->(milestone) { where(milestone_id: milestone) }
scope :in_projects, ->(project_ids) { where("source_project_id in (:project_ids) OR target_project_id in (:project_ids)", project_ids: project_ids) } scope :in_projects, ->(project_ids) { where("source_project_id in (:project_ids) OR target_project_id in (:project_ids)", project_ids: project_ids) }
scope :of_projects, ->(ids) { where(target_project_id: ids) } 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 :merged, -> { with_state(:merged) }
scope :closed_and_merged, -> { with_states(:closed, :merged) } scope :closed_and_merged, -> { with_states(:closed, :merged) }
   
Loading
Loading
Loading
@@ -890,12 +890,22 @@ class Project < ActiveRecord::Base
Loading
@@ -890,12 +890,22 @@ class Project < ActiveRecord::Base
self.builds_enabled = true self.builds_enabled = true
end end
   
def unlink_fork def unlink_fork(user)
if forked? if forked?
forked_from_project.lfs_objects.find_each do |lfs_object| forked_from_project.lfs_objects.find_each do |lfs_object|
lfs_object.projects << self lfs_object.projects << self
end end
   
merge_requests = forked_from_project.merge_requests.opened.from_project(self)
unless merge_requests.empty?
close_service = MergeRequests::CloseService.new(self, user)
merge_requests.each do |mr|
close_service.execute(mr)
end
end
forked_project_link.destroy forked_project_link.destroy
end end
end end
Loading
Loading
Loading
@@ -647,4 +647,23 @@ describe Project, models: true do
Loading
@@ -647,4 +647,23 @@ describe Project, models: true do
project.expire_caches_before_rename('foo') project.expire_caches_before_rename('foo')
end end
end end
describe '#unlink_fork' do
let(:fork_link) { create(:forked_project_link) }
let(:fork_project) { fork_link.forked_to_project }
let(:user) { create(:user) }
let(:merge_request) { create(:merge_request, source_project: fork_project, target_project: fork_link.forked_from_project) }
let!(:close_service) { MergeRequests::CloseService.new(fork_project, user) }
it 'remove fork relation and close all pending merge requests' do
allow(MergeRequests::CloseService).to receive(:new).
with(fork_project, user).
and_return(close_service)
expect(close_service).to receive(:execute).with(merge_request)
expect(fork_project.forked_project_link).to receive(:destroy)
fork_project.unlink_fork(user)
end
end
end end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment