Commit ed2c9797 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'zj-migrate-gitlab-project-rm-mv' into 'master'

Migrate GitlabProject (re)move project endpoints

Closes gitaly#873

See merge request gitlab-org/gitlab-ce!16249
parents 6a2521d2 58e17bf3
...@@ -41,36 +41,6 @@ module Gitlab ...@@ -41,36 +41,6 @@ module Gitlab
io.read io.read
end end
def rm_project
logger.info "Removing repository <#{repository_absolute_path}>."
FileUtils.rm_rf(repository_absolute_path)
end
# Move repository from one directory to another
#
# Example: gitlab/gitlab-ci.git -> randx/six.git
#
# Won't work if target namespace directory does not exist
#
def mv_project(new_path)
new_absolute_path = File.join(shard_path, new_path)
# verify that the source repo exists
unless File.exist?(repository_absolute_path)
logger.error "mv-project failed: source path <#{repository_absolute_path}> does not exist."
return false
end
# ...and that the target repo does not exist
if File.exist?(new_absolute_path)
logger.error "mv-project failed: destination path <#{new_absolute_path}> already exists."
return false
end
logger.info "Moving repository from <#{repository_absolute_path}> to <#{new_absolute_path}>."
FileUtils.mv(repository_absolute_path, new_absolute_path)
end
# Import project via git clone --bare # Import project via git clone --bare
# URL must be publicly cloneable # URL must be publicly cloneable
def import_project(source, timeout) def import_project(source, timeout)
......
...@@ -136,7 +136,10 @@ module Gitlab ...@@ -136,7 +136,10 @@ module Gitlab
end end
end end
# Move repository # Move repository reroutes to mv_directory which is an alias for
# mv_namespace. Given the underlying implementation is a move action,
# indescriminate of what the folders might be.
#
# storage - project's storage path # storage - project's storage path
# path - project disk path # path - project disk path
# new_path - new project disk path # new_path - new project disk path
...@@ -146,7 +149,9 @@ module Gitlab ...@@ -146,7 +149,9 @@ module Gitlab
# #
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/873 # Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/873
def mv_repository(storage, path, new_path) def mv_repository(storage, path, new_path)
gitlab_projects(storage, "#{path}.git").mv_project("#{new_path}.git") return false if path.empty? || new_path.empty?
!!mv_directory(storage, "#{path}.git", "#{new_path}.git")
end end
# Fork repository to new path # Fork repository to new path
...@@ -164,7 +169,9 @@ module Gitlab ...@@ -164,7 +169,9 @@ module Gitlab
.fork_repository(forked_to_storage, "#{forked_to_disk_path}.git") .fork_repository(forked_to_storage, "#{forked_to_disk_path}.git")
end end
# Remove repository from file system # Removes a repository from file system, using rm_diretory which is an alias
# for rm_namespace. Given the underlying implementation removes the name
# passed as second argument on the passed storage.
# #
# storage - project's storage path # storage - project's storage path
# name - project disk path # name - project disk path
...@@ -174,7 +181,12 @@ module Gitlab ...@@ -174,7 +181,12 @@ module Gitlab
# #
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/873 # Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/873
def remove_repository(storage, name) def remove_repository(storage, name)
gitlab_projects(storage, "#{name}.git").rm_project return false if name.empty?
!!rm_directory(storage, "#{name}.git")
rescue ArgumentError => e
Rails.logger.warn("Repository does not exist: #{e} at: #{name}.git")
false
end end
# Add new key to gitlab-shell # Add new key to gitlab-shell
...@@ -313,6 +325,7 @@ module Gitlab ...@@ -313,6 +325,7 @@ module Gitlab
rescue GRPC::InvalidArgument => e rescue GRPC::InvalidArgument => e
raise ArgumentError, e.message raise ArgumentError, e.message
end end
alias_method :rm_directory, :rm_namespace
# Move namespace directory inside repositories storage # Move namespace directory inside repositories storage
# #
...@@ -332,6 +345,7 @@ module Gitlab ...@@ -332,6 +345,7 @@ module Gitlab
rescue GRPC::InvalidArgument rescue GRPC::InvalidArgument
false false
end end
alias_method :mv_directory, :mv_namespace
def url_to_repo(path) def url_to_repo(path)
Gitlab.config.gitlab_shell.ssh_path_prefix + "#{path}.git" Gitlab.config.gitlab_shell.ssh_path_prefix + "#{path}.git"
......
...@@ -25,51 +25,6 @@ describe Gitlab::Git::GitlabProjects do ...@@ -25,51 +25,6 @@ describe Gitlab::Git::GitlabProjects do
it { expect(gl_projects.logger).to eq(logger) } it { expect(gl_projects.logger).to eq(logger) }
end end
describe '#mv_project' do
let(:new_repo_path) { File.join(tmp_repos_path, 'repo.git') }
it 'moves a repo directory' do
expect(File.exist?(tmp_repo_path)).to be_truthy
message = "Moving repository from <#{tmp_repo_path}> to <#{new_repo_path}>."
expect(logger).to receive(:info).with(message)
expect(gl_projects.mv_project('repo.git')).to be_truthy
expect(File.exist?(tmp_repo_path)).to be_falsy
expect(File.exist?(new_repo_path)).to be_truthy
end
it "fails if the source path doesn't exist" do
expected_source_path = File.join(tmp_repos_path, 'bad-src.git')
expect(logger).to receive(:error).with("mv-project failed: source path <#{expected_source_path}> does not exist.")
result = build_gitlab_projects(tmp_repos_path, 'bad-src.git').mv_project('repo.git')
expect(result).to be_falsy
end
it 'fails if the destination path already exists' do
FileUtils.mkdir_p(File.join(tmp_repos_path, 'already-exists.git'))
expected_distination_path = File.join(tmp_repos_path, 'already-exists.git')
message = "mv-project failed: destination path <#{expected_distination_path}> already exists."
expect(logger).to receive(:error).with(message)
expect(gl_projects.mv_project('already-exists.git')).to be_falsy
end
end
describe '#rm_project' do
it 'removes a repo directory' do
expect(File.exist?(tmp_repo_path)).to be_truthy
expect(logger).to receive(:info).with("Removing repository <#{tmp_repo_path}>.")
expect(gl_projects.rm_project).to be_truthy
expect(File.exist?(tmp_repo_path)).to be_falsy
end
end
describe '#push_branches' do describe '#push_branches' do
let(:remote_name) { 'remote-name' } let(:remote_name) { 'remote-name' }
let(:branch_name) { 'master' } let(:branch_name) { 'master' }
......
...@@ -443,32 +443,44 @@ describe Gitlab::Shell do ...@@ -443,32 +443,44 @@ describe Gitlab::Shell do
end end
describe '#remove_repository' do describe '#remove_repository' do
subject { gitlab_shell.remove_repository(project.repository_storage_path, project.disk_path) } let!(:project) { create(:project, :repository) }
let(:disk_path) { "#{project.disk_path}.git" }
it 'returns true when the command succeeds' do it 'returns true when the command succeeds' do
expect(gitlab_projects).to receive(:rm_project) { true } expect(gitlab_shell.exists?(project.repository_storage_path, disk_path)).to be(true)
is_expected.to be_truthy expect(gitlab_shell.remove_repository(project.repository_storage_path, project.disk_path)).to be(true)
expect(gitlab_shell.exists?(project.repository_storage_path, disk_path)).to be(false)
end end
it 'returns false when the command fails' do it 'keeps the namespace directory' do
expect(gitlab_projects).to receive(:rm_project) { false } gitlab_shell.remove_repository(project.repository_storage_path, project.disk_path)
is_expected.to be_falsy expect(gitlab_shell.exists?(project.repository_storage_path, disk_path)).to be(false)
expect(gitlab_shell.exists?(project.repository_storage_path, project.disk_path.gsub(project.name, ''))).to be(true)
end end
end end
describe '#mv_repository' do describe '#mv_repository' do
let!(:project2) { create(:project, :repository) }
it 'returns true when the command succeeds' do it 'returns true when the command succeeds' do
expect(gitlab_projects).to receive(:mv_project).with('project/newpath.git') { true } old_path = project2.disk_path
new_path = "project/new_path"
expect(gitlab_shell.exists?(project2.repository_storage_path, "#{old_path}.git")).to be(true)
expect(gitlab_shell.exists?(project2.repository_storage_path, "#{new_path}.git")).to be(false)
expect(gitlab_shell.mv_repository(project.repository_storage_path, project.disk_path, 'project/newpath')).to be_truthy expect(gitlab_shell.mv_repository(project2.repository_storage_path, old_path, new_path)).to be_truthy
expect(gitlab_shell.exists?(project2.repository_storage_path, "#{old_path}.git")).to be(false)
expect(gitlab_shell.exists?(project2.repository_storage_path, "#{new_path}.git")).to be(true)
end end
it 'returns false when the command fails' do it 'returns false when the command fails' do
expect(gitlab_projects).to receive(:mv_project).with('project/newpath.git') { false } expect(gitlab_shell.mv_repository(project2.repository_storage_path, project2.disk_path, '')).to be_falsy
expect(gitlab_shell.exists?(project2.repository_storage_path, "#{project2.disk_path}.git")).to be(true)
expect(gitlab_shell.mv_repository(project.repository_storage_path, project.disk_path, 'project/newpath')).to be_falsy
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment