diff options
author | The Bundler Bot <bot@bundler.io> | 2017-06-06 23:58:17 +0000 |
---|---|---|
committer | The Bundler Bot <bot@bundler.io> | 2017-06-06 23:58:17 +0000 |
commit | e32353b063292427beccdb48fd8d6d0c74555911 (patch) | |
tree | 16be450a5fc1959225c5112fa87fb2c820875c15 | |
parent | 28ab085c47268aca02c5abb465aabff50b326b9c (diff) | |
parent | 81656610125de15a56834a91ff4f8608b1dc04cc (diff) | |
download | bundler-e32353b063292427beccdb48fd8d6d0c74555911.tar.gz |
Auto merge of #5707 - bundler:seg-sort-by-name-spec-set, r=indirect
[SpecSet] Sort by name in #tsort
Closes #5696
This is required for backwards compatibility, see
issue #5696 for an example. The issue is that previous versions of bundler would have the load path in one (correct) order, and master has them in another (correct) order. So some projects depend on the load path ordering when multiple gems have the same requirable file.
- [x] Test case
-rw-r--r-- | lib/bundler/spec_set.rb | 3 | ||||
-rw-r--r-- | spec/runtime/setup_spec.rb | 44 |
2 files changed, 37 insertions, 10 deletions
diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb index 5fd6bd606f..9642633578 100644 --- a/lib/bundler/spec_set.rb +++ b/lib/bundler/spec_set.rb @@ -160,7 +160,8 @@ module Bundler end def tsort_each_node - @specs.each {|s| yield s } + # MUST sort by name for backwards compatibility + @specs.sort_by(&:name).each {|s| yield s } end def spec_for_dependency(dep, match_current_platform) diff --git a/spec/runtime/setup_spec.rb b/spec/runtime/setup_spec.rb index c94147dff7..8418f63c3b 100644 --- a/spec/runtime/setup_spec.rb +++ b/spec/runtime/setup_spec.rb @@ -108,6 +108,17 @@ RSpec.describe "Bundler.setup" do end context "load order" do + def clean_load_path(lp) + without_bundler_load_path = ruby!("puts $LOAD_PATH").split("\n") + lp = lp - [ + bundler_path.to_s, + bundler_path.join("gems/bundler-#{Bundler::VERSION}/lib").to_s, + tmp("rubygems/lib").to_s, + root.join("../lib").expand_path.to_s, + ] - without_bundler_load_path + lp.map! {|p| p.sub(/^#{system_gem_path}/, "") } + end + it "puts loaded gems after -I and RUBYLIB" do install_gemfile <<-G source "file://#{gem_repo1}" @@ -139,8 +150,6 @@ RSpec.describe "Bundler.setup" do gem "rails" G - without_bundler_load_path = ruby!("puts $LOAD_PATH").split("\n") - ruby! <<-RUBY require 'rubygems' require 'bundler' @@ -148,13 +157,7 @@ RSpec.describe "Bundler.setup" do puts $LOAD_PATH RUBY - load_path = out.split("\n") - [ - bundler_path.to_s, - bundler_path.join("gems/bundler-#{Bundler::VERSION}/lib").to_s, - tmp("rubygems/lib").to_s, - root.join("../lib").expand_path.to_s, - ] - without_bundler_load_path - load_path.map! {|lp| lp.sub(/^#{system_gem_path}/, "") } + load_path = clean_load_path(out.split("\n")) expect(load_path).to start_with( "/gems/rails-2.3.2/lib", @@ -166,6 +169,29 @@ RSpec.describe "Bundler.setup" do "/gems/rake-10.0.2/lib" ) end + + it "falls back to order the load path alphabetically for backwards compatibility" do + install_gemfile! <<-G + source "file://#{gem_repo1}" + gem "weakling" + gem "duradura" + gem "terranova" + G + + ruby! <<-RUBY + require 'rubygems' + require 'bundler/setup' + puts $LOAD_PATH + RUBY + + load_path = clean_load_path(out.split("\n")) + + expect(load_path).to start_with( + "/gems/weakling-0.0.3/lib", + "/gems/terranova-8/lib", + "/gems/duradura-7.0/lib" + ) + end end it "raises if the Gemfile was not yet installed" do |