bundler 2.3.14 → 2.3.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +46 -0
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/current_ruby.rb +1 -1
- data/lib/bundler/definition.rb +16 -20
- data/lib/bundler/dependency.rb +3 -1
- data/lib/bundler/dsl.rb +6 -10
- data/lib/bundler/errors.rb +14 -4
- data/lib/bundler/fetcher/base.rb +6 -8
- data/lib/bundler/fetcher.rb +4 -0
- data/lib/bundler/friendly_errors.rb +21 -4
- data/lib/bundler/gem_helpers.rb +1 -0
- data/lib/bundler/index.rb +1 -5
- data/lib/bundler/injector.rb +4 -0
- data/lib/bundler/inline.rb +1 -11
- data/lib/bundler/installer/standalone.rb +29 -2
- data/lib/bundler/installer.rb +1 -10
- data/lib/bundler/lazy_specification.rb +2 -2
- data/lib/bundler/man/bundle-add.1 +1 -1
- data/lib/bundler/man/bundle-add.1.ronn +1 -1
- data/lib/bundler/match_platform.rb +0 -1
- data/lib/bundler/plugin/api/source.rb +3 -3
- data/lib/bundler/process_lock.rb +1 -1
- data/lib/bundler/resolver.rb +18 -21
- data/lib/bundler/rubygems_ext.rb +6 -5
- data/lib/bundler/rubygems_gem_installer.rb +11 -8
- data/lib/bundler/rubygems_integration.rb +3 -21
- data/lib/bundler/settings.rb +1 -1
- data/lib/bundler/source/git.rb +5 -7
- data/lib/bundler/source/rubygems.rb +80 -77
- data/lib/bundler/spec_set.rb +11 -8
- data/lib/bundler/stub_specification.rb +5 -3
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler.rb +11 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 364d4bc2c2c1f342aa034417b9e30074317878931bf34e90ddf6c42d3ae539c2
|
4
|
+
data.tar.gz: dad782afd5246e703b67d004c7282a89132f0ebe699d8e8306387fb8db179193
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 463cc7534f4164ae4d2e4c67d1ed57dcc9a40494c496f0b06e11ac8f2b3599ea0dbc74be8772a98abb2d09c119db2da8f1d85cde6bafe83319051de3e24a46f2
|
7
|
+
data.tar.gz: 61b997e77634dc3a7d812adb805f899bb8bbae48bd25aad2884906c818d21853e76fd0db8bfbd95ee79689c25567e346e9c468fbe1321768c2614518f0e78356
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,49 @@
|
|
1
|
+
# 2.3.17 (June 29, 2022)
|
2
|
+
|
3
|
+
## Enhancements:
|
4
|
+
|
5
|
+
- Add support for platform `:x64_mingw` to correctly lookup "x64-mingw-ucrt" [#5649](https://github.com/rubygems/rubygems/pull/5649)
|
6
|
+
- Fix some errors being printed twice in `--verbose` mode [#5654](https://github.com/rubygems/rubygems/pull/5654)
|
7
|
+
- Fix extension paths in generated standalone script [#5632](https://github.com/rubygems/rubygems/pull/5632)
|
8
|
+
|
9
|
+
## Bug fixes:
|
10
|
+
|
11
|
+
- Raise if ruby platform is forced and there are no ruby variants [#5495](https://github.com/rubygems/rubygems/pull/5495)
|
12
|
+
- Fix `bundle package --no-install` no longer skipping install [#5639](https://github.com/rubygems/rubygems/pull/5639)
|
13
|
+
|
14
|
+
## Performance:
|
15
|
+
|
16
|
+
- Improve performance of `Bundler::SpecSet#for` by using hash lookup of handled deps [#5537](https://github.com/rubygems/rubygems/pull/5537)
|
17
|
+
|
18
|
+
## Documentation:
|
19
|
+
|
20
|
+
- Fix formatting issue in `bundle add` man page [#5642](https://github.com/rubygems/rubygems/pull/5642)
|
21
|
+
|
22
|
+
# 2.3.16 (June 15, 2022)
|
23
|
+
|
24
|
+
## Performance:
|
25
|
+
|
26
|
+
- Improve performance of installing gems from gem server sources [#5614](https://github.com/rubygems/rubygems/pull/5614)
|
27
|
+
|
28
|
+
# 2.3.15 (June 1, 2022)
|
29
|
+
|
30
|
+
## Enhancements:
|
31
|
+
|
32
|
+
- Show better error when previous installation fails to be removed [#5564](https://github.com/rubygems/rubygems/pull/5564)
|
33
|
+
- Show exception cause in bug report template [#5563](https://github.com/rubygems/rubygems/pull/5563)
|
34
|
+
|
35
|
+
## Bug fixes:
|
36
|
+
|
37
|
+
- Fix `bundle remove` by invalidating cached `Bundle.definition` [#5443](https://github.com/rubygems/rubygems/pull/5443)
|
38
|
+
- Fix generated standalone script when it includes default gems [#5586](https://github.com/rubygems/rubygems/pull/5586)
|
39
|
+
- Skip duplicated dependency warning for gemspec dev deps [#5587](https://github.com/rubygems/rubygems/pull/5587)
|
40
|
+
- Give better conflict resolution advice [#5581](https://github.com/rubygems/rubygems/pull/5581)
|
41
|
+
- Fix crash when commenting out a mirror in configuration [#5576](https://github.com/rubygems/rubygems/pull/5576)
|
42
|
+
- Fix crash when installing gems with symlinks [#5570](https://github.com/rubygems/rubygems/pull/5570)
|
43
|
+
- Ignore `Errno::EROFS` errors when creating `bundler.lock` [#5580](https://github.com/rubygems/rubygems/pull/5580)
|
44
|
+
- Ignore `Errno::EPERM` errors when creating `bundler.lock` [#5579](https://github.com/rubygems/rubygems/pull/5579)
|
45
|
+
- Fix crash when printing resolution conflicts on metadata requirements [#5562](https://github.com/rubygems/rubygems/pull/5562)
|
46
|
+
|
1
47
|
# 2.3.14 (May 18, 2022)
|
2
48
|
|
3
49
|
## Bug fixes:
|
@@ -4,8 +4,8 @@ module Bundler
|
|
4
4
|
# Represents metadata from when the Bundler gem was built.
|
5
5
|
module BuildMetadata
|
6
6
|
# begin ivars
|
7
|
-
@built_at = "2022-
|
8
|
-
@git_commit_sha = "
|
7
|
+
@built_at = "2022-06-29".freeze
|
8
|
+
@git_commit_sha = "539b20c172".freeze
|
9
9
|
@release = true
|
10
10
|
# end ivars
|
11
11
|
|
data/lib/bundler/current_ruby.rb
CHANGED
@@ -78,7 +78,7 @@ module Bundler
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def x64_mingw?
|
81
|
-
Gem.win_platform? && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os
|
81
|
+
Gem.win_platform? && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os.start_with?("mingw") && Bundler.local_platform.cpu == "x64"
|
82
82
|
end
|
83
83
|
|
84
84
|
(KNOWN_MINOR_VERSIONS + KNOWN_MAJOR_VERSIONS).each do |version|
|
data/lib/bundler/definition.rb
CHANGED
@@ -255,20 +255,18 @@ module Bundler
|
|
255
255
|
#
|
256
256
|
# @return [SpecSet] resolved dependencies
|
257
257
|
def resolve
|
258
|
-
@resolve ||=
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
|
271
|
-
end
|
258
|
+
@resolve ||= if Bundler.frozen_bundle?
|
259
|
+
Bundler.ui.debug "Frozen, using resolution from the lockfile"
|
260
|
+
@locked_specs
|
261
|
+
elsif !unlocking? && nothing_changed?
|
262
|
+
Bundler.ui.debug("Found no changes, using resolution from the lockfile")
|
263
|
+
SpecSet.new(filter_specs(@locked_specs, @dependencies.select {|dep| @locked_specs[dep].any? }))
|
264
|
+
else
|
265
|
+
last_resolve = converge_locked_specs
|
266
|
+
# Run a resolve against the locally available gems
|
267
|
+
Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
|
268
|
+
expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true)
|
269
|
+
Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
|
272
270
|
end
|
273
271
|
end
|
274
272
|
|
@@ -735,12 +733,10 @@ module Bundler
|
|
735
733
|
end
|
736
734
|
|
737
735
|
def metadata_dependencies
|
738
|
-
@metadata_dependencies ||=
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
]
|
743
|
-
end
|
736
|
+
@metadata_dependencies ||= [
|
737
|
+
Dependency.new("Ruby\0", RubyVersion.system.gem_version),
|
738
|
+
Dependency.new("RubyGems\0", Gem::VERSION),
|
739
|
+
]
|
744
740
|
end
|
745
741
|
|
746
742
|
def expand_dependencies(dependencies, remote = false)
|
data/lib/bundler/dependency.rb
CHANGED
@@ -9,6 +9,7 @@ module Bundler
|
|
9
9
|
attr_reader :autorequire
|
10
10
|
attr_reader :groups, :platforms, :gemfile, :git, :github, :branch, :ref
|
11
11
|
|
12
|
+
# rubocop:disable Naming/VariableNumber
|
12
13
|
PLATFORM_MAP = {
|
13
14
|
:ruby => Gem::Platform::RUBY,
|
14
15
|
:ruby_18 => Gem::Platform::RUBY,
|
@@ -91,6 +92,7 @@ module Bundler
|
|
91
92
|
:x64_mingw_30 => Gem::Platform::X64_MINGW,
|
92
93
|
:x64_mingw_31 => Gem::Platform::X64_MINGW,
|
93
94
|
}.freeze
|
95
|
+
# rubocop:enable Naming/VariableNumber
|
94
96
|
|
95
97
|
def initialize(name, version, options = {}, &blk)
|
96
98
|
type = options["type"] || :runtime
|
@@ -120,7 +122,7 @@ module Bundler
|
|
120
122
|
end
|
121
123
|
|
122
124
|
def expanded_platforms
|
123
|
-
@expanded_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.uniq
|
125
|
+
@expanded_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.flatten.uniq
|
124
126
|
end
|
125
127
|
|
126
128
|
def should_include?
|
data/lib/bundler/dsl.rb
CHANGED
@@ -124,19 +124,17 @@ module Bundler
|
|
124
124
|
raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
|
125
125
|
"You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
|
126
126
|
"#{update_prompt}"
|
127
|
+
elsif current.source != dep.source
|
128
|
+
return if dep.type == :development
|
129
|
+
raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
|
130
|
+
"You specified that #{dep.name} (#{dep.requirement}) should come from " \
|
131
|
+
"#{current.source || "an unspecified source"} and #{dep.source}\n"
|
127
132
|
else
|
128
133
|
Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
|
129
134
|
"You should probably keep only one of them.\n" \
|
130
135
|
"Remove any duplicate entries and specify the gem only once.\n" \
|
131
136
|
"While it's not a problem now, it could cause errors if you change the version of one of them later."
|
132
137
|
end
|
133
|
-
|
134
|
-
if current.source != dep.source
|
135
|
-
return if dep.type == :development
|
136
|
-
raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
|
137
|
-
"You specified that #{dep.name} (#{dep.requirement}) should come from " \
|
138
|
-
"#{current.source || "an unspecified source"} and #{dep.source}\n"
|
139
|
-
end
|
140
138
|
end
|
141
139
|
end
|
142
140
|
|
@@ -513,9 +511,7 @@ module Bundler
|
|
513
511
|
# be raised.
|
514
512
|
#
|
515
513
|
def contents
|
516
|
-
@contents ||=
|
517
|
-
dsl_path && File.exist?(dsl_path) && File.read(dsl_path)
|
518
|
-
end
|
514
|
+
@contents ||= dsl_path && File.exist?(dsl_path) && File.read(dsl_path)
|
519
515
|
end
|
520
516
|
|
521
517
|
# The message of the exception reports the content of podspec for the
|
data/lib/bundler/errors.rb
CHANGED
@@ -41,12 +41,14 @@ module Bundler
|
|
41
41
|
class GemspecError < BundlerError; status_code(14); end
|
42
42
|
class InvalidOption < BundlerError; status_code(15); end
|
43
43
|
class ProductionError < BundlerError; status_code(16); end
|
44
|
+
|
44
45
|
class HTTPError < BundlerError
|
45
46
|
status_code(17)
|
46
47
|
def filter_uri(uri)
|
47
48
|
URICredentialsFilter.credential_filtered_uri(uri)
|
48
49
|
end
|
49
50
|
end
|
51
|
+
|
50
52
|
class RubyVersionMismatch < BundlerError; status_code(18); end
|
51
53
|
class SecurityError < BundlerError; status_code(19); end
|
52
54
|
class LockfileError < BundlerError; status_code(20); end
|
@@ -79,10 +81,6 @@ module Bundler
|
|
79
81
|
case @permission_type
|
80
82
|
when :create
|
81
83
|
"executable permissions for all parent directories and write permissions for `#{parent_folder}`"
|
82
|
-
when :delete
|
83
|
-
permissions = "executable permissions for all parent directories and write permissions for `#{parent_folder}`"
|
84
|
-
permissions += ", and the same thing for all subdirectories inside #{@path}" if File.directory?(@path)
|
85
|
-
permissions
|
86
84
|
else
|
87
85
|
"#{@permission_type} permissions for that path"
|
88
86
|
end
|
@@ -172,4 +170,16 @@ module Bundler
|
|
172
170
|
|
173
171
|
status_code(32)
|
174
172
|
end
|
173
|
+
|
174
|
+
class DirectoryRemovalError < BundlerError
|
175
|
+
def initialize(orig_exception, msg)
|
176
|
+
full_message = "#{msg}.\n" \
|
177
|
+
"The underlying error was #{orig_exception.class}: #{orig_exception.message}, with backtrace:\n" \
|
178
|
+
" #{orig_exception.backtrace.join("\n ")}\n\n" \
|
179
|
+
"Bundler Error Backtrace:"
|
180
|
+
super(full_message)
|
181
|
+
end
|
182
|
+
|
183
|
+
status_code(36)
|
184
|
+
end
|
175
185
|
end
|
data/lib/bundler/fetcher/base.rb
CHANGED
@@ -19,14 +19,12 @@ module Bundler
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def fetch_uri
|
22
|
-
@fetch_uri ||=
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
remote_uri
|
29
|
-
end
|
22
|
+
@fetch_uri ||= if remote_uri.host == "rubygems.org"
|
23
|
+
uri = remote_uri.dup
|
24
|
+
uri.host = "index.rubygems.org"
|
25
|
+
uri
|
26
|
+
else
|
27
|
+
remote_uri
|
30
28
|
end
|
31
29
|
end
|
32
30
|
|
data/lib/bundler/fetcher.rb
CHANGED
@@ -20,6 +20,7 @@ module Bundler
|
|
20
20
|
class TooManyRequestsError < HTTPError; end
|
21
21
|
# This error is raised if the API returns a 413 (only printed in verbose)
|
22
22
|
class FallbackError < HTTPError; end
|
23
|
+
|
23
24
|
# This is the error raised if OpenSSL fails the cert verification
|
24
25
|
class CertificateFailureError < HTTPError
|
25
26
|
def initialize(remote_uri)
|
@@ -33,6 +34,7 @@ module Bundler
|
|
33
34
|
" sources and change 'https' to 'http'."
|
34
35
|
end
|
35
36
|
end
|
37
|
+
|
36
38
|
# This is the error raised when a source is HTTPS and OpenSSL didn't load
|
37
39
|
class SSLError < HTTPError
|
38
40
|
def initialize(msg = nil)
|
@@ -42,6 +44,7 @@ module Bundler
|
|
42
44
|
"using RVM are available at rvm.io/packages/openssl."
|
43
45
|
end
|
44
46
|
end
|
47
|
+
|
45
48
|
# This error is raised if HTTP authentication is required, but not provided.
|
46
49
|
class AuthenticationRequiredError < HTTPError
|
47
50
|
def initialize(remote_uri)
|
@@ -52,6 +55,7 @@ module Bundler
|
|
52
55
|
"or by storing the credentials in the `#{Settings.key_for(remote_uri)}` environment variable"
|
53
56
|
end
|
54
57
|
end
|
58
|
+
|
55
59
|
# This error is raised if HTTP authentication is provided, but incorrect.
|
56
60
|
class BadAuthenticationError < HTTPError
|
57
61
|
def initialize(remote_uri)
|
@@ -29,8 +29,11 @@ module Bundler
|
|
29
29
|
Bundler.ui.error error.message
|
30
30
|
Bundler.ui.trace error.orig_exception
|
31
31
|
when BundlerError
|
32
|
-
Bundler.ui.
|
33
|
-
|
32
|
+
if Bundler.ui.debug?
|
33
|
+
Bundler.ui.trace error
|
34
|
+
else
|
35
|
+
Bundler.ui.error error.message, :wrap => true
|
36
|
+
end
|
34
37
|
when Thor::Error
|
35
38
|
Bundler.ui.error error.message
|
36
39
|
when LoadError
|
@@ -65,8 +68,7 @@ module Bundler
|
|
65
68
|
--- ERROR REPORT TEMPLATE -------------------------------------------------------
|
66
69
|
|
67
70
|
```
|
68
|
-
#{e
|
69
|
-
#{e.backtrace && e.backtrace.join("\n ").chomp}
|
71
|
+
#{exception_message(e)}
|
70
72
|
```
|
71
73
|
|
72
74
|
#{Bundler::Env.report}
|
@@ -85,6 +87,21 @@ module Bundler
|
|
85
87
|
EOS
|
86
88
|
end
|
87
89
|
|
90
|
+
def exception_message(error)
|
91
|
+
message = serialized_exception_for(error)
|
92
|
+
cause = error.cause
|
93
|
+
return message unless cause
|
94
|
+
|
95
|
+
message + serialized_exception_for(cause)
|
96
|
+
end
|
97
|
+
|
98
|
+
def serialized_exception_for(e)
|
99
|
+
<<-EOS.gsub(/^ {8}/, "")
|
100
|
+
#{e.class}: #{e.message}
|
101
|
+
#{e.backtrace && e.backtrace.join("\n ").chomp}
|
102
|
+
EOS
|
103
|
+
end
|
104
|
+
|
88
105
|
def issues_url(exception)
|
89
106
|
message = exception.message.lines.first.tr(":", " ").chomp
|
90
107
|
message = message.split("-").first if exception.is_a?(Errno)
|
data/lib/bundler/gem_helpers.rb
CHANGED
@@ -10,6 +10,7 @@ module Bundler
|
|
10
10
|
[Gem::Platform.new("universal-mingw32"), Gem::Platform.new("universal-mingw32")],
|
11
11
|
[Gem::Platform.new("x64-mingw32"), Gem::Platform.new("x64-mingw32")],
|
12
12
|
[Gem::Platform.new("x86_64-mingw32"), Gem::Platform.new("x64-mingw32")],
|
13
|
+
[Gem::Platform.new("x64-mingw-ucrt"), Gem::Platform.new("x64-mingw-ucrt")],
|
13
14
|
[Gem::Platform.new("mingw32"), Gem::Platform.new("x86-mingw32")],
|
14
15
|
].freeze
|
15
16
|
|
data/lib/bundler/index.rb
CHANGED
@@ -192,11 +192,7 @@ module Bundler
|
|
192
192
|
specs += base if base
|
193
193
|
found = specs.select do |spec|
|
194
194
|
next true if spec.source.is_a?(Source::Gemspec)
|
195
|
-
|
196
|
-
dependency.matches_spec?(spec)
|
197
|
-
else
|
198
|
-
dependency.matches_spec?(spec) && Gem::Platform.match_spec?(spec)
|
199
|
-
end
|
195
|
+
dependency.matches_spec?(spec)
|
200
196
|
end
|
201
197
|
|
202
198
|
found
|
data/lib/bundler/injector.rb
CHANGED
@@ -72,6 +72,10 @@ module Bundler
|
|
72
72
|
|
73
73
|
deps.each {|dep| Bundler.ui.confirm "#{SharedHelpers.pretty_dependency(dep, false)} was removed." }
|
74
74
|
end
|
75
|
+
|
76
|
+
# Invalidate the cached Bundler.definition.
|
77
|
+
# This prevents e.g. `bundle remove ...` from using outdated information.
|
78
|
+
Bundler.reset_paths!
|
75
79
|
end
|
76
80
|
|
77
81
|
private
|
data/lib/bundler/inline.rb
CHANGED
@@ -38,12 +38,7 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
38
38
|
raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?
|
39
39
|
|
40
40
|
begin
|
41
|
-
|
42
|
-
bundler_module = class << Bundler; self; end
|
43
|
-
bundler_module.send(:remove_method, :root)
|
44
|
-
def Bundler.root
|
45
|
-
Bundler::SharedHelpers.pwd.expand_path
|
46
|
-
end
|
41
|
+
Bundler.instance_variable_set(:@bundle_path, Pathname.new(Gem.dir))
|
47
42
|
old_gemfile = ENV["BUNDLE_GEMFILE"]
|
48
43
|
Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"
|
49
44
|
|
@@ -71,11 +66,6 @@ def gemfile(install = false, options = {}, &gemfile)
|
|
71
66
|
runtime.setup.require
|
72
67
|
end
|
73
68
|
ensure
|
74
|
-
if bundler_module
|
75
|
-
bundler_module.send(:remove_method, :root)
|
76
|
-
bundler_module.send(:define_method, :root, old_root)
|
77
|
-
end
|
78
|
-
|
79
69
|
if old_gemfile
|
80
70
|
ENV["BUNDLE_GEMFILE"] = old_gemfile
|
81
71
|
else
|
@@ -12,6 +12,7 @@ module Bundler
|
|
12
12
|
end
|
13
13
|
File.open File.join(bundler_path, "setup.rb"), "w" do |file|
|
14
14
|
file.puts "require 'rbconfig'"
|
15
|
+
file.puts define_path_helpers
|
15
16
|
file.puts reverse_rubygems_kernel_mixin
|
16
17
|
paths.each do |path|
|
17
18
|
if Pathname.new(path).absolute?
|
@@ -29,14 +30,20 @@ module Bundler
|
|
29
30
|
@specs.map do |spec|
|
30
31
|
next if spec.name == "bundler"
|
31
32
|
Array(spec.require_paths).map do |path|
|
32
|
-
gem_path(path, spec).
|
33
|
+
gem_path(path, spec).
|
34
|
+
sub(version_dir, '#{RUBY_ENGINE}/#{Gem.ruby_api_version}').
|
35
|
+
sub(extensions_dir, 'extensions/\k<platform>/#{Gem.extension_api_version}')
|
33
36
|
# This is a static string intentionally. It's interpolated at a later time.
|
34
37
|
end
|
35
38
|
end.flatten.compact
|
36
39
|
end
|
37
40
|
|
38
41
|
def version_dir
|
39
|
-
"#{RUBY_ENGINE}/#{
|
42
|
+
"#{RUBY_ENGINE}/#{Gem.ruby_api_version}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def extensions_dir
|
46
|
+
%r{extensions/(?<platform>[^/]+)/#{Regexp.escape(Gem.extension_api_version)}}
|
40
47
|
end
|
41
48
|
|
42
49
|
def bundler_path
|
@@ -55,6 +62,26 @@ module Bundler
|
|
55
62
|
raise Gem::InvalidSpecificationException.new(error_message)
|
56
63
|
end
|
57
64
|
|
65
|
+
def define_path_helpers
|
66
|
+
<<~'END'
|
67
|
+
unless defined?(Gem)
|
68
|
+
module Gem
|
69
|
+
def self.ruby_api_version
|
70
|
+
RbConfig::CONFIG["ruby_version"]
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.extension_api_version
|
74
|
+
if 'no' == RbConfig::CONFIG['ENABLE_SHARED']
|
75
|
+
"#{ruby_api_version}-static"
|
76
|
+
else
|
77
|
+
ruby_api_version
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
END
|
83
|
+
end
|
84
|
+
|
58
85
|
def reverse_rubygems_kernel_mixin
|
59
86
|
<<~END
|
60
87
|
kernel = (class << ::Kernel; self; end)
|
data/lib/bundler/installer.rb
CHANGED
@@ -66,7 +66,7 @@ module Bundler
|
|
66
66
|
# require paths and save them in a `setup.rb` file. See `bundle standalone --help` for more
|
67
67
|
# information.
|
68
68
|
def run(options)
|
69
|
-
create_bundle_path
|
69
|
+
Bundler.create_bundle_path
|
70
70
|
|
71
71
|
ProcessLock.lock do
|
72
72
|
if Bundler.frozen_bundle?
|
@@ -262,15 +262,6 @@ module Bundler
|
|
262
262
|
end
|
263
263
|
end
|
264
264
|
|
265
|
-
def create_bundle_path
|
266
|
-
SharedHelpers.filesystem_access(Bundler.bundle_path.to_s) do |p|
|
267
|
-
Bundler.mkdir_p(p)
|
268
|
-
end unless Bundler.bundle_path.exist?
|
269
|
-
rescue Errno::EEXIST
|
270
|
-
raise PathError, "Could not install to path `#{Bundler.bundle_path}` " \
|
271
|
-
"because a file already exists at that path. Either remove or rename the file so the directory can be created."
|
272
|
-
end
|
273
|
-
|
274
265
|
# returns whether or not a re-resolve was needed
|
275
266
|
def resolve_if_needed(options)
|
276
267
|
if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
|
@@ -84,7 +84,7 @@ module Bundler
|
|
84
84
|
else
|
85
85
|
ruby_platform_materializes_to_ruby_platform? ? self : Dependency.new(name, version)
|
86
86
|
end
|
87
|
-
platform_object = Gem::Platform.new(platform)
|
87
|
+
platform_object = ruby_platform_materializes_to_ruby_platform? ? Gem::Platform.new(platform) : Gem::Platform.local
|
88
88
|
candidates = source.specs.search(search_object)
|
89
89
|
same_platform_candidates = candidates.select do |spec|
|
90
90
|
MatchPlatform.platforms_match?(spec.platform, platform_object)
|
@@ -152,7 +152,7 @@ module Bundler
|
|
152
152
|
# explicitly add a more specific platform.
|
153
153
|
#
|
154
154
|
def ruby_platform_materializes_to_ruby_platform?
|
155
|
-
!Bundler.most_specific_locked_platform?(
|
155
|
+
!Bundler.most_specific_locked_platform?(generic_local_platform) || Bundler.settings[:force_ruby_platform]
|
156
156
|
end
|
157
157
|
end
|
158
158
|
end
|
@@ -41,7 +41,7 @@ Specify version requirements(s) for the added gem\.
|
|
41
41
|
Specify the group(s) for the added gem\. Multiple groups should be separated by commas\.
|
42
42
|
.
|
43
43
|
.TP
|
44
|
-
\fB\-\-source\fR,
|
44
|
+
\fB\-\-source\fR, \fB\-s\fR
|
45
45
|
Specify the source for the added gem\.
|
46
46
|
.
|
47
47
|
.TP
|
@@ -27,7 +27,7 @@ bundle add rails --group "development, test"
|
|
27
27
|
* `--group`, `-g`:
|
28
28
|
Specify the group(s) for the added gem. Multiple groups should be separated by commas.
|
29
29
|
|
30
|
-
* `--source`,
|
30
|
+
* `--source`, `-s`:
|
31
31
|
Specify the source for the added gem.
|
32
32
|
|
33
33
|
* `--require`, `-r`:
|
@@ -15,7 +15,6 @@ module Bundler
|
|
15
15
|
return true if Gem::Platform::RUBY == gemspec_platform
|
16
16
|
return true if local_platform == gemspec_platform
|
17
17
|
gemspec_platform = Gem::Platform.new(gemspec_platform)
|
18
|
-
return true if GemHelpers.generic(gemspec_platform) === local_platform
|
19
18
|
return true if gemspec_platform === local_platform
|
20
19
|
|
21
20
|
false
|
@@ -258,7 +258,7 @@ module Bundler
|
|
258
258
|
@dependencies |= Array(names)
|
259
259
|
end
|
260
260
|
|
261
|
-
#
|
261
|
+
# NOTE: Do not override if you don't know what you are doing.
|
262
262
|
def can_lock?(spec)
|
263
263
|
spec.source == self
|
264
264
|
end
|
@@ -285,7 +285,7 @@ module Bundler
|
|
285
285
|
end
|
286
286
|
alias_method :identifier, :to_s
|
287
287
|
|
288
|
-
#
|
288
|
+
# NOTE: Do not override if you don't know what you are doing.
|
289
289
|
def include?(other)
|
290
290
|
other == self
|
291
291
|
end
|
@@ -294,7 +294,7 @@ module Bundler
|
|
294
294
|
SharedHelpers.digest(:SHA1).hexdigest(uri)
|
295
295
|
end
|
296
296
|
|
297
|
-
#
|
297
|
+
# NOTE: Do not override if you don't know what you are doing.
|
298
298
|
def gem_install_dir
|
299
299
|
Bundler.install_path
|
300
300
|
end
|
data/lib/bundler/process_lock.rb
CHANGED
@@ -12,7 +12,7 @@ module Bundler
|
|
12
12
|
yield
|
13
13
|
f.flock(File::LOCK_UN)
|
14
14
|
end
|
15
|
-
rescue Errno::EACCES, Errno::ENOLCK, Errno::ENOTSUP
|
15
|
+
rescue Errno::EACCES, Errno::ENOLCK, Errno::ENOTSUP, Errno::EPERM, Errno::EROFS
|
16
16
|
# In the case the user does not have access to
|
17
17
|
# create the lock file or is using NFS where
|
18
18
|
# locks are not available we skip locking.
|
data/lib/bundler/resolver.rb
CHANGED
@@ -19,13 +19,15 @@ module Bundler
|
|
19
19
|
# collection of gemspecs is returned. Otherwise, nil is returned.
|
20
20
|
def self.resolve(requirements, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil)
|
21
21
|
base = SpecSet.new(base) unless base.is_a?(SpecSet)
|
22
|
-
|
22
|
+
metadata_requirements, regular_requirements = requirements.partition {|dep| dep.name.end_with?("\0") }
|
23
|
+
resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
|
23
24
|
result = resolver.start(requirements)
|
24
|
-
SpecSet.new(SpecSet.new(result).for(
|
25
|
+
SpecSet.new(SpecSet.new(result).for(regular_requirements))
|
25
26
|
end
|
26
27
|
|
27
|
-
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
|
28
|
+
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
|
28
29
|
@source_requirements = source_requirements
|
30
|
+
@metadata_requirements = metadata_requirements
|
29
31
|
@base = base
|
30
32
|
@resolver = Molinillo::Resolver.new(self, self)
|
31
33
|
@search_for = {}
|
@@ -231,19 +233,17 @@ module Bundler
|
|
231
233
|
# before dependencies that are unconstrained
|
232
234
|
def amount_constrained(dependency)
|
233
235
|
@amount_constrained ||= {}
|
234
|
-
@amount_constrained[dependency.name] ||=
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
all = index_for(dependency).search(dependency.name).size
|
236
|
+
@amount_constrained[dependency.name] ||= if (base = @base[dependency.name]) && !base.empty?
|
237
|
+
dependency.requirement.satisfied_by?(base.first.version) ? 0 : 1
|
238
|
+
else
|
239
|
+
all = index_for(dependency).search(dependency.name).size
|
239
240
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
end
|
241
|
+
if all <= 1
|
242
|
+
all - 1_000_000
|
243
|
+
else
|
244
|
+
search = search_for(dependency)
|
245
|
+
search = @prerelease_specified[dependency.name] ? search.count : search.count {|s| !s.version.prerelease? }
|
246
|
+
search - all
|
247
247
|
end
|
248
248
|
end
|
249
249
|
end
|
@@ -284,7 +284,7 @@ module Bundler
|
|
284
284
|
if specs_matching_requirement.any?
|
285
285
|
specs = specs_matching_requirement
|
286
286
|
matching_part = requirement_label
|
287
|
-
requirement_label = "#{requirement_label} #{requirement.__platform}"
|
287
|
+
requirement_label = "#{requirement_label}' with platform '#{requirement.__platform}"
|
288
288
|
end
|
289
289
|
|
290
290
|
message = String.new("Could not find gem '#{requirement_label}'#{extra_message} in #{source}#{cache_message}.\n")
|
@@ -344,8 +344,6 @@ module Bundler
|
|
344
344
|
trees.sort_by! {|t| t.reverse.map(&:name) }
|
345
345
|
end
|
346
346
|
|
347
|
-
metadata_requirements = {}
|
348
|
-
|
349
347
|
o << trees.map do |tree|
|
350
348
|
t = "".dup
|
351
349
|
depth = 2
|
@@ -354,7 +352,6 @@ module Bundler
|
|
354
352
|
base_tree_name = base_tree.name
|
355
353
|
|
356
354
|
if base_tree_name.end_with?("\0")
|
357
|
-
metadata_requirements[base_tree_name] = base_tree
|
358
355
|
t = nil
|
359
356
|
else
|
360
357
|
tree.each do |req|
|
@@ -393,10 +390,10 @@ module Bundler
|
|
393
390
|
end
|
394
391
|
end
|
395
392
|
elsif name.end_with?("\0")
|
396
|
-
o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(metadata_requirements
|
393
|
+
o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
|
397
394
|
elsif conflict.locked_requirement
|
398
395
|
o << "\n"
|
399
|
-
o << %(
|
396
|
+
o << %(Deleting your #{name_for_locking_dependency_source} file and running `bundle install` will rebuild your snapshot from scratch, using only\n)
|
400
397
|
o << %(the gems in your Gemfile, which may resolve the conflict.\n)
|
401
398
|
elsif !conflict.existing
|
402
399
|
o << "\n"
|
data/lib/bundler/rubygems_ext.rb
CHANGED
@@ -216,11 +216,12 @@ module Gem
|
|
216
216
|
require "rubygems/platform"
|
217
217
|
|
218
218
|
class Platform
|
219
|
-
JAVA = Gem::Platform.new("java")
|
220
|
-
MSWIN = Gem::Platform.new("mswin32")
|
221
|
-
MSWIN64 = Gem::Platform.new("mswin64")
|
222
|
-
MINGW = Gem::Platform.new("x86-mingw32")
|
223
|
-
X64_MINGW = Gem::Platform.new("x64-mingw32")
|
219
|
+
JAVA = Gem::Platform.new("java")
|
220
|
+
MSWIN = Gem::Platform.new("mswin32")
|
221
|
+
MSWIN64 = Gem::Platform.new("mswin64")
|
222
|
+
MINGW = Gem::Platform.new("x86-mingw32")
|
223
|
+
X64_MINGW = [Gem::Platform.new("x64-mingw32"),
|
224
|
+
Gem::Platform.new("x64-mingw-ucrt")].freeze
|
224
225
|
end
|
225
226
|
|
226
227
|
Platform.singleton_class.module_eval do
|
@@ -90,17 +90,20 @@ module Bundler
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
+
def spec
|
94
|
+
if Bundler.rubygems.provides?("< 3.3.12") # RubyGems implementation rescues and re-raises errors before 3.3.12 and we don't want that
|
95
|
+
@package.spec
|
96
|
+
else
|
97
|
+
super
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
93
101
|
private
|
94
102
|
|
95
103
|
def strict_rm_rf(dir)
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
# inside `fileutils` but for now I`m checking whether the folder was
|
100
|
-
# removed after it completes, and raising otherwise.
|
101
|
-
FileUtils.rm_rf dir
|
102
|
-
|
103
|
-
raise PermissionError.new(dir, :delete) if File.directory?(dir)
|
104
|
+
Bundler.rm_rf dir
|
105
|
+
rescue Errno::ENOTEMPTY => e
|
106
|
+
raise DirectoryRemovalError.new(e.cause, "Could not delete previous installation of `#{dir}`")
|
104
107
|
end
|
105
108
|
|
106
109
|
def validate_bundler_checksum(checksum)
|
@@ -203,20 +203,9 @@ module Bundler
|
|
203
203
|
EXT_LOCK
|
204
204
|
end
|
205
205
|
|
206
|
-
def spec_from_gem(path
|
207
|
-
require "rubygems/
|
208
|
-
|
209
|
-
gem_from_path(path, security_policies[policy]).spec
|
210
|
-
rescue Exception, Gem::Exception, Gem::Security::Exception => e # rubocop:disable Lint/RescueException
|
211
|
-
if e.is_a?(Gem::Security::Exception) ||
|
212
|
-
e.message =~ /unknown trust policy|unsigned gem/i ||
|
213
|
-
e.message =~ /couldn't verify (meta)?data signature/i
|
214
|
-
raise SecurityError,
|
215
|
-
"The gem #{File.basename(path, ".gem")} can't be installed because " \
|
216
|
-
"the security policy didn't allow it, with the message: #{e.message}"
|
217
|
-
else
|
218
|
-
raise e
|
219
|
-
end
|
206
|
+
def spec_from_gem(path)
|
207
|
+
require "rubygems/package"
|
208
|
+
Gem::Package.new(path).spec
|
220
209
|
end
|
221
210
|
|
222
211
|
def build_gem(gem_dir, spec)
|
@@ -514,13 +503,6 @@ module Bundler
|
|
514
503
|
Gem::RemoteFetcher.new(proxy)
|
515
504
|
end
|
516
505
|
|
517
|
-
def gem_from_path(path, policy = nil)
|
518
|
-
require "rubygems/package"
|
519
|
-
p = Gem::Package.new(path)
|
520
|
-
p.security_policy = policy if policy
|
521
|
-
p
|
522
|
-
end
|
523
|
-
|
524
506
|
def build(spec, skip_validation = false)
|
525
507
|
require "rubygems/package"
|
526
508
|
Gem::Package.build(spec, skip_validation)
|
data/lib/bundler/settings.rb
CHANGED
@@ -487,7 +487,7 @@ module Bundler
|
|
487
487
|
/ix.freeze
|
488
488
|
|
489
489
|
def self.key_for(key)
|
490
|
-
key = normalize_uri(key).to_s if key.is_a?(String) &&
|
490
|
+
key = normalize_uri(key).to_s if key.is_a?(String) && key.start_with?("http", "mirror.http")
|
491
491
|
key = key.to_s.gsub(".", "__").gsub("-", "___").upcase
|
492
492
|
"BUNDLE_#{key}"
|
493
493
|
end
|
data/lib/bundler/source/git.rb
CHANGED
@@ -219,13 +219,11 @@ module Bundler
|
|
219
219
|
# across different projects, this cache will be shared.
|
220
220
|
# When using local git repos, this is set to the local repo.
|
221
221
|
def cache_path
|
222
|
-
@cache_path ||=
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
end.join("git", git_scope)
|
228
|
-
end
|
222
|
+
@cache_path ||= if Bundler.requires_sudo? || Bundler.feature_flag.global_gem_cache?
|
223
|
+
Bundler.user_cache
|
224
|
+
else
|
225
|
+
Bundler.bundle_path.join("cache", "bundler")
|
226
|
+
end.join("git", git_scope)
|
229
227
|
end
|
230
228
|
|
231
229
|
def app_cache_dirname
|
@@ -139,13 +139,9 @@ module Bundler
|
|
139
139
|
force = options[:force]
|
140
140
|
ensure_builtin_gems_cached = options[:ensure_builtin_gems_cached]
|
141
141
|
|
142
|
-
if ensure_builtin_gems_cached && spec.default_gem?
|
143
|
-
|
144
|
-
|
145
|
-
force = true
|
146
|
-
else
|
147
|
-
spec.loaded_from = loaded_from(spec)
|
148
|
-
end
|
142
|
+
if ensure_builtin_gems_cached && spec.default_gem? && !cached_path(spec)
|
143
|
+
cached_built_in_gem(spec) unless spec.remote
|
144
|
+
force = true
|
149
145
|
end
|
150
146
|
|
151
147
|
if installed?(spec) && !force
|
@@ -153,84 +149,92 @@ module Bundler
|
|
153
149
|
return nil # no post-install message
|
154
150
|
end
|
155
151
|
|
156
|
-
# Download the gem to get the spec, because some specs that are returned
|
157
|
-
# by rubygems.org are broken and wrong.
|
158
152
|
if spec.remote
|
159
153
|
# Check for this spec from other sources
|
160
|
-
uris = [spec.remote.anonymized_uri
|
161
|
-
uris += remotes_for_spec(spec).map(&:anonymized_uri)
|
162
|
-
uris.uniq!
|
154
|
+
uris = [spec.remote, *remotes_for_spec(spec)].map(&:anonymized_uri).uniq
|
163
155
|
Installer.ambiguous_gems << [spec.name, *uris] if uris.length > 1
|
164
156
|
|
165
157
|
path = fetch_gem(spec, options[:previous_spec])
|
166
|
-
|
167
|
-
|
168
|
-
|
158
|
+
else
|
159
|
+
path = cached_gem(spec)
|
160
|
+
raise GemNotFound, "Could not find #{spec.file_name} for installation" unless path
|
161
|
+
end
|
162
|
+
|
163
|
+
return if Bundler.settings[:no_install]
|
164
|
+
|
165
|
+
if requires_sudo?
|
166
|
+
install_path = Bundler.tmp(spec.full_name)
|
167
|
+
bin_path = install_path.join("bin")
|
168
|
+
else
|
169
|
+
install_path = rubygems_dir
|
170
|
+
bin_path = Bundler.system_bindir
|
171
|
+
end
|
172
|
+
|
173
|
+
Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
|
174
|
+
|
175
|
+
require_relative "../rubygems_gem_installer"
|
176
|
+
|
177
|
+
installer = Bundler::RubyGemsGemInstaller.at(
|
178
|
+
path,
|
179
|
+
:security_policy => Bundler.rubygems.security_policies[Bundler.settings["trust-policy"]],
|
180
|
+
:install_dir => install_path.to_s,
|
181
|
+
:bin_dir => bin_path.to_s,
|
182
|
+
:ignore_dependencies => true,
|
183
|
+
:wrappers => true,
|
184
|
+
:env_shebang => true,
|
185
|
+
:build_args => options[:build_args],
|
186
|
+
:bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum,
|
187
|
+
:bundler_extension_cache_path => extension_cache_path(spec)
|
188
|
+
)
|
189
|
+
|
190
|
+
if spec.remote
|
191
|
+
s = begin
|
192
|
+
installer.spec
|
169
193
|
rescue Gem::Package::FormatError
|
170
194
|
Bundler.rm_rf(path)
|
171
195
|
raise
|
196
|
+
rescue Gem::Security::Exception => e
|
197
|
+
raise SecurityError,
|
198
|
+
"The gem #{File.basename(path, ".gem")} can't be installed because " \
|
199
|
+
"the security policy didn't allow it, with the message: #{e.message}"
|
172
200
|
end
|
201
|
+
|
202
|
+
spec.__swap__(s)
|
173
203
|
end
|
174
204
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
Bundler.ui.confirm message
|
205
|
+
message = "Installing #{version_message(spec, options[:previous_spec])}"
|
206
|
+
message += " with native extensions" if spec.extensions.any?
|
207
|
+
Bundler.ui.confirm message
|
179
208
|
|
180
|
-
|
181
|
-
raise GemNotFound, "Could not find #{spec.file_name} for installation" unless path
|
182
|
-
if requires_sudo?
|
183
|
-
install_path = Bundler.tmp(spec.full_name)
|
184
|
-
bin_path = install_path.join("bin")
|
185
|
-
else
|
186
|
-
install_path = rubygems_dir
|
187
|
-
bin_path = Bundler.system_bindir
|
188
|
-
end
|
209
|
+
installed_spec = installer.install
|
189
210
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
:bundler_extension_cache_path => extension_cache_path(spec)
|
204
|
-
).install
|
205
|
-
spec.full_gem_path = installed_spec.full_gem_path
|
206
|
-
|
207
|
-
# SUDO HAX
|
208
|
-
if requires_sudo?
|
209
|
-
Bundler.rubygems.repository_subdirectories.each do |name|
|
210
|
-
src = File.join(install_path, name, "*")
|
211
|
-
dst = File.join(rubygems_dir, name)
|
212
|
-
if name == "extensions" && Dir.glob(src).any?
|
213
|
-
src = File.join(src, "*/*")
|
214
|
-
ext_src = Dir.glob(src).first
|
215
|
-
ext_src.gsub!(src[0..-6], "")
|
216
|
-
dst = File.dirname(File.join(dst, ext_src))
|
217
|
-
end
|
218
|
-
SharedHelpers.filesystem_access(dst) do |p|
|
219
|
-
Bundler.mkdir_p(p)
|
220
|
-
end
|
221
|
-
Bundler.sudo "cp -R #{src} #{dst}" if Dir[src].any?
|
211
|
+
spec.full_gem_path = installed_spec.full_gem_path
|
212
|
+
spec.loaded_from = installed_spec.loaded_from
|
213
|
+
|
214
|
+
# SUDO HAX
|
215
|
+
if requires_sudo?
|
216
|
+
Bundler.rubygems.repository_subdirectories.each do |name|
|
217
|
+
src = File.join(install_path, name, "*")
|
218
|
+
dst = File.join(rubygems_dir, name)
|
219
|
+
if name == "extensions" && Dir.glob(src).any?
|
220
|
+
src = File.join(src, "*/*")
|
221
|
+
ext_src = Dir.glob(src).first
|
222
|
+
ext_src.gsub!(src[0..-6], "")
|
223
|
+
dst = File.dirname(File.join(dst, ext_src))
|
222
224
|
end
|
225
|
+
SharedHelpers.filesystem_access(dst) do |p|
|
226
|
+
Bundler.mkdir_p(p)
|
227
|
+
end
|
228
|
+
Bundler.sudo "cp -R #{src} #{dst}" if Dir[src].any?
|
229
|
+
end
|
223
230
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
end
|
228
|
-
Bundler.sudo "cp -R #{install_path}/bin/#{exe} #{Bundler.system_bindir}/"
|
231
|
+
spec.executables.each do |exe|
|
232
|
+
SharedHelpers.filesystem_access(Bundler.system_bindir) do |p|
|
233
|
+
Bundler.mkdir_p(p)
|
229
234
|
end
|
235
|
+
Bundler.sudo "cp -R #{install_path}/bin/#{exe} #{Bundler.system_bindir}/"
|
230
236
|
end
|
231
|
-
installed_spec.loaded_from = loaded_from(spec)
|
232
237
|
end
|
233
|
-
spec.loaded_from = loaded_from(spec)
|
234
238
|
|
235
239
|
spec.post_install_message
|
236
240
|
ensure
|
@@ -348,10 +352,6 @@ module Bundler
|
|
348
352
|
end
|
349
353
|
end
|
350
354
|
|
351
|
-
def loaded_from(spec)
|
352
|
-
"#{rubygems_dir}/specifications/#{spec.full_name}.gemspec"
|
353
|
-
end
|
354
|
-
|
355
355
|
def cached_gem(spec)
|
356
356
|
if spec.default_gem?
|
357
357
|
cached_built_in_gem(spec)
|
@@ -364,10 +364,14 @@ module Bundler
|
|
364
364
|
global_cache_path = download_cache_path(spec)
|
365
365
|
@caches << global_cache_path if global_cache_path
|
366
366
|
|
367
|
-
possibilities = @caches.map {|p|
|
367
|
+
possibilities = @caches.map {|p| package_path(p, spec) }
|
368
368
|
possibilities.find {|p| File.exist?(p) }
|
369
369
|
end
|
370
370
|
|
371
|
+
def package_path(cache_path, spec)
|
372
|
+
"#{cache_path}/#{spec.file_name}"
|
373
|
+
end
|
374
|
+
|
371
375
|
def normalize_uri(uri)
|
372
376
|
uri = uri.to_s
|
373
377
|
uri = "#{uri}/" unless uri =~ %r{/$}
|
@@ -459,12 +463,11 @@ module Bundler
|
|
459
463
|
end
|
460
464
|
|
461
465
|
def fetch_gem(spec, previous_spec = nil)
|
462
|
-
return false unless spec.remote
|
463
|
-
|
464
466
|
spec.fetch_platform
|
465
467
|
|
466
468
|
cache_path = download_cache_path(spec) || default_cache_path_for(rubygems_dir)
|
467
|
-
gem_path =
|
469
|
+
gem_path = package_path(cache_path, spec)
|
470
|
+
return gem_path if File.exist?(gem_path)
|
468
471
|
|
469
472
|
if requires_sudo?
|
470
473
|
download_path = Bundler.tmp(spec.full_name)
|
@@ -482,7 +485,7 @@ module Bundler
|
|
482
485
|
SharedHelpers.filesystem_access(cache_path) do |p|
|
483
486
|
Bundler.mkdir_p(p)
|
484
487
|
end
|
485
|
-
Bundler.sudo "mv #{download_cache_path
|
488
|
+
Bundler.sudo "mv #{package_path(download_cache_path, spec)} #{gem_path}"
|
486
489
|
end
|
487
490
|
|
488
491
|
gem_path
|
@@ -499,7 +502,7 @@ module Bundler
|
|
499
502
|
end
|
500
503
|
|
501
504
|
def rubygems_dir
|
502
|
-
Bundler.
|
505
|
+
Bundler.bundle_path
|
503
506
|
end
|
504
507
|
|
505
508
|
def default_cache_path_for(dir)
|
data/lib/bundler/spec_set.rb
CHANGED
@@ -12,17 +12,19 @@ module Bundler
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def for(dependencies, check = false, match_current_platform = false)
|
15
|
-
|
15
|
+
# dep.name => [list, of, deps]
|
16
|
+
handled = Hash.new {|h, k| h[k] = [] }
|
16
17
|
deps = dependencies.dup
|
17
18
|
specs = []
|
18
19
|
|
19
20
|
loop do
|
20
21
|
break unless dep = deps.shift
|
21
|
-
next if handled.any? {|d|
|
22
|
+
next if handled[dep.name].any? {|d| match_current_platform || d.__platform == dep.__platform } || dep.name == "bundler"
|
22
23
|
|
23
|
-
|
24
|
+
# use a hash here to ensure constant lookup time in the `any?` call above
|
25
|
+
handled[dep.name] << dep
|
24
26
|
|
25
|
-
specs_for_dep =
|
27
|
+
specs_for_dep = specs_for_dependency(dep, match_current_platform)
|
26
28
|
if specs_for_dep.any?
|
27
29
|
specs.concat(specs_for_dep)
|
28
30
|
|
@@ -171,12 +173,13 @@ module Bundler
|
|
171
173
|
@specs.sort_by(&:name).each {|s| yield s }
|
172
174
|
end
|
173
175
|
|
174
|
-
def
|
175
|
-
|
176
|
+
def specs_for_dependency(dep, match_current_platform)
|
177
|
+
specs_for_name = lookup[dep.name]
|
176
178
|
if match_current_platform
|
177
|
-
GemHelpers.select_best_platform_match(
|
179
|
+
GemHelpers.select_best_platform_match(specs_for_name.select {|s| Gem::Platform.match_spec?(s) }, Bundler.local_platform)
|
178
180
|
else
|
179
|
-
GemHelpers.select_best_platform_match(
|
181
|
+
specs_for_name_and_platform = GemHelpers.select_best_platform_match(specs_for_name, dep.__platform)
|
182
|
+
specs_for_name_and_platform.any? ? specs_for_name_and_platform : specs_for_name
|
180
183
|
end
|
181
184
|
end
|
182
185
|
|
@@ -64,9 +64,11 @@ module Bundler
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def full_gem_path
|
67
|
-
|
68
|
-
|
69
|
-
|
67
|
+
stub.full_gem_path
|
68
|
+
end
|
69
|
+
|
70
|
+
def full_gem_path=(path)
|
71
|
+
stub.full_gem_path = path
|
70
72
|
end
|
71
73
|
|
72
74
|
def full_require_paths
|
data/lib/bundler/version.rb
CHANGED
data/lib/bundler.rb
CHANGED
@@ -97,6 +97,17 @@ module Bundler
|
|
97
97
|
@bundle_path ||= Pathname.new(configured_bundle_path.path).expand_path(root)
|
98
98
|
end
|
99
99
|
|
100
|
+
def create_bundle_path
|
101
|
+
SharedHelpers.filesystem_access(bundle_path.to_s) do |p|
|
102
|
+
mkdir_p(p)
|
103
|
+
end unless bundle_path.exist?
|
104
|
+
|
105
|
+
@bundle_path = bundle_path.realpath
|
106
|
+
rescue Errno::EEXIST
|
107
|
+
raise PathError, "Could not install to path `#{bundle_path}` " \
|
108
|
+
"because a file already exists at that path. Either remove or rename the file so the directory can be created."
|
109
|
+
end
|
110
|
+
|
100
111
|
def configured_bundle_path
|
101
112
|
@configured_bundle_path ||= settings.path.tap(&:validate!)
|
102
113
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bundler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- André Arko
|
@@ -22,7 +22,7 @@ authors:
|
|
22
22
|
autorequire:
|
23
23
|
bindir: exe
|
24
24
|
cert_chain: []
|
25
|
-
date: 2022-
|
25
|
+
date: 2022-06-29 00:00:00.000000000 Z
|
26
26
|
dependencies: []
|
27
27
|
description: Bundler manages an application's dependencies through its entire life,
|
28
28
|
across many machines, systematically and repeatably
|
@@ -369,7 +369,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
369
369
|
- !ruby/object:Gem::Version
|
370
370
|
version: 2.5.2
|
371
371
|
requirements: []
|
372
|
-
rubygems_version: 3.3.
|
372
|
+
rubygems_version: 3.3.17
|
373
373
|
signing_key:
|
374
374
|
specification_version: 4
|
375
375
|
summary: The best way to manage your application's dependencies
|