bundler 2.3.25 → 2.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +109 -1
  3. data/README.md +2 -2
  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/check.rb +1 -1
  9. data/lib/bundler/cli/common.rb +1 -0
  10. data/lib/bundler/cli/console.rb +2 -2
  11. data/lib/bundler/cli/doctor.rb +4 -6
  12. data/lib/bundler/cli/gem.rb +62 -40
  13. data/lib/bundler/cli/install.rb +2 -3
  14. data/lib/bundler/cli/lock.rb +8 -5
  15. data/lib/bundler/cli/open.rb +6 -4
  16. data/lib/bundler/cli/outdated.rb +1 -3
  17. data/lib/bundler/cli/viz.rb +1 -1
  18. data/lib/bundler/cli.rb +45 -3
  19. data/lib/bundler/compact_index_client/cache.rb +1 -1
  20. data/lib/bundler/compact_index_client/updater.rb +40 -39
  21. data/lib/bundler/constants.rb +1 -1
  22. data/lib/bundler/definition.rb +85 -49
  23. data/lib/bundler/dependency.rb +12 -11
  24. data/lib/bundler/digest.rb +1 -1
  25. data/lib/bundler/dsl.rb +3 -3
  26. data/lib/bundler/env.rb +1 -1
  27. data/lib/bundler/environment_preserver.rb +1 -0
  28. data/lib/bundler/errors.rb +1 -11
  29. data/lib/bundler/fetcher/compact_index.rb +9 -11
  30. data/lib/bundler/fetcher/dependency.rb +1 -1
  31. data/lib/bundler/fetcher/downloader.rb +2 -5
  32. data/lib/bundler/fetcher.rb +2 -6
  33. data/lib/bundler/force_platform.rb +18 -0
  34. data/lib/bundler/friendly_errors.rb +0 -3
  35. data/lib/bundler/gem_version_promoter.rb +52 -86
  36. data/lib/bundler/graph.rb +3 -3
  37. data/lib/bundler/index.rb +5 -13
  38. data/lib/bundler/injector.rb +1 -1
  39. data/lib/bundler/inline.rb +2 -2
  40. data/lib/bundler/installer/parallel_installer.rb +0 -31
  41. data/lib/bundler/installer.rb +9 -23
  42. data/lib/bundler/lazy_specification.rb +37 -33
  43. data/lib/bundler/lockfile_parser.rb +5 -5
  44. data/lib/bundler/man/bundle-add.1 +1 -1
  45. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  46. data/lib/bundler/man/bundle-cache.1 +1 -1
  47. data/lib/bundler/man/bundle-check.1 +1 -1
  48. data/lib/bundler/man/bundle-clean.1 +2 -2
  49. data/lib/bundler/man/bundle-clean.1.ronn +1 -1
  50. data/lib/bundler/man/bundle-config.1 +2 -2
  51. data/lib/bundler/man/bundle-config.1.ronn +1 -1
  52. data/lib/bundler/man/bundle-console.1 +1 -1
  53. data/lib/bundler/man/bundle-doctor.1 +1 -1
  54. data/lib/bundler/man/bundle-exec.1 +1 -1
  55. data/lib/bundler/man/bundle-gem.1 +27 -37
  56. data/lib/bundler/man/bundle-gem.1.ronn +5 -5
  57. data/lib/bundler/man/bundle-help.1 +1 -1
  58. data/lib/bundler/man/bundle-info.1 +1 -1
  59. data/lib/bundler/man/bundle-init.1 +1 -1
  60. data/lib/bundler/man/bundle-inject.1 +1 -1
  61. data/lib/bundler/man/bundle-install.1 +1 -30
  62. data/lib/bundler/man/bundle-install.1.ronn +0 -29
  63. data/lib/bundler/man/bundle-list.1 +1 -1
  64. data/lib/bundler/man/bundle-lock.1 +1 -1
  65. data/lib/bundler/man/bundle-open.1 +22 -2
  66. data/lib/bundler/man/bundle-open.1.ronn +9 -1
  67. data/lib/bundler/man/bundle-outdated.1 +1 -1
  68. data/lib/bundler/man/bundle-platform.1 +2 -2
  69. data/lib/bundler/man/bundle-platform.1.ronn +1 -1
  70. data/lib/bundler/man/bundle-plugin.1 +1 -1
  71. data/lib/bundler/man/bundle-pristine.1 +1 -1
  72. data/lib/bundler/man/bundle-remove.1 +1 -1
  73. data/lib/bundler/man/bundle-show.1 +1 -1
  74. data/lib/bundler/man/bundle-update.1 +1 -1
  75. data/lib/bundler/man/bundle-version.1 +1 -1
  76. data/lib/bundler/man/bundle-viz.1 +1 -1
  77. data/lib/bundler/man/bundle.1 +1 -1
  78. data/lib/bundler/man/gemfile.5 +1 -1
  79. data/lib/bundler/mirror.rb +5 -7
  80. data/lib/bundler/plugin/index.rb +4 -4
  81. data/lib/bundler/plugin/installer/rubygems.rb +0 -4
  82. data/lib/bundler/resolver/base.rb +35 -15
  83. data/lib/bundler/resolver/candidate.rb +94 -0
  84. data/lib/bundler/resolver/incompatibility.rb +15 -0
  85. data/lib/bundler/resolver/package.rb +72 -0
  86. data/lib/bundler/resolver/root.rb +25 -0
  87. data/lib/bundler/resolver/spec_group.rb +26 -36
  88. data/lib/bundler/resolver.rb +323 -278
  89. data/lib/bundler/rubygems_ext.rb +33 -6
  90. data/lib/bundler/rubygems_gem_installer.rb +4 -2
  91. data/lib/bundler/rubygems_integration.rb +1 -9
  92. data/lib/bundler/runtime.rb +1 -5
  93. data/lib/bundler/settings.rb +0 -6
  94. data/lib/bundler/shared_helpers.rb +1 -0
  95. data/lib/bundler/source/git/git_proxy.rb +193 -67
  96. data/lib/bundler/source/git.rb +15 -17
  97. data/lib/bundler/source/metadata.rb +0 -1
  98. data/lib/bundler/source/path/installer.rb +1 -22
  99. data/lib/bundler/source/path.rb +5 -5
  100. data/lib/bundler/source/rubygems.rb +13 -67
  101. data/lib/bundler/source_list.rb +8 -2
  102. data/lib/bundler/spec_set.rb +7 -9
  103. data/lib/bundler/templates/Executable +1 -1
  104. data/lib/bundler/templates/Executable.bundler +4 -9
  105. data/lib/bundler/templates/Executable.standalone +2 -0
  106. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  107. data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  108. data/lib/bundler/templates/newgem/README.md.tt +6 -4
  109. data/lib/bundler/templates/newgem/Rakefile.tt +2 -1
  110. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  111. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  112. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  113. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  114. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  115. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  116. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
  117. data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
  118. data/lib/bundler/ui/shell.rb +35 -12
  119. data/lib/bundler/ui/silent.rb +21 -5
  120. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  121. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  122. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  123. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
  124. data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  125. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  126. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  127. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  128. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  129. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  130. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +151 -0
  131. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  132. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  133. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  134. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  135. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +53 -0
  136. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  137. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  138. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +128 -0
  139. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
  140. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -0
  141. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  142. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  143. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  144. data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  145. data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  146. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  147. data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  148. data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  149. data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  150. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  151. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  152. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  153. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
  154. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
  155. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  156. data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  157. data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  158. data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  159. data/lib/bundler/vendored_persistent.rb +1 -33
  160. data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  161. data/lib/bundler/version.rb +5 -1
  162. data/lib/bundler/worker.rb +5 -7
  163. data/lib/bundler.rb +20 -64
  164. metadata +33 -32
  165. data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  166. data/lib/bundler/vendor/molinillo/LICENSE +0 -9
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  173. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  174. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  176. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  178. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  179. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  180. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  181. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  182. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  183. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  184. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  185. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  186. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  187. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  188. data/lib/bundler/vendored_molinillo.rb +0 -4
  189. data/lib/bundler/version_ranges.rb +0 -122
  190. /data/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
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!
@@ -292,6 +295,8 @@ module Bundler
292
295
  "Prefer updating only to next minor version"
293
296
  method_option "major", :type => :boolean, :banner =>
294
297
  "Prefer updating to next major version (default)"
298
+ method_option "pre", :type => :boolean, :banner =>
299
+ "Always choose the highest allowed version when updating gems, regardless of prerelease status"
295
300
  method_option "strict", :type => :boolean, :banner =>
296
301
  "Do not allow any gem to be updated past latest --patch | --minor | --major"
297
302
  method_option "conservative", :type => :boolean, :banner =>
@@ -504,6 +509,7 @@ module Bundler
504
509
  subcommand "config", Config
505
510
 
506
511
  desc "open GEM", "Opens the source directory of the given bundled gem"
512
+ method_option "path", :type => :string, :lazy_default => "", :banner => "Open relative path of the gem source."
507
513
  def open(name)
508
514
  require_relative "cli/open"
509
515
  Open.new(options, name).run
@@ -574,7 +580,7 @@ module Bundler
574
580
  method_option :edit, :type => :string, :aliases => "-e", :required => false, :banner => "EDITOR",
575
581
  :lazy_default => [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? },
576
582
  :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"
583
+ method_option :ext, :type => :string, :desc => "Generate the boilerplate for C extension code.", :enum => EXTENSIONS
578
584
  method_option :git, :type => :boolean, :default => true, :desc => "Initialize a git repo inside your library."
579
585
  method_option :mit, :type => :boolean, :desc => "Generate an MIT license file. Set a default with `bundle config set --global gem.mit true`."
580
586
  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 +588,7 @@ module Bundler
582
588
  method_option :test, :type => :string, :lazy_default => Bundler.settings["gem.test"] || "", :aliases => "-t", :banner => "Use the specified test framework for your library",
583
589
  :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
590
  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)`"
591
+ :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
592
  method_option :linter, :type => :string, :lazy_default => Bundler.settings["gem.linter"] || "",
587
593
  :desc => "Add a linter and code formatter, either RuboCop or Standard. Set a default with `bundle config set --global gem.linter (rubocop|standard)`"
588
594
  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>`."
@@ -620,7 +626,7 @@ module Bundler
620
626
  method_option "dry-run", :type => :boolean, :default => false, :banner =>
621
627
  "Only print out changes, do not clean gems"
622
628
  method_option "force", :type => :boolean, :default => false, :banner =>
623
- "Forces clean even if --path is not set"
629
+ "Forces cleaning up unused gems even if Bundler is configured to use globally installed gems. As a consequence, removes all system gems except for the ones in the current application."
624
630
  def clean
625
631
  require_relative "cli/clean"
626
632
  Clean.new(options.dup).run
@@ -668,10 +674,14 @@ module Bundler
668
674
  "If updating, prefer updating only to next minor version"
669
675
  method_option "major", :type => :boolean, :banner =>
670
676
  "If updating, prefer updating to next major version (default)"
677
+ method_option "pre", :type => :boolean, :banner =>
678
+ "If updating, always choose the highest allowed version, regardless of prerelease status"
671
679
  method_option "strict", :type => :boolean, :banner =>
672
680
  "If updating, do not allow any gem to be updated past latest --patch | --minor | --major"
673
681
  method_option "conservative", :type => :boolean, :banner =>
674
682
  "If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated"
683
+ method_option "bundler", :type => :string, :lazy_default => "> 0.a", :banner =>
684
+ "Update the locked version of bundler"
675
685
  def lock
676
686
  require_relative "cli/lock"
677
687
  Lock.new(options).run
@@ -749,6 +759,38 @@ module Bundler
749
759
  end
750
760
  end
751
761
 
762
+ def self.check_deprecated_ext_option(arguments)
763
+ # when deprecated version of `--ext` is called
764
+ # print out deprecation warning and pretend `--ext=c` was provided
765
+ if deprecated_ext_value?(arguments)
766
+ 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."
767
+ arguments[arguments.index("--ext")] = "--ext=c"
768
+ end
769
+ end
770
+
771
+ def self.deprecated_ext_value?(arguments)
772
+ index = arguments.index("--ext")
773
+ next_argument = arguments[index+1]
774
+
775
+ # it is ok when --ext is followed with valid extension value
776
+ # for example `bundle gem hello --ext c`
777
+ return false if EXTENSIONS.include?(next_argument)
778
+
779
+ # deprecated call when --ext is called with no value in last position
780
+ # for example `bundle gem hello_gem --ext`
781
+ return true if next_argument.nil?
782
+
783
+ # deprecated call when --ext is followed by other parameter
784
+ # for example `bundle gem --ext --no-ci hello_gem`
785
+ return true if next_argument.start_with?("-")
786
+
787
+ # deprecated call when --ext is followed by gem name
788
+ # for example `bundle gem --ext hello_gem`
789
+ return true if next_argument
790
+
791
+ false
792
+ end
793
+
752
794
  private
753
795
 
754
796
  # 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
@@ -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,17 +483,22 @@ 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
490
  @expanded_dependencies ||= dependencies + metadata_dependencies
483
491
  end
484
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
500
+ end
501
+
485
502
  def filter_specs(specs, deps)
486
503
  SpecSet.new(specs).for(deps, false, platforms)
487
504
  end
@@ -507,21 +524,38 @@ 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(expanded_dependencies)
555
+
556
+ SpecSet.new(SpecSet.new(result).for(dependencies, false, @platforms))
557
+ end
558
+
525
559
  def precompute_source_requirements_for_indirect_dependencies?
526
560
  @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
527
561
  end
@@ -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,14 @@ 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
+ @locked_specs.any? do |s|
672
+ s.dependencies.any? {|dep| !all_locked_specs.include?(dep.name) }
673
+ end
674
+ end
675
+
631
676
  def converge_paths
632
677
  sources.path_sources.any? do |source|
633
678
  specs_changed?(source)
@@ -766,12 +811,13 @@ module Bundler
766
811
  end
767
812
 
768
813
  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)
814
+ if new_spec
815
+ s.dependencies.replace(new_spec.dependencies)
816
+ else
817
+ # If the spec is no longer in the path source, unlock it. This
818
+ # commonly happens if the version changed in the gemspec
819
+ @unlock[:gems] << s.name
820
+ end
775
821
  end
776
822
 
777
823
  if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
@@ -839,22 +885,12 @@ module Bundler
839
885
  current == proposed
840
886
  end
841
887
 
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
888
+ def additional_base_requirements_for_resolve(resolution_packages, last_resolve)
889
+ return resolution_packages unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
890
+ converge_specs(@originally_locked_specs - last_resolve).each do |locked_spec|
891
+ resolution_packages.base_requirements[locked_spec.name] = Gem::Requirement.new(">= #{locked_spec.version}")
850
892
  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
893
+ resolution_packages
858
894
  end
859
895
 
860
896
  def remove_ruby_from_platforms_if_necessary!(dependencies)
@@ -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
12
  ALL_RUBY_VERSIONS = ((18..27).to_a + (30..31).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]
data/lib/bundler/dsl.rb CHANGED
@@ -277,8 +277,8 @@ module Bundler
277
277
  if repo_name =~ GITHUB_PULL_REQUEST_URL
278
278
  {
279
279
  "git" => "https://github.com/#{$1}.git",
280
- "branch" => "refs/pull/#{$2}/head",
281
- "ref" => nil,
280
+ "branch" => nil,
281
+ "ref" => "refs/pull/#{$2}/head",
282
282
  "tag" => nil,
283
283
  }
284
284
  else
@@ -324,7 +324,7 @@ module Bundler
324
324
  if name.is_a?(Symbol)
325
325
  raise GemfileError, %(You need to specify gem names as Strings. Use 'gem "#{name}"' instead)
326
326
  end
327
- if name =~ /\s/
327
+ if /\s/.match?(name)
328
328
  raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
329
329
  end
330
330
  raise GemfileError, %(an empty gem name is not valid) if name.empty?
data/lib/bundler/env.rb CHANGED
@@ -75,7 +75,7 @@ module Bundler
75
75
  end
76
76
 
77
77
  def self.git_version
78
- Bundler::Source::Git::GitProxy.new(nil, nil, nil).full_version
78
+ Bundler::Source::Git::GitProxy.new(nil, nil).full_version
79
79
  rescue Bundler::Source::Git::GitNotInstalledError
80
80
  "not installed"
81
81
  end
@@ -7,6 +7,7 @@ module Bundler
7
7
  BUNDLE_BIN_PATH
8
8
  BUNDLE_GEMFILE
9
9
  BUNDLER_VERSION
10
+ BUNDLER_SETUP
10
11
  GEM_HOME
11
12
  GEM_PATH
12
13
  MANPATH
@@ -21,16 +21,7 @@ module Bundler
21
21
  class InstallError < BundlerError; status_code(5); end
22
22
 
23
23
  # Internal error, should be rescued
24
- class VersionConflict < BundlerError
25
- attr_reader :conflicts
26
-
27
- def initialize(conflicts, msg = nil)
28
- super(msg)
29
- @conflicts = conflicts
30
- end
31
-
32
- status_code(6)
33
- end
24
+ class SolveFailure < BundlerError; status_code(6); end
34
25
 
35
26
  class GemNotFound < BundlerError; status_code(7); end
36
27
  class InstallHookError < BundlerError; status_code(8); end
@@ -55,7 +46,6 @@ module Bundler
55
46
  class CyclicDependencyError < BundlerError; status_code(21); end
56
47
  class GemfileLockNotFound < BundlerError; status_code(22); end
57
48
  class PluginError < BundlerError; status_code(29); end
58
- class SudoNotPermittedError < BundlerError; status_code(30); end
59
49
  class ThreadCreationError < BundlerError; status_code(33); end
60
50
  class APIResponseMismatchError < BundlerError; status_code(34); end
61
51
  class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end