bundler 2.6.5 → 2.6.7

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +52 -6
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/checksum.rb +22 -12
  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/cache.rb +1 -1
  9. data/lib/bundler/compact_index_client/parser.rb +1 -1
  10. data/lib/bundler/compact_index_client/updater.rb +2 -1
  11. data/lib/bundler/definition.rb +108 -91
  12. data/lib/bundler/dsl.rb +2 -3
  13. data/lib/bundler/errors.rb +18 -0
  14. data/lib/bundler/injector.rb +9 -9
  15. data/lib/bundler/lazy_specification.rb +9 -1
  16. data/lib/bundler/lockfile_parser.rb +8 -5
  17. data/lib/bundler/man/bundle-add.1 +1 -1
  18. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  19. data/lib/bundler/man/bundle-cache.1 +1 -1
  20. data/lib/bundler/man/bundle-check.1 +1 -1
  21. data/lib/bundler/man/bundle-clean.1 +1 -1
  22. data/lib/bundler/man/bundle-config.1 +6 -6
  23. data/lib/bundler/man/bundle-config.1.ronn +9 -4
  24. data/lib/bundler/man/bundle-console.1 +1 -1
  25. data/lib/bundler/man/bundle-doctor.1 +1 -1
  26. data/lib/bundler/man/bundle-env.1 +1 -1
  27. data/lib/bundler/man/bundle-exec.1 +3 -3
  28. data/lib/bundler/man/bundle-exec.1.ronn +2 -2
  29. data/lib/bundler/man/bundle-fund.1 +1 -1
  30. data/lib/bundler/man/bundle-gem.1 +1 -1
  31. data/lib/bundler/man/bundle-help.1 +1 -1
  32. data/lib/bundler/man/bundle-info.1 +1 -1
  33. data/lib/bundler/man/bundle-init.1 +1 -1
  34. data/lib/bundler/man/bundle-inject.1 +1 -1
  35. data/lib/bundler/man/bundle-install.1 +1 -1
  36. data/lib/bundler/man/bundle-issue.1 +1 -1
  37. data/lib/bundler/man/bundle-licenses.1 +1 -1
  38. data/lib/bundler/man/bundle-list.1 +1 -1
  39. data/lib/bundler/man/bundle-lock.1 +1 -1
  40. data/lib/bundler/man/bundle-open.1 +1 -1
  41. data/lib/bundler/man/bundle-outdated.1 +1 -1
  42. data/lib/bundler/man/bundle-platform.1 +1 -1
  43. data/lib/bundler/man/bundle-plugin.1 +1 -1
  44. data/lib/bundler/man/bundle-pristine.1 +1 -1
  45. data/lib/bundler/man/bundle-remove.1 +1 -1
  46. data/lib/bundler/man/bundle-show.1 +1 -1
  47. data/lib/bundler/man/bundle-update.1 +1 -1
  48. data/lib/bundler/man/bundle-version.1 +1 -1
  49. data/lib/bundler/man/bundle-viz.1 +1 -1
  50. data/lib/bundler/man/bundle.1 +1 -1
  51. data/lib/bundler/man/gemfile.5 +1 -1
  52. data/lib/bundler/plugin/api/source.rb +1 -1
  53. data/lib/bundler/plugin/index.rb +1 -1
  54. data/lib/bundler/plugin/installer/path.rb +8 -0
  55. data/lib/bundler/plugin.rb +1 -1
  56. data/lib/bundler/resolver/candidate.rb +12 -9
  57. data/lib/bundler/resolver/strategy.rb +40 -0
  58. data/lib/bundler/resolver.rb +11 -22
  59. data/lib/bundler/rubygems_ext.rb +15 -0
  60. data/lib/bundler/runtime.rb +8 -5
  61. data/lib/bundler/shared_helpers.rb +4 -0
  62. data/lib/bundler/source/gemspec.rb +1 -4
  63. data/lib/bundler/source/git/git_proxy.rb +14 -3
  64. data/lib/bundler/source/git.rb +5 -1
  65. data/lib/bundler/source/path.rb +2 -2
  66. data/lib/bundler/source/rubygems/remote.rb +11 -3
  67. data/lib/bundler/source_list.rb +29 -11
  68. data/lib/bundler/spec_set.rb +11 -4
  69. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
  70. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  71. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
  72. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
  73. data/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
  74. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
  75. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
  76. data/lib/bundler/vendor/uri/lib/uri/common.rb +7 -3
  77. data/lib/bundler/vendor/uri/lib/uri/generic.rb +12 -11
  78. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +6 -6
  79. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  80. data/lib/bundler/version.rb +1 -1
  81. metadata +5 -4
  82. data/lib/bundler/compact_index_client/gem_parser.rb +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 244b150c10d3a97538eb2fca0bfd11f4f1d52498e017a412cb22cafab11b95d9
4
- data.tar.gz: 3c09d427c503b26379f13fdb225368e2d7987f9588b6f1c3e9691145fb8b90ba
3
+ metadata.gz: 9135fec12672acb616058b986f9ee528f8dbaf5b5452a413a93bf4188f381813
4
+ data.tar.gz: 8b5ffbe95febae6b17210c94972b43ecf3009c665720e976156a8ecbb4d0cc8b
5
5
  SHA512:
6
- metadata.gz: 9edd329b4f4e36c9bfce9ad4468f764d011afe7f774439d6700f49064201fbe06bf1c374a938a96ae24933df34344c142f6db071324306b4255a235da2f1ff20
7
- data.tar.gz: e26f55ba1f69d938047333d1065f1cc75ebf4c865ba966ba5355084681263392928c3f902fbd26d94077ac51dabfd1aacad4a2329b7c934fbc689f363761f4db
6
+ metadata.gz: 246ae795176220dde699c7d808bc876d4cbf0180b4eb58521efb6785ab699266ffbfbee550380e4e98c002a74cfca386eb7e238d37286775b7a870b4521abcda
7
+ data.tar.gz: '040083539b5e2bd6d968a80de1314c65bc46bb3652189dc0849b73653aed0825993770adc5e7eca99099078be3aba7b47cc34fe10e4c8bfa5fc6927328aaf12f'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,49 @@
1
+ # 2.6.7 (April 3, 2025)
2
+
3
+ ## Enhancements:
4
+
5
+ - Fix crash when server compact index API implementation only lists versions [#8594](https://github.com/rubygems/rubygems/pull/8594)
6
+ - Fix lockfile when a gem ends up accidentally under two different sources [#8579](https://github.com/rubygems/rubygems/pull/8579)
7
+ - Refuse to install and print an error in frozen mode if some entries are missing in CHECKSUMS lockfile section [#8563](https://github.com/rubygems/rubygems/pull/8563)
8
+ - Support git 2.49 [#8581](https://github.com/rubygems/rubygems/pull/8581)
9
+ - Improve wording of a few messages [#8570](https://github.com/rubygems/rubygems/pull/8570)
10
+
11
+ ## Bug fixes:
12
+
13
+ - Fix `bundle add` sometimes generating invalid lockfiles [#8586](https://github.com/rubygems/rubygems/pull/8586)
14
+
15
+ ## Performance:
16
+
17
+ - Implement pub_grub strategy interface [#8589](https://github.com/rubygems/rubygems/pull/8589)
18
+ - Update vendored pub_grub [#8571](https://github.com/rubygems/rubygems/pull/8571)
19
+
20
+ # 2.6.6 (March 13, 2025)
21
+
22
+ ## Enhancements:
23
+
24
+ - Fix `ENAMETOOLONG` error when creating compact index cache [#5578](https://github.com/rubygems/rubygems/pull/5578)
25
+ - Use shorthand hash syntax for bundle add [#8547](https://github.com/rubygems/rubygems/pull/8547)
26
+ - Update vendored uri to 1.0.3 [#8534](https://github.com/rubygems/rubygems/pull/8534)
27
+ - Retry gracefully on blank partial response in compact index [#8524](https://github.com/rubygems/rubygems/pull/8524)
28
+ - Give a better error when trying to write the lock file on a read-only filesystem [#5920](https://github.com/rubygems/rubygems/pull/5920)
29
+ - Improve log messages when lockfile platforms are added [#8523](https://github.com/rubygems/rubygems/pull/8523)
30
+ - Allow noop `bundle install` to work on read-only or protected folders [#8519](https://github.com/rubygems/rubygems/pull/8519)
31
+
32
+ ## Bug fixes:
33
+
34
+ - 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)
35
+ - Modify `bundle doctor` to not report issue when files aren't writable [#8520](https://github.com/rubygems/rubygems/pull/8520)
36
+
37
+ ## Performance:
38
+
39
+ - Optimize resolution by removing an array allocation from `Candidate#<=>` [#8559](https://github.com/rubygems/rubygems/pull/8559)
40
+
41
+ ## Documentation:
42
+
43
+ - Update docs for with/without consistency [#8555](https://github.com/rubygems/rubygems/pull/8555)
44
+ - Recommend non-deprecated methods in `bundle exec` documentation [#8537](https://github.com/rubygems/rubygems/pull/8537)
45
+ - Hint about default group when using `only` configuration option [#8536](https://github.com/rubygems/rubygems/pull/8536)
46
+
1
47
  # 2.6.5 (February 20, 2025)
2
48
 
3
49
  ## Enhancements:
@@ -1291,7 +1337,7 @@
1291
1337
  - Enable parallel installation on Windows by default [#4822](https://github.com/rubygems/rubygems/pull/4822)
1292
1338
  - More logging when compact index is not used and we fallback to other APIs [#4546](https://github.com/rubygems/rubygems/pull/4546)
1293
1339
  - `bundle gem` generated MiniTest file and class now start with 'test' [#3893](https://github.com/rubygems/rubygems/pull/3893)
1294
- - Add `Bundler::Definition.no_lock` accessor for skipping lock file creation/update [#3401](https://github.com/rubygems/rubygems/pull/3401)
1340
+ - Add `Bundler::Definition.no_lock` accessor for skipping lockfile creation/update [#3401](https://github.com/rubygems/rubygems/pull/3401)
1295
1341
 
1296
1342
  ## Bug fixes:
1297
1343
 
@@ -2033,7 +2079,7 @@
2033
2079
  - Fix `bundle outdated --group NAME` when the group is listed second in the Gemfile ([#6116](https://github.com/rubygems/bundler/pull/6116))
2034
2080
  - Improve conflict resolution messages by not calling "ruby" a gem when conflict happens in the `required_ruby_version`, and by filtering out requirements that didn't contribute to the conflict ([#6647](https://github.com/rubygems/bundler/pull/6647))
2035
2081
  - Avoid fetching and rebuilding git gems whenever any gem is changed in the Gemfile ([#6711](https://github.com/rubygems/bundler/pull/6711))
2036
- - Include the exact bundler version in the lock file in the suggested command when bundler warns about version mismatches of itself [#6971](https://github.com/rubygems/bundler/pull/6971)
2082
+ - Include the exact bundler version in the lockfile in the suggested command when bundler warns about version mismatches of itself [#6971](https://github.com/rubygems/bundler/pull/6971)
2037
2083
  - Fix plugins being installed every time a command is run #[#6978](https://github.com/rubygems/bundler/pull/6978)
2038
2084
  - Fallback to sequentially fetching specs on 429s [#6728](https://github.com/rubygems/bundler/pull/6728)
2039
2085
  - Make `bundle clean` also clean native extensions for gems with a git source [#7058](https://github.com/rubygems/bundler/pull/7058)
@@ -3498,7 +3544,7 @@ Changes
3498
3544
 
3499
3545
  ## Bug fixes:
3500
3546
 
3501
- - Revert gem source sorting in lock files (@indirect)
3547
+ - Revert gem source sorting in lockfiles (@indirect)
3502
3548
 
3503
3549
  # 1.7.1 (August 20, 2014)
3504
3550
 
@@ -3598,7 +3644,7 @@ Changes
3598
3644
  - redirects across hosts now work on rubies without OpenSSL ([#2686](https://github.com/rubygems/bundler/issues/2686), @grddev)
3599
3645
  - gemspecs now handle filenames with newlines ([#2634](https://github.com/rubygems/bundler/issues/2634), @jasonmp85)
3600
3646
  - support escaped characters in usernames and passwords (@punkie)
3601
- - no more exception on `update GEM` without lock file (@simi)
3647
+ - no more exception on `update GEM` without lockfile (@simi)
3602
3648
  - allow long config values ([#2823](https://github.com/rubygems/bundler/issues/2823), @kgrz)
3603
3649
  - cache successfully even locked to gems shipped with Ruby ([#2869](https://github.com/rubygems/bundler/issues/2869), @aughr)
3604
3650
  - respect NO_PROXY even if a proxy is configured ([#2878](https://github.com/rubygems/bundler/issues/2878), @stlay)
@@ -3746,7 +3792,7 @@ Changes
3746
3792
 
3747
3793
  ## Bug fixes:
3748
3794
 
3749
- - make gemspec path option preserve relative paths in lock file (@bwillis)
3795
+ - make gemspec path option preserve relative paths in lockfile (@bwillis)
3750
3796
  - use umask when creating binstubs ([#1618](https://github.com/rubygems/bundler/issues/1618), @v-yarotsky)
3751
3797
  - warn if graphviz is not installed ([#2435](https://github.com/rubygems/bundler/issues/2435), @Agis-)
3752
3798
  - show git errors while loading gemspecs
@@ -4635,7 +4681,7 @@ Changes
4635
4681
  - Skeleton gemspec now works with older versions of git
4636
4682
  - Fix shell quoting and ref fetching in GemHelper
4637
4683
  - Disable colored output in --deployment
4638
- - Preserve line endings in lock file
4684
+ - Preserve line endings in lockfile
4639
4685
 
4640
4686
  ## Features:
4641
4687
 
@@ -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 = "1980-01-02".freeze
8
+ @git_commit_sha = "32896b3570e".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)
@@ -190,7 +190,7 @@ module Bundler
190
190
  def replace(spec, checksum)
191
191
  return unless checksum
192
192
 
193
- lock_name = spec.name_tuple.lock_name
193
+ lock_name = spec.lock_name
194
194
  @store_mutex.synchronize do
195
195
  existing = fetch_checksum(lock_name, checksum.algo)
196
196
  if !existing || existing.same_source?(checksum)
@@ -201,10 +201,12 @@ module Bundler
201
201
  end
202
202
  end
203
203
 
204
- def register(spec, checksum)
205
- return unless checksum
204
+ def missing?(spec)
205
+ @store[spec.lock_name].nil?
206
+ end
206
207
 
207
- register_checksum(spec.name_tuple.lock_name, checksum)
208
+ def register(spec, checksum)
209
+ register_checksum(spec.lock_name, checksum)
208
210
  end
209
211
 
210
212
  def merge!(other)
@@ -216,9 +218,9 @@ module Bundler
216
218
  end
217
219
 
218
220
  def to_lock(spec)
219
- lock_name = spec.name_tuple.lock_name
221
+ lock_name = spec.lock_name
220
222
  checksums = @store[lock_name]
221
- if checksums
223
+ if checksums&.any?
222
224
  "#{lock_name} #{checksums.values.map(&:to_lock).sort.join(",")}"
223
225
  else
224
226
  lock_name
@@ -229,11 +231,15 @@ module Bundler
229
231
 
230
232
  def register_checksum(lock_name, checksum)
231
233
  @store_mutex.synchronize do
232
- existing = fetch_checksum(lock_name, checksum.algo)
233
- if existing
234
- merge_checksum(lock_name, checksum, existing)
234
+ if checksum
235
+ existing = fetch_checksum(lock_name, checksum.algo)
236
+ if existing
237
+ merge_checksum(lock_name, checksum, existing)
238
+ else
239
+ store_checksum(lock_name, checksum)
240
+ end
235
241
  else
236
- store_checksum(lock_name, checksum)
242
+ init_checksum(lock_name)
237
243
  end
238
244
  end
239
245
  end
@@ -243,7 +249,11 @@ module Bundler
243
249
  end
244
250
 
245
251
  def store_checksum(lock_name, checksum)
246
- (@store[lock_name] ||= {})[checksum.algo] = checksum
252
+ init_checksum(lock_name)[checksum.algo] = checksum
253
+ end
254
+
255
+ def init_checksum(lock_name)
256
+ @store[lock_name] ||= {}
247
257
  end
248
258
 
249
259
  def fetch_checksum(lock_name, algo)
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "gem_parser"
3
+ require "rubygems/resolver/api_set/gem_parser"
4
4
 
5
5
  module Bundler
6
6
  class CompactIndexClient
@@ -64,7 +64,7 @@ module Bundler
64
64
  end
65
65
 
66
66
  def gem_parser
67
- @gem_parser ||= GemParser.new
67
+ @gem_parser ||= Gem::Resolver::APISet::GemParser.new
68
68
  end
69
69
 
70
70
  # This is mostly the same as `split(" ", 3)` but it avoids allocating extra objects.
@@ -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