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

If a fork is given, it:

  • Saves LFS objects to the root project

  • Close existing MRs coming from it

  • Is removed from the fork network

If a root of fork(s) is given, it does the same, but not updating LFS objects (there'll be no related root to cache it).


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
40
41
42
43
44
45
46
47
# File 'app/services/projects/unlink_fork_service.rb', line 13

def execute
  fork_network = @project.fork_network

  return unless fork_network

  save_lfs_objects

  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.
  [@project.forked_from_project, @project].compact.each do |project|
    refresh_forks_count(project)
  end
end