bundler 2.3.16 → 2.3.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +71 -0
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/cli/cache.rb +1 -1
  5. data/lib/bundler/cli/common.rb +1 -0
  6. data/lib/bundler/cli/install.rb +2 -0
  7. data/lib/bundler/cli.rb +6 -2
  8. data/lib/bundler/compact_index_client/updater.rb +16 -3
  9. data/lib/bundler/current_ruby.rb +1 -1
  10. data/lib/bundler/definition.rb +51 -18
  11. data/lib/bundler/dependency.rb +3 -2
  12. data/lib/bundler/dsl.rb +3 -3
  13. data/lib/bundler/friendly_errors.rb +5 -2
  14. data/lib/bundler/gem_helpers.rb +2 -0
  15. data/lib/bundler/incomplete_specification.rb +12 -0
  16. data/lib/bundler/index.rb +11 -17
  17. data/lib/bundler/installer/standalone.rb +29 -2
  18. data/lib/bundler/lazy_specification.rb +17 -8
  19. data/lib/bundler/lockfile_parser.rb +4 -0
  20. data/lib/bundler/man/bundle-add.1 +2 -2
  21. data/lib/bundler/man/bundle-add.1.ronn +1 -1
  22. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  23. data/lib/bundler/man/bundle-cache.1 +1 -1
  24. data/lib/bundler/man/bundle-check.1 +1 -1
  25. data/lib/bundler/man/bundle-clean.1 +1 -1
  26. data/lib/bundler/man/bundle-config.1 +13 -3
  27. data/lib/bundler/man/bundle-config.1.ronn +9 -2
  28. data/lib/bundler/man/bundle-doctor.1 +1 -1
  29. data/lib/bundler/man/bundle-exec.1 +2 -2
  30. data/lib/bundler/man/bundle-exec.1.ronn +1 -1
  31. data/lib/bundler/man/bundle-gem.1 +1 -1
  32. data/lib/bundler/man/bundle-info.1 +1 -1
  33. data/lib/bundler/man/bundle-init.1 +1 -1
  34. data/lib/bundler/man/bundle-inject.1 +5 -2
  35. data/lib/bundler/man/bundle-inject.1.ronn +3 -1
  36. data/lib/bundler/man/bundle-install.1 +1 -1
  37. data/lib/bundler/man/bundle-list.1 +1 -1
  38. data/lib/bundler/man/bundle-lock.1 +1 -1
  39. data/lib/bundler/man/bundle-open.1 +1 -1
  40. data/lib/bundler/man/bundle-outdated.1 +1 -1
  41. data/lib/bundler/man/bundle-platform.1 +1 -1
  42. data/lib/bundler/man/bundle-pristine.1 +1 -1
  43. data/lib/bundler/man/bundle-remove.1 +1 -1
  44. data/lib/bundler/man/bundle-show.1 +1 -1
  45. data/lib/bundler/man/bundle-update.1 +1 -1
  46. data/lib/bundler/man/bundle-viz.1 +4 -1
  47. data/lib/bundler/man/bundle-viz.1.ronn +2 -0
  48. data/lib/bundler/man/bundle.1 +3 -3
  49. data/lib/bundler/man/bundle.1.ronn +2 -2
  50. data/lib/bundler/man/gemfile.5 +77 -47
  51. data/lib/bundler/man/gemfile.5.ronn +75 -54
  52. data/lib/bundler/match_platform.rb +0 -1
  53. data/lib/bundler/remote_specification.rb +5 -4
  54. data/lib/bundler/resolver/spec_group.rb +5 -4
  55. data/lib/bundler/resolver.rb +11 -9
  56. data/lib/bundler/rubygems_ext.rb +6 -5
  57. data/lib/bundler/rubygems_gem_installer.rb +19 -12
  58. data/lib/bundler/runtime.rb +0 -1
  59. data/lib/bundler/settings.rb +1 -0
  60. data/lib/bundler/source/rubygems.rb +14 -6
  61. data/lib/bundler/spec_set.rb +31 -20
  62. data/lib/bundler/version.rb +1 -1
  63. data/lib/bundler.rb +1 -0
  64. metadata +4 -3
@@ -16,7 +16,8 @@ module Bundler
16
16
  def initialize(name, version, platform, spec_fetcher)
17
17
  @name = name
18
18
  @version = Gem::Version.create version
19
- @platform = platform
19
+ @original_platform = platform || Gem::Platform::RUBY
20
+ @platform = Gem::Platform.new(platform)
20
21
  @spec_fetcher = spec_fetcher
21
22
  @dependencies = nil
22
23
  end
@@ -35,10 +36,10 @@ module Bundler
35
36
  end
36
37
 
37
38
  def full_name
38
- if platform == Gem::Platform::RUBY || platform.nil?
39
+ if @original_platform == Gem::Platform::RUBY
39
40
  "#{@name}-#{@version}"
40
41
  else
41
- "#{@name}-#{@version}-#{platform}"
42
+ "#{@name}-#{@version}-#{@original_platform}"
42
43
  end
43
44
  end
44
45
 
@@ -105,7 +106,7 @@ module Bundler
105
106
  end
106
107
 
107
108
  def _remote_specification
108
- @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform])
109
+ @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @original_platform])
109
110
  @_remote_specification || raise(GemspecError, "Gemspec data for #{full_name} was" \
110
111
  " missing from the server! Try installing with `--full-index` as a workaround.")
111
112
  end
@@ -4,7 +4,7 @@ module Bundler
4
4
  class Resolver
5
5
  class SpecGroup
6
6
  attr_accessor :name, :version, :source
7
- attr_accessor :activated_platforms
7
+ attr_accessor :activated_platforms, :force_ruby_platform
8
8
 
9
9
  def self.create_for(specs, all_platforms, specific_platform)
10
10
  specific_platform_specs = specs[specific_platform]
@@ -35,6 +35,7 @@ module Bundler
35
35
 
36
36
  specs.map do |s|
37
37
  lazy_spec = LazySpecification.new(name, version, s.platform, source)
38
+ lazy_spec.force_ruby_platform = force_ruby_platform
38
39
  lazy_spec.dependencies.replace s.dependencies
39
40
  lazy_spec
40
41
  end
@@ -88,7 +89,7 @@ module Bundler
88
89
  dependencies = []
89
90
  @specs[platform].first.dependencies.each do |dep|
90
91
  next if dep.type == :development
91
- dependencies << DepProxy.get_proxy(dep, platform)
92
+ dependencies << DepProxy.get_proxy(Dependency.new(dep.name, dep.requirement), platform)
92
93
  end
93
94
  dependencies
94
95
  end
@@ -98,10 +99,10 @@ module Bundler
98
99
  return [] if spec.is_a?(LazySpecification)
99
100
  dependencies = []
100
101
  unless spec.required_ruby_version.none?
101
- dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
102
+ dependencies << DepProxy.get_proxy(Dependency.new("Ruby\0", spec.required_ruby_version), platform)
102
103
  end
103
104
  unless spec.required_rubygems_version.none?
104
- dependencies << DepProxy.get_proxy(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
105
+ dependencies << DepProxy.get_proxy(Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
105
106
  end
106
107
  dependencies
107
108
  end
@@ -22,17 +22,16 @@ module Bundler
22
22
  metadata_requirements, regular_requirements = requirements.partition {|dep| dep.name.end_with?("\0") }
23
23
  resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
24
24
  result = resolver.start(requirements)
25
- SpecSet.new(SpecSet.new(result).for(regular_requirements))
25
+ SpecSet.new(SpecSet.new(result).for(regular_requirements, false, platforms))
26
26
  end
27
27
 
28
28
  def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
29
29
  @source_requirements = source_requirements
30
30
  @metadata_requirements = metadata_requirements
31
- @base = base
32
31
  @resolver = Molinillo::Resolver.new(self, self)
33
32
  @search_for = {}
34
33
  @base_dg = Molinillo::DependencyGraph.new
35
- @base.each do |ls|
34
+ @base = base.materialized_for_resolution do |ls|
36
35
  dep = Dependency.new(ls.name, ls.version)
37
36
  @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
38
37
  end
@@ -111,7 +110,7 @@ module Bundler
111
110
  dependency = dependency_proxy.dep
112
111
  name = dependency.name
113
112
  @search_for[dependency_proxy] ||= begin
114
- results = results_for(dependency, @base[name])
113
+ results = results_for(dependency) + @base[name].select {|spec| requirement_satisfied_by?(dependency, nil, spec) }
115
114
 
116
115
  if vertex = @base_dg.vertex_named(name)
117
116
  locked_requirement = vertex.payload.requirement
@@ -143,9 +142,12 @@ module Bundler
143
142
  end
144
143
 
145
144
  spec_group_ruby = SpecGroup.create_for(specs_by_platform, [Gem::Platform::RUBY], Gem::Platform::RUBY)
146
- groups << spec_group_ruby if spec_group_ruby
145
+ if spec_group_ruby
146
+ spec_group_ruby.force_ruby_platform = dependency.force_ruby_platform
147
+ groups << spec_group_ruby
148
+ end
147
149
 
148
- next groups if @resolving_only_for_ruby
150
+ next groups if @resolving_only_for_ruby || dependency.force_ruby_platform
149
151
 
150
152
  spec_group = SpecGroup.create_for(specs_by_platform, @platforms, platform)
151
153
  groups << spec_group
@@ -173,8 +175,8 @@ module Bundler
173
175
  @source_requirements[name] || @source_requirements[:default]
174
176
  end
175
177
 
176
- def results_for(dependency, base)
177
- index_for(dependency).search(dependency, base)
178
+ def results_for(dependency)
179
+ index_for(dependency).search(dependency)
178
180
  end
179
181
 
180
182
  def name_for(dependency)
@@ -284,7 +286,7 @@ module Bundler
284
286
  if specs_matching_requirement.any?
285
287
  specs = specs_matching_requirement
286
288
  matching_part = requirement_label
287
- requirement_label = "#{requirement_label} #{requirement.__platform}"
289
+ requirement_label = "#{requirement_label}' with platform '#{requirement.__platform}"
288
290
  end
289
291
 
290
292
  message = String.new("Could not find gem '#{requirement_label}'#{extra_message} in #{source}#{cache_message}.\n")
@@ -216,11 +216,12 @@ module Gem
216
216
  require "rubygems/platform"
217
217
 
218
218
  class Platform
219
- JAVA = Gem::Platform.new("java") unless defined?(JAVA)
220
- MSWIN = Gem::Platform.new("mswin32") unless defined?(MSWIN)
221
- MSWIN64 = Gem::Platform.new("mswin64") unless defined?(MSWIN64)
222
- MINGW = Gem::Platform.new("x86-mingw32") unless defined?(MINGW)
223
- X64_MINGW = Gem::Platform.new("x64-mingw32") unless defined?(X64_MINGW)
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
@@ -25,7 +25,7 @@ module Bundler
25
25
 
26
26
  extract_files
27
27
 
28
- build_extensions
28
+ build_extensions if spec.extensions.any?
29
29
  write_build_info_file
30
30
  run_post_build_hooks
31
31
 
@@ -66,26 +66,26 @@ module Bundler
66
66
 
67
67
  def build_extensions
68
68
  extension_cache_path = options[:bundler_extension_cache_path]
69
- unless extension_cache_path && extension_dir = spec.extension_dir
70
- require "shellwords" unless Bundler.rubygems.provides?(">= 3.2.25")
69
+ extension_dir = spec.extension_dir
70
+ unless extension_cache_path && extension_dir
71
+ prepare_extension_build(extension_dir)
71
72
  return super
72
73
  end
73
74
 
74
- extension_dir = Pathname.new(extension_dir)
75
75
  build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
76
76
  if build_complete && !options[:force]
77
- SharedHelpers.filesystem_access(extension_dir.parent, &:mkpath)
77
+ SharedHelpers.filesystem_access(File.dirname(extension_dir)) do |p|
78
+ FileUtils.mkpath p
79
+ end
78
80
  SharedHelpers.filesystem_access(extension_cache_path) do
79
- FileUtils.cp_r extension_cache_path, spec.extension_dir
81
+ FileUtils.cp_r extension_cache_path, extension_dir
80
82
  end
81
83
  else
82
- require "shellwords" # compensate missing require in rubygems before version 3.2.25
84
+ prepare_extension_build(extension_dir)
83
85
  super
84
- if extension_dir.directory? # not made for gems without extensions
85
- SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
86
- SharedHelpers.filesystem_access(extension_cache_path) do
87
- FileUtils.cp_r extension_dir, extension_cache_path
88
- end
86
+ SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
87
+ SharedHelpers.filesystem_access(extension_cache_path) do
88
+ FileUtils.cp_r extension_dir, extension_cache_path
89
89
  end
90
90
  end
91
91
  end
@@ -100,6 +100,13 @@ module Bundler
100
100
 
101
101
  private
102
102
 
103
+ def prepare_extension_build(extension_dir)
104
+ SharedHelpers.filesystem_access(extension_dir, :create) do
105
+ FileUtils.mkdir_p extension_dir
106
+ end
107
+ require "shellwords" unless Bundler.rubygems.provides?(">= 3.2.25")
108
+ end
109
+
103
110
  def strict_rm_rf(dir)
104
111
  Bundler.rm_rf dir
105
112
  rescue Errno::ENOTEMPTY => e
@@ -125,7 +125,6 @@ module Bundler
125
125
  specs_to_cache.each do |spec|
126
126
  next if spec.name == "bundler"
127
127
  next if spec.source.is_a?(Source::Gemspec)
128
- spec.source.send(:fetch_gem, spec) if Bundler.settings[:cache_all_platforms] && spec.source.respond_to?(:fetch_gem, true)
129
128
  spec.source.cache(spec, custom_path) if spec.source.respond_to?(:cache)
130
129
  end
131
130
 
@@ -57,6 +57,7 @@ module Bundler
57
57
  ].freeze
58
58
 
59
59
  ARRAY_KEYS = %w[
60
+ only
60
61
  with
61
62
  without
62
63
  ].freeze
@@ -153,13 +153,13 @@ module Bundler
153
153
  # Check for this spec from other sources
154
154
  uris = [spec.remote, *remotes_for_spec(spec)].map(&:anonymized_uri).uniq
155
155
  Installer.ambiguous_gems << [spec.name, *uris] if uris.length > 1
156
-
157
- path = fetch_gem(spec, options[:previous_spec])
158
- else
159
- path = cached_gem(spec)
160
- raise GemNotFound, "Could not find #{spec.file_name} for installation" unless path
161
156
  end
162
157
 
158
+ path = fetch_gem_if_possible(spec, options[:previous_spec])
159
+ raise GemNotFound, "Could not find #{spec.file_name} for installation" unless path
160
+
161
+ return if Bundler.settings[:no_install]
162
+
163
163
  if requires_sudo?
164
164
  install_path = Bundler.tmp(spec.full_name)
165
165
  bin_path = install_path.join("bin")
@@ -240,7 +240,7 @@ module Bundler
240
240
  end
241
241
 
242
242
  def cache(spec, custom_path = nil)
243
- cached_path = cached_gem(spec)
243
+ cached_path = Bundler.settings[:cache_all_platforms] ? fetch_gem_if_possible(spec) : cached_gem(spec)
244
244
  raise GemNotFound, "Missing gem file '#{spec.file_name}'." unless cached_path
245
245
  return if File.dirname(cached_path) == Bundler.app_cache.to_s
246
246
  Bundler.ui.info " * #{File.basename(cached_path)}"
@@ -460,6 +460,14 @@ module Bundler
460
460
  end
461
461
  end
462
462
 
463
+ def fetch_gem_if_possible(spec, previous_spec = nil)
464
+ if spec.remote
465
+ fetch_gem(spec, previous_spec)
466
+ else
467
+ cached_gem(spec)
468
+ end
469
+ end
470
+
463
471
  def fetch_gem(spec, previous_spec = nil)
464
472
  spec.fetch_platform
465
473
 
@@ -11,28 +11,27 @@ module Bundler
11
11
  @specs = specs
12
12
  end
13
13
 
14
- def for(dependencies, check = false, match_current_platform = false)
15
- handled = []
16
- deps = dependencies.dup
14
+ def for(dependencies, check = false, platforms = [nil])
15
+ handled = ["bundler"].product(platforms).map {|k| [k, true] }.to_h
16
+ deps = dependencies.product(platforms).map {|dep, platform| [dep.name, platform && dep.force_ruby_platform ? Gem::Platform::RUBY : platform] }
17
17
  specs = []
18
18
 
19
19
  loop do
20
20
  break unless dep = deps.shift
21
- next if handled.any? {|d| d.name == dep.name && (match_current_platform || d.__platform == dep.__platform) } || dep.name == "bundler"
21
+ next if handled.key?(dep)
22
22
 
23
- handled << dep
23
+ handled[dep] = true
24
24
 
25
- specs_for_dep = spec_for_dependency(dep, match_current_platform)
25
+ specs_for_dep = specs_for_dependency(*dep)
26
26
  if specs_for_dep.any?
27
27
  specs.concat(specs_for_dep)
28
28
 
29
29
  specs_for_dep.first.dependencies.each do |d|
30
30
  next if d.type == :development
31
- d = DepProxy.get_proxy(d, dep.__platform) unless match_current_platform
32
- deps << d
31
+ deps << [d.name, dep[1]]
33
32
  end
34
33
  elsif check
35
- return false
34
+ specs << IncompleteSpecification.new(*dep)
36
35
  end
37
36
  end
38
37
 
@@ -40,9 +39,7 @@ module Bundler
40
39
  specs << spec
41
40
  end
42
41
 
43
- specs.uniq! unless match_current_platform
44
-
45
- check ? true : specs
42
+ specs
46
43
  end
47
44
 
48
45
  def [](key)
@@ -69,12 +66,12 @@ module Bundler
69
66
  end
70
67
 
71
68
  def materialize(deps)
72
- materialized = self.for(deps, false, true)
69
+ materialized = self.for(deps, true).uniq
73
70
 
74
71
  materialized.map! do |s|
75
72
  next s unless s.is_a?(LazySpecification)
76
73
  s.source.local!
77
- s.__materialize__ || s
74
+ s.materialize_for_installation || s
78
75
  end
79
76
  SpecSet.new(materialized)
80
77
  end
@@ -87,16 +84,29 @@ module Bundler
87
84
  next s unless s.is_a?(LazySpecification)
88
85
  s.source.local!
89
86
  s.source.remote!
90
- spec = s.__materialize__
87
+ spec = s.materialize_for_installation
91
88
  raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
92
89
  spec
93
90
  end
94
91
  end
95
92
 
93
+ def materialized_for_resolution
94
+ materialized = @specs.map do |s|
95
+ spec = s.materialize_for_resolution
96
+ yield spec if spec
97
+ spec
98
+ end.compact
99
+ SpecSet.new(materialized)
100
+ end
101
+
96
102
  def missing_specs
97
103
  @specs.select {|s| s.is_a?(LazySpecification) }
98
104
  end
99
105
 
106
+ def incomplete_specs
107
+ @specs.select {|s| s.is_a?(IncompleteSpecification) }
108
+ end
109
+
100
110
  def merge(set)
101
111
  arr = sorted.dup
102
112
  set.each do |set_spec|
@@ -171,12 +181,13 @@ module Bundler
171
181
  @specs.sort_by(&:name).each {|s| yield s }
172
182
  end
173
183
 
174
- def spec_for_dependency(dep, match_current_platform)
175
- specs_for_platforms = lookup[dep.name]
176
- if match_current_platform
177
- GemHelpers.select_best_platform_match(specs_for_platforms.select {|s| Gem::Platform.match_spec?(s) }, Bundler.local_platform)
184
+ def specs_for_dependency(name, platform)
185
+ specs_for_name = lookup[name]
186
+ if platform.nil?
187
+ GemHelpers.select_best_platform_match(specs_for_name.select {|s| Gem::Platform.match_spec?(s) }, Bundler.local_platform)
178
188
  else
179
- GemHelpers.select_best_platform_match(specs_for_platforms, dep.__platform)
189
+ specs_for_name_and_platform = GemHelpers.select_best_platform_match(specs_for_name, platform)
190
+ specs_for_name_and_platform.any? ? specs_for_name_and_platform : specs_for_name
180
191
  end
181
192
  end
182
193
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "2.3.16".freeze
4
+ VERSION = "2.3.19".freeze
5
5
 
6
6
  def self.bundler_major_version
7
7
  @bundler_major_version ||= VERSION.split(".").first.to_i
data/lib/bundler.rb CHANGED
@@ -53,6 +53,7 @@ module Bundler
53
53
  autoload :GemHelpers, File.expand_path("bundler/gem_helpers", __dir__)
54
54
  autoload :GemVersionPromoter, File.expand_path("bundler/gem_version_promoter", __dir__)
55
55
  autoload :Graph, File.expand_path("bundler/graph", __dir__)
56
+ autoload :IncompleteSpecification, File.expand_path("bundler/incomplete_specification", __dir__)
56
57
  autoload :Index, File.expand_path("bundler/index", __dir__)
57
58
  autoload :Injector, File.expand_path("bundler/injector", __dir__)
58
59
  autoload :Installer, File.expand_path("bundler/installer", __dir__)
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.16
4
+ version: 2.3.19
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-06-15 00:00:00.000000000 Z
25
+ date: 2022-07-27 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
@@ -103,6 +103,7 @@ files:
103
103
  - lib/bundler/gem_tasks.rb
104
104
  - lib/bundler/gem_version_promoter.rb
105
105
  - lib/bundler/graph.rb
106
+ - lib/bundler/incomplete_specification.rb
106
107
  - lib/bundler/index.rb
107
108
  - lib/bundler/injector.rb
108
109
  - lib/bundler/inline.rb
@@ -369,7 +370,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
369
370
  - !ruby/object:Gem::Version
370
371
  version: 2.5.2
371
372
  requirements: []
372
- rubygems_version: 3.3.16
373
+ rubygems_version: 3.3.19
373
374
  signing_key:
374
375
  specification_version: 4
375
376
  summary: The best way to manage your application's dependencies