bundler 2.6.5 → 2.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/checksum.rb +1 -1
  5. data/lib/bundler/cli/doctor.rb +14 -14
  6. data/lib/bundler/cli/inject.rb +2 -2
  7. data/lib/bundler/cli/lock.rb +2 -1
  8. data/lib/bundler/compact_index_client/updater.rb +2 -1
  9. data/lib/bundler/definition.rb +58 -47
  10. data/lib/bundler/errors.rb +18 -0
  11. data/lib/bundler/injector.rb +9 -9
  12. data/lib/bundler/man/bundle-add.1 +1 -1
  13. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  14. data/lib/bundler/man/bundle-cache.1 +1 -1
  15. data/lib/bundler/man/bundle-check.1 +1 -1
  16. data/lib/bundler/man/bundle-clean.1 +1 -1
  17. data/lib/bundler/man/bundle-config.1 +6 -6
  18. data/lib/bundler/man/bundle-config.1.ronn +9 -4
  19. data/lib/bundler/man/bundle-console.1 +1 -1
  20. data/lib/bundler/man/bundle-doctor.1 +1 -1
  21. data/lib/bundler/man/bundle-env.1 +1 -1
  22. data/lib/bundler/man/bundle-exec.1 +3 -3
  23. data/lib/bundler/man/bundle-exec.1.ronn +2 -2
  24. data/lib/bundler/man/bundle-fund.1 +1 -1
  25. data/lib/bundler/man/bundle-gem.1 +1 -1
  26. data/lib/bundler/man/bundle-help.1 +1 -1
  27. data/lib/bundler/man/bundle-info.1 +1 -1
  28. data/lib/bundler/man/bundle-init.1 +1 -1
  29. data/lib/bundler/man/bundle-inject.1 +1 -1
  30. data/lib/bundler/man/bundle-install.1 +1 -1
  31. data/lib/bundler/man/bundle-issue.1 +1 -1
  32. data/lib/bundler/man/bundle-licenses.1 +1 -1
  33. data/lib/bundler/man/bundle-list.1 +1 -1
  34. data/lib/bundler/man/bundle-lock.1 +1 -1
  35. data/lib/bundler/man/bundle-open.1 +1 -1
  36. data/lib/bundler/man/bundle-outdated.1 +1 -1
  37. data/lib/bundler/man/bundle-platform.1 +1 -1
  38. data/lib/bundler/man/bundle-plugin.1 +1 -1
  39. data/lib/bundler/man/bundle-pristine.1 +1 -1
  40. data/lib/bundler/man/bundle-remove.1 +1 -1
  41. data/lib/bundler/man/bundle-show.1 +1 -1
  42. data/lib/bundler/man/bundle-update.1 +1 -1
  43. data/lib/bundler/man/bundle-version.1 +1 -1
  44. data/lib/bundler/man/bundle-viz.1 +1 -1
  45. data/lib/bundler/man/bundle.1 +1 -1
  46. data/lib/bundler/man/gemfile.5 +1 -1
  47. data/lib/bundler/plugin/index.rb +1 -1
  48. data/lib/bundler/resolver/candidate.rb +11 -8
  49. data/lib/bundler/shared_helpers.rb +4 -0
  50. data/lib/bundler/source/git/git_proxy.rb +6 -0
  51. data/lib/bundler/source/git.rb +5 -1
  52. data/lib/bundler/source/rubygems/remote.rb +11 -3
  53. data/lib/bundler/vendor/uri/lib/uri/common.rb +7 -3
  54. data/lib/bundler/vendor/uri/lib/uri/generic.rb +12 -11
  55. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +6 -6
  56. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  57. data/lib/bundler/version.rb +1 -1
  58. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 244b150c10d3a97538eb2fca0bfd11f4f1d52498e017a412cb22cafab11b95d9
4
- data.tar.gz: 3c09d427c503b26379f13fdb225368e2d7987f9588b6f1c3e9691145fb8b90ba
3
+ metadata.gz: 04be45da6f2c0f4d36af4bbed990919e3fafcba6d1ae0f29adff18b814bbd343
4
+ data.tar.gz: 4b2dc4d27575de59e07cfe3cbb397248c60288b0da5a3f857ef5f2ad738b46b9
5
5
  SHA512:
6
- metadata.gz: 9edd329b4f4e36c9bfce9ad4468f764d011afe7f774439d6700f49064201fbe06bf1c374a938a96ae24933df34344c142f6db071324306b4255a235da2f1ff20
7
- data.tar.gz: e26f55ba1f69d938047333d1065f1cc75ebf4c865ba966ba5355084681263392928c3f902fbd26d94077ac51dabfd1aacad4a2329b7c934fbc689f363761f4db
6
+ metadata.gz: a1f8470b8caa25f59bdef6c9a62b938292b6e8dc2a1799c93971f931e774aee8c766dc503007900dbd8e743a6396dad8803ea92f6d47261fb82748d46705d865
7
+ data.tar.gz: 50c0f2dabb906fe79566eea2024f1c346469026ae57936cc1c0c4d4bbaeab0321e0261c82128ad2c36985f998dbc0db21f1311c4bef2fb097ecd24d641136450
data/CHANGELOG.md CHANGED
@@ -1,3 +1,30 @@
1
+ # 2.6.6 (March 13, 2025)
2
+
3
+ ## Enhancements:
4
+
5
+ - Fix `ENAMETOOLONG` error when creating compact index cache [#5578](https://github.com/rubygems/rubygems/pull/5578)
6
+ - Use shorthand hash syntax for bundle add [#8547](https://github.com/rubygems/rubygems/pull/8547)
7
+ - Update vendored uri to 1.0.3 [#8534](https://github.com/rubygems/rubygems/pull/8534)
8
+ - Retry gracefully on blank partial response in compact index [#8524](https://github.com/rubygems/rubygems/pull/8524)
9
+ - Give a better error when trying to write the lock file on a read-only filesystem [#5920](https://github.com/rubygems/rubygems/pull/5920)
10
+ - Improve log messages when lockfile platforms are added [#8523](https://github.com/rubygems/rubygems/pull/8523)
11
+ - Allow noop `bundle install` to work on read-only or protected folders [#8519](https://github.com/rubygems/rubygems/pull/8519)
12
+
13
+ ## Bug fixes:
14
+
15
+ - Detect partial gem installs from a git source so that they are reinstalled on a successive run [#8539](https://github.com/rubygems/rubygems/pull/8539)
16
+ - Modify `bundle doctor` to not report issue when files aren't writable [#8520](https://github.com/rubygems/rubygems/pull/8520)
17
+
18
+ ## Performance:
19
+
20
+ - Optimize resolution by removing an array allocation from `Candidate#<=>` [#8559](https://github.com/rubygems/rubygems/pull/8559)
21
+
22
+ ## Documentation:
23
+
24
+ - Update docs for with/without consistency [#8555](https://github.com/rubygems/rubygems/pull/8555)
25
+ - Recommend non-deprecated methods in `bundle exec` documentation [#8537](https://github.com/rubygems/rubygems/pull/8537)
26
+ - Hint about default group when using `only` configuration option [#8536](https://github.com/rubygems/rubygems/pull/8536)
27
+
1
28
  # 2.6.5 (February 20, 2025)
2
29
 
3
30
  ## 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 = "2025-02-20".freeze
8
- @git_commit_sha = "cffd973142d".freeze
7
+ @built_at = "2025-03-13".freeze
8
+ @git_commit_sha = "25cf0763954".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -126,7 +126,7 @@ module Bundler
126
126
  end
127
127
 
128
128
  def removable?
129
- type == :lock || type == :gem
129
+ [:lock, :gem].include?(type)
130
130
  end
131
131
 
132
132
  def ==(other)
@@ -99,7 +99,7 @@ module Bundler
99
99
  end
100
100
  end.sort.each {|m| message += m }
101
101
  raise ProductionError, message
102
- elsif !permissions_valid
102
+ elsif permissions_valid
103
103
  Bundler.ui.info "No issues found with the installed bundle"
104
104
  end
105
105
  end
@@ -108,21 +108,21 @@ module Bundler
108
108
 
109
109
  def check_home_permissions
110
110
  require "find"
111
- files_not_readable_or_writable = []
112
- files_not_rw_and_owned_by_different_user = []
113
- files_not_owned_by_current_user_but_still_rw = []
111
+ files_not_readable = []
112
+ files_not_readable_and_owned_by_different_user = []
113
+ files_not_owned_by_current_user_but_still_readable = []
114
114
  broken_symlinks = []
115
115
  Find.find(Bundler.bundle_path.to_s).each do |f|
116
116
  if !File.exist?(f)
117
117
  broken_symlinks << f
118
- elsif !File.writable?(f) || !File.readable?(f)
118
+ elsif !File.readable?(f)
119
119
  if File.stat(f).uid != Process.uid
120
- files_not_rw_and_owned_by_different_user << f
120
+ files_not_readable_and_owned_by_different_user << f
121
121
  else
122
- files_not_readable_or_writable << f
122
+ files_not_readable << f
123
123
  end
124
124
  elsif File.stat(f).uid != Process.uid
125
- files_not_owned_by_current_user_but_still_rw << f
125
+ files_not_owned_by_current_user_but_still_readable << f
126
126
  end
127
127
  end
128
128
 
@@ -134,23 +134,23 @@ module Bundler
134
134
  ok = false
135
135
  end
136
136
 
137
- if files_not_owned_by_current_user_but_still_rw.any?
137
+ if files_not_owned_by_current_user_but_still_readable.any?
138
138
  Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
139
- "user, but are still readable/writable. These files are:\n - #{files_not_owned_by_current_user_but_still_rw.join("\n - ")}"
139
+ "user, but are still readable. These files are:\n - #{files_not_owned_by_current_user_but_still_readable.join("\n - ")}"
140
140
 
141
141
  ok = false
142
142
  end
143
143
 
144
- if files_not_rw_and_owned_by_different_user.any?
144
+ if files_not_readable_and_owned_by_different_user.any?
145
145
  Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
146
- "user, and are not readable/writable. These files are:\n - #{files_not_rw_and_owned_by_different_user.join("\n - ")}"
146
+ "user, and are not readable. These files are:\n - #{files_not_readable_and_owned_by_different_user.join("\n - ")}"
147
147
 
148
148
  ok = false
149
149
  end
150
150
 
151
- if files_not_readable_or_writable.any?
151
+ if files_not_readable.any?
152
152
  Bundler.ui.warn "Files exist in the Bundler home that are not " \
153
- "readable/writable by the current user. These files are:\n - #{files_not_readable_or_writable.join("\n - ")}"
153
+ "readable by the current user. These files are:\n - #{files_not_readable.join("\n - ")}"
154
154
 
155
155
  ok = false
156
156
  end
@@ -35,8 +35,8 @@ module Bundler
35
35
  Bundler.ui.confirm(added.map do |d|
36
36
  name = "'#{d.name}'"
37
37
  requirement = ", '#{d.requirement}'"
38
- group = ", :group => #{d.groups.inspect}" if d.groups != Array(:default)
39
- source = ", :source => '#{d.source}'" unless d.source.nil?
38
+ group = ", group: #{d.groups.inspect}" if d.groups != Array(:default)
39
+ source = ", source: '#{d.source}'" unless d.source.nil?
40
40
  %(gem #{name}#{requirement}#{group}#{source})
41
41
  end.join("\n"))
42
42
  else
@@ -44,7 +44,8 @@ module Bundler
44
44
 
45
45
  Bundler::CLI::Common.configure_gem_version_promoter(definition, options) if options[:update]
46
46
 
47
- options["remove-platform"].each do |platform|
47
+ options["remove-platform"].each do |platform_string|
48
+ platform = Gem::Platform.new(platform_string)
48
49
  definition.remove_platform(platform)
49
50
  end
50
51
 
@@ -37,7 +37,8 @@ module Bundler
37
37
  file.digests = parse_digests(response)
38
38
  # server may ignore Range and return the full response
39
39
  if response.is_a?(Gem::Net::HTTPPartialContent)
40
- break false unless file.append(response.body.byteslice(1..-1))
40
+ tail = response.body.byteslice(1..-1)
41
+ break false unless tail && file.append(tail)
41
42
  else
42
43
  file.write(response.body)
43
44
  end
@@ -94,7 +94,7 @@ module Bundler
94
94
 
95
95
  @locked_ruby_version = nil
96
96
  @new_platforms = []
97
- @removed_platform = nil
97
+ @removed_platforms = []
98
98
 
99
99
  if lockfile_exists?
100
100
  @lockfile_contents = Bundler.read_file(lockfile)
@@ -330,7 +330,7 @@ module Bundler
330
330
  SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
331
331
  else
332
332
  Bundler.ui.debug "Found no changes, using resolution from the lockfile"
333
- if @removed_platform || @locked_gems.may_include_redundant_platform_specific_gems?
333
+ if @removed_platforms.any? || @locked_gems.may_include_redundant_platform_specific_gems?
334
334
  SpecSet.new(filter_specs(@locked_specs, @dependencies))
335
335
  else
336
336
  @locked_specs
@@ -412,41 +412,8 @@ module Bundler
412
412
 
413
413
  raise ProductionError, "Frozen mode is set, but there's no lockfile" unless lockfile_exists?
414
414
 
415
- added = []
416
- deleted = []
417
- changed = []
418
-
419
- new_platforms = @platforms - @locked_platforms
420
- deleted_platforms = @locked_platforms - @platforms
421
- added.concat new_platforms.map {|p| "* platform: #{p}" }
422
- deleted.concat deleted_platforms.map {|p| "* platform: #{p}" }
423
-
424
- added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any?
425
- deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } if deleted_deps.any?
426
-
427
- both_sources = Hash.new {|h, k| h[k] = [] }
428
- current_dependencies.each {|d| both_sources[d.name][0] = d }
429
- current_locked_dependencies.each {|d| both_sources[d.name][1] = d }
430
-
431
- both_sources.each do |name, (dep, lock_dep)|
432
- next if dep.nil? || lock_dep.nil?
433
-
434
- gemfile_source = dep.source || default_source
435
- lock_source = lock_dep.source || default_source
436
- next if lock_source.include?(gemfile_source)
437
-
438
- gemfile_source_name = dep.source ? gemfile_source.to_gemfile : "no specified source"
439
- lockfile_source_name = lock_dep.source ? lock_source.to_gemfile : "no specified source"
440
- changed << "* #{name} from `#{lockfile_source_name}` to `#{gemfile_source_name}`"
441
- end
442
-
443
- reason = resolve_needed? ? change_reason : "some dependencies were deleted from your gemfile"
444
- msg = String.new
445
- msg << "#{reason.capitalize.strip}, but the lockfile can't be updated because frozen mode is set"
446
- msg << "\n\nYou have added to the Gemfile:\n" << added.join("\n") if added.any?
447
- msg << "\n\nYou have deleted from the Gemfile:\n" << deleted.join("\n") if deleted.any?
448
- msg << "\n\nYou have changed in the Gemfile:\n" << changed.join("\n") if changed.any?
449
- msg << "\n\nRun `bundle install` elsewhere and add the updated #{SharedHelpers.relative_gemfile_path} to version control.\n" unless unlocking?
415
+ msg = lockfile_changes_summary("frozen mode is set")
416
+ return unless msg
450
417
 
451
418
  unless explicit_flag
452
419
  suggested_command = unless Bundler.settings.locations("frozen").keys.include?(:env)
@@ -456,7 +423,7 @@ module Bundler
456
423
  "freeze by running `#{suggested_command}`." if suggested_command
457
424
  end
458
425
 
459
- raise ProductionError, msg if added.any? || deleted.any? || changed.any? || resolve_needed?
426
+ raise ProductionError, msg
460
427
  end
461
428
 
462
429
  def validate_runtime!
@@ -511,10 +478,10 @@ module Bundler
511
478
  end
512
479
 
513
480
  def remove_platform(platform)
514
- removed_platform = @platforms.delete(Gem::Platform.new(platform))
515
- @removed_platform ||= removed_platform
516
- return if removed_platform
517
- raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
481
+ raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}" unless @platforms.include?(platform)
482
+
483
+ @removed_platforms << platform
484
+ @platforms.delete(platform)
518
485
  end
519
486
 
520
487
  def nothing_changed?
@@ -541,6 +508,46 @@ module Bundler
541
508
 
542
509
  private
543
510
 
511
+ def lockfile_changes_summary(update_refused_reason)
512
+ added = []
513
+ deleted = []
514
+ changed = []
515
+
516
+ added.concat @new_platforms.map {|p| "* platform: #{p}" }
517
+ deleted.concat @removed_platforms.map {|p| "* platform: #{p}" }
518
+
519
+ added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any?
520
+ deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } if deleted_deps.any?
521
+
522
+ both_sources = Hash.new {|h, k| h[k] = [] }
523
+ current_dependencies.each {|d| both_sources[d.name][0] = d }
524
+ current_locked_dependencies.each {|d| both_sources[d.name][1] = d }
525
+
526
+ both_sources.each do |name, (dep, lock_dep)|
527
+ next if dep.nil? || lock_dep.nil?
528
+
529
+ gemfile_source = dep.source || default_source
530
+ lock_source = lock_dep.source || default_source
531
+ next if lock_source.include?(gemfile_source)
532
+
533
+ gemfile_source_name = dep.source ? gemfile_source.to_gemfile : "no specified source"
534
+ lockfile_source_name = lock_dep.source ? lock_source.to_gemfile : "no specified source"
535
+ changed << "* #{name} from `#{lockfile_source_name}` to `#{gemfile_source_name}`"
536
+ end
537
+
538
+ return unless added.any? || deleted.any? || changed.any? || resolve_needed?
539
+
540
+ reason = resolve_needed? ? change_reason : "some dependencies were deleted from your gemfile"
541
+
542
+ msg = String.new
543
+ msg << "#{reason.capitalize.strip}, but the lockfile can't be updated because #{update_refused_reason}"
544
+ msg << "\n\nYou have added to the Gemfile:\n" << added.join("\n") if added.any?
545
+ msg << "\n\nYou have deleted from the Gemfile:\n" << deleted.join("\n") if deleted.any?
546
+ msg << "\n\nYou have changed in the Gemfile:\n" << changed.join("\n") if changed.any?
547
+ msg << "\n\nRun `bundle install` elsewhere and add the updated #{SharedHelpers.relative_gemfile_path} to version control.\n" unless unlocking?
548
+ msg
549
+ end
550
+
544
551
  def install_needed?
545
552
  resolve_needed? || missing_specs?
546
553
  end
@@ -601,8 +608,12 @@ module Bundler
601
608
  return
602
609
  end
603
610
 
604
- SharedHelpers.filesystem_access(file) do |p|
605
- File.open(p, "wb") {|f| f.puts(contents) }
611
+ begin
612
+ SharedHelpers.filesystem_access(file) do |p|
613
+ File.open(p, "wb") {|f| f.puts(contents) }
614
+ end
615
+ rescue ReadOnlyFileSystemError
616
+ raise ProductionError, lockfile_changes_summary("file system is read-only")
606
617
  end
607
618
  end
608
619
 
@@ -625,7 +636,8 @@ module Bundler
625
636
  @resolution_packages ||= begin
626
637
  last_resolve = converge_locked_specs
627
638
  remove_invalid_platforms!
628
- packages = Resolver::Base.new(source_requirements, expanded_dependencies, last_resolve, @platforms, locked_specs: @originally_locked_specs, unlock: @unlocking_all || @gems_to_unlock, prerelease: gem_version_promoter.pre?, prefer_local: @prefer_local, new_platforms: @new_platforms)
639
+ new_resolution_platforms = @current_platform_missing ? @new_platforms + [local_platform] : @new_platforms
640
+ packages = Resolver::Base.new(source_requirements, expanded_dependencies, last_resolve, @platforms, locked_specs: @originally_locked_specs, unlock: @unlocking_all || @gems_to_unlock, prerelease: gem_version_promoter.pre?, prefer_local: @prefer_local, new_platforms: new_resolution_platforms)
629
641
  packages = additional_base_requirements_to_prevent_downgrades(packages)
630
642
  packages = additional_base_requirements_to_force_updates(packages)
631
643
  packages
@@ -768,7 +780,6 @@ module Bundler
768
780
  @most_specific_non_local_locked_platform = find_most_specific_locked_platform
769
781
  return if @most_specific_non_local_locked_platform
770
782
 
771
- @new_platforms << local_platform
772
783
  @platforms << local_platform
773
784
  true
774
785
  end
@@ -799,7 +810,7 @@ module Bundler
799
810
  [@source_changes, "the list of sources changed"],
800
811
  [@dependency_changes, "the dependencies in your gemfile changed"],
801
812
  [@current_platform_missing, "your lockfile does not include the current platform"],
802
- [@new_platforms.any?, "you added a new platform to your gemfile"],
813
+ [@new_platforms.any?, "you are adding a new platform to your lockfile"],
803
814
  [@path_changes, "the gemspecs for path gems changed"],
804
815
  [@local_changes, "the gemspecs for git local gems changed"],
805
816
  [@missing_lockfile_dep, "your lock file is missing \"#{@missing_lockfile_dep}\""],
@@ -193,6 +193,24 @@ module Bundler
193
193
  status_code(31)
194
194
  end
195
195
 
196
+ class ReadOnlyFileSystemError < PermissionError
197
+ def message
198
+ "There was an error while trying to #{action} `#{@path}`. " \
199
+ "File system is read-only."
200
+ end
201
+
202
+ status_code(42)
203
+ end
204
+
205
+ class OperationNotPermittedError < PermissionError
206
+ def message
207
+ "There was an error while trying to #{action} `#{@path}`. " \
208
+ "Underlying OS system call raised an EPERM error."
209
+ end
210
+
211
+ status_code(43)
212
+ end
213
+
196
214
  class GenericSystemCallError < BundlerError
197
215
  attr_reader :underlying_error
198
216
 
@@ -108,17 +108,17 @@ module Bundler
108
108
  end
109
109
 
110
110
  if d.groups != Array(:default)
111
- group = d.groups.size == 1 ? ", :group => #{d.groups.first.inspect}" : ", :groups => #{d.groups.inspect}"
111
+ group = d.groups.size == 1 ? ", group: #{d.groups.first.inspect}" : ", groups: #{d.groups.inspect}"
112
112
  end
113
113
 
114
- source = ", :source => \"#{d.source}\"" unless d.source.nil?
115
- path = ", :path => \"#{d.path}\"" unless d.path.nil?
116
- git = ", :git => \"#{d.git}\"" unless d.git.nil?
117
- github = ", :github => \"#{d.github}\"" unless d.github.nil?
118
- branch = ", :branch => \"#{d.branch}\"" unless d.branch.nil?
119
- ref = ", :ref => \"#{d.ref}\"" unless d.ref.nil?
120
- glob = ", :glob => \"#{d.glob}\"" unless d.glob.nil?
121
- require_path = ", :require => #{convert_autorequire(d.autorequire)}" unless d.autorequire.nil?
114
+ source = ", source: \"#{d.source}\"" unless d.source.nil?
115
+ path = ", path: \"#{d.path}\"" unless d.path.nil?
116
+ git = ", git: \"#{d.git}\"" unless d.git.nil?
117
+ github = ", github: \"#{d.github}\"" unless d.github.nil?
118
+ branch = ", branch: \"#{d.branch}\"" unless d.branch.nil?
119
+ ref = ", ref: \"#{d.ref}\"" unless d.ref.nil?
120
+ glob = ", glob: \"#{d.glob}\"" unless d.glob.nil?
121
+ require_path = ", require: #{convert_autorequire(d.autorequire)}" unless d.autorequire.nil?
122
122
 
123
123
  %(gem #{name}#{requirement}#{group}#{source}#{path}#{git}#{github}#{branch}#{ref}#{glob}#{require_path})
124
124
  end.join("\n")
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-ADD" "1" "January 2025" ""
3
+ .TH "BUNDLE\-ADD" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-BINSTUBS" "1" "January 2025" ""
3
+ .TH "BUNDLE\-BINSTUBS" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CACHE" "1" "January 2025" ""
3
+ .TH "BUNDLE\-CACHE" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CHECK" "1" "January 2025" ""
3
+ .TH "BUNDLE\-CHECK" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CLEAN" "1" "January 2025" ""
3
+ .TH "BUNDLE\-CLEAN" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CONFIG" "1" "January 2025" ""
3
+ .TH "BUNDLE\-CONFIG" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-config\fR \- Set bundler configuration options
6
6
  .SH "SYNOPSIS"
@@ -56,16 +56,16 @@ Creates a directory (defaults to \fB~/bin\fR) and place any executables from the
56
56
  In deployment mode, Bundler will 'roll\-out' the bundle for \fBproduction\fR use\. Please check carefully if you want to have this option enabled in \fBdevelopment\fR or \fBtest\fR environments\.
57
57
  .TP
58
58
  \fBonly\fR
59
- A space\-separated list of groups to install only gems of the specified groups\.
59
+ A space\-separated list of groups to install only gems of the specified groups\. Please check carefully if you want to install also gems without a group, cause they get put inside \fBdefault\fR group\. For example \fBonly test:default\fR will install all gems specified in test group and without one\.
60
60
  .TP
61
61
  \fBpath\fR
62
62
  The location to install the specified gems to\. This defaults to Rubygems' setting\. Bundler shares this location with Rubygems, \fBgem install \|\.\|\.\|\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \|\.\|\.\|\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\.
63
63
  .TP
64
64
  \fBwithout\fR
65
- A space\-separated list of groups referencing gems to skip during installation\.
65
+ A space\-separated or \fB:\fR\-separated list of groups referencing gems to skip during installation\.
66
66
  .TP
67
67
  \fBwith\fR
68
- A space\-separated list of \fBoptional\fR groups referencing gems to include during installation\.
68
+ A space\-separated or \fB:\fR\-separated list of \fBoptional\fR groups referencing gems to include during installation\.
69
69
  .SH "BUILD OPTIONS"
70
70
  You can use \fBbundle config\fR to give Bundler the flags to pass to the gem installer every time bundler tries to install a particular gem\.
71
71
  .P
@@ -197,9 +197,9 @@ The following is a list of all configuration keys and their purpose\. You can le
197
197
  .IP "\(bu" 4
198
198
  \fBversion\fR (\fBBUNDLE_VERSION\fR): The version of Bundler to use when running under Bundler environment\. Defaults to \fBlockfile\fR\. You can also specify \fBsystem\fR or \fBx\.y\.z\fR\. \fBlockfile\fR will use the Bundler version specified in the \fBGemfile\.lock\fR, \fBsystem\fR will use the system version of Bundler, and \fBx\.y\.z\fR will use the specified version of Bundler\.
199
199
  .IP "\(bu" 4
200
- \fBwith\fR (\fBBUNDLE_WITH\fR): A \fB:\fR\-separated list of groups whose gems bundler should install\.
200
+ \fBwith\fR (\fBBUNDLE_WITH\fR): A space\-separated or \fB:\fR\-separated list of groups whose gems bundler should install\.
201
201
  .IP "\(bu" 4
202
- \fBwithout\fR (\fBBUNDLE_WITHOUT\fR): A \fB:\fR\-separated list of groups whose gems bundler should not install\.
202
+ \fBwithout\fR (\fBBUNDLE_WITHOUT\fR): A space\-separated or \fB:\fR\-separated list of groups whose gems bundler should not install\.
203
203
  .IP "" 0
204
204
  .SH "LOCAL GIT REPOS"
205
205
  Bundler also allows you to work against a git repository locally instead of using the remote version\. This can be achieved by setting up a local override:
@@ -79,6 +79,9 @@ The options that can be configured are:
79
79
 
80
80
  * `only`:
81
81
  A space-separated list of groups to install only gems of the specified groups.
82
+ Please check carefully if you want to install also gems without a group, cause
83
+ they get put inside `default` group. For example `only test:default` will install
84
+ all gems specified in test group and without one.
82
85
 
83
86
  * `path`:
84
87
  The location to install the specified gems to. This defaults to Rubygems'
@@ -88,10 +91,12 @@ The options that can be configured are:
88
91
  installed to other locations will not get listed.
89
92
 
90
93
  * `without`:
91
- A space-separated list of groups referencing gems to skip during installation.
94
+ A space-separated or `:`-separated list of groups referencing gems to skip during
95
+ installation.
92
96
 
93
97
  * `with`:
94
- A space-separated list of **optional** groups referencing gems to include during installation.
98
+ A space-separated or `:`-separated list of **optional** groups referencing gems to
99
+ include during installation.
95
100
 
96
101
  ## BUILD OPTIONS
97
102
 
@@ -280,9 +285,9 @@ learn more about their operation in [bundle install(1)](bundle-install.1.html).
280
285
  `system` will use the system version of Bundler, and `x.y.z` will use
281
286
  the specified version of Bundler.
282
287
  * `with` (`BUNDLE_WITH`):
283
- A `:`-separated list of groups whose gems bundler should install.
288
+ A space-separated or `:`-separated list of groups whose gems bundler should install.
284
289
  * `without` (`BUNDLE_WITHOUT`):
285
- A `:`-separated list of groups whose gems bundler should not install.
290
+ A space-separated or `:`-separated list of groups whose gems bundler should not install.
286
291
 
287
292
  ## LOCAL GIT REPOS
288
293
 
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-CONSOLE" "1" "January 2025" ""
3
+ .TH "BUNDLE\-CONSOLE" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-console\fR \- Open an IRB session with the bundle pre\-loaded
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-DOCTOR" "1" "January 2025" ""
3
+ .TH "BUNDLE\-DOCTOR" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-doctor\fR \- Checks the bundle for common problems
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-ENV" "1" "January 2025" ""
3
+ .TH "BUNDLE\-ENV" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-env\fR \- Print information about the environment Bundler is running under
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-EXEC" "1" "January 2025" ""
3
+ .TH "BUNDLE\-EXEC" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-exec\fR \- Execute a command in the context of the bundle
6
6
  .SH "SYNOPSIS"
@@ -74,8 +74,8 @@ end
74
74
  Bundler provides convenience helpers that wrap \fBsystem\fR and \fBexec\fR, and they can be used like this:
75
75
  .IP "" 4
76
76
  .nf
77
- Bundler\.clean_system('brew install wget')
78
- Bundler\.clean_exec('brew install wget')
77
+ Bundler\.unbundled_system('brew install wget')
78
+ Bundler\.unbundled_exec('brew install wget')
79
79
  .fi
80
80
  .IP "" 0
81
81
  .SH "RUBYGEMS PLUGINS"
@@ -108,8 +108,8 @@ need to use `with_unbundled_env`.
108
108
  Bundler provides convenience helpers that wrap `system` and `exec`, and they
109
109
  can be used like this:
110
110
 
111
- Bundler.clean_system('brew install wget')
112
- Bundler.clean_exec('brew install wget')
111
+ Bundler.unbundled_system('brew install wget')
112
+ Bundler.unbundled_exec('brew install wget')
113
113
 
114
114
 
115
115
  ## RUBYGEMS PLUGINS
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-FUND" "1" "January 2025" ""
3
+ .TH "BUNDLE\-FUND" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-fund\fR \- Lists information about gems seeking funding assistance
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-GEM" "1" "January 2025" ""
3
+ .TH "BUNDLE\-GEM" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-HELP" "1" "January 2025" ""
3
+ .TH "BUNDLE\-HELP" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-help\fR \- Displays detailed help for each subcommand
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-INFO" "1" "January 2025" ""
3
+ .TH "BUNDLE\-INFO" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-info\fR \- Show information for the given gem in your bundle
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-INIT" "1" "January 2025" ""
3
+ .TH "BUNDLE\-INIT" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-init\fR \- Generates a Gemfile into the current working directory
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-INJECT" "1" "January 2025" ""
3
+ .TH "BUNDLE\-INJECT" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-INSTALL" "1" "January 2025" ""
3
+ .TH "BUNDLE\-INSTALL" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-ISSUE" "1" "January 2025" ""
3
+ .TH "BUNDLE\-ISSUE" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-issue\fR \- Get help reporting Bundler issues
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-LICENSES" "1" "January 2025" ""
3
+ .TH "BUNDLE\-LICENSES" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-licenses\fR \- Print the license of all gems in the bundle
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-LIST" "1" "January 2025" ""
3
+ .TH "BUNDLE\-LIST" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-list\fR \- List all the gems in the bundle
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-LOCK" "1" "January 2025" ""
3
+ .TH "BUNDLE\-LOCK" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-OPEN" "1" "January 2025" ""
3
+ .TH "BUNDLE\-OPEN" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-OUTDATED" "1" "January 2025" ""
3
+ .TH "BUNDLE\-OUTDATED" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-outdated\fR \- List installed gems with newer versions available
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-PLATFORM" "1" "January 2025" ""
3
+ .TH "BUNDLE\-PLATFORM" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-platform\fR \- Displays platform compatibility information
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-PLUGIN" "1" "January 2025" ""
3
+ .TH "BUNDLE\-PLUGIN" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-plugin\fR \- Manage Bundler plugins
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-PRISTINE" "1" "January 2025" ""
3
+ .TH "BUNDLE\-PRISTINE" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-REMOVE" "1" "January 2025" ""
3
+ .TH "BUNDLE\-REMOVE" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-remove\fR \- Removes gems from the Gemfile
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-SHOW" "1" "January 2025" ""
3
+ .TH "BUNDLE\-SHOW" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-UPDATE" "1" "January 2025" ""
3
+ .TH "BUNDLE\-UPDATE" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-update\fR \- Update your gems to the latest available versions
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-VERSION" "1" "January 2025" ""
3
+ .TH "BUNDLE\-VERSION" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-version\fR \- Prints Bundler version information
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE\-VIZ" "1" "January 2025" ""
3
+ .TH "BUNDLE\-VIZ" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "BUNDLE" "1" "January 2025" ""
3
+ .TH "BUNDLE" "1" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\fR \- Ruby Dependency Management
6
6
  .SH "SYNOPSIS"
@@ -1,6 +1,6 @@
1
1
  .\" generated with Ronn-NG/v0.10.1
2
2
  .\" http://github.com/apjanke/ronn-ng/tree/0.10.1
3
- .TH "GEMFILE" "5" "January 2025" ""
3
+ .TH "GEMFILE" "5" "March 2025" ""
4
4
  .SH "NAME"
5
5
  \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
6
6
  .SH "SYNOPSIS"
@@ -31,7 +31,7 @@ module Bundler
31
31
 
32
32
  begin
33
33
  load_index(global_index_file, true)
34
- rescue GenericSystemCallError
34
+ rescue PermissionError
35
35
  # no need to fail when on a read-only FS, for example
36
36
  nil
37
37
  rescue ArgumentError => e
@@ -48,35 +48,38 @@ module Bundler
48
48
  @version.segments
49
49
  end
50
50
 
51
- def sort_obj
52
- [@version, @priority]
53
- end
54
-
55
51
  def <=>(other)
56
52
  return unless other.is_a?(self.class)
57
53
 
58
- sort_obj <=> other.sort_obj
54
+ version_comparison = version <=> other.version
55
+ return version_comparison unless version_comparison.zero?
56
+
57
+ priority <=> other.priority
59
58
  end
60
59
 
61
60
  def ==(other)
62
61
  return unless other.is_a?(self.class)
63
62
 
64
- sort_obj == other.sort_obj
63
+ version == other.version && priority == other.priority
65
64
  end
66
65
 
67
66
  def eql?(other)
68
67
  return unless other.is_a?(self.class)
69
68
 
70
- sort_obj.eql?(other.sort_obj)
69
+ version.eql?(other.version) && priority.eql?(other.priority)
71
70
  end
72
71
 
73
72
  def hash
74
- sort_obj.hash
73
+ [@version, @priority].hash
75
74
  end
76
75
 
77
76
  def to_s
78
77
  @version.to_s
79
78
  end
79
+
80
+ protected
81
+
82
+ attr_reader :priority
80
83
  end
81
84
  end
82
85
  end
@@ -115,6 +115,10 @@ module Bundler
115
115
  raise NoSpaceOnDeviceError.new(path, action)
116
116
  rescue Errno::ENOTSUP
117
117
  raise OperationNotSupportedError.new(path, action)
118
+ rescue Errno::EPERM
119
+ raise OperationNotPermittedError.new(path, action)
120
+ rescue Errno::EROFS
121
+ raise ReadOnlyFileSystemError.new(path, action)
118
122
  rescue Errno::EEXIST, Errno::ENOENT
119
123
  raise
120
124
  rescue SystemCallError => e
@@ -147,6 +147,12 @@ module Bundler
147
147
  end
148
148
  end
149
149
 
150
+ def installed_to?(destination)
151
+ # if copy_to is interrupted, it may leave a partially installed directory that
152
+ # contains .git but no other files -- consider this not to be installed
153
+ Dir.exist?(destination) && (Dir.children(destination) - [".git"]).any?
154
+ end
155
+
150
156
  private
151
157
 
152
158
  def git_remote_fetch(args)
@@ -360,7 +360,11 @@ module Bundler
360
360
  end
361
361
 
362
362
  def locked_revision_checked_out?
363
- locked_revision && locked_revision == revision && install_path.exist?
363
+ locked_revision && locked_revision == revision && installed?
364
+ end
365
+
366
+ def installed?
367
+ git_proxy.installed_to?(install_path)
364
368
  end
365
369
 
366
370
  def base_name
@@ -16,6 +16,9 @@ module Bundler
16
16
  @anonymized_uri = remove_auth(@uri).freeze
17
17
  end
18
18
 
19
+ MAX_CACHE_SLUG_HOST_SIZE = 255 - 1 - 32 # 255 minus dot minus MD5 length
20
+ private_constant :MAX_CACHE_SLUG_HOST_SIZE
21
+
19
22
  # @return [String] A slug suitable for use as a cache key for this
20
23
  # remote.
21
24
  #
@@ -28,10 +31,15 @@ module Bundler
28
31
  host = cache_uri.to_s.start_with?("file://") ? nil : cache_uri.host
29
32
 
30
33
  uri_parts = [host, cache_uri.user, cache_uri.port, cache_uri.path]
31
- uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join("."))
34
+ uri_parts.compact!
35
+ uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.join("."))
36
+
37
+ uri_parts.pop
38
+ host_parts = uri_parts.join(".")
39
+ return uri_digest if host_parts.empty?
32
40
 
33
- uri_parts[-1] = uri_digest
34
- uri_parts.compact.join(".")
41
+ shortened_host_parts = host_parts[0...MAX_CACHE_SLUG_HOST_SIZE]
42
+ [shortened_host_parts, uri_digest].join(".")
35
43
  end
36
44
  end
37
45
 
@@ -13,15 +13,19 @@ require_relative "rfc2396_parser"
13
13
  require_relative "rfc3986_parser"
14
14
 
15
15
  module Bundler::URI
16
+ # The default parser instance for RFC 2396.
16
17
  RFC2396_PARSER = RFC2396_Parser.new
17
18
  Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor)
18
19
 
20
+ # The default parser instance for RFC 3986.
19
21
  RFC3986_PARSER = RFC3986_Parser.new
20
22
  Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor)
21
23
 
24
+ # The default parser instance.
22
25
  DEFAULT_PARSER = RFC3986_PARSER
23
26
  Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor)
24
27
 
28
+ # Set the default parser instance.
25
29
  def self.parser=(parser = RFC3986_PARSER)
26
30
  remove_const(:Parser) if defined?(::Bundler::URI::Parser)
27
31
  const_set("Parser", parser.class)
@@ -40,7 +44,7 @@ module Bundler::URI
40
44
  end
41
45
  self.parser = RFC3986_PARSER
42
46
 
43
- def self.const_missing(const)
47
+ def self.const_missing(const) # :nodoc:
44
48
  if const == :REGEXP
45
49
  warn "Bundler::URI::REGEXP is obsolete. Use Bundler::URI::RFC2396_REGEXP explicitly.", uplevel: 1 if $VERBOSE
46
50
  Bundler::URI::RFC2396_REGEXP
@@ -87,7 +91,7 @@ module Bundler::URI
87
91
  module_function :make_components_hash
88
92
  end
89
93
 
90
- module Schemes
94
+ module Schemes # :nodoc:
91
95
  end
92
96
  private_constant :Schemes
93
97
 
@@ -305,7 +309,7 @@ module Bundler::URI
305
309
  256.times do |i|
306
310
  TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i)
307
311
  end
308
- TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze
312
+ TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze # :nodoc:
309
313
  TBLENCWWWCOMP_[' '] = '+'
310
314
  TBLENCWWWCOMP_.freeze
311
315
  TBLDECWWWCOMP_ = {} # :nodoc:
@@ -737,12 +737,12 @@ module Bundler::URI
737
737
  end
738
738
  private :check_registry
739
739
 
740
- def set_registry(v) #:nodoc:
740
+ def set_registry(v) # :nodoc:
741
741
  raise InvalidURIError, "cannot set registry"
742
742
  end
743
743
  protected :set_registry
744
744
 
745
- def registry=(v)
745
+ def registry=(v) # :nodoc:
746
746
  raise InvalidURIError, "cannot set registry"
747
747
  end
748
748
 
@@ -1133,17 +1133,16 @@ module Bundler::URI
1133
1133
  base.fragment=(nil)
1134
1134
 
1135
1135
  # RFC2396, Section 5.2, 4)
1136
- if !authority
1137
- base.set_path(merge_path(base.path, rel.path)) if base.path && rel.path
1138
- else
1139
- # RFC2396, Section 5.2, 4)
1140
- base.set_path(rel.path) if rel.path
1136
+ if authority
1137
+ base.set_userinfo(rel.userinfo)
1138
+ base.set_host(rel.host)
1139
+ base.set_port(rel.port || base.default_port)
1140
+ base.set_path(rel.path)
1141
+ elsif base.path && rel.path
1142
+ base.set_path(merge_path(base.path, rel.path))
1141
1143
  end
1142
1144
 
1143
1145
  # RFC2396, Section 5.2, 7)
1144
- base.set_userinfo(rel.userinfo) if rel.userinfo
1145
- base.set_host(rel.host) if rel.host
1146
- base.set_port(rel.port) if rel.port
1147
1146
  base.query = rel.query if rel.query
1148
1147
  base.fragment=(rel.fragment) if rel.fragment
1149
1148
 
@@ -1392,10 +1391,12 @@ module Bundler::URI
1392
1391
  end
1393
1392
  end
1394
1393
 
1394
+ # Returns the hash value.
1395
1395
  def hash
1396
1396
  self.component_ary.hash
1397
1397
  end
1398
1398
 
1399
+ # Compares with _oth_ for Hash.
1399
1400
  def eql?(oth)
1400
1401
  self.class == oth.class &&
1401
1402
  parser == oth.parser &&
@@ -1438,7 +1439,7 @@ module Bundler::URI
1438
1439
  end
1439
1440
  end
1440
1441
 
1441
- def inspect
1442
+ def inspect # :nodoc:
1442
1443
  "#<#{self.class} #{self}>"
1443
1444
  end
1444
1445
 
@@ -321,14 +321,14 @@ module Bundler::URI
321
321
  str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) }
322
322
  end
323
323
 
324
- @@to_s = Kernel.instance_method(:to_s)
325
- if @@to_s.respond_to?(:bind_call)
326
- def inspect
327
- @@to_s.bind_call(self)
324
+ TO_S = Kernel.instance_method(:to_s) # :nodoc:
325
+ if TO_S.respond_to?(:bind_call)
326
+ def inspect # :nodoc:
327
+ TO_S.bind_call(self)
328
328
  end
329
329
  else
330
- def inspect
331
- @@to_s.bind(self).call
330
+ def inspect # :nodoc:
331
+ TO_S.bind(self).call
332
332
  end
333
333
  end
334
334
 
@@ -1,6 +1,6 @@
1
1
  module Bundler::URI
2
2
  # :stopdoc:
3
- VERSION_CODE = '010002'.freeze
3
+ VERSION_CODE = '010003'.freeze
4
4
  VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze
5
5
  # :startdoc:
6
6
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "2.6.5".freeze
4
+ VERSION = "2.6.6".freeze
5
5
 
6
6
  def self.bundler_major_version
7
7
  @bundler_major_version ||= VERSION.split(".").first.to_i
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.6.5
4
+ version: 2.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Arko
@@ -21,7 +21,7 @@ authors:
21
21
  - Yehuda Katz
22
22
  bindir: exe
23
23
  cert_chain: []
24
- date: 2025-02-20 00:00:00.000000000 Z
24
+ date: 2025-03-13 00:00:00.000000000 Z
25
25
  dependencies: []
26
26
  description: Bundler manages an application's dependencies through its entire life,
27
27
  across many machines, systematically and repeatably
@@ -411,7 +411,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
411
411
  - !ruby/object:Gem::Version
412
412
  version: 3.3.3
413
413
  requirements: []
414
- rubygems_version: 3.6.5
414
+ rubygems_version: 3.6.6
415
415
  specification_version: 4
416
416
  summary: The best way to manage your application's dependencies
417
417
  test_files: []