summaryrefslogtreecommitdiff
path: root/app/services/merge_requests
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-05-20 14:34:42 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-05-20 14:34:42 +0000
commit9f46488805e86b1bc341ea1620b866016c2ce5ed (patch)
treef9748c7e287041e37d6da49e0a29c9511dc34768 /app/services/merge_requests
parentdfc92d081ea0332d69c8aca2f0e745cb48ae5e6d (diff)
downloadgitlab-ce-9f46488805e86b1bc341ea1620b866016c2ce5ed.tar.gz
Add latest changes from gitlab-org/gitlab@13-0-stable-ee
Diffstat (limited to 'app/services/merge_requests')
-rw-r--r--app/services/merge_requests/base_service.rb31
-rw-r--r--app/services/merge_requests/rebase_service.rb8
-rw-r--r--app/services/merge_requests/refresh_service.rb4
-rw-r--r--app/services/merge_requests/squash_service.rb18
4 files changed, 50 insertions, 11 deletions
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index 00bf69739ad..7f7bfa29af7 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -39,6 +39,8 @@ module MergeRequests
# Don't try to print expensive instance variables.
def inspect
+ return "#<#{self.class}>" unless respond_to?(:merge_request)
+
"#<#{self.class} #{merge_request.to_reference(full: true)}>"
end
@@ -89,8 +91,7 @@ module MergeRequests
end
def can_use_merge_request_ref?(merge_request)
- Feature.enabled?(:ci_use_merge_request_ref, project, default_enabled: true) &&
- !merge_request.for_fork?
+ !merge_request.for_fork?
end
def abort_auto_merge(merge_request, reason)
@@ -115,6 +116,32 @@ module MergeRequests
yield merge_request
end
end
+
+ def log_error(exception:, message:, save_message_on_model: false)
+ reference = merge_request.to_reference(full: true)
+ data = {
+ class: self.class.name,
+ message: message,
+ merge_request_id: merge_request.id,
+ merge_request: reference,
+ save_message_on_model: save_message_on_model
+ }
+
+ if exception
+ Gitlab::ErrorTracking.with_context(current_user) do
+ Gitlab::ErrorTracking.track_exception(exception, data)
+ end
+
+ data[:"exception.message"] = exception.message
+ end
+
+ # TODO: Deprecate Gitlab::GitLogger since ErrorTracking should suffice:
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/216379
+ data[:message] = "#{self.class.name} error (#{reference}): #{message}"
+ Gitlab::GitLogger.error(data)
+
+ merge_request.update(merge_error: message) if save_message_on_model
+ end
end
end
diff --git a/app/services/merge_requests/rebase_service.rb b/app/services/merge_requests/rebase_service.rb
index bc1e97088af..87808a21a15 100644
--- a/app/services/merge_requests/rebase_service.rb
+++ b/app/services/merge_requests/rebase_service.rb
@@ -2,8 +2,6 @@
module MergeRequests
class RebaseService < MergeRequests::BaseService
- include Git::Logger
-
REBASE_ERROR = 'Rebase failed. Please rebase locally'
attr_reader :merge_request
@@ -22,7 +20,7 @@ module MergeRequests
def rebase
# Ensure Gitaly isn't already running a rebase
if source_project.repository.rebase_in_progress?(merge_request.id)
- log_error('Rebase task canceled: Another rebase is already in progress', save_message_on_model: true)
+ log_error(exception: nil, message: 'Rebase task canceled: Another rebase is already in progress', save_message_on_model: true)
return false
end
@@ -30,8 +28,8 @@ module MergeRequests
true
rescue => e
- log_error(REBASE_ERROR, save_message_on_model: true)
- log_error(e.message)
+ log_error(exception: e, message: REBASE_ERROR, save_message_on_model: true)
+
false
ensure
merge_request.update_column(:rebase_jid, nil)
diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb
index c6e1651fa26..56a91fa0305 100644
--- a/app/services/merge_requests/refresh_service.rb
+++ b/app/services/merge_requests/refresh_service.rb
@@ -115,6 +115,10 @@ module MergeRequests
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/app/services/merge_requests/squash_service.rb b/app/services/merge_requests/squash_service.rb
index d25997c925e..4b04d42b48e 100644
--- a/app/services/merge_requests/squash_service.rb
+++ b/app/services/merge_requests/squash_service.rb
@@ -2,7 +2,7 @@
module MergeRequests
class SquashService < MergeRequests::BaseService
- include Git::Logger
+ SquashInProgressError = Class.new(RuntimeError)
def execute
# If performing a squash would result in no change, then
@@ -11,11 +11,13 @@ module MergeRequests
return success(squash_sha: merge_request.diff_head_sha)
end
- if merge_request.squash_in_progress?
+ if squash_in_progress?
return error(s_('MergeRequests|Squash task canceled: another squash is already in progress.'))
end
squash! || error(s_('MergeRequests|Failed to squash. Should be done manually.'))
+ rescue SquashInProgressError
+ error(s_('MergeRequests|An error occurred while checking whether another squash is in progress.'))
end
private
@@ -25,11 +27,19 @@ module MergeRequests
success(squash_sha: squash_sha)
rescue => e
- log_error("Failed to squash merge request #{merge_request.to_reference(full: true)}:")
- log_error(e.message)
+ log_error(exception: e, message: 'Failed to squash merge request')
+
false
end
+ def squash_in_progress?
+ merge_request.squash_in_progress?
+ rescue => e
+ log_error(exception: e, message: 'Failed to check squash in progress')
+
+ raise SquashInProgressError, e.message
+ end
+
def repository
target_project.repository
end