Class: Projects::AfterRenameService
- Inherits:
-
Object
- Object
- Projects::AfterRenameService
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
#deny_visibility_level, #event_service, #log_error, #log_info, #notification_service, #system_hook_service, #todo_service, #visibility_level
#can?
Constructor Details
#initialize(project, path_before:, full_path_before:) ⇒ AfterRenameService
Returns a new instance of AfterRenameService.
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_after ⇒ String
Returns 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_before ⇒ String
Returns 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_before ⇒ String
Returns 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
|
#project ⇒ String
Returns The Project being renamed.
18
19
20
|
# File 'app/services/projects/after_rename_service.rb', line 18
def project
@project
end
|
Instance Method Details
#execute ⇒ Object
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_hooks ⇒ Object
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_rename ⇒ Object
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
|
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_completion ⇒ Object
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
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_path ⇒ Object
125
126
127
|
# File 'app/services/projects/after_rename_service.rb', line 125
def namespace_full_path
project.namespace.full_path
end
|
#project_path ⇒ Object
121
122
123
|
# File 'app/services/projects/after_rename_service.rb', line 121
def project_path
project.path
end
|
#publish_event ⇒ Object
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
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_documents ⇒ Object
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
117
118
119
|
# File 'app/services/projects/after_rename_service.rb', line 117
def rename_uploads?
!project.hashed_storage?(:attachments)
end
|
#send_move_instructions ⇒ Object
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
113
114
115
|
# File 'app/services/projects/after_rename_service.rb', line 113
def send_move_instructions?
!project.import_started?
end
|
#update_repository_configuration ⇒ Object
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
|