Skip to content
代码片段 群组 项目
提交 3f00efa7 编辑于 作者: Vasilii Iakliushin's avatar Vasilii Iakliushin
浏览文件

Add a upper limit for merge request diffs versions

Contributes to https://gitlab.com/gitlab-org/gitlab/-/issues/517497

**Problem**

The upper limit for merge request diffs version is missing.

**Solution**

* Stop creating new diffs versions after reaching the limit.
* Display an error message to the user
上级 7cce640f
No related branches found
No related tags found
2 合并请求!3031Merge per-main-jh to main-jh by luzhiyuan,!3030Merge per-main-jh to main-jh
......@@ -411,6 +411,8 @@ def show_merge_request
)
end
display_max_limit_warning
respond_to do |format|
format.html do
# use next to appease Rubocop
......@@ -685,6 +687,14 @@ def diffs_stream_resource_url(merge_request, offset, diff_view)
view: diff_view
)
end
def display_max_limit_warning
return unless @merge_request.reached_versions_limit?
flash[:alert] = format(
_("This merge request has reached the maximum limit of %{limit} versions and cannot be updated further. " \
"Close this merge request and create a new one instead."), limit: MergeRequest::DIFF_VERSION_LIMIT)
end
end
Projects::MergeRequestsController.prepend_mod_with('Projects::MergeRequestsController')
......@@ -39,6 +39,7 @@ class MergeRequest < ApplicationRecord
SORTING_PREFERENCE_FIELD = :merge_requests_sort
CI_MERGE_REQUEST_DESCRIPTION_MAX_LENGTH = 2700
MERGE_LEASE_TIMEOUT = 15.minutes.to_i
DIFF_VERSION_LIMIT = 1_000
belongs_to :target_project, class_name: "Project"
belongs_to :source_project, class_name: "Project"
......@@ -2454,6 +2455,12 @@ def squash_option
delegate :squash_always?, :squash_never?, :squash_enabled_by_default?, :squash_readonly?, to: :squash_option
def reached_versions_limit?
return false if Feature.disabled?(:merge_requests_diffs_limit, target_project)
merge_request_diffs.count >= DIFF_VERSION_LIMIT
end
private
def merge_base_pipelines
......
......@@ -9,6 +9,9 @@ def initialize(merge_request, current_user)
def execute
old_diff_refs = merge_request.diff_refs
return if merge_request.reached_versions_limit?
new_diff = merge_request.create_merge_request_diff
clear_cache(new_diff)
......
---
name: merge_requests_diffs_limit
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/517497
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/183063
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/521970
milestone: '17.10'
group: group::source code
type: gitlab_com_derisk
default_enabled: false
......@@ -59421,6 +59421,9 @@ msgstr ""
msgid "This merge request does not have codequality reports"
msgstr ""
 
msgid "This merge request has reached the maximum limit of %{limit} versions and cannot be updated further. Close this merge request and create a new one instead."
msgstr ""
msgid "This merge request is closed. To apply this suggestion, edit this file directly."
msgstr ""
 
......@@ -25,6 +25,30 @@
it { is_expected.to have_gitlab_http_status(:not_found) }
end
context 'when diff version limit is reached' do
before do
stub_const('MergeRequest::DIFF_VERSION_LIMIT', 1)
end
it 'displays a warning' do
get project_merge_request_path(project, merge_request)
expect(flash[:alert]).to include('This merge request has reached the maximum limit')
end
context 'when "merge_requests_diffs_limit" feature flag is disabled' do
before do
stub_feature_flags(merge_requests_diffs_limit: false)
end
it 'does not display a warning' do
get project_merge_request_path(project, merge_request)
expect(flash[:alert]).to be_blank
end
end
end
end
describe 'GET #index' do
......
......@@ -32,6 +32,26 @@
subject.execute
end
context 'when the number of diff versions reaches the limit' do
before do
stub_const('MergeRequest::DIFF_VERSION_LIMIT', 1)
end
it 'does not create a new diff' do
expect { subject.execute }.not_to change { merge_request.merge_request_diffs.count }
end
context 'when "merge_requests_diffs_limit" feature flag is disabled' do
before do
stub_feature_flags(merge_requests_diffs_limit: false)
end
it 'creates new merge request diff' do
expect { subject.execute }.to change { merge_request.merge_request_diffs.count }.by(1)
end
end
end
context 'cache clearing' do
it 'clears the cache for older diffs on the merge request' do
expect_next_instance_of(Gitlab::Diff::FileCollection::MergeRequestDiff) do |instance|
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册