Do not reload diff for merge request made from fork when target branch in fork is updated
The target branch of a merge request has to be a branch in the project for which the merge request is submitted. When a branch changes in a fork, it does not make sense to reload diffs of merge requests in the upstream project that use the same branch name as the target branch. Please note that it does make sense to reload diffs when the source branch changes.
This commit is contained in:
parent
aa0a7aa3b5
commit
9190cea215
|
@ -101,7 +101,9 @@ class MergeRequest < ActiveRecord::Base
|
||||||
validate :validate_branches, unless: [:allow_broken, :importing?, :closed_without_fork?]
|
validate :validate_branches, unless: [:allow_broken, :importing?, :closed_without_fork?]
|
||||||
validate :validate_fork, unless: :closed_without_fork?
|
validate :validate_fork, unless: :closed_without_fork?
|
||||||
|
|
||||||
scope :by_branch, ->(branch_name) { where("(source_branch LIKE :branch) OR (target_branch LIKE :branch)", branch: branch_name) }
|
scope :by_source_or_target_branch, ->(branch_name) do
|
||||||
|
where("source_branch = :branch OR target_branch = :branch", branch: branch_name)
|
||||||
|
end
|
||||||
scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) }
|
scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) }
|
||||||
scope :by_milestone, ->(milestone) { where(milestone_id: milestone) }
|
scope :by_milestone, ->(milestone) { where(milestone_id: milestone) }
|
||||||
scope :of_projects, ->(ids) { where(target_project_id: ids) }
|
scope :of_projects, ->(ids) { where(target_project_id: ids) }
|
||||||
|
|
|
@ -55,8 +55,9 @@ module MergeRequests
|
||||||
# Refresh merge request diff if we push to source or target branch of merge request
|
# Refresh merge request diff if we push to source or target branch of merge request
|
||||||
# Note: we should update merge requests from forks too
|
# Note: we should update merge requests from forks too
|
||||||
def reload_merge_requests
|
def reload_merge_requests
|
||||||
merge_requests = @project.merge_requests.opened.by_branch(@branch_name).to_a
|
merge_requests = @project.merge_requests.opened.
|
||||||
merge_requests += fork_merge_requests.by_branch(@branch_name).to_a
|
by_source_or_target_branch(@branch_name).to_a
|
||||||
|
merge_requests += fork_merge_requests
|
||||||
merge_requests = filter_merge_requests(merge_requests)
|
merge_requests = filter_merge_requests(merge_requests)
|
||||||
|
|
||||||
merge_requests.each do |merge_request|
|
merge_requests.each do |merge_request|
|
||||||
|
@ -157,13 +158,14 @@ module MergeRequests
|
||||||
def merge_requests_for_source_branch
|
def merge_requests_for_source_branch
|
||||||
@source_merge_requests ||= begin
|
@source_merge_requests ||= begin
|
||||||
merge_requests = @project.origin_merge_requests.opened.where(source_branch: @branch_name).to_a
|
merge_requests = @project.origin_merge_requests.opened.where(source_branch: @branch_name).to_a
|
||||||
merge_requests += fork_merge_requests.where(source_branch: @branch_name).to_a
|
merge_requests += fork_merge_requests
|
||||||
filter_merge_requests(merge_requests)
|
filter_merge_requests(merge_requests)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def fork_merge_requests
|
def fork_merge_requests
|
||||||
@fork_merge_requests ||= @project.fork_merge_requests.opened
|
@fork_merge_requests ||= @project.fork_merge_requests.opened.
|
||||||
|
where(source_branch: @branch_name).to_a
|
||||||
end
|
end
|
||||||
|
|
||||||
def branch_added?
|
def branch_added?
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Do not reload diff for merge request made from fork when target branch in fork is updated
|
||||||
|
merge_request: 7973
|
||||||
|
author:
|
|
@ -126,17 +126,27 @@ describe MergeRequests::RefreshService, services: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'push to fork repo target branch' do
|
context 'push to fork repo target branch' do
|
||||||
before do
|
describe 'changes to merge requests' do
|
||||||
service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
|
before do
|
||||||
reload_mrs
|
service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
|
||||||
|
reload_mrs
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(@merge_request.notes).to be_empty }
|
||||||
|
it { expect(@merge_request).to be_open }
|
||||||
|
it { expect(@fork_merge_request.notes).to be_empty }
|
||||||
|
it { expect(@fork_merge_request).to be_open }
|
||||||
|
it { expect(@build_failed_todo).to be_pending }
|
||||||
|
it { expect(@fork_build_failed_todo).to be_pending }
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(@merge_request.notes).to be_empty }
|
describe 'merge request diff' do
|
||||||
it { expect(@merge_request).to be_open }
|
it 'does not reload the diff of the merge request made from fork' do
|
||||||
it { expect(@fork_merge_request.notes).to be_empty }
|
expect do
|
||||||
it { expect(@fork_merge_request).to be_open }
|
service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/feature')
|
||||||
it { expect(@build_failed_todo).to be_pending }
|
end.not_to change { @fork_merge_request.reload.merge_request_diff }
|
||||||
it { expect(@fork_build_failed_todo).to be_pending }
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'push to origin repo target branch after fork project was removed' do
|
context 'push to origin repo target branch after fork project was removed' do
|
||||||
|
|
Loading…
Reference in New Issue