bundler 2.4.21 → 2.5.0

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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +74 -0
  3. data/README.md +1 -2
  4. data/bundler.gemspec +4 -2
  5. data/exe/bundle +1 -10
  6. data/lib/bundler/build_metadata.rb +3 -3
  7. data/lib/bundler/capistrano.rb +1 -1
  8. data/lib/bundler/checksum.rb +245 -0
  9. data/lib/bundler/ci_detector.rb +75 -0
  10. data/lib/bundler/cli/add.rb +3 -3
  11. data/lib/bundler/cli/binstubs.rb +4 -4
  12. data/lib/bundler/cli/cache.rb +1 -1
  13. data/lib/bundler/cli/check.rb +1 -1
  14. data/lib/bundler/cli/common.rb +9 -1
  15. data/lib/bundler/cli/config.rb +8 -7
  16. data/lib/bundler/cli/console.rb +3 -2
  17. data/lib/bundler/cli/doctor.rb +2 -2
  18. data/lib/bundler/cli/exec.rb +1 -1
  19. data/lib/bundler/cli/gem.rb +31 -23
  20. data/lib/bundler/cli/info.rb +2 -13
  21. data/lib/bundler/cli/install.rb +5 -4
  22. data/lib/bundler/cli/issue.rb +1 -1
  23. data/lib/bundler/cli/lock.rb +4 -4
  24. data/lib/bundler/cli/open.rb +1 -1
  25. data/lib/bundler/cli/outdated.rb +6 -6
  26. data/lib/bundler/cli/plugin.rb +7 -14
  27. data/lib/bundler/cli/pristine.rb +38 -30
  28. data/lib/bundler/cli/show.rb +2 -2
  29. data/lib/bundler/cli/update.rb +5 -5
  30. data/lib/bundler/cli.rb +215 -263
  31. data/lib/bundler/compact_index_client/cache.rb +29 -9
  32. data/lib/bundler/compact_index_client/cache_file.rb +153 -0
  33. data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  34. data/lib/bundler/compact_index_client/updater.rb +79 -81
  35. data/lib/bundler/compact_index_client.rb +14 -7
  36. data/lib/bundler/constants.rb +1 -1
  37. data/lib/bundler/current_ruby.rb +5 -21
  38. data/lib/bundler/definition.rb +43 -16
  39. data/lib/bundler/dependency.rb +16 -12
  40. data/lib/bundler/digest.rb +2 -2
  41. data/lib/bundler/dsl.rb +43 -25
  42. data/lib/bundler/endpoint_specification.rb +6 -2
  43. data/lib/bundler/env.rb +1 -3
  44. data/lib/bundler/errors.rb +58 -0
  45. data/lib/bundler/fetcher/base.rb +3 -1
  46. data/lib/bundler/fetcher/compact_index.rb +4 -4
  47. data/lib/bundler/fetcher/downloader.rb +13 -11
  48. data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  49. data/lib/bundler/fetcher/index.rb +1 -1
  50. data/lib/bundler/fetcher.rb +28 -25
  51. data/lib/bundler/friendly_errors.rb +5 -5
  52. data/lib/bundler/gem_helper.rb +1 -1
  53. data/lib/bundler/gem_helpers.rb +12 -2
  54. data/lib/bundler/graph.rb +9 -9
  55. data/lib/bundler/index.rb +1 -2
  56. data/lib/bundler/injector.rb +1 -1
  57. data/lib/bundler/inline.rb +3 -3
  58. data/lib/bundler/installer/gem_installer.rb +10 -10
  59. data/lib/bundler/installer/parallel_installer.rb +16 -8
  60. data/lib/bundler/installer/standalone.rb +2 -3
  61. data/lib/bundler/installer.rb +9 -9
  62. data/lib/bundler/lazy_specification.rb +28 -17
  63. data/lib/bundler/lockfile_generator.rb +9 -0
  64. data/lib/bundler/lockfile_parser.rb +81 -10
  65. data/lib/bundler/man/bundle-add.1 +3 -26
  66. data/lib/bundler/man/bundle-binstubs.1 +4 -16
  67. data/lib/bundler/man/bundle-cache.1 +3 -24
  68. data/lib/bundler/man/bundle-check.1 +3 -12
  69. data/lib/bundler/man/bundle-clean.1 +3 -10
  70. data/lib/bundler/man/bundle-config.1 +20 -211
  71. data/lib/bundler/man/bundle-config.1.ronn +6 -0
  72. data/lib/bundler/man/bundle-console.1 +4 -22
  73. data/lib/bundler/man/bundle-doctor.1 +4 -18
  74. data/lib/bundler/man/bundle-exec.1 +12 -73
  75. data/lib/bundler/man/bundle-gem.1 +13 -49
  76. data/lib/bundler/man/bundle-help.1 +3 -7
  77. data/lib/bundler/man/bundle-info.1 +3 -9
  78. data/lib/bundler/man/bundle-init.1 +3 -12
  79. data/lib/bundler/man/bundle-inject.1 +6 -19
  80. data/lib/bundler/man/bundle-install.1 +27 -125
  81. data/lib/bundler/man/bundle-install.1.ronn +1 -0
  82. data/lib/bundler/man/bundle-list.1 +4 -19
  83. data/lib/bundler/man/bundle-lock.1 +5 -29
  84. data/lib/bundler/man/bundle-open.1 +7 -27
  85. data/lib/bundler/man/bundle-outdated.1 +3 -55
  86. data/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  87. data/lib/bundler/man/bundle-platform.1 +5 -27
  88. data/lib/bundler/man/bundle-plugin.1 +3 -29
  89. data/lib/bundler/man/bundle-pristine.1 +5 -16
  90. data/lib/bundler/man/bundle-remove.1 +4 -14
  91. data/lib/bundler/man/bundle-show.1 +3 -10
  92. data/lib/bundler/man/bundle-update.1 +18 -137
  93. data/lib/bundler/man/bundle-version.1 +3 -16
  94. data/lib/bundler/man/bundle-viz.1 +4 -16
  95. data/lib/bundler/man/bundle.1 +5 -44
  96. data/lib/bundler/man/gemfile.5 +24 -301
  97. data/lib/bundler/man/gemfile.5.ronn +4 -0
  98. data/lib/bundler/match_metadata.rb +4 -0
  99. data/lib/bundler/match_platform.rb +1 -1
  100. data/lib/bundler/plugin/api/source.rb +3 -2
  101. data/lib/bundler/plugin/index.rb +8 -0
  102. data/lib/bundler/plugin/installer.rb +1 -1
  103. data/lib/bundler/plugin.rb +12 -5
  104. data/lib/bundler/resolver/base.rb +1 -1
  105. data/lib/bundler/resolver/incompatibility.rb +1 -1
  106. data/lib/bundler/resolver/spec_group.rb +1 -4
  107. data/lib/bundler/resolver.rb +16 -16
  108. data/lib/bundler/ruby_dsl.rb +20 -12
  109. data/lib/bundler/ruby_version.rb +1 -1
  110. data/lib/bundler/rubygems_ext.rb +27 -54
  111. data/lib/bundler/rubygems_gem_installer.rb +23 -58
  112. data/lib/bundler/rubygems_integration.rb +25 -94
  113. data/lib/bundler/runtime.rb +2 -2
  114. data/lib/bundler/self_manager.rb +23 -7
  115. data/lib/bundler/settings.rb +27 -7
  116. data/lib/bundler/setup.rb +4 -1
  117. data/lib/bundler/shared_helpers.rb +35 -13
  118. data/lib/bundler/source/git/git_proxy.rb +22 -14
  119. data/lib/bundler/source/git.rb +4 -3
  120. data/lib/bundler/source/metadata.rb +16 -16
  121. data/lib/bundler/source/path.rb +7 -6
  122. data/lib/bundler/source/rubygems.rb +21 -14
  123. data/lib/bundler/source.rb +2 -0
  124. data/lib/bundler/spec_set.rb +43 -12
  125. data/lib/bundler/stub_specification.rb +1 -0
  126. data/lib/bundler/templates/Executable.bundler +1 -1
  127. data/lib/bundler/templates/newgem/README.md.tt +3 -3
  128. data/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  129. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  130. data/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  131. data/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  132. data/lib/bundler/ui/shell.rb +2 -2
  133. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  134. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  135. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  136. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  137. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  138. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  139. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +36 -36
  140. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  141. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  142. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  143. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +8 -10
  144. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  145. data/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  146. data/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  147. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  148. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  149. data/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  150. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  151. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  152. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  153. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  154. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  155. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  156. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +44 -6
  157. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  158. data/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  159. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +26 -150
  160. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +4 -46
  161. data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  162. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -45
  163. data/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  164. data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  165. data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  166. data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  167. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  168. data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  169. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  170. data/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  171. data/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  172. data/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  173. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  174. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  175. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  176. data/lib/bundler/vendored_net_http.rb +8 -0
  177. data/lib/bundler/vendored_persistent.rb +0 -4
  178. data/lib/bundler/vendored_timeout.rb +8 -0
  179. data/lib/bundler/version.rb +1 -1
  180. data/lib/bundler/vlad.rb +1 -1
  181. data/lib/bundler/yaml_serializer.rb +9 -4
  182. data/lib/bundler.rb +38 -35
  183. metadata +16 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce1668ecfd79ea439de5e81a89f9b06eed35f3b7d7309638071cb3b34f990d8c
4
- data.tar.gz: 24ef07902dda9ac445473bbe06f89fc5fcee012660198060978bc651bfd081bc
3
+ metadata.gz: 96c3a9a5a42642d473042853b90ec2e07a4be74e6e1b5aba5bfdc3bcc0ed8776
4
+ data.tar.gz: 5ccfc33ca9f1b86f30d896fc89db5e556b1dab1ec84361b1f2aa9bb65ff39769
5
5
  SHA512:
6
- metadata.gz: 14bca6c7a079404d2cb21e0f26a96277cc34df150e9c5b1696ffe819af944d1b1a079bd5a01292a9b0e0a35f0eb45be89298ccf2f18532acfba88adb80f413f6
7
- data.tar.gz: 3fc94ae1c36cec40fe55422e81db35d9b95e0bfcb103e8960bb80b38ad4aad569d8c626892ce62f8747491c68b560bc2bda851259f55a1293069bd888380376c
6
+ metadata.gz: f9822abc2d327f47a25c580b932e4cf3108ab8ecc41d8c206db8840c27779ec4943daa0a28c05e36503c1a04f5b3cb82f2b93a5f32538cf52e2a62c8fee5c11c
7
+ data.tar.gz: f6f4e921e4c606352f0b2d1e54b2674f999690dda1a8d932b3c78bb0f6561f4527e4bf88fbfadb1061bbeb097014225fae9609262f415d1c3e08d61581e7f387
data/CHANGELOG.md CHANGED
@@ -1,3 +1,76 @@
1
+ # 2.5.0 (December 15, 2023)
2
+
3
+ ## Breaking changes:
4
+
5
+ - Drop ruby 2.6 and 2.7 support [#7116](https://github.com/rubygems/rubygems/pull/7116)
6
+ - The `:mswin`, `:mswin64`, `:mingw`, and `:x64_mingw` Gemfile `platform` values are soft-deprecated and aliased to `:windows` [#6391](https://github.com/rubygems/rubygems/pull/6391)
7
+
8
+ ## Features:
9
+
10
+ - Leverage ruby feature to warn when requiring default gems not included in the bundle that will be turned into bundled gems in the future [#6831](https://github.com/rubygems/rubygems/pull/6831)
11
+ - Introduce `bundle config set version` feature to choose the version of Bundler that should be used and potentially disable using the `lockfile` version by setting it to `system` [#6817](https://github.com/rubygems/rubygems/pull/6817)
12
+
13
+ ## Performance:
14
+
15
+ - Use match? when regexp match data is unused [#7263](https://github.com/rubygems/rubygems/pull/7263)
16
+ - Avoid some allocations when evaluating `ruby` Gemfile DSL [#7251](https://github.com/rubygems/rubygems/pull/7251)
17
+ - Reduce array allocations when loading definition [#7199](https://github.com/rubygems/rubygems/pull/7199)
18
+ - Avoid re-compiling static regexp in a loop [#7198](https://github.com/rubygems/rubygems/pull/7198)
19
+ - Reduce allocations when installing gems with bundler [#6977](https://github.com/rubygems/rubygems/pull/6977)
20
+ - Use a shared connection pool for fetching gems [#7079](https://github.com/rubygems/rubygems/pull/7079)
21
+ - Reduce allocations when parsing compact index [#6971](https://github.com/rubygems/rubygems/pull/6971)
22
+
23
+ ## Enhancements:
24
+
25
+ - Add 3.4 as a supported ruby version in Gemfile DSL [#7264](https://github.com/rubygems/rubygems/pull/7264)
26
+ - Improve install advice when some gems are not found [#7265](https://github.com/rubygems/rubygems/pull/7265)
27
+ - Vendor `net-http`, `net-protocol`, `resolv`, and `timeout` to reduce conflicts between Gemfile gems and internal dependencies [#6793](https://github.com/rubygems/rubygems/pull/6793)
28
+ - Allow `bundle pristine` to run in parallel [#6927](https://github.com/rubygems/rubygems/pull/6927)
29
+ - Make `bundle lock` always touch the lockfile in non-frozen mode [#7220](https://github.com/rubygems/rubygems/pull/7220)
30
+ - Use `Minitest::TestTask` in a template file for `minitest` [#7234](https://github.com/rubygems/rubygems/pull/7234)
31
+ - Add missing services to CI detection and make it consistent between RubyGems and Bundler [#7205](https://github.com/rubygems/rubygems/pull/7205)
32
+ - Allow auto-install to install missing git gems [#7197](https://github.com/rubygems/rubygems/pull/7197)
33
+ - Stop remembering cli flags like `--jobs` or `--retry` in configuration [#7191](https://github.com/rubygems/rubygems/pull/7191)
34
+ - Simplify remembered flags deprecation message [#7189](https://github.com/rubygems/rubygems/pull/7189)
35
+ - Make sure to `require "rubygems"` explicitly [#7139](https://github.com/rubygems/rubygems/pull/7139)
36
+ - Handle development dependencies duplicated in gemspec vs Gemfile [#6014](https://github.com/rubygems/rubygems/pull/6014)
37
+ - Make lockfiles generated on macOS include a lock for Linux by default [#5700](https://github.com/rubygems/rubygems/pull/5700)
38
+ - Only add a dummy bundler spec to the metadata source when necessary [#4443](https://github.com/rubygems/rubygems/pull/4443)
39
+
40
+ ## Bug fixes:
41
+
42
+ - Resolve `ruby file: ".ruby-version"` relative to containing Gemfile [#7250](https://github.com/rubygems/rubygems/pull/7250)
43
+ - Implement opaque ETag in Compact Index to avoid falling back to old index in servers with different etag implementations [#7122](https://github.com/rubygems/rubygems/pull/7122)
44
+ - Fix `bundle install --system` deprecation advice [#7190](https://github.com/rubygems/rubygems/pull/7190)
45
+ - Fix invalid platform removal missing adjacent platforms [#7170](https://github.com/rubygems/rubygems/pull/7170)
46
+
47
+ ## Documentation:
48
+
49
+ - Add missing --prefer-local to Synopsis in bundle-install.1.ronn [#7194](https://github.com/rubygems/rubygems/pull/7194)
50
+ - Update GitHub organization of Standard Ruby in `bundle gem` output and generated configuration [#6818](https://github.com/rubygems/rubygems/pull/6818)
51
+ - Replace "prior to" with "immediately after" in `bundle gem` generated README file [#6338](https://github.com/rubygems/rubygems/pull/6338)
52
+
53
+ # 2.4.22 (November 9, 2023)
54
+
55
+ ## Enhancements:
56
+
57
+ - Add Bundler::Plugin.loaded? helper [#6964](https://github.com/rubygems/rubygems/pull/6964)
58
+ - Give better error when previous installation folder is insecure to remove [#7030](https://github.com/rubygems/rubygems/pull/7030)
59
+ - Set file path when eval-ing local specification in EndpointSpecification [#7106](https://github.com/rubygems/rubygems/pull/7106)
60
+ - Git ignore the proper files for the CI service selected for `bundle gem` [#7101](https://github.com/rubygems/rubygems/pull/7101)
61
+ - Update vendored thor to v1.3.0 [#7078](https://github.com/rubygems/rubygems/pull/7078)
62
+ - Restore using old way of passing Ruby version to resolver [#7066](https://github.com/rubygems/rubygems/pull/7066)
63
+ - Bump vendored net-http-persistent to 4.0.2 [#6787](https://github.com/rubygems/rubygems/pull/6787)
64
+
65
+ ## Bug fixes:
66
+
67
+ - Fix regression when installing native extensions on universal rubies [#7077](https://github.com/rubygems/rubygems/pull/7077)
68
+ - Only remove bundler plugin gem when it's inside the cache [#7001](https://github.com/rubygems/rubygems/pull/7001)
69
+ - Don't show bug report template when GEM_HOME has no writable bit [#7113](https://github.com/rubygems/rubygems/pull/7113)
70
+ - Fix regression in old git versions [#7114](https://github.com/rubygems/rubygems/pull/7114)
71
+ - Handle empty array at built-in YAML serializer [#7099](https://github.com/rubygems/rubygems/pull/7099)
72
+ - Fix force_ruby_platform: when the lockfile only locks the ruby platform [#6936](https://github.com/rubygems/rubygems/pull/6936)
73
+
1
74
  # 2.4.21 (October 17, 2023)
2
75
 
3
76
  ## Enhancements:
@@ -736,6 +809,7 @@
736
809
 
737
810
  ## Enhancements:
738
811
 
812
+ - Cancel deprecation of custom git sources [#5147](https://github.com/rubygems/rubygems/pull/5147)
739
813
  - Print warning when running Bundler on potentially problematic RubyGems & Ruby combinations [#5177](https://github.com/rubygems/rubygems/pull/5177)
740
814
  - Error tracing should be printed to stderr [#5179](https://github.com/rubygems/rubygems/pull/5179)
741
815
  - Add `github` and `ref` options to `bundle add` [#5159](https://github.com/rubygems/rubygems/pull/5159)
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
1
  [![Version ](https://img.shields.io/gem/v/bundler.svg?style=flat)](https://rubygems.org/gems/bundler)
2
- [![Slack ](https://bundler-slackin.herokuapp.com/badge.svg)](https://bundler-slackin.herokuapp.com)
3
2
 
4
3
  # Bundler: a gem to bundle gems
5
4
 
@@ -38,7 +37,7 @@ Still stuck? Try [filing an issue](https://github.com/rubygems/rubygems/issues/n
38
37
 
39
38
  To see what has changed in recent versions of Bundler, see the [CHANGELOG](CHANGELOG.md).
40
39
 
41
- To get in touch with the Bundler core team and other Bundler users, please join [the Bundler slack](https://slack.bundler.io).
40
+ To get in touch with the Bundler core team and other Bundler users, please join [the Bundler slack](https://join.slack.com/t/bundler/shared_invite/zt-1rrsuuv3m-OmXKWQf8K6iSla4~F1DBjQ).
42
41
 
43
42
  ### Contributing
44
43
 
data/bundler.gemspec CHANGED
@@ -29,8 +29,10 @@ Gem::Specification.new do |s|
29
29
  "source_code_uri" => "https://github.com/rubygems/rubygems/tree/master/bundler",
30
30
  }
31
31
 
32
- s.required_ruby_version = ">= 2.6.0"
33
- s.required_rubygems_version = ">= 3.0.1"
32
+ s.required_ruby_version = ">= 3.0.0"
33
+
34
+ # It should match the RubyGems version shipped with `required_ruby_version` above
35
+ s.required_rubygems_version = ">= 3.2.3"
34
36
 
35
37
  s.files = Dir.glob("lib/bundler{.rb,/**/*}", File::FNM_DOTMATCH).reject {|f| File.directory?(f) }
36
38
 
data/exe/bundle CHANGED
@@ -15,15 +15,6 @@ end
15
15
 
16
16
  require "bundler"
17
17
 
18
- if Gem.rubygems_version < Gem::Version.new("3.2.3") && Gem.ruby_version < Gem::Version.new("2.7.a") && !ENV["BUNDLER_NO_OLD_RUBYGEMS_WARNING"]
19
- Bundler.ui.warn \
20
- "Your RubyGems version (#{Gem::VERSION}) has a bug that prevents " \
21
- "`required_ruby_version` from working for Bundler. Any scripts that use " \
22
- "`gem install bundler` will break as soon as Bundler drops support for " \
23
- "your Ruby version. Please upgrade RubyGems to avoid future breakage " \
24
- "and silence this warning by running `gem update --system 3.2.3`"
25
- end
26
-
27
18
  require "bundler/friendly_errors"
28
19
 
29
20
  Bundler.with_friendly_errors do
@@ -34,5 +25,5 @@ Bundler.with_friendly_errors do
34
25
  help_flag_used = ARGV.any? {|a| help_flags.include? a }
35
26
  args = help_flag_used ? Bundler::CLI.reformatted_help_args(ARGV) : ARGV
36
27
 
37
- Bundler::CLI.start(args, :debug => true)
28
+ Bundler::CLI.start(args, debug: true)
38
29
  end
@@ -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 = "2023-10-17".freeze
8
- @git_commit_sha = "d10b46bd15".freeze
7
+ @built_at = "2023-12-15".freeze
8
+ @git_commit_sha = "58fdbff35a".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -31,7 +31,7 @@ module Bundler
31
31
  # commit instance variable then we can't determine its commits SHA.
32
32
  git_dir = File.expand_path("../../../.git", __dir__)
33
33
  if File.directory?(git_dir)
34
- return @git_commit_sha = IO.popen(%w[git rev-parse --short HEAD], { :chdir => git_dir }, &:read).strip.freeze
34
+ return @git_commit_sha = IO.popen(%w[git rev-parse --short HEAD], { chdir: git_dir }, &:read).strip.freeze
35
35
  end
36
36
 
37
37
  @git_commit_sha ||= "unknown"
@@ -17,6 +17,6 @@ end
17
17
 
18
18
  Capistrano::Configuration.instance(:must_exist).load do
19
19
  before "deploy:finalize_update", "bundle:install"
20
- Bundler::Deployment.define_task(self, :task, :except => { :no_release => true })
20
+ Bundler::Deployment.define_task(self, :task, except: { no_release: true })
21
21
  set :rake, lambda { "#{fetch(:bundle_cmd, "bundle")} exec rake" }
22
22
  end
@@ -0,0 +1,245 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Checksum
5
+ ALGO_SEPARATOR = "="
6
+ DEFAULT_ALGORITHM = "sha256"
7
+ private_constant :DEFAULT_ALGORITHM
8
+ DEFAULT_BLOCK_SIZE = 16_384
9
+ private_constant :DEFAULT_BLOCK_SIZE
10
+
11
+ class << self
12
+ def from_gem_package(gem_package, algo = DEFAULT_ALGORITHM)
13
+ return if Bundler.settings[:disable_checksum_validation]
14
+ return unless source = gem_package.instance_variable_get(:@gem)
15
+ return unless source.respond_to?(:with_read_io)
16
+
17
+ source.with_read_io do |io|
18
+ from_gem(io, source.path)
19
+ ensure
20
+ io.rewind
21
+ end
22
+ end
23
+
24
+ def from_gem(io, pathname, algo = DEFAULT_ALGORITHM)
25
+ digest = Bundler::SharedHelpers.digest(algo.upcase).new
26
+ buf = String.new(capacity: DEFAULT_BLOCK_SIZE)
27
+ digest << io.readpartial(DEFAULT_BLOCK_SIZE, buf) until io.eof?
28
+ Checksum.new(algo, digest.hexdigest!, Source.new(:gem, pathname))
29
+ end
30
+
31
+ def from_api(digest, source_uri, algo = DEFAULT_ALGORITHM)
32
+ return if Bundler.settings[:disable_checksum_validation]
33
+ Checksum.new(algo, to_hexdigest(digest, algo), Source.new(:api, source_uri))
34
+ end
35
+
36
+ def from_lock(lock_checksum, lockfile_location)
37
+ algo, digest = lock_checksum.strip.split(ALGO_SEPARATOR, 2)
38
+ Checksum.new(algo, to_hexdigest(digest, algo), Source.new(:lock, lockfile_location))
39
+ end
40
+
41
+ def to_hexdigest(digest, algo = DEFAULT_ALGORITHM)
42
+ return digest unless algo == DEFAULT_ALGORITHM
43
+ return digest if digest.match?(/\A[0-9a-f]{64}\z/i)
44
+ if digest.match?(%r{\A[-0-9a-z_+/]{43}={0,2}\z}i)
45
+ digest = digest.tr("-_", "+/") # fix urlsafe base64
46
+ return digest.unpack1("m0").unpack1("H*")
47
+ end
48
+ raise ArgumentError, "#{digest.inspect} is not a valid SHA256 hex or base64 digest"
49
+ end
50
+ end
51
+
52
+ attr_reader :algo, :digest, :sources
53
+
54
+ def initialize(algo, digest, source)
55
+ @algo = algo
56
+ @digest = digest
57
+ @sources = [source]
58
+ end
59
+
60
+ def ==(other)
61
+ match?(other) && other.sources == sources
62
+ end
63
+
64
+ alias_method :eql?, :==
65
+
66
+ def match?(other)
67
+ other.is_a?(self.class) && other.digest == digest && other.algo == algo
68
+ end
69
+
70
+ def hash
71
+ digest.hash
72
+ end
73
+
74
+ def to_s
75
+ "#{to_lock} (from #{sources.first}#{", ..." if sources.size > 1})"
76
+ end
77
+
78
+ def to_lock
79
+ "#{algo}#{ALGO_SEPARATOR}#{digest}"
80
+ end
81
+
82
+ def merge!(other)
83
+ return nil unless match?(other)
84
+ @sources.concat(other.sources).uniq!
85
+ self
86
+ end
87
+
88
+ def formatted_sources
89
+ sources.join("\n and ").concat("\n")
90
+ end
91
+
92
+ def removable?
93
+ sources.all?(&:removable?)
94
+ end
95
+
96
+ def removal_instructions
97
+ msg = +""
98
+ i = 1
99
+ sources.each do |source|
100
+ msg << " #{i}. #{source.removal}\n"
101
+ i += 1
102
+ end
103
+ msg << " #{i}. run `bundle install`\n"
104
+ end
105
+
106
+ def inspect
107
+ abbr = "#{algo}#{ALGO_SEPARATOR}#{digest[0, 8]}"
108
+ from = "from #{sources.join(" and ")}"
109
+ "#<#{self.class}:#{object_id} #{abbr} #{from}>"
110
+ end
111
+
112
+ class Source
113
+ attr_reader :type, :location
114
+
115
+ def initialize(type, location)
116
+ @type = type
117
+ @location = location
118
+ end
119
+
120
+ def removable?
121
+ type == :lock || type == :gem
122
+ end
123
+
124
+ def ==(other)
125
+ other.is_a?(self.class) && other.type == type && other.location == location
126
+ end
127
+
128
+ # phrased so that the usual string format is grammatically correct
129
+ # rake (10.3.2) sha256=abc123 from #{to_s}
130
+ def to_s
131
+ case type
132
+ when :lock
133
+ "the lockfile CHECKSUMS at #{location}"
134
+ when :gem
135
+ "the gem at #{location}"
136
+ when :api
137
+ "the API at #{location}"
138
+ else
139
+ "#{location} (#{type})"
140
+ end
141
+ end
142
+
143
+ # A full sentence describing how to remove the checksum
144
+ def removal
145
+ case type
146
+ when :lock
147
+ "remove the matching checksum in #{location}"
148
+ when :gem
149
+ "remove the gem at #{location}"
150
+ when :api
151
+ "checksums from #{location} cannot be locally modified, you may need to update your sources"
152
+ else
153
+ "remove #{location} (#{type})"
154
+ end
155
+ end
156
+ end
157
+
158
+ class Store
159
+ attr_reader :store
160
+ protected :store
161
+
162
+ def initialize
163
+ @store = {}
164
+ end
165
+
166
+ def initialize_copy(other)
167
+ @store = {}
168
+ other.store.each do |lock_name, checksums|
169
+ store[lock_name] = checksums.dup
170
+ end
171
+ end
172
+
173
+ def inspect
174
+ "#<#{self.class}:#{object_id} size=#{store.size}>"
175
+ end
176
+
177
+ def fetch(spec, algo = DEFAULT_ALGORITHM)
178
+ store[spec.name_tuple.lock_name]&.fetch(algo, nil)
179
+ end
180
+
181
+ # Replace when the new checksum is from the same source.
182
+ # The primary purpose of this registering checksums from gems where there are
183
+ # duplicates of the same gem (according to full_name) in the index.
184
+ # In particular, this is when 2 gems have two similar platforms, e.g.
185
+ # "darwin20" and "darwin-20", both of which resolve to darwin-20.
186
+ # In the Index, the later gem replaces the former, so we do that here.
187
+ #
188
+ # However, if the new checksum is from a different source, we register like normal.
189
+ # This ensures a mismatch error where there are multiple top level sources
190
+ # that contain the same gem with different checksums.
191
+ def replace(spec, checksum)
192
+ return unless checksum
193
+
194
+ lock_name = spec.name_tuple.lock_name
195
+ checksums = (store[lock_name] ||= {})
196
+ existing = checksums[checksum.algo]
197
+
198
+ # we assume only one source because this is used while building the index
199
+ if !existing || existing.sources.first == checksum.sources.first
200
+ checksums[checksum.algo] = checksum
201
+ else
202
+ register_checksum(lock_name, checksum)
203
+ end
204
+ end
205
+
206
+ def register(spec, checksum)
207
+ return unless checksum
208
+ register_checksum(spec.name_tuple.lock_name, checksum)
209
+ end
210
+
211
+ def merge!(other)
212
+ other.store.each do |lock_name, checksums|
213
+ checksums.each do |_algo, checksum|
214
+ register_checksum(lock_name, checksum)
215
+ end
216
+ end
217
+ end
218
+
219
+ def to_lock(spec)
220
+ lock_name = spec.name_tuple.lock_name
221
+ if checksums = store[lock_name]
222
+ "#{lock_name} #{checksums.values.map(&:to_lock).sort.join(",")}"
223
+ else
224
+ lock_name
225
+ end
226
+ end
227
+
228
+ private
229
+
230
+ def register_checksum(lock_name, checksum)
231
+ return unless checksum
232
+ checksums = (store[lock_name] ||= {})
233
+ existing = checksums[checksum.algo]
234
+
235
+ if !existing
236
+ checksums[checksum.algo] = checksum
237
+ elsif existing.merge!(checksum)
238
+ checksum
239
+ else
240
+ raise ChecksumMismatchError.new(lock_name, existing, checksum)
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ module CIDetector
5
+ # NOTE: Any changes made here will need to be made to both lib/rubygems/ci_detector.rb and
6
+ # bundler/lib/bundler/ci_detector.rb (which are enforced duplicates).
7
+ # TODO: Drop that duplication once bundler drops support for RubyGems 3.4
8
+ #
9
+ # ## Recognized CI providers, their signifiers, and the relevant docs ##
10
+ #
11
+ # Travis CI - CI, TRAVIS https://docs.travis-ci.com/user/environment-variables/#default-environment-variables
12
+ # Cirrus CI - CI, CIRRUS_CI https://cirrus-ci.org/guide/writing-tasks/#environment-variables
13
+ # Circle CI - CI, CIRCLECI https://circleci.com/docs/variables/#built-in-environment-variables
14
+ # Gitlab CI - CI, GITLAB_CI https://docs.gitlab.com/ee/ci/variables/
15
+ # AppVeyor - CI, APPVEYOR https://www.appveyor.com/docs/environment-variables/
16
+ # CodeShip - CI_NAME https://docs.cloudbees.com/docs/cloudbees-codeship/latest/pro-builds-and-configuration/environment-variables#_default_environment_variables
17
+ # dsari - CI, DSARI https://github.com/rfinnie/dsari#running
18
+ # Jenkins - BUILD_NUMBER https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables
19
+ # TeamCity - TEAMCITY_VERSION https://www.jetbrains.com/help/teamcity/predefined-build-parameters.html#Predefined+Server+Build+Parameters
20
+ # Appflow - CI_BUILD_ID https://ionic.io/docs/appflow/automation/environments#predefined-environments
21
+ # TaskCluster - TASKCLUSTER_ROOT_URL https://docs.taskcluster.net/docs/manual/design/env-vars
22
+ # Semaphore - CI, SEMAPHORE https://docs.semaphoreci.com/ci-cd-environment/environment-variables/
23
+ # BuildKite - CI, BUILDKITE https://buildkite.com/docs/pipelines/environment-variables
24
+ # GoCD - GO_SERVER_URL https://docs.gocd.org/current/faq/dev_use_current_revision_in_build.html
25
+ # GH Actions - CI, GITHUB_ACTIONS https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
26
+ #
27
+ # ### Some "standard" ENVs that multiple providers may set ###
28
+ #
29
+ # * CI - this is set by _most_ (but not all) CI providers now; it's approaching a standard.
30
+ # * CI_NAME - Not as frequently used, but some providers set this to specify their own name
31
+
32
+ # Any of these being set is a reasonably reliable indicator that we are
33
+ # executing in a CI environment.
34
+ ENV_INDICATORS = [
35
+ "CI",
36
+ "CI_NAME",
37
+ "CONTINUOUS_INTEGRATION",
38
+ "BUILD_NUMBER",
39
+ "CI_APP_ID",
40
+ "CI_BUILD_ID",
41
+ "CI_BUILD_NUMBER",
42
+ "RUN_ID",
43
+ "TASKCLUSTER_ROOT_URL",
44
+ ].freeze
45
+
46
+ # For each CI, this env suffices to indicate that we're on _that_ CI's
47
+ # containers. (A few of them only supply a CI_NAME variable, which is also
48
+ # nice). And if they set "CI" but we can't tell which one they are, we also
49
+ # want to know that - a bare "ci" without another token tells us as much.
50
+ ENV_DESCRIPTORS = {
51
+ "TRAVIS" => "travis",
52
+ "CIRCLECI" => "circle",
53
+ "CIRRUS_CI" => "cirrus",
54
+ "DSARI" => "dsari",
55
+ "SEMAPHORE" => "semaphore",
56
+ "JENKINS_URL" => "jenkins",
57
+ "BUILDKITE" => "buildkite",
58
+ "GO_SERVER_URL" => "go",
59
+ "GITLAB_CI" => "gitlab",
60
+ "GITHUB_ACTIONS" => "github",
61
+ "TASKCLUSTER_ROOT_URL" => "taskcluster",
62
+ "CI" => "ci",
63
+ }.freeze
64
+
65
+ def self.ci?
66
+ ENV_INDICATORS.any? {|var| ENV.include?(var) }
67
+ end
68
+
69
+ def self.ci_strings
70
+ matching_names = ENV_DESCRIPTORS.select {|env, _| ENV[env] }.values
71
+ matching_names << ENV["CI_NAME"].downcase if ENV["CI_NAME"]
72
+ matching_names.reject(&:empty?).sort.uniq
73
+ end
74
+ end
75
+ end
@@ -28,9 +28,9 @@ module Bundler
28
28
  dependencies = gems.map {|g| Bundler::Dependency.new(g, version, options) }
29
29
 
30
30
  Injector.inject(dependencies,
31
- :conservative_versioning => options[:version].nil?, # Perform conservative versioning only when version is not specified
32
- :optimistic => options[:optimistic],
33
- :strict => options[:strict])
31
+ conservative_versioning: options[:version].nil?, # Perform conservative versioning only when version is not specified
32
+ optimistic: options[:optimistic],
33
+ strict: options[:strict])
34
34
  end
35
35
 
36
36
  def validate_options!
@@ -17,9 +17,9 @@ module Bundler
17
17
  installer = Installer.new(Bundler.root, Bundler.definition)
18
18
 
19
19
  installer_opts = {
20
- :force => options[:force],
21
- :binstubs_cmd => true,
22
- :all_platforms => options["all-platforms"],
20
+ force: options[:force],
21
+ binstubs_cmd: true,
22
+ all_platforms: options["all-platforms"],
23
23
  }
24
24
 
25
25
  if options[:all]
@@ -45,7 +45,7 @@ module Bundler
45
45
  next
46
46
  end
47
47
 
48
- Bundler.settings.temporary(:path => (Bundler.settings[:path] || Bundler.root)) do
48
+ Bundler.settings.temporary(path: (Bundler.settings[:path] || Bundler.root)) do
49
49
  installer.generate_standalone_bundler_executable_stubs(spec, installer_opts)
50
50
  end
51
51
  else
@@ -19,7 +19,7 @@ module Bundler
19
19
  # TODO: move cache contents here now that all bundles are locked
20
20
  custom_path = Bundler.settings[:path] if options[:path]
21
21
 
22
- Bundler.settings.temporary(:cache_all_platforms => options["all-platforms"]) do
22
+ Bundler.settings.temporary(cache_all_platforms: options["all-platforms"]) do
23
23
  Bundler.load.cache(custom_path)
24
24
  end
25
25
  end
@@ -32,7 +32,7 @@ module Bundler
32
32
  Bundler.ui.error "This bundle has been frozen, but there is no #{SharedHelpers.relative_lockfile_path} present"
33
33
  exit 1
34
34
  else
35
- Bundler.load.lock(:preserve_unknown_sections => true) unless options[:"dry-run"]
35
+ Bundler.load.lock(preserve_unknown_sections: true) unless options[:"dry-run"]
36
36
  Bundler.ui.info "The Gemfile's dependencies are satisfied"
37
37
  end
38
38
  end
@@ -54,9 +54,12 @@ module Bundler
54
54
 
55
55
  Bundler.definition.specs.each do |spec|
56
56
  return spec if spec.name == name
57
- specs << spec if regexp && spec.name =~ regexp
57
+ specs << spec if regexp && spec.name.match?(regexp)
58
58
  end
59
59
 
60
+ default_spec = default_gem_spec(name)
61
+ specs << default_spec if default_spec
62
+
60
63
  case specs.count
61
64
  when 0
62
65
  dep_in_other_group = Bundler.definition.current_dependencies.find {|dep|dep.name == name }
@@ -75,6 +78,11 @@ module Bundler
75
78
  raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
76
79
  end
77
80
 
81
+ def self.default_gem_spec(name)
82
+ gem_spec = Gem::Specification.find_all_by_name(name).last
83
+ gem_spec if gem_spec&.default_gem?
84
+ end
85
+
78
86
  def self.ask_for_spec_from(specs)
79
87
  specs.each_with_index do |spec, index|
80
88
  Bundler.ui.info "#{index.succ} : #{spec.name}", true
@@ -2,17 +2,17 @@
2
2
 
3
3
  module Bundler
4
4
  class CLI::Config < Thor
5
- class_option :parseable, :type => :boolean, :banner => "Use minimal formatting for more parseable output"
5
+ class_option :parseable, type: :boolean, banner: "Use minimal formatting for more parseable output"
6
6
 
7
7
  def self.scope_options
8
- method_option :global, :type => :boolean, :banner => "Only change the global config"
9
- method_option :local, :type => :boolean, :banner => "Only change the local config"
8
+ method_option :global, type: :boolean, banner: "Only change the global config"
9
+ method_option :local, type: :boolean, banner: "Only change the local config"
10
10
  end
11
11
  private_class_method :scope_options
12
12
 
13
- desc "base NAME [VALUE]", "The Bundler 1 config interface", :hide => true
13
+ desc "base NAME [VALUE]", "The Bundler 1 config interface", hide: true
14
14
  scope_options
15
- method_option :delete, :type => :boolean, :banner => "delete"
15
+ method_option :delete, type: :boolean, banner: "delete"
16
16
  def base(name = nil, *value)
17
17
  new_args =
18
18
  if ARGV.size == 1
@@ -25,8 +25,9 @@ module Bundler
25
25
  ["config", "get", ARGV[1]]
26
26
  end
27
27
 
28
- SharedHelpers.major_deprecation 3,
29
- "Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle #{new_args.join(" ")}` instead."
28
+ message = "Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle #{new_args.join(" ")}` instead."
29
+ removed_message = "Using the `config` command without a subcommand [list, get, set, unset] is has been removed. Use `bundle #{new_args.join(" ")}` instead."
30
+ SharedHelpers.major_deprecation 3, message, removed_message: removed_message
30
31
 
31
32
  Base.new(options, name, value, self).run
32
33
  end
@@ -9,8 +9,9 @@ module Bundler
9
9
  end
10
10
 
11
11
  def run
12
- Bundler::SharedHelpers.major_deprecation 2, "bundle console will be replaced " \
13
- "by `bin/console` generated by `bundle gem <name>`"
12
+ message = "bundle console will be replaced by `bin/console` generated by `bundle gem <name>`"
13
+ removed_message = "bundle console has been replaced by `bin/console` generated by `bundle gem <name>`"
14
+ Bundler::SharedHelpers.major_deprecation 2, message, removed_message: removed_message
14
15
 
15
16
  group ? Bundler.require(:default, *group.split(" ").map!(&:to_sym)) : Bundler.require
16
17
  ARGV.clear
@@ -6,8 +6,8 @@ require "fiddle"
6
6
 
7
7
  module Bundler
8
8
  class CLI::Doctor
9
- DARWIN_REGEX = /\s+(.+) \(compatibility /.freeze
10
- LDD_REGEX = /\t\S+ => (\S+) \(\S+\)/.freeze
9
+ DARWIN_REGEX = /\s+(.+) \(compatibility /
10
+ LDD_REGEX = /\t\S+ => (\S+) \(\S+\)/
11
11
 
12
12
  attr_reader :options
13
13
 
@@ -12,7 +12,7 @@ module Bundler
12
12
  @options = options
13
13
  @cmd = args.shift
14
14
  @args = args
15
- @args << { :close_others => !options.keep_file_descriptors? } unless Bundler.current_ruby.jruby?
15
+ @args << { close_others: !options.keep_file_descriptors? } unless Bundler.current_ruby.jruby?
16
16
  end
17
17
 
18
18
  def run