mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Merge 16c3535413
This commit is contained in:
parent
3767c6a90d
commit
3eca1e438d
Notes:
git
2022-09-05 14:37:35 +09:00
69 changed files with 502 additions and 834 deletions
|
@ -488,41 +488,9 @@ EOF
|
||||||
configured_bundle_path.use_system_gems?
|
configured_bundle_path.use_system_gems?
|
||||||
end
|
end
|
||||||
|
|
||||||
def requires_sudo?
|
|
||||||
return @requires_sudo if defined?(@requires_sudo_ran)
|
|
||||||
|
|
||||||
sudo_present = which "sudo" if settings.allow_sudo?
|
|
||||||
|
|
||||||
if sudo_present
|
|
||||||
# the bundle path and subdirectories need to be writable for RubyGems
|
|
||||||
# to be able to unpack and install gems without exploding
|
|
||||||
path = bundle_path
|
|
||||||
path = path.parent until path.exist?
|
|
||||||
|
|
||||||
# bins are written to a different location on OS X
|
|
||||||
bin_dir = Pathname.new(Bundler.system_bindir)
|
|
||||||
bin_dir = bin_dir.parent until bin_dir.exist?
|
|
||||||
|
|
||||||
# if any directory is not writable, we need sudo
|
|
||||||
files = [path, bin_dir] | Dir[bundle_path.join("build_info/*").to_s] | Dir[bundle_path.join("*").to_s]
|
|
||||||
unwritable_files = files.reject {|f| File.writable?(f) }
|
|
||||||
sudo_needed = !unwritable_files.empty?
|
|
||||||
if sudo_needed
|
|
||||||
Bundler.ui.warn "Following files may not be writable, so sudo is needed:\n #{unwritable_files.map(&:to_s).sort.join("\n ")}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@requires_sudo_ran = true
|
|
||||||
@requires_sudo = settings.allow_sudo? && sudo_present && sudo_needed
|
|
||||||
end
|
|
||||||
|
|
||||||
def mkdir_p(path, options = {})
|
def mkdir_p(path, options = {})
|
||||||
if requires_sudo? && !options[:no_sudo]
|
SharedHelpers.filesystem_access(path, :write) do |p|
|
||||||
sudo "mkdir -p '#{path}'" unless File.exist?(path)
|
FileUtils.mkdir_p(p)
|
||||||
else
|
|
||||||
SharedHelpers.filesystem_access(path, :write) do |p|
|
|
||||||
FileUtils.mkdir_p(p)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -539,31 +507,6 @@ EOF
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def sudo(str)
|
|
||||||
SUDO_MUTEX.synchronize do
|
|
||||||
prompt = "\n\n" + <<-PROMPT.gsub(/^ {6}/, "").strip + " "
|
|
||||||
Your user account isn't allowed to install to the system RubyGems.
|
|
||||||
You can cancel this installation and run:
|
|
||||||
|
|
||||||
bundle config set --local path 'vendor/bundle'
|
|
||||||
bundle install
|
|
||||||
|
|
||||||
to install the gems into ./vendor/bundle/, or you can enter your password
|
|
||||||
and install the bundled gems to RubyGems using sudo.
|
|
||||||
|
|
||||||
Password:
|
|
||||||
PROMPT
|
|
||||||
|
|
||||||
unless @prompted_for_sudo ||= system(%(sudo -k -p "#{prompt}" true))
|
|
||||||
raise SudoNotPermittedError,
|
|
||||||
"Bundler requires sudo access to install at the moment. " \
|
|
||||||
"Try installing again, granting Bundler sudo access when prompted, or installing into a different path."
|
|
||||||
end
|
|
||||||
|
|
||||||
`sudo -p "#{prompt}" #{str}`
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def read_file(file)
|
def read_file(file)
|
||||||
SharedHelpers.filesystem_access(file, :read) do
|
SharedHelpers.filesystem_access(file, :read) do
|
||||||
File.open(file, "r:UTF-8", &:read)
|
File.open(file, "r:UTF-8", &:read)
|
||||||
|
|
|
@ -94,9 +94,8 @@ module Bundler
|
||||||
|
|
||||||
def warn_if_root
|
def warn_if_root
|
||||||
return if Bundler.settings[:silence_root_warning] || Gem.win_platform? || !Process.uid.zero?
|
return if Bundler.settings[:silence_root_warning] || Gem.win_platform? || !Process.uid.zero?
|
||||||
Bundler.ui.warn "Don't run Bundler as root. Bundler can ask for sudo " \
|
Bundler.ui.warn "Don't run Bundler as root. Installing your bundle as root " \
|
||||||
"if it is needed, and installing your bundle as root will break this " \
|
"will break this application for all non-root users on this machine.", :wrap => true
|
||||||
"application for all non-root users on this machine.", :wrap => true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def dependencies_count_for(definition)
|
def dependencies_count_for(definition)
|
||||||
|
|
|
@ -485,7 +485,7 @@ module Bundler
|
||||||
@resolver ||= begin
|
@resolver ||= begin
|
||||||
last_resolve = converge_locked_specs
|
last_resolve = converge_locked_specs
|
||||||
remove_ruby_from_platforms_if_necessary!(dependencies)
|
remove_ruby_from_platforms_if_necessary!(dependencies)
|
||||||
Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
|
Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve), platforms)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -878,9 +878,9 @@ module Bundler
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def additional_base_requirements_for_resolve
|
def additional_base_requirements_for_resolve(last_resolve)
|
||||||
return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
|
return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
|
||||||
converge_specs(@originally_locked_specs).map do |locked_spec|
|
converge_specs(@originally_locked_specs - last_resolve).map do |locked_spec|
|
||||||
Dependency.new(locked_spec.name, ">= #{locked_spec.version}")
|
Dependency.new(locked_spec.name, ">= #{locked_spec.version}")
|
||||||
end.uniq
|
end.uniq
|
||||||
end
|
end
|
||||||
|
|
|
@ -55,7 +55,6 @@ module Bundler
|
||||||
class CyclicDependencyError < BundlerError; status_code(21); end
|
class CyclicDependencyError < BundlerError; status_code(21); end
|
||||||
class GemfileLockNotFound < BundlerError; status_code(22); end
|
class GemfileLockNotFound < BundlerError; status_code(22); end
|
||||||
class PluginError < BundlerError; status_code(29); end
|
class PluginError < BundlerError; status_code(29); end
|
||||||
class SudoNotPermittedError < BundlerError; status_code(30); end
|
|
||||||
class ThreadCreationError < BundlerError; status_code(33); end
|
class ThreadCreationError < BundlerError; status_code(33); end
|
||||||
class APIResponseMismatchError < BundlerError; status_code(34); end
|
class APIResponseMismatchError < BundlerError; status_code(34); end
|
||||||
class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
|
class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
|
||||||
|
|
|
@ -39,7 +39,6 @@ module Bundler
|
||||||
settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
|
settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
|
||||||
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
||||||
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
||||||
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_3_mode? }
|
|
||||||
|
|
||||||
settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }
|
||||||
|
|
||||||
|
|
|
@ -55,19 +55,17 @@ module Bundler
|
||||||
@level = v
|
@level = v
|
||||||
end
|
end
|
||||||
|
|
||||||
# Given a Dependency and an Array of SpecGroups of available versions for a
|
# Given a Dependency and an Array of Specifications of available versions for a
|
||||||
# gem, this method will return the Array of SpecGroups sorted (and possibly
|
# gem, this method will return the Array of Specifications sorted (and possibly
|
||||||
# truncated if strict is true) in an order to give preference to the current
|
# truncated if strict is true) in an order to give preference to the current
|
||||||
# level (:major, :minor or :patch) when resolution is deciding what versions
|
# level (:major, :minor or :patch) when resolution is deciding what versions
|
||||||
# best resolve all dependencies in the bundle.
|
# best resolve all dependencies in the bundle.
|
||||||
# @param dep [Dependency] The Dependency of the gem.
|
# @param dep [Dependency] The Dependency of the gem.
|
||||||
# @param spec_groups [SpecGroup] An array of SpecGroups for the same gem
|
# @param spec_groups [Specification] An array of Specifications for the same gem
|
||||||
# named in the @dep param.
|
# named in the @dep param.
|
||||||
# @return [SpecGroup] A new instance of the SpecGroup Array sorted and
|
# @return [Specification] A new instance of the Specification Array sorted and
|
||||||
# possibly filtered.
|
# possibly filtered.
|
||||||
def sort_versions(dep, spec_groups)
|
def sort_versions(dep, spec_groups)
|
||||||
before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG
|
|
||||||
|
|
||||||
@sort_versions[dep] ||= begin
|
@sort_versions[dep] ||= begin
|
||||||
gem_name = dep.name
|
gem_name = dep.name
|
||||||
|
|
||||||
|
@ -79,11 +77,6 @@ module Bundler
|
||||||
filter_dep_specs(spec_groups, locked_spec)
|
filter_dep_specs(spec_groups, locked_spec)
|
||||||
else
|
else
|
||||||
sort_dep_specs(spec_groups, locked_spec)
|
sort_dep_specs(spec_groups, locked_spec)
|
||||||
end.tap do |specs|
|
|
||||||
if DEBUG
|
|
||||||
puts before_result
|
|
||||||
puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -183,12 +176,5 @@ module Bundler
|
||||||
move, keep = result.partition {|s| s.version.to_s == version.to_s }
|
move, keep = result.partition {|s| s.version.to_s == version.to_s }
|
||||||
keep.concat(move)
|
keep.concat(move)
|
||||||
end
|
end
|
||||||
|
|
||||||
def debug_format_result(dep, spec_groups)
|
|
||||||
a = [dep.to_s,
|
|
||||||
spec_groups.map {|sg| [sg.version, sg.dependencies_for_activated_platforms.map {|dp| [dp.name, dp.requirement.to_s] }] }]
|
|
||||||
last_map = a.last.map {|sg_data| [sg_data.first.version, sg_data.last.map {|aa| aa.join(" ") }] }
|
|
||||||
[a.first, last_map, level, strict ? :strict : :not_strict]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-ADD" "1" "July 2022" "" ""
|
.TH "BUNDLE\-ADD" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
|
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-BINSTUBS" "1" "July 2022" "" ""
|
.TH "BUNDLE\-BINSTUBS" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
|
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CACHE" "1" "July 2022" "" ""
|
.TH "BUNDLE\-CACHE" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
|
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CHECK" "1" "July 2022" "" ""
|
.TH "BUNDLE\-CHECK" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
|
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CLEAN" "1" "July 2022" "" ""
|
.TH "BUNDLE\-CLEAN" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
|
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-CONFIG" "1" "July 2022" "" ""
|
.TH "BUNDLE\-CONFIG" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-config\fR \- Set bundler configuration options
|
\fBbundle\-config\fR \- Set bundler configuration options
|
||||||
.
|
.
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
\fBbundle config\fR [list|get|set|unset] [\fIname\fR [\fIvalue\fR]]
|
\fBbundle config\fR list
|
||||||
|
.
|
||||||
|
.br
|
||||||
|
\fBbundle config\fR [get] NAME
|
||||||
|
.
|
||||||
|
.br
|
||||||
|
\fBbundle config\fR [set] NAME VALUE
|
||||||
|
.
|
||||||
|
.br
|
||||||
|
\fBbundle config\fR unset NAME
|
||||||
.
|
.
|
||||||
.SH "DESCRIPTION"
|
.SH "DESCRIPTION"
|
||||||
This command allows you to interact with Bundler\'s configuration system\.
|
This command allows you to interact with Bundler\'s configuration system\.
|
||||||
|
|
|
@ -3,7 +3,10 @@ bundle-config(1) -- Set bundler configuration options
|
||||||
|
|
||||||
## SYNOPSIS
|
## SYNOPSIS
|
||||||
|
|
||||||
`bundle config` [list|get|set|unset] [<name> [<value>]]
|
`bundle config` list<br>
|
||||||
|
`bundle config` [get] NAME<br>
|
||||||
|
`bundle config` [set] NAME VALUE<br>
|
||||||
|
`bundle config` unset NAME
|
||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-DOCTOR" "1" "July 2022" "" ""
|
.TH "BUNDLE\-DOCTOR" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-doctor\fR \- Checks the bundle for common problems
|
\fBbundle\-doctor\fR \- Checks the bundle for common problems
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-EXEC" "1" "July 2022" "" ""
|
.TH "BUNDLE\-EXEC" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
|
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-GEM" "1" "July 2022" "" ""
|
.TH "BUNDLE\-GEM" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
|
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
|
||||||
|
|
13
lib/bundler/man/bundle-help.1
Normal file
13
lib/bundler/man/bundle-help.1
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
.\" generated with Ronn/v0.7.3
|
||||||
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
|
.
|
||||||
|
.TH "BUNDLE\-HELP" "1" "August 2022" "" ""
|
||||||
|
.
|
||||||
|
.SH "NAME"
|
||||||
|
\fBbundle\-help\fR \- Displays detailed help for each subcommand
|
||||||
|
.
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
\fBbundle help\fR [COMMAND]
|
||||||
|
.
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
Displays detailed help for the given subcommand\. You can specify a single \fBCOMMAND\fR at the same time\. When \fBCOMMAND\fR is omitted, help for \fBhelp\fR command will be displayed\.
|
12
lib/bundler/man/bundle-help.1.ronn
Normal file
12
lib/bundler/man/bundle-help.1.ronn
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
bundle-help(1) -- Displays detailed help for each subcommand
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
## SYNOPSIS
|
||||||
|
|
||||||
|
`bundle help` [COMMAND]
|
||||||
|
|
||||||
|
## DESCRIPTION
|
||||||
|
|
||||||
|
Displays detailed help for the given subcommand.
|
||||||
|
You can specify a single `COMMAND` at the same time.
|
||||||
|
When `COMMAND` is omitted, help for `help` command will be displayed.
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INFO" "1" "July 2022" "" ""
|
.TH "BUNDLE\-INFO" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-info\fR \- Show information for the given gem in your bundle
|
\fBbundle\-info\fR \- Show information for the given gem in your bundle
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INIT" "1" "July 2022" "" ""
|
.TH "BUNDLE\-INIT" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory
|
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INJECT" "1" "July 2022" "" ""
|
.TH "BUNDLE\-INJECT" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
|
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-INSTALL" "1" "July 2022" "" ""
|
.TH "BUNDLE\-INSTALL" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
|
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
|
||||||
|
@ -170,35 +170,6 @@ As a result, \fBbundle install \-\-deployment\fR installs gems to the \fBvendor/
|
||||||
.
|
.
|
||||||
.IP "" 0
|
.IP "" 0
|
||||||
.
|
.
|
||||||
.SH "SUDO USAGE"
|
|
||||||
By default, Bundler installs gems to the same location as \fBgem install\fR\.
|
|
||||||
.
|
|
||||||
.P
|
|
||||||
In some cases, that location may not be writable by your Unix user\. In that case, Bundler will stage everything in a temporary directory, then ask you for your \fBsudo\fR password in order to copy the gems into their system location\.
|
|
||||||
.
|
|
||||||
.P
|
|
||||||
From your perspective, this is identical to installing the gems directly into the system\.
|
|
||||||
.
|
|
||||||
.P
|
|
||||||
You should never use \fBsudo bundle install\fR\. This is because several other steps in \fBbundle install\fR must be performed as the current user:
|
|
||||||
.
|
|
||||||
.IP "\(bu" 4
|
|
||||||
Updating your \fBGemfile\.lock\fR
|
|
||||||
.
|
|
||||||
.IP "\(bu" 4
|
|
||||||
Updating your \fBvendor/cache\fR, if necessary
|
|
||||||
.
|
|
||||||
.IP "\(bu" 4
|
|
||||||
Checking out private git repositories using your user\'s SSH keys
|
|
||||||
.
|
|
||||||
.IP "" 0
|
|
||||||
.
|
|
||||||
.P
|
|
||||||
Of these three, the first two could theoretically be performed by \fBchown\fRing the resulting files to \fB$SUDO_USER\fR\. The third, however, can only be performed by invoking the \fBgit\fR command as the current user\. Therefore, git gems are downloaded and installed into \fB~/\.bundle\fR rather than $GEM_HOME or $BUNDLE_PATH\.
|
|
||||||
.
|
|
||||||
.P
|
|
||||||
As a result, you should run \fBbundle install\fR as the current user, and Bundler will ask for your password if it is needed to put the gems into their final location\.
|
|
||||||
.
|
|
||||||
.SH "INSTALLING GROUPS"
|
.SH "INSTALLING GROUPS"
|
||||||
By default, \fBbundle install\fR will install all gems in all groups in your Gemfile(5), except those declared for a different platform\.
|
By default, \fBbundle install\fR will install all gems in all groups in your Gemfile(5), except those declared for a different platform\.
|
||||||
.
|
.
|
||||||
|
|
|
@ -224,35 +224,6 @@ will cause an error when the Gemfile(5) is modified.
|
||||||
the `vendor/bundle` directory in the application. This may be
|
the `vendor/bundle` directory in the application. This may be
|
||||||
overridden using the `--path` option.
|
overridden using the `--path` option.
|
||||||
|
|
||||||
## SUDO USAGE
|
|
||||||
|
|
||||||
By default, Bundler installs gems to the same location as `gem install`.
|
|
||||||
|
|
||||||
In some cases, that location may not be writable by your Unix user. In
|
|
||||||
that case, Bundler will stage everything in a temporary directory,
|
|
||||||
then ask you for your `sudo` password in order to copy the gems into
|
|
||||||
their system location.
|
|
||||||
|
|
||||||
From your perspective, this is identical to installing the gems
|
|
||||||
directly into the system.
|
|
||||||
|
|
||||||
You should never use `sudo bundle install`. This is because several
|
|
||||||
other steps in `bundle install` must be performed as the current user:
|
|
||||||
|
|
||||||
* Updating your `Gemfile.lock`
|
|
||||||
* Updating your `vendor/cache`, if necessary
|
|
||||||
* Checking out private git repositories using your user's SSH keys
|
|
||||||
|
|
||||||
Of these three, the first two could theoretically be performed by
|
|
||||||
`chown`ing the resulting files to `$SUDO_USER`. The third, however,
|
|
||||||
can only be performed by invoking the `git` command as
|
|
||||||
the current user. Therefore, git gems are downloaded and installed
|
|
||||||
into `~/.bundle` rather than $GEM_HOME or $BUNDLE_PATH.
|
|
||||||
|
|
||||||
As a result, you should run `bundle install` as the current user,
|
|
||||||
and Bundler will ask for your password if it is needed to put the
|
|
||||||
gems into their final location.
|
|
||||||
|
|
||||||
## INSTALLING GROUPS
|
## INSTALLING GROUPS
|
||||||
|
|
||||||
By default, `bundle install` will install all gems in all groups
|
By default, `bundle install` will install all gems in all groups
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-LIST" "1" "July 2022" "" ""
|
.TH "BUNDLE\-LIST" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-list\fR \- List all the gems in the bundle
|
\fBbundle\-list\fR \- List all the gems in the bundle
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-LOCK" "1" "July 2022" "" ""
|
.TH "BUNDLE\-LOCK" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-OPEN" "1" "July 2022" "" ""
|
.TH "BUNDLE\-OPEN" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-OUTDATED" "1" "July 2022" "" ""
|
.TH "BUNDLE\-OUTDATED" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-outdated\fR \- List installed gems with newer versions available
|
\fBbundle\-outdated\fR \- List installed gems with newer versions available
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-PLATFORM" "1" "July 2022" "" ""
|
.TH "BUNDLE\-PLATFORM" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-platform\fR \- Displays platform compatibility information
|
\fBbundle\-platform\fR \- Displays platform compatibility information
|
||||||
|
|
81
lib/bundler/man/bundle-plugin.1
Normal file
81
lib/bundler/man/bundle-plugin.1
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
.\" generated with Ronn/v0.7.3
|
||||||
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
|
.
|
||||||
|
.TH "BUNDLE\-PLUGIN" "1" "August 2022" "" ""
|
||||||
|
.
|
||||||
|
.SH "NAME"
|
||||||
|
\fBbundle\-plugin\fR \- Manage Bundler plugins
|
||||||
|
.
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
\fBbundle plugin\fR install PLUGINS [\-\-source=\fISOURCE\fR] [\-\-version=\fIversion\fR] [\-\-git|\-\-local_git=\fIgit\-url\fR] [\-\-branch=\fIbranch\fR|\-\-ref=\fIrev\fR]
|
||||||
|
.
|
||||||
|
.br
|
||||||
|
\fBbundle plugin\fR uninstall PLUGINS
|
||||||
|
.
|
||||||
|
.br
|
||||||
|
\fBbundle plugin\fR list
|
||||||
|
.
|
||||||
|
.br
|
||||||
|
\fBbundle plugin\fR help [COMMAND]
|
||||||
|
.
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
You can install, uninstall, and list plugin(s) with this command to extend functionalities of Bundler\.
|
||||||
|
.
|
||||||
|
.SH "SUB\-COMMANDS"
|
||||||
|
.
|
||||||
|
.SS "install"
|
||||||
|
Install the given plugin(s)\.
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fBbundle plugin install bundler\-graph\fR: Install bundler\-graph gem from RubyGems\.org\. The global source, specified in source in Gemfile is ignored\.
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fBbundle plugin install bundler\-graph \-\-source https://example\.com\fR: Install bundler\-graph gem from example\.com\. The global source, specified in source in Gemfile is not considered\.
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fBbundle plugin install bundler\-graph \-\-version 0\.2\.1\fR: You can specify the version of the gem via \fB\-\-version\fR\.
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fBbundle plugin install bundler\-graph \-\-git https://github\.com/rubygems/bundler\-graph\fR: Install bundler\-graph gem from Git repository\. \fB\-\-git\fR can be replaced with \fB\-\-local\-git\fR\. You cannot use both \fB\-\-git\fR and \fB\-\-local\-git\fR\. You can use standard Git URLs like:
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fBssh://[user@]host\.xz[:port]/path/to/repo\.git\fR
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fBhttp[s]://host\.xz[:port]/path/to/repo\.git\fR
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fB/path/to/repo\fR
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
\fBfile:///path/to/repo\fR
|
||||||
|
.
|
||||||
|
.IP "" 0
|
||||||
|
.
|
||||||
|
.IP
|
||||||
|
When you specify \fB\-\-git\fR/\fB\-\-local\-git\fR, you can use \fB\-\-branch\fR or \fB\-\-ref\fR to specify any branch, tag, or commit hash (revision) to use\. When you specify both, only the latter is used\.
|
||||||
|
.
|
||||||
|
.IP "" 0
|
||||||
|
.
|
||||||
|
.SS "uninstall"
|
||||||
|
Uninstall the plugin(s) specified in PLUGINS\.
|
||||||
|
.
|
||||||
|
.SS "list"
|
||||||
|
List the installed plugins and available commands\.
|
||||||
|
.
|
||||||
|
.P
|
||||||
|
No options\.
|
||||||
|
.
|
||||||
|
.SS "help"
|
||||||
|
Describe subcommands or one specific subcommand\.
|
||||||
|
.
|
||||||
|
.P
|
||||||
|
No options\.
|
||||||
|
.
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.
|
||||||
|
.IP "\(bu" 4
|
||||||
|
How to write a Bundler plugin \fIhttps://bundler\.io/guides/bundler_plugins\.html\fR
|
||||||
|
.
|
||||||
|
.IP "" 0
|
||||||
|
|
59
lib/bundler/man/bundle-plugin.1.ronn
Normal file
59
lib/bundler/man/bundle-plugin.1.ronn
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
bundle-plugin(1) -- Manage Bundler plugins
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
## SYNOPSIS
|
||||||
|
|
||||||
|
`bundle plugin` install PLUGINS [--source=<SOURCE>] [--version=<version>]
|
||||||
|
[--git|--local_git=<git-url>] [--branch=<branch>|--ref=<rev>]<br>
|
||||||
|
`bundle plugin` uninstall PLUGINS<br>
|
||||||
|
`bundle plugin` list<br>
|
||||||
|
`bundle plugin` help [COMMAND]
|
||||||
|
|
||||||
|
## DESCRIPTION
|
||||||
|
|
||||||
|
You can install, uninstall, and list plugin(s) with this command to extend functionalities of Bundler.
|
||||||
|
|
||||||
|
## SUB-COMMANDS
|
||||||
|
|
||||||
|
### install
|
||||||
|
|
||||||
|
Install the given plugin(s).
|
||||||
|
|
||||||
|
* `bundle plugin install bundler-graph`:
|
||||||
|
Install bundler-graph gem from RubyGems.org. The global source, specified in source in Gemfile is ignored.
|
||||||
|
|
||||||
|
* `bundle plugin install bundler-graph --source https://example.com`:
|
||||||
|
Install bundler-graph gem from example.com. The global source, specified in source in Gemfile is not considered.
|
||||||
|
|
||||||
|
* `bundle plugin install bundler-graph --version 0.2.1`:
|
||||||
|
You can specify the version of the gem via `--version`.
|
||||||
|
|
||||||
|
* `bundle plugin install bundler-graph --git https://github.com/rubygems/bundler-graph`:
|
||||||
|
Install bundler-graph gem from Git repository. `--git` can be replaced with `--local-git`. You cannot use both `--git` and `--local-git`. You can use standard Git URLs like:
|
||||||
|
|
||||||
|
* `ssh://[user@]host.xz[:port]/path/to/repo.git`
|
||||||
|
* `http[s]://host.xz[:port]/path/to/repo.git`
|
||||||
|
* `/path/to/repo`
|
||||||
|
* `file:///path/to/repo`
|
||||||
|
|
||||||
|
When you specify `--git`/`--local-git`, you can use `--branch` or `--ref` to specify any branch, tag, or commit hash (revision) to use. When you specify both, only the latter is used.
|
||||||
|
|
||||||
|
### uninstall
|
||||||
|
|
||||||
|
Uninstall the plugin(s) specified in PLUGINS.
|
||||||
|
|
||||||
|
### list
|
||||||
|
|
||||||
|
List the installed plugins and available commands.
|
||||||
|
|
||||||
|
No options.
|
||||||
|
|
||||||
|
### help
|
||||||
|
|
||||||
|
Describe subcommands or one specific subcommand.
|
||||||
|
|
||||||
|
No options.
|
||||||
|
|
||||||
|
## SEE ALSO
|
||||||
|
|
||||||
|
* [How to write a Bundler plugin](https://bundler.io/guides/bundler_plugins.html)
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-PRISTINE" "1" "July 2022" "" ""
|
.TH "BUNDLE\-PRISTINE" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
|
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-REMOVE" "1" "July 2022" "" ""
|
.TH "BUNDLE\-REMOVE" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-remove\fR \- Removes gems from the Gemfile
|
\fBbundle\-remove\fR \- Removes gems from the Gemfile
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-SHOW" "1" "July 2022" "" ""
|
.TH "BUNDLE\-SHOW" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
|
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-UPDATE" "1" "July 2022" "" ""
|
.TH "BUNDLE\-UPDATE" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE\-VIZ" "1" "July 2022" "" ""
|
.TH "BUNDLE\-VIZ" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
|
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "BUNDLE" "1" "July 2022" "" ""
|
.TH "BUNDLE" "1" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBbundle\fR \- Ruby Dependency Management
|
\fBbundle\fR \- Ruby Dependency Management
|
||||||
|
@ -55,7 +55,7 @@ Execute a script in the current bundle
|
||||||
Specify and read configuration options for Bundler
|
Specify and read configuration options for Bundler
|
||||||
.
|
.
|
||||||
.TP
|
.TP
|
||||||
\fBbundle help(1)\fR
|
\fBbundle help(1)\fR \fIbundle\-help\.1\.html\fR
|
||||||
Display detailed help for each subcommand
|
Display detailed help for each subcommand
|
||||||
.
|
.
|
||||||
.SH "UTILITIES"
|
.SH "UTILITIES"
|
||||||
|
@ -120,6 +120,10 @@ Display warnings about common problems
|
||||||
\fBbundle remove(1)\fR \fIbundle\-remove\.1\.html\fR
|
\fBbundle remove(1)\fR \fIbundle\-remove\.1\.html\fR
|
||||||
Removes gems from the Gemfile
|
Removes gems from the Gemfile
|
||||||
.
|
.
|
||||||
|
.TP
|
||||||
|
\fBbundle plugin(1)\fR \fIbundle\-plugin\.1\.html\fR
|
||||||
|
Manage Bundler plugins
|
||||||
|
.
|
||||||
.SH "PLUGINS"
|
.SH "PLUGINS"
|
||||||
When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named \fBbundler\-<command>\fR and execute it, passing down any extra arguments to it\.
|
When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named \fBbundler\-<command>\fR and execute it, passing down any extra arguments to it\.
|
||||||
.
|
.
|
||||||
|
|
|
@ -46,7 +46,7 @@ We divide `bundle` subcommands into primary commands and utilities:
|
||||||
* [`bundle config(1)`](bundle-config.1.html):
|
* [`bundle config(1)`](bundle-config.1.html):
|
||||||
Specify and read configuration options for Bundler
|
Specify and read configuration options for Bundler
|
||||||
|
|
||||||
* `bundle help(1)`:
|
* [`bundle help(1)`](bundle-help.1.html):
|
||||||
Display detailed help for each subcommand
|
Display detailed help for each subcommand
|
||||||
|
|
||||||
## UTILITIES
|
## UTILITIES
|
||||||
|
@ -97,6 +97,9 @@ We divide `bundle` subcommands into primary commands and utilities:
|
||||||
* [`bundle remove(1)`](bundle-remove.1.html):
|
* [`bundle remove(1)`](bundle-remove.1.html):
|
||||||
Removes gems from the Gemfile
|
Removes gems from the Gemfile
|
||||||
|
|
||||||
|
* [`bundle plugin(1)`](bundle-plugin.1.html):
|
||||||
|
Manage Bundler plugins
|
||||||
|
|
||||||
## PLUGINS
|
## PLUGINS
|
||||||
|
|
||||||
When running a command that isn't listed in PRIMARY COMMANDS or UTILITIES,
|
When running a command that isn't listed in PRIMARY COMMANDS or UTILITIES,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.\" generated with Ronn/v0.7.3
|
.\" generated with Ronn/v0.7.3
|
||||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||||
.
|
.
|
||||||
.TH "GEMFILE" "5" "July 2022" "" ""
|
.TH "GEMFILE" "5" "August 2022" "" ""
|
||||||
.
|
.
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
|
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
|
||||||
|
|
|
@ -9,6 +9,7 @@ bundle-config(1) bundle-config.1
|
||||||
bundle-doctor(1) bundle-doctor.1
|
bundle-doctor(1) bundle-doctor.1
|
||||||
bundle-exec(1) bundle-exec.1
|
bundle-exec(1) bundle-exec.1
|
||||||
bundle-gem(1) bundle-gem.1
|
bundle-gem(1) bundle-gem.1
|
||||||
|
bundle-help(1) bundle-help.1
|
||||||
bundle-info(1) bundle-info.1
|
bundle-info(1) bundle-info.1
|
||||||
bundle-init(1) bundle-init.1
|
bundle-init(1) bundle-init.1
|
||||||
bundle-inject(1) bundle-inject.1
|
bundle-inject(1) bundle-inject.1
|
||||||
|
@ -18,6 +19,7 @@ bundle-lock(1) bundle-lock.1
|
||||||
bundle-open(1) bundle-open.1
|
bundle-open(1) bundle-open.1
|
||||||
bundle-outdated(1) bundle-outdated.1
|
bundle-outdated(1) bundle-outdated.1
|
||||||
bundle-platform(1) bundle-platform.1
|
bundle-platform(1) bundle-platform.1
|
||||||
|
bundle-plugin(1) bundle-plugin.1
|
||||||
bundle-pristine(1) bundle-pristine.1
|
bundle-pristine(1) bundle-pristine.1
|
||||||
bundle-remove(1) bundle-remove.1
|
bundle-remove(1) bundle-remove.1
|
||||||
bundle-show(1) bundle-show.1
|
bundle-show(1) bundle-show.1
|
||||||
|
|
|
@ -2,8 +2,11 @@
|
||||||
|
|
||||||
module Bundler
|
module Bundler
|
||||||
module FetchMetadata
|
module FetchMetadata
|
||||||
|
# A fallback is included because the original version of the specification
|
||||||
|
# API didn't include that field, so some marshalled specs in the index have it
|
||||||
|
# set to +nil+.
|
||||||
def matches_current_ruby?
|
def matches_current_ruby?
|
||||||
@required_ruby_version ||= _remote_specification.required_ruby_version
|
@required_ruby_version ||= _remote_specification.required_ruby_version || Gem::Requirement.default
|
||||||
|
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
|
|
@ -36,6 +36,8 @@ module Bundler
|
||||||
# @param [Hash] options various parameters as described in description.
|
# @param [Hash] options various parameters as described in description.
|
||||||
# Refer to cli/plugin for available options
|
# Refer to cli/plugin for available options
|
||||||
def install(names, options)
|
def install(names, options)
|
||||||
|
raise InvalidOption, "You cannot specify `--branch` and `--ref` at the same time." if options["branch"] && options["ref"]
|
||||||
|
|
||||||
specs = Installer.new.install(names, options)
|
specs = Installer.new.install(names, options)
|
||||||
|
|
||||||
save_plugins names, specs
|
save_plugins names, specs
|
||||||
|
|
|
@ -6,10 +6,6 @@ module Bundler
|
||||||
class Rubygems < Bundler::Source::Rubygems
|
class Rubygems < Bundler::Source::Rubygems
|
||||||
private
|
private
|
||||||
|
|
||||||
def requires_sudo?
|
|
||||||
false # Will change on implementation of project level plugins
|
|
||||||
end
|
|
||||||
|
|
||||||
def rubygems_dir
|
def rubygems_dir
|
||||||
Plugin.root
|
Plugin.root
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
module Bundler
|
module Bundler
|
||||||
class Resolver
|
class Resolver
|
||||||
require_relative "vendored_molinillo"
|
require_relative "vendored_molinillo"
|
||||||
|
require_relative "resolver/base"
|
||||||
require_relative "resolver/spec_group"
|
require_relative "resolver/spec_group"
|
||||||
|
|
||||||
include GemHelpers
|
include GemHelpers
|
||||||
|
@ -25,15 +26,13 @@ module Bundler
|
||||||
|
|
||||||
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
|
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
|
||||||
@source_requirements = source_requirements
|
@source_requirements = source_requirements
|
||||||
@base = base
|
@base = Resolver::Base.new(base, additional_base_requirements)
|
||||||
@resolver = Molinillo::Resolver.new(self, self)
|
@resolver = Molinillo::Resolver.new(self, self)
|
||||||
@results_for = {}
|
@results_for = {}
|
||||||
@search_for = {}
|
@search_for = {}
|
||||||
@additional_base_requirements = additional_base_requirements
|
|
||||||
@platforms = platforms
|
@platforms = platforms
|
||||||
@resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
|
@resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
|
||||||
@gem_version_promoter = gem_version_promoter
|
@gem_version_promoter = gem_version_promoter
|
||||||
@use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def start(requirements, exclude_specs: [])
|
def start(requirements, exclude_specs: [])
|
||||||
|
@ -43,18 +42,11 @@ module Bundler
|
||||||
remove_from_candidates(spec)
|
remove_from_candidates(spec)
|
||||||
end
|
end
|
||||||
|
|
||||||
@base_dg = Molinillo::DependencyGraph.new
|
|
||||||
@base.each do |ls|
|
|
||||||
dep = Dependency.new(ls.name, ls.version)
|
|
||||||
@base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
|
|
||||||
end
|
|
||||||
@additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
|
|
||||||
|
|
||||||
@gem_version_promoter.prerelease_specified = @prerelease_specified = {}
|
@gem_version_promoter.prerelease_specified = @prerelease_specified = {}
|
||||||
requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? }
|
requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? }
|
||||||
|
|
||||||
verify_gemfile_dependencies_are_found!(requirements)
|
verify_gemfile_dependencies_are_found!(requirements)
|
||||||
result = @resolver.resolve(requirements, @base_dg).
|
result = @resolver.resolve(requirements).
|
||||||
map(&:payload).
|
map(&:payload).
|
||||||
reject {|sg| sg.name.end_with?("\0") }.
|
reject {|sg| sg.name.end_with?("\0") }.
|
||||||
map(&:to_specs).
|
map(&:to_specs).
|
||||||
|
@ -62,8 +54,20 @@ module Bundler
|
||||||
|
|
||||||
SpecSet.new(SpecSet.new(result).for(regular_requirements, false, @platforms))
|
SpecSet.new(SpecSet.new(result).for(regular_requirements, false, @platforms))
|
||||||
rescue Molinillo::VersionConflict => e
|
rescue Molinillo::VersionConflict => e
|
||||||
|
conflicts = e.conflicts
|
||||||
|
|
||||||
|
deps_to_unlock = conflicts.values.inject([]) do |deps, conflict|
|
||||||
|
deps |= conflict.requirement_trees.flatten.map {|req| base_requirements[req.name] }.compact
|
||||||
|
end
|
||||||
|
|
||||||
|
if deps_to_unlock.any?
|
||||||
|
@base.unlock_deps(deps_to_unlock)
|
||||||
|
reset_spec_cache
|
||||||
|
retry
|
||||||
|
end
|
||||||
|
|
||||||
message = version_conflict_message(e)
|
message = version_conflict_message(e)
|
||||||
raise VersionConflict.new(e.conflicts.keys.uniq, message)
|
raise VersionConflict.new(conflicts.keys.uniq, message)
|
||||||
rescue Molinillo::CircularDependencyError => e
|
rescue Molinillo::CircularDependencyError => e
|
||||||
names = e.dependencies.sort_by(&:name).map {|d| "gem '#{d.name}'" }
|
names = e.dependencies.sort_by(&:name).map {|d| "gem '#{d.name}'" }
|
||||||
raise CyclicDependencyError, "Your bundle requires gems that depend" \
|
raise CyclicDependencyError, "Your bundle requires gems that depend" \
|
||||||
|
@ -118,31 +122,22 @@ module Bundler
|
||||||
dependency = dependency_proxy.dep
|
dependency = dependency_proxy.dep
|
||||||
name = dependency.name
|
name = dependency.name
|
||||||
@search_for[dependency_proxy] ||= begin
|
@search_for[dependency_proxy] ||= begin
|
||||||
results = results_for(dependency) + @base[name].select {|spec| requirement_satisfied_by?(dependency, nil, spec) }
|
locked_results = @base[name].select {|spec| requirement_satisfied_by?(dependency, nil, spec) }
|
||||||
|
locked_requirement = base_requirements[name]
|
||||||
|
results = results_for(dependency) + locked_results
|
||||||
|
results = results.select {|spec| requirement_satisfied_by?(locked_requirement, nil, spec) } if locked_requirement
|
||||||
|
|
||||||
if vertex = @base_dg.vertex_named(name)
|
if !@prerelease_specified[name] && locked_results.empty?
|
||||||
locked_requirement = vertex.payload.requirement
|
|
||||||
end
|
|
||||||
|
|
||||||
if !@prerelease_specified[name] && (!@use_gvp || locked_requirement.nil?)
|
|
||||||
# Move prereleases to the beginning of the list, so they're considered
|
# Move prereleases to the beginning of the list, so they're considered
|
||||||
# last during resolution.
|
# last during resolution.
|
||||||
pre, results = results.partition {|spec| spec.version.prerelease? }
|
pre, results = results.partition {|spec| spec.version.prerelease? }
|
||||||
results = pre + results
|
results = pre + results
|
||||||
end
|
end
|
||||||
|
|
||||||
spec_groups = if results.any?
|
if results.any?
|
||||||
nested = []
|
results = @gem_version_promoter.sort_versions(dependency, results)
|
||||||
results.each do |spec|
|
|
||||||
version, specs = nested.last
|
results.group_by(&:version).reduce([]) do |groups, (_, specs)|
|
||||||
if version == spec.version
|
|
||||||
specs << spec
|
|
||||||
else
|
|
||||||
nested << [spec.version, [spec]]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
nested.reduce([]) do |groups, (version, specs)|
|
|
||||||
next groups if locked_requirement && !locked_requirement.satisfied_by?(version)
|
|
||||||
next groups unless specs.any? {|spec| spec.match_platform(platform) }
|
next groups unless specs.any? {|spec| spec.match_platform(platform) }
|
||||||
|
|
||||||
specs_by_platform = Hash.new do |current_specs, current_platform|
|
specs_by_platform = Hash.new do |current_specs, current_platform|
|
||||||
|
@ -165,13 +160,6 @@ module Bundler
|
||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
# GVP handles major itself, but it's still a bit risky to trust it with it
|
|
||||||
# until we get it settled with new behavior. For 2.x it can take over all cases.
|
|
||||||
if !@use_gvp
|
|
||||||
spec_groups
|
|
||||||
else
|
|
||||||
@gem_version_promoter.sort_versions(dependency, spec_groups)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -197,12 +185,6 @@ module Bundler
|
||||||
"Gemfile"
|
"Gemfile"
|
||||||
end
|
end
|
||||||
|
|
||||||
def name_for_locking_dependency_source
|
|
||||||
Bundler.default_lockfile.basename.to_s
|
|
||||||
rescue StandardError
|
|
||||||
"Gemfile.lock"
|
|
||||||
end
|
|
||||||
|
|
||||||
def requirement_satisfied_by?(requirement, activated, spec)
|
def requirement_satisfied_by?(requirement, activated, spec)
|
||||||
requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
|
requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
|
||||||
end
|
end
|
||||||
|
@ -216,7 +198,7 @@ module Bundler
|
||||||
name = name_for(dependency)
|
name = name_for(dependency)
|
||||||
vertex = activated.vertex_named(name)
|
vertex = activated.vertex_named(name)
|
||||||
[
|
[
|
||||||
@base_dg.vertex_named(name) ? 0 : 1,
|
@base[name].any? ? 0 : 1,
|
||||||
vertex.payload ? 0 : 1,
|
vertex.payload ? 0 : 1,
|
||||||
vertex.root? ? 0 : 1,
|
vertex.root? ? 0 : 1,
|
||||||
amount_constrained(dependency),
|
amount_constrained(dependency),
|
||||||
|
@ -235,9 +217,12 @@ module Bundler
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def base_requirements
|
||||||
|
@base.base_requirements
|
||||||
|
end
|
||||||
|
|
||||||
def remove_from_candidates(spec)
|
def remove_from_candidates(spec)
|
||||||
@base.delete(spec)
|
@base.delete(spec)
|
||||||
@gem_version_promoter.reset
|
|
||||||
|
|
||||||
@results_for.keys.each do |dep|
|
@results_for.keys.each do |dep|
|
||||||
next unless dep.name == spec.name
|
next unless dep.name == spec.name
|
||||||
|
@ -245,7 +230,12 @@ module Bundler
|
||||||
@results_for[dep].reject {|s| s.name == spec.name && s.version == spec.version }
|
@results_for[dep].reject {|s| s.name == spec.name && s.version == spec.version }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
reset_spec_cache
|
||||||
|
end
|
||||||
|
|
||||||
|
def reset_spec_cache
|
||||||
@search_for = {}
|
@search_for = {}
|
||||||
|
@gem_version_promoter.reset
|
||||||
end
|
end
|
||||||
|
|
||||||
# returns an integer \in (-\infty, 0]
|
# returns an integer \in (-\infty, 0]
|
||||||
|
@ -337,18 +327,6 @@ module Bundler
|
||||||
|
|
||||||
e.message_with_trees(
|
e.message_with_trees(
|
||||||
:full_message_for_conflict => lambda do |name, conflict|
|
:full_message_for_conflict => lambda do |name, conflict|
|
||||||
o = if name.end_with?("\0")
|
|
||||||
String.new("Bundler found conflicting requirements for the #{name} version:")
|
|
||||||
else
|
|
||||||
String.new("Bundler could not find compatible versions for gem \"#{name}\":")
|
|
||||||
end
|
|
||||||
o << %(\n)
|
|
||||||
if conflict.locked_requirement
|
|
||||||
o << %( In snapshot (#{name_for_locking_dependency_source}):\n)
|
|
||||||
o << %( #{SharedHelpers.pretty_dependency(conflict.locked_requirement)}\n)
|
|
||||||
o << %(\n)
|
|
||||||
end
|
|
||||||
o << %( In #{name_for_explicit_dependency_source}:\n)
|
|
||||||
trees = conflict.requirement_trees
|
trees = conflict.requirement_trees
|
||||||
|
|
||||||
# called first, because we want to reduce the amount of work required to find maximal empty sets
|
# called first, because we want to reduce the amount of work required to find maximal empty sets
|
||||||
|
@ -367,30 +345,41 @@ module Bundler
|
||||||
trees.sort_by! {|t| t.reverse.map(&:name) }
|
trees.sort_by! {|t| t.reverse.map(&:name) }
|
||||||
end
|
end
|
||||||
|
|
||||||
o << trees.map do |tree|
|
if trees.size > 1 || name == "bundler"
|
||||||
t = "".dup
|
o = if name.end_with?("\0")
|
||||||
depth = 2
|
String.new("Bundler found conflicting requirements for the #{name} version:")
|
||||||
|
|
||||||
base_tree = tree.first
|
|
||||||
base_tree_name = base_tree.name
|
|
||||||
|
|
||||||
if base_tree_name.end_with?("\0")
|
|
||||||
t = nil
|
|
||||||
else
|
else
|
||||||
tree.each do |req|
|
String.new("Bundler could not find compatible versions for gem \"#{name}\":")
|
||||||
t << " " * depth << SharedHelpers.pretty_dependency(req)
|
|
||||||
unless tree.last == req
|
|
||||||
if spec = conflict.activated_by_name[req.name]
|
|
||||||
t << %( was resolved to #{spec.version}, which)
|
|
||||||
end
|
|
||||||
t << %( depends on)
|
|
||||||
end
|
|
||||||
t << %(\n)
|
|
||||||
depth += 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
t
|
o << %(\n)
|
||||||
end.compact.join("\n")
|
o << %( In #{name_for_explicit_dependency_source}:\n)
|
||||||
|
o << trees.map do |tree|
|
||||||
|
t = "".dup
|
||||||
|
depth = 2
|
||||||
|
|
||||||
|
base_tree = tree.first
|
||||||
|
base_tree_name = base_tree.name
|
||||||
|
|
||||||
|
if base_tree_name.end_with?("\0")
|
||||||
|
t = nil
|
||||||
|
else
|
||||||
|
tree.each do |req|
|
||||||
|
t << " " * depth << SharedHelpers.pretty_dependency(req)
|
||||||
|
unless tree.last == req
|
||||||
|
if spec = conflict.activated_by_name[req.name]
|
||||||
|
t << %( was resolved to #{spec.version}, which)
|
||||||
|
end
|
||||||
|
t << %( depends on)
|
||||||
|
end
|
||||||
|
t << %(\n)
|
||||||
|
depth += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
t
|
||||||
|
end.compact.join("\n")
|
||||||
|
else
|
||||||
|
o = String.new
|
||||||
|
end
|
||||||
|
|
||||||
if name == "bundler"
|
if name == "bundler"
|
||||||
o << %(\n Current Bundler version:\n bundler (#{Bundler::VERSION}))
|
o << %(\n Current Bundler version:\n bundler (#{Bundler::VERSION}))
|
||||||
|
@ -414,17 +403,13 @@ module Bundler
|
||||||
end
|
end
|
||||||
elsif name.end_with?("\0")
|
elsif name.end_with?("\0")
|
||||||
o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
|
o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
|
||||||
elsif conflict.locked_requirement
|
|
||||||
o << "\n"
|
|
||||||
o << %(Deleting your #{name_for_locking_dependency_source} file and running `bundle install` will rebuild your snapshot from scratch, using only\n)
|
|
||||||
o << %(the gems in your Gemfile, which may resolve the conflict.\n)
|
|
||||||
elsif !conflict.existing
|
elsif !conflict.existing
|
||||||
o << "\n"
|
o << "\n"
|
||||||
|
|
||||||
relevant_source = conflict.requirement.source || source_for(name)
|
relevant_source = conflict.requirement.source || source_for(name)
|
||||||
|
|
||||||
extra_message = if conflict.requirement_trees.first.size > 1
|
extra_message = if trees.first.size > 1
|
||||||
", which is required by gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
|
", which is required by gem '#{SharedHelpers.pretty_dependency(trees.first[-2])}',"
|
||||||
else
|
else
|
||||||
""
|
""
|
||||||
end
|
end
|
||||||
|
|
50
lib/bundler/resolver/base.rb
Normal file
50
lib/bundler/resolver/base.rb
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Bundler
|
||||||
|
class Resolver
|
||||||
|
class Base
|
||||||
|
def initialize(base, additional_base_requirements)
|
||||||
|
@base = base
|
||||||
|
@additional_base_requirements = additional_base_requirements
|
||||||
|
end
|
||||||
|
|
||||||
|
def [](name)
|
||||||
|
@base[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete(spec)
|
||||||
|
@base.delete(spec)
|
||||||
|
end
|
||||||
|
|
||||||
|
def base_requirements
|
||||||
|
@base_requirements ||= build_base_requirements
|
||||||
|
end
|
||||||
|
|
||||||
|
def unlock_deps(deps)
|
||||||
|
exact, lower_bound = deps.partition(&:specific?)
|
||||||
|
|
||||||
|
exact.each do |exact_dep|
|
||||||
|
@base.delete_by_name_and_version(exact_dep.name, exact_dep.requirement.requirements.first.last)
|
||||||
|
end
|
||||||
|
|
||||||
|
lower_bound.each do |lower_bound_dep|
|
||||||
|
@additional_base_requirements.delete(lower_bound_dep)
|
||||||
|
end
|
||||||
|
|
||||||
|
@base_requirements = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def build_base_requirements
|
||||||
|
base_requirements = {}
|
||||||
|
@base.each do |ls|
|
||||||
|
dep = Dependency.new(ls.name, ls.version)
|
||||||
|
base_requirements[ls.name] = DepProxy.get_proxy(dep, ls.platform)
|
||||||
|
end
|
||||||
|
@additional_base_requirements.each {|d| base_requirements[d.name] = d }
|
||||||
|
base_requirements
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -504,10 +504,6 @@ module Bundler
|
||||||
Gem::Package.build(spec, skip_validation)
|
Gem::Package.build(spec, skip_validation)
|
||||||
end
|
end
|
||||||
|
|
||||||
def repository_subdirectories
|
|
||||||
Gem::REPOSITORY_SUBDIRECTORIES
|
|
||||||
end
|
|
||||||
|
|
||||||
def path_separator
|
def path_separator
|
||||||
Gem.path_separator
|
Gem.path_separator
|
||||||
end
|
end
|
||||||
|
|
|
@ -45,7 +45,6 @@ module Bundler
|
||||||
silence_root_warning
|
silence_root_warning
|
||||||
suppress_install_using_messages
|
suppress_install_using_messages
|
||||||
update_requires_all_flag
|
update_requires_all_flag
|
||||||
use_gem_version_promoter_for_major_updates
|
|
||||||
].freeze
|
].freeze
|
||||||
|
|
||||||
NUMBER_KEYS = %w[
|
NUMBER_KEYS = %w[
|
||||||
|
@ -278,12 +277,6 @@ module Bundler
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def allow_sudo?
|
|
||||||
key = key_for(:path)
|
|
||||||
path_configured = @temporary.key?(key) || @local_config.key?(key)
|
|
||||||
!path_configured
|
|
||||||
end
|
|
||||||
|
|
||||||
def ignore_config?
|
def ignore_config?
|
||||||
ENV["BUNDLE_IGNORE_CONFIG"]
|
ENV["BUNDLE_IGNORE_CONFIG"]
|
||||||
end
|
end
|
||||||
|
|
|
@ -102,13 +102,7 @@ module Bundler
|
||||||
@install_path ||= begin
|
@install_path ||= begin
|
||||||
git_scope = "#{base_name}-#{shortref_for_path(revision)}"
|
git_scope = "#{base_name}-#{shortref_for_path(revision)}"
|
||||||
|
|
||||||
path = Bundler.install_path.join(git_scope)
|
Bundler.install_path.join(git_scope)
|
||||||
|
|
||||||
if !path.exist? && Bundler.requires_sudo?
|
|
||||||
Bundler.user_bundle_path.join(Bundler.ruby_scope).join(git_scope)
|
|
||||||
else
|
|
||||||
path
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -219,7 +213,7 @@ module Bundler
|
||||||
# across different projects, this cache will be shared.
|
# across different projects, this cache will be shared.
|
||||||
# When using local git repos, this is set to the local repo.
|
# When using local git repos, this is set to the local repo.
|
||||||
def cache_path
|
def cache_path
|
||||||
@cache_path ||= if Bundler.requires_sudo? || Bundler.feature_flag.global_gem_cache?
|
@cache_path ||= if Bundler.feature_flag.global_gem_cache?
|
||||||
Bundler.user_cache
|
Bundler.user_cache
|
||||||
else
|
else
|
||||||
Bundler.bundle_path.join("cache", "bundler")
|
Bundler.bundle_path.join("cache", "bundler")
|
||||||
|
|
|
@ -18,13 +18,7 @@ module Bundler
|
||||||
@build_args = options[:build_args] || Bundler.rubygems.build_args
|
@build_args = options[:build_args] || Bundler.rubygems.build_args
|
||||||
@gem_bin_dir = "#{Bundler.rubygems.gem_dir}/bin"
|
@gem_bin_dir = "#{Bundler.rubygems.gem_dir}/bin"
|
||||||
@disable_extensions = options[:disable_extensions]
|
@disable_extensions = options[:disable_extensions]
|
||||||
|
@bin_dir = @gem_bin_dir
|
||||||
if Bundler.requires_sudo?
|
|
||||||
@tmp_dir = Bundler.tmp(spec.full_name).to_s
|
|
||||||
@bin_dir = "#{@tmp_dir}/bin"
|
|
||||||
else
|
|
||||||
@bin_dir = @gem_bin_dir
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def post_install
|
def post_install
|
||||||
|
@ -38,25 +32,10 @@ module Bundler
|
||||||
generate_bin unless spec.executables.empty?
|
generate_bin unless spec.executables.empty?
|
||||||
|
|
||||||
run_hooks(:post_install)
|
run_hooks(:post_install)
|
||||||
ensure
|
|
||||||
Bundler.rm_rf(@tmp_dir) if Bundler.requires_sudo?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def generate_bin
|
|
||||||
super
|
|
||||||
|
|
||||||
if Bundler.requires_sudo?
|
|
||||||
SharedHelpers.filesystem_access(@gem_bin_dir) do |p|
|
|
||||||
Bundler.mkdir_p(p)
|
|
||||||
end
|
|
||||||
spec.executables.each do |exe|
|
|
||||||
Bundler.sudo "cp -R #{@bin_dir}/#{exe} #{@gem_bin_dir}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def run_hooks(type)
|
def run_hooks(type)
|
||||||
hooks_meth = "#{type}_hooks"
|
hooks_meth = "#{type}_hooks"
|
||||||
return unless Gem.respond_to?(hooks_meth)
|
return unless Gem.respond_to?(hooks_meth)
|
||||||
|
|
|
@ -160,15 +160,10 @@ module Bundler
|
||||||
|
|
||||||
return if Bundler.settings[:no_install]
|
return if Bundler.settings[:no_install]
|
||||||
|
|
||||||
if requires_sudo?
|
install_path = rubygems_dir
|
||||||
install_path = Bundler.tmp(spec.full_name)
|
bin_path = Bundler.system_bindir
|
||||||
bin_path = install_path.join("bin")
|
|
||||||
else
|
|
||||||
install_path = rubygems_dir
|
|
||||||
bin_path = Bundler.system_bindir
|
|
||||||
end
|
|
||||||
|
|
||||||
Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
|
Bundler.mkdir_p bin_path unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
|
||||||
|
|
||||||
require_relative "../rubygems_gem_installer"
|
require_relative "../rubygems_gem_installer"
|
||||||
|
|
||||||
|
@ -209,34 +204,7 @@ module Bundler
|
||||||
spec.full_gem_path = installed_spec.full_gem_path
|
spec.full_gem_path = installed_spec.full_gem_path
|
||||||
spec.loaded_from = installed_spec.loaded_from
|
spec.loaded_from = installed_spec.loaded_from
|
||||||
|
|
||||||
# SUDO HAX
|
|
||||||
if requires_sudo?
|
|
||||||
Bundler.rubygems.repository_subdirectories.each do |name|
|
|
||||||
src = File.join(install_path, name, "*")
|
|
||||||
dst = File.join(rubygems_dir, name)
|
|
||||||
if name == "extensions" && Dir.glob(src).any?
|
|
||||||
src = File.join(src, "*/*")
|
|
||||||
ext_src = Dir.glob(src).first
|
|
||||||
ext_src.gsub!(src[0..-6], "")
|
|
||||||
dst = File.dirname(File.join(dst, ext_src))
|
|
||||||
end
|
|
||||||
SharedHelpers.filesystem_access(dst) do |p|
|
|
||||||
Bundler.mkdir_p(p)
|
|
||||||
end
|
|
||||||
Bundler.sudo "cp -R #{src} #{dst}" if Dir[src].any?
|
|
||||||
end
|
|
||||||
|
|
||||||
spec.executables.each do |exe|
|
|
||||||
SharedHelpers.filesystem_access(Bundler.system_bindir) do |p|
|
|
||||||
Bundler.mkdir_p(p)
|
|
||||||
end
|
|
||||||
Bundler.sudo "cp -R #{install_path}/bin/#{exe} #{Bundler.system_bindir}/"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
spec.post_install_message
|
spec.post_install_message
|
||||||
ensure
|
|
||||||
Bundler.rm_rf(install_path) if requires_sudo?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def cache(spec, custom_path = nil)
|
def cache(spec, custom_path = nil)
|
||||||
|
@ -475,38 +443,18 @@ module Bundler
|
||||||
gem_path = package_path(cache_path, spec)
|
gem_path = package_path(cache_path, spec)
|
||||||
return gem_path if File.exist?(gem_path)
|
return gem_path if File.exist?(gem_path)
|
||||||
|
|
||||||
if requires_sudo?
|
SharedHelpers.filesystem_access(cache_path) do |p|
|
||||||
download_path = Bundler.tmp(spec.full_name)
|
|
||||||
download_cache_path = default_cache_path_for(download_path)
|
|
||||||
else
|
|
||||||
download_cache_path = cache_path
|
|
||||||
end
|
|
||||||
|
|
||||||
SharedHelpers.filesystem_access(download_cache_path) do |p|
|
|
||||||
FileUtils.mkdir_p(p)
|
FileUtils.mkdir_p(p)
|
||||||
end
|
end
|
||||||
download_gem(spec, download_cache_path, previous_spec)
|
download_gem(spec, cache_path, previous_spec)
|
||||||
|
|
||||||
if requires_sudo?
|
|
||||||
SharedHelpers.filesystem_access(cache_path) do |p|
|
|
||||||
Bundler.mkdir_p(p)
|
|
||||||
end
|
|
||||||
Bundler.sudo "mv #{package_path(download_cache_path, spec)} #{gem_path}"
|
|
||||||
end
|
|
||||||
|
|
||||||
gem_path
|
gem_path
|
||||||
ensure
|
|
||||||
Bundler.rm_rf(download_path) if requires_sudo?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def installed?(spec)
|
def installed?(spec)
|
||||||
installed_specs[spec].any? && !spec.deleted_gem?
|
installed_specs[spec].any? && !spec.deleted_gem?
|
||||||
end
|
end
|
||||||
|
|
||||||
def requires_sudo?
|
|
||||||
Bundler.requires_sudo?
|
|
||||||
end
|
|
||||||
|
|
||||||
def rubygems_dir
|
def rubygems_dir
|
||||||
Bundler.bundle_path
|
Bundler.bundle_path
|
||||||
end
|
end
|
||||||
|
|
|
@ -114,10 +114,20 @@ module Bundler
|
||||||
SpecSet.new(arr)
|
SpecSet.new(arr)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def -(other)
|
||||||
|
SpecSet.new(to_a - other.to_a)
|
||||||
|
end
|
||||||
|
|
||||||
def find_by_name_and_platform(name, platform)
|
def find_by_name_and_platform(name, platform)
|
||||||
@specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
|
@specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete_by_name_and_version(name, version)
|
||||||
|
@specs.reject! {|spec| spec.name == name && spec.version == version }
|
||||||
|
@lookup = nil
|
||||||
|
@sorted = nil
|
||||||
|
end
|
||||||
|
|
||||||
def what_required(spec)
|
def what_required(spec)
|
||||||
unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
|
unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
|
||||||
return [spec]
|
return [spec]
|
||||||
|
|
|
@ -189,22 +189,6 @@ EOF
|
||||||
Bundler.mkdir_p(bundled_app.join("foo", "bar"))
|
Bundler.mkdir_p(bundled_app.join("foo", "bar"))
|
||||||
expect(bundled_app.join("foo", "bar")).to exist
|
expect(bundled_app.join("foo", "bar")).to exist
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when mkdir_p requires sudo" do
|
|
||||||
it "creates a new folder using sudo" do
|
|
||||||
expect(Bundler).to receive(:requires_sudo?).and_return(true)
|
|
||||||
expect(Bundler).to receive(:sudo).and_return true
|
|
||||||
Bundler.mkdir_p(bundled_app.join("foo"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "with :no_sudo option" do
|
|
||||||
it "forces mkdir_p to not use sudo" do
|
|
||||||
expect(Bundler).to receive(:requires_sudo?).and_return(true)
|
|
||||||
expect(Bundler).to_not receive(:sudo)
|
|
||||||
Bundler.mkdir_p(bundled_app.join("foo"), :no_sudo => true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#user_home" do
|
describe "#user_home" do
|
||||||
|
@ -268,118 +252,6 @@ EOF
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#requires_sudo?" do
|
|
||||||
let!(:tmpdir) { Dir.mktmpdir }
|
|
||||||
let(:bundle_path) { Pathname("#{tmpdir}/bundle") }
|
|
||||||
|
|
||||||
def clear_cached_requires_sudo
|
|
||||||
return unless Bundler.instance_variable_defined?(:@requires_sudo_ran)
|
|
||||||
Bundler.remove_instance_variable(:@requires_sudo_ran)
|
|
||||||
Bundler.remove_instance_variable(:@requires_sudo)
|
|
||||||
end
|
|
||||||
|
|
||||||
before do
|
|
||||||
clear_cached_requires_sudo
|
|
||||||
allow(Bundler).to receive(:which).with("sudo").and_return("/usr/bin/sudo")
|
|
||||||
allow(Bundler).to receive(:bundle_path).and_return(bundle_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
after do
|
|
||||||
FileUtils.rm_rf(tmpdir)
|
|
||||||
clear_cached_requires_sudo
|
|
||||||
end
|
|
||||||
|
|
||||||
subject { Bundler.requires_sudo? }
|
|
||||||
|
|
||||||
context "bundle_path doesn't exist" do
|
|
||||||
it { should be false }
|
|
||||||
|
|
||||||
context "and parent dir can't be written" do
|
|
||||||
before do
|
|
||||||
FileUtils.chmod(0o500, tmpdir)
|
|
||||||
end
|
|
||||||
|
|
||||||
it { should be true }
|
|
||||||
end
|
|
||||||
|
|
||||||
context "with unwritable files in a parent dir" do
|
|
||||||
# Regression test for https://github.com/rubygems/bundler/pull/6316
|
|
||||||
# It doesn't matter if there are other unwritable files so long as
|
|
||||||
# bundle_path can be created
|
|
||||||
before do
|
|
||||||
file = File.join(tmpdir, "unrelated_file")
|
|
||||||
FileUtils.touch(file)
|
|
||||||
FileUtils.chmod(0o400, file)
|
|
||||||
end
|
|
||||||
|
|
||||||
it { should be false }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "bundle_path exists" do
|
|
||||||
before do
|
|
||||||
FileUtils.mkdir_p(bundle_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
it { should be false }
|
|
||||||
|
|
||||||
context "and is unwritable" do
|
|
||||||
before do
|
|
||||||
FileUtils.chmod(0o500, bundle_path)
|
|
||||||
end
|
|
||||||
|
|
||||||
it { should be true }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "path writability" do
|
|
||||||
before do
|
|
||||||
FileUtils.mkdir_p("tmp/vendor/bundle")
|
|
||||||
FileUtils.mkdir_p("tmp/vendor/bin_dir")
|
|
||||||
end
|
|
||||||
after do
|
|
||||||
FileUtils.rm_rf("tmp/vendor/bundle")
|
|
||||||
FileUtils.rm_rf("tmp/vendor/bin_dir")
|
|
||||||
end
|
|
||||||
context "writable paths" do
|
|
||||||
it "should return false and display nothing" do
|
|
||||||
allow(Bundler).to receive(:bundle_path).and_return(Pathname("tmp/vendor/bundle"))
|
|
||||||
expect(Bundler.ui).to_not receive(:warn)
|
|
||||||
expect(Bundler.requires_sudo?).to eq(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
context "unwritable paths" do
|
|
||||||
before do
|
|
||||||
FileUtils.touch("tmp/vendor/bundle/unwritable1.txt")
|
|
||||||
FileUtils.touch("tmp/vendor/bundle/unwritable2.txt")
|
|
||||||
FileUtils.touch("tmp/vendor/bin_dir/unwritable3.txt")
|
|
||||||
FileUtils.chmod(0o400, "tmp/vendor/bundle/unwritable1.txt")
|
|
||||||
FileUtils.chmod(0o400, "tmp/vendor/bundle/unwritable2.txt")
|
|
||||||
FileUtils.chmod(0o400, "tmp/vendor/bin_dir/unwritable3.txt")
|
|
||||||
end
|
|
||||||
it "should return true and display warn message" do
|
|
||||||
allow(Bundler).to receive(:bundle_path).and_return(Pathname("tmp/vendor/bundle"))
|
|
||||||
bin_dir = Pathname("tmp/vendor/bin_dir/")
|
|
||||||
|
|
||||||
# allow File#writable? to be called with args other than the stubbed on below
|
|
||||||
allow(File).to receive(:writable?).and_call_original
|
|
||||||
|
|
||||||
# fake make the directory unwritable
|
|
||||||
allow(File).to receive(:writable?).with(bin_dir).and_return(false)
|
|
||||||
allow(Bundler).to receive(:system_bindir).and_return(Pathname("tmp/vendor/bin_dir/"))
|
|
||||||
message = <<-MESSAGE.chomp
|
|
||||||
Following files may not be writable, so sudo is needed:
|
|
||||||
tmp/vendor/bin_dir/
|
|
||||||
tmp/vendor/bundle/unwritable1.txt
|
|
||||||
tmp/vendor/bundle/unwritable2.txt
|
|
||||||
MESSAGE
|
|
||||||
expect(Bundler.ui).to receive(:warn).with(message)
|
|
||||||
expect(Bundler.requires_sudo?).to eq(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "user cache dir" do
|
context "user cache dir" do
|
||||||
let(:home_path) { Pathname.new(ENV["HOME"]) }
|
let(:home_path) { Pathname.new(ENV["HOME"]) }
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,33 @@ RSpec.describe Bundler::EndpointSpecification do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#required_ruby_version" do
|
||||||
|
context "required_ruby_version is already set on endpoint specification" do
|
||||||
|
existing_value = "already set value"
|
||||||
|
let(:required_ruby_version) { existing_value }
|
||||||
|
|
||||||
|
it "should return the current value when already set on endpoint specification" do
|
||||||
|
remote_spec = double(:remote_spec, :required_ruby_version => "remote_value", :required_rubygems_version => nil)
|
||||||
|
|
||||||
|
expect(spec.required_ruby_version). eql?(existing_value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should return the remote spec value when not set on endpoint specification and remote spec has one" do
|
||||||
|
remote_value = "remote_value"
|
||||||
|
remote_spec = double(:remote_spec, :required_ruby_version => remote_value, :required_rubygems_version => nil)
|
||||||
|
allow(spec_fetcher).to receive(:fetch_spec).and_return(remote_spec)
|
||||||
|
|
||||||
|
expect(spec.required_ruby_version). eql?(remote_value)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should use the default Gem Requirement value when not set on endpoint specification and not set on remote spec" do
|
||||||
|
remote_spec = double(:remote_spec, :required_ruby_version => nil, :required_rubygems_version => nil)
|
||||||
|
allow(spec_fetcher).to receive(:fetch_spec).and_return(remote_spec)
|
||||||
|
expect(spec.required_ruby_version). eql?(Gem::Requirement.default)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "supports equality comparison" do
|
it "supports equality comparison" do
|
||||||
remote_spec = double(:remote_spec, :required_ruby_version => nil, :required_rubygems_version => nil)
|
remote_spec = double(:remote_spec, :required_ruby_version => nil, :required_rubygems_version => nil)
|
||||||
allow(spec_fetcher).to receive(:fetch_spec).and_return(remote_spec)
|
allow(spec_fetcher).to receive(:fetch_spec).and_return(remote_spec)
|
||||||
|
|
|
@ -166,14 +166,5 @@ RSpec.describe Bundler::GemVersionPromoter do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "debug output" do
|
|
||||||
it "should not kerblooie on its own debug output" do
|
|
||||||
gvp = unlocking(:level => :patch)
|
|
||||||
dep = Bundler::DepProxy.get_proxy(dep("foo", "1.2.0").first, "ruby")
|
|
||||||
result = gvp.send(:debug_format_result, dep, build_spec_groups("foo", %w[1.2.0 1.3.0]))
|
|
||||||
expect(result.class).to eq Array
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,10 +2,8 @@
|
||||||
|
|
||||||
RSpec.describe "bundle install" do
|
RSpec.describe "bundle install" do
|
||||||
describe "when system_bindir is set" do
|
describe "when system_bindir is set" do
|
||||||
# On OS X, Gem.bindir defaults to /usr/bin, so system_bindir is useful if
|
|
||||||
# you want to avoid sudo installs for system gems with OS X's default ruby
|
|
||||||
it "overrides Gem.bindir" do
|
it "overrides Gem.bindir" do
|
||||||
expect(Pathname.new("/usr/bin")).not_to be_writable unless Process.euid == 0
|
expect(Pathname.new("/usr/bin")).not_to be_writable
|
||||||
gemfile <<-G
|
gemfile <<-G
|
||||||
def Gem.bindir; "/usr/bin"; end
|
def Gem.bindir; "/usr/bin"; end
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
source "#{file_uri_for(gem_repo1)}"
|
||||||
|
|
|
@ -1470,6 +1470,59 @@ RSpec.describe "bundle install with gems on multiple sources" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when default source includes old gems with nil required_ruby_version" do
|
||||||
|
before do
|
||||||
|
build_repo2 do
|
||||||
|
build_gem "ruport", "1.7.0.3" do |s|
|
||||||
|
s.add_dependency "pdf-writer", "1.1.8"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
build_repo gem_repo4 do
|
||||||
|
build_gem "pdf-writer", "1.1.8"
|
||||||
|
end
|
||||||
|
|
||||||
|
path = "#{gem_repo4}/#{Gem::MARSHAL_SPEC_DIR}/pdf-writer-1.1.8.gemspec.rz"
|
||||||
|
spec = Marshal.load(Bundler.rubygems.inflate(File.binread(path)))
|
||||||
|
spec.instance_variable_set(:@required_ruby_version, nil)
|
||||||
|
File.open(path, "wb") do |f|
|
||||||
|
f.write Gem.deflate(Marshal.dump(spec))
|
||||||
|
end
|
||||||
|
|
||||||
|
gemfile <<~G
|
||||||
|
source "https://localgemserver.test"
|
||||||
|
|
||||||
|
gem "ruport", "= 1.7.0.3", :source => "https://localgemserver.test/extra"
|
||||||
|
G
|
||||||
|
end
|
||||||
|
|
||||||
|
it "handles that fine" do
|
||||||
|
bundle "install", :artifice => "compact_index_extra", :env => { "BUNDLER_SPEC_GEM_REPO" => gem_repo4.to_s }
|
||||||
|
|
||||||
|
expect(lockfile).to eq <<~L
|
||||||
|
GEM
|
||||||
|
remote: https://localgemserver.test/
|
||||||
|
specs:
|
||||||
|
pdf-writer (1.1.8)
|
||||||
|
|
||||||
|
GEM
|
||||||
|
remote: https://localgemserver.test/extra/
|
||||||
|
specs:
|
||||||
|
ruport (1.7.0.3)
|
||||||
|
pdf-writer (= 1.1.8)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
#{specific_local_platform}
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
ruport (= 1.7.0.3)!
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
#{Bundler::VERSION}
|
||||||
|
L
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "when default source includes old gems with nil required_rubygems_version" do
|
context "when default source includes old gems with nil required_rubygems_version" do
|
||||||
before do
|
before do
|
||||||
build_repo2 do
|
build_repo2 do
|
||||||
|
|
|
@ -519,18 +519,6 @@ The checksum of /versions does not match the checksum provided by the server! So
|
||||||
expect(out).to include("Fetching gem metadata from #{source_uri}")
|
expect(out).to include("Fetching gem metadata from #{source_uri}")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should install when EndpointSpecification has a bin dir owned by root", :sudo => true do
|
|
||||||
sudo "mkdir -p #{system_gem_path("bin")}"
|
|
||||||
sudo "chown -R root #{system_gem_path("bin")}"
|
|
||||||
|
|
||||||
gemfile <<-G
|
|
||||||
source "#{source_uri}"
|
|
||||||
gem "rails"
|
|
||||||
G
|
|
||||||
bundle :install, :artifice => "compact_index"
|
|
||||||
expect(the_bundle).to include_gems "rails 2.3.2"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs the binstubs", :bundler => "< 3" do
|
it "installs the binstubs", :bundler => "< 3" do
|
||||||
gemfile <<-G
|
gemfile <<-G
|
||||||
source "#{source_uri}"
|
source "#{source_uri}"
|
||||||
|
|
|
@ -476,18 +476,6 @@ RSpec.describe "gemcutter's dependency API" do
|
||||||
expect(out).to include("Fetching gem metadata from #{source_uri}")
|
expect(out).to include("Fetching gem metadata from #{source_uri}")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should install when EndpointSpecification has a bin dir owned by root", :sudo => true do
|
|
||||||
sudo "mkdir -p #{system_gem_path("bin")}"
|
|
||||||
sudo "chown -R root #{system_gem_path("bin")}"
|
|
||||||
|
|
||||||
gemfile <<-G
|
|
||||||
source "#{source_uri}"
|
|
||||||
gem "rails"
|
|
||||||
G
|
|
||||||
bundle :install, :artifice => "endpoint"
|
|
||||||
expect(the_bundle).to include_gems "rails 2.3.2"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs the binstubs", :bundler => "< 3" do
|
it "installs the binstubs", :bundler => "< 3" do
|
||||||
gemfile <<-G
|
gemfile <<-G
|
||||||
source "#{source_uri}"
|
source "#{source_uri}"
|
||||||
|
|
|
@ -190,28 +190,33 @@ RSpec.describe "bundle flex_install" do
|
||||||
expect(err).to match(/could not find gem 'rack-obama/i)
|
expect(err).to match(/could not find gem 'rack-obama/i)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "suggests deleting the Gemfile.lock file when the Gemfile requires different versions than the lock" do
|
it "discards the locked gems when the Gemfile requires different versions than the lock" do
|
||||||
bundle "config set force_ruby_platform true"
|
bundle "config set force_ruby_platform true"
|
||||||
|
|
||||||
nice_error = <<-E.strip.gsub(/^ {8}/, "")
|
nice_error = <<-E.strip.gsub(/^ {8}/, "")
|
||||||
Bundler could not find compatible versions for gem "rack":
|
Could not find gem 'rack (= 1.2)', which is required by gem 'rack-obama (= 2.0)', in rubygems repository #{file_uri_for(gem_repo2)}/ or installed locally.
|
||||||
In snapshot (Gemfile.lock):
|
|
||||||
rack (= 0.9.1)
|
|
||||||
|
|
||||||
In Gemfile:
|
The source contains the following gems matching 'rack':
|
||||||
rack-obama (= 2.0) was resolved to 2.0, which depends on
|
* rack-0.9.1
|
||||||
rack (= 1.2)
|
* rack-1.0.0
|
||||||
|
|
||||||
rack_middleware was resolved to 1.0, which depends on
|
|
||||||
rack (= 0.9.1)
|
|
||||||
|
|
||||||
Deleting your Gemfile.lock file and running `bundle install` will rebuild your snapshot from scratch, using only
|
|
||||||
the gems in your Gemfile, which may resolve the conflict.
|
|
||||||
E
|
E
|
||||||
|
|
||||||
bundle :install, :retry => 0, :raise_on_error => false
|
bundle :install, :retry => 0, :raise_on_error => false
|
||||||
expect(err).to end_with(nice_error)
|
expect(err).to end_with(nice_error)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "does not include conflicts with a single requirement tree, because that can't possibly be a conflict" do
|
||||||
|
bundle "config set force_ruby_platform true"
|
||||||
|
|
||||||
|
bad_error = <<-E.strip.gsub(/^ {8}/, "")
|
||||||
|
Bundler could not find compatible versions for gem "rack-obama":
|
||||||
|
In Gemfile:
|
||||||
|
rack-obama (= 2.0)
|
||||||
|
E
|
||||||
|
|
||||||
|
bundle "update rack_middleware", :retry => 0, :raise_on_error => false
|
||||||
|
expect(err).not_to end_with(bad_error)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "when running bundle update and Gemfile conflicts with lockfile" do
|
describe "when running bundle update and Gemfile conflicts with lockfile" do
|
||||||
|
@ -230,22 +235,6 @@ RSpec.describe "bundle flex_install" do
|
||||||
gem "jekyll-feed", "~> 0.12"
|
gem "jekyll-feed", "~> 0.12"
|
||||||
G
|
G
|
||||||
|
|
||||||
lockfile <<-L
|
|
||||||
GEM
|
|
||||||
remote: #{file_uri_for(gem_repo4)}/
|
|
||||||
specs:
|
|
||||||
jekyll-feed (0.16.0)
|
|
||||||
|
|
||||||
PLATFORMS
|
|
||||||
#{lockfile_platforms}
|
|
||||||
|
|
||||||
DEPENDENCIES
|
|
||||||
jekyll-feed
|
|
||||||
|
|
||||||
BUNDLED WITH
|
|
||||||
#{Bundler::VERSION}
|
|
||||||
L
|
|
||||||
|
|
||||||
gemfile <<-G
|
gemfile <<-G
|
||||||
source "#{file_uri_for(gem_repo4)}"
|
source "#{file_uri_for(gem_repo4)}"
|
||||||
gem "github-pages", "~> 226"
|
gem "github-pages", "~> 226"
|
||||||
|
@ -253,24 +242,9 @@ RSpec.describe "bundle flex_install" do
|
||||||
G
|
G
|
||||||
end
|
end
|
||||||
|
|
||||||
it "suggests deleting the Gemfile.lock file when the Gemfile requires different versions than the lock" do
|
it "discards the conflicting lockfile information and resolves properly" do
|
||||||
nice_error = <<-E.strip.gsub(/^ {8}/, "")
|
bundle :update, :raise_on_error => false, :all => true
|
||||||
Bundler could not find compatible versions for gem "jekyll-feed":
|
expect(err).to be_empty
|
||||||
In snapshot (Gemfile.lock):
|
|
||||||
jekyll-feed (>= 0.16.0)
|
|
||||||
|
|
||||||
In Gemfile:
|
|
||||||
jekyll-feed (~> 0.12)
|
|
||||||
|
|
||||||
github-pages (~> 226) was resolved to 226, which depends on
|
|
||||||
jekyll-feed (= 0.15.1)
|
|
||||||
|
|
||||||
Deleting your Gemfile.lock file and running `bundle install` will rebuild your snapshot from scratch, using only
|
|
||||||
the gems in your Gemfile, which may resolve the conflict.
|
|
||||||
E
|
|
||||||
|
|
||||||
bundle :update, :raise_on_error => false
|
|
||||||
expect(err).to end_with(nice_error)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -374,7 +348,7 @@ RSpec.describe "bundle flex_install" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "prints the correct error message" do
|
it "resolves them" do
|
||||||
# install Rails 3.0.0.rc
|
# install Rails 3.0.0.rc
|
||||||
install_gemfile <<-G
|
install_gemfile <<-G
|
||||||
source "#{file_uri_for(gem_repo2)}"
|
source "#{file_uri_for(gem_repo2)}"
|
||||||
|
@ -383,13 +357,12 @@ RSpec.describe "bundle flex_install" do
|
||||||
G
|
G
|
||||||
|
|
||||||
# upgrade Rails to 3.0.0 and then install again
|
# upgrade Rails to 3.0.0 and then install again
|
||||||
install_gemfile <<-G, :raise_on_error => false
|
install_gemfile <<-G
|
||||||
source "#{file_uri_for(gem_repo2)}"
|
source "#{file_uri_for(gem_repo2)}"
|
||||||
gem "rails", "3.0.0"
|
gem "rails", "3.0.0"
|
||||||
gem "capybara", "0.3.9"
|
gem "capybara", "0.3.9"
|
||||||
G
|
G
|
||||||
|
expect(err).to be_empty
|
||||||
expect(err).to include("Gemfile.lock")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,205 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
RSpec.describe "when using sudo", :sudo => true do
|
|
||||||
describe "and BUNDLE_PATH is writable" do
|
|
||||||
context "but BUNDLE_PATH/build_info is not writable" do
|
|
||||||
let(:subdir) do
|
|
||||||
system_gem_path("cache")
|
|
||||||
end
|
|
||||||
|
|
||||||
before do
|
|
||||||
bundle "config set path.system true"
|
|
||||||
subdir.mkpath
|
|
||||||
sudo "chmod u-w #{subdir}"
|
|
||||||
end
|
|
||||||
|
|
||||||
after do
|
|
||||||
sudo "chmod u+w #{subdir}"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs" do
|
|
||||||
install_gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "rack"
|
|
||||||
G
|
|
||||||
|
|
||||||
expect(out).to_not match(/an error occurred/i)
|
|
||||||
expect(system_gem_path("cache/rack-1.0.0.gem")).to exist
|
|
||||||
expect(the_bundle).to include_gems "rack 1.0"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "and GEM_HOME is owned by root" do
|
|
||||||
before :each do
|
|
||||||
bundle "config set path.system true"
|
|
||||||
chown_system_gems_to_root
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs" do
|
|
||||||
install_gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "rack", '1.0'
|
|
||||||
gem "thin"
|
|
||||||
G
|
|
||||||
|
|
||||||
expect(system_gem_path("gems/rack-1.0.0")).to exist
|
|
||||||
expect(system_gem_path("gems/rack-1.0.0").stat.uid).to eq(0)
|
|
||||||
expect(the_bundle).to include_gems "rack 1.0"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs rake and a gem dependent on rake in the same session" do
|
|
||||||
build_repo2 do
|
|
||||||
build_gem "another_implicit_rake_dep" do |s|
|
|
||||||
s.extensions << "Rakefile"
|
|
||||||
s.write "Rakefile", <<-RUBY
|
|
||||||
task :default do
|
|
||||||
path = File.expand_path("lib", __dir__)
|
|
||||||
FileUtils.mkdir_p(path)
|
|
||||||
File.open("\#{path}/another_implicit_rake_dep.rb", "w") do |f|
|
|
||||||
f.puts "ANOTHER_IMPLICIT_RAKE_DEP = 'YES'"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
RUBY
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo2)}"
|
|
||||||
gem "rake"
|
|
||||||
gem "another_implicit_rake_dep"
|
|
||||||
G
|
|
||||||
bundle "install"
|
|
||||||
expect(system_gem_path("gems/another_implicit_rake_dep-1.0")).to exist
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs when BUNDLE_PATH is owned by root" do
|
|
||||||
bundle_path = tmp("owned_by_root")
|
|
||||||
FileUtils.mkdir_p bundle_path
|
|
||||||
sudo "chown -R root #{bundle_path}"
|
|
||||||
|
|
||||||
ENV["BUNDLE_PATH"] = bundle_path.to_s
|
|
||||||
install_gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "rack", '1.0'
|
|
||||||
G
|
|
||||||
|
|
||||||
expect(bundle_path.join(Bundler.ruby_scope, "gems/rack-1.0.0")).to exist
|
|
||||||
expect(bundle_path.join(Bundler.ruby_scope, "gems/rack-1.0.0").stat.uid).to eq(0)
|
|
||||||
expect(the_bundle).to include_gems "rack 1.0"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs when BUNDLE_PATH does not exist" do
|
|
||||||
root_path = tmp("owned_by_root")
|
|
||||||
FileUtils.mkdir_p root_path
|
|
||||||
sudo "chown -R root #{root_path}"
|
|
||||||
bundle_path = root_path.join("does_not_exist")
|
|
||||||
|
|
||||||
ENV["BUNDLE_PATH"] = bundle_path.to_s
|
|
||||||
install_gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "rack", '1.0'
|
|
||||||
G
|
|
||||||
|
|
||||||
expect(bundle_path.join(Bundler.ruby_scope, "gems/rack-1.0.0")).to exist
|
|
||||||
expect(bundle_path.join(Bundler.ruby_scope, "gems/rack-1.0.0").stat.uid).to eq(0)
|
|
||||||
expect(the_bundle).to include_gems "rack 1.0"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs extensions/" do
|
|
||||||
install_gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "very_simple_binary"
|
|
||||||
G
|
|
||||||
|
|
||||||
expect(system_gem_path("gems/very_simple_binary-1.0")).to exist
|
|
||||||
binary_glob = system_gem_path("extensions/*/*/very_simple_binary-1.0")
|
|
||||||
expect(Dir.glob(binary_glob).first).to be
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "and BUNDLE_PATH is not writable" do
|
|
||||||
before do
|
|
||||||
bundle "config set --local path .bundle"
|
|
||||||
sudo "chmod ugo-w .bundle"
|
|
||||||
end
|
|
||||||
|
|
||||||
after do
|
|
||||||
sudo "chmod ugo+w .bundle"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "installs" do
|
|
||||||
install_gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "rack", '1.0'
|
|
||||||
G
|
|
||||||
|
|
||||||
expect(local_gem_path("gems/rack-1.0.0")).to exist
|
|
||||||
expect(the_bundle).to include_gems "rack 1.0"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "cleans up the tmpdirs generated" do
|
|
||||||
require "tmpdir"
|
|
||||||
Dir.glob("#{Dir.tmpdir}/bundler*").each do |tmpdir|
|
|
||||||
FileUtils.remove_entry_secure(tmpdir)
|
|
||||||
end
|
|
||||||
|
|
||||||
install_gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "rack"
|
|
||||||
G
|
|
||||||
tmpdirs = Dir.glob("#{Dir.tmpdir}/bundler*")
|
|
||||||
|
|
||||||
expect(tmpdirs).to be_empty
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "and GEM_HOME is not writable" do
|
|
||||||
it "installs" do
|
|
||||||
bundle "config set path.system true"
|
|
||||||
gem_home = tmp("sudo_gem_home")
|
|
||||||
sudo "mkdir -p #{gem_home}"
|
|
||||||
sudo "chmod ugo-w #{gem_home}"
|
|
||||||
|
|
||||||
system_gems :bundler, :path => gem_home
|
|
||||||
|
|
||||||
gemfile <<-G
|
|
||||||
source "#{file_uri_for(gem_repo1)}"
|
|
||||||
gem "rack", '1.0'
|
|
||||||
G
|
|
||||||
|
|
||||||
bundle :install, :env => { "GEM_HOME" => gem_home.to_s, "GEM_PATH" => nil }
|
|
||||||
expect(gem_home.join("bin/rackup")).to exist
|
|
||||||
expect(the_bundle).to include_gems "rack 1.0", :env => { "GEM_HOME" => gem_home.to_s, "GEM_PATH" => nil }
|
|
||||||
|
|
||||||
sudo "rm -rf #{tmp("sudo_gem_home")}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "and root runs install" do
|
|
||||||
let(:warning) { "Don't run Bundler as root." }
|
|
||||||
|
|
||||||
before do
|
|
||||||
gemfile %(source "#{file_uri_for(gem_repo1)}")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "warns against that" do
|
|
||||||
bundle :install, :sudo => :preserve_env
|
|
||||||
expect(err).to include(warning)
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when ENV['BUNDLE_SILENCE_ROOT_WARNING'] is set" do
|
|
||||||
it "skips the warning" do
|
|
||||||
bundle :install, :sudo => :preserve_env, :env => { "BUNDLE_SILENCE_ROOT_WARNING" => "true" }
|
|
||||||
expect(err).to_not include(warning)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when silence_root_warning = false" do
|
|
||||||
it "warns against that" do
|
|
||||||
bundle :install, :sudo => :preserve_env, :env => { "BUNDLE_SILENCE_ROOT_WARNING" => "false" }
|
|
||||||
expect(err).to include(warning)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -32,7 +32,8 @@ RSpec.describe "bundler plugin install" do
|
||||||
it "shows help when --help flag is given" do
|
it "shows help when --help flag is given" do
|
||||||
bundle "plugin install --help"
|
bundle "plugin install --help"
|
||||||
|
|
||||||
expect(out).to include("bundle plugin install PLUGINS # Install the plugin from the source")
|
# The help message defined in ../../lib/bundler/man/bundle-plugin.1.ronn will be output.
|
||||||
|
expect(out).to include("You can install, uninstall, and list plugin(s)")
|
||||||
end
|
end
|
||||||
|
|
||||||
context "plugin is already installed" do
|
context "plugin is already installed" do
|
||||||
|
@ -84,6 +85,26 @@ RSpec.describe "bundler plugin install" do
|
||||||
expect(out).to include("Using foo 1.1")
|
expect(out).to include("Using foo 1.1")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "installs when --branch specified" do
|
||||||
|
bundle "plugin install foo --branch main --source #{file_uri_for(gem_repo2)}"
|
||||||
|
|
||||||
|
expect(out).to include("Installed plugin foo")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "installs when --ref specified" do
|
||||||
|
bundle "plugin install foo --ref v1.2.3 --source #{file_uri_for(gem_repo2)}"
|
||||||
|
|
||||||
|
expect(out).to include("Installed plugin foo")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises error when both --branch and --ref options are specified" do
|
||||||
|
bundle "plugin install foo --source #{file_uri_for(gem_repo2)} --branch main --ref v1.2.3", :raise_on_error => false
|
||||||
|
|
||||||
|
expect(out).not_to include("Installed plugin foo")
|
||||||
|
|
||||||
|
expect(err).to include("You cannot specify `--branch` and `--ref` at the same time.")
|
||||||
|
end
|
||||||
|
|
||||||
it "works with different load paths" do
|
it "works with different load paths" do
|
||||||
build_repo2 do
|
build_repo2 do
|
||||||
build_plugin "testing" do |s|
|
build_plugin "testing" do |s|
|
||||||
|
|
|
@ -304,13 +304,7 @@ RSpec.describe "real source plugins" do
|
||||||
@install_path ||= begin
|
@install_path ||= begin
|
||||||
git_scope = "\#{base_name}-\#{shortref_for_path(revision)}"
|
git_scope = "\#{base_name}-\#{shortref_for_path(revision)}"
|
||||||
|
|
||||||
path = gem_install_dir.join(git_scope)
|
gem_install_dir.join(git_scope)
|
||||||
|
|
||||||
if !path.exist? && requires_sudo?
|
|
||||||
user_bundle_path.join(ruby_scope).join(git_scope)
|
|
||||||
else
|
|
||||||
path
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,6 @@ RSpec.describe "The library itself" do
|
||||||
git.allow_insecure
|
git.allow_insecure
|
||||||
inline
|
inline
|
||||||
trust-policy
|
trust-policy
|
||||||
use_gem_version_promoter_for_major_updates
|
|
||||||
]
|
]
|
||||||
|
|
||||||
all_settings = Hash.new {|h, k| h[k] = [] }
|
all_settings = Hash.new {|h, k| h[k] = [] }
|
||||||
|
|
|
@ -23,7 +23,6 @@ require_relative "support/indexes"
|
||||||
require_relative "support/matchers"
|
require_relative "support/matchers"
|
||||||
require_relative "support/permissions"
|
require_relative "support/permissions"
|
||||||
require_relative "support/platforms"
|
require_relative "support/platforms"
|
||||||
require_relative "support/sudo"
|
|
||||||
|
|
||||||
$debug = false
|
$debug = false
|
||||||
|
|
||||||
|
@ -40,7 +39,6 @@ RSpec.configure do |config|
|
||||||
config.include Spec::Matchers
|
config.include Spec::Matchers
|
||||||
config.include Spec::Path
|
config.include Spec::Path
|
||||||
config.include Spec::Platforms
|
config.include Spec::Platforms
|
||||||
config.include Spec::Sudo
|
|
||||||
config.include Spec::Permissions
|
config.include Spec::Permissions
|
||||||
|
|
||||||
# Enable flags like --only-failures and --next-failure
|
# Enable flags like --only-failures and --next-failure
|
||||||
|
@ -115,10 +113,6 @@ RSpec.configure do |config|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
config.before :each, :sudo => true do
|
|
||||||
Spec::Sudo.write_safe_config
|
|
||||||
end
|
|
||||||
|
|
||||||
config.after :suite do
|
config.after :suite do
|
||||||
FileUtils.rm_r Spec::Path.pristine_system_gem_path
|
FileUtils.rm_r Spec::Path.pristine_system_gem_path
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_relative "sudo"
|
|
||||||
|
|
||||||
class RequirementChecker < Proc
|
class RequirementChecker < Proc
|
||||||
def self.against(present)
|
def self.against(present)
|
||||||
provided = Gem::Version.new(present)
|
provided = Gem::Version.new(present)
|
||||||
|
@ -21,7 +19,6 @@ class RequirementChecker < Proc
|
||||||
end
|
end
|
||||||
|
|
||||||
RSpec.configure do |config|
|
RSpec.configure do |config|
|
||||||
config.filter_run_excluding :sudo => true
|
|
||||||
config.filter_run_excluding :realworld => true
|
config.filter_run_excluding :realworld => true
|
||||||
|
|
||||||
git_version = Bundler::Source::Git::GitProxy.new(nil, nil, nil).version
|
git_version = Bundler::Source::Git::GitProxy.new(nil, nil, nil).version
|
||||||
|
|
|
@ -78,9 +78,6 @@ module Spec
|
||||||
end
|
end
|
||||||
|
|
||||||
def bundle(cmd, options = {}, &block)
|
def bundle(cmd, options = {}, &block)
|
||||||
with_sudo = options.delete(:sudo)
|
|
||||||
sudo = with_sudo == :preserve_env ? "sudo -E --preserve-env=RUBYOPT" : "sudo" if with_sudo
|
|
||||||
|
|
||||||
bundle_bin = options.delete(:bundle_bin)
|
bundle_bin = options.delete(:bundle_bin)
|
||||||
bundle_bin ||= installed_bindir.join("bundle")
|
bundle_bin ||= installed_bindir.join("bundle")
|
||||||
|
|
||||||
|
@ -119,7 +116,7 @@ module Spec
|
||||||
end
|
end
|
||||||
end.join
|
end.join
|
||||||
|
|
||||||
ruby_cmd = build_ruby_cmd({ :sudo => sudo, :load_path => load_path, :requires => requires })
|
ruby_cmd = build_ruby_cmd({ :load_path => load_path, :requires => requires })
|
||||||
cmd = "#{ruby_cmd} #{bundle_bin} #{cmd}#{args}"
|
cmd = "#{ruby_cmd} #{bundle_bin} #{cmd}#{args}"
|
||||||
sys_exec(cmd, { :env => env, :dir => dir, :raise_on_error => raise_on_error }, &block)
|
sys_exec(cmd, { :env => env, :dir => dir, :raise_on_error => raise_on_error }, &block)
|
||||||
end
|
end
|
||||||
|
@ -146,8 +143,6 @@ module Spec
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_ruby_cmd(options = {})
|
def build_ruby_cmd(options = {})
|
||||||
sudo = options.delete(:sudo)
|
|
||||||
|
|
||||||
libs = options.delete(:load_path)
|
libs = options.delete(:load_path)
|
||||||
lib_option = libs ? "-I#{libs.join(File::PATH_SEPARATOR)}" : []
|
lib_option = libs ? "-I#{libs.join(File::PATH_SEPARATOR)}" : []
|
||||||
|
|
||||||
|
@ -155,7 +150,7 @@ module Spec
|
||||||
requires << "#{Path.spec_dir}/support/hax.rb"
|
requires << "#{Path.spec_dir}/support/hax.rb"
|
||||||
require_option = requires.map {|r| "-r#{r}" }
|
require_option = requires.map {|r| "-r#{r}" }
|
||||||
|
|
||||||
[sudo, Gem.ruby, *lib_option, *require_option].compact.join(" ")
|
[Gem.ruby, *lib_option, *require_option].compact.join(" ")
|
||||||
end
|
end
|
||||||
|
|
||||||
def gembin(cmd, options = {})
|
def gembin(cmd, options = {})
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Spec
|
|
||||||
module Sudo
|
|
||||||
def self.present?
|
|
||||||
@which_sudo ||= Bundler.which("sudo")
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.write_safe_config
|
|
||||||
File.write(Spec::Path.tmp("gitconfig"), "[safe]\n\tdirectory = #{Spec::Path.git_root}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def sudo(cmd)
|
|
||||||
raise "sudo not present" unless Sudo.present?
|
|
||||||
sys_exec("sudo #{cmd}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def chown_system_gems_to_root
|
|
||||||
sudo "chown -R root #{system_gem_path}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -463,14 +463,7 @@ class Gem::TestCase < Test::Unit::TestCase
|
||||||
|
|
||||||
Dir.chdir @current_dir
|
Dir.chdir @current_dir
|
||||||
|
|
||||||
# Prevent a race condition on removing TMPDIR being written by MJIT
|
|
||||||
if defined?(RubyVM::MJIT.enabled?) && RubyVM::MJIT.enabled?
|
|
||||||
RubyVM::MJIT.pause(wait: false)
|
|
||||||
end
|
|
||||||
FileUtils.rm_rf @tempdir
|
FileUtils.rm_rf @tempdir
|
||||||
if defined?(RubyVM::MJIT.enabled?) && RubyVM::MJIT.enabled?
|
|
||||||
RubyVM::MJIT.resume
|
|
||||||
end
|
|
||||||
|
|
||||||
ENV.replace(@orig_env)
|
ENV.replace(@orig_env)
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ GEM
|
||||||
unicode-display_width (2.1.0)
|
unicode-display_width (2.1.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
|
aarch64-linux
|
||||||
arm64-darwin-20
|
arm64-darwin-20
|
||||||
arm64-darwin-21
|
arm64-darwin-21
|
||||||
universal-java-11
|
universal-java-11
|
||||||
|
|
|
@ -50,6 +50,7 @@ GEM
|
||||||
unicode-display_width (2.1.0)
|
unicode-display_width (2.1.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
|
aarch64-linux
|
||||||
arm64-darwin-20
|
arm64-darwin-20
|
||||||
arm64-darwin-21
|
arm64-darwin-21
|
||||||
universal-java-11
|
universal-java-11
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue