diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-20 14:34:42 +0000 |
commit | 9f46488805e86b1bc341ea1620b866016c2ce5ed (patch) | |
tree | f9748c7e287041e37d6da49e0a29c9511dc34768 /app/services/merge_requests | |
parent | dfc92d081ea0332d69c8aca2f0e745cb48ae5e6d (diff) | |
download | gitlab-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.rb | 31 | ||||
-rw-r--r-- | app/services/merge_requests/rebase_service.rb | 8 | ||||
-rw-r--r-- | app/services/merge_requests/refresh_service.rb | 4 | ||||
-rw-r--r-- | app/services/merge_requests/squash_service.rb | 18 |
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 |