Files
gitlabhq/lib/gitlab/git/base_error.rb
2023-09-21 09:10:54 +00:00

60 lines
1.5 KiB
Ruby

# frozen_string_literal: true
require 'grpc'
module Gitlab
module Git
class BaseError < StandardError
METADATA_KEY = :gitaly_error_metadata
DEBUG_ERROR_STRING_REGEX = /(.*?) debug_error_string:.*$/m
GRPC_CODES = {
'0' => 'ok',
'1' => 'cancelled',
'2' => 'unknown',
'3' => 'invalid_argument',
'4' => 'deadline_exceeded',
'5' => 'not_found',
'6' => 'already_exists',
'7' => 'permission_denied',
'8' => 'resource_exhausted',
'9' => 'failed_precondition',
'10' => 'aborted',
'11' => 'out_of_range',
'12' => 'unimplemented',
'13' => 'internal',
'14' => 'unavailable',
'15' => 'data_loss',
'16' => 'unauthenticated'
}.freeze
attr_reader :status, :code, :service, :metadata
def initialize(msg = nil)
super && return if msg.nil?
if msg.is_a?(::GRPC::BadStatus)
set_grpc_error_code(msg)
set_grpc_error_metadata(msg)
end
super(build_raw_message(msg))
end
def build_raw_message(message)
raw_message = message.to_s
match = DEBUG_ERROR_STRING_REGEX.match(raw_message)
match ? match[1] : raw_message
end
def set_grpc_error_code(grpc_error)
@status = grpc_error.code
@code = GRPC_CODES[@status.to_s]
@service = 'git'
end
def set_grpc_error_metadata(grpc_error)
@metadata = grpc_error.metadata.fetch(METADATA_KEY, {}).clone
end
end
end
end