bundler-plus 4.0.15
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 +7 -0
- data/CHANGELOG.md +5670 -0
- data/LICENSE.md +22 -0
- data/README.md +58 -0
- data/bundler.gemspec +46 -0
- data/exe/bundle +29 -0
- data/exe/bundler +4 -0
- data/lib/bundler/.document +1 -0
- data/lib/bundler/build_metadata.rb +44 -0
- data/lib/bundler/capistrano.rb +4 -0
- data/lib/bundler/checksum.rb +270 -0
- data/lib/bundler/ci_detector.rb +75 -0
- data/lib/bundler/cli/add.rb +62 -0
- data/lib/bundler/cli/binstubs.rb +57 -0
- data/lib/bundler/cli/cache.rb +32 -0
- data/lib/bundler/cli/check.rb +40 -0
- data/lib/bundler/cli/clean.rb +25 -0
- data/lib/bundler/cli/common.rb +161 -0
- data/lib/bundler/cli/config.rb +208 -0
- data/lib/bundler/cli/console.rb +47 -0
- data/lib/bundler/cli/doctor/diagnose.rb +167 -0
- data/lib/bundler/cli/doctor/ssl.rb +249 -0
- data/lib/bundler/cli/doctor.rb +33 -0
- data/lib/bundler/cli/exec.rb +114 -0
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +493 -0
- data/lib/bundler/cli/info.rb +83 -0
- data/lib/bundler/cli/init.rb +51 -0
- data/lib/bundler/cli/install.rb +127 -0
- data/lib/bundler/cli/issue.rb +41 -0
- data/lib/bundler/cli/list.rb +97 -0
- data/lib/bundler/cli/lock.rb +94 -0
- data/lib/bundler/cli/open.rb +29 -0
- data/lib/bundler/cli/outdated.rb +337 -0
- data/lib/bundler/cli/platform.rb +48 -0
- data/lib/bundler/cli/plugin.rb +39 -0
- data/lib/bundler/cli/pristine.rb +64 -0
- data/lib/bundler/cli/remove.rb +17 -0
- data/lib/bundler/cli/show.rb +71 -0
- data/lib/bundler/cli/update.rb +125 -0
- data/lib/bundler/cli.rb +829 -0
- data/lib/bundler/compact_index_client/cache.rb +96 -0
- data/lib/bundler/compact_index_client/cache_file.rb +148 -0
- data/lib/bundler/compact_index_client/parser.rb +87 -0
- data/lib/bundler/compact_index_client/updater.rb +105 -0
- data/lib/bundler/compact_index_client.rb +92 -0
- data/lib/bundler/constants.rb +14 -0
- data/lib/bundler/current_ruby.rb +94 -0
- data/lib/bundler/definition.rb +1304 -0
- data/lib/bundler/dependency.rb +151 -0
- data/lib/bundler/deployment.rb +6 -0
- data/lib/bundler/deprecate.rb +44 -0
- data/lib/bundler/digest.rb +71 -0
- data/lib/bundler/dsl.rb +642 -0
- data/lib/bundler/endpoint_specification.rb +184 -0
- data/lib/bundler/env.rb +148 -0
- data/lib/bundler/environment_preserver.rb +69 -0
- data/lib/bundler/errors.rb +277 -0
- data/lib/bundler/feature_flag.rb +20 -0
- data/lib/bundler/fetcher/base.rb +55 -0
- data/lib/bundler/fetcher/compact_index.rb +133 -0
- data/lib/bundler/fetcher/dependency.rb +85 -0
- data/lib/bundler/fetcher/downloader.rb +116 -0
- data/lib/bundler/fetcher/gem_remote_fetcher.rb +24 -0
- data/lib/bundler/fetcher/index.rb +25 -0
- data/lib/bundler/fetcher.rb +365 -0
- data/lib/bundler/force_platform.rb +16 -0
- data/lib/bundler/friendly_errors.rb +127 -0
- data/lib/bundler/gem_helper.rb +237 -0
- data/lib/bundler/gem_tasks.rb +7 -0
- data/lib/bundler/gem_version_promoter.rb +147 -0
- data/lib/bundler/index.rb +203 -0
- data/lib/bundler/injector.rb +284 -0
- data/lib/bundler/inline.rb +106 -0
- data/lib/bundler/installer/gem_installer.rb +88 -0
- data/lib/bundler/installer/parallel_installer.rb +280 -0
- data/lib/bundler/installer/standalone.rb +113 -0
- data/lib/bundler/installer.rb +241 -0
- data/lib/bundler/lazy_specification.rb +270 -0
- data/lib/bundler/lockfile_generator.rb +119 -0
- data/lib/bundler/lockfile_parser.rb +328 -0
- data/lib/bundler/man/.document +1 -0
- data/lib/bundler/man/bundle-add.1 +79 -0
- data/lib/bundler/man/bundle-add.1.ronn +92 -0
- data/lib/bundler/man/bundle-binstubs.1 +30 -0
- data/lib/bundler/man/bundle-binstubs.1.ronn +42 -0
- data/lib/bundler/man/bundle-cache.1 +56 -0
- data/lib/bundler/man/bundle-cache.1.ronn +95 -0
- data/lib/bundler/man/bundle-check.1 +21 -0
- data/lib/bundler/man/bundle-check.1.ronn +26 -0
- data/lib/bundler/man/bundle-clean.1 +17 -0
- data/lib/bundler/man/bundle-clean.1.ronn +18 -0
- data/lib/bundler/man/bundle-config.1 +339 -0
- data/lib/bundler/man/bundle-config.1.ronn +455 -0
- data/lib/bundler/man/bundle-console.1 +33 -0
- data/lib/bundler/man/bundle-console.1.ronn +39 -0
- data/lib/bundler/man/bundle-doctor.1 +69 -0
- data/lib/bundler/man/bundle-doctor.1.ronn +77 -0
- data/lib/bundler/man/bundle-env.1 +9 -0
- data/lib/bundler/man/bundle-env.1.ronn +10 -0
- data/lib/bundler/man/bundle-exec.1 +104 -0
- data/lib/bundler/man/bundle-exec.1.ronn +150 -0
- data/lib/bundler/man/bundle-fund.1 +22 -0
- data/lib/bundler/man/bundle-fund.1.ronn +25 -0
- data/lib/bundler/man/bundle-gem.1 +107 -0
- data/lib/bundler/man/bundle-gem.1.ronn +150 -0
- data/lib/bundler/man/bundle-help.1 +9 -0
- data/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/lib/bundler/man/bundle-info.1 +17 -0
- data/lib/bundler/man/bundle-info.1.ronn +21 -0
- data/lib/bundler/man/bundle-init.1 +20 -0
- data/lib/bundler/man/bundle-init.1.ronn +32 -0
- data/lib/bundler/man/bundle-install.1 +178 -0
- data/lib/bundler/man/bundle-install.1.ronn +314 -0
- data/lib/bundler/man/bundle-issue.1 +45 -0
- data/lib/bundler/man/bundle-issue.1.ronn +37 -0
- data/lib/bundler/man/bundle-licenses.1 +9 -0
- data/lib/bundler/man/bundle-licenses.1.ronn +10 -0
- data/lib/bundler/man/bundle-list.1 +40 -0
- data/lib/bundler/man/bundle-list.1.ronn +41 -0
- data/lib/bundler/man/bundle-lock.1 +75 -0
- data/lib/bundler/man/bundle-lock.1.ronn +115 -0
- data/lib/bundler/man/bundle-open.1 +32 -0
- data/lib/bundler/man/bundle-open.1.ronn +28 -0
- data/lib/bundler/man/bundle-outdated.1 +106 -0
- data/lib/bundler/man/bundle-outdated.1.ronn +117 -0
- data/lib/bundler/man/bundle-platform.1 +49 -0
- data/lib/bundler/man/bundle-platform.1.ronn +49 -0
- data/lib/bundler/man/bundle-plugin.1 +76 -0
- data/lib/bundler/man/bundle-plugin.1.ronn +84 -0
- data/lib/bundler/man/bundle-pristine.1 +23 -0
- data/lib/bundler/man/bundle-pristine.1.ronn +34 -0
- data/lib/bundler/man/bundle-remove.1 +15 -0
- data/lib/bundler/man/bundle-remove.1.ronn +16 -0
- data/lib/bundler/man/bundle-show.1 +16 -0
- data/lib/bundler/man/bundle-show.1.ronn +21 -0
- data/lib/bundler/man/bundle-update.1 +284 -0
- data/lib/bundler/man/bundle-update.1.ronn +367 -0
- data/lib/bundler/man/bundle-version.1 +22 -0
- data/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/lib/bundler/man/bundle.1 +93 -0
- data/lib/bundler/man/bundle.1.ronn +107 -0
- data/lib/bundler/man/gemfile.5 +503 -0
- data/lib/bundler/man/gemfile.5.ronn +586 -0
- data/lib/bundler/man/index.txt +31 -0
- data/lib/bundler/match_metadata.rb +30 -0
- data/lib/bundler/match_platform.rb +42 -0
- data/lib/bundler/match_remote_metadata.rb +29 -0
- data/lib/bundler/materialization.rb +59 -0
- data/lib/bundler/mirror.rb +221 -0
- data/lib/bundler/plugin/api/source.rb +330 -0
- data/lib/bundler/plugin/api.rb +81 -0
- data/lib/bundler/plugin/dsl.rb +53 -0
- data/lib/bundler/plugin/events.rb +85 -0
- data/lib/bundler/plugin/index.rb +203 -0
- data/lib/bundler/plugin/installer/git.rb +34 -0
- data/lib/bundler/plugin/installer/path.rb +26 -0
- data/lib/bundler/plugin/installer/rubygems.rb +19 -0
- data/lib/bundler/plugin/installer.rb +123 -0
- data/lib/bundler/plugin/source_list.rb +31 -0
- data/lib/bundler/plugin/unloaded_source.rb +25 -0
- data/lib/bundler/plugin.rb +387 -0
- data/lib/bundler/process_lock.rb +20 -0
- data/lib/bundler/remote_specification.rb +126 -0
- data/lib/bundler/resolver/base.rb +127 -0
- data/lib/bundler/resolver/candidate.rb +85 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +95 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +74 -0
- data/lib/bundler/resolver/strategy.rb +43 -0
- data/lib/bundler/resolver.rb +603 -0
- data/lib/bundler/retry.rb +92 -0
- data/lib/bundler/ruby_dsl.rb +67 -0
- data/lib/bundler/ruby_version.rb +135 -0
- data/lib/bundler/rubygems_ext.rb +503 -0
- data/lib/bundler/rubygems_gem_installer.rb +206 -0
- data/lib/bundler/rubygems_integration.rb +456 -0
- data/lib/bundler/runtime.rb +331 -0
- data/lib/bundler/safe_marshal.rb +31 -0
- data/lib/bundler/self_manager.rb +197 -0
- data/lib/bundler/settings/validator.rb +86 -0
- data/lib/bundler/settings.rb +585 -0
- data/lib/bundler/setup.rb +39 -0
- data/lib/bundler/shared_helpers.rb +392 -0
- data/lib/bundler/source/gemspec.rb +19 -0
- data/lib/bundler/source/git/git_proxy.rb +509 -0
- data/lib/bundler/source/git.rb +451 -0
- data/lib/bundler/source/metadata.rb +67 -0
- data/lib/bundler/source/path/installer.rb +53 -0
- data/lib/bundler/source/path.rb +256 -0
- data/lib/bundler/source/rubygems/remote.rb +86 -0
- data/lib/bundler/source/rubygems.rb +606 -0
- data/lib/bundler/source/rubygems_aggregate.rb +71 -0
- data/lib/bundler/source.rb +120 -0
- data/lib/bundler/source_list.rb +240 -0
- data/lib/bundler/source_map.rb +72 -0
- data/lib/bundler/spec_set.rb +390 -0
- data/lib/bundler/stub_specification.rb +147 -0
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +16 -0
- data/lib/bundler/templates/Executable.standalone +14 -0
- data/lib/bundler/templates/Gemfile +5 -0
- data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +10 -0
- data/lib/bundler/templates/newgem/Cargo.toml.tt +13 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +24 -0
- data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
- data/lib/bundler/templates/newgem/README.md.tt +49 -0
- data/lib/bundler/templates/newgem/Rakefile.tt +72 -0
- data/lib/bundler/templates/newgem/bin/console.tt +11 -0
- data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +37 -0
- data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +22 -0
- data/lib/bundler/templates/newgem/ext/newgem/build.rs.tt +5 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +11 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/go.mod.tt +5 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +2 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.go.tt +31 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +23 -0
- data/lib/bundler/templates/newgem/github/workflows/build-gems.yml.tt +69 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +48 -0
- data/lib/bundler/templates/newgem/gitignore.tt +23 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +27 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +15 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +58 -0
- data/lib/bundler/templates/newgem/rspec.tt +3 -0
- data/lib/bundler/templates/newgem/rubocop.yml.tt +8 -0
- data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +19 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -0
- data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
- data/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +19 -0
- data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/lib/bundler/ui/rg_proxy.rb +19 -0
- data/lib/bundler/ui/shell.rb +191 -0
- data/lib/bundler/ui/silent.rb +96 -0
- data/lib/bundler/ui.rb +9 -0
- data/lib/bundler/uri_credentials_filter.rb +43 -0
- data/lib/bundler/uri_normalizer.rb +23 -0
- data/lib/bundler/vendor/.document +1 -0
- data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +227 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +230 -0
- data/lib/bundler/vendor/fileutils/COPYING +56 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +2701 -0
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +41 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +65 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +80 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1153 -0
- data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +169 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +423 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +236 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/lib/bundler/vendor/securerandom/COPYING +56 -0
- data/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
- data/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +105 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +61 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +108 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +407 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +130 -0
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +340 -0
- data/lib/bundler/vendor/thor/lib/thor/base.rb +825 -0
- data/lib/bundler/vendor/thor/lib/thor/command.rb +151 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +106 -0
- data/lib/bundler/vendor/thor/lib/thor/group.rb +292 -0
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +178 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
- data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +86 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +195 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +178 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +294 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +72 -0
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +335 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +384 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +112 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +81 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
- data/lib/bundler/vendor/thor/lib/thor/util.rb +285 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
- data/lib/bundler/vendor/thor/lib/thor.rb +674 -0
- data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
- data/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
- data/lib/bundler/vendor/uri/COPYING +56 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +922 -0
- data/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +1592 -0
- data/lib/bundler/vendor/uri/lib/uri/http.rb +137 -0
- data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +547 -0
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
- data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
- data/lib/bundler/vendored_fileutils.rb +4 -0
- data/lib/bundler/vendored_net_http.rb +23 -0
- data/lib/bundler/vendored_persistent.rb +11 -0
- data/lib/bundler/vendored_pub_grub.rb +4 -0
- data/lib/bundler/vendored_securerandom.rb +12 -0
- data/lib/bundler/vendored_thor.rb +8 -0
- data/lib/bundler/vendored_timeout.rb +12 -0
- data/lib/bundler/vendored_tsort.rb +4 -0
- data/lib/bundler/vendored_uri.rb +21 -0
- data/lib/bundler/version.rb +21 -0
- data/lib/bundler/vlad.rb +4 -0
- data/lib/bundler/worker.rb +125 -0
- data/lib/bundler/yaml_serializer.rb +98 -0
- data/lib/bundler.rb +691 -0
- metadata +409 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module RubyDsl
|
|
5
|
+
def ruby(*ruby_version)
|
|
6
|
+
options = ruby_version.pop if ruby_version.last.is_a?(Hash)
|
|
7
|
+
ruby_version.flatten!
|
|
8
|
+
|
|
9
|
+
if options
|
|
10
|
+
patchlevel = options[:patchlevel]
|
|
11
|
+
engine = options[:engine]
|
|
12
|
+
engine_version = options[:engine_version]
|
|
13
|
+
|
|
14
|
+
raise GemfileError, "Please define :engine_version" if engine && engine_version.nil?
|
|
15
|
+
raise GemfileError, "Please define :engine" if engine_version && engine.nil?
|
|
16
|
+
|
|
17
|
+
if options[:file]
|
|
18
|
+
raise GemfileError, "Do not pass version argument when using :file option" unless ruby_version.empty?
|
|
19
|
+
ruby_version << normalize_ruby_file(options[:file])
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if engine == "ruby" && engine_version && ruby_version != Array(engine_version)
|
|
23
|
+
raise GemfileEvalError, "ruby_version must match the :engine_version for MRI"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
@ruby_version = RubyVersion.new(ruby_version, patchlevel, engine, engine_version)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Support the various file formats found in .ruby-version files.
|
|
31
|
+
#
|
|
32
|
+
# 3.2.2
|
|
33
|
+
# ruby-3.2.2
|
|
34
|
+
#
|
|
35
|
+
# Also supports .tool-versions files for asdf. Lines not starting with "ruby" are ignored.
|
|
36
|
+
#
|
|
37
|
+
# ruby 2.5.1 # comment is ignored
|
|
38
|
+
# ruby 2.5.1# close comment and extra spaces doesn't confuse
|
|
39
|
+
#
|
|
40
|
+
# Intentionally does not support `3.2.1@gemset` since rvm recommends using .ruby-gemset instead
|
|
41
|
+
#
|
|
42
|
+
# Loads the file relative to the dirname of the Gemfile itself.
|
|
43
|
+
def normalize_ruby_file(filename)
|
|
44
|
+
file_content = Bundler.read_file(gemfile.dirname.join(filename))
|
|
45
|
+
# match "ruby-3.2.2", ruby = "3.2.2", ruby = '3.2.2' or "ruby 3.2.2" capturing version string up to the first space or comment
|
|
46
|
+
version_match = /^ # Start of line
|
|
47
|
+
ruby # Literal "ruby"
|
|
48
|
+
[\s-]* # Optional whitespace or hyphens (for "ruby-3.2.2" format)
|
|
49
|
+
(?:=\s*)? # Optional equals sign with whitespace (for ruby = "3.2.2" format)
|
|
50
|
+
(?:
|
|
51
|
+
"([^"]+)" # Double quoted version
|
|
52
|
+
|
|
|
53
|
+
'([^']+)' # Single quoted version
|
|
54
|
+
|
|
|
55
|
+
([^\s#"']+) # Unquoted version
|
|
56
|
+
)
|
|
57
|
+
/x.match(file_content)
|
|
58
|
+
if version_match
|
|
59
|
+
version_match[1] || version_match[2] || version_match[3]
|
|
60
|
+
else
|
|
61
|
+
file_content.strip
|
|
62
|
+
end
|
|
63
|
+
rescue Errno::ENOENT
|
|
64
|
+
raise GemfileError, "Could not find version file #{filename}"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class RubyVersion
|
|
5
|
+
attr_reader :versions,
|
|
6
|
+
:patchlevel,
|
|
7
|
+
:engine,
|
|
8
|
+
:engine_versions,
|
|
9
|
+
:gem_version,
|
|
10
|
+
:engine_gem_version
|
|
11
|
+
|
|
12
|
+
def initialize(versions, patchlevel, engine, engine_version)
|
|
13
|
+
# The parameters to this method must satisfy the
|
|
14
|
+
# following constraints, which are verified in
|
|
15
|
+
# the DSL:
|
|
16
|
+
#
|
|
17
|
+
# * If an engine is specified, an engine version
|
|
18
|
+
# must also be specified
|
|
19
|
+
# * If an engine version is specified, an engine
|
|
20
|
+
# must also be specified
|
|
21
|
+
# * If the engine is "ruby", the engine version
|
|
22
|
+
# must not be specified, or the engine version
|
|
23
|
+
# specified must match the version.
|
|
24
|
+
|
|
25
|
+
@versions = Array(versions).map do |v|
|
|
26
|
+
normalized_v = normalize_version(v)
|
|
27
|
+
|
|
28
|
+
unless Gem::Requirement::PATTERN.match?(normalized_v)
|
|
29
|
+
raise InvalidArgumentError, "#{v} is not a valid requirement on the Ruby version"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
op, v = Gem::Requirement.parse(normalized_v)
|
|
33
|
+
op == "=" ? v.to_s : "#{op} #{v}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
@gem_version = Gem::Requirement.create(@versions.first).requirements.first.last
|
|
37
|
+
@input_engine = engine&.to_s
|
|
38
|
+
@engine = engine&.to_s || "ruby"
|
|
39
|
+
@engine_versions = (engine_version && Array(engine_version)) || @versions
|
|
40
|
+
@engine_gem_version = Gem::Requirement.create(@engine_versions.first).requirements.first.last
|
|
41
|
+
@patchlevel = patchlevel || (@gem_version.prerelease? ? "-1" : nil)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def to_s(versions = self.versions)
|
|
45
|
+
output = String.new("ruby #{versions_string(versions)}")
|
|
46
|
+
output << " (#{engine} #{versions_string(engine_versions)})" unless engine == "ruby"
|
|
47
|
+
|
|
48
|
+
output
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @private
|
|
52
|
+
PATTERN = /
|
|
53
|
+
ruby\s
|
|
54
|
+
(\d+\.\d+\.\d+(?:\.\S+)?) # ruby version
|
|
55
|
+
(?:p(-?\d+))? # optional patchlevel
|
|
56
|
+
(?:\s\((\S+)\s(.+)\))? # optional engine info
|
|
57
|
+
/xo
|
|
58
|
+
|
|
59
|
+
# Returns a RubyVersion from the given string.
|
|
60
|
+
# @param [String] the version string to match.
|
|
61
|
+
# @return [RubyVersion,Nil] The version if the string is a valid RubyVersion
|
|
62
|
+
# description, and nil otherwise.
|
|
63
|
+
def self.from_string(string)
|
|
64
|
+
new($1, $2, $3, $4) if string =~ PATTERN
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def single_version_string
|
|
68
|
+
to_s(gem_version)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def ==(other)
|
|
72
|
+
versions == other.versions &&
|
|
73
|
+
engine == other.engine &&
|
|
74
|
+
engine_versions == other.engine_versions
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def host
|
|
78
|
+
@host ||= [
|
|
79
|
+
RbConfig::CONFIG["host_cpu"],
|
|
80
|
+
RbConfig::CONFIG["host_vendor"],
|
|
81
|
+
RbConfig::CONFIG["host_os"],
|
|
82
|
+
].join("-")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Returns a tuple of these things:
|
|
86
|
+
# [diff, this, other]
|
|
87
|
+
# The priority of attributes are
|
|
88
|
+
# 1. engine
|
|
89
|
+
# 2. ruby_version
|
|
90
|
+
# 3. engine_version
|
|
91
|
+
def diff(other)
|
|
92
|
+
raise ArgumentError, "Can only diff with a RubyVersion, not a #{other.class}" unless other.is_a?(RubyVersion)
|
|
93
|
+
if engine != other.engine && @input_engine
|
|
94
|
+
[:engine, engine, other.engine]
|
|
95
|
+
elsif versions.empty? || !matches?(versions, other.gem_version)
|
|
96
|
+
[:version, versions_string(versions), versions_string(other.versions)]
|
|
97
|
+
elsif @input_engine && !matches?(engine_versions, other.engine_gem_version)
|
|
98
|
+
[:engine_version, versions_string(engine_versions), versions_string(other.engine_versions)]
|
|
99
|
+
elsif patchlevel && (!patchlevel.is_a?(String) || !other.patchlevel.is_a?(String) || !matches?(patchlevel, other.patchlevel))
|
|
100
|
+
[:patchlevel, patchlevel, other.patchlevel]
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def versions_string(versions)
|
|
105
|
+
Array(versions).join(", ")
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def self.system
|
|
109
|
+
ruby_engine = RUBY_ENGINE.dup
|
|
110
|
+
ruby_version = Gem.ruby_version.to_s
|
|
111
|
+
ruby_engine_version = RUBY_ENGINE == "ruby" ? ruby_version : RUBY_ENGINE_VERSION.dup
|
|
112
|
+
patchlevel = RUBY_PATCHLEVEL.to_s
|
|
113
|
+
|
|
114
|
+
@system ||= RubyVersion.new(ruby_version, patchlevel, ruby_engine, ruby_engine_version)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
|
|
119
|
+
# Ruby's official preview version format uses a `-`: Example: 3.3.0-preview2
|
|
120
|
+
# However, RubyGems recognizes preview version format with a `.`: Example: 3.3.0.preview2
|
|
121
|
+
# Returns version string after replacing `-` with `.`
|
|
122
|
+
def normalize_version(version)
|
|
123
|
+
version.tr("-", ".")
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def matches?(requirements, version)
|
|
127
|
+
# Handles RUBY_PATCHLEVEL of -1 for instances like ruby-head
|
|
128
|
+
return requirements == version if requirements.to_s == "-1" || version.to_s == "-1"
|
|
129
|
+
|
|
130
|
+
Array(requirements).all? do |requirement|
|
|
131
|
+
Gem::Requirement.create(requirement).satisfied_by?(Gem::Version.create(version))
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rubygems" unless defined?(Gem)
|
|
4
|
+
|
|
5
|
+
# We can't let `Gem::Source` be autoloaded in the `Gem::Specification#source`
|
|
6
|
+
# redefinition below, so we need to load it upfront. The reason is that if
|
|
7
|
+
# Bundler monkeypatches are loaded before RubyGems activates an executable (for
|
|
8
|
+
# example, through `ruby -rbundler -S irb`), gem activation might end up calling
|
|
9
|
+
# the redefined `Gem::Specification#source` and triggering the `Gem::Source`
|
|
10
|
+
# autoload. That would result in requiring "rubygems/source" inside another
|
|
11
|
+
# require, which would trigger a monitor error and cause the `autoload` to
|
|
12
|
+
# eventually fail. A better solution is probably to completely avoid autoloading
|
|
13
|
+
# `Gem::Source` from the redefined `Gem::Specification#source`.
|
|
14
|
+
require "rubygems/source"
|
|
15
|
+
|
|
16
|
+
module Gem
|
|
17
|
+
# Can be removed once RubyGems 3.5.11 support is dropped
|
|
18
|
+
unless Gem.respond_to?(:freebsd_platform?)
|
|
19
|
+
def self.freebsd_platform?
|
|
20
|
+
RbConfig::CONFIG["host_os"].to_s.include?("bsd")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Can be removed once RubyGems 3.5.18 support is dropped
|
|
25
|
+
unless Gem.respond_to?(:open_file_with_lock)
|
|
26
|
+
class << self
|
|
27
|
+
remove_method :open_file_with_flock if Gem.respond_to?(:open_file_with_flock)
|
|
28
|
+
|
|
29
|
+
def open_file_with_flock(path, &block)
|
|
30
|
+
# read-write mode is used rather than read-only in order to support NFS
|
|
31
|
+
mode = IO::RDWR | IO::APPEND | IO::CREAT | IO::BINARY
|
|
32
|
+
mode |= IO::SHARE_DELETE if IO.const_defined?(:SHARE_DELETE)
|
|
33
|
+
|
|
34
|
+
File.open(path, mode) do |io|
|
|
35
|
+
begin
|
|
36
|
+
io.flock(File::LOCK_EX)
|
|
37
|
+
rescue Errno::ENOSYS, Errno::ENOTSUP
|
|
38
|
+
end
|
|
39
|
+
yield io
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def open_file_with_lock(path, &block)
|
|
44
|
+
file_lock = "#{path}.lock"
|
|
45
|
+
open_file_with_flock(file_lock, &block)
|
|
46
|
+
ensure
|
|
47
|
+
FileUtils.rm_f file_lock
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
require "rubygems/platform"
|
|
53
|
+
|
|
54
|
+
class Platform
|
|
55
|
+
# Can be removed once RubyGems 3.6.9 support is dropped
|
|
56
|
+
unless respond_to?(:generic)
|
|
57
|
+
JAVA = Gem::Platform.new("java") # :nodoc:
|
|
58
|
+
MSWIN = Gem::Platform.new("mswin32") # :nodoc:
|
|
59
|
+
MSWIN64 = Gem::Platform.new("mswin64") # :nodoc:
|
|
60
|
+
MINGW = Gem::Platform.new("x86-mingw32") # :nodoc:
|
|
61
|
+
X64_MINGW_LEGACY = Gem::Platform.new("x64-mingw32") # :nodoc:
|
|
62
|
+
X64_MINGW = Gem::Platform.new("x64-mingw-ucrt") # :nodoc:
|
|
63
|
+
UNIVERSAL_MINGW = Gem::Platform.new("universal-mingw") # :nodoc:
|
|
64
|
+
WINDOWS = [MSWIN, MSWIN64, UNIVERSAL_MINGW].freeze # :nodoc:
|
|
65
|
+
X64_LINUX = Gem::Platform.new("x86_64-linux") # :nodoc:
|
|
66
|
+
X64_LINUX_MUSL = Gem::Platform.new("x86_64-linux-musl") # :nodoc:
|
|
67
|
+
|
|
68
|
+
GENERICS = [JAVA, *WINDOWS].freeze # :nodoc:
|
|
69
|
+
private_constant :GENERICS
|
|
70
|
+
|
|
71
|
+
GENERIC_CACHE = GENERICS.each_with_object({}) {|g, h| h[g] = g } # :nodoc:
|
|
72
|
+
private_constant :GENERIC_CACHE
|
|
73
|
+
|
|
74
|
+
class << self
|
|
75
|
+
##
|
|
76
|
+
# Returns the generic platform for the given platform.
|
|
77
|
+
|
|
78
|
+
def generic(platform)
|
|
79
|
+
return Gem::Platform::RUBY if platform.nil? || platform == Gem::Platform::RUBY
|
|
80
|
+
|
|
81
|
+
GENERIC_CACHE[platform] ||= begin
|
|
82
|
+
found = GENERICS.find do |match|
|
|
83
|
+
platform === match
|
|
84
|
+
end
|
|
85
|
+
found || Gem::Platform::RUBY
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
##
|
|
90
|
+
# Returns the platform specificity match for the given spec platform and user platform.
|
|
91
|
+
|
|
92
|
+
def platform_specificity_match(spec_platform, user_platform)
|
|
93
|
+
return -1 if spec_platform == user_platform
|
|
94
|
+
return 1_000_000 if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY
|
|
95
|
+
|
|
96
|
+
os_match(spec_platform, user_platform) +
|
|
97
|
+
cpu_match(spec_platform, user_platform) * 10 +
|
|
98
|
+
version_match(spec_platform, user_platform) * 100
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
##
|
|
102
|
+
# Sorts and filters the best platform match for the given matching specs and platform.
|
|
103
|
+
|
|
104
|
+
def sort_and_filter_best_platform_match(matching, platform)
|
|
105
|
+
return matching if matching.one?
|
|
106
|
+
|
|
107
|
+
exact = matching.select {|spec| spec.platform == platform }
|
|
108
|
+
return exact if exact.any?
|
|
109
|
+
|
|
110
|
+
sorted_matching = sort_best_platform_match(matching, platform)
|
|
111
|
+
exemplary_spec = sorted_matching.first
|
|
112
|
+
|
|
113
|
+
sorted_matching.take_while {|spec| same_specificity?(platform, spec, exemplary_spec) && same_deps?(spec, exemplary_spec) }
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
##
|
|
117
|
+
# Sorts the best platform match for the given matching specs and platform.
|
|
118
|
+
|
|
119
|
+
def sort_best_platform_match(matching, platform)
|
|
120
|
+
matching.sort_by.with_index do |spec, i|
|
|
121
|
+
[
|
|
122
|
+
platform_specificity_match(spec.platform, platform),
|
|
123
|
+
i, # for stable sort
|
|
124
|
+
]
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
|
|
130
|
+
def same_specificity?(platform, spec, exemplary_spec)
|
|
131
|
+
platform_specificity_match(spec.platform, platform) == platform_specificity_match(exemplary_spec.platform, platform)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def same_deps?(spec, exemplary_spec)
|
|
135
|
+
spec.required_ruby_version == exemplary_spec.required_ruby_version &&
|
|
136
|
+
spec.required_rubygems_version == exemplary_spec.required_rubygems_version &&
|
|
137
|
+
spec.dependencies.sort == exemplary_spec.dependencies.sort
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def os_match(spec_platform, user_platform)
|
|
141
|
+
if spec_platform.os == user_platform.os
|
|
142
|
+
0
|
|
143
|
+
else
|
|
144
|
+
1
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def cpu_match(spec_platform, user_platform)
|
|
149
|
+
if spec_platform.cpu == user_platform.cpu
|
|
150
|
+
0
|
|
151
|
+
elsif spec_platform.cpu == "arm" && user_platform.cpu.to_s.start_with?("arm")
|
|
152
|
+
0
|
|
153
|
+
elsif spec_platform.cpu.nil? || spec_platform.cpu == "universal"
|
|
154
|
+
1
|
|
155
|
+
else
|
|
156
|
+
2
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def version_match(spec_platform, user_platform)
|
|
161
|
+
if spec_platform.version == user_platform.version
|
|
162
|
+
0
|
|
163
|
+
elsif spec_platform.version.nil?
|
|
164
|
+
1
|
|
165
|
+
else
|
|
166
|
+
2
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
require "rubygems/specification"
|
|
175
|
+
|
|
176
|
+
# Can be removed once RubyGems 3.5.14 support is dropped
|
|
177
|
+
VALIDATES_FOR_RESOLUTION = Specification.new.respond_to?(:validate_for_resolution).freeze
|
|
178
|
+
|
|
179
|
+
class Specification
|
|
180
|
+
# Can be removed once RubyGems 3.5.15 support is dropped
|
|
181
|
+
correct_array_attributes = @@default_value.select {|_k,v| v.is_a?(Array) }.keys
|
|
182
|
+
unless @@array_attributes == correct_array_attributes
|
|
183
|
+
@@array_attributes = correct_array_attributes # rubocop:disable Style/ClassVars
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
require_relative "match_metadata"
|
|
187
|
+
require_relative "match_platform"
|
|
188
|
+
|
|
189
|
+
include ::Bundler::MatchMetadata
|
|
190
|
+
|
|
191
|
+
attr_accessor :remote, :relative_loaded_from
|
|
192
|
+
|
|
193
|
+
module AllowSettingSource
|
|
194
|
+
attr_writer :source
|
|
195
|
+
|
|
196
|
+
def source
|
|
197
|
+
(defined?(@source) && @source) || super
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
prepend AllowSettingSource
|
|
202
|
+
|
|
203
|
+
alias_method :rg_full_gem_path, :full_gem_path
|
|
204
|
+
alias_method :rg_loaded_from, :loaded_from
|
|
205
|
+
|
|
206
|
+
def full_gem_path
|
|
207
|
+
if source.respond_to?(:root)
|
|
208
|
+
File.expand_path(File.dirname(loaded_from), source.root)
|
|
209
|
+
else
|
|
210
|
+
rg_full_gem_path
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def loaded_from
|
|
215
|
+
if relative_loaded_from
|
|
216
|
+
source.path.join(relative_loaded_from).to_s
|
|
217
|
+
else
|
|
218
|
+
rg_loaded_from
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def load_paths
|
|
223
|
+
full_require_paths
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
alias_method :rg_extension_dir, :extension_dir
|
|
227
|
+
def extension_dir
|
|
228
|
+
# following instance variable is already used in original method
|
|
229
|
+
# and that is the reason to prefix it with bundler_ and add rubocop exception
|
|
230
|
+
@bundler_extension_dir ||= if source.respond_to?(:extension_dir_name) # rubocop:disable Naming/MemoizedInstanceVariableName
|
|
231
|
+
unique_extension_dir = [source.extension_dir_name, File.basename(full_gem_path)].uniq.join("-")
|
|
232
|
+
File.expand_path(File.join(extensions_dir, unique_extension_dir))
|
|
233
|
+
else
|
|
234
|
+
rg_extension_dir
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# Can be removed once RubyGems 3.5.21 support is dropped
|
|
239
|
+
remove_method :gem_dir if method_defined?(:gem_dir, false)
|
|
240
|
+
|
|
241
|
+
def gem_dir
|
|
242
|
+
full_gem_path
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def insecurely_materialized?
|
|
246
|
+
false
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def groups
|
|
250
|
+
@groups ||= []
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def git_version
|
|
254
|
+
return unless loaded_from && source.is_a?(Bundler::Source::Git)
|
|
255
|
+
" #{source.revision[0..6]}"
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def to_gemfile(path = nil)
|
|
259
|
+
gemfile = String.new("source 'https://rubygems.org'\n")
|
|
260
|
+
gemfile << dependencies_to_gemfile(nondevelopment_dependencies)
|
|
261
|
+
unless development_dependencies.empty?
|
|
262
|
+
gemfile << "\n"
|
|
263
|
+
gemfile << dependencies_to_gemfile(development_dependencies, :development)
|
|
264
|
+
end
|
|
265
|
+
gemfile
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def nondevelopment_dependencies
|
|
269
|
+
dependencies - development_dependencies
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def installation_missing?
|
|
273
|
+
!default_gem? && !File.directory?(full_gem_path)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def lock_name
|
|
277
|
+
@lock_name ||= name_tuple.lock_name
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
unless VALIDATES_FOR_RESOLUTION
|
|
281
|
+
def validate_for_resolution
|
|
282
|
+
SpecificationPolicy.new(self).validate_for_resolution
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
if Gem.rubygems_version < Gem::Version.new("3.5.22")
|
|
287
|
+
module FixPathSourceMissingExtensions
|
|
288
|
+
def missing_extensions?
|
|
289
|
+
return false if %w[Bundler::Source::Path Bundler::Source::Gemspec].include?(source.class.name)
|
|
290
|
+
|
|
291
|
+
super
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
prepend FixPathSourceMissingExtensions
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
private
|
|
299
|
+
|
|
300
|
+
def dependencies_to_gemfile(dependencies, group = nil)
|
|
301
|
+
gemfile = String.new
|
|
302
|
+
if dependencies.any?
|
|
303
|
+
gemfile << "group :#{group} do\n" if group
|
|
304
|
+
dependencies.each do |dependency|
|
|
305
|
+
gemfile << " " if group
|
|
306
|
+
gemfile << %(gem "#{dependency.name}")
|
|
307
|
+
req = dependency.requirements_list.first
|
|
308
|
+
gemfile << %(, "#{req}") if req
|
|
309
|
+
gemfile << "\n"
|
|
310
|
+
end
|
|
311
|
+
gemfile << "end\n" if group
|
|
312
|
+
end
|
|
313
|
+
gemfile
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
unless VALIDATES_FOR_RESOLUTION
|
|
318
|
+
class SpecificationPolicy
|
|
319
|
+
def validate_for_resolution
|
|
320
|
+
validate_required!
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
module BetterPermissionError
|
|
326
|
+
def data
|
|
327
|
+
super
|
|
328
|
+
rescue Errno::EACCES
|
|
329
|
+
raise Bundler::PermissionError.new(loaded_from, :read)
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
require "rubygems/stub_specification"
|
|
334
|
+
|
|
335
|
+
class StubSpecification
|
|
336
|
+
prepend BetterPermissionError
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
class Dependency
|
|
340
|
+
require_relative "force_platform"
|
|
341
|
+
|
|
342
|
+
include ::Bundler::ForcePlatform
|
|
343
|
+
|
|
344
|
+
attr_reader :force_ruby_platform
|
|
345
|
+
|
|
346
|
+
attr_accessor :source, :groups
|
|
347
|
+
|
|
348
|
+
alias_method :eql?, :==
|
|
349
|
+
|
|
350
|
+
unless method_defined?(:encode_with, false)
|
|
351
|
+
def encode_with(coder)
|
|
352
|
+
[:@name, :@requirement, :@type, :@prerelease, :@version_requirements].each do |ivar|
|
|
353
|
+
coder[ivar.to_s.sub(/^@/, "")] = instance_variable_get(ivar)
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def to_lock
|
|
359
|
+
out = String.new(" #{name}")
|
|
360
|
+
unless requirement.none?
|
|
361
|
+
reqs = requirement.requirements.map {|o, v| "#{o} #{v}" }.sort.reverse
|
|
362
|
+
out << " (#{reqs.join(", ")})"
|
|
363
|
+
end
|
|
364
|
+
out
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
if Gem.rubygems_version < Gem::Version.new("3.5.22")
|
|
368
|
+
module FilterIgnoredSpecs
|
|
369
|
+
def matching_specs(platform_only = false)
|
|
370
|
+
super.reject(&:ignored?)
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
prepend FilterIgnoredSpecs
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
# On universal Rubies, resolve the "universal" arch to the real CPU arch, without changing the extension directory.
|
|
379
|
+
class BasicSpecification
|
|
380
|
+
if /^universal\.(?<arch>.*?)-/ =~ (CROSS_COMPILING || RUBY_PLATFORM)
|
|
381
|
+
local_platform = Platform.local
|
|
382
|
+
if local_platform.cpu == "universal"
|
|
383
|
+
ORIGINAL_LOCAL_PLATFORM = local_platform.to_s.freeze
|
|
384
|
+
|
|
385
|
+
local_platform.cpu = if arch == "arm64e" # arm64e is only permitted for Apple system binaries
|
|
386
|
+
"arm64"
|
|
387
|
+
else
|
|
388
|
+
arch
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
def extensions_dir
|
|
392
|
+
@extensions_dir ||=
|
|
393
|
+
Gem.default_ext_dir_for(base_dir) || File.join(base_dir, "extensions", ORIGINAL_LOCAL_PLATFORM, Gem.extension_api_version)
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
# Can be removed once RubyGems 3.5.22 support is dropped
|
|
399
|
+
unless new.respond_to?(:ignored?)
|
|
400
|
+
def ignored?
|
|
401
|
+
return @ignored unless @ignored.nil?
|
|
402
|
+
|
|
403
|
+
@ignored = missing_extensions?
|
|
404
|
+
end
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
# Can be removed once RubyGems 3.6.9 support is dropped
|
|
408
|
+
unless new.respond_to?(:installable_on_platform?)
|
|
409
|
+
include(::Bundler::MatchPlatform)
|
|
410
|
+
end
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
require "rubygems/name_tuple"
|
|
414
|
+
|
|
415
|
+
class NameTuple
|
|
416
|
+
# Versions of RubyGems before about 3.5.0 don't to_s the platform.
|
|
417
|
+
unless Gem::NameTuple.new("a", Gem::Version.new("1"), Gem::Platform.new("x86_64-linux")).platform.is_a?(String)
|
|
418
|
+
alias_method :initialize_with_platform, :initialize
|
|
419
|
+
|
|
420
|
+
def initialize(name, version, platform = Gem::Platform::RUBY)
|
|
421
|
+
if Gem::Platform === platform
|
|
422
|
+
initialize_with_platform(name, version, platform.to_s)
|
|
423
|
+
else
|
|
424
|
+
initialize_with_platform(name, version, platform)
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
def lock_name
|
|
430
|
+
if platform == Gem::Platform::RUBY
|
|
431
|
+
"#{name} (#{version})"
|
|
432
|
+
else
|
|
433
|
+
"#{name} (#{version}-#{platform})"
|
|
434
|
+
end
|
|
435
|
+
end
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
unless Gem.rubygems_version >= Gem::Version.new("3.5.19")
|
|
439
|
+
class Resolver::ActivationRequest
|
|
440
|
+
remove_method :installed?
|
|
441
|
+
|
|
442
|
+
def installed?
|
|
443
|
+
case @spec
|
|
444
|
+
when Gem::Resolver::VendorSpecification then
|
|
445
|
+
true
|
|
446
|
+
else
|
|
447
|
+
this_spec = full_spec
|
|
448
|
+
|
|
449
|
+
Gem::Specification.any? do |s|
|
|
450
|
+
s == this_spec && s.base_dir == this_spec.base_dir
|
|
451
|
+
end
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
unless Gem.rubygems_version >= Gem::Version.new("3.6.7")
|
|
458
|
+
module UnfreezeCompactIndexParsedResponse
|
|
459
|
+
def parse(line)
|
|
460
|
+
version, platform, dependencies, requirements = super
|
|
461
|
+
[version, platform, dependencies.frozen? ? dependencies.dup : dependencies, requirements.frozen? ? requirements.dup : requirements]
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
Resolver::APISet::GemParser.prepend(UnfreezeCompactIndexParsedResponse)
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
# RubyGems before 4.0.13 split compact index dependency/requirement entries
|
|
469
|
+
# on every colon, which mangles metadata values that contain colons such as
|
|
470
|
+
# the `created_at` timestamps the cooldown feature relies on. Split only on
|
|
471
|
+
# the first colon so those values survive on older RubyGems.
|
|
472
|
+
#
|
|
473
|
+
# The module is defined unconditionally so it stays testable on any RubyGems,
|
|
474
|
+
# but only prepended when the host RubyGems still has the buggy behavior.
|
|
475
|
+
module SplitCompactIndexEntryOnFirstColon
|
|
476
|
+
private
|
|
477
|
+
|
|
478
|
+
def parse_dependency(string)
|
|
479
|
+
dependency = string.split(":", 2)
|
|
480
|
+
dependency[-1] = dependency[-1].split("&") if dependency.size > 1
|
|
481
|
+
dependency[0] = -dependency[0]
|
|
482
|
+
dependency
|
|
483
|
+
end
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
unless Gem.rubygems_version >= Gem::Version.new("4.0.13")
|
|
487
|
+
Resolver::APISet::GemParser.prepend(SplitCompactIndexEntryOnFirstColon)
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
if Gem.rubygems_version < Gem::Version.new("3.6.0")
|
|
491
|
+
class Package; end
|
|
492
|
+
require "rubygems/package/tar_reader"
|
|
493
|
+
require "rubygems/package/tar_reader/entry"
|
|
494
|
+
|
|
495
|
+
module FixFullNameEncoding
|
|
496
|
+
def full_name
|
|
497
|
+
super.force_encoding(Encoding::UTF_8)
|
|
498
|
+
end
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
Package::TarReader::Entry.prepend(FixFullNameEncoding)
|
|
502
|
+
end
|
|
503
|
+
end
|