Commit 7c12a8d4 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Move rebase to async worker

Signed-off-by: default avatarDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
parent 34457b30
...@@ -235,8 +235,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController ...@@ -235,8 +235,9 @@ class Projects::MergeRequestsController < Projects::ApplicationController
return access_denied! unless @merge_request.can_be_merged_by?(current_user) return access_denied! unless @merge_request.can_be_merged_by?(current_user)
return render_404 unless @merge_request.approved? return render_404 unless @merge_request.approved?
MergeRequests::RebaseService.new(merge_request.target_project, current_user). RebaseWorker.perform_async(@merge_request.id, current_user.id)
execute(merge_request)
redirect_to merge_request_path(@merge_request), notice: 'Rebase started. It will take some time'
end end
protected protected
......
...@@ -25,14 +25,30 @@ module MergeRequests ...@@ -25,14 +25,30 @@ module MergeRequests
# Clone # Clone
output, status = popen(%W(git clone -b #{merge_request.source_branch} -- #{source_project.repository.path_to_repo} #{tree_path})) output, status = popen(%W(git clone -b #{merge_request.source_branch} -- #{source_project.repository.path_to_repo} #{tree_path}))
raise 'Failed to clone repo' unless status.zero?
unless status.zero?
log('Failed to clone repository for rebase:')
log(output)
return false
end
# Rebase # Rebase
output, status = popen(%W(git pull --rebase #{target_project.repository.path_to_repo} #{merge_request.target_branch}), tree_path) output, status = popen(%W(git pull --rebase #{target_project.repository.path_to_repo} #{merge_request.target_branch}), tree_path)
raise 'Failed to rebase' unless status.zero?
unless status.zero?
log('Failed to rebase branch:')
log(output)
return false
end
# Push
output, status = popen(%W(git push -f origin #{merge_request.source_branch}), tree_path) output, status = popen(%W(git push -f origin #{merge_request.source_branch}), tree_path)
raise 'Failed to push' unless status.zero?
unless status.zero?
log('Failed to push rebased branch:')
log(output)
return false
end
true true
ensure ensure
...@@ -50,5 +66,9 @@ module MergeRequests ...@@ -50,5 +66,9 @@ module MergeRequests
def tree_path def tree_path
@tree_path ||= Rails.root.join('tmp', 'rebase', source_project.id.to_s, SecureRandom.hex).to_s @tree_path ||= Rails.root.join('tmp', 'rebase', source_project.id.to_s, SecureRandom.hex).to_s
end end
def log(message)
Gitlab::GitLogger.error(message)
end
end end
end end
class RebaseWorker
include Sidekiq::Worker
sidekiq_options queue: :default
def perform(merge_request_id, current_user_id)
current_user = User.find(current_user_id)
merge_request = MergeRequest.find(merge_request_id)
MergeRequests::RebaseService.new(merge_request.target_project, current_user).
execute(merge_request)
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment