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
This commit is contained in:
Stan Hu 2016-07-29 11:14:53 -07:00
parent 6ad514d066
commit 60529e0216
3 changed files with 19 additions and 1 deletions

View file

@ -38,6 +38,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