mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
59 lines
1.3 KiB
Ruby
59 lines
1.3 KiB
Ruby
# typed: false
|
|
# frozen_string_literal: true
|
|
|
|
require "warnings"
|
|
Warnings.ignore(/warning: callcc is obsolete; use Fiber instead/) do
|
|
require "continuation"
|
|
end
|
|
|
|
# Provides the ability to optionally ignore errors raised and continue execution.
|
|
#
|
|
# @api private
|
|
module Ignorable
|
|
# Marks exceptions which can be ignored and provides
|
|
# the ability to jump back to where it was raised.
|
|
module ExceptionMixin
|
|
attr_accessor :continuation
|
|
|
|
def ignore
|
|
continuation.call
|
|
end
|
|
end
|
|
|
|
def self.hook_raise
|
|
Object.class_eval do
|
|
alias_method :original_raise, :raise
|
|
|
|
def raise(*)
|
|
callcc do |continuation|
|
|
super
|
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
|
unless e.is_a?(ScriptError)
|
|
e.extend(ExceptionMixin)
|
|
e.continuation = continuation
|
|
end
|
|
super(e)
|
|
end
|
|
end
|
|
|
|
alias_method :fail, :raise
|
|
end
|
|
|
|
return unless block_given?
|
|
|
|
yield
|
|
unhook_raise
|
|
end
|
|
|
|
def self.unhook_raise
|
|
Object.class_eval do
|
|
# False positive - https://github.com/rubocop/rubocop/issues/5022
|
|
# rubocop:disable Lint/DuplicateMethods
|
|
alias_method :raise, :original_raise
|
|
alias_method :fail, :original_raise
|
|
# rubocop:enable Lint/DuplicateMethods
|
|
undef :original_raise
|
|
end
|
|
end
|
|
end
|