diff options
author | Bundlerbot <bot@bundler.io> | 2019-04-04 19:57:11 +0000 |
---|---|---|
committer | Bundlerbot <bot@bundler.io> | 2019-04-04 19:57:11 +0000 |
commit | 79c380f58112be7d0a71b167ff026ab2a9e9f9a2 (patch) | |
tree | 7330fc055b7ba96220648379095fa8cf75b8669a | |
parent | be2a4d069e753d17381c9629f00c4927c3cacb76 (diff) | |
parent | 70cb2f0767395a7ae9f5955eab1b16f30cf05930 (diff) | |
download | bundler-79c380f58112be7d0a71b167ff026ab2a9e9f9a2.tar.gz |
Merge #7023
7023: Shellsplit build config r=deivid-rodriguez a=deivid-rodriguez
### What was the end-user problem that led to this PR?
The problem was #6940. Build configurations with multiple whitepaced parameter are no longer properly handled.
### What was your diagnosis of the problem?
My diagnosis was not mine, was @jeremy's: Since [shellscaping / shelljoining build arguments to the rubygems gem installer](https://github.com/bundler/bundler/issues/6940), these are no longer properly passed
### What is your fix for the problem, implemented in this PR?
My fix is not mine, it's @jeremy's: shellsplit settings before passing them.
### Why did you choose this fix out of the possible options?
I chose this fix because it works and it sounds like the proper followup to https://github.com/rubygems/rubygems/pull/2441.
Fixes #6940.
Co-authored-by: David RodrÃguez <deivid.rodriguez@riseup.net>
-rw-r--r-- | lib/bundler/installer/gem_installer.rb | 6 | ||||
-rw-r--r-- | spec/bundler/installer/gem_installer_spec.rb | 11 | ||||
-rw-r--r-- | spec/install/gems/native_extensions_spec.rb | 41 |
3 files changed, 57 insertions, 1 deletions
diff --git a/lib/bundler/installer/gem_installer.rb b/lib/bundler/installer/gem_installer.rb index e5e245f970..9689911d6c 100644 --- a/lib/bundler/installer/gem_installer.rb +++ b/lib/bundler/installer/gem_installer.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "shellwords" + module Bundler class GemInstaller attr_reader :spec, :standalone, :worker, :force, :installer @@ -56,7 +58,9 @@ module Bundler def spec_settings # Fetch the build settings, if there are any - Bundler.settings["build.#{spec.name}"] + if settings = Bundler.settings["build.#{spec.name}"] + Shellwords.shellsplit(settings) + end end def install diff --git a/spec/bundler/installer/gem_installer_spec.rb b/spec/bundler/installer/gem_installer_spec.rb index f559c5e141..8f8d1c6d15 100644 --- a/spec/bundler/installer/gem_installer_spec.rb +++ b/spec/bundler/installer/gem_installer_spec.rb @@ -26,4 +26,15 @@ RSpec.describe Bundler::GemInstaller do subject.install_from_spec end end + + context "spec_settings is build option with spaces" do + it "invokes install method with build_args" do + allow(Bundler.settings).to receive(:[]).with(:bin) + allow(Bundler.settings).to receive(:[]).with(:inline) + allow(Bundler.settings).to receive(:[]).with(:forget_cli_options) + allow(Bundler.settings).to receive(:[]).with("build.dummy").and_return("--with-dummy-config=dummy --with-another-dummy-config") + expect(spec_source).to receive(:install).with(spec, :force => false, :ensure_builtin_gems_cached => false, :build_args => ["--with-dummy-config=dummy", "--with-another-dummy-config"]) + subject.install_from_spec + end + end end diff --git a/spec/install/gems/native_extensions_spec.rb b/spec/install/gems/native_extensions_spec.rb index 8cf7b7dc6a..d3281f9012 100644 --- a/spec/install/gems/native_extensions_spec.rb +++ b/spec/install/gems/native_extensions_spec.rb @@ -87,4 +87,45 @@ RSpec.describe "installing a gem with native extensions", :ruby_repo do run! "Bundler.require; puts CExtension.new.its_true" expect(out).to eq("true") end + + it "install with multiple build flags" do + build_git "c_extension" do |s| + s.extensions = ["ext/extconf.rb"] + s.write "ext/extconf.rb", <<-E + require "mkmf" + name = "c_extension_bundle" + dir_config(name) + raise "OMG" unless with_config("c_extension") == "hello" && with_config("c_extension_bundle-dir") == "hola" + create_makefile(name) + E + + s.write "ext/c_extension.c", <<-C + #include "ruby.h" + + VALUE c_extension_true(VALUE self) { + return Qtrue; + } + + void Init_c_extension_bundle() { + VALUE c_Extension = rb_define_class("CExtension", rb_cObject); + rb_define_method(c_Extension, "its_true", c_extension_true, 0); + } + C + + s.write "lib/c_extension.rb", <<-C + require "c_extension_bundle" + C + end + + bundle! "config build.c_extension --with-c_extension=hello --with-c_extension_bundle-dir=hola" + + install_gemfile! <<-G + gem "c_extension", :git => #{lib_path("c_extension-1.0").to_s.dump} + G + + expect(out).not_to include("extconf.rb failed") + + run! "Bundler.require; puts CExtension.new.its_true" + expect(out).to eq("true") + end end |