diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index c6e1651fa262f78cca18b2782edc02dcb6e477cd..56a91fa0305b3e51b6558613f76c964081d34385 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -115,6 +115,10 @@ def reload_merge_requests filter_merge_requests(merge_requests).each do |merge_request| if branch_and_project_match?(merge_request) || @push.force_push? merge_request.reload_diff(current_user) + # Clear existing merge error if the push were directed at the + # source branch. Clearing the error when the target branch + # changes will hide the error from the user. + merge_request.merge_error = nil elsif merge_request.merge_request_diff.includes_any_commits?(push_commit_ids) merge_request.reload_diff(current_user) end diff --git a/changelogs/unreleased/sh-fix-merge-request-stickiness.yml b/changelogs/unreleased/sh-fix-merge-request-stickiness.yml new file mode 100644 index 0000000000000000000000000000000000000000..796648f7eded49a9c04940eb5be8f42240eb35cd --- /dev/null +++ b/changelogs/unreleased/sh-fix-merge-request-stickiness.yml @@ -0,0 +1,5 @@ +--- +title: Clear merge request error on push to source branch +merge_request: 32001 +author: +type: fixed diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb index de7b933f89d9a7bc82a5c4e38058529e296b7d03..3e252212cdbfdf3eaf9595386cbc23154ffd6d08 100644 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ b/spec/services/merge_requests/refresh_service_spec.rb @@ -94,6 +94,31 @@ expect(@fork_build_failed_todo).to be_done end + context 'when a merge error exists' do + let(:error_message) { 'This is a merge error' } + + before do + @merge_request = create(:merge_request, + source_project: @project, + source_branch: 'feature', + target_branch: 'master', + target_project: @project, + merge_error: error_message) + end + + it 'clears merge errors when pushing to the source branch' do + expect { refresh_service.execute(@oldrev, @newrev, 'refs/heads/feature') } + .to change { @merge_request.reload.merge_error } + .from(error_message) + .to(nil) + end + + it 'does not clear merge errors when pushing to the target branch' do + expect { refresh_service.execute(@oldrev, @newrev, 'refs/heads/master') } + .not_to change { @merge_request.reload.merge_error } + end + end + it 'reloads source branch MRs memoization' do refresh_service.execute(@oldrev, @newrev, 'refs/heads/master')