summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEdouard CHIN <chin.edouard@gmail.com>2025-11-19 23:15:41 +0100
committergit <svn-admin@ruby-lang.org>2025-11-20 22:05:13 +0000
commit409c004affa30efbbfd384a9cd645f7969ccc11a (patch)
treedc8784fa9fd865cc278dacbce25ed0a721d8e02d /lib
parentbd60600d00f13234cad83c9c5af5b6607a4b0fba (diff)
[ruby/rubygems] Make the Bundler logger thread safe:
- The Logger is not thread safe when calling `with_level`. This now becomes problematic because we are using multiple threads during the resolution phase in order to fetch git gems. https://github.com/ruby/rubygems/commit/380653ae74
Diffstat (limited to 'lib')
-rw-r--r--lib/bundler/ui/shell.rb16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/bundler/ui/shell.rb b/lib/bundler/ui/shell.rb
index 6f080b6459..b836208da8 100644
--- a/lib/bundler/ui/shell.rb
+++ b/lib/bundler/ui/shell.rb
@@ -17,6 +17,7 @@ module Bundler
@level = ENV["DEBUG"] ? "debug" : "info"
@warning_history = []
@output_stream = :stdout
+ @thread_safe_logger_key = "logger_level_#{object_id}"
end
def add_color(string, *color)
@@ -97,11 +98,13 @@ module Bundler
end
def level(name = nil)
- return @level unless name
+ current_level = Thread.current.thread_variable_get(@thread_safe_logger_key) || @level
+ return current_level unless name
+
unless index = LEVELS.index(name)
raise "#{name.inspect} is not a valid level"
end
- index <= LEVELS.index(@level)
+ index <= LEVELS.index(current_level)
end
def output_stream=(symbol)
@@ -167,12 +170,13 @@ module Bundler
end * "\n"
end
- def with_level(level)
- original = @level
- @level = level
+ def with_level(desired_level)
+ old_level = level
+ Thread.current.thread_variable_set(@thread_safe_logger_key, desired_level)
+
yield
ensure
- @level = original
+ Thread.current.thread_variable_set(@thread_safe_logger_key, old_level)
end
def with_output_stream(symbol)