Class: Projects::UnlinkForkService

Inherits:
BaseService show all
Defined in:
app/services/projects/unlink_fork_service.rb

Instance Attribute Summary

Attributes inherited from BaseService

#current_user, #params, #project

Instance Method Summary collapse

Methods inherited from BaseService

#initialize

Methods included from BaseServiceUtility

#deny_visibility_level, #event_service, #log_error, #log_info, #notification_service, #system_hook_service, #todo_service, #visibility_level

Methods included from Gitlab::Allowable

#can?

Constructor Details

This class inherits a constructor from BaseService

Instance Method Details

#executeObject

Close existing MRs coming from the project and remove it from the fork network


6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/services/projects/unlink_fork_service.rb', line 6

def execute
  fork_network = @project.fork_network
  forked_from = @project.forked_from_project

  return unless fork_network

  merge_requests = fork_network
                     .merge_requests
                     .opened
                     .from_and_to_forks(@project)

  merge_requests.find_each do |mr|
    ::MergeRequests::CloseService.new(@project, @current_user).execute(mr)
  end

  Project.transaction do
    # Get out of the fork network as a member and
    # remove references from all its direct forks.
    @project.fork_network_member.destroy
    @project.forked_to_members.update_all(forked_from_project_id: nil)

    # The project is not necessarily a fork, so update the fork network originating
    # from this project
    if fork_network = @project.root_of_fork_network
      fork_network.update(root_project: nil, deleted_root_project_name: @project.full_name)
    end
  end

  # When the project getting out of the network is a node with parent
  # and children, both the parent and the node needs a cache refresh.
  [forked_from, @project].compact.each do |project|
    refresh_forks_count(project)
  end
end