Class: Projects::AfterRenameService

Inherits:
Object
  • Object
show all
Includes:
BaseServiceUtility
Defined in:
app/services/projects/after_rename_service.rb

Overview

Service class for performing operations that should take place after a project has been renamed.

Example usage:

project = Project.find(42)

project.update(...)

Projects::AfterRenameService.new(project).execute

Constant Summary collapse

RenameFailedError =
Class.new(StandardError)

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#initialize(project, path_before:, full_path_before:) ⇒ AfterRenameService

Returns a new instance of AfterRenameService.

Parameters:

  • project (Project)

    The Project being renamed.

  • path_before (String)

    The path slug the project was using, before the rename took place.



33
34
35
36
37
38
# File 'app/services/projects/after_rename_service.rb', line 33

def initialize(project, path_before:, full_path_before:)
  @project = project
  @path_before = path_before
  @full_path_before = full_path_before
  @full_path_after = project.full_path
end

Instance Attribute Details

#full_path_afterString (readonly)

Returns The full path of the namespace + project, after the rename took place.

Returns:

  • (String)

    The full path of the namespace + project, after the rename took place.



27
28
29
# File 'app/services/projects/after_rename_service.rb', line 27

def full_path_after
  @full_path_after
end

#full_path_beforeString (readonly)

Returns The full path of the namespace + project, before the rename took place.

Returns:

  • (String)

    The full path of the namespace + project, before the rename took place.



24
25
26
# File 'app/services/projects/after_rename_service.rb', line 24

def full_path_before
  @full_path_before
end

#path_beforeString (readonly)

Returns The path slug the project was using, before the rename took place.

Returns:

  • (String)

    The path slug the project was using, before the rename took place.



21
22
23
# File 'app/services/projects/after_rename_service.rb', line 21

def path_before
  @path_before
end

#projectString (readonly)

Returns The Project being renamed.

Returns:

  • (String)

    The Project being renamed.



18
19
20
# File 'app/services/projects/after_rename_service.rb', line 18

def project
  @project
end

Instance Method Details

#executeObject



40
41
42
43
44
45
46
47
48
49
50
# File 'app/services/projects/after_rename_service.rb', line 40

def execute
  first_ensure_no_registry_tags_are_present
  expire_caches_before_rename
  rename_or_migrate_repository!
  send_move_instructions
  execute_system_hooks
  update_repository_configuration
  rename_transferred_documents
  log_completion
  publish_event
end

#execute_system_hooksObject



82
83
84
85
# File 'app/services/projects/after_rename_service.rb', line 82

def execute_system_hooks
  project.old_path_with_namespace = full_path_before
  system_hook_service.execute_hooks_for(project, :rename)
end

#expire_caches_before_renameObject



59
60
61
# File 'app/services/projects/after_rename_service.rb', line 59

def expire_caches_before_rename
  project.expire_caches_before_rename(full_path_before)
end

#first_ensure_no_registry_tags_are_presentObject

Raises:



52
53
54
55
56
57
# File 'app/services/projects/after_rename_service.rb', line 52

def first_ensure_no_registry_tags_are_present
  return unless project.has_container_registry_tags?

  raise RenameFailedError, "Project #{full_path_before} cannot be renamed because images are " \
      "present in its container registry"
end

#log_completionObject



101
102
103
104
105
106
# File 'app/services/projects/after_rename_service.rb', line 101

def log_completion
  log_info(
    "Project #{project.id} has been renamed from " \
      "#{full_path_before} to #{full_path_after}"
  )
end

#migrate_to_hashed_storage?Boolean

Returns:

  • (Boolean)


108
109
110
111
# File 'app/services/projects/after_rename_service.rb', line 108

def migrate_to_hashed_storage?
  Gitlab::CurrentSettings.hashed_storage_enabled? &&
    project.storage_upgradable?
end

#namespace_full_pathObject



125
126
127
# File 'app/services/projects/after_rename_service.rb', line 125

def namespace_full_path
  project.namespace.full_path
end

#project_pathObject



121
122
123
# File 'app/services/projects/after_rename_service.rb', line 121

def project_path
  project.path
end

#publish_eventObject



137
138
139
140
141
142
143
144
145
146
147
# File 'app/services/projects/after_rename_service.rb', line 137

def publish_event
  event = Projects::ProjectPathChangedEvent.new(data: {
    project_id: project.id,
    namespace_id: project.namespace_id,
    root_namespace_id: project.root_namespace.id,
    old_path: full_path_before,
    new_path: full_path_after
  })

  Gitlab::EventStore.publish(event)
end

#rename_failed!Object

Raises:



129
130
131
132
133
134
135
# File 'app/services/projects/after_rename_service.rb', line 129

def rename_failed!
  error = "Repository #{full_path_before} could not be renamed to #{full_path_after}"

  log_error(error)

  raise RenameFailedError, error
end

#rename_or_migrate_repository!Object



63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/services/projects/after_rename_service.rb', line 63

def rename_or_migrate_repository!
  success =
    if migrate_to_hashed_storage?
      ::Projects::HashedStorage::MigrationService
        .new(project, full_path_before)
        .execute
    else
      project.storage.rename_repo(old_full_path: full_path_before, new_full_path: full_path_after)
    end

  rename_failed! unless success
end

#rename_transferred_documentsObject



93
94
95
96
97
98
99
# File 'app/services/projects/after_rename_service.rb', line 93

def rename_transferred_documents
  if rename_uploads?
    Gitlab::UploadsTransfer
      .new
      .rename_project(path_before, project_path, namespace_full_path)
  end
end

#rename_uploads?Boolean

Returns:

  • (Boolean)


117
118
119
# File 'app/services/projects/after_rename_service.rb', line 117

def rename_uploads?
  !project.hashed_storage?(:attachments)
end

#send_move_instructionsObject



76
77
78
79
80
# File 'app/services/projects/after_rename_service.rb', line 76

def send_move_instructions
  return unless send_move_instructions?

  project.send_move_instructions(full_path_before)
end

#send_move_instructions?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'app/services/projects/after_rename_service.rb', line 113

def send_move_instructions?
  !project.import_started?
end

#update_repository_configurationObject



87
88
89
90
91
# File 'app/services/projects/after_rename_service.rb', line 87

def update_repository_configuration
  project.reload_repository!
  project.set_full_path
  project.track_project_repository
end