rubygems-update 3.3.26 → 3.4.1

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 (272) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -0
  3. data/CONTRIBUTING.md +24 -1
  4. data/Manifest.txt +30 -27
  5. data/POLICIES.md +10 -8
  6. data/README.md +2 -2
  7. data/bin/gem +1 -4
  8. data/bin/update_rubygems +1 -1
  9. data/bundler/CHANGELOG.md +59 -0
  10. data/bundler/README.md +2 -2
  11. data/bundler/bundler.gemspec +2 -2
  12. data/bundler/exe/bundle +1 -4
  13. data/bundler/lib/bundler/build_metadata.rb +2 -2
  14. data/bundler/lib/bundler/cli/add.rb +1 -1
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +1 -0
  17. data/bundler/lib/bundler/cli/console.rb +2 -2
  18. data/bundler/lib/bundler/cli/doctor.rb +4 -6
  19. data/bundler/lib/bundler/cli/gem.rb +62 -40
  20. data/bundler/lib/bundler/cli/install.rb +2 -3
  21. data/bundler/lib/bundler/cli/lock.rb +8 -5
  22. data/bundler/lib/bundler/cli/outdated.rb +1 -3
  23. data/bundler/lib/bundler/cli/viz.rb +1 -1
  24. data/bundler/lib/bundler/cli.rb +43 -2
  25. data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
  26. data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
  27. data/bundler/lib/bundler/constants.rb +1 -1
  28. data/bundler/lib/bundler/definition.rb +61 -31
  29. data/bundler/lib/bundler/dependency.rb +12 -11
  30. data/bundler/lib/bundler/digest.rb +1 -1
  31. data/bundler/lib/bundler/dsl.rb +1 -1
  32. data/bundler/lib/bundler/env.rb +1 -1
  33. data/bundler/lib/bundler/environment_preserver.rb +1 -0
  34. data/bundler/lib/bundler/errors.rb +1 -11
  35. data/bundler/lib/bundler/fetcher/compact_index.rb +9 -11
  36. data/bundler/lib/bundler/fetcher/dependency.rb +1 -1
  37. data/bundler/lib/bundler/fetcher/downloader.rb +2 -5
  38. data/bundler/lib/bundler/fetcher.rb +2 -6
  39. data/bundler/lib/bundler/force_platform.rb +18 -0
  40. data/bundler/lib/bundler/friendly_errors.rb +0 -3
  41. data/bundler/lib/bundler/gem_version_promoter.rb +52 -86
  42. data/bundler/lib/bundler/graph.rb +3 -3
  43. data/bundler/lib/bundler/index.rb +5 -13
  44. data/bundler/lib/bundler/injector.rb +1 -1
  45. data/bundler/lib/bundler/inline.rb +2 -2
  46. data/bundler/lib/bundler/installer/parallel_installer.rb +0 -31
  47. data/bundler/lib/bundler/installer.rb +6 -16
  48. data/bundler/lib/bundler/lazy_specification.rb +5 -1
  49. data/bundler/lib/bundler/lockfile_parser.rb +5 -5
  50. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  51. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  52. data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
  53. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  54. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  55. data/bundler/lib/bundler/man/bundle-config.1 +1 -1
  56. data/bundler/lib/bundler/man/bundle-console.1 +1 -1
  57. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  58. data/bundler/lib/bundler/man/bundle-exec.1 +1 -1
  59. data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
  60. data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
  61. data/bundler/lib/bundler/man/bundle-help.1 +1 -1
  62. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  63. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  64. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  65. data/bundler/lib/bundler/man/bundle-install.1 +1 -30
  66. data/bundler/lib/bundler/man/bundle-install.1.ronn +0 -29
  67. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  68. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  69. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  70. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  71. data/bundler/lib/bundler/man/bundle-platform.1 +2 -2
  72. data/bundler/lib/bundler/man/bundle-platform.1.ronn +1 -1
  73. data/bundler/lib/bundler/man/bundle-plugin.1 +1 -1
  74. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  75. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  76. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  77. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  78. data/bundler/lib/bundler/man/bundle-version.1 +1 -1
  79. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  80. data/bundler/lib/bundler/man/bundle.1 +1 -1
  81. data/bundler/lib/bundler/man/gemfile.5 +1 -1
  82. data/bundler/lib/bundler/mirror.rb +5 -7
  83. data/bundler/lib/bundler/plugin/index.rb +4 -4
  84. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  85. data/bundler/lib/bundler/resolver/base.rb +7 -11
  86. data/bundler/lib/bundler/resolver/candidate.rb +92 -0
  87. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  88. data/bundler/lib/bundler/resolver/package.rb +63 -0
  89. data/bundler/lib/bundler/resolver/root.rb +25 -0
  90. data/bundler/lib/bundler/resolver/spec_group.rb +26 -36
  91. data/bundler/lib/bundler/resolver.rb +294 -277
  92. data/bundler/lib/bundler/rubygems_ext.rb +11 -6
  93. data/bundler/lib/bundler/rubygems_gem_installer.rb +4 -2
  94. data/bundler/lib/bundler/rubygems_integration.rb +1 -9
  95. data/bundler/lib/bundler/runtime.rb +1 -5
  96. data/bundler/lib/bundler/settings.rb +0 -6
  97. data/bundler/lib/bundler/shared_helpers.rb +1 -0
  98. data/bundler/lib/bundler/source/git/git_proxy.rb +193 -67
  99. data/bundler/lib/bundler/source/git.rb +15 -17
  100. data/bundler/lib/bundler/source/metadata.rb +0 -1
  101. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  102. data/bundler/lib/bundler/source/path.rb +5 -5
  103. data/bundler/lib/bundler/source/rubygems.rb +13 -67
  104. data/bundler/lib/bundler/source_list.rb +8 -2
  105. data/bundler/lib/bundler/spec_set.rb +7 -9
  106. data/bundler/lib/bundler/templates/Executable +1 -1
  107. data/bundler/lib/bundler/templates/Executable.bundler +4 -9
  108. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  109. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  110. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  111. data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
  112. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -1
  113. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  114. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  115. data/bundler/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
  116. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  117. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  118. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  119. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  120. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
  121. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
  122. data/bundler/lib/bundler/ui/shell.rb +35 -12
  123. data/bundler/lib/bundler/ui/silent.rb +21 -5
  124. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  125. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  126. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  127. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
  128. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  129. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  130. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  131. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  132. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  133. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  134. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +151 -0
  135. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  136. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  137. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  138. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  139. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +53 -0
  140. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  141. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  142. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +124 -0
  143. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
  144. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -0
  145. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  146. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  147. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  148. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  149. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  150. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  151. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  152. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  153. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  154. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  155. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  156. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  157. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
  158. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
  159. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  160. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  161. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  162. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  163. data/bundler/lib/bundler/vendored_persistent.rb +1 -33
  164. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  165. data/bundler/lib/bundler/version.rb +5 -1
  166. data/bundler/lib/bundler/worker.rb +5 -7
  167. data/bundler/lib/bundler.rb +20 -64
  168. data/lib/rubygems/command_manager.rb +2 -2
  169. data/lib/rubygems/commands/fetch_command.rb +1 -1
  170. data/lib/rubygems/commands/install_command.rb +7 -3
  171. data/lib/rubygems/commands/rdoc_command.rb +3 -2
  172. data/lib/rubygems/commands/setup_command.rb +2 -2
  173. data/lib/rubygems/commands/unpack_command.rb +1 -1
  174. data/lib/rubygems/commands/update_command.rb +1 -7
  175. data/lib/rubygems/config_file.rb +33 -0
  176. data/lib/rubygems/core_ext/kernel_warn.rb +1 -2
  177. data/lib/rubygems/defaults.rb +15 -1
  178. data/lib/rubygems/dependency.rb +4 -1
  179. data/lib/rubygems/dependency_installer.rb +24 -24
  180. data/lib/rubygems/exceptions.rb +1 -3
  181. data/lib/rubygems/ext/builder.rb +3 -3
  182. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  183. data/lib/rubygems/ext/cargo_builder.rb +15 -20
  184. data/lib/rubygems/ext/ext_conf_builder.rb +2 -0
  185. data/lib/rubygems/indexer.rb +1 -1
  186. data/lib/rubygems/installer.rb +5 -5
  187. data/lib/rubygems/optparse/lib/optparse.rb +20 -15
  188. data/lib/rubygems/package/tar_header.rb +11 -11
  189. data/lib/rubygems/platform.rb +0 -2
  190. data/lib/rubygems/request_set/gem_dependency_api.rb +104 -104
  191. data/lib/rubygems/requirement.rb +7 -7
  192. data/lib/rubygems/resolver/installer_set.rb +1 -1
  193. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
  194. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
  195. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  196. data/lib/rubygems/security/policies.rb +40 -40
  197. data/lib/rubygems/security/trust_dir.rb +1 -1
  198. data/lib/rubygems/security.rb +3 -16
  199. data/lib/rubygems/source.rb +2 -2
  200. data/lib/rubygems/specification.rb +37 -49
  201. data/lib/rubygems/specification_policy.rb +14 -0
  202. data/lib/rubygems/stub_specification.rb +2 -2
  203. data/lib/rubygems/text.rb +1 -1
  204. data/lib/rubygems/tsort/lib/tsort.rb +308 -310
  205. data/lib/rubygems/update_suggestion.rb +69 -0
  206. data/lib/rubygems/util.rb +1 -5
  207. data/lib/rubygems/validator.rb +1 -1
  208. data/lib/rubygems.rb +8 -3
  209. data/rubygems-update.gemspec +2 -2
  210. data/test/rubygems/helper.rb +7 -3
  211. data/test/rubygems/test_bundled_ca.rb +1 -1
  212. data/test/rubygems/test_exit.rb +6 -0
  213. data/test/rubygems/test_gem.rb +4 -9
  214. data/test/rubygems/test_gem_bundler_version_finder.rb +2 -1
  215. data/test/rubygems/test_gem_command_manager.rb +1 -1
  216. data/test/rubygems/test_gem_commands_install_command.rb +19 -0
  217. data/test/rubygems/test_gem_commands_setup_command.rb +1 -8
  218. data/test/rubygems/test_gem_commands_update_command.rb +6 -6
  219. data/test/rubygems/test_gem_config_file.rb +1 -1
  220. data/test/rubygems/test_gem_dependency.rb +2 -0
  221. data/test/rubygems/test_gem_ext_builder.rb +3 -3
  222. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +22 -32
  223. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +1 -1
  224. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +22 -32
  225. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
  226. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
  227. data/test/rubygems/test_gem_ext_cargo_builder.rb +22 -27
  228. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +16 -16
  229. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -10
  230. data/test/rubygems/test_gem_indexer.rb +39 -20
  231. data/test/rubygems/test_gem_installer.rb +68 -2
  232. data/test/rubygems/test_gem_package_tar_header.rb +13 -13
  233. data/test/rubygems/test_gem_platform.rb +59 -60
  234. data/test/rubygems/test_gem_remote_fetcher.rb +4 -4
  235. data/test/rubygems/test_gem_request_set.rb +2 -2
  236. data/test/rubygems/test_gem_requirement.rb +1 -1
  237. data/test/rubygems/test_gem_resolver_api_set.rb +12 -12
  238. data/test/rubygems/test_gem_resolver_api_specification.rb +19 -19
  239. data/test/rubygems/test_gem_resolver_git_specification.rb +1 -1
  240. data/test/rubygems/test_gem_security_policy.rb +10 -10
  241. data/test/rubygems/test_gem_security_trust_dir.rb +2 -2
  242. data/test/rubygems/test_gem_specification.rb +50 -37
  243. data/test/rubygems/test_gem_uninstaller.rb +1 -1
  244. data/test/rubygems/test_gem_update_suggestion.rb +208 -0
  245. data/test/rubygems/test_kernel.rb +10 -8
  246. data/test/rubygems/test_require.rb +70 -55
  247. metadata +34 -31
  248. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  249. data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
  250. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  251. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  252. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  253. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  254. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  255. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  256. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  257. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  258. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  259. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  260. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  261. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  262. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  263. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  264. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  265. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  266. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  267. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  268. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  269. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  270. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  271. data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
  272. data/bundler/lib/bundler/version_ranges.rb +0 -122
@@ -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
@@ -146,11 +145,11 @@ module Bundler
146
145
  @dependency_changes = converge_dependencies
147
146
  @local_changes = converge_locals
148
147
 
149
- @requires = compute_requires
148
+ @incomplete_lockfile = check_missing_lockfile_specs
150
149
  end
151
150
 
152
151
  def gem_version_promoter
153
- @gem_version_promoter ||= GemVersionPromoter.new(@originally_locked_specs, @unlock[:gems])
152
+ @gem_version_promoter ||= GemVersionPromoter.new
154
153
  end
155
154
 
156
155
  def resolve_only_locally!
@@ -264,10 +263,10 @@ module Bundler
264
263
  @locked_specs
265
264
  elsif !unlocking? && nothing_changed?
266
265
  if deleted_deps.any?
267
- Bundler.ui.debug("Some dependencies were deleted, using a subset of the resolution from the lockfile")
266
+ Bundler.ui.debug "Some dependencies were deleted, using a subset of the resolution from the lockfile"
268
267
  SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
269
268
  else
270
- Bundler.ui.debug("Found no changes, using resolution from the lockfile")
269
+ Bundler.ui.debug "Found no changes, using resolution from the lockfile"
271
270
  if @locked_gems.may_include_redundant_platform_specific_gems?
272
271
  SpecSet.new(filter_specs(@locked_specs, @dependencies))
273
272
  else
@@ -275,8 +274,8 @@ module Bundler
275
274
  end
276
275
  end
277
276
  else
278
- Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
279
- resolver.start(expanded_dependencies)
277
+ Bundler.ui.debug "Found changes from the lockfile, re-resolving dependencies because #{change_reason}"
278
+ start_resolution
280
279
  end
281
280
  end
282
281
 
@@ -295,11 +294,11 @@ module Bundler
295
294
 
296
295
  # Convert to \r\n if the existing lock has them
297
296
  # i.e., Windows with `git config core.autocrlf=true`
298
- contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match("\r\n")
297
+ contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match?("\r\n")
299
298
 
300
299
  if @locked_bundler_version
301
300
  locked_major = @locked_bundler_version.segments.first
302
- current_major = Gem::Version.create(Bundler::VERSION).segments.first
301
+ current_major = Bundler.gem_version.segments.first
303
302
 
304
303
  updating_major = locked_major < current_major
305
304
  end
@@ -461,7 +460,7 @@ module Bundler
461
460
  private :sources
462
461
 
463
462
  def nothing_changed?
464
- !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes
463
+ !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && !@incomplete_lockfile
465
464
  end
466
465
 
467
466
  def unlocking?
@@ -474,7 +473,7 @@ module Bundler
474
473
  @resolver ||= begin
475
474
  last_resolve = converge_locked_specs
476
475
  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)
476
+ Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve))
478
477
  end
479
478
  end
480
479
 
@@ -482,6 +481,23 @@ module Bundler
482
481
  @expanded_dependencies ||= dependencies + metadata_dependencies
483
482
  end
484
483
 
484
+ def resolution_packages
485
+ @resolution_packages ||= begin
486
+ packages = Hash.new do |h, k|
487
+ h[k] = Resolver::Package.new(k, @platforms, @originally_locked_specs, @unlock[:gems])
488
+ end
489
+
490
+ expanded_dependencies.each do |dep|
491
+ name = dep.name
492
+ platforms = dep.gem_platforms(@platforms)
493
+
494
+ packages[name] = Resolver::Package.new(name, platforms, @originally_locked_specs, @unlock[:gems], :dependency => dep)
495
+ end
496
+
497
+ packages
498
+ end
499
+ end
500
+
485
501
  def filter_specs(specs, deps)
486
502
  SpecSet.new(specs).for(deps, false, platforms)
487
503
  end
@@ -507,21 +523,36 @@ module Bundler
507
523
  raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}"
508
524
  end
509
525
 
526
+ incomplete_specs = specs.incomplete_specs
510
527
  loop do
511
- incomplete_specs = specs.incomplete_specs
512
528
  break if incomplete_specs.empty?
513
529
 
514
530
  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)
531
+ @resolve = start_resolution(:exclude_specs => incomplete_specs)
516
532
  specs = resolve.materialize(dependencies)
533
+
534
+ still_incomplete_specs = specs.incomplete_specs
535
+
536
+ if still_incomplete_specs == incomplete_specs
537
+ package = resolution_packages[incomplete_specs.first.name]
538
+ resolver.raise_not_found! package
539
+ end
540
+
541
+ incomplete_specs = still_incomplete_specs
517
542
  end
518
543
 
519
- bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
544
+ bundler = sources.metadata_source.specs.search(["bundler", Bundler.gem_version]).last
520
545
  specs["bundler"] = bundler
521
546
 
522
547
  specs
523
548
  end
524
549
 
550
+ def start_resolution(exclude_specs: [])
551
+ result = resolver.start(expanded_dependencies, resolution_packages, :exclude_specs => exclude_specs)
552
+
553
+ SpecSet.new(SpecSet.new(result).for(dependencies, false, @platforms))
554
+ end
555
+
525
556
  def precompute_source_requirements_for_indirect_dependencies?
526
557
  @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
527
558
  end
@@ -574,6 +605,7 @@ module Bundler
574
605
  [@new_platform, "you added a new platform to your gemfile"],
575
606
  [@path_changes, "the gemspecs for path gems changed"],
576
607
  [@local_changes, "the gemspecs for git local gems changed"],
608
+ [@incomplete_lockfile, "your lock file is missing some gems"],
577
609
  ].select(&:first).map(&:last).join(", ")
578
610
  end
579
611
 
@@ -628,6 +660,14 @@ module Bundler
628
660
  !sources_with_changes.each {|source| @unlock[:sources] << source.name }.empty?
629
661
  end
630
662
 
663
+ def check_missing_lockfile_specs
664
+ all_locked_specs = @locked_specs.map(&:name) << "bundler"
665
+
666
+ @locked_specs.any? do |s|
667
+ s.dependencies.any? {|dep| !all_locked_specs.include?(dep.name) }
668
+ end
669
+ end
670
+
631
671
  def converge_paths
632
672
  sources.path_sources.any? do |source|
633
673
  specs_changed?(source)
@@ -766,12 +806,13 @@ module Bundler
766
806
  end
767
807
 
768
808
  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)
809
+ if new_spec
810
+ s.dependencies.replace(new_spec.dependencies)
811
+ else
812
+ # If the spec is no longer in the path source, unlock it. This
813
+ # commonly happens if the version changed in the gemspec
814
+ @unlock[:gems] << s.name
815
+ end
775
816
  end
776
817
 
777
818
  if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
@@ -839,17 +880,6 @@ module Bundler
839
880
  current == proposed
840
881
  end
841
882
 
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
850
- end
851
- end
852
-
853
883
  def additional_base_requirements_for_resolve(last_resolve)
854
884
  return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
855
885
  converge_specs(@originally_locked_specs - last_resolve).map do |locked_spec|
@@ -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]
@@ -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?
@@ -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
@@ -12,17 +12,15 @@ module Bundler
12
12
  method = instance_method(method_name)
13
13
  undef_method(method_name)
14
14
  define_method(method_name) do |*args, &blk|
15
- begin
16
- method.bind(self).call(*args, &blk)
17
- rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e
18
- raise HTTPError, e.message
19
- rescue AuthenticationRequiredError
20
- # Fail since we got a 401 from the server.
21
- raise
22
- rescue HTTPError => e
23
- Bundler.ui.trace(e)
24
- nil
25
- end
15
+ method.bind(self).call(*args, &blk)
16
+ rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e
17
+ raise HTTPError, e.message
18
+ rescue AuthenticationRequiredError
19
+ # Fail since we got a 401 from the server.
20
+ raise
21
+ rescue HTTPError => e
22
+ Bundler.ui.trace(e)
23
+ nil
26
24
  end
27
25
  end
28
26
 
@@ -55,7 +55,7 @@ module Bundler
55
55
  gem_list = []
56
56
  gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names|
57
57
  marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
58
- gem_list.concat(Bundler.load_marshal(marshalled_deps))
58
+ gem_list.concat(Bundler.safe_load_marshal(marshalled_deps))
59
59
  end
60
60
  gem_list
61
61
  end
@@ -61,14 +61,11 @@ module Bundler
61
61
  req.basic_auth(user, password)
62
62
  end
63
63
  connection.request(uri, req)
64
- rescue NoMethodError => e
65
- raise unless ["undefined method", "use_ssl="].all? {|snippet| e.message.include? snippet }
66
- raise LoadError.new("cannot load such file -- openssl")
67
64
  rescue OpenSSL::SSL::SSLError
68
65
  raise CertificateFailureError.new(uri)
69
66
  rescue *HTTP_ERRORS => e
70
67
  Bundler.ui.trace e
71
- if e.is_a?(SocketError) || e.message =~ /host down:/
68
+ if e.is_a?(SocketError) || e.message.to_s.include?("host down:")
72
69
  raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
73
70
  "connection and try again."
74
71
  else
@@ -80,7 +77,7 @@ module Bundler
80
77
  private
81
78
 
82
79
  def validate_uri_scheme!(uri)
83
- return if uri.scheme =~ /\Ahttps?\z/
80
+ return if /\Ahttps?\z/.match?(uri.scheme)
84
81
  raise InvalidOption,
85
82
  "The request uri `#{uri}` has an invalid scheme (`#{uri.scheme}`). " \
86
83
  "Did you mean `http` or `https`?"
@@ -29,9 +29,7 @@ module Bundler
29
29
  " is a chance you are experiencing a man-in-the-middle attack, but" \
30
30
  " most likely your system doesn't have the CA certificates needed" \
31
31
  " for verification. For information about OpenSSL certificates, see" \
32
- " https://railsapps.github.io/openssl-certificate-verify-failed.html." \
33
- " To connect without using SSL, edit your Gemfile" \
34
- " sources and change 'https' to 'http'."
32
+ " https://railsapps.github.io/openssl-certificate-verify-failed.html."
35
33
  end
36
34
  end
37
35
 
@@ -39,9 +37,7 @@ module Bundler
39
37
  class SSLError < HTTPError
40
38
  def initialize(msg = nil)
41
39
  super msg || "Could not load OpenSSL.\n" \
42
- "You must recompile Ruby with OpenSSL support or change the sources in your " \
43
- "Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL " \
44
- "using RVM are available at rvm.io/packages/openssl."
40
+ "You must recompile Ruby with OpenSSL support."
45
41
  end
46
42
  end
47
43
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ module ForcePlatform
5
+ private
6
+
7
+ # The `:force_ruby_platform` value used by dependencies for resolution, and
8
+ # by locked specifications for materialization is `false` by default, except
9
+ # for TruffleRuby. TruffleRuby generally needs to force the RUBY platform
10
+ # variant unless the name is explicitly allowlisted.
11
+
12
+ def default_force_ruby_platform
13
+ return false unless RUBY_ENGINE == "truffleruby"
14
+
15
+ !Gem::Platform::REUSE_AS_BINARY_ON_TRUFFLERUBY.include?(name)
16
+ end
17
+ end
18
+ end
@@ -36,9 +36,6 @@ module Bundler
36
36
  end
37
37
  when Thor::Error
38
38
  Bundler.ui.error error.message
39
- when LoadError
40
- raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
41
- Bundler.ui.error "\nCould not load OpenSSL. #{error.class}: #{error}\n#{error.backtrace.join("\n ")}"
42
39
  when Interrupt
43
40
  Bundler.ui.error "\nQuitting..."
44
41
  Bundler.ui.trace error
@@ -7,14 +7,13 @@ module Bundler
7
7
  # available dependency versions as found in its index, before returning it to
8
8
  # to the resolution engine to select the best version.
9
9
  class GemVersionPromoter
10
- DEBUG = ENV["BUNDLER_DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER"]
11
-
12
- attr_reader :level, :locked_specs, :unlock_gems
10
+ attr_reader :level
11
+ attr_accessor :pre
13
12
 
14
13
  # By default, strict is false, meaning every available version of a gem
15
14
  # is returned from sort_versions. The order gives preference to the
16
15
  # requested level (:patch, :minor, :major) but in complicated requirement
17
- # cases some gems will by necessity by promoted past the requested level,
16
+ # cases some gems will by necessity be promoted past the requested level,
18
17
  # or even reverted to older versions.
19
18
  #
20
19
  # If strict is set to true, the results from sort_versions will be
@@ -24,24 +23,13 @@ module Bundler
24
23
  # existing in the referenced source.
25
24
  attr_accessor :strict
26
25
 
27
- attr_accessor :prerelease_specified
28
-
29
- # Given a list of locked_specs and a list of gems to unlock creates a
30
- # GemVersionPromoter instance.
26
+ # Creates a GemVersionPromoter instance.
31
27
  #
32
- # @param locked_specs [SpecSet] All current locked specs. Unlike Definition
33
- # where this list is empty if all gems are being updated, this should
34
- # always be populated for all gems so this class can properly function.
35
- # @param unlock_gems [String] List of gem names being unlocked. If empty,
36
- # all gems will be considered unlocked.
37
28
  # @return [GemVersionPromoter]
38
- def initialize(locked_specs = SpecSet.new([]), unlock_gems = [])
29
+ def initialize
39
30
  @level = :major
40
31
  @strict = false
41
- @locked_specs = locked_specs
42
- @unlock_gems = unlock_gems
43
- @sort_versions = {}
44
- @prerelease_specified = {}
32
+ @pre = false
45
33
  end
46
34
 
47
35
  # @param value [Symbol] One of three Symbols: :major, :minor or :patch.
@@ -55,34 +43,19 @@ module Bundler
55
43
  @level = v
56
44
  end
57
45
 
58
- # Given a Dependency and an Array of Specifications of available versions for a
59
- # gem, this method will return the Array of Specifications sorted (and possibly
60
- # truncated if strict is true) in an order to give preference to the current
61
- # level (:major, :minor or :patch) when resolution is deciding what versions
62
- # best resolve all dependencies in the bundle.
63
- # @param dep [Dependency] The Dependency of the gem.
64
- # @param spec_groups [Specification] An array of Specifications for the same gem
65
- # named in the @dep param.
46
+ # Given a Resolver::Package and an Array of Specifications of available
47
+ # versions for a gem, this method will return the Array of Specifications
48
+ # sorted (and possibly truncated if strict is true) in an order to give
49
+ # preference to the current level (:major, :minor or :patch) when resolution
50
+ # is deciding what versions best resolve all dependencies in the bundle.
51
+ # @param package [Resolver::Package] The package being resolved.
52
+ # @param specs [Specification] An array of Specifications for the package.
66
53
  # @return [Specification] A new instance of the Specification Array sorted and
67
54
  # possibly filtered.
68
- def sort_versions(dep, spec_groups)
69
- @sort_versions[dep] ||= begin
70
- gem_name = dep.name
71
-
72
- # An Array per version returned, different entries for different platforms.
73
- # We only need the version here so it's ok to hard code this to the first instance.
74
- locked_spec = locked_specs[gem_name].first
55
+ def sort_versions(package, specs)
56
+ specs = filter_dep_specs(specs, package) if strict
75
57
 
76
- if strict
77
- filter_dep_specs(spec_groups, locked_spec)
78
- else
79
- sort_dep_specs(spec_groups, locked_spec)
80
- end
81
- end
82
- end
83
-
84
- def reset
85
- @sort_versions = {}
58
+ sort_dep_specs(specs, package)
86
59
  end
87
60
 
88
61
  # @return [bool] Convenience method for testing value of level variable.
@@ -95,79 +68,72 @@ module Bundler
95
68
  level == :minor
96
69
  end
97
70
 
71
+ # @return [bool] Convenience method for testing value of pre variable.
72
+ def pre?
73
+ pre == true
74
+ end
75
+
98
76
  private
99
77
 
100
- def filter_dep_specs(spec_groups, locked_spec)
101
- res = spec_groups.select do |spec_group|
102
- if locked_spec && !major?
103
- gsv = spec_group.version
104
- lsv = locked_spec.version
78
+ def filter_dep_specs(specs, package)
79
+ locked_version = package.locked_version
80
+ return specs if locked_version.nil? || major?
105
81
 
106
- must_match = minor? ? [0] : [0, 1]
82
+ specs.select do |spec|
83
+ gsv = spec.version
107
84
 
108
- matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] }
109
- matches.uniq == [true] ? (gsv >= lsv) : false
110
- else
111
- true
112
- end
113
- end
85
+ must_match = minor? ? [0] : [0, 1]
114
86
 
115
- sort_dep_specs(res, locked_spec)
87
+ all_match = must_match.all? {|idx| gsv.segments[idx] == locked_version.segments[idx] }
88
+ all_match && gsv >= locked_version
89
+ end
116
90
  end
117
91
 
118
- def sort_dep_specs(spec_groups, locked_spec)
119
- @locked_version = locked_spec&.version
120
- @gem_name = locked_spec&.name
121
-
122
- result = spec_groups.sort do |a, b|
123
- @a_ver = a.version
124
- @b_ver = b.version
92
+ def sort_dep_specs(specs, package)
93
+ locked_version = package.locked_version
125
94
 
126
- unless @gem_name && @prerelease_specified[@gem_name]
127
- a_pre = @a_ver.prerelease?
128
- b_pre = @b_ver.prerelease?
95
+ result = specs.sort do |a, b|
96
+ unless locked_version && (package.prerelease_specified? || pre?)
97
+ a_pre = a.prerelease?
98
+ b_pre = b.prerelease?
129
99
 
130
100
  next -1 if a_pre && !b_pre
131
101
  next 1 if b_pre && !a_pre
132
102
  end
133
103
 
134
104
  if major?
135
- @a_ver <=> @b_ver
136
- elsif either_version_older_than_locked
137
- @a_ver <=> @b_ver
138
- elsif segments_do_not_match(:major)
139
- @b_ver <=> @a_ver
140
- elsif !minor? && segments_do_not_match(:minor)
141
- @b_ver <=> @a_ver
105
+ a <=> b
106
+ elsif either_version_older_than_locked?(a, b, locked_version)
107
+ a <=> b
108
+ elsif segments_do_not_match?(a, b, :major)
109
+ b <=> a
110
+ elsif !minor? && segments_do_not_match?(a, b, :minor)
111
+ b <=> a
142
112
  else
143
- @a_ver <=> @b_ver
113
+ a <=> b
144
114
  end
145
115
  end
146
- post_sort(result)
116
+ post_sort(result, package.unlock?, locked_version)
147
117
  end
148
118
 
149
- def either_version_older_than_locked
150
- @locked_version && (@a_ver < @locked_version || @b_ver < @locked_version)
119
+ def either_version_older_than_locked?(a, b, locked_version)
120
+ locked_version && (a.version < locked_version || b.version < locked_version)
151
121
  end
152
122
 
153
- def segments_do_not_match(level)
123
+ def segments_do_not_match?(a, b, level)
154
124
  index = [:major, :minor].index(level)
155
- @a_ver.segments[index] != @b_ver.segments[index]
156
- end
157
-
158
- def unlocking_gem?
159
- unlock_gems.empty? || (@gem_name && unlock_gems.include?(@gem_name))
125
+ a.segments[index] != b.segments[index]
160
126
  end
161
127
 
162
128
  # Specific version moves can't always reliably be done during sorting
163
129
  # as not all elements are compared against each other.
164
- def post_sort(result)
130
+ def post_sort(result, unlock, locked_version)
165
131
  # default :major behavior in Bundler does not do this
166
132
  return result if major?
167
- if unlocking_gem? || @locked_version.nil?
133
+ if unlock || locked_version.nil?
168
134
  result
169
135
  else
170
- move_version_to_end(result, @locked_version)
136
+ move_version_to_end(result, locked_version)
171
137
  end
172
138
  end
173
139
 
@@ -114,10 +114,10 @@ module Bundler
114
114
  @groups.each do |group|
115
115
  g.add_nodes(
116
116
  group, {
117
- :style => "filled",
117
+ :style => "filled",
118
118
  :fillcolor => "#B9B9D5",
119
- :shape => "box3d",
120
- :fontsize => 16,
119
+ :shape => "box3d",
120
+ :fontsize => 16,
121
121
  }.merge(@node_options[group])
122
122
  )
123
123
  end