debian-mirror-gitlab/app/services/projects/hashed_storage/migrate_attachments_service.rb

65 lines
2 KiB
Ruby
Raw Normal View History

2018-11-18 11:00:15 +05:30
# frozen_string_literal: true
2018-03-17 18:26:18 +05:30
module Projects
module HashedStorage
2019-05-30 16:15:17 +05:30
AttachmentMigrationError = Class.new(StandardError)
class MigrateAttachmentsService < BaseService
attr_reader :logger, :old_disk_path, :new_disk_path
2018-11-18 11:00:15 +05:30
def initialize(project, old_disk_path, logger: nil)
2018-03-17 18:26:18 +05:30
@project = project
@logger = logger || Rails.logger
2018-11-18 11:00:15 +05:30
@old_disk_path = old_disk_path
2019-05-30 16:15:17 +05:30
@new_disk_path = project.disk_path
2019-03-02 22:35:43 +05:30
@skipped = false
2018-03-17 18:26:18 +05:30
end
def execute
origin = FileUploader.absolute_base_dir(project)
2019-05-30 16:15:17 +05:30
# It's possible that old_disk_path does not match project.disk_path. For example, that happens when we rename a project
2018-11-18 11:00:15 +05:30
origin.sub!(/#{Regexp.escape(project.full_path)}\z/, old_disk_path)
2018-03-17 18:26:18 +05:30
project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:attachments]
target = FileUploader.absolute_base_dir(project)
2019-05-18 00:54:41 +05:30
result = move_folder!(origin, target)
2019-05-30 16:15:17 +05:30
project.save!
2018-03-17 18:26:18 +05:30
2019-05-30 16:15:17 +05:30
if result && block_given?
yield
2018-03-17 18:26:18 +05:30
end
2019-05-18 00:54:41 +05:30
result
2018-03-17 18:26:18 +05:30
end
2019-05-30 16:15:17 +05:30
def skipped?
@skipped
end
private
def move_folder!(old_path, new_path)
unless File.directory?(old_path)
logger.info("Skipped attachments migration from '#{old_path}' to '#{new_path}', source path doesn't exist or is not a directory (PROJECT_ID=#{project.id})")
@skipped = true
return true
end
if File.exist?(new_path)
logger.error("Cannot migrate attachments from '#{old_path}' to '#{new_path}', target path already exist (PROJECT_ID=#{project.id})")
raise AttachmentMigrationError, "Target path '#{new_path}' already exist"
end
# Create hashed storage base path folder
FileUtils.mkdir_p(File.dirname(new_path))
FileUtils.mv(old_path, new_path)
logger.info("Migrated project attachments from '#{old_path}' to '#{new_path}' (PROJECT_ID=#{project.id})")
true
end
2018-03-17 18:26:18 +05:30
end
end
end