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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/CONTRIBUTING.md +24 -1
- data/Manifest.txt +30 -27
- data/POLICIES.md +10 -8
- data/README.md +2 -2
- data/bin/gem +1 -4
- data/bin/update_rubygems +1 -1
- data/bundler/CHANGELOG.md +59 -0
- data/bundler/README.md +2 -2
- data/bundler/bundler.gemspec +2 -2
- data/bundler/exe/bundle +1 -4
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli/add.rb +1 -1
- data/bundler/lib/bundler/cli/check.rb +1 -1
- data/bundler/lib/bundler/cli/common.rb +1 -0
- data/bundler/lib/bundler/cli/console.rb +2 -2
- data/bundler/lib/bundler/cli/doctor.rb +4 -6
- data/bundler/lib/bundler/cli/gem.rb +62 -40
- data/bundler/lib/bundler/cli/install.rb +2 -3
- data/bundler/lib/bundler/cli/lock.rb +8 -5
- data/bundler/lib/bundler/cli/outdated.rb +1 -3
- data/bundler/lib/bundler/cli/viz.rb +1 -1
- data/bundler/lib/bundler/cli.rb +43 -2
- data/bundler/lib/bundler/compact_index_client/cache.rb +1 -1
- data/bundler/lib/bundler/compact_index_client/updater.rb +40 -39
- data/bundler/lib/bundler/constants.rb +1 -1
- data/bundler/lib/bundler/definition.rb +61 -31
- data/bundler/lib/bundler/dependency.rb +12 -11
- data/bundler/lib/bundler/digest.rb +1 -1
- data/bundler/lib/bundler/dsl.rb +1 -1
- data/bundler/lib/bundler/env.rb +1 -1
- data/bundler/lib/bundler/environment_preserver.rb +1 -0
- data/bundler/lib/bundler/errors.rb +1 -11
- data/bundler/lib/bundler/fetcher/compact_index.rb +9 -11
- data/bundler/lib/bundler/fetcher/dependency.rb +1 -1
- data/bundler/lib/bundler/fetcher/downloader.rb +2 -5
- data/bundler/lib/bundler/fetcher.rb +2 -6
- data/bundler/lib/bundler/force_platform.rb +18 -0
- data/bundler/lib/bundler/friendly_errors.rb +0 -3
- data/bundler/lib/bundler/gem_version_promoter.rb +52 -86
- data/bundler/lib/bundler/graph.rb +3 -3
- data/bundler/lib/bundler/index.rb +5 -13
- data/bundler/lib/bundler/injector.rb +1 -1
- data/bundler/lib/bundler/inline.rb +2 -2
- data/bundler/lib/bundler/installer/parallel_installer.rb +0 -31
- data/bundler/lib/bundler/installer.rb +6 -16
- data/bundler/lib/bundler/lazy_specification.rb +5 -1
- data/bundler/lib/bundler/lockfile_parser.rb +5 -5
- data/bundler/lib/bundler/man/bundle-add.1 +1 -1
- data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
- data/bundler/lib/bundler/man/bundle-check.1 +1 -1
- data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
- data/bundler/lib/bundler/man/bundle-config.1 +1 -1
- data/bundler/lib/bundler/man/bundle-console.1 +1 -1
- data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
- data/bundler/lib/bundler/man/bundle-exec.1 +1 -1
- data/bundler/lib/bundler/man/bundle-gem.1 +27 -37
- data/bundler/lib/bundler/man/bundle-gem.1.ronn +5 -5
- data/bundler/lib/bundler/man/bundle-help.1 +1 -1
- data/bundler/lib/bundler/man/bundle-info.1 +1 -1
- data/bundler/lib/bundler/man/bundle-init.1 +1 -1
- data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
- data/bundler/lib/bundler/man/bundle-install.1 +1 -30
- data/bundler/lib/bundler/man/bundle-install.1.ronn +0 -29
- data/bundler/lib/bundler/man/bundle-list.1 +1 -1
- data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
- data/bundler/lib/bundler/man/bundle-open.1 +1 -1
- data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
- data/bundler/lib/bundler/man/bundle-platform.1 +2 -2
- data/bundler/lib/bundler/man/bundle-platform.1.ronn +1 -1
- data/bundler/lib/bundler/man/bundle-plugin.1 +1 -1
- data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
- data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
- data/bundler/lib/bundler/man/bundle-show.1 +1 -1
- data/bundler/lib/bundler/man/bundle-update.1 +1 -1
- data/bundler/lib/bundler/man/bundle-version.1 +1 -1
- data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
- data/bundler/lib/bundler/man/bundle.1 +1 -1
- data/bundler/lib/bundler/man/gemfile.5 +1 -1
- data/bundler/lib/bundler/mirror.rb +5 -7
- data/bundler/lib/bundler/plugin/index.rb +4 -4
- data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
- data/bundler/lib/bundler/resolver/base.rb +7 -11
- data/bundler/lib/bundler/resolver/candidate.rb +92 -0
- data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
- data/bundler/lib/bundler/resolver/package.rb +63 -0
- data/bundler/lib/bundler/resolver/root.rb +25 -0
- data/bundler/lib/bundler/resolver/spec_group.rb +26 -36
- data/bundler/lib/bundler/resolver.rb +294 -277
- data/bundler/lib/bundler/rubygems_ext.rb +11 -6
- data/bundler/lib/bundler/rubygems_gem_installer.rb +4 -2
- data/bundler/lib/bundler/rubygems_integration.rb +1 -9
- data/bundler/lib/bundler/runtime.rb +1 -5
- data/bundler/lib/bundler/settings.rb +0 -6
- data/bundler/lib/bundler/shared_helpers.rb +1 -0
- data/bundler/lib/bundler/source/git/git_proxy.rb +193 -67
- data/bundler/lib/bundler/source/git.rb +15 -17
- data/bundler/lib/bundler/source/metadata.rb +0 -1
- data/bundler/lib/bundler/source/path/installer.rb +1 -22
- data/bundler/lib/bundler/source/path.rb +5 -5
- data/bundler/lib/bundler/source/rubygems.rb +13 -67
- data/bundler/lib/bundler/source_list.rb +8 -2
- data/bundler/lib/bundler/spec_set.rb +7 -9
- data/bundler/lib/bundler/templates/Executable +1 -1
- data/bundler/lib/bundler/templates/Executable.bundler +4 -9
- data/bundler/lib/bundler/templates/Executable.standalone +2 -0
- data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/bundler/lib/bundler/templates/newgem/Gemfile.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/README.md.tt +6 -4
- data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -1
- data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
- data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +8 -0
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
- data/bundler/lib/bundler/ui/shell.rb +35 -12
- data/bundler/lib/bundler/ui/silent.rb +21 -5
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
- data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
- data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +151 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +53 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +124 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
- data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +3 -2
- data/bundler/lib/bundler/vendored_persistent.rb +1 -33
- data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
- data/bundler/lib/bundler/version.rb +5 -1
- data/bundler/lib/bundler/worker.rb +5 -7
- data/bundler/lib/bundler.rb +20 -64
- data/lib/rubygems/command_manager.rb +2 -2
- data/lib/rubygems/commands/fetch_command.rb +1 -1
- data/lib/rubygems/commands/install_command.rb +7 -3
- data/lib/rubygems/commands/rdoc_command.rb +3 -2
- data/lib/rubygems/commands/setup_command.rb +2 -2
- data/lib/rubygems/commands/unpack_command.rb +1 -1
- data/lib/rubygems/commands/update_command.rb +1 -7
- data/lib/rubygems/config_file.rb +33 -0
- data/lib/rubygems/core_ext/kernel_warn.rb +1 -2
- data/lib/rubygems/defaults.rb +15 -1
- data/lib/rubygems/dependency.rb +4 -1
- data/lib/rubygems/dependency_installer.rb +24 -24
- data/lib/rubygems/exceptions.rb +1 -3
- data/lib/rubygems/ext/builder.rb +3 -3
- data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
- data/lib/rubygems/ext/cargo_builder.rb +15 -20
- data/lib/rubygems/ext/ext_conf_builder.rb +2 -0
- data/lib/rubygems/indexer.rb +1 -1
- data/lib/rubygems/installer.rb +5 -5
- data/lib/rubygems/optparse/lib/optparse.rb +20 -15
- data/lib/rubygems/package/tar_header.rb +11 -11
- data/lib/rubygems/platform.rb +0 -2
- data/lib/rubygems/request_set/gem_dependency_api.rb +104 -104
- data/lib/rubygems/requirement.rb +7 -7
- data/lib/rubygems/resolver/installer_set.rb +1 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +1 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +32 -26
- data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/rubygems/security/policies.rb +40 -40
- data/lib/rubygems/security/trust_dir.rb +1 -1
- data/lib/rubygems/security.rb +3 -16
- data/lib/rubygems/source.rb +2 -2
- data/lib/rubygems/specification.rb +37 -49
- data/lib/rubygems/specification_policy.rb +14 -0
- data/lib/rubygems/stub_specification.rb +2 -2
- data/lib/rubygems/text.rb +1 -1
- data/lib/rubygems/tsort/lib/tsort.rb +308 -310
- data/lib/rubygems/update_suggestion.rb +69 -0
- data/lib/rubygems/util.rb +1 -5
- data/lib/rubygems/validator.rb +1 -1
- data/lib/rubygems.rb +8 -3
- data/rubygems-update.gemspec +2 -2
- data/test/rubygems/helper.rb +7 -3
- data/test/rubygems/test_bundled_ca.rb +1 -1
- data/test/rubygems/test_exit.rb +6 -0
- data/test/rubygems/test_gem.rb +4 -9
- data/test/rubygems/test_gem_bundler_version_finder.rb +2 -1
- data/test/rubygems/test_gem_command_manager.rb +1 -1
- data/test/rubygems/test_gem_commands_install_command.rb +19 -0
- data/test/rubygems/test_gem_commands_setup_command.rb +1 -8
- data/test/rubygems/test_gem_commands_update_command.rb +6 -6
- data/test/rubygems/test_gem_config_file.rb +1 -1
- data/test/rubygems/test_gem_dependency.rb +2 -0
- data/test/rubygems/test_gem_ext_builder.rb +3 -3
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +22 -32
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +22 -32
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +12 -0
- data/test/rubygems/test_gem_ext_cargo_builder.rb +22 -27
- data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +16 -16
- data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -10
- data/test/rubygems/test_gem_indexer.rb +39 -20
- data/test/rubygems/test_gem_installer.rb +68 -2
- data/test/rubygems/test_gem_package_tar_header.rb +13 -13
- data/test/rubygems/test_gem_platform.rb +59 -60
- data/test/rubygems/test_gem_remote_fetcher.rb +4 -4
- data/test/rubygems/test_gem_request_set.rb +2 -2
- data/test/rubygems/test_gem_requirement.rb +1 -1
- data/test/rubygems/test_gem_resolver_api_set.rb +12 -12
- data/test/rubygems/test_gem_resolver_api_specification.rb +19 -19
- data/test/rubygems/test_gem_resolver_git_specification.rb +1 -1
- data/test/rubygems/test_gem_security_policy.rb +10 -10
- data/test/rubygems/test_gem_security_trust_dir.rb +2 -2
- data/test/rubygems/test_gem_specification.rb +50 -37
- data/test/rubygems/test_gem_uninstaller.rb +1 -1
- data/test/rubygems/test_gem_update_suggestion.rb +208 -0
- data/test/rubygems/test_kernel.rb +10 -8
- data/test/rubygems/test_require.rb +70 -55
- metadata +34 -31
- data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/bundler/lib/bundler/vendor/molinillo/LICENSE +0 -9
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
- data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
- data/bundler/lib/bundler/vendored_molinillo.rb +0 -4
- 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
|
-
@
|
148
|
+
@incomplete_lockfile = check_missing_lockfile_specs
|
150
149
|
end
|
151
150
|
|
152
151
|
def gem_version_promoter
|
153
|
-
@gem_version_promoter ||= GemVersionPromoter.new
|
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
|
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
|
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
|
279
|
-
|
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 =
|
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)
|
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 =
|
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(
|
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
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
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
|
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
|
15
|
-
:mri
|
16
|
-
:rbx
|
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
|
19
|
-
:windows
|
20
|
-
:mswin
|
21
|
-
:mswin64
|
22
|
-
:mingw
|
23
|
-
:x64_mingw
|
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 &
|
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/bundler/lib/bundler/dsl.rb
CHANGED
@@ -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
|
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/bundler/lib/bundler/env.rb
CHANGED
@@ -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
|
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
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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.
|
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
|
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
|
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
|
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
|
-
|
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
|
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
|
-
|
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
|
29
|
+
def initialize
|
39
30
|
@level = :major
|
40
31
|
@strict = false
|
41
|
-
@
|
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
|
59
|
-
# gem, this method will return the Array of Specifications
|
60
|
-
# truncated if strict is true) in an order to give
|
61
|
-
# level (:major, :minor or :patch) when resolution
|
62
|
-
# best resolve all dependencies in the bundle.
|
63
|
-
# @param
|
64
|
-
# @param
|
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(
|
69
|
-
|
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
|
-
|
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(
|
101
|
-
|
102
|
-
|
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
|
-
|
82
|
+
specs.select do |spec|
|
83
|
+
gsv = spec.version
|
107
84
|
|
108
|
-
|
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
|
-
|
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(
|
119
|
-
|
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
|
-
|
127
|
-
|
128
|
-
|
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
|
-
|
136
|
-
elsif either_version_older_than_locked
|
137
|
-
|
138
|
-
elsif segments_do_not_match(:major)
|
139
|
-
|
140
|
-
elsif !minor? && segments_do_not_match(:minor)
|
141
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
133
|
+
if unlock || locked_version.nil?
|
168
134
|
result
|
169
135
|
else
|
170
|
-
move_version_to_end(result,
|
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
|
117
|
+
:style => "filled",
|
118
118
|
:fillcolor => "#B9B9D5",
|
119
|
-
:shape
|
120
|
-
:fontsize
|
119
|
+
:shape => "box3d",
|
120
|
+
:fontsize => 16,
|
121
121
|
}.merge(@node_options[group])
|
122
122
|
)
|
123
123
|
end
|