mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-29 12:00:32 +00:00
97 lines
2.5 KiB
Ruby
97 lines
2.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'yaml'
|
|
|
|
module Gitlab
|
|
module Backup
|
|
module Cli
|
|
module Targets
|
|
# Backup and restores repositories by querying the database
|
|
class Repositories < Target
|
|
def dump(destination)
|
|
strategy.start(:create, destination)
|
|
enqueue_consecutive
|
|
|
|
ensure
|
|
strategy.finish!
|
|
end
|
|
|
|
def restore(source)
|
|
strategy.start(:restore,
|
|
source,
|
|
remove_all_repositories: remove_all_repositories)
|
|
enqueue_consecutive
|
|
|
|
ensure
|
|
strategy.finish!
|
|
|
|
restore_object_pools
|
|
end
|
|
|
|
def strategy
|
|
@strategy ||= GitalyBackup.new(context)
|
|
end
|
|
|
|
private
|
|
|
|
def remove_all_repositories
|
|
context.config_repositories_storages.keys
|
|
end
|
|
|
|
def enqueue_consecutive
|
|
enqueue_consecutive_projects
|
|
enqueue_consecutive_snippets
|
|
end
|
|
|
|
def enqueue_consecutive_projects
|
|
project_relation.find_each(batch_size: 1000) do |project|
|
|
enqueue_project(project)
|
|
end
|
|
end
|
|
|
|
def enqueue_consecutive_snippets
|
|
snippet_relation.find_each(batch_size: 1000) { |snippet| enqueue_snippet(snippet) }
|
|
end
|
|
|
|
def enqueue_project(project)
|
|
strategy.enqueue(project, Gitlab::Backup::Cli::RepoType::PROJECT)
|
|
strategy.enqueue(project, Gitlab::Backup::Cli::RepoType::WIKI)
|
|
|
|
return unless project.design_management_repository
|
|
|
|
strategy.enqueue(project.design_management_repository, Gitlab::Backup::Cli::RepoType::DESIGN)
|
|
end
|
|
|
|
def enqueue_snippet(snippet)
|
|
strategy.enqueue(snippet, Gitlab::Backup::Cli::RepoType::SNIPPET)
|
|
end
|
|
|
|
def project_relation
|
|
Project.includes(:route, :group, :namespace)
|
|
end
|
|
|
|
def snippet_relation
|
|
Snippet.all
|
|
end
|
|
|
|
def restore_object_pools
|
|
PoolRepository.includes(:source_project).find_each do |pool|
|
|
Output.info " - Object pool #{pool.disk_path}..."
|
|
|
|
unless pool.source_project
|
|
Output.info " - Object pool #{pool.disk_path}... [SKIPPED]"
|
|
next
|
|
end
|
|
|
|
pool.state = 'none'
|
|
pool.save
|
|
|
|
pool.schedule
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|