Use gitlab shell import instead of manually creating the webhooks
Also update repo restorer to use project wiki method.
This commit is contained in:
parent
01dfedbcad
commit
b3fb5b4f26
5 changed files with 49 additions and 32 deletions
|
@ -160,6 +160,10 @@ class ProjectWiki
|
|||
}
|
||||
end
|
||||
|
||||
def repository_storage_path
|
||||
project.repository_storage_path
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def init_repo(path_with_namespace)
|
||||
|
|
|
@ -15,14 +15,6 @@ module Gitlab
|
|||
execute(%W(#{git_bin_path} --git-dir=#{repo_path} bundle create #{bundle_path} --all))
|
||||
end
|
||||
|
||||
def git_unbundle(repo_path:, bundle_path:)
|
||||
execute(%W(#{git_bin_path} clone --bare #{bundle_path} #{repo_path}))
|
||||
end
|
||||
|
||||
def git_restore_hooks
|
||||
execute(%W(#{Gitlab.config.gitlab_shell.path}/bin/create-hooks) + repository_storage_paths_args)
|
||||
end
|
||||
|
||||
def mkdir_p(path)
|
||||
FileUtils.mkdir_p(path, mode: DEFAULT_MODE)
|
||||
FileUtils.chmod(DEFAULT_MODE, path)
|
||||
|
@ -56,10 +48,6 @@ module Gitlab
|
|||
FileUtils.copy_entry(source, destination)
|
||||
true
|
||||
end
|
||||
|
||||
def repository_storage_paths_args
|
||||
Gitlab.config.repositories.storages.values
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,6 +2,7 @@ module Gitlab
|
|||
module ImportExport
|
||||
class RepoRestorer
|
||||
include Gitlab::ImportExport::CommandLineUtil
|
||||
include Gitlab::ShellAdapter
|
||||
|
||||
def initialize(project:, shared:, path_to_bundle:)
|
||||
@project = project
|
||||
|
@ -12,29 +13,11 @@ module Gitlab
|
|||
def restore
|
||||
return true unless File.exist?(@path_to_bundle)
|
||||
|
||||
mkdir_p(path_to_repo)
|
||||
|
||||
git_unbundle(repo_path: path_to_repo, bundle_path: @path_to_bundle) && repo_restore_hooks
|
||||
gitlab_shell.import_repository(@project.repository_storage_path, @project.path_with_namespace, @path_to_bundle)
|
||||
rescue => e
|
||||
@shared.error(e)
|
||||
false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def path_to_repo
|
||||
@project.repository.path_to_repo
|
||||
end
|
||||
|
||||
def repo_restore_hooks
|
||||
return true if wiki?
|
||||
|
||||
git_restore_hooks
|
||||
end
|
||||
|
||||
def wiki?
|
||||
@project.class.name == 'ProjectWiki'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -80,8 +80,10 @@ module Gitlab
|
|||
# import_repository("/path/to/storage", "gitlab/gitlab-ci", "https://github.com/randx/six.git")
|
||||
#
|
||||
def import_repository(storage, name, url)
|
||||
# Timeout should be less than 900 ideally, to prevent the memory killer
|
||||
# to silently kill the process without knowing we are timing out here.
|
||||
output, status = Popen::popen([gitlab_shell_projects_path, 'import-project',
|
||||
storage, "#{name}.git", url, '900'])
|
||||
storage, "#{name}.git", url, '800'])
|
||||
raise Error, output unless status.zero?
|
||||
true
|
||||
end
|
||||
|
|
40
spec/lib/gitlab/import_export/repo_restorer_spec.rb
Normal file
40
spec/lib/gitlab/import_export/repo_restorer_spec.rb
Normal file
|
@ -0,0 +1,40 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Gitlab::ImportExport::RepoRestorer, services: true do
|
||||
describe 'bundle a project Git repo' do
|
||||
let(:user) { create(:user) }
|
||||
let!(:project_with_repo) { create(:project, :test_repo, name: 'test-repo-restorer', path: 'test-repo-restorer') }
|
||||
let!(:project) { create(:empty_project) }
|
||||
let(:export_path) { "#{Dir::tmpdir}/project_tree_saver_spec" }
|
||||
let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace) }
|
||||
let(:bundler) { Gitlab::ImportExport::RepoSaver.new(project: project_with_repo, shared: shared) }
|
||||
let(:bundle_path) { File.join(shared.export_path, Gitlab::ImportExport.project_bundle_filename) }
|
||||
let(:restorer) do
|
||||
described_class.new(path_to_bundle: bundle_path,
|
||||
shared: shared,
|
||||
project: project)
|
||||
end
|
||||
|
||||
before do
|
||||
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
|
||||
|
||||
bundler.save
|
||||
end
|
||||
|
||||
after do
|
||||
FileUtils.rm_rf(export_path)
|
||||
FileUtils.rm_rf(project_with_repo.repository.path_to_repo)
|
||||
FileUtils.rm_rf(project.repository.path_to_repo)
|
||||
end
|
||||
|
||||
it 'restores the repo successfully' do
|
||||
expect(restorer.restore).to be true
|
||||
end
|
||||
|
||||
it 'has the webhooks' do
|
||||
restorer.restore
|
||||
|
||||
expect(Gitlab::Git::Hook.new('post-receive', project.repository.path_to_repo)).to exist
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue