bundler 2.3.26 → 2.4.13

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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +228 -1
  3. data/README.md +3 -6
  4. data/bundler.gemspec +2 -2
  5. data/exe/bundle +1 -4
  6. data/lib/bundler/build_metadata.rb +2 -2
  7. data/lib/bundler/cli/add.rb +1 -1
  8. data/lib/bundler/cli/binstubs.rb +5 -1
  9. data/lib/bundler/cli/check.rb +1 -1
  10. data/lib/bundler/cli/common.rb +1 -0
  11. data/lib/bundler/cli/console.rb +2 -2
  12. data/lib/bundler/cli/doctor.rb +4 -6
  13. data/lib/bundler/cli/gem.rb +62 -40
  14. data/lib/bundler/cli/init.rb +2 -2
  15. data/lib/bundler/cli/install.rb +2 -3
  16. data/lib/bundler/cli/lock.rb +8 -5
  17. data/lib/bundler/cli/open.rb +6 -4
  18. data/lib/bundler/cli/outdated.rb +1 -3
  19. data/lib/bundler/cli/viz.rb +1 -1
  20. data/lib/bundler/cli.rb +45 -2
  21. data/lib/bundler/compact_index_client/cache.rb +1 -1
  22. data/lib/bundler/compact_index_client/updater.rb +40 -39
  23. data/lib/bundler/constants.rb +1 -1
  24. data/lib/bundler/current_ruby.rb +2 -0
  25. data/lib/bundler/definition.rb +99 -51
  26. data/lib/bundler/dependency.rb +13 -12
  27. data/lib/bundler/digest.rb +1 -1
  28. data/lib/bundler/dsl.rb +3 -3
  29. data/lib/bundler/endpoint_specification.rb +0 -4
  30. data/lib/bundler/env.rb +1 -1
  31. data/lib/bundler/environment_preserver.rb +3 -2
  32. data/lib/bundler/errors.rb +1 -11
  33. data/lib/bundler/fetcher/compact_index.rb +9 -11
  34. data/lib/bundler/fetcher/dependency.rb +2 -6
  35. data/lib/bundler/fetcher/downloader.rb +2 -5
  36. data/lib/bundler/fetcher.rb +4 -8
  37. data/lib/bundler/force_platform.rb +18 -0
  38. data/lib/bundler/friendly_errors.rb +0 -3
  39. data/lib/bundler/gem_version_promoter.rb +52 -86
  40. data/lib/bundler/graph.rb +3 -3
  41. data/lib/bundler/index.rb +7 -15
  42. data/lib/bundler/injector.rb +2 -2
  43. data/lib/bundler/inline.rb +8 -10
  44. data/lib/bundler/installer/parallel_installer.rb +3 -33
  45. data/lib/bundler/installer/standalone.rb +12 -8
  46. data/lib/bundler/installer.rb +9 -23
  47. data/lib/bundler/lazy_specification.rb +42 -42
  48. data/lib/bundler/lockfile_generator.rb +1 -1
  49. data/lib/bundler/lockfile_parser.rb +16 -16
  50. data/lib/bundler/man/bundle-add.1 +1 -1
  51. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  52. data/lib/bundler/man/bundle-cache.1 +3 -3
  53. data/lib/bundler/man/bundle-cache.1.ronn +2 -2
  54. data/lib/bundler/man/bundle-check.1 +1 -1
  55. data/lib/bundler/man/bundle-clean.1 +1 -1
  56. data/lib/bundler/man/bundle-config.1 +2 -2
  57. data/lib/bundler/man/bundle-config.1.ronn +1 -1
  58. data/lib/bundler/man/bundle-console.1 +1 -1
  59. data/lib/bundler/man/bundle-doctor.1 +1 -1
  60. data/lib/bundler/man/bundle-exec.1 +5 -5
  61. data/lib/bundler/man/bundle-exec.1.ronn +5 -5
  62. data/lib/bundler/man/bundle-gem.1 +27 -37
  63. data/lib/bundler/man/bundle-gem.1.ronn +5 -5
  64. data/lib/bundler/man/bundle-help.1 +1 -1
  65. data/lib/bundler/man/bundle-info.1 +1 -1
  66. data/lib/bundler/man/bundle-init.1 +5 -1
  67. data/lib/bundler/man/bundle-init.1.ronn +2 -0
  68. data/lib/bundler/man/bundle-inject.1 +1 -1
  69. data/lib/bundler/man/bundle-install.1 +1 -30
  70. data/lib/bundler/man/bundle-install.1.ronn +0 -29
  71. data/lib/bundler/man/bundle-list.1 +1 -1
  72. data/lib/bundler/man/bundle-lock.1 +1 -1
  73. data/lib/bundler/man/bundle-open.1 +22 -2
  74. data/lib/bundler/man/bundle-open.1.ronn +9 -1
  75. data/lib/bundler/man/bundle-outdated.1 +1 -1
  76. data/lib/bundler/man/bundle-platform.1 +2 -2
  77. data/lib/bundler/man/bundle-platform.1.ronn +1 -1
  78. data/lib/bundler/man/bundle-plugin.1 +1 -1
  79. data/lib/bundler/man/bundle-pristine.1 +1 -1
  80. data/lib/bundler/man/bundle-remove.1 +1 -1
  81. data/lib/bundler/man/bundle-show.1 +1 -1
  82. data/lib/bundler/man/bundle-update.1 +1 -1
  83. data/lib/bundler/man/bundle-version.1 +1 -1
  84. data/lib/bundler/man/bundle-viz.1 +1 -1
  85. data/lib/bundler/man/bundle.1 +1 -1
  86. data/lib/bundler/man/gemfile.5 +1 -1
  87. data/lib/bundler/mirror.rb +5 -7
  88. data/lib/bundler/plugin/index.rb +4 -4
  89. data/lib/bundler/plugin/installer/rubygems.rb +0 -4
  90. data/lib/bundler/plugin/installer.rb +5 -2
  91. data/lib/bundler/plugin.rb +1 -1
  92. data/lib/bundler/remote_specification.rb +2 -6
  93. data/lib/bundler/resolver/base.rb +72 -15
  94. data/lib/bundler/resolver/candidate.rb +94 -0
  95. data/lib/bundler/resolver/incompatibility.rb +15 -0
  96. data/lib/bundler/resolver/package.rb +72 -0
  97. data/lib/bundler/resolver/root.rb +25 -0
  98. data/lib/bundler/resolver/spec_group.rb +26 -36
  99. data/lib/bundler/resolver.rb +311 -278
  100. data/lib/bundler/ruby_version.rb +1 -1
  101. data/lib/bundler/rubygems_ext.rb +16 -9
  102. data/lib/bundler/rubygems_gem_installer.rb +4 -2
  103. data/lib/bundler/rubygems_integration.rb +10 -14
  104. data/lib/bundler/runtime.rb +1 -5
  105. data/lib/bundler/safe_marshal.rb +31 -0
  106. data/lib/bundler/settings.rb +1 -7
  107. data/lib/bundler/setup.rb +4 -1
  108. data/lib/bundler/shared_helpers.rb +2 -1
  109. data/lib/bundler/source/git/git_proxy.rb +214 -69
  110. data/lib/bundler/source/git.rb +17 -18
  111. data/lib/bundler/source/metadata.rb +0 -1
  112. data/lib/bundler/source/path/installer.rb +1 -22
  113. data/lib/bundler/source/path.rb +6 -6
  114. data/lib/bundler/source/rubygems.rb +19 -77
  115. data/lib/bundler/source_list.rb +8 -2
  116. data/lib/bundler/spec_set.rb +22 -14
  117. data/lib/bundler/templates/Executable +1 -1
  118. data/lib/bundler/templates/Executable.bundler +5 -10
  119. data/lib/bundler/templates/Executable.standalone +2 -0
  120. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  121. data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  122. data/lib/bundler/templates/newgem/README.md.tt +6 -4
  123. data/lib/bundler/templates/newgem/Rakefile.tt +12 -1
  124. data/lib/bundler/templates/newgem/bin/console.tt +0 -4
  125. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  126. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  127. data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  128. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  129. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  130. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  131. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  132. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  133. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
  134. data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
  135. data/lib/bundler/ui/shell.rb +35 -12
  136. data/lib/bundler/ui/silent.rb +21 -5
  137. data/lib/bundler/uri_normalizer.rb +23 -0
  138. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  139. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  140. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  141. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
  142. data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  143. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  144. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  145. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  146. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  147. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  148. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  149. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  150. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  151. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  152. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  153. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  154. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  155. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  156. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  157. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  158. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +243 -0
  159. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  160. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  161. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  162. data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  163. data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  164. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  165. data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  166. data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  167. data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  168. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  169. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  170. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  171. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
  172. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
  173. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  174. data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  175. data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  176. data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  177. data/lib/bundler/vendored_persistent.rb +1 -33
  178. data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  179. data/lib/bundler/version.rb +5 -1
  180. data/lib/bundler/worker.rb +5 -7
  181. data/lib/bundler.rb +17 -69
  182. metadata +35 -33
  183. data/lib/bundler/templates/gems.rb +0 -5
  184. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  185. data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  186. data/lib/bundler/vendor/molinillo/LICENSE +0 -9
  187. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  188. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  189. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  190. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  191. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  192. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  193. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  194. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  195. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  196. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  197. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  198. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  199. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  200. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  201. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  202. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  203. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  204. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  205. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  206. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  207. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  208. data/lib/bundler/vendored_molinillo.rb +0 -4
  209. data/lib/bundler/version_ranges.rb +0 -122
@@ -2,23 +2,25 @@
2
2
 
3
3
  module Bundler
4
4
  class CLI::Open
5
- attr_reader :options, :name
5
+ attr_reader :options, :name, :path
6
6
  def initialize(options, name)
7
7
  @options = options
8
8
  @name = name
9
+ @path = options[:path] unless options[:path].nil?
9
10
  end
10
11
 
11
12
  def run
13
+ raise InvalidOption, "Cannot specify `--path` option without a value" if !@path.nil? && @path.empty?
12
14
  editor = [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? }
13
15
  return Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") unless editor
14
16
  return unless spec = Bundler::CLI::Common.select_spec(name, :regex_match)
15
17
  if spec.default_gem?
16
18
  Bundler.ui.info "Unable to open #{name} because it's a default gem, so the directory it would normally be installed to does not exist."
17
19
  else
18
- path = spec.full_gem_path
19
- Dir.chdir(path) do
20
+ root_path = spec.full_gem_path
21
+ Dir.chdir(root_path) do
20
22
  require "shellwords"
21
- command = Shellwords.split(editor) + [path]
23
+ command = Shellwords.split(editor) << File.join([root_path, path].compact)
22
24
  Bundler.with_original_env do
23
25
  system(*command)
24
26
  end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
@@ -111,9 +111,7 @@ module Bundler
111
111
  end.compact
112
112
 
113
113
  if options[:parseable]
114
- relevant_outdated_gems.each do |gems|
115
- print_gems(gems)
116
- end
114
+ print_gems(relevant_outdated_gems)
117
115
  else
118
116
  print_gems_table(relevant_outdated_gems)
119
117
  end
@@ -23,7 +23,7 @@ module Bundler
23
23
  Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:"
24
24
  Bundler.ui.warn "`gem install ruby-graphviz`"
25
25
  rescue StandardError => e
26
- raise unless e.message =~ /GraphViz not installed or dot not in PATH/
26
+ raise unless e.message.to_s.include?("GraphViz not installed or dot not in PATH")
27
27
  Bundler.ui.error e.message
28
28
  Bundler.ui.warn "Please install GraphViz. On a Mac with Homebrew, you can run `brew install graphviz`."
29
29
  end
data/lib/bundler/cli.rb CHANGED
@@ -10,6 +10,7 @@ module Bundler
10
10
 
11
11
  AUTO_INSTALL_CMDS = %w[show binstubs outdated exec open console licenses clean].freeze
12
12
  PARSEABLE_COMMANDS = %w[check config help exec platform show version].freeze
13
+ EXTENSIONS = ["c", "rust"].freeze
13
14
 
14
15
  COMMAND_ALIASES = {
15
16
  "check" => "c",
@@ -22,6 +23,8 @@ module Bundler
22
23
  }.freeze
23
24
 
24
25
  def self.start(*)
26
+ check_deprecated_ext_option(ARGV) if ARGV.include?("--ext")
27
+
25
28
  super
26
29
  ensure
27
30
  Bundler::SharedHelpers.print_major_deprecations!
@@ -153,6 +156,7 @@ module Bundler
153
156
  dependency listed in the gemspec file to the newly created Gemfile.
154
157
  D
155
158
  method_option "gemspec", :type => :string, :banner => "Use the specified .gemspec to create the Gemfile"
159
+ method_option "gemfile", :type => :string, :banner => "Use the specified name for the gemfile instead of 'Gemfile'"
156
160
  def init
157
161
  require_relative "cli/init"
158
162
  Init.new(options.dup).run
@@ -292,6 +296,8 @@ module Bundler
292
296
  "Prefer updating only to next minor version"
293
297
  method_option "major", :type => :boolean, :banner =>
294
298
  "Prefer updating to next major version (default)"
299
+ method_option "pre", :type => :boolean, :banner =>
300
+ "Always choose the highest allowed version when updating gems, regardless of prerelease status"
295
301
  method_option "strict", :type => :boolean, :banner =>
296
302
  "Do not allow any gem to be updated past latest --patch | --minor | --major"
297
303
  method_option "conservative", :type => :boolean, :banner =>
@@ -504,6 +510,7 @@ module Bundler
504
510
  subcommand "config", Config
505
511
 
506
512
  desc "open GEM", "Opens the source directory of the given bundled gem"
513
+ method_option "path", :type => :string, :lazy_default => "", :banner => "Open relative path of the gem source."
507
514
  def open(name)
508
515
  require_relative "cli/open"
509
516
  Open.new(options, name).run
@@ -574,7 +581,7 @@ module Bundler
574
581
  method_option :edit, :type => :string, :aliases => "-e", :required => false, :banner => "EDITOR",
575
582
  :lazy_default => [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? },
576
583
  :desc => "Open generated gemspec in the specified editor (defaults to $EDITOR or $BUNDLER_EDITOR)"
577
- method_option :ext, :type => :boolean, :default => false, :desc => "Generate the boilerplate for C extension code"
584
+ method_option :ext, :type => :string, :desc => "Generate the boilerplate for C extension code.", :enum => EXTENSIONS
578
585
  method_option :git, :type => :boolean, :default => true, :desc => "Initialize a git repo inside your library."
579
586
  method_option :mit, :type => :boolean, :desc => "Generate an MIT license file. Set a default with `bundle config set --global gem.mit true`."
580
587
  method_option :rubocop, :type => :boolean, :desc => "Add rubocop to the generated Rakefile and gemspec. Set a default with `bundle config set --global gem.rubocop true`."
@@ -582,7 +589,7 @@ module Bundler
582
589
  method_option :test, :type => :string, :lazy_default => Bundler.settings["gem.test"] || "", :aliases => "-t", :banner => "Use the specified test framework for your library",
583
590
  :desc => "Generate a test directory for your library, either rspec, minitest or test-unit. Set a default with `bundle config set --global gem.test (rspec|minitest|test-unit)`."
584
591
  method_option :ci, :type => :string, :lazy_default => Bundler.settings["gem.ci"] || "",
585
- :desc => "Generate CI configuration, either GitHub Actions, Travis CI, GitLab CI or CircleCI. Set a default with `bundle config set --global gem.ci (github|travis|gitlab|circle)`"
592
+ :desc => "Generate CI configuration, either GitHub Actions, GitLab CI or CircleCI. Set a default with `bundle config set --global gem.ci (github|gitlab|circle)`"
586
593
  method_option :linter, :type => :string, :lazy_default => Bundler.settings["gem.linter"] || "",
587
594
  :desc => "Add a linter and code formatter, either RuboCop or Standard. Set a default with `bundle config set --global gem.linter (rubocop|standard)`"
588
595
  method_option :github_username, :type => :string, :default => Bundler.settings["gem.github_username"], :banner => "Set your username on GitHub", :desc => "Fill in GitHub username on README so that you don't have to do it manually. Set a default with `bundle config set --global gem.github_username <your_username>`."
@@ -668,10 +675,14 @@ module Bundler
668
675
  "If updating, prefer updating only to next minor version"
669
676
  method_option "major", :type => :boolean, :banner =>
670
677
  "If updating, prefer updating to next major version (default)"
678
+ method_option "pre", :type => :boolean, :banner =>
679
+ "If updating, always choose the highest allowed version, regardless of prerelease status"
671
680
  method_option "strict", :type => :boolean, :banner =>
672
681
  "If updating, do not allow any gem to be updated past latest --patch | --minor | --major"
673
682
  method_option "conservative", :type => :boolean, :banner =>
674
683
  "If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated"
684
+ method_option "bundler", :type => :string, :lazy_default => "> 0.a", :banner =>
685
+ "Update the locked version of bundler"
675
686
  def lock
676
687
  require_relative "cli/lock"
677
688
  Lock.new(options).run
@@ -749,6 +760,38 @@ module Bundler
749
760
  end
750
761
  end
751
762
 
763
+ def self.check_deprecated_ext_option(arguments)
764
+ # when deprecated version of `--ext` is called
765
+ # print out deprecation warning and pretend `--ext=c` was provided
766
+ if deprecated_ext_value?(arguments)
767
+ SharedHelpers.major_deprecation 2, "Extensions can now be generated using C or Rust, so `--ext` with no arguments has been deprecated. Please select a language, e.g. `--ext=rust` to generate a Rust extension. This gem will now be generated as if `--ext=c` was used."
768
+ arguments[arguments.index("--ext")] = "--ext=c"
769
+ end
770
+ end
771
+
772
+ def self.deprecated_ext_value?(arguments)
773
+ index = arguments.index("--ext")
774
+ next_argument = arguments[index+1]
775
+
776
+ # it is ok when --ext is followed with valid extension value
777
+ # for example `bundle gem hello --ext c`
778
+ return false if EXTENSIONS.include?(next_argument)
779
+
780
+ # deprecated call when --ext is called with no value in last position
781
+ # for example `bundle gem hello_gem --ext`
782
+ return true if next_argument.nil?
783
+
784
+ # deprecated call when --ext is followed by other parameter
785
+ # for example `bundle gem --ext --no-ci hello_gem`
786
+ return true if next_argument.start_with?("-")
787
+
788
+ # deprecated call when --ext is followed by gem name
789
+ # for example `bundle gem --ext hello_gem`
790
+ return true if next_argument
791
+
792
+ false
793
+ end
794
+
752
795
  private
753
796
 
754
797
  # Automatically invoke `bundle install` and resume if
@@ -68,7 +68,7 @@ module Bundler
68
68
 
69
69
  def info_path(name)
70
70
  name = name.to_s
71
- if name =~ /[^a-z0-9_-]/
71
+ if /[^a-z0-9_-]/.match?(name)
72
72
  name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}"
73
73
  info_roots.last.join(name)
74
74
  else
@@ -20,63 +20,64 @@ module Bundler
20
20
 
21
21
  def initialize(fetcher)
22
22
  @fetcher = fetcher
23
- require_relative "../vendored_tmpdir"
24
23
  end
25
24
 
26
25
  def update(local_path, remote_path, retrying = nil)
27
26
  headers = {}
28
27
 
29
- Bundler::Dir.mktmpdir("bundler-compact-index-") do |local_temp_dir|
30
- local_temp_path = Pathname.new(local_temp_dir).join(local_path.basename)
31
-
32
- # first try to fetch any new bytes on the existing file
33
- if retrying.nil? && local_path.file?
34
- copy_file local_path, local_temp_path
35
-
36
- headers["If-None-Match"] = etag_for(local_temp_path)
37
- headers["Range"] =
38
- if local_temp_path.size.nonzero?
39
- # Subtract a byte to ensure the range won't be empty.
40
- # Avoids 416 (Range Not Satisfiable) responses.
41
- "bytes=#{local_temp_path.size - 1}-"
42
- else
43
- "bytes=#{local_temp_path.size}-"
44
- end
45
- end
28
+ local_temp_path = local_path.sub(/$/, ".#{$$}")
29
+ local_temp_path = local_temp_path.sub(/$/, ".retrying") if retrying
30
+ local_temp_path = local_temp_path.sub(/$/, ".tmp")
46
31
 
47
- response = @fetcher.call(remote_path, headers)
48
- return nil if response.is_a?(Net::HTTPNotModified)
32
+ # first try to fetch any new bytes on the existing file
33
+ if retrying.nil? && local_path.file?
34
+ copy_file local_path, local_temp_path
49
35
 
50
- content = response.body
36
+ headers["If-None-Match"] = etag_for(local_temp_path)
37
+ headers["Range"] =
38
+ if local_temp_path.size.nonzero?
39
+ # Subtract a byte to ensure the range won't be empty.
40
+ # Avoids 416 (Range Not Satisfiable) responses.
41
+ "bytes=#{local_temp_path.size - 1}-"
42
+ else
43
+ "bytes=#{local_temp_path.size}-"
44
+ end
45
+ end
51
46
 
52
- etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
53
- correct_response = SharedHelpers.filesystem_access(local_temp_path) do
54
- if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero?
55
- local_temp_path.open("a") {|f| f << slice_body(content, 1..-1) }
47
+ response = @fetcher.call(remote_path, headers)
48
+ return nil if response.is_a?(Net::HTTPNotModified)
56
49
 
57
- etag_for(local_temp_path) == etag
58
- else
59
- local_temp_path.open("wb") {|f| f << content }
50
+ content = response.body
60
51
 
61
- etag.length.zero? || etag_for(local_temp_path) == etag
62
- end
63
- end
52
+ etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
53
+ correct_response = SharedHelpers.filesystem_access(local_temp_path) do
54
+ if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero?
55
+ local_temp_path.open("a") {|f| f << slice_body(content, 1..-1) }
64
56
 
65
- if correct_response
66
- SharedHelpers.filesystem_access(local_path) do
67
- FileUtils.mv(local_temp_path, local_path)
68
- end
69
- return nil
57
+ etag_for(local_temp_path) == etag
58
+ else
59
+ local_temp_path.open("wb") {|f| f << content }
60
+
61
+ etag.length.zero? || etag_for(local_temp_path) == etag
70
62
  end
63
+ end
71
64
 
72
- if retrying
73
- raise MisMatchedChecksumError.new(remote_path, etag, etag_for(local_temp_path))
65
+ if correct_response
66
+ SharedHelpers.filesystem_access(local_path) do
67
+ FileUtils.mv(local_temp_path, local_path)
74
68
  end
69
+ return nil
70
+ end
75
71
 
76
- update(local_path, remote_path, :retrying)
72
+ if retrying
73
+ raise MisMatchedChecksumError.new(remote_path, etag, etag_for(local_temp_path))
77
74
  end
75
+
76
+ update(local_path, remote_path, :retrying)
78
77
  rescue Zlib::GzipFile::Error
79
78
  raise Bundler::HTTPError
79
+ ensure
80
+ FileUtils.remove_file(local_temp_path) if File.exist?(local_temp_path)
80
81
  end
81
82
 
82
83
  def etag_for(path)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Bundler
4
4
  WINDOWS = RbConfig::CONFIG["host_os"] =~ /(msdos|mswin|djgpp|mingw)/
5
- FREEBSD = RbConfig::CONFIG["host_os"] =~ /bsd/
5
+ FREEBSD = RbConfig::CONFIG["host_os"].to_s.include?("bsd")
6
6
  NULL = WINDOWS ? "NUL" : "/dev/null"
7
7
  end
@@ -22,6 +22,8 @@ module Bundler
22
22
  2.7
23
23
  3.0
24
24
  3.1
25
+ 3.2
26
+ 3.3
25
27
  ].freeze
26
28
 
27
29
  KNOWN_MAJOR_VERSIONS = KNOWN_MINOR_VERSIONS.map {|v| v.split(".", 2).first }.uniq.freeze
@@ -16,7 +16,6 @@ module Bundler
16
16
  :locked_deps,
17
17
  :locked_gems,
18
18
  :platforms,
19
- :requires,
20
19
  :ruby_version,
21
20
  :lockfile,
22
21
  :gemfiles
@@ -80,6 +79,7 @@ module Bundler
80
79
  @locked_bundler_version = nil
81
80
  @locked_ruby_version = nil
82
81
  @new_platform = nil
82
+ @removed_platform = nil
83
83
 
84
84
  if lockfile && File.exist?(lockfile)
85
85
  @lockfile_contents = Bundler.read_file(lockfile)
@@ -130,7 +130,7 @@ module Bundler
130
130
  end
131
131
  @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)
132
132
 
133
- add_current_platform unless current_ruby_platform_locked? || Bundler.frozen_bundle?
133
+ add_current_platform unless Bundler.frozen_bundle?
134
134
 
135
135
  converge_path_sources_to_gemspec_sources
136
136
  @path_changes = converge_paths
@@ -146,11 +146,11 @@ module Bundler
146
146
  @dependency_changes = converge_dependencies
147
147
  @local_changes = converge_locals
148
148
 
149
- @requires = compute_requires
149
+ @incomplete_lockfile = check_missing_lockfile_specs
150
150
  end
151
151
 
152
152
  def gem_version_promoter
153
- @gem_version_promoter ||= GemVersionPromoter.new(@originally_locked_specs, @unlock[:gems])
153
+ @gem_version_promoter ||= GemVersionPromoter.new
154
154
  end
155
155
 
156
156
  def resolve_only_locally!
@@ -159,13 +159,6 @@ module Bundler
159
159
  resolve
160
160
  end
161
161
 
162
- def resolve_prefering_local!
163
- @prefer_local = true
164
- @remote = true
165
- sources.remote!
166
- resolve
167
- end
168
-
169
162
  def resolve_with_cache!
170
163
  sources.cached!
171
164
  resolve
@@ -177,6 +170,23 @@ module Bundler
177
170
  resolve
178
171
  end
179
172
 
173
+ def resolution_mode=(options)
174
+ if options["local"]
175
+ @remote = false
176
+ else
177
+ @remote = true
178
+ @prefer_local = options["prefer-local"]
179
+ end
180
+ end
181
+
182
+ def setup_sources_for_resolve
183
+ if @remote == false
184
+ sources.cached!
185
+ else
186
+ sources.remote!
187
+ end
188
+ end
189
+
180
190
  # For given dependency list returns a SpecSet with Gemspec of all the required
181
191
  # dependencies.
182
192
  # 1. The method first resolves the dependencies specified in Gemfile
@@ -264,19 +274,19 @@ module Bundler
264
274
  @locked_specs
265
275
  elsif !unlocking? && nothing_changed?
266
276
  if deleted_deps.any?
267
- Bundler.ui.debug("Some dependencies were deleted, using a subset of the resolution from the lockfile")
277
+ Bundler.ui.debug "Some dependencies were deleted, using a subset of the resolution from the lockfile"
268
278
  SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
269
279
  else
270
- Bundler.ui.debug("Found no changes, using resolution from the lockfile")
271
- if @locked_gems.may_include_redundant_platform_specific_gems?
280
+ Bundler.ui.debug "Found no changes, using resolution from the lockfile"
281
+ if @removed_platform || @locked_gems.may_include_redundant_platform_specific_gems?
272
282
  SpecSet.new(filter_specs(@locked_specs, @dependencies))
273
283
  else
274
284
  @locked_specs
275
285
  end
276
286
  end
277
287
  else
278
- Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
279
- resolver.start(expanded_dependencies)
288
+ Bundler.ui.debug "Found changes from the lockfile, re-resolving dependencies because #{change_reason}"
289
+ start_resolution
280
290
  end
281
291
  end
282
292
 
@@ -295,11 +305,11 @@ module Bundler
295
305
 
296
306
  # Convert to \r\n if the existing lock has them
297
307
  # i.e., Windows with `git config core.autocrlf=true`
298
- contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match("\r\n")
308
+ contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match?("\r\n")
299
309
 
300
310
  if @locked_bundler_version
301
311
  locked_major = @locked_bundler_version.segments.first
302
- current_major = Gem::Version.create(Bundler::VERSION).segments.first
312
+ current_major = Bundler.gem_version.segments.first
303
313
 
304
314
  updating_major = locked_major < current_major
305
315
  end
@@ -447,7 +457,9 @@ module Bundler
447
457
  end
448
458
 
449
459
  def remove_platform(platform)
450
- return if @platforms.delete(Gem::Platform.new(platform))
460
+ removed_platform = @platforms.delete(Gem::Platform.new(platform))
461
+ @removed_platform ||= removed_platform
462
+ return if removed_platform
451
463
  raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
452
464
  end
453
465
 
@@ -461,7 +473,7 @@ module Bundler
461
473
  private :sources
462
474
 
463
475
  def nothing_changed?
464
- !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes
476
+ !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && !@incomplete_lockfile
465
477
  end
466
478
 
467
479
  def unlocking?
@@ -471,15 +483,20 @@ module Bundler
471
483
  private
472
484
 
473
485
  def resolver
474
- @resolver ||= begin
475
- last_resolve = converge_locked_specs
476
- remove_ruby_from_platforms_if_necessary!(current_dependencies)
477
- Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve), platforms)
478
- end
486
+ @resolver ||= Resolver.new(resolution_packages, gem_version_promoter)
479
487
  end
480
488
 
481
489
  def expanded_dependencies
482
- @expanded_dependencies ||= dependencies + metadata_dependencies
490
+ dependencies + metadata_dependencies
491
+ end
492
+
493
+ def resolution_packages
494
+ @resolution_packages ||= begin
495
+ last_resolve = converge_locked_specs
496
+ remove_ruby_from_platforms_if_necessary!(current_dependencies)
497
+ packages = Resolver::Base.new(source_requirements, expanded_dependencies, last_resolve, @platforms, :locked_specs => @originally_locked_specs, :unlock => @unlock[:gems], :prerelease => gem_version_promoter.pre?)
498
+ additional_base_requirements_for_resolve(packages, last_resolve)
499
+ end
483
500
  end
484
501
 
485
502
  def filter_specs(specs, deps)
@@ -507,23 +524,40 @@ module Bundler
507
524
  raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}"
508
525
  end
509
526
 
527
+ incomplete_specs = specs.incomplete_specs
510
528
  loop do
511
- incomplete_specs = specs.incomplete_specs
512
529
  break if incomplete_specs.empty?
513
530
 
514
531
  Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
515
- @resolve = resolver.start(expanded_dependencies, :exclude_specs => incomplete_specs)
532
+ setup_sources_for_resolve
533
+ resolution_packages.delete(incomplete_specs)
534
+ @resolve = start_resolution
516
535
  specs = resolve.materialize(dependencies)
536
+
537
+ still_incomplete_specs = specs.incomplete_specs
538
+
539
+ if still_incomplete_specs == incomplete_specs
540
+ package = resolution_packages.get_package(incomplete_specs.first.name)
541
+ resolver.raise_not_found! package
542
+ end
543
+
544
+ incomplete_specs = still_incomplete_specs
517
545
  end
518
546
 
519
- bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
547
+ bundler = sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last
520
548
  specs["bundler"] = bundler
521
549
 
522
550
  specs
523
551
  end
524
552
 
553
+ def start_resolution
554
+ result = resolver.start
555
+
556
+ SpecSet.new(SpecSet.new(result).for(dependencies, false, @platforms))
557
+ end
558
+
525
559
  def precompute_source_requirements_for_indirect_dependencies?
526
- @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
560
+ sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
527
561
  end
528
562
 
529
563
  def pin_locally_available_names(source_requirements)
@@ -553,6 +587,8 @@ module Bundler
553
587
  end
554
588
 
555
589
  def add_current_platform
590
+ return if current_ruby_platform_locked?
591
+
556
592
  add_platform(local_platform)
557
593
  end
558
594
 
@@ -574,6 +610,7 @@ module Bundler
574
610
  [@new_platform, "you added a new platform to your gemfile"],
575
611
  [@path_changes, "the gemspecs for path gems changed"],
576
612
  [@local_changes, "the gemspecs for git local gems changed"],
613
+ [@incomplete_lockfile, "your lock file is missing some gems"],
577
614
  ].select(&:first).map(&:last).join(", ")
578
615
  end
579
616
 
@@ -628,6 +665,22 @@ module Bundler
628
665
  !sources_with_changes.each {|source| @unlock[:sources] << source.name }.empty?
629
666
  end
630
667
 
668
+ def check_missing_lockfile_specs
669
+ all_locked_specs = @locked_specs.map(&:name) << "bundler"
670
+
671
+ missing = @locked_specs.select do |s|
672
+ s.dependencies.any? {|dep| !all_locked_specs.include?(dep.name) }
673
+ end
674
+
675
+ if missing.any?
676
+ @locked_specs.delete(missing)
677
+
678
+ true
679
+ else
680
+ false
681
+ end
682
+ end
683
+
631
684
  def converge_paths
632
685
  sources.path_sources.any? do |source|
633
686
  specs_changed?(source)
@@ -681,6 +734,8 @@ module Bundler
681
734
  dep.source = sources.get(dep.source)
682
735
  end
683
736
 
737
+ next if unlocking?
738
+
684
739
  unless locked_dep = @locked_deps[dep.name]
685
740
  changes = true
686
741
  next
@@ -766,12 +821,13 @@ module Bundler
766
821
  end
767
822
 
768
823
  new_spec = new_specs[s].first
769
-
770
- # If the spec is no longer in the path source, unlock it. This
771
- # commonly happens if the version changed in the gemspec
772
- next unless new_spec
773
-
774
- s.dependencies.replace(new_spec.dependencies)
824
+ if new_spec
825
+ s.dependencies.replace(new_spec.dependencies)
826
+ else
827
+ # If the spec is no longer in the path source, unlock it. This
828
+ # commonly happens if the version changed in the gemspec
829
+ @unlock[:gems] << s.name
830
+ end
775
831
  end
776
832
 
777
833
  if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
@@ -839,22 +895,13 @@ module Bundler
839
895
  current == proposed
840
896
  end
841
897
 
842
- def compute_requires
843
- dependencies.reduce({}) do |requires, dep|
844
- next requires unless dep.should_include?
845
- requires[dep.name] = Array(dep.autorequire || dep.name).map do |file|
846
- # Allow `require: true` as an alias for `require: <name>`
847
- file == true ? dep.name : file
848
- end
849
- requires
898
+ def additional_base_requirements_for_resolve(resolution_packages, last_resolve)
899
+ return resolution_packages unless @locked_gems && !sources.expired_sources?(@locked_gems.sources)
900
+ converge_specs(@originally_locked_specs - last_resolve).each do |locked_spec|
901
+ next if locked_spec.source.is_a?(Source::Path)
902
+ resolution_packages.base_requirements[locked_spec.name] = Gem::Requirement.new(">= #{locked_spec.version}")
850
903
  end
851
- end
852
-
853
- def additional_base_requirements_for_resolve(last_resolve)
854
- return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
855
- converge_specs(@originally_locked_specs - last_resolve).map do |locked_spec|
856
- Dependency.new(locked_spec.name, ">= #{locked_spec.version}")
857
- end.uniq
904
+ resolution_packages
858
905
  end
859
906
 
860
907
  def remove_ruby_from_platforms_if_necessary!(dependencies)
@@ -862,6 +909,7 @@ module Bundler
862
909
  Bundler.local_platform == Gem::Platform::RUBY ||
863
910
  !platforms.include?(Gem::Platform::RUBY) ||
864
911
  (@new_platform && platforms.last == Gem::Platform::RUBY) ||
912
+ @dependency_changes ||
865
913
  !@originally_locked_specs.incomplete_ruby_specs?(dependencies)
866
914
 
867
915
  remove_platform(Gem::Platform::RUBY)
@@ -7,20 +7,20 @@ require_relative "rubygems_ext"
7
7
  module Bundler
8
8
  class Dependency < Gem::Dependency
9
9
  attr_reader :autorequire
10
- attr_reader :groups, :platforms, :gemfile, :path, :git, :github, :branch, :ref, :force_ruby_platform
10
+ attr_reader :groups, :platforms, :gemfile, :path, :git, :github, :branch, :ref
11
11
 
12
- ALL_RUBY_VERSIONS = ((18..27).to_a + (30..31).to_a).freeze
12
+ ALL_RUBY_VERSIONS = ((18..27).to_a + (30..33).to_a).freeze
13
13
  PLATFORM_MAP = {
14
- :ruby => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
15
- :mri => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
16
- :rbx => [Gem::Platform::RUBY],
14
+ :ruby => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
15
+ :mri => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
16
+ :rbx => [Gem::Platform::RUBY],
17
17
  :truffleruby => [Gem::Platform::RUBY],
18
- :jruby => [Gem::Platform::JAVA, [18, 19]],
19
- :windows => [Gem::Platform::WINDOWS, ALL_RUBY_VERSIONS],
20
- :mswin => [Gem::Platform::MSWIN, ALL_RUBY_VERSIONS],
21
- :mswin64 => [Gem::Platform::MSWIN64, ALL_RUBY_VERSIONS - [18]],
22
- :mingw => [Gem::Platform::MINGW, ALL_RUBY_VERSIONS],
23
- :x64_mingw => [Gem::Platform::X64_MINGW, ALL_RUBY_VERSIONS - [18, 19]],
18
+ :jruby => [Gem::Platform::JAVA, [18, 19]],
19
+ :windows => [Gem::Platform::WINDOWS, ALL_RUBY_VERSIONS],
20
+ :mswin => [Gem::Platform::MSWIN, ALL_RUBY_VERSIONS],
21
+ :mswin64 => [Gem::Platform::MSWIN64, ALL_RUBY_VERSIONS - [18]],
22
+ :mingw => [Gem::Platform::MINGW, ALL_RUBY_VERSIONS],
23
+ :x64_mingw => [Gem::Platform::X64_MINGW, ALL_RUBY_VERSIONS - [18, 19]],
24
24
  }.each_with_object({}) do |(platform, spec), hash|
25
25
  hash[platform] = spec[0]
26
26
  spec[1]&.each {|version| hash[:"#{platform}_#{version}"] = spec[0] }
@@ -42,7 +42,7 @@ module Bundler
42
42
  @env = options["env"]
43
43
  @should_include = options.fetch("should_include", true)
44
44
  @gemfile = options["gemfile"]
45
- @force_ruby_platform = options["force_ruby_platform"]
45
+ @force_ruby_platform = options["force_ruby_platform"] if options.key?("force_ruby_platform")
46
46
 
47
47
  @autorequire = Array(options["require"] || []) if options.key?("require")
48
48
  end
@@ -50,6 +50,7 @@ module Bundler
50
50
  # Returns the platforms this dependency is valid for, in the same order as
51
51
  # passed in the `valid_platforms` parameter
52
52
  def gem_platforms(valid_platforms)
53
+ return [Gem::Platform::RUBY] if force_ruby_platform
53
54
  return valid_platforms if @platforms.empty?
54
55
 
55
56
  valid_platforms.select {|p| expanded_platforms.include?(GemHelpers.generic(p)) }
@@ -43,7 +43,7 @@ module Bundler
43
43
  f = (b ^ c ^ d)
44
44
  k = 0xCA62C1D6
45
45
  end
46
- t = SHA1_MASK & (SHA1_MASK & rotate(a, 5) + f + e + k + w[i])
46
+ t = SHA1_MASK & rotate(a, 5) + f + e + k + w[i]
47
47
  a, b, c, d, e = t, a, SHA1_MASK & rotate(b, 30), c, d # rubocop:disable Style/ParallelAssignment
48
48
  end
49
49
  mutated = [a, b, c, d, e]