310 lines
7.2 KiB
Ruby
310 lines
7.2 KiB
Ruby
require "spec_helper"
|
|
|
|
describe "bundle exec" do
|
|
before :each do
|
|
system_gems "rack-1.0.0", "rack-0.9.1"
|
|
end
|
|
|
|
it "activates the correct gem" do
|
|
gemfile <<-G
|
|
gem "rack", "0.9.1"
|
|
G
|
|
|
|
bundle "exec rackup"
|
|
expect(out).to eq("0.9.1")
|
|
end
|
|
|
|
it "works when the bins are in ~/.bundle" do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
|
|
bundle "exec rackup"
|
|
expect(out).to eq("1.0.0")
|
|
end
|
|
|
|
it "works when running from a random directory" do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
|
|
bundle "exec 'cd #{tmp('gems')} && rackup'"
|
|
|
|
expect(out).to eq("1.0.0")
|
|
end
|
|
|
|
it "works when exec'ing something else" do
|
|
install_gemfile 'gem "rack"'
|
|
bundle "exec echo exec"
|
|
expect(out).to eq("exec")
|
|
end
|
|
|
|
it "works when exec'ing to ruby" do
|
|
install_gemfile 'gem "rack"'
|
|
bundle "exec ruby -e 'puts %{hi}'"
|
|
expect(out).to eq("hi")
|
|
end
|
|
|
|
it "accepts --verbose" do
|
|
install_gemfile 'gem "rack"'
|
|
bundle "exec --verbose echo foobar"
|
|
expect(out).to eq("foobar")
|
|
end
|
|
|
|
it "passes --verbose to command if it is given after the command" do
|
|
install_gemfile 'gem "rack"'
|
|
bundle "exec echo --verbose"
|
|
expect(out).to eq("--verbose")
|
|
end
|
|
|
|
it "handles --keep-file-descriptors" do
|
|
require 'tempfile'
|
|
|
|
bundle_bin = File.expand_path('../../../bin/bundle', __FILE__)
|
|
|
|
command = Tempfile.new("io-test")
|
|
command.sync = true
|
|
command.write <<-G
|
|
if ARGV[0]
|
|
IO.for_fd(ARGV[0].to_i)
|
|
else
|
|
require 'tempfile'
|
|
io = Tempfile.new("io-test-fd")
|
|
args = %W[#{Gem.ruby} -I#{lib} #{bundle_bin} exec --keep-file-descriptors #{Gem.ruby} #{command.path} \#{io.to_i}]
|
|
args << { io.to_i => io } if RUBY_VERSION >= "2.0"
|
|
exec(*args)
|
|
end
|
|
G
|
|
|
|
install_gemfile ''
|
|
sys_exec("#{Gem.ruby} #{command.path}")
|
|
|
|
if RUBY_VERSION >= "2.0"
|
|
expect(out).to eq("")
|
|
else
|
|
expect(out).to eq("Ruby version #{RUBY_VERSION} defaults to keeping non-standard file descriptors on Kernel#exec.")
|
|
end
|
|
|
|
expect(err).to eq("")
|
|
end
|
|
|
|
it "accepts --keep-file-descriptors" do
|
|
install_gemfile ''
|
|
bundle "exec --keep-file-descriptors echo foobar"
|
|
|
|
expect(err).to eq("")
|
|
end
|
|
|
|
it "can run a command named --verbose" do
|
|
install_gemfile 'gem "rack"'
|
|
File.open("--verbose", 'w') do |f|
|
|
f.puts "#!/bin/sh"
|
|
f.puts "echo foobar"
|
|
end
|
|
File.chmod(0744, "--verbose")
|
|
ENV['PATH'] = "."
|
|
bundle "exec -- --verbose"
|
|
expect(out).to eq("foobar")
|
|
end
|
|
|
|
it "handles different versions in different bundles" do
|
|
build_repo2 do
|
|
build_gem "rack_two", "1.0.0" do |s|
|
|
s.executables = "rackup"
|
|
end
|
|
end
|
|
|
|
install_gemfile <<-G
|
|
source "file://#{gem_repo1}"
|
|
gem "rack", "0.9.1"
|
|
G
|
|
|
|
Dir.chdir bundled_app2 do
|
|
install_gemfile bundled_app2('Gemfile'), <<-G
|
|
source "file://#{gem_repo2}"
|
|
gem "rack_two", "1.0.0"
|
|
G
|
|
end
|
|
|
|
bundle "exec rackup"
|
|
|
|
expect(out).to eq("0.9.1")
|
|
expect(err).to match("deprecated")
|
|
|
|
Dir.chdir bundled_app2 do
|
|
bundle "exec rackup"
|
|
expect(out).to eq("1.0.0")
|
|
end
|
|
end
|
|
|
|
it "handles gems installed with --without" do
|
|
install_gemfile <<-G, :without => :middleware
|
|
source "file://#{gem_repo1}"
|
|
gem "rack" # rack 0.9.1 and 1.0 exist
|
|
|
|
group :middleware do
|
|
gem "rack_middleware" # rack_middleware depends on rack 0.9.1
|
|
end
|
|
G
|
|
|
|
bundle "exec rackup"
|
|
|
|
expect(out).to eq("0.9.1")
|
|
should_not_be_installed "rack_middleware 1.0"
|
|
end
|
|
|
|
it "does not duplicate already exec'ed RUBYOPT" do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
|
|
rubyopt = ENV['RUBYOPT']
|
|
rubyopt = "-rbundler/setup #{rubyopt}"
|
|
|
|
bundle "exec 'echo $RUBYOPT'"
|
|
expect(out).to have_rubyopts(rubyopt)
|
|
|
|
bundle "exec 'echo $RUBYOPT'", :env => {"RUBYOPT" => rubyopt}
|
|
expect(out).to have_rubyopts(rubyopt)
|
|
end
|
|
|
|
it "does not duplicate already exec'ed RUBYLIB" do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
|
|
rubylib = ENV['RUBYLIB']
|
|
rubylib = "#{rubylib}".split(File::PATH_SEPARATOR).unshift "#{bundler_path}"
|
|
rubylib = rubylib.uniq.join(File::PATH_SEPARATOR)
|
|
|
|
bundle "exec 'echo $RUBYLIB'"
|
|
expect(out).to eq(rubylib)
|
|
|
|
bundle "exec 'echo $RUBYLIB'", :env => {"RUBYLIB" => rubylib}
|
|
expect(out).to eq(rubylib)
|
|
end
|
|
|
|
it "errors nicely when the argument doesn't exist" do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
|
|
bundle "exec foobarbaz", :exitstatus => true
|
|
expect(exitstatus).to eq(127)
|
|
expect(out).to include("bundler: command not found: foobarbaz")
|
|
expect(out).to include("Install missing gem executables with `bundle install`")
|
|
end
|
|
|
|
it "errors nicely when the argument is not executable" do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
|
|
bundle "exec touch foo"
|
|
bundle "exec ./foo", :exitstatus => true
|
|
expect(exitstatus).to eq(126)
|
|
expect(out).to include("bundler: not executable: ./foo")
|
|
end
|
|
|
|
it "errors nicely when no arguments are passed" do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
|
|
bundle "exec", :exitstatus => true
|
|
expect(exitstatus).to eq(128)
|
|
expect(out).to include("bundler: exec needs a command to run")
|
|
end
|
|
|
|
describe "with gem executables" do
|
|
describe "run from a random directory" do
|
|
before(:each) do
|
|
install_gemfile <<-G
|
|
gem "rack"
|
|
G
|
|
end
|
|
|
|
it "works when unlocked" do
|
|
bundle "exec 'cd #{tmp('gems')} && rackup'"
|
|
expect(out).to eq("1.0.0")
|
|
end
|
|
|
|
it "works when locked" do
|
|
should_be_locked
|
|
bundle "exec 'cd #{tmp('gems')} && rackup'"
|
|
expect(out).to eq("1.0.0")
|
|
end
|
|
end
|
|
|
|
describe "from gems bundled via :path" do
|
|
before(:each) do
|
|
build_lib "fizz", :path => home("fizz") do |s|
|
|
s.executables = "fizz"
|
|
end
|
|
|
|
install_gemfile <<-G
|
|
gem "fizz", :path => "#{File.expand_path(home("fizz"))}"
|
|
G
|
|
end
|
|
|
|
it "works when unlocked" do
|
|
bundle "exec fizz"
|
|
expect(out).to eq("1.0")
|
|
end
|
|
|
|
it "works when locked" do
|
|
should_be_locked
|
|
|
|
bundle "exec fizz"
|
|
expect(out).to eq("1.0")
|
|
end
|
|
end
|
|
|
|
describe "from gems bundled via :git" do
|
|
before(:each) do
|
|
build_git "fizz_git" do |s|
|
|
s.executables = "fizz_git"
|
|
end
|
|
|
|
install_gemfile <<-G
|
|
gem "fizz_git", :git => "#{lib_path('fizz_git-1.0')}"
|
|
G
|
|
end
|
|
|
|
it "works when unlocked" do
|
|
bundle "exec fizz_git"
|
|
expect(out).to eq("1.0")
|
|
end
|
|
|
|
it "works when locked" do
|
|
should_be_locked
|
|
bundle "exec fizz_git"
|
|
expect(out).to eq("1.0")
|
|
end
|
|
end
|
|
|
|
describe "from gems bundled via :git with no gemspec" do
|
|
before(:each) do
|
|
build_git "fizz_no_gemspec", :gemspec => false do |s|
|
|
s.executables = "fizz_no_gemspec"
|
|
end
|
|
|
|
install_gemfile <<-G
|
|
gem "fizz_no_gemspec", "1.0", :git => "#{lib_path('fizz_no_gemspec-1.0')}"
|
|
G
|
|
end
|
|
|
|
it "works when unlocked" do
|
|
bundle "exec fizz_no_gemspec"
|
|
expect(out).to eq("1.0")
|
|
end
|
|
|
|
it "works when locked" do
|
|
should_be_locked
|
|
bundle "exec fizz_no_gemspec"
|
|
expect(out).to eq("1.0")
|
|
end
|
|
end
|
|
end
|
|
end
|