Commit 84211cd8 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch 'gitaly-squash-in-progress' into 'master'

Incorporate Gitaly's RepositoryService.IsSquashInProgress RPC

Closes gitaly#1020

See merge request gitlab-org/gitlab-ee!4436
parents 399ba520 d3b93a6a
...@@ -14,41 +14,47 @@ describe MergeRequest do ...@@ -14,41 +14,47 @@ describe MergeRequest do
end end
describe '#squash_in_progress?' do describe '#squash_in_progress?' do
# Create merge request and project before we stub file calls shared_examples 'checking whether a squash is in progress' do
let(:repo_path) { subject.source_project.repository.path }
let(:squash_path) { File.join(repo_path, "gitlab-worktree", "squash-#{subject.id}") }
before do before do
subject system(*%W(#{Gitlab.config.git.bin_path} -C #{repo_path} worktree add --detach #{squash_path} master))
end end
it 'returns true when there is a current squash directory' do it 'returns true when there is a current squash directory' do
allow(File).to receive(:exist?).and_return(true)
allow(File).to receive(:mtime).and_return(Time.now)
expect(subject.squash_in_progress?).to be_truthy expect(subject.squash_in_progress?).to be_truthy
end end
it 'returns false when there is no squash directory' do it 'returns false when there is no squash directory' do
allow(File).to receive(:exist?).and_return(false) FileUtils.rm_rf(squash_path)
expect(subject.squash_in_progress?).to be_falsey expect(subject.squash_in_progress?).to be_falsey
end end
it 'returns false when the squash directory has expired' do it 'returns false when the squash directory has expired' do
allow(File).to receive(:exist?).and_return(true) time = 20.minutes.ago.to_time
allow(File).to receive(:mtime).and_return(20.minutes.ago) File.utime(time, time, squash_path)
expect(subject.squash_in_progress?).to be_falsey expect(subject.squash_in_progress?).to be_falsey
end end
it 'returns false when the source project has been removed' do it 'returns false when the source project has been removed' do
allow(subject).to receive(:source_project).and_return(nil) allow(subject).to receive(:source_project).and_return(nil)
allow(File).to receive(:exist?).and_return(true)
allow(File).to receive(:mtime).and_return(Time.now)
expect(File).not_to have_received(:exist?)
expect(subject.squash_in_progress?).to be_falsey expect(subject.squash_in_progress?).to be_falsey
end end
end end
context 'when Gitaly squash_in_progress is enabled' do
it_behaves_like 'checking whether a squash is in progress'
end
context 'when Gitaly squash_in_progress is disabled', :disable_gitaly do
it_behaves_like 'checking whether a squash is in progress'
end
end
describe '#squash?' do describe '#squash?' do
let(:merge_request) { build(:merge_request, squash: squash) } let(:merge_request) { build(:merge_request, squash: squash) }
subject { merge_request.squash? } subject { merge_request.squash? }
......
...@@ -1234,8 +1234,14 @@ module Gitlab ...@@ -1234,8 +1234,14 @@ module Gitlab
end end
def squash_in_progress?(squash_id) def squash_in_progress?(squash_id)
gitaly_migrate(:squash_in_progress) do |is_enabled|
if is_enabled
gitaly_repository_client.squash_in_progress?(squash_id)
else
fresh_worktree?(worktree_path(SQUASH_WORKTREE_PREFIX, squash_id)) fresh_worktree?(worktree_path(SQUASH_WORKTREE_PREFIX, squash_id))
end end
end
end
def push_remote_branches(remote_name, branch_names, forced: true) def push_remote_branches(remote_name, branch_names, forced: true)
success = @gitlab_projects.push_branches(remote_name, GITLAB_PROJECTS_TIMEOUT, forced, branch_names) success = @gitlab_projects.push_branches(remote_name, GITLAB_PROJECTS_TIMEOUT, forced, branch_names)
......
...@@ -134,6 +134,23 @@ module Gitlab ...@@ -134,6 +134,23 @@ module Gitlab
response.in_progress response.in_progress
end end
def squash_in_progress?(squash_id)
request = Gitaly::IsSquashInProgressRequest.new(
repository: @gitaly_repo,
squash_id: squash_id.to_s
)
response = GitalyClient.call(
@storage,
:repository_service,
:is_squash_in_progress,
request,
timeout: GitalyClient.default_timeout
)
response.in_progress
end
def fetch_source_branch(source_repository, source_branch, local_ref) def fetch_source_branch(source_repository, source_branch, local_ref)
request = Gitaly::FetchSourceBranchRequest.new( request = Gitaly::FetchSourceBranchRequest.new(
repository: @gitaly_repo, repository: @gitaly_repo,
......
...@@ -84,4 +84,30 @@ describe Gitlab::GitalyClient::RepositoryService do ...@@ -84,4 +84,30 @@ describe Gitlab::GitalyClient::RepositoryService do
expect(client.has_local_branches?).to be(true) expect(client.has_local_branches?).to be(true)
end end
end end
describe '#rebase_in_progress?' do
let(:rebase_id) { 1 }
it 'sends a repository_rebase_in_progress message' do
expect_any_instance_of(Gitaly::RepositoryService::Stub)
.to receive(:is_rebase_in_progress)
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
.and_return(double(in_progress: true))
client.rebase_in_progress?(rebase_id)
end
end
describe '#squash_in_progress?' do
let(:squash_id) { 1 }
it 'sends a repository_squash_in_progress message' do
expect_any_instance_of(Gitaly::RepositoryService::Stub)
.to receive(:is_squash_in_progress)
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
.and_return(double(in_progress: true))
client.squash_in_progress?(squash_id)
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