summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaldinof <baldinof@gmail.com>2016-03-22 15:34:35 +0100
committerBaldinof <baldinof@gmail.com>2016-03-22 15:34:35 +0100
commitfa4126acffdfe13741e05a60ad5ed7fd407b4f16 (patch)
treeb7f7e6e49d851c947426684def13c593896f0c70
parent436caf4e8b7beb8cb61bb1045273488477841880 (diff)
downloadgitlab-ce-fa4126acffdfe13741e05a60ad5ed7fd407b4f16.tar.gz
Move unlink fork logic to a service
-rw-r--r--app/controllers/projects_controller.rb2
-rw-r--r--app/models/project.rb20
-rw-r--r--app/services/projects/unlink_fork_service.rb19
-rw-r--r--spec/models/project_spec.rb19
-rw-r--r--spec/services/projects/unlink_fork_service_spec.rb32
5 files changed, 52 insertions, 40 deletions
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 94789702d65..87657e4e3d2 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -71,7 +71,7 @@ class ProjectsController < ApplicationController
def remove_fork
return access_denied! unless can?(current_user, :remove_fork_project, @project)
- if @project.unlink_fork(current_user)
+ if ::Projects::UnlinkForkService.new(@project, current_user).execute
flash[:notice] = 'The fork relationship has been removed.'
end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 8d9908128e2..691b706ea40 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -917,26 +917,6 @@ class Project < ActiveRecord::Base
self.builds_enabled = true
end
- def unlink_fork(user)
- if forked?
- forked_from_project.lfs_objects.find_each do |lfs_object|
- lfs_object.projects << self
- 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
- 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..d0703effa1d
--- /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 << self
+ 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
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 1ca78daa5b3..59c5ffa6b9c 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -699,25 +699,6 @@ describe Project, models: true do
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
-
describe '.search_by_title' do
let(:project) { create(:project, name: 'kittens') }
diff --git a/spec/services/projects/unlink_fork_service_spec.rb b/spec/services/projects/unlink_fork_service_spec.rb
new file mode 100644
index 00000000000..f287b0a59b2
--- /dev/null
+++ b/spec/services/projects/unlink_fork_service_spec.rb
@@ -0,0 +1,32 @@
+require 'spec_helper'
+
+describe Projects::UnlinkForkService, services: true do
+ subject { Projects::UnlinkForkService.new(fork_project, user) }
+
+ let(:fork_link) { create(:forked_project_link) }
+ let(:fork_project) { fork_link.forked_to_project }
+ let(:user) { create(:user) }
+
+ context 'with opened merge request on the source project' do
+ let(:merge_request) { create(:merge_request, source_project: fork_project, target_project: fork_link.forked_from_project) }
+ let(:mr_close_service) { MergeRequests::CloseService.new(fork_project, user) }
+
+ before do
+ allow(MergeRequests::CloseService).to receive(:new).
+ with(fork_project, user).
+ and_return(mr_close_service)
+ end
+
+ it 'close all pending merge requests' do
+ expect(mr_close_service).to receive(:execute).with(merge_request)
+
+ subject.execute
+ end
+ end
+
+ it 'remove fork relation' do
+ expect(fork_project.forked_project_link).to receive(:destroy)
+
+ subject.execute
+ end
+end