27a75ea175
When a project uses fast-forward merging strategy user has to rebase MRs to target branch before it can be merged. Now user can do rebase in UI by clicking 'Rebase' button instead of doing rebase locally. This feature was already present in EE, this is only backport of the feature to CE. Couple of changes: * removed rebase license check * renamed migration (changed timestamp) Closes #40301
134 lines
4.4 KiB
Ruby
134 lines
4.4 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe MergeRequests::RebaseService do
|
|
include ProjectForksHelper
|
|
|
|
let(:user) { create(:user) }
|
|
let(:merge_request) do
|
|
create(:merge_request,
|
|
source_branch: 'feature_conflict',
|
|
target_branch: 'master')
|
|
end
|
|
let(:project) { merge_request.project }
|
|
let(:repository) { project.repository.raw }
|
|
|
|
subject(:service) { described_class.new(project, user, {}) }
|
|
|
|
before do
|
|
project.add_master(user)
|
|
end
|
|
|
|
describe '#execute' do
|
|
context 'when another rebase is already in progress' do
|
|
before do
|
|
allow(merge_request).to receive(:rebase_in_progress?).and_return(true)
|
|
end
|
|
|
|
it 'saves the error message' do
|
|
subject.execute(merge_request)
|
|
|
|
expect(merge_request.reload.merge_error).to eq 'Rebase task canceled: Another rebase is already in progress'
|
|
end
|
|
|
|
it 'returns an error' do
|
|
expect(service.execute(merge_request)).to match(status: :error,
|
|
message: 'Failed to rebase. Should be done manually')
|
|
end
|
|
end
|
|
|
|
context 'when unexpected error occurs' do
|
|
before do
|
|
allow(repository).to receive(:run_git!).and_raise('Something went wrong')
|
|
end
|
|
|
|
it 'saves the error message' do
|
|
subject.execute(merge_request)
|
|
|
|
expect(merge_request.reload.merge_error).to eq 'Something went wrong'
|
|
end
|
|
|
|
it 'returns an error' do
|
|
expect(service.execute(merge_request)).to match(status: :error,
|
|
message: 'Failed to rebase. Should be done manually')
|
|
end
|
|
end
|
|
|
|
context 'with git command failure' do
|
|
before do
|
|
allow(repository).to receive(:run_git!).and_raise(Gitlab::Git::Repository::GitError, 'Something went wrong')
|
|
end
|
|
|
|
it 'saves the error message' do
|
|
subject.execute(merge_request)
|
|
|
|
expect(merge_request.reload.merge_error).to eq 'Something went wrong'
|
|
end
|
|
|
|
it 'returns an error' do
|
|
expect(service.execute(merge_request)).to match(status: :error,
|
|
message: 'Failed to rebase. Should be done manually')
|
|
end
|
|
end
|
|
|
|
context 'valid params' do
|
|
before do
|
|
service.execute(merge_request)
|
|
end
|
|
|
|
it 'rebases source branch' do
|
|
parent_sha = merge_request.source_project.repository.commit(merge_request.source_branch).parents.first.sha
|
|
target_branch_sha = merge_request.target_project.repository.commit(merge_request.target_branch).sha
|
|
expect(parent_sha).to eq(target_branch_sha)
|
|
end
|
|
|
|
it 'records the new SHA on the merge request' do
|
|
head_sha = merge_request.source_project.repository.commit(merge_request.source_branch).sha
|
|
expect(merge_request.reload.rebase_commit_sha).to eq(head_sha)
|
|
end
|
|
|
|
it 'logs correct author and commiter' do
|
|
head_commit = merge_request.source_project.repository.commit(merge_request.source_branch)
|
|
|
|
expect(head_commit.author_email).to eq('dmitriy.zaporozhets@gmail.com')
|
|
expect(head_commit.author_name).to eq('Dmitriy Zaporozhets')
|
|
expect(head_commit.committer_email).to eq(user.email)
|
|
expect(head_commit.committer_name).to eq(user.name)
|
|
end
|
|
|
|
context 'git commands' do
|
|
it 'sets GL_REPOSITORY env variable when calling git commands' do
|
|
expect(repository).to receive(:popen).exactly(3)
|
|
.with(anything, anything, hash_including('GL_REPOSITORY'))
|
|
.and_return(['', 0])
|
|
|
|
service.execute(merge_request)
|
|
end
|
|
end
|
|
|
|
context 'fork' do
|
|
let(:forked_project) do
|
|
fork_project(project, user, repository: true)
|
|
end
|
|
|
|
let(:merge_request_from_fork) do
|
|
forked_project.repository.create_file(
|
|
user,
|
|
'new-file-to-target',
|
|
'',
|
|
message: 'Add new file to target',
|
|
branch_name: 'master')
|
|
|
|
create(:merge_request,
|
|
source_branch: 'master', source_project: forked_project,
|
|
target_branch: 'master', target_project: project)
|
|
end
|
|
|
|
it 'rebases source branch' do
|
|
parent_sha = forked_project.repository.commit(merge_request_from_fork.source_branch).parents.first.sha
|
|
target_branch_sha = project.repository.commit(merge_request_from_fork.target_branch).sha
|
|
expect(parent_sha).to eq(target_branch_sha)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|