summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2017-06-13 15:06:31 -0500
committerSamuel Giddins <segiddins@segiddins.me>2017-06-15 16:13:38 -0500
commit5f6a5b3766d9d0b7ad519e68b10eeb08541283e5 (patch)
treecb082e50fd8fd708fe47af93eaad9ab400a2bd93
parent08d1fa6ce9a2f4317b0754525a42abecd89e4321 (diff)
downloadbundler-seg-prefer-gems-rb.tar.gz
Add a feature flag to prefer gems.rb to Gemfileseg-prefer-gems-rb
With `prefer_gems_rb` set (by default on 2.0), Bundler will prefer a `gems.rb` that is in the same directory as a `Gemfile`
-rw-r--r--lib/bundler.rb2
-rw-r--r--lib/bundler/feature_flag.rb1
-rw-r--r--lib/bundler/settings.rb1
-rw-r--r--lib/bundler/shared_helpers.rb22
-rw-r--r--man/bundle-config.ronn6
-rw-r--r--spec/bundler/definition_spec.rb2
-rw-r--r--spec/install/gemfile_spec.rb16
7 files changed, 41 insertions, 9 deletions
diff --git a/lib/bundler.rb b/lib/bundler.rb
index 1228785734..ec695ffb54 100644
--- a/lib/bundler.rb
+++ b/lib/bundler.rb
@@ -206,7 +206,7 @@ module Bundler
def root
@root ||= begin
- default_gemfile.dirname.expand_path
+ SharedHelpers.root
rescue GemfileNotFound
bundle_dir = default_bundle_dir
raise GemfileNotFound, "Could not locate Gemfile or .bundle/ directory" unless bundle_dir
diff --git a/lib/bundler/feature_flag.rb b/lib/bundler/feature_flag.rb
index f472ba2b7b..34fddb1ecc 100644
--- a/lib/bundler/feature_flag.rb
+++ b/lib/bundler/feature_flag.rb
@@ -19,6 +19,7 @@ module Bundler
settings_flag(:init_gems_rb) { bundler_2_mode? }
settings_flag(:only_update_to_newer_versions) { bundler_2_mode? }
settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
+ settings_flag(:prefer_gems_rb) { bundler_2_mode? }
settings_flag(:update_requires_all_flag) { bundler_2_mode? }
def initialize(bundler_version)
diff --git a/lib/bundler/settings.rb b/lib/bundler/settings.rb
index 34747cbed7..9f4d5b30a0 100644
--- a/lib/bundler/settings.rb
+++ b/lib/bundler/settings.rb
@@ -28,6 +28,7 @@ module Bundler
no_prune
only_update_to_newer_versions
plugins
+ prefer_gems_rb
silence_root_warning
update_requires_all_flag
].freeze
diff --git a/lib/bundler/shared_helpers.rb b/lib/bundler/shared_helpers.rb
index 593d2c1e06..39f0423f7f 100644
--- a/lib/bundler/shared_helpers.rb
+++ b/lib/bundler/shared_helpers.rb
@@ -19,9 +19,15 @@ end
module Bundler
module SharedHelpers
- def default_gemfile
+ def root
gemfile = find_gemfile
raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
+ Pathname.new(gemfile).untaint.expand_path.parent
+ end
+
+ def default_gemfile
+ gemfile = find_gemfile(:order_matters)
+ raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
Pathname.new(gemfile).untaint
end
@@ -137,7 +143,7 @@ module Bundler
end
def print_major_deprecations!
- deprecate_gemfile(find_gemfile) if find_gemfile == find_file("Gemfile")
+ deprecate_gemfile(find_gemfile) if find_gemfile(:order_matters) == find_file("Gemfile")
if RUBY_VERSION < "2"
major_deprecation("Bundler will only support ruby >= 2.0, you are running #{RUBY_VERSION}")
end
@@ -172,10 +178,16 @@ module Bundler
private
- def find_gemfile
+ def find_gemfile(order_matters = false)
given = ENV["BUNDLE_GEMFILE"]
return given if given && !given.empty?
- find_file("Gemfile", "gems.rb")
+ names = gemfile_names
+ names.reverse! if order_matters && Bundler.feature_flag.prefer_gems_rb?
+ find_file(*names)
+ end
+
+ def gemfile_names
+ ["Gemfile", "gems.rb"]
end
def find_file(*names)
@@ -228,7 +240,7 @@ module Bundler
end
# Set BUNDLE_GEMFILE
- Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
+ Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile(:order_matters).to_s
Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
end
diff --git a/man/bundle-config.ronn b/man/bundle-config.ronn
index d387350f8b..4fa0025815 100644
--- a/man/bundle-config.ronn
+++ b/man/bundle-config.ronn
@@ -223,9 +223,11 @@ learn more about their operation in [bundle install(1)][bundle-install].
Sets the `--key` parameter for `gem push` when using the `rake release`
command with a private gemstash server.
* `error_on_stderr` (`BUNDLE_ERROR_ON_STDERR`)
- Print Bundler errors to stderr
+ Print Bundler errors to stderr.
* `init_gems_rb` (`BUNDLE_NEW_GEMFILE_NAME`)
- generate a new gems.rb on `bundle init` instead of the `Gemfile`
+ Generate a `gems.rb` instead of a `Gemfile` when running `bundle init`.
+* `prefer_gems_rb` (`BUNDLE_PREFER_GEMS_RB`)
+ Prefer `gems.rb` to `Gemfile` when Bundler is searching for a Gemfile.
* `update_requires_all_flag` (`BUNDLE_UPDATE_REQUIRES_ALL_FLAG`)
Require passing `--all` to `bundle update` when everything should be updated,
and disallow passing no options to `bundle update`.
diff --git a/spec/bundler/definition_spec.rb b/spec/bundler/definition_spec.rb
index 4e93d5e01c..cb642da9f7 100644
--- a/spec/bundler/definition_spec.rb
+++ b/spec/bundler/definition_spec.rb
@@ -5,7 +5,7 @@ RSpec.describe Bundler::Definition do
describe "#lock" do
before do
allow(Bundler).to receive(:settings) { Bundler::Settings.new(".") }
- allow(Bundler).to receive(:default_gemfile) { Pathname.new("Gemfile") }
+ allow(Bundler::SharedHelpers).to receive(:find_gemfile) { Pathname.new("Gemfile") }
allow(Bundler).to receive(:ui) { double("UI", :info => "", :debug => "") }
end
context "when it's not possible to write to the file" do
diff --git a/spec/install/gemfile_spec.rb b/spec/install/gemfile_spec.rb
index 9262dcc92d..d1b1f1e6b8 100644
--- a/spec/install/gemfile_spec.rb
+++ b/spec/install/gemfile_spec.rb
@@ -66,6 +66,22 @@ RSpec.describe "bundle install" do
end
end
+ context "with prefer_gems_rb set" do
+ before { bundle! "config prefer_gems_rb true" }
+
+ it "prefers gems.rb to Gemfile" do
+ create_file("gems.rb", "gem 'bundler'")
+ create_file("Gemfile", "raise 'wrong Gemfile!'")
+
+ bundle! :install
+
+ expect(bundled_app("gems.rb")).to be_file
+ expect(bundled_app("Gemfile.lock")).not_to be_file
+
+ expect(the_bundle).to include_gem "bundler #{Bundler::VERSION}"
+ end
+ end
+
context "with engine specified in symbol" do
it "does not raise any error parsing Gemfile" do
simulate_ruby_version "2.3.0" do