diff options
Diffstat (limited to 'lib/backup')
-rw-r--r-- | lib/backup/repository.rb | 86 |
1 files changed, 66 insertions, 20 deletions
diff --git a/lib/backup/repository.rb b/lib/backup/repository.rb index 67e317c35bc..74b9e0205a4 100644 --- a/lib/backup/repository.rb +++ b/lib/backup/repository.rb @@ -68,40 +68,70 @@ module Backup def prepare_directories Gitlab.config.repositories.storages.each do |name, repository_storage| - path = repository_storage.legacy_disk_path - next unless File.exist?(path) - - # Move all files in the existing repos directory except . and .. to - # repositories.old.<timestamp> directory - bk_repos_path = File.join(Gitlab.config.backup.path, "tmp", "#{name}-repositories.old." + Time.now.to_i.to_s) - FileUtils.mkdir_p(bk_repos_path, mode: 0700) - files = Dir.glob(File.join(path, "*"), File::FNM_DOTMATCH) - [File.join(path, "."), File.join(path, "..")] - - begin - FileUtils.mv(files, bk_repos_path) - rescue Errno::EACCES - access_denied_error(path) - rescue Errno::EBUSY - resource_busy_error(path) + gitaly_migrate(:remove_repositories) do |is_enabled| + # TODO: Need to find a way to do this for gitaly + unless is_enabled + path = repository_storage.legacy_disk_path + next unless File.exist?(path) + + # Move all files in the existing repos directory except . and .. to + # repositories.old.<timestamp> directory + bk_repos_path = File.join(Gitlab.config.backup.path, "tmp", "#{name}-repositories.old." + Time.now.to_i.to_s) + FileUtils.mkdir_p(bk_repos_path, mode: 0700) + files = Dir.glob(File.join(path, "*"), File::FNM_DOTMATCH) - [File.join(path, "."), File.join(path, "..")] + + begin + FileUtils.mv(files, bk_repos_path) + rescue Errno::EACCES + access_denied_error(path) + rescue Errno::EBUSY + resource_busy_error(path) + end + end end end end def restore prepare_directories + gitlab_shell = Gitlab::Shell.new Project.find_each(batch_size: 1000) do |project| path_to_project_bundle = path_to_bundle(project) + path_to_project_repo = path_to_repo(project) + project.ensure_storage_path_exists + restore_repo_status = nil if File.exist?(path_to_project_bundle) begin - project.repository.create_from_bundle path_to_project_bundle unless project.repository_exists? - progress.puts "[DONE] restoring #{project.name} repository".color(:green) - rescue StandardError => e - progress.puts "[Failed] restoring #{project.name} repository".color(:red) + gitlab_shell.remove_repository(project.repository_storage, project.disk_path) if project.repository_exists? + project.repository.create_from_bundle path_to_project_bundle + restore_repo_status = true + rescue => e + restore_repo_status = false progress.puts "Error: #{e}".color(:red) end else - progress.puts "[Failed] bundle file #{path_to_project_bundle} does not exist" + restore_repo_status = gitlab_shell.create_repository(project.repository_storage, project.disk_path) + end + + if restore_repo_status + progress.puts "[DONE] restoring #{project.name} repository".color(:green) + else + progress.puts "[Failed] restoring #{project.name} repository".color(:red) + end + + gitaly_migrate(:restore_custom_hooks) do |is_enabled| + # TODO: Need to find a way to do this for gitaly + unless is_enabled + in_path(path_to_tars(project)) do |dir| + cmd = %W(tar -xf #{path_to_tars(project, dir)} -C #{path_to_project_repo} #{dir}) + + output, status = Gitlab::Popen.popen(cmd) + unless status.zero? + progress_warn(project, cmd.join(' '), output) + end + end + end end wiki = ProjectWiki.new(project) @@ -109,6 +139,7 @@ module Backup if File.exist?(path_to_wiki_bundle) begin + gitlab_shell.remove_repository(project.wiki.repository_storage, project.wiki.disk_path) if project.wiki_repository_exists? project.repository.create_from_bundle(path_to_wiki_bundle) progress.puts "[DONE] restoring #{project.name} wiki".color(:green) rescue StandardError => e @@ -116,6 +147,13 @@ module Backup progress.puts "Error #{e}".color(:red) end end + + gitaly_migrate(:create_hooks) do |is_enabled| + # TODO: Need to find a way to do this for gitaly + unless is_enabled + Gitlab::Git::Repository.create_hooks(path_to_project_repo, Gitlab.config.gitlab_shell.hooks_path) + end + end end end # rubocop:enable Metrics/AbcSize @@ -190,5 +228,13 @@ module Backup def display_repo_path(project) project.hashed_storage?(:repository) ? "#{project.full_path} (#{project.disk_path})" : project.full_path end + + def gitaly_migrate(method, status: Gitlab::GitalyClient::MigrationStatus::OPT_IN, &block) + Gitlab::GitalyClient.migrate(method, status: status, &block) + rescue GRPC::NotFound, GRPC::BadStatus => e + # Old Popen code returns [Error, output] to the caller, so we + # need to do the same here... + raise Error, e + end end end |