From aed3f7aedd05a381c84b2db9c674addb0e9f089c Mon Sep 17 00:00:00 2001 From: Vinicius Stock Date: Thu, 12 Dec 2024 13:34:01 -0500 Subject: [PATCH] Fix debug platform inclusion for Windows --- lib/ruby_lsp/setup_bundler.rb | 14 ++++++++++++-- test/integration_test.rb | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/ruby_lsp/setup_bundler.rb b/lib/ruby_lsp/setup_bundler.rb index 45c4b59ce..1cc762bae 100644 --- a/lib/ruby_lsp/setup_bundler.rb +++ b/lib/ruby_lsp/setup_bundler.rb @@ -152,7 +152,13 @@ def write_custom_gemfile end unless @dependencies["debug"] - parts << 'gem "debug", require: false, group: :development, platforms: :mri' + # The `mri` platform excludes Windows. We want to install the debug gem only on MRI for any operating system, + # but that constraint doesn't yet exist in Bundler. On Windows, we are manually checking if the engine is MRI + parts << if Gem.win_platform? + 'gem "debug", require: false, group: :development, install_if: -> { RUBY_ENGINE == "ruby" }' + else + 'gem "debug", require: false, group: :development, platforms: :mri' + end end if @rails_app && !@dependencies["ruby-lsp-rails"] @@ -238,9 +244,13 @@ def run_bundle_install(bundle_gemfile = @gemfile) sig { params(env: T::Hash[String, String]).returns(T::Hash[String, String]) } def run_bundle_install_directly(env) RubyVM::YJIT.enable if defined?(RubyVM::YJIT.enable) + + # The ENV can only be merged after checking if an update is required because we depend on the original value of + # ENV["BUNDLE_GEMFILE"], which gets overridden after the merge + should_update = should_bundle_update? T.unsafe(ENV).merge!(env) - unless should_bundle_update? + unless should_update Bundler::CLI::Install.new({}).run correct_relative_remote_paths if @custom_lockfile.exist? return env diff --git a/test/integration_test.rb b/test/integration_test.rb index f8670e401..84a7cc16d 100644 --- a/test/integration_test.rb +++ b/test/integration_test.rb @@ -145,6 +145,22 @@ def test_launch_mode_with_no_gemfile_and_bundle_path end end + def test_composed_bundle_includes_debug + in_temp_dir do |dir| + Bundler.with_unbundled_env do + launch(dir) + + _stdout, stderr = capture_subprocess_io do + system( + { "BUNDLE_GEMFILE" => File.join(dir, ".ruby-lsp", "Gemfile") }, + "bundle exec ruby -e 'require \"debug\"'", + ) + end + assert_empty(stderr) + end + end + end + private def launch(workspace_path)