Merge branch 'reject-merge-conflicts' into 'master'

Properly abort a merge when merge conflicts occur

If somehow a user attempted to accept a merge request that had conflicts (e.g. the "Accept Merge Request" button or the MR itself was not updated), `MergeService` did not properly detect that a conflict
occurred. It would assume that the MR went through without any issues and close the MR as though everything was fine. This could cause data loss if the source branch were removed.

Closes #20425

See merge request !5569
This commit is contained in:
Robert Speicher 2016-07-30 18:05:54 +00:00
commit e12c18506a
3 changed files with 19 additions and 1 deletions

View file

@ -39,6 +39,7 @@ v 8.11.0 (unreleased)
v 8.10.3 (unreleased)
- Fix hooks missing on imported GitLab projects
- Properly abort a merge when merge conflicts occur
v 8.10.2
- User can now search branches by name. !5144

View file

@ -35,7 +35,13 @@ module MergeRequests
}
commit_id = repository.merge(current_user, merge_request, options)
merge_request.update(merge_commit_sha: commit_id)
if commit_id
merge_request.update(merge_commit_sha: commit_id)
else
merge_request.update(merge_error: 'Conflicts detected during merge')
false
end
rescue GitHooksService::PreReceiveError => e
merge_request.update(merge_error: e.message)
false

View file

@ -75,6 +75,17 @@ describe MergeRequests::MergeService, services: true do
expect(merge_request.merge_error).to eq("error")
end
it 'aborts if there is a merge conflict' do
allow_any_instance_of(Repository).to receive(:merge).and_return(false)
allow(service).to receive(:execute_hooks)
service.execute(merge_request)
expect(merge_request.open?).to be_truthy
expect(merge_request.merge_commit_sha).to be_nil
expect(merge_request.merge_error).to eq("Conflicts detected during merge")
end
end
end
end