1# frozen_string_literal: true
2
3module Projects
4  module HashedStorage
5    class MigrateRepositoryService < BaseRepositoryService
6      def execute
7        try_to_set_repository_read_only!
8
9        @old_storage_version = project.storage_version
10        project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:repository]
11
12        @new_disk_path = project.disk_path
13
14        result = move_repositories
15
16        if result
17          project.set_full_path
18          project.track_project_repository
19        else
20          rollback_folder_move
21          project.storage_version = nil
22        end
23
24        project.transaction do
25          project.save!(validate: false)
26          project.set_repository_writable!
27        end
28
29        result
30      rescue Gitlab::Git::CommandError => e
31        logger.error("Repository #{project.full_path} failed to upgrade (PROJECT_ID=#{project.id}). Git operation failed: #{e.inspect}")
32
33        rollback_migration!
34
35        false
36      rescue OpenSSL::Cipher::CipherError => e
37        logger.error("Repository #{project.full_path} failed to upgrade (PROJECT_ID=#{project.id}). There is a problem with encrypted attributes: #{e.inspect}")
38
39        rollback_migration!
40
41        false
42      end
43
44      private
45
46      def rollback_migration!
47        rollback_folder_move
48        project.storage_version = nil
49        project.set_repository_writable!
50      end
51    end
52  end
53end
54
55Projects::HashedStorage::MigrateRepositoryService.prepend_mod_with('Projects::HashedStorage::MigrateRepositoryService')
56