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,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class CLI::Cache
|
|
5
|
+
attr_reader :options
|
|
6
|
+
|
|
7
|
+
def initialize(options)
|
|
8
|
+
@options = options
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
Bundler.ui.level = "warn" if options[:quiet]
|
|
13
|
+
Bundler.settings.set_command_option_if_given :cache_path, options["cache-path"]
|
|
14
|
+
|
|
15
|
+
install
|
|
16
|
+
|
|
17
|
+
Bundler.settings.temporary(cache_all_platforms: options["all-platforms"]) do
|
|
18
|
+
Bundler.load.cache
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def install
|
|
25
|
+
require_relative "install"
|
|
26
|
+
options = self.options.dup
|
|
27
|
+
options["local"] = false if Bundler.settings[:cache_all_platforms]
|
|
28
|
+
options["no-cache"] = true
|
|
29
|
+
Bundler::CLI::Install.new(options).run
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class CLI::Check
|
|
5
|
+
attr_reader :options
|
|
6
|
+
|
|
7
|
+
def initialize(options)
|
|
8
|
+
@options = options
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
Bundler.settings.set_command_option_if_given :path, options[:path]
|
|
13
|
+
|
|
14
|
+
definition = Bundler.definition
|
|
15
|
+
definition.validate_runtime!
|
|
16
|
+
|
|
17
|
+
begin
|
|
18
|
+
definition.check!
|
|
19
|
+
not_installed = definition.missing_specs
|
|
20
|
+
rescue GemNotFound, GitError, SolveFailure
|
|
21
|
+
Bundler.ui.error "Bundler can't satisfy your Gemfile's dependencies."
|
|
22
|
+
Bundler.ui.warn "Install missing gems with `bundle install`."
|
|
23
|
+
exit 1
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
if not_installed.any?
|
|
27
|
+
Bundler.ui.error "The following gems are missing"
|
|
28
|
+
not_installed.each {|s| Bundler.ui.error " * #{s.name} (#{s.version})" }
|
|
29
|
+
Bundler.ui.warn "Install missing gems with `bundle install`"
|
|
30
|
+
exit 1
|
|
31
|
+
elsif !Bundler.default_lockfile.file? && Bundler.frozen_bundle?
|
|
32
|
+
Bundler.ui.error "This bundle has been frozen, but there is no #{SharedHelpers.relative_lockfile_path} present"
|
|
33
|
+
exit 1
|
|
34
|
+
else
|
|
35
|
+
definition.lock(true) unless options[:"dry-run"]
|
|
36
|
+
Bundler.ui.info "The Gemfile's dependencies are satisfied"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class CLI::Clean
|
|
5
|
+
attr_reader :options
|
|
6
|
+
|
|
7
|
+
def initialize(options)
|
|
8
|
+
@options = options
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
require_path_or_force unless options[:"dry-run"]
|
|
13
|
+
Bundler.load.clean(options[:"dry-run"])
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
protected
|
|
17
|
+
|
|
18
|
+
def require_path_or_force
|
|
19
|
+
return unless Bundler.use_system_gems? && !options[:force]
|
|
20
|
+
raise InvalidOption, "Cleaning all the gems on your system is dangerous! " \
|
|
21
|
+
"If you're sure you want to remove every system gem not in this " \
|
|
22
|
+
"bundle, run `bundle clean --force`."
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module CLI::Common
|
|
5
|
+
def self.validate_cooldown!(value)
|
|
6
|
+
return if value.nil?
|
|
7
|
+
return if value.is_a?(Integer) && value >= 0
|
|
8
|
+
raise InvalidOption, "Expected `--cooldown` to be a non-negative integer, got #{value.inspect}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.output_post_install_messages(messages)
|
|
12
|
+
return if Bundler.settings["ignore_messages"]
|
|
13
|
+
messages.to_a.each do |name, msg|
|
|
14
|
+
print_post_install_message(name, msg) unless Bundler.settings["ignore_messages.#{name}"]
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.print_post_install_message(name, msg)
|
|
19
|
+
Bundler.ui.confirm "Post-install message from #{name}:"
|
|
20
|
+
Bundler.ui.info msg
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.output_fund_metadata_summary
|
|
24
|
+
return if Bundler.settings["ignore_funding_requests"]
|
|
25
|
+
definition = Bundler.definition
|
|
26
|
+
current_dependencies = definition.requested_dependencies
|
|
27
|
+
current_specs = definition.specs
|
|
28
|
+
|
|
29
|
+
count = current_dependencies.count {|dep| current_specs[dep.name].first.metadata.key?("funding_uri") }
|
|
30
|
+
|
|
31
|
+
return if count.zero?
|
|
32
|
+
|
|
33
|
+
intro = count > 1 ? "#{count} installed gems you directly depend on are" : "#{count} installed gem you directly depend on is"
|
|
34
|
+
message = "#{intro} looking for funding.\n Run `bundle fund` for details"
|
|
35
|
+
Bundler.ui.info message
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.output_without_groups_message(command)
|
|
39
|
+
return if Bundler.settings[:without].empty?
|
|
40
|
+
Bundler.ui.confirm without_groups_message(command)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.without_groups_message(command)
|
|
44
|
+
command_in_past_tense = command == :install ? "installed" : "updated"
|
|
45
|
+
groups = Bundler.settings[:without]
|
|
46
|
+
"Gems in the #{verbalize_groups(groups)} were not #{command_in_past_tense}."
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.verbalize_groups(groups)
|
|
50
|
+
groups.map! {|g| "'#{g}'" }
|
|
51
|
+
group_list = [groups[0...-1].join(", "), groups[-1..-1]].
|
|
52
|
+
reject {|s| s.to_s.empty? }.join(" and ")
|
|
53
|
+
group_str = groups.size == 1 ? "group" : "groups"
|
|
54
|
+
"#{group_str} #{group_list}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.select_spec(name, regex_match = nil)
|
|
58
|
+
specs = []
|
|
59
|
+
regexp = Regexp.new(name) if regex_match
|
|
60
|
+
|
|
61
|
+
Bundler.definition.specs.each do |spec|
|
|
62
|
+
return spec if spec.name == name
|
|
63
|
+
specs << spec if regexp && spec.name.match?(regexp)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
default_spec = default_gem_spec(name)
|
|
67
|
+
specs << default_spec if default_spec
|
|
68
|
+
|
|
69
|
+
case specs.count
|
|
70
|
+
when 0
|
|
71
|
+
dep_in_other_group = Bundler.definition.current_dependencies.find {|dep|dep.name == name }
|
|
72
|
+
|
|
73
|
+
if dep_in_other_group
|
|
74
|
+
raise GemNotFound, "Could not find gem '#{name}', because it's in the #{verbalize_groups(dep_in_other_group.groups)}, configured to be ignored."
|
|
75
|
+
else
|
|
76
|
+
raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
|
|
77
|
+
end
|
|
78
|
+
when 1
|
|
79
|
+
specs.first
|
|
80
|
+
else
|
|
81
|
+
ask_for_spec_from(specs)
|
|
82
|
+
end
|
|
83
|
+
rescue RegexpError
|
|
84
|
+
raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def self.default_gem_spec(name)
|
|
88
|
+
gem_spec = Gem::Specification.find_all_by_name(name).last
|
|
89
|
+
gem_spec if gem_spec&.default_gem?
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def self.ask_for_spec_from(specs)
|
|
93
|
+
specs.each_with_index do |spec, index|
|
|
94
|
+
Bundler.ui.info "#{index.succ} : #{spec.name}", true
|
|
95
|
+
end
|
|
96
|
+
Bundler.ui.info "0 : - exit -", true
|
|
97
|
+
|
|
98
|
+
num = Bundler.ui.ask("> ").to_i
|
|
99
|
+
num > 0 ? specs[num - 1] : nil
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def self.gem_not_found_message(missing_gem_name, alternatives)
|
|
103
|
+
message = "Could not find gem '#{missing_gem_name}'."
|
|
104
|
+
alternate_names = alternatives.map {|a| a.respond_to?(:name) ? a.name : a }
|
|
105
|
+
if alternate_names.include?(missing_gem_name.downcase)
|
|
106
|
+
message += "\nDid you mean '#{missing_gem_name.downcase}'?"
|
|
107
|
+
elsif defined?(DidYouMean::SpellChecker)
|
|
108
|
+
suggestions = DidYouMean::SpellChecker.new(dictionary: alternate_names).correct(missing_gem_name)
|
|
109
|
+
message += "\nDid you mean #{word_list(suggestions)}?" unless suggestions.empty?
|
|
110
|
+
end
|
|
111
|
+
message
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def self.ensure_all_gems_in_lockfile!(names, locked_gems = Bundler.locked_gems)
|
|
115
|
+
return unless locked_gems
|
|
116
|
+
|
|
117
|
+
locked_names = locked_gems.specs.map(&:name).uniq
|
|
118
|
+
names.-(locked_names).each do |g|
|
|
119
|
+
raise GemNotFound, gem_not_found_message(g, locked_names)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def self.configure_gem_version_promoter(definition, options)
|
|
124
|
+
patch_level = patch_level_options(options)
|
|
125
|
+
patch_level << :patch if patch_level.empty? && Bundler.settings[:prefer_patch]
|
|
126
|
+
raise InvalidOption, "Provide only one of the following options: #{patch_level.join(", ")}" unless patch_level.length <= 1
|
|
127
|
+
|
|
128
|
+
definition.gem_version_promoter.tap do |gvp|
|
|
129
|
+
gvp.level = patch_level.first || :major
|
|
130
|
+
gvp.strict = options[:strict] || options["filter-strict"]
|
|
131
|
+
gvp.pre = options[:pre]
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def self.patch_level_options(options)
|
|
136
|
+
[:major, :minor, :patch].select {|v| options.keys.include?(v.to_s) }
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def self.clean_after_install?
|
|
140
|
+
clean = Bundler.settings[:clean]
|
|
141
|
+
return clean unless clean.nil?
|
|
142
|
+
clean ||= Bundler.feature_flag.bundler_5_mode? && Bundler.settings[:path].nil?
|
|
143
|
+
clean &&= !Bundler.use_system_gems?
|
|
144
|
+
clean
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def self.word_list(words)
|
|
148
|
+
if words.empty?
|
|
149
|
+
return ""
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
words = words.map {|word| "'#{word}'" }
|
|
153
|
+
|
|
154
|
+
if words.length == 1
|
|
155
|
+
return words[0]
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
[words[0..-2].join(", "), words[-1]].join(" or ")
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class CLI::Config < Thor
|
|
5
|
+
class_option :parseable, type: :boolean, banner: "Use minimal formatting for more parseable output"
|
|
6
|
+
|
|
7
|
+
def self.scope_options
|
|
8
|
+
method_option :global, type: :boolean, banner: "Only change the global config"
|
|
9
|
+
method_option :local, type: :boolean, banner: "Only change the local config"
|
|
10
|
+
end
|
|
11
|
+
private_class_method :scope_options
|
|
12
|
+
|
|
13
|
+
desc "base NAME [VALUE]", "The Bundler 1 config interface", hide: true
|
|
14
|
+
scope_options
|
|
15
|
+
method_option :delete, type: :boolean, banner: "delete"
|
|
16
|
+
def base(name = nil, *value)
|
|
17
|
+
new_args =
|
|
18
|
+
if ARGV.size == 1
|
|
19
|
+
["config", "list"]
|
|
20
|
+
elsif ARGV.include?("--delete")
|
|
21
|
+
ARGV.map {|arg| arg == "--delete" ? "unset" : arg }
|
|
22
|
+
elsif ARGV.include?("--global") || ARGV.include?("--local") || ARGV.size == 3
|
|
23
|
+
["config", "set", *ARGV[1..-1]]
|
|
24
|
+
else
|
|
25
|
+
["config", "get", ARGV[1]]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
message = "Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle #{new_args.join(" ")}` instead."
|
|
29
|
+
SharedHelpers.feature_deprecated! message
|
|
30
|
+
|
|
31
|
+
Base.new(options, name, value, self).run
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
desc "list", "List out all configured settings"
|
|
35
|
+
def list
|
|
36
|
+
Base.new(options, nil, nil, self).run
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
desc "get NAME", "Returns the value for the given key"
|
|
40
|
+
def get(name)
|
|
41
|
+
Base.new(options, name, nil, self).run
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
desc "set NAME VALUE", "Sets the given value for the given key"
|
|
45
|
+
scope_options
|
|
46
|
+
def set(name, value, *value_)
|
|
47
|
+
Base.new(options, name, value_.unshift(value), self).run
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
desc "unset NAME", "Unsets the value for the given key"
|
|
51
|
+
scope_options
|
|
52
|
+
def unset(name)
|
|
53
|
+
options[:delete] = true
|
|
54
|
+
Base.new(options, name, nil, self).run
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
default_task :base
|
|
58
|
+
|
|
59
|
+
class Base
|
|
60
|
+
attr_reader :name, :value, :options, :scope, :thor
|
|
61
|
+
|
|
62
|
+
def initialize(options, name, value, thor)
|
|
63
|
+
@options = options
|
|
64
|
+
@name = name
|
|
65
|
+
value = Array(value)
|
|
66
|
+
@value = value.empty? ? nil : value.join(" ")
|
|
67
|
+
@thor = thor
|
|
68
|
+
validate_scope!
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def run
|
|
72
|
+
unless name
|
|
73
|
+
warn_unused_scope "Ignoring --#{scope}"
|
|
74
|
+
confirm_all
|
|
75
|
+
return
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
if options[:delete]
|
|
79
|
+
if !explicit_scope? || scope != "global"
|
|
80
|
+
Bundler.settings.set_local(name, nil)
|
|
81
|
+
end
|
|
82
|
+
if !explicit_scope? || scope != "local"
|
|
83
|
+
Bundler.settings.set_global(name, nil)
|
|
84
|
+
end
|
|
85
|
+
return
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
if value.nil?
|
|
89
|
+
warn_unused_scope "Ignoring --#{scope} since no value to set was given"
|
|
90
|
+
current_value = Bundler.settings[name]
|
|
91
|
+
|
|
92
|
+
if options[:parseable]
|
|
93
|
+
if value = Bundler.settings[name]
|
|
94
|
+
Bundler.ui.info("#{name}=#{value}")
|
|
95
|
+
end
|
|
96
|
+
else
|
|
97
|
+
confirm(name)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if current_value.nil?
|
|
101
|
+
exit 1
|
|
102
|
+
else
|
|
103
|
+
return
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
Bundler.ui.info(message) if message
|
|
108
|
+
Bundler.settings.send("set_#{scope}", name, new_value)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def confirm_all
|
|
112
|
+
if @options[:parseable]
|
|
113
|
+
thor.with_padding do
|
|
114
|
+
Bundler.settings.all.each do |setting|
|
|
115
|
+
val = Bundler.settings[setting]
|
|
116
|
+
Bundler.ui.info "#{setting}=#{val}"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
else
|
|
120
|
+
Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n"
|
|
121
|
+
Bundler.settings.all.each do |setting|
|
|
122
|
+
Bundler.ui.confirm setting
|
|
123
|
+
show_pretty_values_for(setting)
|
|
124
|
+
Bundler.ui.confirm ""
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def confirm(name)
|
|
130
|
+
Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used"
|
|
131
|
+
show_pretty_values_for(name)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def new_value
|
|
135
|
+
pathname = Pathname.new(value)
|
|
136
|
+
if name.start_with?("local.") && pathname.directory?
|
|
137
|
+
pathname.expand_path.to_s
|
|
138
|
+
else
|
|
139
|
+
value
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def message
|
|
144
|
+
locations = Bundler.settings.locations(name)
|
|
145
|
+
if @options[:parseable]
|
|
146
|
+
"#{name}=#{new_value}" if new_value
|
|
147
|
+
elsif scope == "global"
|
|
148
|
+
if !locations[:local].nil?
|
|
149
|
+
"Your application has set #{name} to #{locations[:local].inspect}. " \
|
|
150
|
+
"This will override the global value you are currently setting"
|
|
151
|
+
elsif locations[:env]
|
|
152
|
+
"You have a bundler environment variable for #{name} set to " \
|
|
153
|
+
"#{locations[:env].inspect}. This will take precedence over the global value you are setting"
|
|
154
|
+
elsif !locations[:global].nil? && locations[:global] != value
|
|
155
|
+
"You are replacing the current global value of #{name}, which is currently " \
|
|
156
|
+
"#{locations[:global].inspect}"
|
|
157
|
+
end
|
|
158
|
+
elsif scope == "local" && !locations[:local].nil? && locations[:local] != value
|
|
159
|
+
"You are replacing the current local value of #{name}, which is currently " \
|
|
160
|
+
"#{locations[:local].inspect}"
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def show_pretty_values_for(setting)
|
|
165
|
+
thor.with_padding do
|
|
166
|
+
Bundler.settings.pretty_values_for(setting).each do |line|
|
|
167
|
+
Bundler.ui.info line
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def explicit_scope?
|
|
173
|
+
@explicit_scope
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def warn_unused_scope(msg)
|
|
177
|
+
return unless explicit_scope?
|
|
178
|
+
return if options[:parseable]
|
|
179
|
+
|
|
180
|
+
Bundler.ui.warn(msg)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def validate_scope!
|
|
184
|
+
@explicit_scope = true
|
|
185
|
+
scopes = %w[global local].select {|s| options[s] }
|
|
186
|
+
case scopes.size
|
|
187
|
+
when 0
|
|
188
|
+
@scope = inside_app? ? "local" : "global"
|
|
189
|
+
@explicit_scope = false
|
|
190
|
+
when 1
|
|
191
|
+
@scope = scopes.first
|
|
192
|
+
else
|
|
193
|
+
raise InvalidOption,
|
|
194
|
+
"The options #{scopes.join " and "} were specified. Please only use one of the switches at a time."
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
private
|
|
199
|
+
|
|
200
|
+
def inside_app?
|
|
201
|
+
Bundler.root
|
|
202
|
+
true
|
|
203
|
+
rescue GemfileNotFound
|
|
204
|
+
false
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
class CLI::Console
|
|
5
|
+
attr_reader :options, :group
|
|
6
|
+
def initialize(options, group)
|
|
7
|
+
@options = options
|
|
8
|
+
@group = group
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
group ? Bundler.require(:default, *group.split(" ").map!(&:to_sym)) : Bundler.require
|
|
13
|
+
ARGV.clear
|
|
14
|
+
|
|
15
|
+
console = get_console(Bundler.settings[:console] || "irb")
|
|
16
|
+
console.start
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def get_console(name)
|
|
20
|
+
require name
|
|
21
|
+
get_constant(name)
|
|
22
|
+
rescue LoadError
|
|
23
|
+
if name == "irb"
|
|
24
|
+
if defined?(Gem::BUNDLED_GEMS) && Gem::BUNDLED_GEMS.respond_to?(:force_activate)
|
|
25
|
+
Gem::BUNDLED_GEMS.force_activate "irb"
|
|
26
|
+
require name
|
|
27
|
+
return get_constant(name)
|
|
28
|
+
end
|
|
29
|
+
Bundler.ui.error "#{name} is not available"
|
|
30
|
+
exit 1
|
|
31
|
+
else
|
|
32
|
+
Bundler.ui.error "Couldn't load console #{name}, falling back to irb"
|
|
33
|
+
name = "irb"
|
|
34
|
+
retry
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def get_constant(name)
|
|
39
|
+
const_name = {
|
|
40
|
+
"pry" => :Pry,
|
|
41
|
+
"ripl" => :Ripl,
|
|
42
|
+
"irb" => :IRB,
|
|
43
|
+
}[name]
|
|
44
|
+
Object.const_get(const_name)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rbconfig"
|
|
4
|
+
require "shellwords"
|
|
5
|
+
|
|
6
|
+
module Bundler
|
|
7
|
+
class CLI::Doctor::Diagnose
|
|
8
|
+
DARWIN_REGEX = /\s+(.+) \(compatibility /
|
|
9
|
+
LDD_REGEX = /\t\S+ => (\S+) \(\S+\)/
|
|
10
|
+
|
|
11
|
+
attr_reader :options
|
|
12
|
+
|
|
13
|
+
def initialize(options)
|
|
14
|
+
@options = options
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def otool_available?
|
|
18
|
+
Bundler.which("otool")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def ldd_available?
|
|
22
|
+
Bundler.which("ldd")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def dylibs_darwin(path)
|
|
26
|
+
output = `/usr/bin/otool -L #{path.shellescape}`.chomp
|
|
27
|
+
dylibs = output.split("\n")[1..-1].filter_map {|l| l.match(DARWIN_REGEX)&.match(1) }.uniq
|
|
28
|
+
# ignore @rpath and friends
|
|
29
|
+
dylibs.reject {|dylib| dylib.start_with? "@" }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def dylibs_ldd(path)
|
|
33
|
+
output = `/usr/bin/ldd #{path.shellescape}`.chomp
|
|
34
|
+
output.split("\n").filter_map do |l|
|
|
35
|
+
match = l.match(LDD_REGEX)
|
|
36
|
+
next if match.nil?
|
|
37
|
+
match.captures[0]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def dylibs(path)
|
|
42
|
+
case RbConfig::CONFIG["host_os"]
|
|
43
|
+
when /darwin/
|
|
44
|
+
return [] unless otool_available?
|
|
45
|
+
dylibs_darwin(path)
|
|
46
|
+
when /(linux|solaris|bsd)/
|
|
47
|
+
return [] unless ldd_available?
|
|
48
|
+
dylibs_ldd(path)
|
|
49
|
+
else # Windows, etc.
|
|
50
|
+
Bundler.ui.warn("Dynamic library check not supported on this platform.")
|
|
51
|
+
[]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def bundles_for_gem(spec)
|
|
56
|
+
Dir.glob("#{spec.full_gem_path}/**/*.bundle")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def lookup_with_fiddle(path)
|
|
60
|
+
require "fiddle"
|
|
61
|
+
Fiddle.dlopen(path)
|
|
62
|
+
false
|
|
63
|
+
rescue Fiddle::DLError
|
|
64
|
+
true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def check!
|
|
68
|
+
require_relative "../check"
|
|
69
|
+
Bundler::CLI::Check.new({}).run
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def diagnose_ssl
|
|
73
|
+
require_relative "ssl"
|
|
74
|
+
Bundler::CLI::Doctor::SSL.new({}).run
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def run
|
|
78
|
+
Bundler.ui.level = "warn" if options[:quiet]
|
|
79
|
+
Bundler.settings.validate!
|
|
80
|
+
check!
|
|
81
|
+
diagnose_ssl if options[:ssl]
|
|
82
|
+
|
|
83
|
+
definition = Bundler.definition
|
|
84
|
+
broken_links = {}
|
|
85
|
+
|
|
86
|
+
definition.specs.each do |spec|
|
|
87
|
+
bundles_for_gem(spec).each do |bundle|
|
|
88
|
+
bad_paths = dylibs(bundle).select do |f|
|
|
89
|
+
lookup_with_fiddle(f)
|
|
90
|
+
end
|
|
91
|
+
if bad_paths.any?
|
|
92
|
+
broken_links[spec] ||= []
|
|
93
|
+
broken_links[spec].concat(bad_paths)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
permissions_valid = check_home_permissions
|
|
99
|
+
|
|
100
|
+
if broken_links.any?
|
|
101
|
+
message = "The following gems are missing OS dependencies:"
|
|
102
|
+
broken_links.flat_map do |spec, paths|
|
|
103
|
+
paths.uniq.map do |path|
|
|
104
|
+
"\n * #{spec.name}: #{path}"
|
|
105
|
+
end
|
|
106
|
+
end.sort.each {|m| message += m }
|
|
107
|
+
raise ProductionError, message
|
|
108
|
+
elsif permissions_valid
|
|
109
|
+
Bundler.ui.info "No issues found with the installed bundle"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
private
|
|
114
|
+
|
|
115
|
+
def check_home_permissions
|
|
116
|
+
require "find"
|
|
117
|
+
files_not_readable = []
|
|
118
|
+
files_not_readable_and_owned_by_different_user = []
|
|
119
|
+
files_not_owned_by_current_user_but_still_readable = []
|
|
120
|
+
broken_symlinks = []
|
|
121
|
+
Find.find(Bundler.bundle_path.to_s).each do |f|
|
|
122
|
+
if !File.exist?(f)
|
|
123
|
+
broken_symlinks << f
|
|
124
|
+
elsif !File.readable?(f)
|
|
125
|
+
if File.stat(f).uid != Process.uid
|
|
126
|
+
files_not_readable_and_owned_by_different_user << f
|
|
127
|
+
else
|
|
128
|
+
files_not_readable << f
|
|
129
|
+
end
|
|
130
|
+
elsif File.stat(f).uid != Process.uid
|
|
131
|
+
files_not_owned_by_current_user_but_still_readable << f
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
ok = true
|
|
136
|
+
|
|
137
|
+
if broken_symlinks.any?
|
|
138
|
+
Bundler.ui.warn "Broken links exist in the Bundler home. Please report them to the offending gem's upstream repo. These files are:\n - #{broken_symlinks.join("\n - ")}"
|
|
139
|
+
|
|
140
|
+
ok = false
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
if files_not_owned_by_current_user_but_still_readable.any?
|
|
144
|
+
Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
|
|
145
|
+
"user, but are still readable. These files are:\n - #{files_not_owned_by_current_user_but_still_readable.join("\n - ")}"
|
|
146
|
+
|
|
147
|
+
ok = false
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
if files_not_readable_and_owned_by_different_user.any?
|
|
151
|
+
Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
|
|
152
|
+
"user, and are not readable. These files are:\n - #{files_not_readable_and_owned_by_different_user.join("\n - ")}"
|
|
153
|
+
|
|
154
|
+
ok = false
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
if files_not_readable.any?
|
|
158
|
+
Bundler.ui.warn "Files exist in the Bundler home that are not " \
|
|
159
|
+
"readable by the current user. These files are:\n - #{files_not_readable.join("\n - ")}"
|
|
160
|
+
|
|
161
|
+
ok = false
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
ok
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|