bundler 2.3.20 → 2.3.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/cli/platform.rb +1 -1
  5. data/lib/bundler/definition.rb +27 -22
  6. data/lib/bundler/endpoint_specification.rb +1 -12
  7. data/lib/bundler/gem_version_promoter.rb +4 -0
  8. data/lib/bundler/inline.rb +1 -1
  9. data/lib/bundler/installer.rb +6 -11
  10. data/lib/bundler/lazy_specification.rb +2 -4
  11. data/lib/bundler/man/bundle-add.1 +1 -1
  12. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  13. data/lib/bundler/man/bundle-cache.1 +1 -1
  14. data/lib/bundler/man/bundle-check.1 +1 -1
  15. data/lib/bundler/man/bundle-clean.1 +1 -1
  16. data/lib/bundler/man/bundle-config.1 +11 -2
  17. data/lib/bundler/man/bundle-config.1.ronn +4 -1
  18. data/lib/bundler/man/bundle-doctor.1 +1 -1
  19. data/lib/bundler/man/bundle-exec.1 +1 -1
  20. data/lib/bundler/man/bundle-gem.1 +1 -1
  21. data/lib/bundler/man/bundle-info.1 +1 -1
  22. data/lib/bundler/man/bundle-init.1 +1 -1
  23. data/lib/bundler/man/bundle-inject.1 +1 -1
  24. data/lib/bundler/man/bundle-install.1 +1 -1
  25. data/lib/bundler/man/bundle-list.1 +1 -1
  26. data/lib/bundler/man/bundle-lock.1 +1 -1
  27. data/lib/bundler/man/bundle-open.1 +1 -1
  28. data/lib/bundler/man/bundle-outdated.1 +1 -1
  29. data/lib/bundler/man/bundle-platform.1 +1 -1
  30. data/lib/bundler/man/bundle-plugin.1 +81 -0
  31. data/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  32. data/lib/bundler/man/bundle-pristine.1 +1 -1
  33. data/lib/bundler/man/bundle-remove.1 +1 -1
  34. data/lib/bundler/man/bundle-show.1 +1 -1
  35. data/lib/bundler/man/bundle-update.1 +1 -1
  36. data/lib/bundler/man/bundle-viz.1 +1 -1
  37. data/lib/bundler/man/bundle.1 +5 -1
  38. data/lib/bundler/man/bundle.1.ronn +3 -0
  39. data/lib/bundler/man/gemfile.5 +1 -1
  40. data/lib/bundler/man/index.txt +1 -0
  41. data/lib/bundler/match_metadata.rb +13 -0
  42. data/lib/bundler/match_remote_metadata.rb +26 -0
  43. data/lib/bundler/plugin.rb +2 -0
  44. data/lib/bundler/remote_specification.rb +1 -7
  45. data/lib/bundler/resolver/spec_group.rb +11 -8
  46. data/lib/bundler/resolver.rb +39 -17
  47. data/lib/bundler/rubygems_ext.rb +28 -0
  48. data/lib/bundler/spec_set.rb +19 -9
  49. data/lib/bundler/version.rb +1 -1
  50. data/lib/bundler.rb +3 -4
  51. metadata +7 -4
  52. data/lib/bundler/incomplete_specification.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d496688c0b2262b47e1df23183882af5e469ca4a70eb40bf962a9d1583409748
4
- data.tar.gz: '087ba876a0582ff5200d5bdb766e4b2722e5c9ba0ff433b5f65c6e67dd8387b0'
3
+ metadata.gz: 06eb5dcedd936231226213f5eeca20b368e575d153efa728a27ecb0912c41386
4
+ data.tar.gz: 60cfd094b573635123576691ceb73b62d297698b217cc68933e0ad4b293ce7b9
5
5
  SHA512:
6
- metadata.gz: a9706bc28946dc9fbd2eaa60dad29eddf99f4d614c04d74b2524a3f2382290d546a634e2b6d1a072a5f5197a819af4c31ca1621cf1571b530f0672c43bb40e01
7
- data.tar.gz: 660efd70ee1f43363d317ac3efd33c6f870987e1039991208258230983856b429ddcf9ea7763165452fa0f92a21f46e26c76fe279035be5a0fa0cee401340c80
6
+ metadata.gz: 04ec1c67333ae78914e6076b6b68024d9c8d57199a7d1a3898a44e643c4f91d5132351ee48590dc9c8167a64a9c838906683ac9b09255394c425193b9741ca34
7
+ data.tar.gz: aa077c408592fe31ed5102e8d4b0a5f8f103691236fe71ee40e8461d926047e2e4c65e600557a8addca192e7ad4c8d71c69a34b4ded4bd06d8427f7d437a5d9c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ # 2.3.21 (August 24, 2022)
2
+
3
+ ## Enhancements:
4
+
5
+ - Backport non gnu libc linux support from RubyGems [#4488](https://github.com/rubygems/rubygems/pull/4488)
6
+ - Improve `Bundler.rm_rf` error message [#5861](https://github.com/rubygems/rubygems/pull/5861)
7
+ - Disallow both `--branch` and `--ref` at the same time in bundle-plugin [#5855](https://github.com/rubygems/rubygems/pull/5855)
8
+ - Restore previous performance of private RubyGems servers [#5826](https://github.com/rubygems/rubygems/pull/5826)
9
+
10
+ ## Bug fixes:
11
+
12
+ - Fix conservative update downgrading top level gems [#5847](https://github.com/rubygems/rubygems/pull/5847)
13
+ - Fix edge case where `bundler/inline` unintentionally skips install [#5848](https://github.com/rubygems/rubygems/pull/5848)
14
+ - Fix `bundle platform` crash when there's a lockfile with no Ruby locked [#5850](https://github.com/rubygems/rubygems/pull/5850)
15
+ - Fix crash when incomplete locked specifications are found in transitive dependencies [#5840](https://github.com/rubygems/rubygems/pull/5840)
16
+ - Fix Ruby platform incorrectly removed on `bundle update` [#5832](https://github.com/rubygems/rubygems/pull/5832)
17
+
18
+ ## Documentation:
19
+
20
+ - Explain cancelled CLI deprecations clearly [#5864](https://github.com/rubygems/rubygems/pull/5864)
21
+ - Improve `bundle config` command synopsis [#5854](https://github.com/rubygems/rubygems/pull/5854)
22
+ - Introduce bundle-plugin(1) man [#5853](https://github.com/rubygems/rubygems/pull/5853)
23
+
1
24
  # 2.3.20 (August 10, 2022)
2
25
 
3
26
  ## Enhancements:
@@ -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-08-10".freeze
8
- @git_commit_sha = "4fd2813f54".freeze
7
+ @built_at = "2022-08-24".freeze
8
+ @git_commit_sha = "d54be5fdd8".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -9,7 +9,7 @@ module Bundler
9
9
 
10
10
  def run
11
11
  platforms, ruby_version = Bundler.ui.silence do
12
- locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version.gsub(/p\d+\Z/, "")
12
+ locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version&.gsub(/p\d+\Z/, "")
13
13
  gemfile_ruby_version = Bundler.definition.ruby_version && Bundler.definition.ruby_version.single_version_string
14
14
  [Bundler.definition.platforms.map {|p| "* #{p}" },
15
15
  locked_ruby_version || gemfile_ruby_version]
@@ -145,8 +145,6 @@ module Bundler
145
145
  @dependency_changes = converge_dependencies
146
146
  @local_changes = converge_locals
147
147
 
148
- @reresolve = nil
149
-
150
148
  @requires = compute_requires
151
149
  end
152
150
 
@@ -218,6 +216,7 @@ module Bundler
218
216
  true
219
217
  rescue BundlerError => e
220
218
  @resolve = nil
219
+ @resolver = nil
221
220
  @specs = nil
222
221
  @gem_version_promoter = nil
223
222
 
@@ -288,7 +287,7 @@ module Bundler
288
287
  end
289
288
  else
290
289
  Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
291
- @reresolve = reresolve
290
+ resolver.start(expanded_dependencies)
292
291
  end
293
292
  end
294
293
 
@@ -482,11 +481,18 @@ module Bundler
482
481
 
483
482
  private
484
483
 
485
- def reresolve
486
- last_resolve = converge_locked_specs
487
- remove_ruby_from_platforms_if_necessary!(dependencies)
488
- expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true)
489
- Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
484
+ def resolver
485
+ @resolver ||= begin
486
+ last_resolve = converge_locked_specs
487
+ Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
488
+ end
489
+ end
490
+
491
+ def expanded_dependencies
492
+ @expanded_dependencies ||= begin
493
+ remove_ruby_from_platforms_if_necessary!(dependencies)
494
+ expand_dependencies(dependencies + metadata_dependencies, true)
495
+ end
490
496
  end
491
497
 
492
498
  def filter_specs(specs, deps)
@@ -514,15 +520,13 @@ module Bundler
514
520
  raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}"
515
521
  end
516
522
 
517
- if @reresolve.nil?
523
+ loop do
518
524
  incomplete_specs = specs.incomplete_specs
525
+ break if incomplete_specs.empty?
519
526
 
520
- if incomplete_specs.any?
521
- Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
522
- @unlock[:gems].concat(incomplete_specs.map(&:name))
523
- @resolve = reresolve
524
- specs = resolve.materialize(dependencies)
525
- end
527
+ Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
528
+ @resolve = resolver.start(expanded_dependencies, :exclude_specs => incomplete_specs)
529
+ specs = resolve.materialize(dependencies)
526
530
  end
527
531
 
528
532
  bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
@@ -715,7 +719,9 @@ module Bundler
715
719
  # commonly happen if the Gemfile has changed since the lockfile was last
716
720
  # generated
717
721
  def converge_locked_specs
718
- resolve = converge_specs(@locked_specs)
722
+ converged = converge_specs(@locked_specs)
723
+
724
+ resolve = SpecSet.new(converged.reject {|s| @unlock[:gems].include?(s.name) })
719
725
 
720
726
  diff = nil
721
727
 
@@ -788,7 +794,7 @@ module Bundler
788
794
  end
789
795
  end
790
796
 
791
- SpecSet.new(filter_specs(converged, deps).reject {|s| @unlock[:gems].include?(s.name) })
797
+ filter_specs(converged, deps)
792
798
  end
793
799
 
794
800
  def metadata_dependencies
@@ -877,10 +883,8 @@ module Bundler
877
883
  def additional_base_requirements_for_resolve
878
884
  return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
879
885
  converge_specs(@originally_locked_specs).map do |locked_spec|
880
- name = locked_spec.name
881
- dep = Dependency.new(name, ">= #{locked_spec.version}")
882
- DepProxy.get_proxy(dep, locked_spec.platform)
883
- end
886
+ Dependency.new(locked_spec.name, ">= #{locked_spec.version}")
887
+ end.uniq
884
888
  end
885
889
 
886
890
  def remove_ruby_from_platforms_if_necessary!(dependencies)
@@ -888,10 +892,11 @@ module Bundler
888
892
  Bundler.local_platform == Gem::Platform::RUBY ||
889
893
  !platforms.include?(Gem::Platform::RUBY) ||
890
894
  (@new_platform && platforms.last == Gem::Platform::RUBY) ||
891
- !@originally_locked_specs.incomplete_ruby_specs?(dependencies)
895
+ !@originally_locked_specs.incomplete_ruby_specs?(expand_dependencies(dependencies))
892
896
 
893
897
  remove_platform(Gem::Platform::RUBY)
894
898
  add_current_platform
899
+ resolver.platforms = @platforms
895
900
  end
896
901
 
897
902
  def source_map
@@ -3,7 +3,7 @@
3
3
  module Bundler
4
4
  # used for Creating Specifications from the Gemcutter Endpoint
5
5
  class EndpointSpecification < Gem::Specification
6
- include MatchPlatform
6
+ include MatchRemoteMetadata
7
7
 
8
8
  attr_reader :name, :version, :platform, :checksum
9
9
  attr_accessor :source, :remote, :dependencies
@@ -22,17 +22,6 @@ module Bundler
22
22
  parse_metadata(metadata)
23
23
  end
24
24
 
25
- def required_ruby_version
26
- @required_ruby_version ||= _remote_specification.required_ruby_version
27
- end
28
-
29
- # A fallback is included because the original version of the specification
30
- # API didn't include that field, so some marshalled specs in the index have it
31
- # set to +nil+.
32
- def required_rubygems_version
33
- @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default
34
- end
35
-
36
25
  def fetch_platform
37
26
  @platform
38
27
  end
@@ -88,6 +88,10 @@ module Bundler
88
88
  end
89
89
  end
90
90
 
91
+ def reset
92
+ @sort_versions = {}
93
+ end
94
+
91
95
  # @return [bool] Convenience method for testing value of level variable.
92
96
  def major?
93
97
  level == :major
@@ -54,7 +54,7 @@ def gemfile(install = false, options = {}, &gemfile)
54
54
 
55
55
  Bundler.ui = install ? ui : Bundler::UI::Silent.new
56
56
  if install || definition.missing_specs?
57
- Bundler.settings.temporary(:inline => true) do
57
+ Bundler.settings.temporary(:inline => true, :no_install => false) do
58
58
  installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
59
59
  installer.post_install_messages.each do |name, message|
60
60
  Bundler.ui.info "Post-install message from #{name}:\n#{message}"
@@ -238,19 +238,14 @@ module Bundler
238
238
  end
239
239
 
240
240
  def ensure_specs_are_compatible!
241
- system_ruby = Bundler::RubyVersion.system
242
- rubygems_version = Bundler.rubygems.version
243
241
  @definition.specs.each do |spec|
244
- if required_ruby_version = spec.required_ruby_version
245
- unless required_ruby_version.satisfied_by?(system_ruby.gem_version)
246
- raise InstallError, "#{spec.full_name} requires ruby version #{required_ruby_version}, " \
247
- "which is incompatible with the current version, #{system_ruby}"
248
- end
242
+ unless spec.matches_current_ruby?
243
+ raise InstallError, "#{spec.full_name} requires ruby version #{spec.required_ruby_version}, " \
244
+ "which is incompatible with the current version, #{Gem.ruby_version}"
249
245
  end
250
- next unless required_rubygems_version = spec.required_rubygems_version
251
- unless required_rubygems_version.satisfied_by?(rubygems_version)
252
- raise InstallError, "#{spec.full_name} requires rubygems version #{required_rubygems_version}, " \
253
- "which is incompatible with the current version, #{rubygems_version}"
246
+ unless spec.matches_current_rubygems?
247
+ raise InstallError, "#{spec.full_name} requires rubygems version #{spec.required_rubygems_version}, " \
248
+ "which is incompatible with the current version, #{Gem.rubygems_version}"
254
249
  end
255
250
  end
256
251
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "match_platform"
4
-
5
3
  module Bundler
6
4
  class LazySpecification
7
5
  include MatchPlatform
@@ -97,8 +95,8 @@ module Bundler
97
95
  @specification = begin
98
96
  search = candidates.reverse.find do |spec|
99
97
  spec.is_a?(StubSpecification) ||
100
- (spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
101
- spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version))
98
+ (spec.matches_current_ruby? &&
99
+ spec.matches_current_rubygems?)
102
100
  end
103
101
  if search.nil? && Bundler.frozen_bundle?
104
102
  search = candidates.last
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-ADD" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-ADD" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-BINSTUBS" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-BINSTUBS" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-CACHE" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-CACHE" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-CHECK" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-CHECK" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-CLEAN" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-CLEAN" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
@@ -1,13 +1,22 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-CONFIG" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-CONFIG" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-config\fR \- Set bundler configuration options
8
8
  .
9
9
  .SH "SYNOPSIS"
10
- \fBbundle config\fR [list|get|set|unset] [\fIname\fR [\fIvalue\fR]]
10
+ \fBbundle config\fR list
11
+ .
12
+ .br
13
+ \fBbundle config\fR [get] NAME
14
+ .
15
+ .br
16
+ \fBbundle config\fR [set] NAME VALUE
17
+ .
18
+ .br
19
+ \fBbundle config\fR unset NAME
11
20
  .
12
21
  .SH "DESCRIPTION"
13
22
  This command allows you to interact with Bundler\'s configuration system\.
@@ -3,7 +3,10 @@ bundle-config(1) -- Set bundler configuration options
3
3
 
4
4
  ## SYNOPSIS
5
5
 
6
- `bundle config` [list|get|set|unset] [<name> [<value>]]
6
+ `bundle config` list<br>
7
+ `bundle config` [get] NAME<br>
8
+ `bundle config` [set] NAME VALUE<br>
9
+ `bundle config` unset NAME
7
10
 
8
11
  ## DESCRIPTION
9
12
 
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-DOCTOR" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-DOCTOR" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-doctor\fR \- Checks the bundle for common problems
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-EXEC" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-EXEC" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-exec\fR \- Execute a command in the context of the bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-GEM" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-GEM" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INFO" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-INFO" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-info\fR \- Show information for the given gem in your bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INIT" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-INIT" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-init\fR \- Generates a Gemfile into the current working directory
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INJECT" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-INJECT" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INSTALL" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-INSTALL" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-LIST" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-LIST" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-list\fR \- List all the gems in the bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-LOCK" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-LOCK" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-OPEN" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-OPEN" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-OUTDATED" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-OUTDATED" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-outdated\fR \- List installed gems with newer versions available
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PLATFORM" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-PLATFORM" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-platform\fR \- Displays platform compatibility information
@@ -0,0 +1,81 @@
1
+ .\" generated with Ronn/v0.7.3
2
+ .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
+ .
4
+ .TH "BUNDLE\-PLUGIN" "1" "August 2022" "" ""
5
+ .
6
+ .SH "NAME"
7
+ \fBbundle\-plugin\fR \- Manage Bundler plugins
8
+ .
9
+ .SH "SYNOPSIS"
10
+ \fBbundle plugin\fR install PLUGINS [\-\-source=\fISOURCE\fR] [\-\-version=\fIversion\fR] [\-\-git|\-\-local_git=\fIgit\-url\fR] [\-\-branch=\fIbranch\fR|\-\-ref=\fIrev\fR]
11
+ .
12
+ .br
13
+ \fBbundle plugin\fR uninstall PLUGINS
14
+ .
15
+ .br
16
+ \fBbundle plugin\fR list
17
+ .
18
+ .br
19
+ \fBbundle plugin\fR help [COMMAND]
20
+ .
21
+ .SH "DESCRIPTION"
22
+ You can install, uninstall, and list plugin(s) with this command to extend functionalities of Bundler\.
23
+ .
24
+ .SH "SUB\-COMMANDS"
25
+ .
26
+ .SS "install"
27
+ Install the given plugin(s)\.
28
+ .
29
+ .IP "\(bu" 4
30
+ \fBbundle plugin install bundler\-graph\fR: Install bundler\-graph gem from RubyGems\.org\. The global source, specified in source in Gemfile is ignored\.
31
+ .
32
+ .IP "\(bu" 4
33
+ \fBbundle plugin install bundler\-graph \-\-source https://example\.com\fR: Install bundler\-graph gem from example\.com\. The global source, specified in source in Gemfile is not considered\.
34
+ .
35
+ .IP "\(bu" 4
36
+ \fBbundle plugin install bundler\-graph \-\-version 0\.2\.1\fR: You can specify the version of the gem via \fB\-\-version\fR\.
37
+ .
38
+ .IP "\(bu" 4
39
+ \fBbundle plugin install bundler\-graph \-\-git https://github\.com/rubygems/bundler\-graph\fR: Install bundler\-graph gem from Git repository\. \fB\-\-git\fR can be replaced with \fB\-\-local\-git\fR\. You cannot use both \fB\-\-git\fR and \fB\-\-local\-git\fR\. You can use standard Git URLs like:
40
+ .
41
+ .IP "\(bu" 4
42
+ \fBssh://[user@]host\.xz[:port]/path/to/repo\.git\fR
43
+ .
44
+ .IP "\(bu" 4
45
+ \fBhttp[s]://host\.xz[:port]/path/to/repo\.git\fR
46
+ .
47
+ .IP "\(bu" 4
48
+ \fB/path/to/repo\fR
49
+ .
50
+ .IP "\(bu" 4
51
+ \fBfile:///path/to/repo\fR
52
+ .
53
+ .IP "" 0
54
+ .
55
+ .IP
56
+ When you specify \fB\-\-git\fR/\fB\-\-local\-git\fR, you can use \fB\-\-branch\fR or \fB\-\-ref\fR to specify any branch, tag, or commit hash (revision) to use\. When you specify both, only the latter is used\.
57
+ .
58
+ .IP "" 0
59
+ .
60
+ .SS "uninstall"
61
+ Uninstall the plugin(s) specified in PLUGINS\.
62
+ .
63
+ .SS "list"
64
+ List the installed plugins and available commands\.
65
+ .
66
+ .P
67
+ No options\.
68
+ .
69
+ .SS "help"
70
+ Describe subcommands or one specific subcommand\.
71
+ .
72
+ .P
73
+ No options\.
74
+ .
75
+ .SH "SEE ALSO"
76
+ .
77
+ .IP "\(bu" 4
78
+ How to write a Bundler plugin \fIhttps://bundler\.io/guides/bundler_plugins\.html\fR
79
+ .
80
+ .IP "" 0
81
+
@@ -0,0 +1,59 @@
1
+ bundle-plugin(1) -- Manage Bundler plugins
2
+ ==========================================
3
+
4
+ ## SYNOPSIS
5
+
6
+ `bundle plugin` install PLUGINS [--source=<SOURCE>] [--version=<version>]
7
+ [--git|--local_git=<git-url>] [--branch=<branch>|--ref=<rev>]<br>
8
+ `bundle plugin` uninstall PLUGINS<br>
9
+ `bundle plugin` list<br>
10
+ `bundle plugin` help [COMMAND]
11
+
12
+ ## DESCRIPTION
13
+
14
+ You can install, uninstall, and list plugin(s) with this command to extend functionalities of Bundler.
15
+
16
+ ## SUB-COMMANDS
17
+
18
+ ### install
19
+
20
+ Install the given plugin(s).
21
+
22
+ * `bundle plugin install bundler-graph`:
23
+ Install bundler-graph gem from RubyGems.org. The global source, specified in source in Gemfile is ignored.
24
+
25
+ * `bundle plugin install bundler-graph --source https://example.com`:
26
+ Install bundler-graph gem from example.com. The global source, specified in source in Gemfile is not considered.
27
+
28
+ * `bundle plugin install bundler-graph --version 0.2.1`:
29
+ You can specify the version of the gem via `--version`.
30
+
31
+ * `bundle plugin install bundler-graph --git https://github.com/rubygems/bundler-graph`:
32
+ Install bundler-graph gem from Git repository. `--git` can be replaced with `--local-git`. You cannot use both `--git` and `--local-git`. You can use standard Git URLs like:
33
+
34
+ * `ssh://[user@]host.xz[:port]/path/to/repo.git`
35
+ * `http[s]://host.xz[:port]/path/to/repo.git`
36
+ * `/path/to/repo`
37
+ * `file:///path/to/repo`
38
+
39
+ When you specify `--git`/`--local-git`, you can use `--branch` or `--ref` to specify any branch, tag, or commit hash (revision) to use. When you specify both, only the latter is used.
40
+
41
+ ### uninstall
42
+
43
+ Uninstall the plugin(s) specified in PLUGINS.
44
+
45
+ ### list
46
+
47
+ List the installed plugins and available commands.
48
+
49
+ No options.
50
+
51
+ ### help
52
+
53
+ Describe subcommands or one specific subcommand.
54
+
55
+ No options.
56
+
57
+ ## SEE ALSO
58
+
59
+ * [How to write a Bundler plugin](https://bundler.io/guides/bundler_plugins.html)
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PRISTINE" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-PRISTINE" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-REMOVE" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-REMOVE" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-remove\fR \- Removes gems from the Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-SHOW" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-SHOW" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-UPDATE" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-UPDATE" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-update\fR \- Update your gems to the latest available versions
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-VIZ" "1" "July 2022" "" ""
4
+ .TH "BUNDLE\-VIZ" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE" "1" "July 2022" "" ""
4
+ .TH "BUNDLE" "1" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\fR \- Ruby Dependency Management
@@ -120,6 +120,10 @@ Display warnings about common problems
120
120
  \fBbundle remove(1)\fR \fIbundle\-remove\.1\.html\fR
121
121
  Removes gems from the Gemfile
122
122
  .
123
+ .TP
124
+ \fBbundle plugin(1)\fR \fIbundle\-plugin\.1\.html\fR
125
+ Manage Bundler plugins
126
+ .
123
127
  .SH "PLUGINS"
124
128
  When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named \fBbundler\-<command>\fR and execute it, passing down any extra arguments to it\.
125
129
  .
@@ -97,6 +97,9 @@ We divide `bundle` subcommands into primary commands and utilities:
97
97
  * [`bundle remove(1)`](bundle-remove.1.html):
98
98
  Removes gems from the Gemfile
99
99
 
100
+ * [`bundle plugin(1)`](bundle-plugin.1.html):
101
+ Manage Bundler plugins
102
+
100
103
  ## PLUGINS
101
104
 
102
105
  When running a command that isn't listed in PRIMARY COMMANDS or UTILITIES,
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "GEMFILE" "5" "July 2022" "" ""
4
+ .TH "GEMFILE" "5" "August 2022" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
@@ -18,6 +18,7 @@ bundle-lock(1) bundle-lock.1
18
18
  bundle-open(1) bundle-open.1
19
19
  bundle-outdated(1) bundle-outdated.1
20
20
  bundle-platform(1) bundle-platform.1
21
+ bundle-plugin(1) bundle-plugin.1
21
22
  bundle-pristine(1) bundle-pristine.1
22
23
  bundle-remove(1) bundle-remove.1
23
24
  bundle-show(1) bundle-show.1
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ module MatchMetadata
5
+ def matches_current_ruby?
6
+ @required_ruby_version.satisfied_by?(Gem.ruby_version)
7
+ end
8
+
9
+ def matches_current_rubygems?
10
+ @required_rubygems_version.satisfied_by?(Gem.rubygems_version)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ module FetchMetadata
5
+ def matches_current_ruby?
6
+ @required_ruby_version ||= _remote_specification.required_ruby_version
7
+
8
+ super
9
+ end
10
+
11
+ def matches_current_rubygems?
12
+ # A fallback is included because the original version of the specification
13
+ # API didn't include that field, so some marshalled specs in the index have it
14
+ # set to +nil+.
15
+ @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default
16
+
17
+ super
18
+ end
19
+ end
20
+
21
+ module MatchRemoteMetadata
22
+ include MatchMetadata
23
+
24
+ prepend FetchMetadata
25
+ end
26
+ end
@@ -36,6 +36,8 @@ module Bundler
36
36
  # @param [Hash] options various parameters as described in description.
37
37
  # Refer to cli/plugin for available options
38
38
  def install(names, options)
39
+ raise InvalidOption, "You cannot specify `--branch` and `--ref` at the same time." if options["branch"] && options["ref"]
40
+
39
41
  specs = Installer.new.install(names, options)
40
42
 
41
43
  save_plugins names, specs
@@ -6,6 +6,7 @@ module Bundler
6
6
  # be seeded with what we're given from the source's abbreviated index - the
7
7
  # full specification will only be fetched when necessary.
8
8
  class RemoteSpecification
9
+ include MatchRemoteMetadata
9
10
  include MatchPlatform
10
11
  include Comparable
11
12
 
@@ -28,13 +29,6 @@ module Bundler
28
29
  @platform = _remote_specification.platform
29
30
  end
30
31
 
31
- # A fallback is included because the original version of the specification
32
- # API didn't include that field, so some marshalled specs in the index have it
33
- # set to +nil+.
34
- def required_rubygems_version
35
- @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default
36
- end
37
-
38
32
  def full_name
39
33
  if @original_platform == Gem::Platform::RUBY
40
34
  "#{@name}-#{@version}"
@@ -97,14 +97,17 @@ module Bundler
97
97
  def metadata_dependencies(platform)
98
98
  spec = @specs[platform].first
99
99
  return [] if spec.is_a?(LazySpecification)
100
- dependencies = []
101
- unless spec.required_ruby_version.none?
102
- dependencies << DepProxy.get_proxy(Dependency.new("Ruby\0", spec.required_ruby_version), platform)
103
- end
104
- unless spec.required_rubygems_version.none?
105
- dependencies << DepProxy.get_proxy(Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
106
- end
107
- dependencies
100
+
101
+ [
102
+ metadata_dependency("Ruby", spec.required_ruby_version, platform),
103
+ metadata_dependency("RubyGems", spec.required_rubygems_version, platform),
104
+ ].compact
105
+ end
106
+
107
+ def metadata_dependency(name, requirement, platform)
108
+ return if requirement.nil? || requirement.none?
109
+
110
+ DepProxy.get_proxy(Dependency.new("#{name}\0", requirement), platform)
108
111
  end
109
112
  end
110
113
  end
@@ -7,6 +7,8 @@ module Bundler
7
7
 
8
8
  include GemHelpers
9
9
 
10
+ attr_writer :platforms
11
+
10
12
  # Figures out the best possible configuration of gems that satisfies
11
13
  # the list of passed dependencies and any child dependencies without
12
14
  # causing any gem activation errors.
@@ -19,41 +21,48 @@ module Bundler
19
21
  # collection of gemspecs is returned. Otherwise, nil is returned.
20
22
  def self.resolve(requirements, source_requirements = {}, base = [], gem_version_promoter = GemVersionPromoter.new, additional_base_requirements = [], platforms = nil)
21
23
  base = SpecSet.new(base) unless base.is_a?(SpecSet)
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)
24
- result = resolver.start(requirements)
25
- SpecSet.new(SpecSet.new(result).for(regular_requirements, false, platforms))
24
+ resolver = new(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
25
+ resolver.start(requirements)
26
26
  end
27
27
 
28
- def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms, metadata_requirements)
28
+ def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
29
29
  @source_requirements = source_requirements
30
- @metadata_requirements = metadata_requirements
31
30
  @base = base
32
31
  @resolver = Molinillo::Resolver.new(self, self)
32
+ @results_for = {}
33
33
  @search_for = {}
34
- @base_dg = Molinillo::DependencyGraph.new
35
- base.each do |ls|
36
- dep = Dependency.new(ls.name, ls.version)
37
- @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
38
- end
39
- additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
40
- @platforms = platforms.reject {|p| p != Gem::Platform::RUBY && (platforms - [p]).any? {|pl| generic(pl) == p } }
34
+ @additional_base_requirements = additional_base_requirements
35
+ @platforms = platforms
41
36
  @resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
42
37
  @gem_version_promoter = gem_version_promoter
43
38
  @use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
44
39
  end
45
40
 
46
- def start(requirements)
41
+ def start(requirements, exclude_specs: [])
42
+ @metadata_requirements, regular_requirements = requirements.partition {|dep| dep.name.end_with?("\0") }
43
+
44
+ exclude_specs.each do |spec|
45
+ remove_from_candidates(spec)
46
+ end
47
+
48
+ @base_dg = Molinillo::DependencyGraph.new
49
+ @base.each do |ls|
50
+ dep = Dependency.new(ls.name, ls.version)
51
+ @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
52
+ end
53
+ @additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
54
+
47
55
  @gem_version_promoter.prerelease_specified = @prerelease_specified = {}
48
56
  requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? }
49
57
 
50
58
  verify_gemfile_dependencies_are_found!(requirements)
51
- dg = @resolver.resolve(requirements, @base_dg)
52
- dg.
59
+ result = @resolver.resolve(requirements, @base_dg).
53
60
  map(&:payload).
54
61
  reject {|sg| sg.name.end_with?("\0") }.
55
62
  map(&:to_specs).
56
63
  flatten
64
+
65
+ SpecSet.new(SpecSet.new(result).for(regular_requirements, false, @platforms))
57
66
  rescue Molinillo::VersionConflict => e
58
67
  message = version_conflict_message(e)
59
68
  raise VersionConflict.new(e.conflicts.keys.uniq, message)
@@ -177,7 +186,7 @@ module Bundler
177
186
  end
178
187
 
179
188
  def results_for(dependency)
180
- index_for(dependency).search(dependency)
189
+ @results_for[dependency] ||= index_for(dependency).search(dependency)
181
190
  end
182
191
 
183
192
  def name_for(dependency)
@@ -228,6 +237,19 @@ module Bundler
228
237
 
229
238
  private
230
239
 
240
+ def remove_from_candidates(spec)
241
+ @base.delete(spec)
242
+ @gem_version_promoter.reset
243
+
244
+ @results_for.keys.each do |dep|
245
+ next unless dep.name == spec.name
246
+
247
+ @results_for[dep].reject {|s| s.name == spec.name && s.version == spec.version }
248
+ end
249
+
250
+ @search_for = {}
251
+ end
252
+
231
253
  # returns an integer \in (-\infty, 0]
232
254
  # a number closer to 0 means the dependency is less constraining
233
255
  #
@@ -15,6 +15,7 @@ require "rubygems/specification"
15
15
  # `Gem::Source` from the redefined `Gem::Specification#source`.
16
16
  require "rubygems/source"
17
17
 
18
+ require_relative "match_metadata"
18
19
  require_relative "match_platform"
19
20
 
20
21
  # Cherry-pick fixes to `Gem.ruby_version` to be useful for modern Bundler
@@ -28,6 +29,7 @@ end
28
29
 
29
30
  module Gem
30
31
  class Specification
32
+ include ::Bundler::MatchMetadata
31
33
  include ::Bundler::MatchPlatform
32
34
 
33
35
  attr_accessor :remote, :location, :relative_loaded_from
@@ -235,6 +237,32 @@ module Gem
235
237
  MINGW = Gem::Platform.new("x86-mingw32")
236
238
  X64_MINGW = [Gem::Platform.new("x64-mingw32"),
237
239
  Gem::Platform.new("x64-mingw-ucrt")].freeze
240
+
241
+ if Gem::Platform.new("x86_64-linux-musl") === Gem::Platform.new("x86_64-linux")
242
+ remove_method :===
243
+
244
+ def ===(other)
245
+ return nil unless Gem::Platform === other
246
+
247
+ # universal-mingw32 matches x64-mingw-ucrt
248
+ return true if (@cpu == "universal" || other.cpu == "universal") &&
249
+ @os.start_with?("mingw") && other.os.start_with?("mingw")
250
+
251
+ # cpu
252
+ ([nil,"universal"].include?(@cpu) || [nil, "universal"].include?(other.cpu) || @cpu == other.cpu ||
253
+ (@cpu == "arm" && other.cpu.start_with?("arm"))) &&
254
+
255
+ # os
256
+ @os == other.os &&
257
+
258
+ # version
259
+ (
260
+ (@os != "linux" && (@version.nil? || other.version.nil?)) ||
261
+ (@os == "linux" && ((@version.nil? && ["gnu", "musl"].include?(other.version)) || (@version == "gnu" && other.version.nil?))) ||
262
+ @version == other.version
263
+ )
264
+ end
265
+ end
238
266
  end
239
267
 
240
268
  Platform.singleton_class.module_eval do
@@ -7,8 +7,11 @@ module Bundler
7
7
  include Enumerable
8
8
  include TSort
9
9
 
10
- def initialize(specs)
10
+ attr_reader :incomplete_specs
11
+
12
+ def initialize(specs, incomplete_specs = [])
11
13
  @specs = specs
14
+ @incomplete_specs = incomplete_specs
12
15
  end
13
16
 
14
17
  def for(dependencies, check = false, platforms = [nil])
@@ -19,7 +22,10 @@ module Bundler
19
22
  loop do
20
23
  break unless dep = deps.shift
21
24
 
22
- key = [dep[0].name, dep[1]]
25
+ name = dep[0].name
26
+ platform = dep[1]
27
+
28
+ key = [name, platform]
23
29
  next if handled.key?(key)
24
30
 
25
31
  handled[key] = true
@@ -33,7 +39,7 @@ module Bundler
33
39
  deps << [d, dep[1]]
34
40
  end
35
41
  elsif check
36
- specs << IncompleteSpecification.new(*key)
42
+ @incomplete_specs += lookup[name]
37
43
  end
38
44
  end
39
45
 
@@ -51,6 +57,12 @@ module Bundler
51
57
  @sorted = nil
52
58
  end
53
59
 
60
+ def delete(spec)
61
+ @specs.delete(spec)
62
+ @lookup = nil
63
+ @sorted = nil
64
+ end
65
+
54
66
  def sort!
55
67
  self
56
68
  end
@@ -66,7 +78,7 @@ module Bundler
66
78
  def materialize(deps)
67
79
  materialized = self.for(deps, true)
68
80
 
69
- SpecSet.new(materialized)
81
+ SpecSet.new(materialized, incomplete_specs)
70
82
  end
71
83
 
72
84
  # Materialize for all the specs in the spec set, regardless of what platform they're for
@@ -83,17 +95,15 @@ module Bundler
83
95
  end
84
96
 
85
97
  def incomplete_ruby_specs?(deps)
86
- self.class.new(self.for(deps, true, [Gem::Platform::RUBY])).incomplete_specs.any?
98
+ self.for(deps, true, [Gem::Platform::RUBY])
99
+
100
+ @incomplete_specs.any?
87
101
  end
88
102
 
89
103
  def missing_specs
90
104
  @specs.select {|s| s.is_a?(LazySpecification) }
91
105
  end
92
106
 
93
- def incomplete_specs
94
- @specs.select {|s| s.is_a?(IncompleteSpecification) }
95
- end
96
-
97
107
  def merge(set)
98
108
  arr = sorted.dup
99
109
  set.each do |set_spec|
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "2.3.20".freeze
4
+ VERSION = "2.3.21".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,13 +53,12 @@ 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__)
57
56
  autoload :Index, File.expand_path("bundler/index", __dir__)
58
57
  autoload :Injector, File.expand_path("bundler/injector", __dir__)
59
58
  autoload :Installer, File.expand_path("bundler/installer", __dir__)
60
59
  autoload :LazySpecification, File.expand_path("bundler/lazy_specification", __dir__)
61
60
  autoload :LockfileParser, File.expand_path("bundler/lockfile_parser", __dir__)
62
- autoload :MatchPlatform, File.expand_path("bundler/match_platform", __dir__)
61
+ autoload :MatchRemoteMetadata, File.expand_path("bundler/match_remote_metadata", __dir__)
63
62
  autoload :ProcessLock, File.expand_path("bundler/process_lock", __dir__)
64
63
  autoload :RemoteSpecification, File.expand_path("bundler/remote_specification", __dir__)
65
64
  autoload :Resolver, File.expand_path("bundler/resolver", __dir__)
@@ -332,9 +331,9 @@ module Bundler
332
331
  FileUtils.remove_entry_secure(path) if path && File.exist?(path)
333
332
  rescue ArgumentError
334
333
  message = <<EOF
335
- It is a security vulnerability to allow your home directory to be world-writable, and bundler can not continue.
334
+ It is a security vulnerability to allow your home directory to be world-writable, and bundler cannot continue.
336
335
  You should probably consider fixing this issue by running `chmod o-w ~` on *nix.
337
- Please refer to https://ruby-doc.org/stdlib-2.1.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-remove_entry_secure for details.
336
+ Please refer to https://ruby-doc.org/stdlib-3.1.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-remove_entry_secure for details.
338
337
  EOF
339
338
  File.world_writable?(path) ? Bundler.ui.warn(message) : raise
340
339
  raise PathError, "Please fix the world-writable issue with your #{path} directory"
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.20
4
+ version: 2.3.21
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-08-10 00:00:00.000000000 Z
25
+ date: 2022-08-24 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,7 +103,6 @@ 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
107
106
  - lib/bundler/index.rb
108
107
  - lib/bundler/injector.rb
109
108
  - lib/bundler/inline.rb
@@ -151,6 +150,8 @@ files:
151
150
  - lib/bundler/man/bundle-outdated.1.ronn
152
151
  - lib/bundler/man/bundle-platform.1
153
152
  - lib/bundler/man/bundle-platform.1.ronn
153
+ - lib/bundler/man/bundle-plugin.1
154
+ - lib/bundler/man/bundle-plugin.1.ronn
154
155
  - lib/bundler/man/bundle-pristine.1
155
156
  - lib/bundler/man/bundle-pristine.1.ronn
156
157
  - lib/bundler/man/bundle-remove.1
@@ -166,7 +167,9 @@ files:
166
167
  - lib/bundler/man/gemfile.5
167
168
  - lib/bundler/man/gemfile.5.ronn
168
169
  - lib/bundler/man/index.txt
170
+ - lib/bundler/match_metadata.rb
169
171
  - lib/bundler/match_platform.rb
172
+ - lib/bundler/match_remote_metadata.rb
170
173
  - lib/bundler/mirror.rb
171
174
  - lib/bundler/plugin.rb
172
175
  - lib/bundler/plugin/api.rb
@@ -370,7 +373,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
370
373
  - !ruby/object:Gem::Version
371
374
  version: 2.5.2
372
375
  requirements: []
373
- rubygems_version: 3.3.20
376
+ rubygems_version: 3.3.21
374
377
  signing_key:
375
378
  specification_version: 4
376
379
  summary: The best way to manage your application's dependencies
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bundler
4
- class IncompleteSpecification
5
- attr_reader :name, :platform
6
-
7
- def initialize(name, platform)
8
- @name = name
9
- @platform = platform
10
- end
11
- end
12
- end