1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Merge Bundler 2.1.0.pre.3

Features:
    - Add caller information to some deprecation messages to make them easier to fix [#7361](https://github.com/bundler/bundler/pull/7361)
    - Reconcile `bundle cache` vs `bundle package` everywhere. Now in docs, CLI help and everywhere else `bundle cache` is the preferred version and `bundle package` remains as an alias [#7389](https://github.com/bundler/bundler/pull/7389)
    - Display some basic `bundler` documentation together with ruby's RDoc based documentation [#7394](https://github.com/bundler/bundler/pull/7394)

  Bugfixes:
    - Fix typos deprecation message and upgrading docs [#7374](https://github.com/bundler/bundler/pull/7374)
    - Deprecation warnings about `taint` usage on ruby 2.7 [#7385](https://github.com/bundler/bundler/pull/7385)
    - Fix `--help` flag not correctly delegating to `man` when used with command aliases [#7388](https://github.com/bundler/bundler/pull/7388)
    - `bundle add` should cache newly added gems if an application cache exists [#7393](https://github.com/bundler/bundler/pull/7393)
    - Stop using an insecure folder as a "fallback home" when user home is not defined [#7416](https://github.com/bundler/bundler/pull/7416)
    - Fix `bundler/inline` warning about `Bundler.root` redefinition [#7417](https://github.com/bundler/bundler/pull/7417)
This commit is contained in:
Hiroshi SHIBATA 2019-11-11 17:57:45 +09:00 committed by SHIBATA Hiroshi
parent fd69f82675
commit 7585bc3187
Notes: git 2019-11-11 18:56:53 +09:00
158 changed files with 1920 additions and 1521 deletions

View file

@ -14,6 +14,25 @@ require_relative "bundler/constants"
require_relative "bundler/current_ruby"
require_relative "bundler/build_metadata"
# Bundler provides a consistent environment for Ruby projects by
# tracking and installing the exact gems and versions that are needed.
#
# Since Ruby 2.6, Bundler is a part of Ruby's standard library.
#
# Bunder is used by creating _gemfiles_ listing all the project dependencies
# and (optionally) their versions and then using
#
# require 'bundler/setup'
#
# or Bundler.setup to setup environment where only specified gems and their
# specified versions could be used.
#
# See {Bundler website}[https://bundler.io/docs.html] for extensive documentation
# on gemfiles creation and Bundler usage.
#
# As a standard library inside project, Bundler could be used for introspection
# of loaded and required modules.
#
module Bundler
environment_preserver = EnvironmentPreserver.new(ENV, EnvironmentPreserver::BUNDLER_KEYS)
ORIGINAL_ENV = environment_preserver.restore
@ -64,11 +83,11 @@ module Bundler
end
def ui
(defined?(@ui) && @ui) || (self.ui = UI::Silent.new)
(defined?(@ui) && @ui) || (self.ui = UI::Shell.new)
end
def ui=(ui)
Bundler.rubygems.ui = ui ? UI::RGProxy.new(ui) : nil
Bundler.rubygems.ui = UI::RGProxy.new(ui)
@ui = ui
end
@ -91,6 +110,33 @@ module Bundler
end
end
# Turns on the Bundler runtime. After +Bundler.setup+ call, all +load+ or
# +require+ of the gems would be allowed only if they are part of
# the Gemfile or Ruby's standard library. If the versions specified
# in Gemfile, only those versions would be loaded.
#
# Assuming Gemfile
#
# gem 'first_gem', '= 1.0'
# group :test do
# gem 'second_gem', '= 1.0'
# end
#
# The code using Bundler.setup works as follows:
#
# require 'third_gem' # allowed, required from global gems
# require 'first_gem' # allowed, loads the last installed version
# Bundler.setup
# require 'fourth_gem' # fails with LoadError
# require 'second_gem' # loads exactly version 1.0
#
# +Bundler.setup+ can be called only once, all subsequent calls are no-op.
#
# If _groups_ list is provided, only gems from specified groups would
# be allowed (gems specified outside groups belong to special +:default+ group).
#
# To require all gems from Gemfile (or only some groups), see Bundler.require.
#
def setup(*groups)
# Return if all groups are already loaded
return @setup if defined?(@setup) && @setup
@ -107,6 +153,24 @@ module Bundler
end
end
# Setups Bundler environment (see Bundler.setup) if it is not already set,
# and loads all gems from groups specified. Unlike ::setup, can be called
# multiple times with different groups (if they were allowed by setup).
#
# Assuming Gemfile
#
# gem 'first_gem', '= 1.0'
# group :test do
# gem 'second_gem', '= 1.0'
# end
#
# The code will work as follows:
#
# Bundler.setup # allow all groups
# Bundler.require(:default) # requires only first_gem
# # ...later
# Bundler.require(:test) # requires second_gem
#
def require(*groups)
setup(*groups).require(*groups)
end
@ -116,7 +180,7 @@ module Bundler
end
def environment
SharedHelpers.major_deprecation 2, "Bundler.environment has been removed in favor of Bundler.load"
SharedHelpers.major_deprecation 2, "Bundler.environment has been removed in favor of Bundler.load", :print_caller_location => true
load
end
@ -167,8 +231,7 @@ module Bundler
end
if warning
Kernel.send(:require, "etc")
user_home = tmp_home_path(Etc.getlogin, warning)
user_home = tmp_home_path(warning)
Bundler.ui.warn "#{warning}\nBundler will use `#{user_home}' as your home directory temporarily.\n"
user_home
else
@ -177,21 +240,6 @@ module Bundler
end
end
def tmp_home_path(login, warning)
login ||= "unknown"
Kernel.send(:require, "tmpdir")
path = Pathname.new(Dir.tmpdir).join("bundler", "home")
SharedHelpers.filesystem_access(path) do |tmp_home_path|
unless tmp_home_path.exist?
tmp_home_path.mkpath
tmp_home_path.chmod(0o777)
end
tmp_home_path.join(login).tap(&:mkpath)
end
rescue RuntimeError => e
raise e.exception("#{warning}\nBundler also failed to create a temporary home directory at `#{path}':\n#{e}")
end
def user_bundle_path(dir = "home")
env_var, fallback = case dir
when "home"
@ -282,7 +330,8 @@ EOF
Bundler::SharedHelpers.major_deprecation(
2,
"`Bundler.clean_env` has been deprecated in favor of `Bundler.unbundled_env`. " \
"If you instead want the environment before bundler was originally loaded, use `Bundler.original_env`"
"If you instead want the environment before bundler was originally loaded, use `Bundler.original_env`",
:print_caller_location => true
)
unbundled_env
@ -321,7 +370,8 @@ EOF
Bundler::SharedHelpers.major_deprecation(
2,
"`Bundler.with_clean_env` has been deprecated in favor of `Bundler.with_unbundled_env`. " \
"If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_env`"
"If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_env`",
:print_caller_location => true
)
with_env(unbundled_env) { yield }
@ -342,7 +392,8 @@ EOF
Bundler::SharedHelpers.major_deprecation(
2,
"`Bundler.clean_system` has been deprecated in favor of `Bundler.unbundled_system`. " \
"If you instead want to run the command in the environment before bundler was originally loaded, use `Bundler.original_system`"
"If you instead want to run the command in the environment before bundler was originally loaded, use `Bundler.original_system`",
:print_caller_location => true
)
with_env(unbundled_env) { Kernel.system(*args) }
@ -363,7 +414,8 @@ EOF
Bundler::SharedHelpers.major_deprecation(
2,
"`Bundler.clean_exec` has been deprecated in favor of `Bundler.unbundled_exec`. " \
"If you instead want to exec to a command in the environment before bundler was originally loaded, use `Bundler.original_exec`"
"If you instead want to exec to a command in the environment before bundler was originally loaded, use `Bundler.original_exec`",
:print_caller_location => true
)
with_env(unbundled_env) { Kernel.exec(*args) }
@ -608,6 +660,17 @@ EOF
Bundler.rubygems.clear_paths
end
def tmp_home_path(warning)
Kernel.send(:require, "tmpdir")
SharedHelpers.filesystem_access(Dir.tmpdir) do
path = Bundler.tmp
at_exit { Bundler.rm_rf(path) }
path
end
rescue RuntimeError => e
raise e.exception("#{warning}\nBundler also failed to create a temporary home directory':\n#{e}")
end
# @param env [Hash]
def with_env(env)
backup = ENV.to_hash

View file

@ -9,15 +9,19 @@ module Bundler
package_name "Bundler"
AUTO_INSTALL_CMDS = %w[show binstubs outdated exec open console licenses clean].freeze
PARSEABLE_COMMANDS = %w[
check config help exec platform show version
].freeze
PARSEABLE_COMMANDS = %w[check config help exec platform show version].freeze
COMMAND_ALIASES = {
"check" => "c",
"install" => "i",
"list" => "ls",
"exec" => ["e", "ex", "exe"],
"cache" => ["package", "pack"],
"version" => ["-v", "--version"],
}.freeze
def self.start(*)
super
rescue Exception => e # rubocop:disable Lint/RescueException
Bundler.ui = UI::Shell.new
raise e
ensure
Bundler::SharedHelpers.print_major_deprecations!
end
@ -29,6 +33,24 @@ module Bundler
end
end
def self.all_aliases
@all_aliases ||= begin
command_aliases = {}
COMMAND_ALIASES.each do |name, aliases|
Array(aliases).each do |one_alias|
command_aliases[one_alias] = name
end
end
command_aliases
end
end
def self.aliases_for(command_name)
COMMAND_ALIASES.select {|k, _| k == command_name }.invert
end
def initialize(*args)
super
@ -68,9 +90,7 @@ module Bundler
version
Bundler.ui.info "\n"
primary_commands = ["install", "update",
Bundler.feature_flag.bundler_3_mode? ? "cache" : "package",
"exec", "config", "help"]
primary_commands = ["install", "update", "cache", "exec", "config", "help"]
list = self.class.printable_commands(true)
by_name = list.group_by {|name, _message| name.match(/^bundle (\w+)/)[1] }
@ -154,7 +174,6 @@ module Bundler
"Use the specified gemfile instead of Gemfile"
method_option "path", :type => :string, :banner =>
"Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME).#{" Bundler will remember this value for future installs on this machine" unless Bundler.feature_flag.forget_cli_options?}"
map "c" => "check"
def check
remembered_flag_deprecation("path")
@ -162,6 +181,8 @@ module Bundler
Check.new(options).run
end
map aliases_for("check")
desc "remove [GEM [GEM ...]]", "Removes gems from the Gemfile"
long_desc <<-D
Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid. If the gem is not found, Bundler prints a error message and if gem could not be removed due to any reason Bundler will display a warning.
@ -223,7 +244,6 @@ module Bundler
"Exclude gems that are part of the specified named group."
method_option "with", :type => :array, :banner =>
"Include gems that are part of the specified named group."
map "i" => "install"
def install
SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
@ -237,6 +257,8 @@ module Bundler
end
end
map aliases_for("install")
desc "update [OPTIONS]", "Update the current environment"
long_desc <<-D
Update will install the newest versions of the gems listed in the Gemfile. Use
@ -328,7 +350,7 @@ module Bundler
List.new(options).run
end
map %w[ls] => "list"
map aliases_for("list")
desc "info GEM [OPTIONS]", "Show information for the given gem"
method_option "path", :type => :boolean, :banner => "Print full path to gem"
@ -412,7 +434,7 @@ module Bundler
Outdated.new(options, gems).run
end
desc "#{Bundler.feature_flag.bundler_3_mode? ? :cache : :package} [OPTIONS]", "Locks and then caches all of the gems into vendor/cache"
desc "cache [OPTIONS]", "Locks and then caches all of the gems into vendor/cache"
unless Bundler.feature_flag.cache_all?
method_option "all", :type => :boolean,
:banner => "Include all sources (including path and git)."
@ -421,24 +443,25 @@ module Bundler
method_option "cache-path", :type => :string, :banner =>
"Specify a different cache path than the default (vendor/cache)."
method_option "gemfile", :type => :string, :banner => "Use the specified gemfile instead of Gemfile"
method_option "no-install", :type => :boolean, :banner => "Don't install the gems, only the package."
method_option "no-install", :type => :boolean, :banner => "Don't install the gems, only update the cache."
method_option "no-prune", :type => :boolean, :banner => "Don't remove stale gems from the cache."
method_option "path", :type => :string, :banner =>
"Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME).#{" Bundler will remember this value for future installs on this machine" unless Bundler.feature_flag.forget_cli_options?}"
method_option "quiet", :type => :boolean, :banner => "Only output warnings and errors."
method_option "frozen", :type => :boolean, :banner =>
"Do not allow the Gemfile.lock to be updated after this package operation's install"
"Do not allow the Gemfile.lock to be updated after this bundle cache operation's install"
long_desc <<-D
The package command will copy the .gem files for every gem in the bundle into the
The cache command will copy the .gem files for every gem in the bundle into the
directory ./vendor/cache. If you then check that directory into your source
control repository, others who check out your source will be able to install the
bundle without having to download any additional gems.
D
def package
require_relative "cli/package"
Package.new(options).run
def cache
require_relative "cli/cache"
Cache.new(options).run
end
map %w[cache pack] => :package
map aliases_for("cache")
desc "exec [OPTIONS]", "Run the command in context of the bundle"
method_option :keep_file_descriptors, :type => :boolean, :default => false
@ -448,12 +471,13 @@ module Bundler
bundle exec you can require and call the bundled gems as if they were installed
into the system wide RubyGems repository.
D
map "e" => "exec"
def exec(*args)
require_relative "cli/exec"
Exec.new(options, args).run
end
map aliases_for("exec")
desc "config NAME [VALUE]", "Retrieve or set a configuration value"
long_desc <<-D
Retrieves or sets a configuration value. If only one parameter is provided, retrieve the value. If two parameters are provided, replace the
@ -496,7 +520,8 @@ module Bundler
Bundler.ui.info "Bundler version #{Bundler::VERSION}#{build_info}"
end
end
map %w[-v --version] => :version
map aliases_for("version")
desc "licenses", "Prints the license of all gems in the bundle"
def licenses
@ -680,12 +705,17 @@ module Bundler
# Reformat the arguments passed to bundle that include a --help flag
# into the corresponding `bundle help #{command}` call
def self.reformatted_help_args(args)
bundler_commands = all_commands.keys
bundler_commands = (COMMAND_ALIASES.keys + COMMAND_ALIASES.values).flatten
help_flags = %w[--help -h]
exec_commands = %w[e ex exe exec]
exec_commands = ["exec"] + COMMAND_ALIASES["exec"]
help_used = args.index {|a| help_flags.include? a }
exec_used = args.index {|a| exec_commands.include? a }
command = args.find {|a| bundler_commands.include? a }
command = all_aliases[command] if all_aliases[command]
if exec_used && help_used
if exec_used + help_used == 1
%w[help exec]
@ -790,7 +820,7 @@ module Bundler
Bundler::SharedHelpers.major_deprecation 2,\
"The `#{flag_name}` flag is deprecated because it relies on being " \
"remembered across bundler invokations, which bundler will no longer " \
"remembered across bundler invocations, which bundler will no longer " \
"do in future versions. Instead please use `bundle config set #{name} " \
"'#{value}'`, and stop using this flag"
end

View file

@ -21,6 +21,7 @@ module Bundler
def perform_bundle_install
Installer.install(Bundler.root, Bundler.definition)
Bundler.load.cache if Bundler.app_cache.exist?
end
def inject_dependencies

48
lib/bundler/cli/cache.rb Normal file
View file

@ -0,0 +1,48 @@
# frozen_string_literal: true
module Bundler
class CLI::Cache
attr_reader :options
def initialize(options)
@options = options
end
def run
Bundler.ui.level = "error" if options[:quiet]
Bundler.settings.set_command_option_if_given :path, options[:path]
Bundler.settings.set_command_option_if_given :cache_path, options["cache-path"]
setup_cache_all
install
# TODO: move cache contents here now that all bundles are locked
custom_path = Bundler.settings[:path] if options[:path]
Bundler.settings.temporary(:cache_all_platforms => options["all-platforms"]) do
Bundler.load.cache(custom_path)
end
end
private
def install
require_relative "install"
options = self.options.dup
options["local"] = false if Bundler.settings[:cache_all_platforms]
Bundler::CLI::Install.new(options).run
end
def setup_cache_all
all = options.fetch(:all, Bundler.feature_flag.cache_all? || nil)
Bundler.settings.set_command_option_if_given :cache_all, all
if Bundler.definition.has_local_dependencies? && !Bundler.feature_flag.cache_all?
Bundler.ui.warn "Your Gemfile contains path and git dependencies. If you want " \
"to cache them as well, please pass the --all flag. This will be the default " \
"on Bundler 3.0."
end
end
end
end

View file

@ -43,15 +43,11 @@ module Bundler
end
def kernel_exec(*args)
ui = Bundler.ui
Bundler.ui = nil
Kernel.exec(*args)
rescue Errno::EACCES, Errno::ENOEXEC
Bundler.ui = ui
Bundler.ui.error "bundler: not executable: #{cmd}"
exit 126
rescue Errno::ENOENT
Bundler.ui = ui
Bundler.ui.error "bundler: command not found: #{cmd}"
Bundler.ui.warn "Install missing gem executables with `bundle install`"
exit 127
@ -62,15 +58,12 @@ module Bundler
ARGV.replace(args)
$0 = file
Process.setproctitle(process_title(file, args)) if Process.respond_to?(:setproctitle)
ui = Bundler.ui
Bundler.ui = nil
require_relative "../setup"
TRAPPED_SIGNALS.each {|s| trap(s, "DEFAULT") }
Kernel.load(file)
rescue SystemExit, SignalException
raise
rescue Exception => e # rubocop:disable Lint/RescueException
Bundler.ui = ui
Bundler.ui.error "bundler: failed to load command: #{cmd} (#{file})"
backtrace = e.backtrace ? e.backtrace.take_while {|bt| !bt.start_with?(__FILE__) } : []
abort "#{e.class}: #{e.message}\n #{backtrace.join("\n ")}"

View file

@ -44,7 +44,7 @@ module Bundler
@gemfile = expanded_gemfile_path
@gemfiles << expanded_gemfile_path
contents ||= Bundler.read_file(@gemfile.to_s)
instance_eval(contents.dup.untaint, gemfile.to_s, 1)
instance_eval(contents.dup.tap{|x| x.untaint if RUBY_VERSION < "2.7" }, gemfile.to_s, 1)
rescue Exception => e # rubocop:disable Lint/RescueException
message = "There was an error " \
"#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \

View file

@ -16,7 +16,7 @@ module Bundler
Bundler.ui.error error.message
when GemRequireError
Bundler.ui.error error.message
Bundler.ui.trace error.orig_exception, nil, true
Bundler.ui.trace error.orig_exception
when BundlerError
Bundler.ui.error error.message, :wrap => true
Bundler.ui.trace error

View file

@ -26,7 +26,6 @@ module Bundler
attr_reader :spec_path, :base, :gemspec
def initialize(base = nil, name = nil)
Bundler.ui = UI::Shell.new
@base = (base ||= SharedHelpers.pwd)
gemspecs = name ? [File.join(base, "#{name}.gemspec")] : Dir[File.join(base, "{,*}.gemspec")]
raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1

View file

@ -2,7 +2,7 @@
module Bundler
module GemHelpers
GENERIC_CACHE = { Gem::Platform::RUBY => Gem::Platform::RUBY } # rubocop:disable MutableConstant
GENERIC_CACHE = { Gem::Platform::RUBY => Gem::Platform::RUBY } # rubocop:disable Style/MutableConstant
GENERICS = [
[Gem::Platform.new("java"), Gem::Platform.new("java")],
[Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")],

View file

@ -38,6 +38,8 @@ def gemfile(install = false, options = {}, &gemfile)
raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
old_root = Bundler.method(:root)
bundler_module = class << Bundler; self; end
bundler_module.send(:remove_method, :root)
def Bundler.root
Bundler::SharedHelpers.pwd.expand_path
end
@ -56,7 +58,7 @@ def gemfile(install = false, options = {}, &gemfile)
definition.missing_specs?
end
Bundler.ui = ui if install
Bundler.ui = install ? ui : Bundler::UI::Silent.new
if install || missing_specs.call
Bundler.settings.temporary(:inline => true, :disable_platform_warnings => true) do
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
@ -70,6 +72,8 @@ def gemfile(install = false, options = {}, &gemfile)
runtime.setup.require
end
ensure
bundler_module = class << Bundler; self; end
bundler_module.send(:define_method, :root, old_root) if old_root
if bundler_module
bundler_module.send(:remove_method, :root)
bundler_module.send(:define_method, :root, old_root)
end
end

View file

@ -1,5 +1,6 @@
# frozen_string_literal: true
#--
# Some versions of the Bundler 1.1 RC series introduced corrupted
# lockfiles. There were two major problems:
#

View file

@ -29,7 +29,7 @@ module Gem
# gems at that time, this method could be called inside another require,
# thus raising with that constant being undefined. Better to check a method
if source.respond_to?(:path) || (source.respond_to?(:bundler_plugin_api_source?) && source.bundler_plugin_api_source?)
Pathname.new(loaded_from).dirname.expand_path(source.root).to_s.untaint
Pathname.new(loaded_from).dirname.expand_path(source.root).to_s.tap{|x| x.untaint if RUBY_VERSION < "2.7" }
else
rg_full_gem_path
end

View file

@ -635,7 +635,6 @@ module Bundler
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(gemfile)
require_relative "gemdeps"
runtime = Bundler.setup
Bundler.ui = nil
activated_spec_names = runtime.requested_specs.map(&:to_spec).sort_by(&:name)
[Gemdeps.new(runtime), activated_spec_names]
end

View file

@ -6,9 +6,8 @@ if Bundler::SharedHelpers.in_bundle?
require_relative "../bundler"
if STDOUT.tty? || ENV["BUNDLER_FORCE_TTY"]
Bundler.ui = Bundler::UI::Shell.new
begin
Bundler.setup
Bundler.ui.silence { Bundler.setup }
rescue Bundler::BundlerError => e
Bundler.ui.warn "\e[31m#{e.message}\e[0m"
Bundler.ui.warn e.backtrace.join("\n") if ENV["DEBUG"]
@ -18,12 +17,6 @@ if Bundler::SharedHelpers.in_bundle?
exit e.status_code
end
else
Bundler.setup
Bundler.ui.silence { Bundler.setup }
end
# Add bundler to the load path after disabling system gems
bundler_lib = File.expand_path("../..", __FILE__)
$LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib)
Bundler.ui = nil
end

View file

@ -13,13 +13,13 @@ module Bundler
def root
gemfile = find_gemfile
raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
Pathname.new(gemfile).untaint.expand_path.parent
Pathname.new(gemfile).tap{|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path.parent
end
def default_gemfile
gemfile = find_gemfile
raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
Pathname.new(gemfile).untaint.expand_path
Pathname.new(gemfile).tap{|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path
end
def default_lockfile
@ -28,7 +28,7 @@ module Bundler
case gemfile.basename.to_s
when "gems.rb" then Pathname.new(gemfile.sub(/.rb$/, ".locked"))
else Pathname.new("#{gemfile}.lock")
end.untaint
end.tap{|x| x.untaint if RUBY_VERSION < "2.7" }
end
def default_bundle_dir
@ -100,7 +100,7 @@ module Bundler
#
# @see {Bundler::PermissionError}
def filesystem_access(path, action = :write, &block)
yield(path.dup.untaint)
yield(path.dup.tap{|x| x.untaint if RUBY_VERSION < "2.7" })
rescue Errno::EACCES
raise PermissionError.new(path, action)
rescue Errno::EAGAIN
@ -124,7 +124,12 @@ module Bundler
namespace.const_get(constant_name)
end
def major_deprecation(major_version, message)
def major_deprecation(major_version, message, print_caller_location: false)
if print_caller_location
caller_location = caller_locations(2, 2).first
message = "#{message} (called at #{caller_location.path}:#{caller_location.lineno})"
end
bundler_major_version = Bundler.bundler_major_version
if bundler_major_version > major_version
require_relative "errors"
@ -132,10 +137,7 @@ module Bundler
end
return unless bundler_major_version >= major_version && prints_major_deprecations?
@major_deprecation_ui ||= Bundler::UI::Shell.new("no-color" => true)
with_major_deprecation_ui do |ui|
ui.warn("[DEPRECATED] #{message}")
end
Bundler.ui.warn("[DEPRECATED] #{message}")
end
def print_major_deprecations!
@ -212,21 +214,6 @@ module Bundler
private
def with_major_deprecation_ui(&block)
ui = Bundler.ui
if ui.is_a?(@major_deprecation_ui.class)
yield ui
else
begin
Bundler.ui = @major_deprecation_ui
yield Bundler.ui
ensure
Bundler.ui = ui
end
end
end
def validate_bundle_path
path_separator = Bundler.rubygems.path_separator
return unless Bundler.bundle_path.to_s.split(path_separator).size > 1
@ -263,7 +250,7 @@ module Bundler
def search_up(*names)
previous = nil
current = File.expand_path(SharedHelpers.pwd).untaint
current = File.expand_path(SharedHelpers.pwd).tap{|x| x.untaint if RUBY_VERSION < "2.7" }
until !File.directory?(current) || current == previous
if ENV["BUNDLE_SPEC_RUN"]

View file

@ -316,7 +316,7 @@ module Bundler
def load_gemspec(file)
stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.untaint
stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.tap{|x| x.untaint if RUBY_VERSION < "2.7" }
StubSpecification.from_stub(stub)
end

View file

@ -2,7 +2,7 @@
require "open3"
require "shellwords"
require "tempfile"
module Bundler
class Source
class Git

View file

@ -24,46 +24,56 @@ require_relative "fileutils/version"
#
# require 'bundler/vendor/fileutils/lib/fileutils'
#
# Bundler::FileUtils.cd(dir, options)
# Bundler::FileUtils.cd(dir, options) {|dir| block }
# Bundler::FileUtils.cd(dir, **options)
# Bundler::FileUtils.cd(dir, **options) {|dir| block }
# Bundler::FileUtils.pwd()
# Bundler::FileUtils.mkdir(dir, options)
# Bundler::FileUtils.mkdir(list, options)
# Bundler::FileUtils.mkdir_p(dir, options)
# Bundler::FileUtils.mkdir_p(list, options)
# Bundler::FileUtils.rmdir(dir, options)
# Bundler::FileUtils.rmdir(list, options)
# Bundler::FileUtils.ln(target, link, options)
# Bundler::FileUtils.ln(targets, dir, options)
# Bundler::FileUtils.ln_s(target, link, options)
# Bundler::FileUtils.ln_s(targets, dir, options)
# Bundler::FileUtils.ln_sf(target, link, options)
# Bundler::FileUtils.cp(src, dest, options)
# Bundler::FileUtils.cp(list, dir, options)
# Bundler::FileUtils.cp_r(src, dest, options)
# Bundler::FileUtils.cp_r(list, dir, options)
# Bundler::FileUtils.mv(src, dest, options)
# Bundler::FileUtils.mv(list, dir, options)
# Bundler::FileUtils.rm(list, options)
# Bundler::FileUtils.rm_r(list, options)
# Bundler::FileUtils.rm_rf(list, options)
# Bundler::FileUtils.install(src, dest, options)
# Bundler::FileUtils.chmod(mode, list, options)
# Bundler::FileUtils.chmod_R(mode, list, options)
# Bundler::FileUtils.chown(user, group, list, options)
# Bundler::FileUtils.chown_R(user, group, list, options)
# Bundler::FileUtils.touch(list, options)
# Bundler::FileUtils.mkdir(dir, **options)
# Bundler::FileUtils.mkdir(list, **options)
# Bundler::FileUtils.mkdir_p(dir, **options)
# Bundler::FileUtils.mkdir_p(list, **options)
# Bundler::FileUtils.rmdir(dir, **options)
# Bundler::FileUtils.rmdir(list, **options)
# Bundler::FileUtils.ln(target, link, **options)
# Bundler::FileUtils.ln(targets, dir, **options)
# Bundler::FileUtils.ln_s(target, link, **options)
# Bundler::FileUtils.ln_s(targets, dir, **options)
# Bundler::FileUtils.ln_sf(target, link, **options)
# Bundler::FileUtils.cp(src, dest, **options)
# Bundler::FileUtils.cp(list, dir, **options)
# Bundler::FileUtils.cp_r(src, dest, **options)
# Bundler::FileUtils.cp_r(list, dir, **options)
# Bundler::FileUtils.mv(src, dest, **options)
# Bundler::FileUtils.mv(list, dir, **options)
# Bundler::FileUtils.rm(list, **options)
# Bundler::FileUtils.rm_r(list, **options)
# Bundler::FileUtils.rm_rf(list, **options)
# Bundler::FileUtils.install(src, dest, **options)
# Bundler::FileUtils.chmod(mode, list, **options)
# Bundler::FileUtils.chmod_R(mode, list, **options)
# Bundler::FileUtils.chown(user, group, list, **options)
# Bundler::FileUtils.chown_R(user, group, list, **options)
# Bundler::FileUtils.touch(list, **options)
#
# The <tt>options</tt> parameter is a hash of options, taken from the list
# <tt>:force</tt>, <tt>:noop</tt>, <tt>:preserve</tt>, and <tt>:verbose</tt>.
# <tt>:noop</tt> means that no changes are made. The other three are obvious.
# Each method documents the options that it honours.
# Possible <tt>options</tt> are:
#
# <tt>:force</tt> :: forced operation (rewrite files if exist, remove
# directories if not empty, etc.);
# <tt>:verbose</tt> :: print command to be run, in bash syntax, before
# performing it;
# <tt>:preserve</tt> :: preserve object's group, user and modification
# time on copying;
# <tt>:noop</tt> :: no changes are made (usable in combination with
# <tt>:verbose</tt> which will print the command to run)
#
# Each method documents the options that it honours. See also ::commands,
# ::options and ::options_of methods to introspect which command have which
# options.
#
# All methods that have the concept of a "source" file or directory can take
# either one file or a list of files in that argument. See the method
# documentation for examples.
#
# There are some `low level' methods, which do not accept any option:
# There are some `low level' methods, which do not accept keyword arguments:
#
# Bundler::FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
# Bundler::FileUtils.copy_file(src, dest, preserve = false, dereference = true)
@ -119,7 +129,7 @@ module Bundler::FileUtils
#
# Bundler::FileUtils.cd('/') # change directory
#
# Bundler::FileUtils.cd('/', :verbose => true) # change directory and report it
# Bundler::FileUtils.cd('/', verbose: true) # change directory and report it
#
# Bundler::FileUtils.cd('/') do # change directory
# # ... # do something
@ -165,8 +175,8 @@ module Bundler::FileUtils
#
# Bundler::FileUtils.mkdir 'test'
# Bundler::FileUtils.mkdir %w(tmp data)
# Bundler::FileUtils.mkdir 'notexist', :noop => true # Does not really create.
# Bundler::FileUtils.mkdir 'tmp', :mode => 0700
# Bundler::FileUtils.mkdir 'notexist', noop: true # Does not really create.
# Bundler::FileUtils.mkdir 'tmp', mode: 0700
#
def mkdir(list, mode: nil, noop: nil, verbose: nil)
list = fu_list(list)
@ -185,7 +195,7 @@ module Bundler::FileUtils
#
# Bundler::FileUtils.mkdir_p '/usr/local/lib/ruby'
#
# causes to make following directories, if it does not exist.
# causes to make following directories, if they do not exist.
#
# * /usr
# * /usr/local
@ -249,7 +259,7 @@ module Bundler::FileUtils
# Bundler::FileUtils.rmdir 'somedir'
# Bundler::FileUtils.rmdir %w(somedir anydir otherdir)
# # Does not really remove directory; outputs message.
# Bundler::FileUtils.rmdir 'somedir', :verbose => true, :noop => true
# Bundler::FileUtils.rmdir 'somedir', verbose: true, noop: true
#
def rmdir(list, parents: nil, noop: nil, verbose: nil)
list = fu_list(list)
@ -278,7 +288,7 @@ module Bundler::FileUtils
#
# In the first form, creates a hard link +link+ which points to +target+.
# If +link+ already exists, raises Errno::EEXIST.
# But if the :force option is set, overwrites +link+.
# But if the +force+ option is set, overwrites +link+.
#
# Bundler::FileUtils.ln 'gcc', 'cc', verbose: true
# Bundler::FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'
@ -304,9 +314,6 @@ module Bundler::FileUtils
alias link ln
module_function :link
#
# :call-seq:
# Bundler::FileUtils.cp_lr(src, dest, noop: nil, verbose: nil, dereference_root: true, remove_destination: false)
#
# Hard link +src+ to +dest+. If +src+ is a directory, this method links
# all its contents recursively. If +dest+ is a directory, links
@ -314,13 +321,16 @@ module Bundler::FileUtils
#
# +src+ can be a list of files.
#
# # Installing the library "mylib" under the site_ruby directory.
# Bundler::FileUtils.rm_r site_ruby + '/mylib', :force => true
# If +dereference_root+ is true, this method dereference tree root.
#
# If +remove_destination+ is true, this method removes each destination file before copy.
#
# Bundler::FileUtils.rm_r site_ruby + '/mylib', force: true
# Bundler::FileUtils.cp_lr 'lib/', site_ruby + '/mylib'
#
# # Examples of linking several files to target directory.
# Bundler::FileUtils.cp_lr %w(mail.rb field.rb debug/), site_ruby + '/tmail'
# Bundler::FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', :noop => true, :verbose => true
# Bundler::FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', noop: true, verbose: true
#
# # If you want to link all contents of a directory instead of the
# # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
@ -345,7 +355,7 @@ module Bundler::FileUtils
#
# In the first form, creates a symbolic link +link+ which points to +target+.
# If +link+ already exists, raises Errno::EEXIST.
# But if the :force option is set, overwrites +link+.
# But if the <tt>force</tt> option is set, overwrites +link+.
#
# Bundler::FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby'
# Bundler::FileUtils.ln_s 'verylongsourcefilename.c', 'c', force: true
@ -411,7 +421,7 @@ module Bundler::FileUtils
#
# Bundler::FileUtils.cp 'eval.c', 'eval.c.org'
# Bundler::FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
# Bundler::FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', :verbose => true
# Bundler::FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', verbose: true
# Bundler::FileUtils.cp 'symlink', 'dest' # copy content, "dest" is not a symlink
#
def cp(src, dest, preserve: nil, noop: nil, verbose: nil)
@ -433,13 +443,17 @@ module Bundler::FileUtils
#
# +src+ can be a list of files.
#
# If +dereference_root+ is true, this method dereference tree root.
#
# If +remove_destination+ is true, this method removes each destination file before copy.
#
# # Installing Ruby library "mylib" under the site_ruby
# Bundler::FileUtils.rm_r site_ruby + '/mylib', :force
# Bundler::FileUtils.rm_r site_ruby + '/mylib', force: true
# Bundler::FileUtils.cp_r 'lib/', site_ruby + '/mylib'
#
# # Examples of copying several files to target directory.
# Bundler::FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'
# Bundler::FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', :noop => true, :verbose => true
# Bundler::FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', noop: true, verbose: true
#
# # If you want to copy all contents of a directory instead of the
# # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
@ -474,7 +488,11 @@ module Bundler::FileUtils
# If +remove_destination+ is true, this method removes each destination file before copy.
#
def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent|
if dereference_root
src = File.realpath(src)
end
Entry_.new(src, nil, false).wrap_traverse(proc do |ent|
destent = Entry_.new(dest, ent.rel, false)
File.unlink destent.path if remove_destination && (File.file?(destent.path) || File.symlink?(destent.path))
ent.copy destent.path
@ -511,10 +529,10 @@ module Bundler::FileUtils
# disk partition, the file is copied then the original file is removed.
#
# Bundler::FileUtils.mv 'badname.rb', 'goodname.rb'
# Bundler::FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', :force => true # no error
# Bundler::FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', force: true # no error
#
# Bundler::FileUtils.mv %w(junk.txt dust.txt), '/home/foo/.trash/'
# Bundler::FileUtils.mv Dir.glob('test*.rb'), 'test', :noop => true, :verbose => true
# Bundler::FileUtils.mv Dir.glob('test*.rb'), 'test', noop: true, verbose: true
#
def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)
fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
@ -554,7 +572,7 @@ module Bundler::FileUtils
#
# Bundler::FileUtils.rm %w( junk.txt dust.txt )
# Bundler::FileUtils.rm Dir.glob('*.so')
# Bundler::FileUtils.rm 'NotExistFile', :force => true # never raises exception
# Bundler::FileUtils.rm 'NotExistFile', force: true # never raises exception
#
def rm(list, force: nil, noop: nil, verbose: nil)
list = fu_list(list)
@ -573,7 +591,7 @@ module Bundler::FileUtils
#
# Equivalent to
#
# Bundler::FileUtils.rm(list, :force => true)
# Bundler::FileUtils.rm(list, force: true)
#
def rm_f(list, noop: nil, verbose: nil)
rm list, force: true, noop: noop, verbose: verbose
@ -589,18 +607,18 @@ module Bundler::FileUtils
# StandardError when :force option is set.
#
# Bundler::FileUtils.rm_r Dir.glob('/tmp/*')
# Bundler::FileUtils.rm_r 'some_dir', :force => true
# Bundler::FileUtils.rm_r 'some_dir', force: true
#
# WARNING: This method causes local vulnerability
# if one of parent directories or removing directory tree are world
# writable (including /tmp, whose permission is 1777), and the current
# process has strong privilege such as Unix super user (root), and the
# system has symbolic link. For secure removing, read the documentation
# of #remove_entry_secure carefully, and set :secure option to true.
# Default is :secure=>false.
# of remove_entry_secure carefully, and set :secure option to true.
# Default is <tt>secure: false</tt>.
#
# NOTE: This method calls #remove_entry_secure if :secure option is set.
# See also #remove_entry_secure.
# NOTE: This method calls remove_entry_secure if :secure option is set.
# See also remove_entry_secure.
#
def rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)
list = fu_list(list)
@ -619,10 +637,10 @@ module Bundler::FileUtils
#
# Equivalent to
#
# Bundler::FileUtils.rm_r(list, :force => true)
# Bundler::FileUtils.rm_r(list, force: true)
#
# WARNING: This method causes local vulnerability.
# Read the documentation of #rm_r first.
# Read the documentation of rm_r first.
#
def rm_rf(list, noop: nil, verbose: nil, secure: nil)
rm_r list, force: true, noop: noop, verbose: verbose, secure: secure
@ -636,7 +654,7 @@ module Bundler::FileUtils
# This method removes a file system entry +path+. +path+ shall be a
# regular file, a directory, or something. If +path+ is a directory,
# remove it recursively. This method is required to avoid TOCTTOU
# (time-of-check-to-time-of-use) local security vulnerability of #rm_r.
# (time-of-check-to-time-of-use) local security vulnerability of rm_r.
# #rm_r causes security hole when:
#
# * Parent directory is world writable (including /tmp).
@ -755,7 +773,7 @@ module Bundler::FileUtils
# +path+ might be a regular file, a directory, or something.
# If +path+ is a directory, remove it recursively.
#
# See also #remove_entry_secure.
# See also remove_entry_secure.
#
def remove_entry(path, force = false)
Entry_.new(path).postorder_traverse do |ent|
@ -839,8 +857,8 @@ module Bundler::FileUtils
# mode to +mode+. If +dest+ is a directory, destination is +dest+/+src+.
# This method removes destination before copy.
#
# Bundler::FileUtils.install 'ruby', '/usr/local/bin/ruby', :mode => 0755, :verbose => true
# Bundler::FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', :verbose => true
# Bundler::FileUtils.install 'ruby', '/usr/local/bin/ruby', mode: 0755, verbose: true
# Bundler::FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', verbose: true
#
def install(src, dest, mode: nil, owner: nil, group: nil, preserve: nil,
noop: nil, verbose: nil)
@ -970,12 +988,12 @@ module Bundler::FileUtils
# Absolute mode is
# Bundler::FileUtils.chmod 0755, 'somecommand'
# Bundler::FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
# Bundler::FileUtils.chmod 0755, '/usr/bin/ruby', :verbose => true
# Bundler::FileUtils.chmod 0755, '/usr/bin/ruby', verbose: true
#
# Symbolic mode is
# Bundler::FileUtils.chmod "u=wrx,go=rx", 'somecommand'
# Bundler::FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
# Bundler::FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose => true
# Bundler::FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', verbose: true
#
# "a" :: is user, group, other mask.
# "u" :: is user's mask.
@ -1035,7 +1053,7 @@ module Bundler::FileUtils
# the attribute.
#
# Bundler::FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby'
# Bundler::FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), :verbose => true
# Bundler::FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), verbose: true
#
def chown(user, group, list, noop: nil, verbose: nil)
list = fu_list(list)
@ -1059,7 +1077,7 @@ module Bundler::FileUtils
# method does not change the attribute.
#
# Bundler::FileUtils.chown_R 'www', 'www', '/var/www/htdocs'
# Bundler::FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', :verbose => true
# Bundler::FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', verbose: true
#
def chown_R(user, group, list, noop: nil, verbose: nil, force: nil)
list = fu_list(list)
@ -1276,13 +1294,13 @@ module Bundler::FileUtils
opts[:encoding] = ::Encoding::UTF_8 if fu_windows?
files = if Dir.respond_to?(:children)
Dir.children(path, opts)
Dir.children(path, **opts)
else
Dir.entries(path(), opts)
Dir.entries(path(), **opts)
.reject {|n| n == '.' or n == '..' }
end
files.map {|n| Entry_.new(prefix(), join(rel(), n.untaint)) }
files.map {|n| Entry_.new(prefix(), join(rel(), n.tap{|x| x.untaint if RUBY_VERSION < "2.7" })) }
end
def stat
@ -1369,18 +1387,21 @@ module Bundler::FileUtils
end
when symlink?
File.symlink File.readlink(path()), dest
when chardev?
raise "cannot handle device file" unless File.respond_to?(:mknod)
mknod dest, ?c, 0666, lstat().rdev
when blockdev?
raise "cannot handle device file" unless File.respond_to?(:mknod)
mknod dest, ?b, 0666, lstat().rdev
when chardev?, blockdev?
raise "cannot handle device file"
when socket?
raise "cannot handle socket" unless File.respond_to?(:mknod)
mknod dest, nil, lstat().mode, 0
begin
require 'socket'
rescue LoadError
raise "cannot handle socket"
else
raise "cannot handle socket" unless defined?(UNIXServer)
end
UNIXServer.new(dest).close
File.chmod lstat().mode, dest
when pipe?
raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
mkfifo dest, 0666
File.mkfifo dest, lstat().mode
when door?
raise "cannot handle door: #{path()}"
else
@ -1499,14 +1520,14 @@ module Bundler::FileUtils
private
$fileutils_rb_have_lchmod = nil
@@fileutils_rb_have_lchmod = nil
def have_lchmod?
# This is not MT-safe, but it does not matter.
if $fileutils_rb_have_lchmod == nil
$fileutils_rb_have_lchmod = check_have_lchmod?
if @@fileutils_rb_have_lchmod == nil
@@fileutils_rb_have_lchmod = check_have_lchmod?
end
$fileutils_rb_have_lchmod
@@fileutils_rb_have_lchmod
end
def check_have_lchmod?
@ -1517,14 +1538,14 @@ module Bundler::FileUtils
return false
end
$fileutils_rb_have_lchown = nil
@@fileutils_rb_have_lchown = nil
def have_lchown?
# This is not MT-safe, but it does not matter.
if $fileutils_rb_have_lchown == nil
$fileutils_rb_have_lchown = check_have_lchown?
if @@fileutils_rb_have_lchown == nil
@@fileutils_rb_have_lchown = check_have_lchown?
end
$fileutils_rb_have_lchown
@@fileutils_rb_have_lchown
end
def check_have_lchown?
@ -1546,10 +1567,13 @@ module Bundler::FileUtils
else
DIRECTORY_TERM = "(?=/|\\z)"
end
SYSCASE = File::FNM_SYSCASE.nonzero? ? "-i" : ""
def descendant_directory?(descendant, ascendant)
/\A(?#{SYSCASE}:#{Regexp.quote(ascendant)})#{DIRECTORY_TERM}/ =~ File.dirname(descendant)
if File::FNM_SYSCASE.nonzero?
File.expand_path(File.dirname(descendant)).casecmp(File.expand_path(ascendant)) == 0
else
File.expand_path(File.dirname(descendant)) == File.expand_path(ascendant)
end
end
end # class Entry_
@ -1588,13 +1612,13 @@ module Bundler::FileUtils
end
private_module_function :fu_same?
@fileutils_output = $stderr
@fileutils_label = ''
def fu_output_message(msg) #:nodoc:
@fileutils_output ||= $stderr
@fileutils_label ||= ''
@fileutils_output.puts @fileutils_label + msg
output = @fileutils_output if defined?(@fileutils_output)
output ||= $stderr
if defined?(@fileutils_label)
msg = @fileutils_label + msg
end
output.puts msg
end
private_module_function :fu_output_message
@ -1605,8 +1629,11 @@ module Bundler::FileUtils
tbl
}
public
#
# Returns an Array of method names which have any options.
# Returns an Array of names of high-level methods that accept any keyword
# arguments.
#
# p Bundler::FileUtils.commands #=> ["chmod", "cp", "cp_r", "install", ...]
#
@ -1645,7 +1672,7 @@ module Bundler::FileUtils
end
#
# Returns an Array of method names which have the option +opt+.
# Returns an Array of methods names which have the option +opt+.
#
# p Bundler::FileUtils.collect_method(:preserve) #=> ["cp", "cp_r", "copy", "install"]
#
@ -1653,14 +1680,16 @@ module Bundler::FileUtils
OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) }
end
LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern)
module LowMethods
private
LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern) # :nodoc:
module LowMethods # :nodoc: internal use only
private
def _do_nothing(*)end
::Bundler::FileUtils::LOW_METHODS.map {|name| alias_method name, :_do_nothing}
end
METHODS = singleton_methods() - [:private_module_function,
METHODS = singleton_methods() - [:private_module_function, # :nodoc:
:commands, :options, :have_option?, :options_of, :collect_method]
#
@ -1670,8 +1699,6 @@ module Bundler::FileUtils
#
module Verbose
include Bundler::FileUtils
@fileutils_output = $stderr
@fileutils_label = ''
names = ::Bundler::FileUtils.collect_method(:verbose)
names.each do |name|
module_eval(<<-EOS, __FILE__, __LINE__ + 1)
@ -1695,8 +1722,6 @@ module Bundler::FileUtils
module NoWrite
include Bundler::FileUtils
include LowMethods
@fileutils_output = $stderr
@fileutils_label = ''
names = ::Bundler::FileUtils.collect_method(:noop)
names.each do |name|
module_eval(<<-EOS, __FILE__, __LINE__ + 1)
@ -1721,8 +1746,6 @@ module Bundler::FileUtils
module DryRun
include Bundler::FileUtils
include LowMethods
@fileutils_output = $stderr
@fileutils_label = ''
names = ::Bundler::FileUtils.collect_method(:noop)
names.each do |name|
module_eval(<<-EOS, __FILE__, __LINE__ + 1)

View file

@ -1,5 +1,5 @@
# frozen_string_literal: true
module Bundler::FileUtils
VERSION = "1.2.0"
VERSION = "1.3.0"
end

View file

@ -1,7 +1,7 @@
# frozen_string_literal: false
module Bundler
VERSION = "2.1.0.pre.2".freeze
VERSION = "2.1.0.pre.3".freeze
def self.bundler_major_version
@bundler_major_version ||= VERSION.split(".").first.to_i

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-ADD" "1" "September 2019" "" ""
.TH "BUNDLE\-ADD" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install

View file

@ -55,4 +55,4 @@ OPTIONS
September 2019 BUNDLE-ADD(1)
November 2019 BUNDLE-ADD(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-BINSTUBS" "1" "September 2019" "" ""
.TH "BUNDLE\-BINSTUBS" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems

View file

@ -45,4 +45,4 @@ BUNDLE INSTALL --BINSTUBS
September 2019 BUNDLE-BINSTUBS(1)
November 2019 BUNDLE-BINSTUBS(1)

55
man/bundle-cache.1 Normal file
View file

@ -0,0 +1,55 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CACHE" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
.
.SH "SYNOPSIS"
\fBbundle cache\fR
.
.SH "DESCRIPTION"
Copy all of the \fB\.gem\fR files needed to run the application into the \fBvendor/cache\fR directory\. In the future, when running [bundle install(1)][bundle\-install], use the gems in the cache in preference to the ones on \fBrubygems\.org\fR\.
.
.SH "GIT AND PATH GEMS"
The \fBbundle cache\fR command can also package \fB:git\fR and \fB:path\fR dependencies besides \.gem files\. This needs to be explicitly enabled via the \fB\-\-all\fR option\. Once used, the \fB\-\-all\fR option will be remembered\.
.
.SH "SUPPORT FOR MULTIPLE PLATFORMS"
When using gems that have different packages for different platforms, Bundler supports caching of gems for other platforms where the Gemfile has been resolved (i\.e\. present in the lockfile) in \fBvendor/cache\fR\. This needs to be enabled via the \fB\-\-all\-platforms\fR option\. This setting will be remembered in your local bundler configuration\.
.
.SH "REMOTE FETCHING"
By default, if you run \fBbundle install(1)\fR](bundle\-install\.1\.html) after running bundle cache(1) \fIbundle\-cache\.1\.html\fR, bundler will still connect to \fBrubygems\.org\fR to check whether a platform\-specific gem exists for any of the gems in \fBvendor/cache\fR\.
.
.P
For instance, consider this Gemfile(5):
.
.IP "" 4
.
.nf
source "https://rubygems\.org"
gem "nokogiri"
.
.fi
.
.IP "" 0
.
.P
If you run \fBbundle cache\fR under C Ruby, bundler will retrieve the version of \fBnokogiri\fR for the \fB"ruby"\fR platform\. If you deploy to JRuby and run \fBbundle install\fR, bundler is forced to check to see whether a \fB"java"\fR platformed \fBnokogiri\fR exists\.
.
.P
Even though the \fBnokogiri\fR gem for the Ruby platform is \fItechnically\fR acceptable on JRuby, it has a C extension that does not run on JRuby\. As a result, bundler will, by default, still connect to \fBrubygems\.org\fR to check whether it has a version of one of your gems more specific to your platform\.
.
.P
This problem is also not limited to the \fB"java"\fR platform\. A similar (common) problem can happen when developing on Windows and deploying to Linux, or even when developing on OSX and deploying to Linux\.
.
.P
If you know for sure that the gems packaged in \fBvendor/cache\fR are appropriate for the platform you are on, you can run \fBbundle install \-\-local\fR to skip checking for more appropriate gems, and use the ones in \fBvendor/cache\fR\.
.
.P
One way to be sure that you have the right platformed versions of all your gems is to run \fBbundle cache\fR on an identical machine and check in the gems\. For instance, you can run \fBbundle cache\fR on an identical staging box during your staging process, and check in the \fBvendor/cache\fR before deploying to production\.
.
.P
By default, bundle cache(1) \fIbundle\-cache\.1\.html\fR fetches and also installs the gems to the default location\. To package the dependencies to \fBvendor/cache\fR without installing them to the local install location, you can run \fBbundle cache \-\-no\-install\fR\.

78
man/bundle-cache.1.txt Normal file
View file

@ -0,0 +1,78 @@
BUNDLE-CACHE(1) BUNDLE-CACHE(1)
NAME
bundle-cache - Package your needed .gem files into your application
SYNOPSIS
bundle cache
DESCRIPTION
Copy all of the .gem files needed to run the application into the ven-
dor/cache directory. In the future, when running [bundle
install(1)][bundle-install], use the gems in the cache in preference to
the ones on rubygems.org.
GIT AND PATH GEMS
The bundle cache command can also package :git and :path dependencies
besides .gem files. This needs to be explicitly enabled via the --all
option. Once used, the --all option will be remembered.
SUPPORT FOR MULTIPLE PLATFORMS
When using gems that have different packages for different platforms,
Bundler supports caching of gems for other platforms where the Gemfile
has been resolved (i.e. present in the lockfile) in vendor/cache. This
needs to be enabled via the --all-platforms option. This setting will
be remembered in your local bundler configuration.
REMOTE FETCHING
By default, if you run bundle install(1)](bundle-install.1.html) after
running bundle cache(1) bundle-cache.1.html, bundler will still connect
to rubygems.org to check whether a platform-specific gem exists for any
of the gems in vendor/cache.
For instance, consider this Gemfile(5):
source "https://rubygems.org"
gem "nokogiri"
If you run bundle cache under C Ruby, bundler will retrieve the version
of nokogiri for the "ruby" platform. If you deploy to JRuby and run
bundle install, bundler is forced to check to see whether a "java"
platformed nokogiri exists.
Even though the nokogiri gem for the Ruby platform is technically
acceptable on JRuby, it has a C extension that does not run on JRuby.
As a result, bundler will, by default, still connect to rubygems.org to
check whether it has a version of one of your gems more specific to
your platform.
This problem is also not limited to the "java" platform. A similar
(common) problem can happen when developing on Windows and deploying to
Linux, or even when developing on OSX and deploying to Linux.
If you know for sure that the gems packaged in vendor/cache are appro-
priate for the platform you are on, you can run bundle install --local
to skip checking for more appropriate gems, and use the ones in ven-
dor/cache.
One way to be sure that you have the right platformed versions of all
your gems is to run bundle cache on an identical machine and check in
the gems. For instance, you can run bundle cache on an identical stag-
ing box during your staging process, and check in the vendor/cache
before deploying to production.
By default, bundle cache(1) bundle-cache.1.html fetches and also
installs the gems to the default location. To package the dependencies
to vendor/cache without installing them to the local install location,
you can run bundle cache --no-install.
November 2019 BUNDLE-CACHE(1)

72
man/bundle-cache.ronn Normal file
View file

@ -0,0 +1,72 @@
bundle-cache(1) -- Package your needed `.gem` files into your application
===========================================================================
## SYNOPSIS
`bundle cache`
## DESCRIPTION
Copy all of the `.gem` files needed to run the application into the
`vendor/cache` directory. In the future, when running [bundle install(1)][bundle-install],
use the gems in the cache in preference to the ones on `rubygems.org`.
## GIT AND PATH GEMS
The `bundle cache` command can also package `:git` and `:path` dependencies
besides .gem files. This needs to be explicitly enabled via the `--all` option.
Once used, the `--all` option will be remembered.
## SUPPORT FOR MULTIPLE PLATFORMS
When using gems that have different packages for different platforms, Bundler
supports caching of gems for other platforms where the Gemfile has been resolved
(i.e. present in the lockfile) in `vendor/cache`. This needs to be enabled via
the `--all-platforms` option. This setting will be remembered in your local
bundler configuration.
## REMOTE FETCHING
By default, if you run `bundle install(1)`](bundle-install.1.html) after running
[bundle cache(1)](bundle-cache.1.html), bundler will still connect to `rubygems.org`
to check whether a platform-specific gem exists for any of the gems
in `vendor/cache`.
For instance, consider this Gemfile(5):
source "https://rubygems.org"
gem "nokogiri"
If you run `bundle cache` under C Ruby, bundler will retrieve
the version of `nokogiri` for the `"ruby"` platform. If you deploy
to JRuby and run `bundle install`, bundler is forced to check to
see whether a `"java"` platformed `nokogiri` exists.
Even though the `nokogiri` gem for the Ruby platform is
_technically_ acceptable on JRuby, it has a C extension
that does not run on JRuby. As a result, bundler will, by default,
still connect to `rubygems.org` to check whether it has a version
of one of your gems more specific to your platform.
This problem is also not limited to the `"java"` platform.
A similar (common) problem can happen when developing on Windows
and deploying to Linux, or even when developing on OSX and
deploying to Linux.
If you know for sure that the gems packaged in `vendor/cache`
are appropriate for the platform you are on, you can run
`bundle install --local` to skip checking for more appropriate
gems, and use the ones in `vendor/cache`.
One way to be sure that you have the right platformed versions
of all your gems is to run `bundle cache` on an identical
machine and check in the gems. For instance, you can run
`bundle cache` on an identical staging box during your
staging process, and check in the `vendor/cache` before
deploying to production.
By default, [bundle cache(1)](bundle-cache.1.html) fetches and also
installs the gems to the default location. To package the
dependencies to `vendor/cache` without installing them to the
local install location, you can run `bundle cache --no-install`.

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CHECK" "1" "September 2019" "" ""
.TH "BUNDLE\-CHECK" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems

View file

@ -30,4 +30,4 @@ OPTIONS
September 2019 BUNDLE-CHECK(1)
November 2019 BUNDLE-CHECK(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CLEAN" "1" "September 2019" "" ""
.TH "BUNDLE\-CLEAN" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory

View file

@ -23,4 +23,4 @@ OPTIONS
September 2019 BUNDLE-CLEAN(1)
November 2019 BUNDLE-CLEAN(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CONFIG" "1" "September 2019" "" ""
.TH "BUNDLE\-CONFIG" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-config\fR \- Set bundler configuration options

View file

@ -525,4 +525,4 @@ CONFIGURE BUNDLER DIRECTORIES
September 2019 BUNDLE-CONFIG(1)
November 2019 BUNDLE-CONFIG(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-DOCTOR" "1" "September 2019" "" ""
.TH "BUNDLE\-DOCTOR" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-doctor\fR \- Checks the bundle for common problems

View file

@ -41,4 +41,4 @@ OPTIONS
September 2019 BUNDLE-DOCTOR(1)
November 2019 BUNDLE-DOCTOR(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-EXEC" "1" "September 2019" "" ""
.TH "BUNDLE\-EXEC" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-exec\fR \- Execute a command in the context of the bundle

View file

@ -175,4 +175,4 @@ RUBYGEMS PLUGINS
September 2019 BUNDLE-EXEC(1)
November 2019 BUNDLE-EXEC(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-GEM" "1" "September 2019" "" ""
.TH "BUNDLE\-GEM" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem

View file

@ -77,8 +77,8 @@ OPTIONS
-e, --edit[=EDITOR]
Open the resulting GEM_NAME.gemspec in EDITOR, or the default
editor if not specified. The default is $BUNDLER_EDITOR,
$VISUAL, or $EDITOR.
editor if not specified. The default is $BUNDLER_EDITOR, $VIS-
UAL, or $EDITOR.
SEE ALSO
o bundle config(1) bundle-config.1.html
@ -88,4 +88,4 @@ SEE ALSO
September 2019 BUNDLE-GEM(1)
November 2019 BUNDLE-GEM(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INFO" "1" "September 2019" "" ""
.TH "BUNDLE\-INFO" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-info\fR \- Show information for the given gem in your bundle

View file

@ -18,4 +18,4 @@ OPTIONS
September 2019 BUNDLE-INFO(1)
November 2019 BUNDLE-INFO(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INIT" "1" "September 2019" "" ""
.TH "BUNDLE\-INIT" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory

View file

@ -31,4 +31,4 @@ SEE ALSO
September 2019 BUNDLE-INIT(1)
November 2019 BUNDLE-INIT(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INJECT" "1" "September 2019" "" ""
.TH "BUNDLE\-INJECT" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile

View file

@ -29,4 +29,4 @@ DESCRIPTION
September 2019 BUNDLE-INJECT(1)
November 2019 BUNDLE-INJECT(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INSTALL" "1" "September 2019" "" ""
.TH "BUNDLE\-INSTALL" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile

View file

@ -398,4 +398,4 @@ SEE ALSO
September 2019 BUNDLE-INSTALL(1)
November 2019 BUNDLE-INSTALL(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-LIST" "1" "September 2019" "" ""
.TH "BUNDLE\-LIST" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-list\fR \- List all the gems in the bundle

View file

@ -40,4 +40,4 @@ OPTIONS
September 2019 BUNDLE-LIST(1)
November 2019 BUNDLE-LIST(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-LOCK" "1" "September 2019" "" ""
.TH "BUNDLE\-LOCK" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing

View file

@ -90,4 +90,4 @@ PATCH LEVEL OPTIONS
September 2019 BUNDLE-LOCK(1)
November 2019 BUNDLE-LOCK(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-OPEN" "1" "September 2019" "" ""
.TH "BUNDLE\-OPEN" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle

View file

@ -26,4 +26,4 @@ DESCRIPTION
September 2019 BUNDLE-OPEN(1)
November 2019 BUNDLE-OPEN(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-OUTDATED" "1" "September 2019" "" ""
.TH "BUNDLE\-OUTDATED" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-outdated\fR \- List installed gems with newer versions available

View file

@ -128,4 +128,4 @@ FILTERING OUTPUT
September 2019 BUNDLE-OUTDATED(1)
November 2019 BUNDLE-OUTDATED(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PLATFORM" "1" "September 2019" "" ""
.TH "BUNDLE\-PLATFORM" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-platform\fR \- Displays platform compatibility information

View file

@ -54,4 +54,4 @@ OPTIONS
September 2019 BUNDLE-PLATFORM(1)
November 2019 BUNDLE-PLATFORM(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PRISTINE" "1" "September 2019" "" ""
.TH "BUNDLE\-PRISTINE" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition

View file

@ -41,4 +41,4 @@ DESCRIPTION
September 2019 BUNDLE-PRISTINE(1)
November 2019 BUNDLE-PRISTINE(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-REMOVE" "1" "September 2019" "" ""
.TH "BUNDLE\-REMOVE" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-remove\fR \- Removes gems from the Gemfile

View file

@ -31,4 +31,4 @@ OPTIONS
September 2019 BUNDLE-REMOVE(1)
November 2019 BUNDLE-REMOVE(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-SHOW" "1" "September 2019" "" ""
.TH "BUNDLE\-SHOW" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem

View file

@ -24,4 +24,4 @@ OPTIONS
September 2019 BUNDLE-SHOW(1)
November 2019 BUNDLE-SHOW(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-UPDATE" "1" "September 2019" "" ""
.TH "BUNDLE\-UPDATE" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-update\fR \- Update your gems to the latest available versions

View file

@ -387,4 +387,4 @@ RECOMMENDED WORKFLOW
September 2019 BUNDLE-UPDATE(1)
November 2019 BUNDLE-UPDATE(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-VIZ" "1" "September 2019" "" ""
.TH "BUNDLE\-VIZ" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile

View file

@ -36,4 +36,4 @@ OPTIONS
September 2019 BUNDLE-VIZ(1)
November 2019 BUNDLE-VIZ(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE" "1" "September 2019" "" ""
.TH "BUNDLE" "1" "November 2019" "" ""
.
.SH "NAME"
\fBbundle\fR \- Ruby Dependency Management

View file

@ -113,4 +113,4 @@ OBSOLETE
September 2019 BUNDLE(1)
November 2019 BUNDLE(1)

View file

@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GEMFILE" "5" "September 2019" "" ""
.TH "GEMFILE" "5" "November 2019" "" ""
.
.SH "NAME"
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs

View file

@ -646,4 +646,4 @@ SOURCE PRIORITY
September 2019 GEMFILE(5)
November 2019 GEMFILE(5)

View file

@ -232,16 +232,13 @@ EOF
path = "/home/oggy"
allow(Bundler.rubygems).to receive(:user_home).and_return(path)
allow(File).to receive(:directory?).with(path).and_return false
allow(Etc).to receive(:getlogin).and_return("USER")
allow(Dir).to receive(:tmpdir).and_return("/TMP")
allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(true)
expect(FileUtils).to receive(:mkpath).with("/TMP/bundler/home/USER")
allow(Bundler).to receive(:tmp).and_return(Pathname.new("/tmp/trulyrandom"))
message = <<EOF
`/home/oggy` is not a directory.
Bundler will use `/TMP/bundler/home/USER' as your home directory temporarily.
Bundler will use `/tmp/trulyrandom' as your home directory temporarily.
EOF
expect(Bundler.ui).to receive(:warn).with(message)
expect(Bundler.user_home).to eq(Pathname("/TMP/bundler/home/USER"))
expect(Bundler.user_home).to eq(Pathname("/tmp/trulyrandom"))
end
end
@ -254,16 +251,13 @@ EOF
allow(File).to receive(:directory?).with(path).and_return true
allow(File).to receive(:writable?).with(path).and_return false
allow(File).to receive(:directory?).with(dotbundle).and_return false
allow(Etc).to receive(:getlogin).and_return("USER")
allow(Dir).to receive(:tmpdir).and_return("/TMP")
allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(true)
expect(FileUtils).to receive(:mkpath).with("/TMP/bundler/home/USER")
allow(Bundler).to receive(:tmp).and_return(Pathname.new("/tmp/trulyrandom"))
message = <<EOF
`/home/oggy` is not writable.
Bundler will use `/TMP/bundler/home/USER' as your home directory temporarily.
Bundler will use `/tmp/trulyrandom' as your home directory temporarily.
EOF
expect(Bundler.ui).to receive(:warn).with(message)
expect(Bundler.user_home).to eq(Pathname("/TMP/bundler/home/USER"))
expect(Bundler.user_home).to eq(Pathname("/tmp/trulyrandom"))
end
context ".bundle exists and have correct permissions" do
@ -282,31 +276,17 @@ EOF
context "home directory is not set" do
it "should issue warning and return a temporary user home" do
allow(Bundler.rubygems).to receive(:user_home).and_return(nil)
allow(Etc).to receive(:getlogin).and_return("USER")
allow(Dir).to receive(:tmpdir).and_return("/TMP")
allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(true)
expect(FileUtils).to receive(:mkpath).with("/TMP/bundler/home/USER")
allow(Bundler).to receive(:tmp).and_return(Pathname.new("/tmp/trulyrandom"))
message = <<EOF
Your home directory is not set.
Bundler will use `/TMP/bundler/home/USER' as your home directory temporarily.
Bundler will use `/tmp/trulyrandom' as your home directory temporarily.
EOF
expect(Bundler.ui).to receive(:warn).with(message)
expect(Bundler.user_home).to eq(Pathname("/TMP/bundler/home/USER"))
expect(Bundler.user_home).to eq(Pathname("/tmp/trulyrandom"))
end
end
end
describe "#tmp_home_path" do
it "should create temporary user home" do
allow(Dir).to receive(:tmpdir).and_return("/TMP")
allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(false)
expect(FileUtils).to receive(:mkpath).once.ordered.with("/TMP/bundler/home")
expect(FileUtils).to receive(:mkpath).once.ordered.with("/TMP/bundler/home/USER")
expect(File).to receive(:chmod).with(0o777, "/TMP/bundler/home")
expect(Bundler.tmp_home_path("USER", "")).to eq(Pathname("/TMP/bundler/home/USER"))
end
end
describe "#requires_sudo?" do
let!(:tmpdir) { Dir.mktmpdir }
let(:bundle_path) { Pathname("#{tmpdir}/bundle") }

View file

@ -27,6 +27,56 @@ RSpec.describe "bundle executable" do
expect(out).to eq("Hello, world")
end
describe "aliases" do
it "aliases e to exec" do
bundle "e --help"
expect(out).to include("BUNDLE-EXEC")
end
it "aliases ex to exec" do
bundle "ex --help"
expect(out).to include("BUNDLE-EXEC")
end
it "aliases exe to exec" do
bundle "exe --help"
expect(out).to include("BUNDLE-EXEC")
end
it "aliases c to check" do
bundle "c --help"
expect(out).to include("BUNDLE-CHECK")
end
it "aliases i to install" do
bundle "i --help"
expect(out).to include("BUNDLE-INSTALL")
end
it "aliases ls to list" do
bundle "ls --help"
expect(out).to include("BUNDLE-LIST")
end
it "aliases package to cache" do
bundle "package --help"
expect(out).to include("BUNDLE-CACHE")
end
it "aliases pack to cache" do
bundle "pack --help"
expect(out).to include("BUNDLE-CACHE")
end
end
context "with no arguments" do
it "prints a concise help message", :bundler => "3" do
bundle! ""

View file

@ -94,7 +94,7 @@ RSpec.describe Bundler, "friendly errors" do
end
it "writes to Bundler.ui.trace" do
expect(Bundler.ui).to receive(:trace).with(orig_error, nil, true)
expect(Bundler.ui).to receive(:trace).with(orig_error)
Bundler::FriendlyErrors.log_error(error)
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
require_relative "../support/streams"
RSpec.describe Bundler::Plugin do
Plugin = Bundler::Plugin

View file

@ -400,13 +400,21 @@ RSpec.describe "Bundler::RubyVersion and its subclasses" do
let(:bundler_system_ruby_version) { subject }
around do |example|
if Bundler::RubyVersion.instance_variable_defined?("@ruby_version")
begin
old_ruby_version = Bundler::RubyVersion.instance_variable_get("@ruby_version")
Bundler::RubyVersion.instance_variable_set("@ruby_version", nil)
Bundler::RubyVersion.remove_instance_variable("@ruby_version")
example.run
ensure
Bundler::RubyVersion.instance_variable_set("@ruby_version", old_ruby_version)
end
else
begin
example.run
ensure
Bundler::RubyVersion.remove_instance_variable("@ruby_version")
end
end
end
it "should return an instance of Bundler::RubyVersion" do

View file

@ -67,7 +67,7 @@ that would suck --ehhh=oh geez it looks like i might have broken bundler somehow
context "when $TMPDIR is not writable" do
it "does not raise" do
expect(Bundler.rubygems).to receive(:user_home).twice.and_return(nil)
expect(FileUtils).to receive(:mkpath).twice.with(File.join(Dir.tmpdir, "bundler", "home")).and_raise(Errno::EROFS, "Read-only file system @ dir_s_mkdir - /tmp/bundler")
expect(Bundler).to receive(:tmp).twice.and_raise(Errno::EROFS, "Read-only file system @ dir_s_mkdir - /tmp/bundler")
expect(subject.send(:global_config_file)).to be_nil
end

View file

@ -236,7 +236,7 @@ RSpec.describe Bundler::SharedHelpers do
shared_examples_for "ENV['RUBYOPT'] gets set correctly" do
it "ensures -rbundler/setup is at the beginning of ENV['RUBYOPT']" do
subject.set_bundle_environment
expect(ENV["RUBYOPT"].split(" ")).to start_with("-r#{lib}/bundler/setup")
expect(ENV["RUBYOPT"].split(" ")).to start_with("-r#{lib_dir}/bundler/setup")
end
end

View file

@ -59,7 +59,6 @@ RSpec.describe Bundler::Source do
context "with color", :no_color_tty do
before do
allow($stdout).to receive(:tty?).and_return(true)
Bundler.ui = Bundler::UI::Shell.new
end
it "should return a string with the spec name and version and locked spec version" do
@ -68,7 +67,11 @@ RSpec.describe Bundler::Source do
end
context "without color" do
before { Bundler.ui = Bundler::UI::Shell.new("no-color" => true) }
around do |example|
with_ui(Bundler::UI::Shell.new("no-color" => true)) do
example.run
end
end
it "should return a string with the spec name and version and locked spec version" do
expect(subject.version_message(spec)).to eq("nokogiri >= 1.6 (was < 1.5)")
@ -83,7 +86,6 @@ RSpec.describe Bundler::Source do
context "with color", :no_color_tty do
before do
allow($stdout).to receive(:tty?).and_return(true)
Bundler.ui = Bundler::UI::Shell.new
end
it "should return a string with the locked spec version in yellow" do
@ -92,7 +94,11 @@ RSpec.describe Bundler::Source do
end
context "without color" do
before { Bundler.ui = Bundler::UI::Shell.new("no-color" => true) }
around do |example|
with_ui(Bundler::UI::Shell.new("no-color" => true)) do
example.run
end
end
it "should return a string with the locked spec version in yellow" do
expect(subject.version_message(spec)).to eq("nokogiri 1.6.1 (was 1.7.0)")
@ -107,7 +113,6 @@ RSpec.describe Bundler::Source do
context "with color", :no_color_tty do
before do
allow($stdout).to receive(:tty?).and_return(true)
Bundler.ui = Bundler::UI::Shell.new
end
it "should return a string with the locked spec version in green" do
@ -116,7 +121,11 @@ RSpec.describe Bundler::Source do
end
context "without color" do
before { Bundler.ui = Bundler::UI::Shell.new("no-color" => true) }
around do |example|
with_ui(Bundler::UI::Shell.new("no-color" => true)) do
example.run
end
end
it "should return a string with the locked spec version in yellow" do
expect(subject.version_message(spec)).to eq("nokogiri 1.7.1 (was 1.7.0)")
@ -178,4 +187,14 @@ RSpec.describe Bundler::Source do
end
end
end
private
def with_ui(ui)
old_ui = Bundler.ui
Bundler.ui = ui
yield
ensure
Bundler.ui = old_ui
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
require_relative "../../support/streams"
RSpec.describe Bundler::UI::Shell do
subject { described_class.new }

View file

@ -10,7 +10,7 @@ RSpec.describe "bundle package" do
context "with --cache-path" do
it "caches gems at given path" do
bundle :package, "cache-path" => "vendor/cache-foo"
bundle :cache, "cache-path" => "vendor/cache-foo"
expect(bundled_app("vendor/cache-foo/rack-1.0.0.gem")).to exist
end
end
@ -18,14 +18,14 @@ RSpec.describe "bundle package" do
context "with config cache_path" do
it "caches gems at given path" do
bundle "config set cache_path vendor/cache-foo"
bundle :package
bundle :cache
expect(bundled_app("vendor/cache-foo/rack-1.0.0.gem")).to exist
end
end
context "with absolute --cache-path" do
it "caches gems at given path" do
bundle :package, "cache-path" => "/tmp/cache-foo"
bundle :cache, "cache-path" => "/tmp/cache-foo"
expect(bundled_app("/tmp/cache-foo/rack-1.0.0.gem")).to exist
end
end

View file

@ -12,8 +12,7 @@ RSpec.describe "git base name" do
end
end
%w[cache package].each do |cmd|
RSpec.describe "bundle #{cmd} with git" do
RSpec.describe "bundle cache with git" do
it "copies repository to vendor cache and uses it" do
git = build_git "foo"
ref = git.ref_for("master", 11)
@ -23,7 +22,7 @@ end
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/foo-1.0-#{ref}")).to exist
expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.git")).not_to exist
expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.bundlecache")).to be_file
@ -42,7 +41,7 @@ end
bundle "install --path vendor/bundle"
bundle "config set cache_all true"
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/foo-1.0-#{ref}")).to exist
expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.git")).not_to exist
@ -59,8 +58,8 @@ end
G
bundle "config set cache_all true"
bundle! cmd
bundle! cmd
bundle! :cache
bundle! :cache
expect(out).to include "Updating files in vendor/cache"
FileUtils.rm_rf lib_path("foo-1.0")
@ -76,7 +75,7 @@ end
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
update_git "foo" do |s|
s.write "lib/foo.rb", "puts :CACHE"
@ -87,7 +86,7 @@ end
bundle! "update", :all => true
bundle "config set cache_all true"
bundle! cmd
bundle! :cache
expect(bundled_app("vendor/cache/foo-1.0-#{ref}")).to exist
expect(bundled_app("vendor/cache/foo-1.0-#{old_ref}")).not_to exist
@ -106,7 +105,7 @@ end
G
bundle "config set cache_all true"
bundle! cmd
bundle! :cache
update_git "foo" do |s|
s.write "lib/foo.rb", "puts :CACHE"
@ -136,7 +135,7 @@ end
bundle %(config set local.foo #{lib_path("foo-1.0")})
bundle "install"
bundle "config set cache_all true"
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/foo-invalid-#{ref}")).to exist
@ -169,7 +168,7 @@ end
ref = git.ref_for("master", 11)
bundle "config set cache_all true"
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/has_submodule-1.0-#{ref}")).to exist
expect(bundled_app("vendor/cache/has_submodule-1.0-#{ref}/submodule-1.0")).to exist
@ -183,7 +182,7 @@ end
gem "foo", :git => '#{lib_path("foo-1.0")}'
G
bundle cmd
bundle :cache
expect(err).to include("Your Gemfile contains path and git dependencies.")
end
@ -196,8 +195,8 @@ end
G
bundle "config set cache_all true"
bundle cmd
bundle cmd
bundle :cache
bundle :cache
expect(err).not_to include("Your Gemfile contains path and git dependencies.")
end
@ -214,21 +213,21 @@ end
gem "foo", :git => '#{lib_path("foo-1.0")}'
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
ref = git.ref_for("master", 11)
gemspec = bundled_app("vendor/cache/foo-1.0-#{ref}/foo.gemspec").read
expect(gemspec).to_not match("`echo bob`")
end
it "can install after #{cmd} with git not installed" do
it "can install after bundle cache with git not installed" do
build_git "foo"
gemfile <<-G
gem "foo", :git => '#{lib_path("foo-1.0")}'
G
bundle! "config set cache_all true"
bundle! cmd, "all-platforms" => true, :install => false, :path => "./vendor/cache"
bundle! :cache, "all-platforms" => true, :install => false, :path => "./vendor/cache"
simulate_new_machine
with_path_as "" do
@ -238,4 +237,3 @@ end
end
end
end
end

View file

@ -1,7 +1,6 @@
# frozen_string_literal: true
%w[cache package].each do |cmd|
RSpec.describe "bundle #{cmd} with path" do
RSpec.describe "bundle cache with path" do
it "is no-op when the path is within the bundle" do
build_lib "foo", :path => bundled_app("lib/foo")
@ -10,7 +9,7 @@
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/foo-1.0")).not_to exist
expect(the_bundle).to include_gems "foo 1.0"
end
@ -23,7 +22,7 @@
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/foo-1.0")).to exist
expect(bundled_app("vendor/cache/foo-1.0/.bundlecache")).to be_file
@ -42,7 +41,7 @@
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/#{libname}")).to exist
expect(bundled_app("vendor/cache/#{libname}/.bundlecache")).to be_file
@ -58,13 +57,13 @@
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
build_lib "foo" do |s|
s.write "lib/foo.rb", "puts :CACHE"
end
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/foo-1.0")).to exist
FileUtils.rm_rf lib_path("foo-1.0")
@ -81,13 +80,13 @@
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
install_gemfile <<-G
gem "bar", :path => '#{lib_path("bar-1.0")}'
G
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/bar-1.0")).not_to exist
end
@ -98,7 +97,7 @@
gem "foo", :path => '#{lib_path("foo-1.0")}'
G
bundle cmd
bundle :cache
expect(err).to match(/please pass the \-\-all flag/)
expect(bundled_app("vendor/cache/foo-1.0")).not_to exist
end
@ -111,7 +110,7 @@
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
build_lib "bar"
install_gemfile <<-G
@ -119,7 +118,7 @@
gem "bar", :path => '#{lib_path("bar-1.0")}'
G
bundle cmd
bundle :cache
expect(bundled_app("vendor/cache/bar-1.0")).to exist
end
@ -131,7 +130,7 @@
G
bundle "config set cache_all true"
bundle cmd
bundle :cache
build_lib "baz"
gemfile <<-G
@ -139,8 +138,7 @@
gem "baz", :path => '#{lib_path("baz-1.0")}'
G
bundle "#{cmd} --no-all"
bundle "cache --no-all"
expect(bundled_app("vendor/cache/baz-1.0")).not_to exist
end
end
end

View file

@ -239,4 +239,13 @@ RSpec.describe "bundle add" do
expect(err).not_to include("You may also need to change the version requirement specified in the Gemfile if it's too restrictive")
end
end
describe "when a gem is added and cache exists" do
it "caches all new dependencies added for the specified gem" do
bundle! :cache
bundle "add 'rack' --version=1.0.0"
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
end
end
end

View file

@ -1,6 +1,6 @@
# frozen_string_literal: true
RSpec.describe "bundle package" do
RSpec.describe "bundle cache" do
context "with --gemfile" do
it "finds the gemfile" do
gemfile bundled_app("NotGemfile"), <<-G
@ -8,7 +8,7 @@ RSpec.describe "bundle package" do
gem 'rack'
G
bundle "package --gemfile=NotGemfile"
bundle "cache --gemfile=NotGemfile"
ENV["BUNDLE_GEMFILE"] = "NotGemfile"
expect(the_bundle).to include_gems "rack 1.0.0"
@ -25,7 +25,7 @@ RSpec.describe "bundle package" do
D
bundle "config set cache_all true"
bundle :package
bundle :cache
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
expect(bundled_app("vendor/cache/bundler-0.9.gem")).to_not exist
@ -56,7 +56,7 @@ RSpec.describe "bundle package" do
D
bundle "config set cache_all true"
bundle! :package
bundle! :cache
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
expect(bundled_app("vendor/cache/nokogiri-1.4.2.gem")).to exist
@ -88,7 +88,7 @@ RSpec.describe "bundle package" do
D
bundle "config set cache_all true"
bundle! :package
bundle! :cache
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
expect(bundled_app("vendor/cache/nokogiri-1.4.2.gem")).to exist
@ -133,7 +133,7 @@ RSpec.describe "bundle package" do
D
bundle "config set cache_all true"
bundle! :package
bundle! :cache
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
expect(bundled_app("vendor/cache/nokogiri-1.4.2.gem")).to exist
@ -152,7 +152,7 @@ RSpec.describe "bundle package" do
gem 'rack'
D
bundle! :package, forgotten_command_line_options(:path => bundled_app("test"))
bundle! :cache, forgotten_command_line_options(:path => bundled_app("test"))
expect(the_bundle).to include_gems "rack 1.0.0"
expect(bundled_app("test/vendor/cache/")).to exist
@ -166,7 +166,7 @@ RSpec.describe "bundle package" do
gem 'rack'
D
bundle! "package --no-install"
bundle! "cache --no-install"
expect(the_bundle).not_to include_gems "rack 1.0.0"
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
@ -178,7 +178,7 @@ RSpec.describe "bundle package" do
gem 'rack'
D
bundle! "package --no-install"
bundle! "cache --no-install"
bundle! "install"
expect(the_bundle).to include_gems "rack 1.0.0"
@ -190,7 +190,7 @@ RSpec.describe "bundle package" do
gem "rack", "1.0.0"
D
bundle! "package --no-install"
bundle! "cache --no-install"
bundle! "update --all"
expect(the_bundle).to include_gems "rack 1.0.0"
@ -204,7 +204,7 @@ RSpec.describe "bundle package" do
gem 'rack', :platforms => :ruby_19
D
bundle "package --all-platforms"
bundle "cache --all-platforms"
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
end
@ -226,7 +226,7 @@ RSpec.describe "bundle package" do
end
G
bundle! :package, "all-platforms" => true
bundle! :cache, "all-platforms" => true
expect(bundled_app("vendor/cache/weakling-0.0.3.gem")).to exist
expect(bundled_app("vendor/cache/uninstallable-2.0.gem")).to exist
expect(the_bundle).to include_gem "rack 1.0"
@ -247,7 +247,7 @@ RSpec.describe "bundle package" do
bundle "install"
end
subject { bundle :package, forgotten_command_line_options(:frozen => true) }
subject { bundle :cache, forgotten_command_line_options(:frozen => true) }
it "tries to install with frozen" do
bundle! "config set deployment true"
@ -276,7 +276,7 @@ RSpec.describe "bundle install with gem sources" do
gem "rack"
G
bundle :pack
bundle :cache
simulate_new_machine
FileUtils.rm_rf gem_repo2
@ -291,7 +291,7 @@ RSpec.describe "bundle install with gem sources" do
gem "rack"
G
bundle! :pack
bundle! :cache
simulate_new_machine
FileUtils.rm_rf gem_repo2
@ -304,7 +304,7 @@ RSpec.describe "bundle install with gem sources" do
source "#{file_uri_for(gem_repo1)}"
gem "rack"
G
bundle :pack
bundle :cache
build_gem "rack", "1.0.0", :path => bundled_app("vendor/cache") do |s|
s.write "lib/rack.rb", "raise 'omg'"
@ -321,7 +321,7 @@ RSpec.describe "bundle install with gem sources" do
source "#{file_uri_for(gem_repo1)}"
gem "platform_specific"
G
bundle :pack
bundle :cache
end
simulate_new_machine

View file

@ -89,7 +89,7 @@ RSpec.describe "bundle exec" do
else
require 'tempfile'
io = Tempfile.new("io-test-fd")
args = %W[#{Gem.ruby} -I#{lib} #{bindir.join("bundle")} exec --keep-file-descriptors #{Gem.ruby} #{command.path} \#{io.to_i}]
args = %W[#{Gem.ruby} -I#{lib_dir} #{bindir.join("bundle")} exec --keep-file-descriptors #{Gem.ruby} #{command.path} \#{io.to_i}]
args << { io.to_i => io }
exec(*args)
end
@ -279,7 +279,7 @@ RSpec.describe "bundle exec" do
G
rubyopt = ENV["RUBYOPT"]
rubyopt = "-r#{lib}/bundler/setup #{rubyopt}"
rubyopt = "-r#{lib_dir}/bundler/setup #{rubyopt}"
bundle "exec 'echo $RUBYOPT'"
expect(out).to have_rubyopts(rubyopt)
@ -294,7 +294,7 @@ RSpec.describe "bundle exec" do
G
rubylib = ENV["RUBYLIB"]
rubylib = rubylib.to_s.split(File::PATH_SEPARATOR).unshift lib.to_s
rubylib = rubylib.to_s.split(File::PATH_SEPARATOR).unshift lib_dir.to_s
rubylib = rubylib.uniq.join(File::PATH_SEPARATOR)
bundle "exec 'echo $RUBYLIB'"

View file

@ -1,22 +1,20 @@
# frozen_string_literal: true
RSpec.describe "bundle gem" do
def execute_bundle_gem(gem_name, flag = "")
bundle! "gem #{gem_name} #{flag}"
# reset gemspec cache for each test because of commit 3d4163a
Bundler.clear_gemspec_cache
end
def gem_skeleton_assertions(gem_name)
def gem_skeleton_assertions
expect(bundled_app("#{gem_name}/#{gem_name}.gemspec")).to exist
expect(bundled_app("#{gem_name}/README.md")).to exist
expect(bundled_app("#{gem_name}/Gemfile")).to exist
expect(bundled_app("#{gem_name}/Rakefile")).to exist
expect(bundled_app("#{gem_name}/lib/test/gem.rb")).to exist
expect(bundled_app("#{gem_name}/lib/test/gem/version.rb")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb")).to exist
end
let(:generated_gemspec) { Bundler::GemHelper.new(bundled_app(gem_name).to_s).gemspec }
let(:generated_gemspec) { Bundler.load_gemspec_uncached(bundled_app(gem_name).join("#{gem_name}.gemspec")) }
let(:gem_name) { "mygem" }
let(:require_path) { "mygem" }
before do
global_config "BUNDLE_GEM__MIT" => "false", "BUNDLE_GEM__TEST" => "false", "BUNDLE_GEM__COC" => "false"
@ -28,7 +26,7 @@ RSpec.describe "bundle gem" do
user = bundleuser
EOF
@git_config_location = ENV["GIT_CONFIG"]
path = "#{File.expand_path(tmp, File.dirname(__FILE__))}/test_git_config.txt"
path = "#{tmp}/test_git_config.txt"
File.open(path, "w") {|f| f.write(git_config_content) }
ENV["GIT_CONFIG"] = path
end
@ -61,15 +59,14 @@ RSpec.describe "bundle gem" do
end
describe "git repo initialization" do
let(:gem_name) { "test-gem" }
shared_examples_for "a gem with an initial git repo" do
before do
execute_bundle_gem(gem_name, flags)
bundle! "gem #{gem_name} #{flags}"
end
it "generates a gem skeleton with a .git folder" do
gem_skeleton_assertions(gem_name)
expect(bundled_app("test-gem/.git")).to exist
gem_skeleton_assertions
expect(bundled_app("#{gem_name}/.git")).to exist
end
end
@ -87,111 +84,104 @@ RSpec.describe "bundle gem" do
context "when passing --no-git" do
before do
execute_bundle_gem(gem_name, "--no-git")
bundle! "gem #{gem_name} --no-git"
end
it "generates a gem skeleton without a .git folder" do
gem_skeleton_assertions(gem_name)
expect(bundled_app("test-gem/.git")).not_to exist
gem_skeleton_assertions
expect(bundled_app("#{gem_name}/.git")).not_to exist
end
end
end
shared_examples_for "--mit flag" do
before do
execute_bundle_gem(gem_name, "--mit")
bundle! "gem #{gem_name} --mit"
end
it "generates a gem skeleton with MIT license" do
gem_skeleton_assertions(gem_name)
expect(bundled_app("test-gem/LICENSE.txt")).to exist
skel = Bundler::GemHelper.new(bundled_app(gem_name).to_s)
expect(skel.gemspec.license).to eq("MIT")
gem_skeleton_assertions
expect(bundled_app("#{gem_name}/LICENSE.txt")).to exist
expect(generated_gemspec.license).to eq("MIT")
end
end
shared_examples_for "--no-mit flag" do
before do
execute_bundle_gem(gem_name, "--no-mit")
bundle! "gem #{gem_name} --no-mit"
end
it "generates a gem skeleton without MIT license" do
gem_skeleton_assertions(gem_name)
expect(bundled_app("test-gem/LICENSE.txt")).to_not exist
gem_skeleton_assertions
expect(bundled_app("#{gem_name}/LICENSE.txt")).to_not exist
end
end
shared_examples_for "--coc flag" do
before do
execute_bundle_gem(gem_name, "--coc")
bundle! "gem #{gem_name} --coc"
end
it "generates a gem skeleton with MIT license" do
gem_skeleton_assertions(gem_name)
expect(bundled_app("test-gem/CODE_OF_CONDUCT.md")).to exist
gem_skeleton_assertions
expect(bundled_app("#{gem_name}/CODE_OF_CONDUCT.md")).to exist
end
describe "README additions" do
it "generates the README with a section for the Code of Conduct" do
expect(bundled_app("test-gem/README.md").read).to include("## Code of Conduct")
expect(bundled_app("test-gem/README.md").read).to include("https://github.com/bundleuser/#{gem_name}/blob/master/CODE_OF_CONDUCT.md")
expect(bundled_app("#{gem_name}/README.md").read).to include("## Code of Conduct")
expect(bundled_app("#{gem_name}/README.md").read).to include("https://github.com/bundleuser/#{gem_name}/blob/master/CODE_OF_CONDUCT.md")
end
end
end
shared_examples_for "--no-coc flag" do
before do
execute_bundle_gem(gem_name, "--no-coc")
bundle! "gem #{gem_name} --no-coc"
end
it "generates a gem skeleton without Code of Conduct" do
gem_skeleton_assertions(gem_name)
expect(bundled_app("test-gem/CODE_OF_CONDUCT.md")).to_not exist
gem_skeleton_assertions
expect(bundled_app("#{gem_name}/CODE_OF_CONDUCT.md")).to_not exist
end
describe "README additions" do
it "generates the README without a section for the Code of Conduct" do
expect(bundled_app("test-gem/README.md").read).not_to include("## Code of Conduct")
expect(bundled_app("test-gem/README.md").read).not_to include("https://github.com/bundleuser/#{gem_name}/blob/master/CODE_OF_CONDUCT.md")
expect(bundled_app("#{gem_name}/README.md").read).not_to include("## Code of Conduct")
expect(bundled_app("#{gem_name}/README.md").read).not_to include("https://github.com/bundleuser/#{gem_name}/blob/master/CODE_OF_CONDUCT.md")
end
end
end
context "README.md" do
let(:gem_name) { "test_gem" }
context "git config github.user present" do
before do
execute_bundle_gem(gem_name)
bundle! "gem #{gem_name}"
end
it "contribute URL set to git username" do
expect(bundled_app("test_gem/README.md").read).not_to include("[USERNAME]")
expect(bundled_app("test_gem/README.md").read).to include("github.com/bundleuser")
expect(bundled_app("#{gem_name}/README.md").read).not_to include("[USERNAME]")
expect(bundled_app("#{gem_name}/README.md").read).to include("github.com/bundleuser")
end
end
context "git config github.user is absent" do
before do
sys_exec("git config --unset github.user")
in_app_root
bundle "gem #{gem_name}"
end
it "contribute URL set to [USERNAME]" do
expect(bundled_app("test_gem/README.md").read).to include("[USERNAME]")
expect(bundled_app("test_gem/README.md").read).not_to include("github.com/bundleuser")
expect(bundled_app("#{gem_name}/README.md").read).to include("[USERNAME]")
expect(bundled_app("#{gem_name}/README.md").read).not_to include("github.com/bundleuser")
end
end
end
it "creates a new git repository" do
in_app_root
bundle "gem test_gem"
expect(bundled_app("test_gem/.git")).to exist
bundle "gem #{gem_name}"
expect(bundled_app("#{gem_name}/.git")).to exist
end
context "when git is not available" do
let(:gem_name) { "test_gem" }
# This spec cannot have `git` available in the test env
before do
load_paths = [lib, spec]
load_paths = [lib_dir, spec_dir]
load_path_str = "-I#{load_paths.join(File::PATH_SEPARATOR)}"
sys_exec "#{Gem.ruby} #{load_path_str} #{bindir.join("bundle")} gem #{gem_name}", "PATH" => ""
@ -211,7 +201,6 @@ RSpec.describe "bundle gem" do
end
it "generates a valid gemspec" do
in_app_root
bundle! "gem newgem --bin"
prepare_gemspec(bundled_app("newgem", "newgem.gemspec"))
@ -226,10 +215,6 @@ RSpec.describe "bundle gem" do
end
context "gem naming with relative paths" do
before do
in_app_root
end
it "resolves ." do
create_temporary_dir("tmp")
@ -260,43 +245,41 @@ RSpec.describe "bundle gem" do
end
end
context "gem naming with underscore" do
let(:gem_name) { "test_gem" }
before do
execute_bundle_gem(gem_name)
end
shared_examples_for "generating a gem" do
it "generates a gem skeleton" do
expect(bundled_app("test_gem/test_gem.gemspec")).to exist
expect(bundled_app("test_gem/Gemfile")).to exist
expect(bundled_app("test_gem/Rakefile")).to exist
expect(bundled_app("test_gem/lib/test_gem.rb")).to exist
expect(bundled_app("test_gem/lib/test_gem/version.rb")).to exist
expect(bundled_app("test_gem/.gitignore")).to exist
bundle! "gem #{gem_name}"
expect(bundled_app("test_gem/bin/setup")).to exist
expect(bundled_app("test_gem/bin/console")).to exist
expect(bundled_app("test_gem/bin/setup")).to be_executable
expect(bundled_app("test_gem/bin/console")).to be_executable
expect(bundled_app("#{gem_name}/#{gem_name}.gemspec")).to exist
expect(bundled_app("#{gem_name}/Gemfile")).to exist
expect(bundled_app("#{gem_name}/Rakefile")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb")).to exist
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb")).to exist
expect(bundled_app("#{gem_name}/.gitignore")).to exist
expect(bundled_app("#{gem_name}/bin/setup")).to exist
expect(bundled_app("#{gem_name}/bin/console")).to exist
expect(bundled_app("#{gem_name}/bin/setup")).to be_executable
expect(bundled_app("#{gem_name}/bin/console")).to be_executable
end
it "starts with version 0.1.0" do
expect(bundled_app("test_gem/lib/test_gem/version.rb").read).to match(/VERSION = "0.1.0"/)
bundle! "gem #{gem_name}"
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb").read).to match(/VERSION = "0.1.0"/)
end
it "does not nest constants" do
expect(bundled_app("test_gem/lib/test_gem/version.rb").read).to match(/module TestGem/)
expect(bundled_app("test_gem/lib/test_gem.rb").read).to match(/module TestGem/)
context "git config user.{name,email} is set" do
before do
bundle! "gem #{gem_name}"
end
it_should_behave_like "git config is present"
end
context "git config user.{name,email} is not set" do
before do
`git config --unset user.name`
`git config --unset user.email`
in_app_root
bundle "gem #{gem_name}"
end
@ -304,25 +287,35 @@ RSpec.describe "bundle gem" do
end
it "sets gemspec metadata['allowed_push_host']" do
bundle! "gem #{gem_name}"
expect(generated_gemspec.metadata["allowed_push_host"]).
to match(/mygemserver\.com/)
end
it "sets a minimum ruby version" do
bundle! "gem #{gem_name}"
bundler_gemspec = Bundler::GemHelper.new(gemspec_dir).gemspec
expect(bundler_gemspec.required_ruby_version).to eq(generated_gemspec.required_ruby_version)
end
it "requires the version file" do
expect(bundled_app("test_gem/lib/test_gem.rb").read).to match(%r{require "test_gem/version"})
bundle! "gem #{gem_name}"
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(%r{require "#{require_path}/version"})
end
it "creates a base error class" do
expect(bundled_app("test_gem/lib/test_gem.rb").read).to match(/class Error < StandardError; end$/)
bundle! "gem #{gem_name}"
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/class Error < StandardError; end$/)
end
it "runs rake without problems" do
bundle! "gem #{gem_name}"
system_gems ["rake-12.3.2"]
rakefile = strip_whitespace <<-RAKEFILE
@ -330,7 +323,7 @@ RSpec.describe "bundle gem" do
puts 'SUCCESS'
end
RAKEFILE
File.open(bundled_app("test_gem/Rakefile"), "w") do |file|
File.open(bundled_app("#{gem_name}/Rakefile"), "w") do |file|
file.puts rakefile
end
@ -342,117 +335,110 @@ RSpec.describe "bundle gem" do
context "--exe parameter set" do
before do
in_app_root
bundle "gem #{gem_name} --exe"
end
it "builds exe skeleton" do
expect(bundled_app("test_gem/exe/test_gem")).to exist
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist
end
it "requires 'test-gem'" do
expect(bundled_app("test_gem/exe/test_gem").read).to match(/require "test_gem"/)
it "requires the main file" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}").read).to match(/require "#{require_path}"/)
end
end
context "--bin parameter set" do
before do
in_app_root
bundle "gem #{gem_name} --bin"
end
it "builds exe skeleton" do
expect(bundled_app("test_gem/exe/test_gem")).to exist
expect(bundled_app("#{gem_name}/exe/#{gem_name}")).to exist
end
it "requires 'test-gem'" do
expect(bundled_app("test_gem/exe/test_gem").read).to match(/require "test_gem"/)
it "requires the main file" do
expect(bundled_app("#{gem_name}/exe/#{gem_name}").read).to match(/require "#{require_path}"/)
end
end
context "no --test parameter" do
before do
in_app_root
bundle "gem #{gem_name}"
end
it "doesn't create any spec/test file" do
expect(bundled_app("test_gem/.rspec")).to_not exist
expect(bundled_app("test_gem/spec/test_gem_spec.rb")).to_not exist
expect(bundled_app("test_gem/spec/spec_helper.rb")).to_not exist
expect(bundled_app("test_gem/test/test_test_gem.rb")).to_not exist
expect(bundled_app("test_gem/test/minitest_helper.rb")).to_not exist
expect(bundled_app("#{gem_name}/.rspec")).to_not exist
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to_not exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to_not exist
expect(bundled_app("#{gem_name}/test/#{require_path}.rb")).to_not exist
expect(bundled_app("#{gem_name}/test/minitest_helper.rb")).to_not exist
end
end
context "--test parameter set to rspec" do
before do
in_app_root
bundle "gem #{gem_name} --test=rspec"
end
it "builds spec skeleton" do
expect(bundled_app("test_gem/.rspec")).to exist
expect(bundled_app("test_gem/spec/test_gem_spec.rb")).to exist
expect(bundled_app("test_gem/spec/spec_helper.rb")).to exist
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
end
it "depends on a specific version of rspec in generated Gemfile" do
Dir.chdir(bundled_app("test_gem")) do
Dir.chdir(bundled_app(gem_name)) do
builder = Bundler::Dsl.new
builder.eval_gemfile(bundled_app("test_gem/Gemfile"))
builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
rspec_dep = builder.dependencies.find {|d| d.name == "rspec" }
expect(rspec_dep).to be_specific
end
end
it "requires 'test-gem'" do
expect(bundled_app("test_gem/spec/spec_helper.rb").read).to include(%(require "test_gem"))
it "requires the main file" do
expect(bundled_app("#{gem_name}/spec/spec_helper.rb").read).to include(%(require "#{require_path}"))
end
it "creates a default test which fails" do
expect(bundled_app("test_gem/spec/test_gem_spec.rb").read).to include("expect(false).to eq(true)")
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb").read).to include("expect(false).to eq(true)")
end
end
context "gem.test setting set to rspec" do
before do
in_app_root
bundle "config set gem.test rspec"
bundle "gem #{gem_name}"
end
it "builds spec skeleton" do
expect(bundled_app("test_gem/.rspec")).to exist
expect(bundled_app("test_gem/spec/test_gem_spec.rb")).to exist
expect(bundled_app("test_gem/spec/spec_helper.rb")).to exist
expect(bundled_app("#{gem_name}/.rspec")).to exist
expect(bundled_app("#{gem_name}/spec/#{require_path}_spec.rb")).to exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
end
end
context "gem.test setting set to rspec and --test is set to minitest" do
before do
in_app_root
bundle "config set gem.test rspec"
bundle "gem #{gem_name} --test=minitest"
end
it "builds spec skeleton" do
expect(bundled_app("test_gem/test/test_gem_test.rb")).to exist
expect(bundled_app("test_gem/test/test_helper.rb")).to exist
expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb")).to exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
end
end
context "--test parameter set to minitest" do
before do
in_app_root
bundle "gem #{gem_name} --test=minitest"
end
it "depends on a specific version of minitest" do
Dir.chdir(bundled_app("test_gem")) do
Dir.chdir(bundled_app(gem_name)) do
builder = Bundler::Dsl.new
builder.eval_gemfile(bundled_app("test_gem/Gemfile"))
builder.eval_gemfile(bundled_app("#{gem_name}/Gemfile"))
builder.dependencies
minitest_dep = builder.dependencies.find {|d| d.name == "minitest" }
expect(minitest_dep).to be_specific
@ -460,26 +446,25 @@ RSpec.describe "bundle gem" do
end
it "builds spec skeleton" do
expect(bundled_app("test_gem/test/test_gem_test.rb")).to exist
expect(bundled_app("test_gem/test/test_helper.rb")).to exist
expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb")).to exist
expect(bundled_app("#{gem_name}/test/test_helper.rb")).to exist
end
it "requires 'test-gem'" do
expect(bundled_app("test_gem/test/test_helper.rb").read).to include(%(require "test_gem"))
it "requires the main file" do
expect(bundled_app("#{gem_name}/test/test_helper.rb").read).to include(%(require "#{require_path}"))
end
it "requires 'minitest_helper'" do
expect(bundled_app("test_gem/test/test_gem_test.rb").read).to include(%(require "test_helper"))
expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb").read).to include(%(require "test_helper"))
end
it "creates a default test which fails" do
expect(bundled_app("test_gem/test/test_gem_test.rb").read).to include("assert false")
expect(bundled_app("#{gem_name}/test/#{require_path}_test.rb").read).to include("assert false")
end
end
context "gem.test setting set to minitest" do
before do
in_app_root
bundle "config set gem.test minitest"
bundle "gem #{gem_name}"
end
@ -498,29 +483,27 @@ RSpec.describe "bundle gem" do
task :default => :test
RAKEFILE
expect(bundled_app("test_gem/Rakefile").read).to eq(rakefile)
expect(bundled_app("#{gem_name}/Rakefile").read).to eq(rakefile)
end
end
context "--test with no arguments" do
before do
in_app_root
bundle "gem #{gem_name} --test"
end
it "defaults to rspec" do
expect(bundled_app("test_gem/spec/spec_helper.rb")).to exist
expect(bundled_app("test_gem/test/minitest_helper.rb")).to_not exist
expect(bundled_app("#{gem_name}/spec/spec_helper.rb")).to exist
expect(bundled_app("#{gem_name}/test/minitest_helper.rb")).to_not exist
end
it "creates a .travis.yml file to test the library against the current Ruby version on Travis CI" do
expect(bundled_app("test_gem/.travis.yml").read).to match(/- #{RUBY_VERSION}/)
expect(bundled_app("#{gem_name}/.travis.yml").read).to match(/- #{RUBY_VERSION}/)
end
end
context "--edit option" do
it "opens the generated gemspec in the user's text editor" do
in_app_root
output = bundle "gem #{gem_name} --edit=echo"
gemspec_path = File.join(Dir.pwd, gem_name, "#{gem_name}.gemspec")
expect(output).to include("echo \"#{gemspec_path}\"")
@ -531,6 +514,8 @@ RSpec.describe "bundle gem" do
context "testing --mit and --coc options against bundle config settings" do
let(:gem_name) { "test-gem" }
let(:require_path) { "test/gem" }
context "with mit option in bundle config settings set to true" do
before do
global_config "BUNDLE_GEM__MIT" => "true", "BUNDLE_GEM__TEST" => "false", "BUNDLE_GEM__COC" => "false"
@ -558,196 +543,35 @@ RSpec.describe "bundle gem" do
end
end
context "gem naming with dashed" do
let(:gem_name) { "test-gem" }
context "gem naming with underscore" do
let(:gem_name) { "test_gem" }
let(:require_path) { "test_gem" }
let(:flags) { nil }
before do
execute_bundle_gem(gem_name)
bundle! ["gem", gem_name, flags].compact.join(" ")
end
it "generates a gem skeleton" do
expect(bundled_app("test-gem/test-gem.gemspec")).to exist
expect(bundled_app("test-gem/Gemfile")).to exist
expect(bundled_app("test-gem/Rakefile")).to exist
expect(bundled_app("test-gem/lib/test/gem.rb")).to exist
expect(bundled_app("test-gem/lib/test/gem/version.rb")).to exist
it "does not nest constants" do
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb").read).to match(/module TestGem/)
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/module TestGem/)
end
it "starts with version 0.1.0" do
expect(bundled_app("test-gem/lib/test/gem/version.rb").read).to match(/VERSION = "0.1.0"/)
end
it "nests constants so they work" do
expect(bundled_app("test-gem/lib/test/gem/version.rb").read).to match(/module Test\n module Gem/)
expect(bundled_app("test-gem/lib/test/gem.rb").read).to match(/module Test\n module Gem/)
end
it_should_behave_like "git config is present"
context "git config user.{name,email} is not set" do
before do
`git config --unset user.name`
`git config --unset user.email`
in_app_root
bundle "gem #{gem_name}"
end
it_should_behave_like "git config is absent"
end
it "requires the version file" do
expect(bundled_app("test-gem/lib/test/gem.rb").read).to match(%r{require "test/gem/version"})
end
it "runs rake without problems" do
system_gems ["rake-12.3.2"]
rakefile = strip_whitespace <<-RAKEFILE
task :default do
puts 'SUCCESS'
end
RAKEFILE
File.open(bundled_app("test-gem/Rakefile"), "w") do |file|
file.puts rakefile
end
Dir.chdir(bundled_app(gem_name)) do
sys_exec(rake)
expect(out).to include("SUCCESS")
end
end
context "--bin parameter set" do
before do
in_app_root
bundle "gem #{gem_name} --bin"
end
it "builds bin skeleton" do
expect(bundled_app("test-gem/exe/test-gem")).to exist
end
it "requires 'test/gem'" do
expect(bundled_app("test-gem/exe/test-gem").read).to match(%r{require "test/gem"})
end
end
context "no --test parameter" do
before do
in_app_root
bundle "gem #{gem_name}"
end
it "doesn't create any spec/test file" do
expect(bundled_app("test-gem/.rspec")).to_not exist
expect(bundled_app("test-gem/spec/test/gem_spec.rb")).to_not exist
expect(bundled_app("test-gem/spec/spec_helper.rb")).to_not exist
expect(bundled_app("test-gem/test/test_test/gem.rb")).to_not exist
expect(bundled_app("test-gem/test/minitest_helper.rb")).to_not exist
end
end
context "--test parameter set to rspec" do
before do
in_app_root
bundle "gem #{gem_name} --test=rspec"
end
it "builds spec skeleton" do
expect(bundled_app("test-gem/.rspec")).to exist
expect(bundled_app("test-gem/spec/test/gem_spec.rb")).to exist
expect(bundled_app("test-gem/spec/spec_helper.rb")).to exist
end
it "requires 'test/gem'" do
expect(bundled_app("test-gem/spec/spec_helper.rb").read).to include(%(require "test/gem"))
end
it "creates a default test which fails" do
expect(bundled_app("test-gem/spec/test/gem_spec.rb").read).to include("expect(false).to eq(true)")
end
it "creates a default rake task to run the specs" do
rakefile = strip_whitespace <<-RAKEFILE
require "bundler/gem_tasks"
require "rspec/core/rake_task"
RSpec::Core::RakeTask.new(:spec)
task :default => :spec
RAKEFILE
expect(bundled_app("test-gem/Rakefile").read).to eq(rakefile)
end
end
context "--test parameter set to minitest" do
before do
in_app_root
bundle "gem #{gem_name} --test=minitest"
end
it "builds spec skeleton" do
expect(bundled_app("test-gem/test/test/gem_test.rb")).to exist
expect(bundled_app("test-gem/test/test_helper.rb")).to exist
end
it "requires 'test/gem'" do
expect(bundled_app("test-gem/test/test_helper.rb").read).to match(%r{require "test/gem"})
end
it "requires 'test_helper'" do
expect(bundled_app("test-gem/test/test/gem_test.rb").read).to match(/require "test_helper"/)
end
it "creates a default test which fails" do
expect(bundled_app("test-gem/test/test/gem_test.rb").read).to match(/assert false/)
end
it "creates a default rake task to run the test suite" do
rakefile = strip_whitespace <<-RAKEFILE
require "bundler/gem_tasks"
require "rake/testtask"
Rake::TestTask.new(:test) do |t|
t.libs << "test"
t.libs << "lib"
t.test_files = FileList["test/**/*_test.rb"]
end
task :default => :test
RAKEFILE
expect(bundled_app("test-gem/Rakefile").read).to eq(rakefile)
end
end
context "--test with no arguments" do
before do
in_app_root
bundle "gem #{gem_name} --test"
end
it "defaults to rspec" do
expect(bundled_app("test-gem/spec/spec_helper.rb")).to exist
expect(bundled_app("test-gem/test/minitest_helper.rb")).to_not exist
end
end
include_examples "generating a gem"
context "--ext parameter set" do
before do
in_app_root
bundle "gem test_gem --ext"
end
let(:flags) { "--ext" }
it "builds ext skeleton" do
expect(bundled_app("test_gem/ext/test_gem/extconf.rb")).to exist
expect(bundled_app("test_gem/ext/test_gem/test_gem.h")).to exist
expect(bundled_app("test_gem/ext/test_gem/test_gem.c")).to exist
expect(bundled_app("#{gem_name}/ext/#{gem_name}/extconf.rb")).to exist
expect(bundled_app("#{gem_name}/ext/#{gem_name}/#{gem_name}.h")).to exist
expect(bundled_app("#{gem_name}/ext/#{gem_name}/#{gem_name}.c")).to exist
end
it "includes rake-compiler" do
expect(bundled_app("test_gem/Gemfile").read).to include('gem "rake-compiler"')
expect(bundled_app("#{gem_name}/Gemfile").read).to include('gem "rake-compiler"')
end
it "depends on compile task for build" do
@ -757,21 +581,38 @@ RSpec.describe "bundle gem" do
task :build => :compile
Rake::ExtensionTask.new("test_gem") do |ext|
ext.lib_dir = "lib/test_gem"
Rake::ExtensionTask.new("#{gem_name}") do |ext|
ext.lib_dir = "lib/#{gem_name}"
end
task :default => [:clobber, :compile, :spec]
RAKEFILE
expect(bundled_app("test_gem/Rakefile").read).to eq(rakefile)
expect(bundled_app("#{gem_name}/Rakefile").read).to eq(rakefile)
end
end
end
context "gem naming with dashed" do
let(:gem_name) { "test-gem" }
let(:require_path) { "test/gem" }
before do
bundle! "gem #{gem_name}"
end
it "nests constants so they work" do
expect(bundled_app("#{gem_name}/lib/#{require_path}/version.rb").read).to match(/module Test\n module Gem/)
expect(bundled_app("#{gem_name}/lib/#{require_path}.rb").read).to match(/module Test\n module Gem/)
end
include_examples "generating a gem"
end
describe "uncommon gem names" do
it "can deal with two dashes" do
execute_bundle_gem("a--a")
bundle! "gem a--a"
expect(bundled_app("a--a/a--a.gemspec")).to exist
end
@ -804,9 +645,6 @@ Usage: "bundle gem NAME [OPTIONS]"
before do
bundle "gem #{subject}"
end
after do
Bundler.clear_gemspec_cache
end
context "with an existing const name" do
subject { "gem" }
@ -830,10 +668,6 @@ Usage: "bundle gem NAME [OPTIONS]"
end
context "on first run" do
before do
in_app_root
end
it "asks about test framework" do
global_config "BUNDLE_GEM__MIT" => "false", "BUNDLE_GEM__COC" => "false"
@ -880,9 +714,7 @@ Usage: "bundle gem NAME [OPTIONS]"
context "on conflicts with a previously created file" do
it "should fail gracefully" do
in_app_root do
FileUtils.touch("conflict-foobar")
end
bundle "gem conflict-foobar"
expect(err).to include("Errno::ENOTDIR")
expect(exitstatus).to eql(32) if exitstatus
@ -891,9 +723,7 @@ Usage: "bundle gem NAME [OPTIONS]"
context "on conflicts with a previously created directory" do
it "should succeed" do
in_app_root do
FileUtils.mkdir_p("conflict-foobar/Gemfile")
end
bundle! "gem conflict-foobar"
expect(out).to include("file_clash conflict-foobar/Gemfile").
and include "Initializing git repo in #{bundled_app("conflict-foobar")}"

View file

@ -390,7 +390,7 @@ You have deleted from the Gemfile:
expect(the_bundle).to include_gems "foo 1.0"
bundle "config set cache_all true"
bundle! :package
bundle! :cache
expect(bundled_app("vendor/cache/foo")).to be_directory
bundle! "install --local"

View file

@ -1056,7 +1056,7 @@ RSpec.describe "bundle install with git sources" do
File.open(lib_path("install_hooks.rb"), "w") do |h|
h.write <<-H
require 'rubygems'
require '#{spec_dir}/support/rubygems'
Gem.pre_install_hooks << lambda do |inst|
STDERR.puts "Ran pre-install hook: \#{inst.spec.full_name}"
end
@ -1076,7 +1076,7 @@ RSpec.describe "bundle install with git sources" do
File.open(lib_path("install_hooks.rb"), "w") do |h|
h.write <<-H
require 'rubygems'
require '#{spec_dir}/support/rubygems'
Gem.post_install_hooks << lambda do |inst|
STDERR.puts "Ran post-install hook: \#{inst.spec.full_name}"
end
@ -1096,7 +1096,7 @@ RSpec.describe "bundle install with git sources" do
File.open(lib_path("install_hooks.rb"), "w") do |h|
h.write <<-H
require 'rubygems'
require '#{spec_dir}/support/rubygems'
Gem.pre_install_hooks << lambda do |inst|
false
end
@ -1391,7 +1391,7 @@ In Gemfile:
end
G
bundle "config set cache_all true"
bundle :package
bundle :cache
simulate_new_machine
bundle! "install", :env => { "PATH" => "" }

View file

@ -333,7 +333,7 @@ RSpec.describe "bundle install with groups" do
G
ruby <<-R
require "#{lib}/bundler"
require "#{lib_dir}/bundler"
Bundler.setup :default
Bundler.require :default
puts RACK

View file

@ -672,7 +672,7 @@ RSpec.describe "bundle install with explicit source paths" do
File.open(lib_path("install_hooks.rb"), "w") do |h|
h.write <<-H
require 'rubygems'
require '#{spec_dir}/support/rubygems'
Gem.pre_install_hooks << lambda do |inst|
STDERR.puts "Ran pre-install hook: \#{inst.spec.full_name}"
end
@ -692,7 +692,7 @@ RSpec.describe "bundle install with explicit source paths" do
File.open(lib_path("install_hooks.rb"), "w") do |h|
h.write <<-H
require 'rubygems'
require '#{spec_dir}/support/rubygems'
Gem.post_install_hooks << lambda do |inst|
STDERR.puts "Ran post-install hook: \#{inst.spec.full_name}"
end
@ -712,7 +712,7 @@ RSpec.describe "bundle install with explicit source paths" do
File.open(lib_path("install_hooks.rb"), "w") do |h|
h.write <<-H
require 'rubygems'
require '#{spec_dir}/support/rubygems'
Gem.pre_install_hooks << lambda do |inst|
false
end

View file

@ -102,7 +102,7 @@ RSpec.describe "bundle install with gems on multiple sources" do
end
it "can cache and deploy" do
bundle! :package
bundle! :cache
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
expect(bundled_app("vendor/cache/rack-obama-1.0.gem")).to exist

View file

@ -621,7 +621,7 @@ RSpec.describe "the lockfile format" do
G
bundle "config set cache_all true"
bundle! :package
bundle! :cache
bundle! :install, :local => true
lockfile_should_be <<-G

View file

@ -20,7 +20,8 @@ RSpec.describe "major deprecations" do
it "is deprecated in favor of .unbundled_env", :bundler => "2" do
expect(deprecations).to include \
"`Bundler.clean_env` has been deprecated in favor of `Bundler.unbundled_env`. " \
"If you instead want the environment before bundler was originally loaded, use `Bundler.original_env`"
"If you instead want the environment before bundler was originally loaded, use `Bundler.original_env` " \
"(called at -e:1)"
end
pending "is removed and shows a helpful error message about it", :bundler => "3"
@ -35,7 +36,8 @@ RSpec.describe "major deprecations" do
it "is deprecated in favor of .unbundled_env", :bundler => "2" do
expect(deprecations).to include(
"`Bundler.with_clean_env` has been deprecated in favor of `Bundler.with_unbundled_env`. " \
"If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_env`"
"If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_env` " \
"(called at -e:1)"
)
end
@ -51,7 +53,8 @@ RSpec.describe "major deprecations" do
it "is deprecated in favor of .unbundled_system", :bundler => "2" do
expect(deprecations).to include(
"`Bundler.clean_system` has been deprecated in favor of `Bundler.unbundled_system`. " \
"If you instead want to run the command in the environment before bundler was originally loaded, use `Bundler.original_system`"
"If you instead want to run the command in the environment before bundler was originally loaded, use `Bundler.original_system` " \
"(called at -e:1)"
)
end
@ -67,7 +70,8 @@ RSpec.describe "major deprecations" do
it "is deprecated in favor of .unbundled_exec", :bundler => "2" do
expect(deprecations).to include(
"`Bundler.clean_exec` has been deprecated in favor of `Bundler.unbundled_exec`. " \
"If you instead want to exec to a command in the environment before bundler was originally loaded, use `Bundler.original_exec`"
"If you instead want to exec to a command in the environment before bundler was originally loaded, use `Bundler.original_exec` " \
"(called at -e:1)"
)
end
@ -81,7 +85,7 @@ RSpec.describe "major deprecations" do
end
it "is deprecated in favor of .load", :bundler => "2" do
expect(deprecations).to include "Bundler.environment has been removed in favor of Bundler.load"
expect(deprecations).to include "Bundler.environment has been removed in favor of Bundler.load (called at -e:1)"
end
pending "is removed and shows a helpful error message about it", :bundler => "3"
@ -108,7 +112,7 @@ RSpec.describe "major deprecations" do
it "should print a deprecation warning", :bundler => "2" do
expect(deprecations).to include(
"The `--path` flag is deprecated because it relies on being " \
"remembered across bundler invokations, which bundler will no " \
"remembered across bundler invocations, which bundler will no " \
"longer do in future versions. Instead please use `bundle config set " \
"path 'vendor/bundle'`, and stop using this flag"
)
@ -310,7 +314,7 @@ RSpec.describe "major deprecations" do
it "should print a deprecation warning", :bundler => "2" do
expect(deprecations).to include(
"The `#{flag_name}` flag is deprecated because it relies on " \
"being remembered across bundler invokations, which bundler " \
"being remembered across bundler invocations, which bundler " \
"will no longer do in future versions. Instead please use " \
"`bundle config set #{name} '#{value}'`, and stop using this flag"
)
@ -356,7 +360,6 @@ RSpec.describe "major deprecations" do
require 'bundler'
require 'bundler/vendored_thor'
Bundler.ui = Bundler::UI::Shell.new
Bundler.setup
Bundler.setup
RUBY

View file

@ -781,7 +781,7 @@ G
#{ruby_version_correct}
G
bundle :pack
bundle :cache
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
end
@ -794,7 +794,7 @@ G
#{ruby_version_correct_engineless}
G
bundle :pack
bundle :cache
expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
end
end
@ -806,7 +806,7 @@ G
#{ruby_version_incorrect}
G
bundle :pack
bundle :cache
should_be_ruby_version_incorrect
end
@ -817,7 +817,7 @@ G
#{engine_incorrect}
G
bundle :pack
bundle :cache
should_be_engine_incorrect
end
@ -829,7 +829,7 @@ G
#{engine_version_incorrect}
G
bundle :pack
bundle :cache
should_be_engine_version_incorrect
end
end
@ -842,7 +842,7 @@ G
#{patchlevel_incorrect}
G
bundle :pack
bundle :cache
should_be_patchlevel_incorrect
end
end

View file

@ -169,7 +169,7 @@ RSpec.describe "real source plugins" do
it "bundler package copies repository to vendor cache" do
bundle! :install, forgotten_command_line_options(:path => "vendor/bundle")
bundle "config set cache_all true"
bundle! :package
bundle! :cache
expect(bundled_app("vendor/cache/a-path-gem-1.0-#{uri_hash}")).to exist

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
require_relative "../support/silent_logger"
RSpec.describe "gemcutter's dependency API", :realworld => true do
context "when Gemcutter API takes too long to respond" do
before do
@ -8,7 +10,7 @@ RSpec.describe "gemcutter's dependency API", :realworld => true do
port = find_unused_port
@server_uri = "http://127.0.0.1:#{port}"
require File.expand_path("../../support/artifice/endpoint_timeout", __FILE__)
require_relative "../support/artifice/endpoint_timeout"
@t = Thread.new do
server = Rack::Server.start(:app => EndpointTimeout,

View file

@ -25,9 +25,9 @@ RSpec.describe "double checking sources", :realworld => true, :sometimes => true
RUBY
cmd = <<-RUBY
require "#{lib}/bundler"
require #{File.expand_path("../../support/artifice/vcr.rb", __FILE__).dump}
require "#{lib}/bundler/inline"
require "#{lib_dir}/bundler"
require "#{spec_dir}/support/artifice/vcr"
require "#{lib_dir}/bundler/inline"
gemfile(true) do
source "https://rubygems.org"
gem "rails", path: "."

View file

@ -3,19 +3,21 @@
RSpec.describe "real world edgecases", :realworld => true, :sometimes => true do
def rubygems_version(name, requirement)
ruby! <<-RUBY
require #{File.expand_path("../../support/artifice/vcr.rb", __FILE__).dump}
require "bundler"
require "bundler/source/rubygems/remote"
require "bundler/fetcher"
require "#{spec_dir}/support/artifice/vcr"
require "#{lib_dir}/bundler"
require "#{lib_dir}/bundler/source/rubygems/remote"
require "#{lib_dir}/bundler/fetcher"
rubygem = Bundler.ui.silence do
source = Bundler::Source::Rubygems::Remote.new(URI("https://rubygems.org"))
fetcher = Bundler::Fetcher.new(source)
index = fetcher.specs([#{name.dump}], nil)
rubygem = index.search(Gem::Dependency.new(#{name.dump}, #{requirement.dump})).last
index.search(Gem::Dependency.new(#{name.dump}, #{requirement.dump})).last
end
if rubygem.nil?
raise "Could not find #{name} (#{requirement}) on rubygems.org!\n" \
"Found specs:\n\#{index.send(:specs).inspect}"
end
"#{name} (\#{rubygem.version})"
puts "#{name} (\#{rubygem.version})"
RUBY
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
require_relative "../support/silent_logger"
RSpec.describe "fetching dependencies with a mirrored source", :realworld => true do
let(:mirror) { "https://server.example.org" }
let(:original) { "http://127.0.0.1:#{@port}" }
@ -35,7 +37,7 @@ private
@port = find_unused_port
@server_uri = "http://127.0.0.1:#{@port}"
require File.expand_path("../../support/artifice/endpoint_mirror_source", __FILE__)
require_relative "../support/artifice/endpoint_mirror_source"
@t = Thread.new do
Rack::Server.start(:app => EndpointMirrorSource,

Some files were not shown because too many files have changed in this diff Show more