From 9211b541d3eaa60401f4ab6a5d264f9179ad4160 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 16:22:23 +0200 Subject: Improve MR code reloading when push code Every time you pushed to master it updates merge requests that has master as target branch. So if you have 50 open merge requests point to master it will reload all of them every time you push a single commit to master. The funny thing is that after reloading diff of most merge requests looks the same. After this patch we update diff only if we push commit to master that includes in MR commits list. For example we have next repository: feature: A - B - C master: A We create merge requests #1 with code from feature to master. MR #1: B - C If we push to master commit D - MR will not be reloaded. So picture will look next: feature: A - B - C master: A - D MR #1: B - C And if we push to master commit B - MR will be reloaded. So picture will look next: feature: A - B - C master: A - B MR #1: C Signed-off-by: Dmitriy Zaporozhets --- app/services/merge_requests/refresh_service.rb | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index 74448998ddd..1a1704aea77 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -43,8 +43,22 @@ module MergeRequests merge_requests = filter_merge_requests(merge_requests) merge_requests.each do |merge_request| - merge_request.reload_code - merge_request.mark_as_unchecked + + if merge_request.source_branch == @branch_name + merge_request.reload_code + merge_request.mark_as_unchecked + else + mr_commit_ids = merge_request.commits.map(&:id) + push_commit_ids = @commits.map(&:id) + matches = mr_commit_ids & push_commit_ids + + if matches.any? + merge_request.reload_code + merge_request.mark_as_unchecked + else + merge_request.mark_as_unchecked + end + end end end -- cgit v1.2.1 From 835cbc06d8d9c773a3b405eca81650378a8ccdcd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 2 Dec 2014 17:42:56 +0200 Subject: Reload mr code on force push too Signed-off-by: Dmitriy Zaporozhets --- app/services/merge_requests/refresh_service.rb | 7 ++++++- lib/gitlab/force_push_check.rb | 15 +++++++++++++++ lib/gitlab/git_access.rb | 9 +-------- 3 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 lib/gitlab/force_push_check.rb diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index 1a1704aea77..baf0936cc3d 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -3,6 +3,7 @@ module MergeRequests def execute(oldrev, newrev, ref) return true unless ref =~ /heads/ + @oldrev, @newrev = oldrev, newrev @branch_name = ref.gsub("refs/heads/", "") @fork_merge_requests = @project.fork_merge_requests.opened @commits = @project.repository.commits_between(oldrev, newrev) @@ -35,6 +36,10 @@ module MergeRequests end end + def force_push? + Gitlab::ForcePushCheck.force_push?(@project, @oldrev, @newrev) + end + # Refresh merge request diff if we push to source or target branch of merge request # Note: we should update merge requests from forks too def reload_merge_requests @@ -44,7 +49,7 @@ module MergeRequests merge_requests.each do |merge_request| - if merge_request.source_branch == @branch_name + if merge_request.source_branch == @branch_name || force_push? merge_request.reload_code merge_request.mark_as_unchecked else diff --git a/lib/gitlab/force_push_check.rb b/lib/gitlab/force_push_check.rb new file mode 100644 index 00000000000..6a52cdba608 --- /dev/null +++ b/lib/gitlab/force_push_check.rb @@ -0,0 +1,15 @@ +module Gitlab + class ForcePushCheck + def self.force_push?(project, oldrev, newrev) + return false if project.empty_repo? + + if oldrev != Gitlab::Git::BLANK_SHA && newrev != Gitlab::Git::BLANK_SHA + missed_refs = IO.popen(%W(git --git-dir=#{project.repository.path_to_repo} rev-list #{oldrev} ^#{newrev})).read + missed_refs.split("\n").size > 0 + else + false + end + end + end +end + diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb index 5f8cb19efdf..8b4729896b5 100644 --- a/lib/gitlab/git_access.rb +++ b/lib/gitlab/git_access.rb @@ -94,14 +94,7 @@ module Gitlab end def forced_push?(project, oldrev, newrev) - return false if project.empty_repo? - - if oldrev != Gitlab::Git::BLANK_SHA && newrev != Gitlab::Git::BLANK_SHA - missed_refs = IO.popen(%W(git --git-dir=#{project.repository.path_to_repo} rev-list #{oldrev} ^#{newrev})).read - missed_refs.split("\n").size > 0 - else - false - end + Gitlab::ForcePushCheck.force_push?(project, oldrev, newrev) end private -- cgit v1.2.1