bundler 2.2.11 → 2.3.6
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 +414 -5
- data/README.md +1 -1
- data/bundler.gemspec +2 -3
- data/exe/bundle +7 -8
- data/lib/bundler/.document +1 -0
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli/cache.rb +1 -1
- data/lib/bundler/cli/check.rb +4 -2
- data/lib/bundler/cli/common.rb +15 -2
- data/lib/bundler/cli/doctor.rb +24 -5
- data/lib/bundler/cli/exec.rb +1 -6
- data/lib/bundler/cli/gem.rb +130 -26
- data/lib/bundler/cli/info.rb +16 -4
- data/lib/bundler/cli/install.rb +12 -27
- data/lib/bundler/cli/issue.rb +4 -3
- data/lib/bundler/cli/list.rb +7 -1
- data/lib/bundler/cli/lock.rb +5 -1
- data/lib/bundler/cli/open.rb +1 -2
- data/lib/bundler/cli/outdated.rb +10 -11
- data/lib/bundler/cli/platform.rb +1 -1
- data/lib/bundler/cli/remove.rb +1 -2
- data/lib/bundler/cli/update.rb +17 -8
- data/lib/bundler/cli.rb +41 -55
- data/lib/bundler/compact_index_client/cache.rb +0 -9
- data/lib/bundler/compact_index_client/updater.rb +10 -11
- data/lib/bundler/compact_index_client.rb +2 -8
- data/lib/bundler/current_ruby.rb +5 -4
- data/lib/bundler/definition.rb +147 -290
- data/lib/bundler/dependency.rb +5 -7
- data/lib/bundler/digest.rb +71 -0
- data/lib/bundler/dsl.rb +67 -66
- data/lib/bundler/endpoint_specification.rb +21 -11
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +4 -1
- data/lib/bundler/errors.rb +19 -3
- data/lib/bundler/feature_flag.rb +0 -4
- data/lib/bundler/fetcher/compact_index.rb +10 -15
- data/lib/bundler/fetcher/downloader.rb +9 -6
- data/lib/bundler/fetcher/index.rb +0 -27
- data/lib/bundler/fetcher.rb +10 -16
- data/lib/bundler/friendly_errors.rb +5 -32
- data/lib/bundler/gem_helper.rb +21 -16
- data/lib/bundler/index.rb +2 -7
- data/lib/bundler/injector.rb +12 -3
- data/lib/bundler/inline.rb +2 -1
- data/lib/bundler/installer/gem_installer.rb +4 -22
- data/lib/bundler/installer/parallel_installer.rb +36 -15
- data/lib/bundler/installer/standalone.rb +14 -9
- data/lib/bundler/installer.rb +8 -17
- data/lib/bundler/lazy_specification.rb +23 -2
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +16 -45
- data/lib/bundler/man/bundle-add.1 +10 -2
- data/lib/bundler/man/bundle-add.1.ronn +7 -1
- data/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/lib/bundler/man/bundle-cache.1 +1 -1
- 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 +23 -15
- data/lib/bundler/man/bundle-config.1.ronn +24 -17
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +1 -1
- data/lib/bundler/man/bundle-gem.1 +14 -1
- data/lib/bundler/man/bundle-gem.1.ronn +16 -0
- data/lib/bundler/man/bundle-info.1 +1 -1
- data/lib/bundler/man/bundle-init.1 +1 -1
- data/lib/bundler/man/bundle-inject.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +2 -2
- data/lib/bundler/man/bundle-install.1.ronn +2 -2
- 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 +1 -1
- data/lib/bundler/man/bundle-outdated.1 +1 -1
- data/lib/bundler/man/bundle-platform.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 +5 -5
- data/lib/bundler/man/bundle-update.1.ronn +5 -4
- data/lib/bundler/man/bundle-viz.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -1
- data/lib/bundler/man/gemfile.5 +28 -2
- data/lib/bundler/man/gemfile.5.ronn +9 -1
- data/lib/bundler/plugin/api/source.rb +22 -0
- data/lib/bundler/plugin/index.rb +4 -1
- data/lib/bundler/plugin/installer.rb +10 -10
- data/lib/bundler/plugin/source_list.rb +4 -0
- data/lib/bundler/plugin.rb +28 -8
- data/lib/bundler/process_lock.rb +1 -1
- data/lib/bundler/psyched_yaml.rb +1 -13
- data/lib/bundler/remote_specification.rb +7 -0
- data/lib/bundler/resolver/spec_group.rb +1 -25
- data/lib/bundler/resolver.rb +55 -147
- data/lib/bundler/retry.rb +1 -1
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +30 -8
- data/lib/bundler/rubygems_gem_installer.rb +68 -1
- data/lib/bundler/rubygems_integration.rb +43 -60
- data/lib/bundler/runtime.rb +18 -11
- data/lib/bundler/self_manager.rb +168 -0
- data/lib/bundler/settings.rb +96 -20
- data/lib/bundler/setup.rb +2 -2
- data/lib/bundler/shared_helpers.rb +4 -19
- data/lib/bundler/source/git/git_proxy.rb +8 -6
- data/lib/bundler/source/git.rb +22 -4
- data/lib/bundler/source/metadata.rb +1 -5
- data/lib/bundler/source/path/installer.rb +1 -1
- data/lib/bundler/source/path.rb +3 -1
- data/lib/bundler/source/rubygems.rb +111 -106
- data/lib/bundler/source/rubygems_aggregate.rb +68 -0
- data/lib/bundler/source.rb +21 -0
- data/lib/bundler/source_list.rb +100 -60
- data/lib/bundler/source_map.rb +58 -0
- data/lib/bundler/spec_set.rb +17 -31
- data/lib/bundler/stub_specification.rb +8 -0
- data/lib/bundler/templates/Executable.bundler +7 -7
- data/lib/bundler/templates/Gemfile +0 -2
- data/lib/bundler/templates/gems.rb +0 -3
- data/lib/bundler/templates/newgem/Gemfile.tt +5 -2
- data/lib/bundler/templates/newgem/README.md.tt +5 -3
- data/lib/bundler/templates/newgem/Rakefile.tt +15 -2
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +15 -6
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +18 -16
- data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
- data/lib/bundler/ui/shell.rb +1 -1
- data/lib/bundler/vendor/.document +1 -0
- data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +39 -74
- data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
- data/lib/bundler/vendor/molinillo/LICENSE +9 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -1
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +5 -5
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -2
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -2
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +9 -4
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +19 -1
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +22 -4
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +1 -1
- data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
- data/lib/bundler/vendor/tsort/lib/tsort.rb +453 -0
- data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
- data/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
- data/lib/bundler/vendor/uri/lib/uri.rb +0 -1
- data/lib/bundler/vendored_tsort.rb +4 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +19 -4
- data/lib/bundler.rb +28 -31
- metadata +27 -9
- data/lib/bundler/gemdeps.rb +0 -29
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
data/lib/bundler/resolver.rb
CHANGED
|
@@ -17,15 +17,14 @@ module Bundler
|
|
|
17
17
|
# ==== Returns
|
|
18
18
|
# <GemBundle>,nil:: If the list of dependencies can be resolved, a
|
|
19
19
|
# collection of gemspecs is returned. Otherwise, nil is returned.
|
|
20
|
-
def self.resolve(requirements,
|
|
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
|
-
resolver = new(
|
|
22
|
+
resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
|
|
23
23
|
result = resolver.start(requirements)
|
|
24
|
-
SpecSet.new(result)
|
|
24
|
+
SpecSet.new(SpecSet.new(result).for(requirements.reject{|dep| dep.name.end_with?("\0") }))
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
def initialize(
|
|
28
|
-
@index = index
|
|
27
|
+
def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
|
|
29
28
|
@source_requirements = source_requirements
|
|
30
29
|
@base = base
|
|
31
30
|
@resolver = Molinillo::Resolver.new(self, self)
|
|
@@ -40,10 +39,6 @@ module Bundler
|
|
|
40
39
|
@resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
|
|
41
40
|
@gem_version_promoter = gem_version_promoter
|
|
42
41
|
@use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
|
|
43
|
-
@lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.disable_multisource?
|
|
44
|
-
|
|
45
|
-
@variant_specific_names = []
|
|
46
|
-
@generic_names = ["Ruby\0", "RubyGems\0"]
|
|
47
42
|
end
|
|
48
43
|
|
|
49
44
|
def start(requirements)
|
|
@@ -53,7 +48,6 @@ module Bundler
|
|
|
53
48
|
verify_gemfile_dependencies_are_found!(requirements)
|
|
54
49
|
dg = @resolver.resolve(requirements, @base_dg)
|
|
55
50
|
dg.
|
|
56
|
-
tap {|resolved| validate_resolved_specs!(resolved) }.
|
|
57
51
|
map(&:payload).
|
|
58
52
|
reject {|sg| sg.name.end_with?("\0") }.
|
|
59
53
|
map(&:to_specs).
|
|
@@ -107,26 +101,15 @@ module Bundler
|
|
|
107
101
|
include Molinillo::SpecificationProvider
|
|
108
102
|
|
|
109
103
|
def dependencies_for(specification)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if @variant_specific_names.include?(specification.name)
|
|
113
|
-
@variant_specific_names |= all_dependencies.map(&:name) - @generic_names
|
|
114
|
-
else
|
|
115
|
-
generic_names, variant_specific_names = specification.partitioned_dependency_names_for_activated_platforms
|
|
116
|
-
@variant_specific_names |= variant_specific_names - @generic_names
|
|
117
|
-
@generic_names |= generic_names
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
all_dependencies
|
|
104
|
+
specification.dependencies_for_activated_platforms
|
|
121
105
|
end
|
|
122
106
|
|
|
123
107
|
def search_for(dependency_proxy)
|
|
124
108
|
platform = dependency_proxy.__platform
|
|
125
109
|
dependency = dependency_proxy.dep
|
|
126
110
|
name = dependency.name
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
results = index.search(dependency, @base[name])
|
|
111
|
+
@search_for[dependency_proxy] ||= begin
|
|
112
|
+
results = results_for(dependency, @base[name])
|
|
130
113
|
|
|
131
114
|
if vertex = @base_dg.vertex_named(name)
|
|
132
115
|
locked_requirement = vertex.payload.requirement
|
|
@@ -151,6 +134,7 @@ module Bundler
|
|
|
151
134
|
end
|
|
152
135
|
nested.reduce([]) do |groups, (version, specs)|
|
|
153
136
|
next groups if locked_requirement && !locked_requirement.satisfied_by?(version)
|
|
137
|
+
next groups unless specs.any? {|spec| spec.match_platform(platform) }
|
|
154
138
|
|
|
155
139
|
specs_by_platform = Hash.new do |current_specs, current_platform|
|
|
156
140
|
current_specs[current_platform] = select_best_platform_match(specs, current_platform)
|
|
@@ -162,7 +146,7 @@ module Bundler
|
|
|
162
146
|
next groups if @resolving_only_for_ruby
|
|
163
147
|
|
|
164
148
|
spec_group = SpecGroup.create_for(specs_by_platform, @platforms, platform)
|
|
165
|
-
groups << spec_group
|
|
149
|
+
groups << spec_group
|
|
166
150
|
|
|
167
151
|
groups
|
|
168
152
|
end
|
|
@@ -177,39 +161,18 @@ module Bundler
|
|
|
177
161
|
@gem_version_promoter.sort_versions(dependency, spec_groups)
|
|
178
162
|
end
|
|
179
163
|
end
|
|
164
|
+
end
|
|
180
165
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
search_result.each do |sg|
|
|
186
|
-
if @generic_names.include?(name)
|
|
187
|
-
@variant_specific_names -= [name]
|
|
188
|
-
sg.activate_all_platforms!
|
|
189
|
-
else
|
|
190
|
-
sg.activate_platform!(platform)
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
end
|
|
166
|
+
def index_for(dependency)
|
|
167
|
+
source_for(dependency.name).specs
|
|
168
|
+
end
|
|
194
169
|
|
|
195
|
-
|
|
170
|
+
def source_for(name)
|
|
171
|
+
@source_requirements[name] || @source_requirements[:default]
|
|
196
172
|
end
|
|
197
173
|
|
|
198
|
-
def
|
|
199
|
-
|
|
200
|
-
if source
|
|
201
|
-
source.specs
|
|
202
|
-
elsif @lockfile_uses_separate_rubygems_sources
|
|
203
|
-
Index.build do |idx|
|
|
204
|
-
if dependency.all_sources
|
|
205
|
-
dependency.all_sources.each {|s| idx.add_source(s.specs) if s }
|
|
206
|
-
else
|
|
207
|
-
idx.add_source @source_requirements[:default].specs
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
else
|
|
211
|
-
@index
|
|
212
|
-
end
|
|
174
|
+
def results_for(dependency, base)
|
|
175
|
+
index_for(dependency).search(dependency, base)
|
|
213
176
|
end
|
|
214
177
|
|
|
215
178
|
def name_for(dependency)
|
|
@@ -236,19 +199,8 @@ module Bundler
|
|
|
236
199
|
dependencies.map(&:dep) == other_dependencies.map(&:dep)
|
|
237
200
|
end
|
|
238
201
|
|
|
239
|
-
def relevant_sources_for_vertex(vertex)
|
|
240
|
-
if vertex.root?
|
|
241
|
-
[@source_requirements[vertex.name]]
|
|
242
|
-
elsif @lockfile_uses_separate_rubygems_sources
|
|
243
|
-
vertex.recursive_predecessors.map do |v|
|
|
244
|
-
@source_requirements[v.name]
|
|
245
|
-
end << @source_requirements[:default]
|
|
246
|
-
end
|
|
247
|
-
end
|
|
248
|
-
|
|
249
202
|
def sort_dependencies(dependencies, activated, conflicts)
|
|
250
203
|
dependencies.sort_by do |dependency|
|
|
251
|
-
dependency.all_sources = relevant_sources_for_vertex(activated.vertex_named(dependency.name))
|
|
252
204
|
name = name_for(dependency)
|
|
253
205
|
vertex = activated.vertex_named(name)
|
|
254
206
|
[
|
|
@@ -297,16 +249,11 @@ module Bundler
|
|
|
297
249
|
end
|
|
298
250
|
|
|
299
251
|
def verify_gemfile_dependencies_are_found!(requirements)
|
|
300
|
-
requirements.
|
|
252
|
+
requirements.map! do |requirement|
|
|
301
253
|
name = requirement.name
|
|
302
|
-
next if name == "bundler"
|
|
303
|
-
next unless search_for(requirement).empty?
|
|
304
|
-
|
|
305
|
-
cache_message = begin
|
|
306
|
-
" or in gems cached in #{Bundler.settings.app_cache_path}" if Bundler.app_cache.exist?
|
|
307
|
-
rescue GemfileNotFound
|
|
308
|
-
nil
|
|
309
|
-
end
|
|
254
|
+
next requirement if name == "bundler"
|
|
255
|
+
next requirement unless search_for(requirement).empty?
|
|
256
|
+
next unless requirement.current_platform?
|
|
310
257
|
|
|
311
258
|
if (base = @base[name]) && !base.empty?
|
|
312
259
|
version = base.first.version
|
|
@@ -316,32 +263,38 @@ module Bundler
|
|
|
316
263
|
"Try running `bundle update #{name}`\n\n" \
|
|
317
264
|
"If you are updating multiple gems in your Gemfile at once,\n" \
|
|
318
265
|
"try passing them all to `bundle update`"
|
|
319
|
-
elsif source = @source_requirements[name]
|
|
320
|
-
specs = source.specs[name]
|
|
321
|
-
versions_with_platforms = specs.map {|s| [s.version, s.platform] }
|
|
322
|
-
message = String.new("Could not find gem '#{SharedHelpers.pretty_dependency(requirement)}' in #{source}#{cache_message}.\n")
|
|
323
|
-
message << if versions_with_platforms.any?
|
|
324
|
-
"The source contains the following versions of '#{name}': #{formatted_versions_with_platforms(versions_with_platforms)}"
|
|
325
|
-
else
|
|
326
|
-
"The source does not contain any versions of '#{name}'"
|
|
327
|
-
end
|
|
328
266
|
else
|
|
329
|
-
message =
|
|
330
|
-
"listed in your Gemfile#{cache_message}."
|
|
267
|
+
message = gem_not_found_message(name, requirement, source_for(name))
|
|
331
268
|
end
|
|
332
269
|
raise GemNotFound, message
|
|
333
|
-
end
|
|
270
|
+
end.compact!
|
|
334
271
|
end
|
|
335
272
|
|
|
336
|
-
def
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
273
|
+
def gem_not_found_message(name, requirement, source, extra_message = "")
|
|
274
|
+
specs = source.specs.search(name)
|
|
275
|
+
matching_part = name
|
|
276
|
+
requirement_label = SharedHelpers.pretty_dependency(requirement)
|
|
277
|
+
cache_message = begin
|
|
278
|
+
" or in gems cached in #{Bundler.settings.app_cache_path}" if Bundler.app_cache.exist?
|
|
279
|
+
rescue GemfileNotFound
|
|
280
|
+
nil
|
|
281
|
+
end
|
|
282
|
+
specs_matching_requirement = specs.select {| spec| requirement.matches_spec?(spec) }
|
|
283
|
+
|
|
284
|
+
if specs_matching_requirement.any?
|
|
285
|
+
specs = specs_matching_requirement
|
|
286
|
+
matching_part = requirement_label
|
|
287
|
+
requirement_label = "#{requirement_label} #{requirement.__platform}"
|
|
343
288
|
end
|
|
344
|
-
|
|
289
|
+
|
|
290
|
+
message = String.new("Could not find gem '#{requirement_label}'#{extra_message} in #{source}#{cache_message}.\n")
|
|
291
|
+
|
|
292
|
+
if specs.any?
|
|
293
|
+
message << "\nThe source contains the following gems matching '#{matching_part}':\n"
|
|
294
|
+
message << specs.map {|s| " * #{s.full_name}" }.join("\n")
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
message
|
|
345
298
|
end
|
|
346
299
|
|
|
347
300
|
def version_conflict_message(e)
|
|
@@ -392,7 +345,7 @@ module Bundler
|
|
|
392
345
|
if other_bundler_required
|
|
393
346
|
o << "\n\n"
|
|
394
347
|
|
|
395
|
-
candidate_specs =
|
|
348
|
+
candidate_specs = source_for(:default_bundler).specs.search(conflict_dependency)
|
|
396
349
|
if candidate_specs.any?
|
|
397
350
|
target_version = candidate_specs.last.version
|
|
398
351
|
new_command = [File.basename($PROGRAM_NAME), "_#{target_version}_", *ARGV].join(" ")
|
|
@@ -406,39 +359,18 @@ module Bundler
|
|
|
406
359
|
o << "\n"
|
|
407
360
|
o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n)
|
|
408
361
|
o << %(the gems in your Gemfile, which may resolve the conflict.\n)
|
|
409
|
-
elsif !conflict.existing
|
|
362
|
+
elsif !conflict.existing && !name.end_with?("\0")
|
|
410
363
|
o << "\n"
|
|
411
364
|
|
|
412
|
-
|
|
413
|
-
[conflict.requirement.source]
|
|
414
|
-
elsif conflict.requirement.all_sources
|
|
415
|
-
conflict.requirement.all_sources
|
|
416
|
-
elsif @lockfile_uses_separate_rubygems_sources
|
|
417
|
-
# every conflict should have an explicit group of sources when we
|
|
418
|
-
# enforce strict pinning
|
|
419
|
-
raise "no source set for #{conflict}"
|
|
420
|
-
else
|
|
421
|
-
[]
|
|
422
|
-
end.compact.map(&:to_s).uniq.sort
|
|
423
|
-
|
|
424
|
-
metadata_requirement = name.end_with?("\0")
|
|
365
|
+
relevant_source = conflict.requirement.source || source_for(name)
|
|
425
366
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
o << "'" unless metadata_requirement
|
|
429
|
-
if conflict.requirement_trees.first.size > 1
|
|
430
|
-
o << ", which is required by "
|
|
431
|
-
o << "gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
|
|
432
|
-
end
|
|
433
|
-
o << " "
|
|
434
|
-
|
|
435
|
-
o << if relevant_sources.empty?
|
|
436
|
-
"in any of the sources.\n"
|
|
437
|
-
elsif metadata_requirement
|
|
438
|
-
"is not available in #{relevant_sources.join(" or ")}"
|
|
367
|
+
extra_message = if conflict.requirement_trees.first.size > 1
|
|
368
|
+
", which is required by gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
|
|
439
369
|
else
|
|
440
|
-
"
|
|
370
|
+
""
|
|
441
371
|
end
|
|
372
|
+
|
|
373
|
+
o << gem_not_found_message(name, conflict.requirement, relevant_source, extra_message)
|
|
442
374
|
end
|
|
443
375
|
end,
|
|
444
376
|
:version_for_spec => lambda {|spec| spec.version },
|
|
@@ -451,29 +383,5 @@ module Bundler
|
|
|
451
383
|
end
|
|
452
384
|
)
|
|
453
385
|
end
|
|
454
|
-
|
|
455
|
-
def validate_resolved_specs!(resolved_specs)
|
|
456
|
-
resolved_specs.each do |v|
|
|
457
|
-
name = v.name
|
|
458
|
-
next unless sources = relevant_sources_for_vertex(v)
|
|
459
|
-
sources.compact!
|
|
460
|
-
if default_index = sources.index(@source_requirements[:default])
|
|
461
|
-
sources.delete_at(default_index)
|
|
462
|
-
end
|
|
463
|
-
sources.reject! {|s| s.specs[name].empty? }
|
|
464
|
-
sources.uniq!
|
|
465
|
-
next if sources.size <= 1
|
|
466
|
-
|
|
467
|
-
multisource_disabled = Bundler.feature_flag.disable_multisource?
|
|
468
|
-
|
|
469
|
-
msg = ["The gem '#{name}' was found in multiple relevant sources."]
|
|
470
|
-
msg.concat sources.map {|s| " * #{s}" }.sort
|
|
471
|
-
msg << "You #{multisource_disabled ? :must : :should} add this gem to the source block for the source you wish it to be installed from."
|
|
472
|
-
msg = msg.join("\n")
|
|
473
|
-
|
|
474
|
-
raise SecurityError, msg if multisource_disabled
|
|
475
|
-
Bundler.ui.warn "Warning: #{msg}"
|
|
476
|
-
end
|
|
477
|
-
end
|
|
478
386
|
end
|
|
479
387
|
end
|
data/lib/bundler/retry.rb
CHANGED
|
@@ -49,7 +49,7 @@ module Bundler
|
|
|
49
49
|
raise e
|
|
50
50
|
end
|
|
51
51
|
return true unless name
|
|
52
|
-
Bundler.ui.info "" unless Bundler.ui.debug? # Add new line
|
|
52
|
+
Bundler.ui.info "" unless Bundler.ui.debug? # Add new line in case dots preceded this
|
|
53
53
|
Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", Bundler.ui.debug?
|
|
54
54
|
end
|
|
55
55
|
|
data/lib/bundler/ruby_version.rb
CHANGED
|
@@ -103,7 +103,7 @@ module Bundler
|
|
|
103
103
|
|
|
104
104
|
def self.system
|
|
105
105
|
ruby_engine = RUBY_ENGINE.dup
|
|
106
|
-
ruby_version =
|
|
106
|
+
ruby_version = RUBY_VERSION.dup
|
|
107
107
|
ruby_engine_version = RUBY_ENGINE_VERSION.dup
|
|
108
108
|
patchlevel = RUBY_PATCHLEVEL.to_s
|
|
109
109
|
|
data/lib/bundler/rubygems_ext.rb
CHANGED
|
@@ -85,6 +85,10 @@ module Gem
|
|
|
85
85
|
dependencies - development_dependencies
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
+
def deleted_gem?
|
|
89
|
+
!default_gem? && !File.directory?(full_gem_path)
|
|
90
|
+
end
|
|
91
|
+
|
|
88
92
|
private
|
|
89
93
|
|
|
90
94
|
def dependencies_to_gemfile(dependencies, group = nil)
|
|
@@ -105,7 +109,7 @@ module Gem
|
|
|
105
109
|
end
|
|
106
110
|
|
|
107
111
|
class Dependency
|
|
108
|
-
attr_accessor :source, :groups
|
|
112
|
+
attr_accessor :source, :groups
|
|
109
113
|
|
|
110
114
|
alias_method :eql?, :==
|
|
111
115
|
|
|
@@ -116,7 +120,7 @@ module Gem
|
|
|
116
120
|
end
|
|
117
121
|
|
|
118
122
|
def to_yaml_properties
|
|
119
|
-
instance_variables.reject {|p| ["@source", "@groups"
|
|
123
|
+
instance_variables.reject {|p| ["@source", "@groups"].include?(p.to_s) }
|
|
120
124
|
end
|
|
121
125
|
|
|
122
126
|
def to_lock
|
|
@@ -134,6 +138,8 @@ module Gem
|
|
|
134
138
|
class Requirement
|
|
135
139
|
module OrderIndependentComparison
|
|
136
140
|
def ==(other)
|
|
141
|
+
return unless Gem::Requirement === other
|
|
142
|
+
|
|
137
143
|
if _requirements_sorted? && other._requirements_sorted?
|
|
138
144
|
super
|
|
139
145
|
else
|
|
@@ -174,20 +180,36 @@ module Gem
|
|
|
174
180
|
end
|
|
175
181
|
end
|
|
176
182
|
|
|
183
|
+
require "rubygems/platform"
|
|
184
|
+
|
|
177
185
|
class Platform
|
|
178
186
|
JAVA = Gem::Platform.new("java") unless defined?(JAVA)
|
|
179
187
|
MSWIN = Gem::Platform.new("mswin32") unless defined?(MSWIN)
|
|
180
188
|
MSWIN64 = Gem::Platform.new("mswin64") unless defined?(MSWIN64)
|
|
181
189
|
MINGW = Gem::Platform.new("x86-mingw32") unless defined?(MINGW)
|
|
182
190
|
X64_MINGW = Gem::Platform.new("x64-mingw32") unless defined?(X64_MINGW)
|
|
191
|
+
end
|
|
183
192
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
193
|
+
Platform.singleton_class.module_eval do
|
|
194
|
+
unless Platform.singleton_methods.include?(:match_spec?)
|
|
195
|
+
def match_spec?(spec)
|
|
196
|
+
match_gem?(spec.platform, spec.name)
|
|
197
|
+
end
|
|
188
198
|
|
|
189
|
-
|
|
190
|
-
|
|
199
|
+
def match_gem?(platform, gem_name)
|
|
200
|
+
match_platforms?(platform, Gem.platforms)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
private
|
|
204
|
+
|
|
205
|
+
def match_platforms?(platform, platforms)
|
|
206
|
+
platforms.any? do |local_platform|
|
|
207
|
+
platform.nil? ||
|
|
208
|
+
local_platform == platform ||
|
|
209
|
+
(local_platform != Gem::Platform::RUBY && local_platform =~ platform)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
191
213
|
end
|
|
192
214
|
|
|
193
215
|
require "rubygems/util"
|
|
@@ -8,13 +8,68 @@ module Bundler
|
|
|
8
8
|
# Bundler needs to install gems regardless of binstub overwriting
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
+
def install
|
|
12
|
+
pre_install_checks
|
|
13
|
+
|
|
14
|
+
run_pre_install_hooks
|
|
15
|
+
|
|
16
|
+
spec.loaded_from = spec_file
|
|
17
|
+
|
|
18
|
+
# Completely remove any previous gem files
|
|
19
|
+
strict_rm_rf gem_dir
|
|
20
|
+
strict_rm_rf spec.extension_dir
|
|
21
|
+
|
|
22
|
+
SharedHelpers.filesystem_access(gem_dir, :create) do
|
|
23
|
+
FileUtils.mkdir_p gem_dir, :mode => 0o755
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
extract_files
|
|
27
|
+
|
|
28
|
+
build_extensions
|
|
29
|
+
write_build_info_file
|
|
30
|
+
run_post_build_hooks
|
|
31
|
+
|
|
32
|
+
generate_bin
|
|
33
|
+
generate_plugins
|
|
34
|
+
|
|
35
|
+
write_spec
|
|
36
|
+
|
|
37
|
+
SharedHelpers.filesystem_access("#{gem_home}/cache", :write) do
|
|
38
|
+
write_cache_file
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
say spec.post_install_message unless spec.post_install_message.nil?
|
|
42
|
+
|
|
43
|
+
run_post_install_hooks
|
|
44
|
+
|
|
45
|
+
spec
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def generate_plugins
|
|
49
|
+
return unless Gem::Installer.instance_methods(false).include?(:generate_plugins)
|
|
50
|
+
|
|
51
|
+
latest = Gem::Specification.stubs_for(spec.name).first
|
|
52
|
+
return if latest && latest.version > spec.version
|
|
53
|
+
|
|
54
|
+
ensure_writable_dir @plugins_dir
|
|
55
|
+
|
|
56
|
+
if spec.plugins.empty?
|
|
57
|
+
remove_plugins_for(spec, @plugins_dir)
|
|
58
|
+
else
|
|
59
|
+
regenerate_plugins_for(spec, @plugins_dir)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
11
63
|
def pre_install_checks
|
|
12
64
|
super && validate_bundler_checksum(options[:bundler_expected_checksum])
|
|
13
65
|
end
|
|
14
66
|
|
|
15
67
|
def build_extensions
|
|
16
68
|
extension_cache_path = options[:bundler_extension_cache_path]
|
|
17
|
-
|
|
69
|
+
unless extension_cache_path && extension_dir = spec.extension_dir
|
|
70
|
+
require "shellwords" unless Bundler.rubygems.provides?(">= 3.2.25")
|
|
71
|
+
return super
|
|
72
|
+
end
|
|
18
73
|
|
|
19
74
|
extension_dir = Pathname.new(extension_dir)
|
|
20
75
|
build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
|
|
@@ -24,6 +79,7 @@ module Bundler
|
|
|
24
79
|
FileUtils.cp_r extension_cache_path, spec.extension_dir
|
|
25
80
|
end
|
|
26
81
|
else
|
|
82
|
+
require "shellwords" # compensate missing require in rubygems before version 3.2.25
|
|
27
83
|
super
|
|
28
84
|
if extension_dir.directory? # not made for gems without extensions
|
|
29
85
|
SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
|
|
@@ -36,6 +92,17 @@ module Bundler
|
|
|
36
92
|
|
|
37
93
|
private
|
|
38
94
|
|
|
95
|
+
def strict_rm_rf(dir)
|
|
96
|
+
# FileUtils.rm_rf should probably rise in case of permission issues like
|
|
97
|
+
# `rm -rf` does. However, it fails to delete the folder silently due to
|
|
98
|
+
# https://github.com/ruby/fileutils/issues/57. It should probably be fixed
|
|
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
|
+
end
|
|
105
|
+
|
|
39
106
|
def validate_bundler_checksum(checksum)
|
|
40
107
|
return true if Bundler.settings[:disable_checksum_validation]
|
|
41
108
|
return true unless checksum
|