mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
8598f8c2dc
rubygems 2.7.x depends bundler-1.15.x. This is preparation for rubygems and bundler migration. * lib/bundler.rb, lib/bundler/*: files of bundler-1.15.4 * spec/bundler/*: rspec examples of bundler-1.15.4. I applied patches. * https://github.com/bundler/bundler/pull/6007 * Exclude not working examples on ruby repository. * Fake ruby interpriter instead of installed ruby. * Makefile.in: Added test task named `test-bundler`. This task is only working macOS/linux yet. I'm going to support Windows environment later. * tool/sync_default_gems.rb: Added sync task for bundler. [Feature #12733][ruby-core:77172] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59779 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
65 lines
1.6 KiB
Ruby
65 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
module Bundler
|
|
# General purpose class for retrying code that may fail
|
|
class Retry
|
|
attr_accessor :name, :total_runs, :current_run
|
|
|
|
class << self
|
|
def default_attempts
|
|
default_retries + 1
|
|
end
|
|
alias_method :attempts, :default_attempts
|
|
|
|
def default_retries
|
|
Bundler.settings[:retry]
|
|
end
|
|
end
|
|
|
|
def initialize(name, exceptions = nil, retries = self.class.default_retries)
|
|
@name = name
|
|
@retries = retries
|
|
@exceptions = Array(exceptions) || []
|
|
@total_runs = @retries + 1 # will run once, then upto attempts.times
|
|
end
|
|
|
|
def attempt(&block)
|
|
@current_run = 0
|
|
@failed = false
|
|
@error = nil
|
|
run(&block) while keep_trying?
|
|
@result
|
|
end
|
|
alias_method :attempts, :attempt
|
|
|
|
private
|
|
|
|
def run(&block)
|
|
@failed = false
|
|
@current_run += 1
|
|
@result = block.call
|
|
rescue => e
|
|
fail_attempt(e)
|
|
end
|
|
|
|
def fail_attempt(e)
|
|
@failed = true
|
|
if last_attempt? || @exceptions.any? {|k| e.is_a?(k) }
|
|
Bundler.ui.info "" unless Bundler.ui.debug?
|
|
raise e
|
|
end
|
|
return true unless name
|
|
Bundler.ui.info "" unless Bundler.ui.debug? # Add new line incase dots preceded this
|
|
Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", Bundler.ui.debug?
|
|
end
|
|
|
|
def keep_trying?
|
|
return true if current_run.zero?
|
|
return false if last_attempt?
|
|
return true if @failed
|
|
end
|
|
|
|
def last_attempt?
|
|
current_run >= total_runs
|
|
end
|
|
end
|
|
end
|