bundler 2.3.26 → 2.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +228 -1
- data/README.md +3 -6
- data/bundler.gemspec +2 -2
- data/exe/bundle +1 -4
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/binstubs.rb +5 -1
- data/lib/bundler/cli/check.rb +1 -1
- data/lib/bundler/cli/common.rb +1 -0
- data/lib/bundler/cli/console.rb +2 -2
- data/lib/bundler/cli/doctor.rb +4 -6
- data/lib/bundler/cli/gem.rb +62 -40
- data/lib/bundler/cli/init.rb +2 -2
- data/lib/bundler/cli/install.rb +2 -3
- data/lib/bundler/cli/lock.rb +8 -5
- data/lib/bundler/cli/open.rb +6 -4
- data/lib/bundler/cli/outdated.rb +1 -3
- data/lib/bundler/cli/viz.rb +1 -1
- data/lib/bundler/cli.rb +45 -2
- data/lib/bundler/compact_index_client/cache.rb +1 -1
- data/lib/bundler/compact_index_client/updater.rb +40 -39
- data/lib/bundler/constants.rb +1 -1
- data/lib/bundler/current_ruby.rb +2 -0
- data/lib/bundler/definition.rb +99 -51
- data/lib/bundler/dependency.rb +13 -12
- data/lib/bundler/digest.rb +1 -1
- data/lib/bundler/dsl.rb +3 -3
- data/lib/bundler/endpoint_specification.rb +0 -4
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +3 -2
- data/lib/bundler/errors.rb +1 -11
- data/lib/bundler/fetcher/compact_index.rb +9 -11
- data/lib/bundler/fetcher/dependency.rb +2 -6
- data/lib/bundler/fetcher/downloader.rb +2 -5
- data/lib/bundler/fetcher.rb +4 -8
- data/lib/bundler/force_platform.rb +18 -0
- data/lib/bundler/friendly_errors.rb +0 -3
- data/lib/bundler/gem_version_promoter.rb +52 -86
- data/lib/bundler/graph.rb +3 -3
- data/lib/bundler/index.rb +7 -15
- data/lib/bundler/injector.rb +2 -2
- data/lib/bundler/inline.rb +8 -10
- data/lib/bundler/installer/parallel_installer.rb +3 -33
- data/lib/bundler/installer/standalone.rb +12 -8
- data/lib/bundler/installer.rb +9 -23
- data/lib/bundler/lazy_specification.rb +42 -42
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +16 -16
- data/lib/bundler/man/bundle-add.1 +1 -1
- data/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/lib/bundler/man/bundle-cache.1 +3 -3
- data/lib/bundler/man/bundle-cache.1.ronn +2 -2
- data/lib/bundler/man/bundle-check.1 +1 -1
- data/lib/bundler/man/bundle-clean.1 +1 -1
- data/lib/bundler/man/bundle-config.1 +2 -2
- data/lib/bundler/man/bundle-config.1.ronn +1 -1
- data/lib/bundler/man/bundle-console.1 +1 -1
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +5 -5
- data/lib/bundler/man/bundle-exec.1.ronn +5 -5
- data/lib/bundler/man/bundle-gem.1 +27 -37
- data/lib/bundler/man/bundle-gem.1.ronn +5 -5
- data/lib/bundler/man/bundle-help.1 +1 -1
- data/lib/bundler/man/bundle-info.1 +1 -1
- data/lib/bundler/man/bundle-init.1 +5 -1
- data/lib/bundler/man/bundle-init.1.ronn +2 -0
- data/lib/bundler/man/bundle-inject.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +1 -30
- data/lib/bundler/man/bundle-install.1.ronn +0 -29
- data/lib/bundler/man/bundle-list.1 +1 -1
- data/lib/bundler/man/bundle-lock.1 +1 -1
- data/lib/bundler/man/bundle-open.1 +22 -2
- data/lib/bundler/man/bundle-open.1.ronn +9 -1
- data/lib/bundler/man/bundle-outdated.1 +1 -1
- data/lib/bundler/man/bundle-platform.1 +2 -2
- data/lib/bundler/man/bundle-platform.1.ronn +1 -1
- data/lib/bundler/man/bundle-plugin.1 +1 -1
- data/lib/bundler/man/bundle-pristine.1 +1 -1
- data/lib/bundler/man/bundle-remove.1 +1 -1
- data/lib/bundler/man/bundle-show.1 +1 -1
- data/lib/bundler/man/bundle-update.1 +1 -1
- data/lib/bundler/man/bundle-version.1 +1 -1
- data/lib/bundler/man/bundle-viz.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -1
- data/lib/bundler/man/gemfile.5 +1 -1
- data/lib/bundler/mirror.rb +5 -7
- data/lib/bundler/plugin/index.rb +4 -4
- data/lib/bundler/plugin/installer/rubygems.rb +0 -4
- data/lib/bundler/plugin/installer.rb +5 -2
- data/lib/bundler/plugin.rb +1 -1
- data/lib/bundler/remote_specification.rb +2 -6
- data/lib/bundler/resolver/base.rb +72 -15
- data/lib/bundler/resolver/candidate.rb +94 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +72 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +26 -36
- data/lib/bundler/resolver.rb +311 -278
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +16 -9
- data/lib/bundler/rubygems_gem_installer.rb +4 -2
- data/lib/bundler/rubygems_integration.rb +10 -14
- data/lib/bundler/runtime.rb +1 -5
- data/lib/bundler/safe_marshal.rb +31 -0
- data/lib/bundler/settings.rb +1 -7
- data/lib/bundler/setup.rb +4 -1
- data/lib/bundler/shared_helpers.rb +2 -1
- data/lib/bundler/source/git/git_proxy.rb +214 -69
- data/lib/bundler/source/git.rb +17 -18
- data/lib/bundler/source/metadata.rb +0 -1
- data/lib/bundler/source/path/installer.rb +1 -22
- data/lib/bundler/source/path.rb +6 -6
- data/lib/bundler/source/rubygems.rb +19 -77
- data/lib/bundler/source_list.rb +8 -2
- data/lib/bundler/spec_set.rb +22 -14
- data/lib/bundler/templates/Executable +1 -1
- data/lib/bundler/templates/Executable.bundler +5 -10
- data/lib/bundler/templates/Executable.standalone +2 -0
- data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
- data/lib/bundler/templates/newgem/README.md.tt +6 -4
- data/lib/bundler/templates/newgem/Rakefile.tt +12 -1
- data/lib/bundler/templates/newgem/bin/console.tt +0 -4
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
- data/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
- data/lib/bundler/ui/shell.rb +35 -12
- data/lib/bundler/ui/silent.rb +21 -5
- data/lib/bundler/uri_normalizer.rb +23 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
- data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +243 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
- data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
- data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
- data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
- data/lib/bundler/vendored_persistent.rb +1 -33
- data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
- data/lib/bundler/version.rb +5 -1
- data/lib/bundler/worker.rb +5 -7
- data/lib/bundler.rb +17 -69
- metadata +35 -33
- data/lib/bundler/templates/gems.rb +0 -5
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
- data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/lib/bundler/vendor/molinillo/LICENSE +0 -9
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
- data/lib/bundler/vendored_molinillo.rb +0 -4
- data/lib/bundler/version_ranges.rb +0 -122
data/lib/bundler/dsl.rb
CHANGED
|
@@ -277,8 +277,8 @@ module Bundler
|
|
|
277
277
|
if repo_name =~ GITHUB_PULL_REQUEST_URL
|
|
278
278
|
{
|
|
279
279
|
"git" => "https://github.com/#{$1}.git",
|
|
280
|
-
"branch" =>
|
|
281
|
-
"ref" =>
|
|
280
|
+
"branch" => nil,
|
|
281
|
+
"ref" => "refs/pull/#{$2}/head",
|
|
282
282
|
"tag" => nil,
|
|
283
283
|
}
|
|
284
284
|
else
|
|
@@ -324,7 +324,7 @@ module Bundler
|
|
|
324
324
|
if name.is_a?(Symbol)
|
|
325
325
|
raise GemfileError, %(You need to specify gem names as Strings. Use 'gem "#{name}"' instead)
|
|
326
326
|
end
|
|
327
|
-
if
|
|
327
|
+
if /\s/.match?(name)
|
|
328
328
|
raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
|
|
329
329
|
end
|
|
330
330
|
raise GemfileError, %(an empty gem name is not valid) if name.empty?
|
data/lib/bundler/env.rb
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
module Bundler
|
|
4
4
|
class EnvironmentPreserver
|
|
5
|
-
INTENTIONALLY_NIL = "BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL"
|
|
5
|
+
INTENTIONALLY_NIL = "BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL"
|
|
6
6
|
BUNDLER_KEYS = %w[
|
|
7
7
|
BUNDLE_BIN_PATH
|
|
8
8
|
BUNDLE_GEMFILE
|
|
9
9
|
BUNDLER_VERSION
|
|
10
|
+
BUNDLER_SETUP
|
|
10
11
|
GEM_HOME
|
|
11
12
|
GEM_PATH
|
|
12
13
|
MANPATH
|
|
@@ -15,7 +16,7 @@ module Bundler
|
|
|
15
16
|
RUBYLIB
|
|
16
17
|
RUBYOPT
|
|
17
18
|
].map(&:freeze).freeze
|
|
18
|
-
BUNDLER_PREFIX = "BUNDLER_ORIG_"
|
|
19
|
+
BUNDLER_PREFIX = "BUNDLER_ORIG_"
|
|
19
20
|
|
|
20
21
|
def self.from_env
|
|
21
22
|
new(env_to_hash(ENV), BUNDLER_KEYS)
|
data/lib/bundler/errors.rb
CHANGED
|
@@ -21,16 +21,7 @@ module Bundler
|
|
|
21
21
|
class InstallError < BundlerError; status_code(5); end
|
|
22
22
|
|
|
23
23
|
# Internal error, should be rescued
|
|
24
|
-
class
|
|
25
|
-
attr_reader :conflicts
|
|
26
|
-
|
|
27
|
-
def initialize(conflicts, msg = nil)
|
|
28
|
-
super(msg)
|
|
29
|
-
@conflicts = conflicts
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
status_code(6)
|
|
33
|
-
end
|
|
24
|
+
class SolveFailure < BundlerError; status_code(6); end
|
|
34
25
|
|
|
35
26
|
class GemNotFound < BundlerError; status_code(7); end
|
|
36
27
|
class InstallHookError < BundlerError; status_code(8); end
|
|
@@ -55,7 +46,6 @@ module Bundler
|
|
|
55
46
|
class CyclicDependencyError < BundlerError; status_code(21); end
|
|
56
47
|
class GemfileLockNotFound < BundlerError; status_code(22); end
|
|
57
48
|
class PluginError < BundlerError; status_code(29); end
|
|
58
|
-
class SudoNotPermittedError < BundlerError; status_code(30); end
|
|
59
49
|
class ThreadCreationError < BundlerError; status_code(33); end
|
|
60
50
|
class APIResponseMismatchError < BundlerError; status_code(34); end
|
|
61
51
|
class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
|
|
@@ -12,17 +12,15 @@ module Bundler
|
|
|
12
12
|
method = instance_method(method_name)
|
|
13
13
|
undef_method(method_name)
|
|
14
14
|
define_method(method_name) do |*args, &blk|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
nil
|
|
25
|
-
end
|
|
15
|
+
method.bind(self).call(*args, &blk)
|
|
16
|
+
rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e
|
|
17
|
+
raise HTTPError, e.message
|
|
18
|
+
rescue AuthenticationRequiredError
|
|
19
|
+
# Fail since we got a 401 from the server.
|
|
20
|
+
raise
|
|
21
|
+
rescue HTTPError => e
|
|
22
|
+
Bundler.ui.trace(e)
|
|
23
|
+
nil
|
|
26
24
|
end
|
|
27
25
|
end
|
|
28
26
|
|
|
@@ -34,14 +34,10 @@ module Bundler
|
|
|
34
34
|
|
|
35
35
|
returned_gems = spec_list.map(&:first).uniq
|
|
36
36
|
specs(deps_list, full_dependency_list + returned_gems, spec_list + last_spec_list)
|
|
37
|
-
rescue MarshalError
|
|
37
|
+
rescue MarshalError, HTTPError, GemspecError
|
|
38
38
|
Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
|
|
39
39
|
Bundler.ui.debug "could not fetch from the dependency API, trying the full index"
|
|
40
40
|
nil
|
|
41
|
-
rescue HTTPError, GemspecError
|
|
42
|
-
Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
|
|
43
|
-
Bundler.ui.debug "could not fetch from the dependency API\nit's suggested to retry using the full index via `bundle install --full-index`"
|
|
44
|
-
nil
|
|
45
41
|
end
|
|
46
42
|
|
|
47
43
|
def dependency_specs(gem_names)
|
|
@@ -55,7 +51,7 @@ module Bundler
|
|
|
55
51
|
gem_list = []
|
|
56
52
|
gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names|
|
|
57
53
|
marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
|
|
58
|
-
gem_list.concat(Bundler.
|
|
54
|
+
gem_list.concat(Bundler.safe_load_marshal(marshalled_deps))
|
|
59
55
|
end
|
|
60
56
|
gem_list
|
|
61
57
|
end
|
|
@@ -61,14 +61,11 @@ module Bundler
|
|
|
61
61
|
req.basic_auth(user, password)
|
|
62
62
|
end
|
|
63
63
|
connection.request(uri, req)
|
|
64
|
-
rescue NoMethodError => e
|
|
65
|
-
raise unless ["undefined method", "use_ssl="].all? {|snippet| e.message.include? snippet }
|
|
66
|
-
raise LoadError.new("cannot load such file -- openssl")
|
|
67
64
|
rescue OpenSSL::SSL::SSLError
|
|
68
65
|
raise CertificateFailureError.new(uri)
|
|
69
66
|
rescue *HTTP_ERRORS => e
|
|
70
67
|
Bundler.ui.trace e
|
|
71
|
-
if e.is_a?(SocketError) || e.message
|
|
68
|
+
if e.is_a?(SocketError) || e.message.to_s.include?("host down:")
|
|
72
69
|
raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
|
|
73
70
|
"connection and try again."
|
|
74
71
|
else
|
|
@@ -80,7 +77,7 @@ module Bundler
|
|
|
80
77
|
private
|
|
81
78
|
|
|
82
79
|
def validate_uri_scheme!(uri)
|
|
83
|
-
return if
|
|
80
|
+
return if /\Ahttps?\z/.match?(uri.scheme)
|
|
84
81
|
raise InvalidOption,
|
|
85
82
|
"The request uri `#{uri}` has an invalid scheme (`#{uri.scheme}`). " \
|
|
86
83
|
"Did you mean `http` or `https`?"
|
data/lib/bundler/fetcher.rb
CHANGED
|
@@ -29,9 +29,7 @@ module Bundler
|
|
|
29
29
|
" is a chance you are experiencing a man-in-the-middle attack, but" \
|
|
30
30
|
" most likely your system doesn't have the CA certificates needed" \
|
|
31
31
|
" for verification. For information about OpenSSL certificates, see" \
|
|
32
|
-
" https://railsapps.github.io/openssl-certificate-verify-failed.html."
|
|
33
|
-
" To connect without using SSL, edit your Gemfile" \
|
|
34
|
-
" sources and change 'https' to 'http'."
|
|
32
|
+
" https://railsapps.github.io/openssl-certificate-verify-failed.html."
|
|
35
33
|
end
|
|
36
34
|
end
|
|
37
35
|
|
|
@@ -39,9 +37,7 @@ module Bundler
|
|
|
39
37
|
class SSLError < HTTPError
|
|
40
38
|
def initialize(msg = nil)
|
|
41
39
|
super msg || "Could not load OpenSSL.\n" \
|
|
42
|
-
"You must recompile Ruby with OpenSSL support
|
|
43
|
-
"Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL " \
|
|
44
|
-
"using RVM are available at rvm.io/packages/openssl."
|
|
40
|
+
"You must recompile Ruby with OpenSSL support."
|
|
45
41
|
end
|
|
46
42
|
end
|
|
47
43
|
|
|
@@ -106,11 +102,11 @@ module Bundler
|
|
|
106
102
|
uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
|
|
107
103
|
if uri.scheme == "file"
|
|
108
104
|
path = Bundler.rubygems.correct_for_windows_path(uri.path)
|
|
109
|
-
Bundler.
|
|
105
|
+
Bundler.safe_load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
|
|
110
106
|
elsif cached_spec_path = gemspec_cached_path(spec_file_name)
|
|
111
107
|
Bundler.load_gemspec(cached_spec_path)
|
|
112
108
|
else
|
|
113
|
-
Bundler.
|
|
109
|
+
Bundler.safe_load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
|
|
114
110
|
end
|
|
115
111
|
rescue MarshalError
|
|
116
112
|
raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module ForcePlatform
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
# The `:force_ruby_platform` value used by dependencies for resolution, and
|
|
8
|
+
# by locked specifications for materialization is `false` by default, except
|
|
9
|
+
# for TruffleRuby. TruffleRuby generally needs to force the RUBY platform
|
|
10
|
+
# variant unless the name is explicitly allowlisted.
|
|
11
|
+
|
|
12
|
+
def default_force_ruby_platform
|
|
13
|
+
return false unless RUBY_ENGINE == "truffleruby"
|
|
14
|
+
|
|
15
|
+
!Gem::Platform::REUSE_AS_BINARY_ON_TRUFFLERUBY.include?(name)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -36,9 +36,6 @@ module Bundler
|
|
|
36
36
|
end
|
|
37
37
|
when Thor::Error
|
|
38
38
|
Bundler.ui.error error.message
|
|
39
|
-
when LoadError
|
|
40
|
-
raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
|
|
41
|
-
Bundler.ui.error "\nCould not load OpenSSL. #{error.class}: #{error}\n#{error.backtrace.join("\n ")}"
|
|
42
39
|
when Interrupt
|
|
43
40
|
Bundler.ui.error "\nQuitting..."
|
|
44
41
|
Bundler.ui.trace error
|
|
@@ -7,14 +7,13 @@ module Bundler
|
|
|
7
7
|
# available dependency versions as found in its index, before returning it to
|
|
8
8
|
# to the resolution engine to select the best version.
|
|
9
9
|
class GemVersionPromoter
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
attr_reader :level, :locked_specs, :unlock_gems
|
|
10
|
+
attr_reader :level
|
|
11
|
+
attr_accessor :pre
|
|
13
12
|
|
|
14
13
|
# By default, strict is false, meaning every available version of a gem
|
|
15
14
|
# is returned from sort_versions. The order gives preference to the
|
|
16
15
|
# requested level (:patch, :minor, :major) but in complicated requirement
|
|
17
|
-
# cases some gems will by necessity
|
|
16
|
+
# cases some gems will by necessity be promoted past the requested level,
|
|
18
17
|
# or even reverted to older versions.
|
|
19
18
|
#
|
|
20
19
|
# If strict is set to true, the results from sort_versions will be
|
|
@@ -24,24 +23,13 @@ module Bundler
|
|
|
24
23
|
# existing in the referenced source.
|
|
25
24
|
attr_accessor :strict
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# Given a list of locked_specs and a list of gems to unlock creates a
|
|
30
|
-
# GemVersionPromoter instance.
|
|
26
|
+
# Creates a GemVersionPromoter instance.
|
|
31
27
|
#
|
|
32
|
-
# @param locked_specs [SpecSet] All current locked specs. Unlike Definition
|
|
33
|
-
# where this list is empty if all gems are being updated, this should
|
|
34
|
-
# always be populated for all gems so this class can properly function.
|
|
35
|
-
# @param unlock_gems [String] List of gem names being unlocked. If empty,
|
|
36
|
-
# all gems will be considered unlocked.
|
|
37
28
|
# @return [GemVersionPromoter]
|
|
38
|
-
def initialize
|
|
29
|
+
def initialize
|
|
39
30
|
@level = :major
|
|
40
31
|
@strict = false
|
|
41
|
-
@
|
|
42
|
-
@unlock_gems = unlock_gems
|
|
43
|
-
@sort_versions = {}
|
|
44
|
-
@prerelease_specified = {}
|
|
32
|
+
@pre = false
|
|
45
33
|
end
|
|
46
34
|
|
|
47
35
|
# @param value [Symbol] One of three Symbols: :major, :minor or :patch.
|
|
@@ -55,34 +43,19 @@ module Bundler
|
|
|
55
43
|
@level = v
|
|
56
44
|
end
|
|
57
45
|
|
|
58
|
-
# Given a
|
|
59
|
-
# gem, this method will return the Array of Specifications
|
|
60
|
-
# truncated if strict is true) in an order to give
|
|
61
|
-
# level (:major, :minor or :patch) when resolution
|
|
62
|
-
# best resolve all dependencies in the bundle.
|
|
63
|
-
# @param
|
|
64
|
-
# @param
|
|
65
|
-
# named in the @dep param.
|
|
46
|
+
# Given a Resolver::Package and an Array of Specifications of available
|
|
47
|
+
# versions for a gem, this method will return the Array of Specifications
|
|
48
|
+
# sorted (and possibly truncated if strict is true) in an order to give
|
|
49
|
+
# preference to the current level (:major, :minor or :patch) when resolution
|
|
50
|
+
# is deciding what versions best resolve all dependencies in the bundle.
|
|
51
|
+
# @param package [Resolver::Package] The package being resolved.
|
|
52
|
+
# @param specs [Specification] An array of Specifications for the package.
|
|
66
53
|
# @return [Specification] A new instance of the Specification Array sorted and
|
|
67
54
|
# possibly filtered.
|
|
68
|
-
def sort_versions(
|
|
69
|
-
|
|
70
|
-
gem_name = dep.name
|
|
71
|
-
|
|
72
|
-
# An Array per version returned, different entries for different platforms.
|
|
73
|
-
# We only need the version here so it's ok to hard code this to the first instance.
|
|
74
|
-
locked_spec = locked_specs[gem_name].first
|
|
55
|
+
def sort_versions(package, specs)
|
|
56
|
+
specs = filter_dep_specs(specs, package) if strict
|
|
75
57
|
|
|
76
|
-
|
|
77
|
-
filter_dep_specs(spec_groups, locked_spec)
|
|
78
|
-
else
|
|
79
|
-
sort_dep_specs(spec_groups, locked_spec)
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def reset
|
|
85
|
-
@sort_versions = {}
|
|
58
|
+
sort_dep_specs(specs, package)
|
|
86
59
|
end
|
|
87
60
|
|
|
88
61
|
# @return [bool] Convenience method for testing value of level variable.
|
|
@@ -95,79 +68,72 @@ module Bundler
|
|
|
95
68
|
level == :minor
|
|
96
69
|
end
|
|
97
70
|
|
|
71
|
+
# @return [bool] Convenience method for testing value of pre variable.
|
|
72
|
+
def pre?
|
|
73
|
+
pre == true
|
|
74
|
+
end
|
|
75
|
+
|
|
98
76
|
private
|
|
99
77
|
|
|
100
|
-
def filter_dep_specs(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
gsv = spec_group.version
|
|
104
|
-
lsv = locked_spec.version
|
|
78
|
+
def filter_dep_specs(specs, package)
|
|
79
|
+
locked_version = package.locked_version
|
|
80
|
+
return specs if locked_version.nil? || major?
|
|
105
81
|
|
|
106
|
-
|
|
82
|
+
specs.select do |spec|
|
|
83
|
+
gsv = spec.version
|
|
107
84
|
|
|
108
|
-
|
|
109
|
-
matches.uniq == [true] ? (gsv >= lsv) : false
|
|
110
|
-
else
|
|
111
|
-
true
|
|
112
|
-
end
|
|
113
|
-
end
|
|
85
|
+
must_match = minor? ? [0] : [0, 1]
|
|
114
86
|
|
|
115
|
-
|
|
87
|
+
all_match = must_match.all? {|idx| gsv.segments[idx] == locked_version.segments[idx] }
|
|
88
|
+
all_match && gsv >= locked_version
|
|
89
|
+
end
|
|
116
90
|
end
|
|
117
91
|
|
|
118
|
-
def sort_dep_specs(
|
|
119
|
-
|
|
120
|
-
@gem_name = locked_spec&.name
|
|
121
|
-
|
|
122
|
-
result = spec_groups.sort do |a, b|
|
|
123
|
-
@a_ver = a.version
|
|
124
|
-
@b_ver = b.version
|
|
92
|
+
def sort_dep_specs(specs, package)
|
|
93
|
+
locked_version = package.locked_version
|
|
125
94
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
95
|
+
result = specs.sort do |a, b|
|
|
96
|
+
unless package.prerelease_specified? || pre?
|
|
97
|
+
a_pre = a.prerelease?
|
|
98
|
+
b_pre = b.prerelease?
|
|
129
99
|
|
|
130
100
|
next -1 if a_pre && !b_pre
|
|
131
101
|
next 1 if b_pre && !a_pre
|
|
132
102
|
end
|
|
133
103
|
|
|
134
104
|
if major?
|
|
135
|
-
|
|
136
|
-
elsif either_version_older_than_locked
|
|
137
|
-
|
|
138
|
-
elsif segments_do_not_match(:major)
|
|
139
|
-
|
|
140
|
-
elsif !minor? && segments_do_not_match(:minor)
|
|
141
|
-
|
|
105
|
+
a <=> b
|
|
106
|
+
elsif either_version_older_than_locked?(a, b, locked_version)
|
|
107
|
+
a <=> b
|
|
108
|
+
elsif segments_do_not_match?(a, b, :major)
|
|
109
|
+
b <=> a
|
|
110
|
+
elsif !minor? && segments_do_not_match?(a, b, :minor)
|
|
111
|
+
b <=> a
|
|
142
112
|
else
|
|
143
|
-
|
|
113
|
+
a <=> b
|
|
144
114
|
end
|
|
145
115
|
end
|
|
146
|
-
post_sort(result)
|
|
116
|
+
post_sort(result, package.unlock?, locked_version)
|
|
147
117
|
end
|
|
148
118
|
|
|
149
|
-
def either_version_older_than_locked
|
|
150
|
-
|
|
119
|
+
def either_version_older_than_locked?(a, b, locked_version)
|
|
120
|
+
locked_version && (a.version < locked_version || b.version < locked_version)
|
|
151
121
|
end
|
|
152
122
|
|
|
153
|
-
def segments_do_not_match(level)
|
|
123
|
+
def segments_do_not_match?(a, b, level)
|
|
154
124
|
index = [:major, :minor].index(level)
|
|
155
|
-
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def unlocking_gem?
|
|
159
|
-
unlock_gems.empty? || (@gem_name && unlock_gems.include?(@gem_name))
|
|
125
|
+
a.segments[index] != b.segments[index]
|
|
160
126
|
end
|
|
161
127
|
|
|
162
128
|
# Specific version moves can't always reliably be done during sorting
|
|
163
129
|
# as not all elements are compared against each other.
|
|
164
|
-
def post_sort(result)
|
|
130
|
+
def post_sort(result, unlock, locked_version)
|
|
165
131
|
# default :major behavior in Bundler does not do this
|
|
166
132
|
return result if major?
|
|
167
|
-
if
|
|
133
|
+
if unlock || locked_version.nil?
|
|
168
134
|
result
|
|
169
135
|
else
|
|
170
|
-
move_version_to_end(result,
|
|
136
|
+
move_version_to_end(result, locked_version)
|
|
171
137
|
end
|
|
172
138
|
end
|
|
173
139
|
|
data/lib/bundler/graph.rb
CHANGED
|
@@ -114,10 +114,10 @@ module Bundler
|
|
|
114
114
|
@groups.each do |group|
|
|
115
115
|
g.add_nodes(
|
|
116
116
|
group, {
|
|
117
|
-
:style
|
|
117
|
+
:style => "filled",
|
|
118
118
|
:fillcolor => "#B9B9D5",
|
|
119
|
-
:shape
|
|
120
|
-
:fontsize
|
|
119
|
+
:shape => "box3d",
|
|
120
|
+
:fontsize => 16,
|
|
121
121
|
}.merge(@node_options[group])
|
|
122
122
|
)
|
|
123
123
|
end
|
data/lib/bundler/index.rb
CHANGED
|
@@ -13,8 +13,8 @@ module Bundler
|
|
|
13
13
|
attr_reader :specs, :all_specs, :sources
|
|
14
14
|
protected :specs, :all_specs
|
|
15
15
|
|
|
16
|
-
RUBY = "ruby"
|
|
17
|
-
NULL = "\0"
|
|
16
|
+
RUBY = "ruby"
|
|
17
|
+
NULL = "\0"
|
|
18
18
|
|
|
19
19
|
def initialize
|
|
20
20
|
@sources = []
|
|
@@ -70,7 +70,7 @@ module Bundler
|
|
|
70
70
|
case query
|
|
71
71
|
when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification then search_by_spec(query)
|
|
72
72
|
when String then specs_by_name(query)
|
|
73
|
-
when
|
|
73
|
+
when Array then specs_by_name_and_version(*query)
|
|
74
74
|
else
|
|
75
75
|
raise "You can't search for a #{query.inspect}."
|
|
76
76
|
end
|
|
@@ -157,20 +157,12 @@ module Bundler
|
|
|
157
157
|
|
|
158
158
|
private
|
|
159
159
|
|
|
160
|
-
def
|
|
161
|
-
|
|
160
|
+
def specs_by_name_and_version(name, version)
|
|
161
|
+
specs_by_name(name).select {|spec| spec.version == version }
|
|
162
162
|
end
|
|
163
163
|
|
|
164
|
-
def
|
|
165
|
-
@
|
|
166
|
-
specs = specs_by_name(dependency.name)
|
|
167
|
-
found = specs.select do |spec|
|
|
168
|
-
next true if spec.source.is_a?(Source::Gemspec)
|
|
169
|
-
dependency.matches_spec?(spec)
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
found
|
|
173
|
-
end
|
|
164
|
+
def specs_by_name(name)
|
|
165
|
+
@specs[name].values
|
|
174
166
|
end
|
|
175
167
|
|
|
176
168
|
EMPTY_SEARCH = [].freeze
|
data/lib/bundler/injector.rb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
module Bundler
|
|
4
4
|
class Injector
|
|
5
|
-
INJECTED_GEMS = "injected gems"
|
|
5
|
+
INJECTED_GEMS = "injected gems"
|
|
6
6
|
|
|
7
7
|
def self.inject(new_deps, options = {})
|
|
8
8
|
injector = new(new_deps, options)
|
|
@@ -235,7 +235,7 @@ module Bundler
|
|
|
235
235
|
|
|
236
236
|
gemfile.each_with_index do |line, index|
|
|
237
237
|
next unless !line.nil? && line.strip.start_with?(block_name)
|
|
238
|
-
if gemfile[index + 1]
|
|
238
|
+
if /^\s*end\s*$/.match?(gemfile[index + 1])
|
|
239
239
|
gemfile[index] = nil
|
|
240
240
|
gemfile[index + 1] = nil
|
|
241
241
|
end
|
data/lib/bundler/inline.rb
CHANGED
|
@@ -31,15 +31,16 @@
|
|
|
31
31
|
#
|
|
32
32
|
def gemfile(install = false, options = {}, &gemfile)
|
|
33
33
|
require_relative "../bundler"
|
|
34
|
+
Bundler.reset!
|
|
34
35
|
|
|
35
36
|
opts = options.dup
|
|
36
37
|
ui = opts.delete(:ui) { Bundler::UI::Shell.new }
|
|
37
|
-
ui.level = "silent" if opts.delete(:quiet)
|
|
38
|
+
ui.level = "silent" if opts.delete(:quiet) || !install
|
|
39
|
+
Bundler.ui = ui
|
|
38
40
|
raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
Bundler.with_unbundled_env do
|
|
41
43
|
Bundler.instance_variable_set(:@bundle_path, Pathname.new(Gem.dir))
|
|
42
|
-
old_gemfile = ENV["BUNDLE_GEMFILE"]
|
|
43
44
|
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"
|
|
44
45
|
|
|
45
46
|
Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
|
|
@@ -52,7 +53,6 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
|
52
53
|
def definition.lock(*); end
|
|
53
54
|
definition.validate_runtime!
|
|
54
55
|
|
|
55
|
-
Bundler.ui = install ? ui : Bundler::UI::Silent.new
|
|
56
56
|
if install || definition.missing_specs?
|
|
57
57
|
Bundler.settings.temporary(:inline => true, :no_install => false) do
|
|
58
58
|
installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
|
|
@@ -65,11 +65,9 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
|
65
65
|
runtime = Bundler::Runtime.new(nil, definition)
|
|
66
66
|
runtime.setup.require
|
|
67
67
|
end
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
ENV["BUNDLE_GEMFILE"] = ""
|
|
73
|
-
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
if ENV["BUNDLE_GEMFILE"].nil?
|
|
71
|
+
ENV["BUNDLE_GEMFILE"] = ""
|
|
74
72
|
end
|
|
75
73
|
end
|
|
@@ -53,10 +53,6 @@ module Bundler
|
|
|
53
53
|
@dependencies ||= all_dependencies.reject {|dep| ignorable_dependency? dep }
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
-
def missing_lockfile_dependencies(all_spec_names)
|
|
57
|
-
dependencies.reject {|dep| all_spec_names.include? dep.name }
|
|
58
|
-
end
|
|
59
|
-
|
|
60
56
|
# Represents all dependencies
|
|
61
57
|
def all_dependencies
|
|
62
58
|
@spec.dependencies
|
|
@@ -84,8 +80,6 @@ module Bundler
|
|
|
84
80
|
end
|
|
85
81
|
|
|
86
82
|
def call
|
|
87
|
-
check_for_corrupt_lockfile
|
|
88
|
-
|
|
89
83
|
if @rake
|
|
90
84
|
do_install(@rake, 0)
|
|
91
85
|
Gem::Specification.reset
|
|
@@ -116,43 +110,19 @@ module Bundler
|
|
|
116
110
|
|
|
117
111
|
warning = []
|
|
118
112
|
warning << "Your lockfile doesn't include a valid resolution."
|
|
119
|
-
warning << "You can fix this by regenerating your lockfile or
|
|
113
|
+
warning << "You can fix this by regenerating your lockfile or manually editing the bad locked gems to a version that satisfies all dependencies."
|
|
120
114
|
warning << "The unmet dependencies are:"
|
|
121
115
|
|
|
122
116
|
unmet_dependencies.each do |spec, unmet_spec_dependencies|
|
|
123
117
|
unmet_spec_dependencies.each do |unmet_spec_dependency|
|
|
124
|
-
|
|
118
|
+
found = @specs.find {|s| s.name == unmet_spec_dependency.name && !unmet_spec_dependency.matches_spec?(s.spec) }
|
|
119
|
+
warning << "* #{unmet_spec_dependency}, dependency of #{spec.full_name}, unsatisfied by #{found.full_name}"
|
|
125
120
|
end
|
|
126
121
|
end
|
|
127
122
|
|
|
128
123
|
Bundler.ui.warn(warning.join("\n"))
|
|
129
124
|
end
|
|
130
125
|
|
|
131
|
-
def check_for_corrupt_lockfile
|
|
132
|
-
missing_dependencies = @specs.map do |s|
|
|
133
|
-
[
|
|
134
|
-
s,
|
|
135
|
-
s.missing_lockfile_dependencies(@specs.map(&:name)),
|
|
136
|
-
]
|
|
137
|
-
end.reject {|a| a.last.empty? }
|
|
138
|
-
return if missing_dependencies.empty?
|
|
139
|
-
|
|
140
|
-
warning = []
|
|
141
|
-
warning << "Your lockfile was created by an old Bundler that left some things out."
|
|
142
|
-
if @size != 1
|
|
143
|
-
warning << "Because of the missing DEPENDENCIES, we can only install gems one at a time, instead of installing #{@size} at a time."
|
|
144
|
-
@size = 1
|
|
145
|
-
end
|
|
146
|
-
warning << "You can fix this by adding the missing gems to your Gemfile, running bundle install, and then removing the gems from your Gemfile."
|
|
147
|
-
warning << "The missing gems are:"
|
|
148
|
-
|
|
149
|
-
missing_dependencies.each do |spec, missing|
|
|
150
|
-
warning << "* #{missing.map(&:name).join(", ")} depended upon by #{spec.name}"
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
Bundler.ui.warn(warning.join("\n"))
|
|
154
|
-
end
|
|
155
|
-
|
|
156
126
|
private
|
|
157
127
|
|
|
158
128
|
def failed_specs
|