bundler 2.3.20 → 2.3.21

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.
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