bundler-clone 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,206 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rubygems/installer"
|
|
4
|
+
|
|
5
|
+
module Bundler
|
|
6
|
+
class RubyGemsGemInstaller < Gem::Installer
|
|
7
|
+
# Cap how many jobserver slots a single gem's `make` may grab so that one
|
|
8
|
+
# gem with many recipes doesn't starve the others sharing the pool. Beyond
|
|
9
|
+
# a handful of jobs the extra parallelism rarely pays off in practice.
|
|
10
|
+
MAX_JOBS_PER_GEM = 3
|
|
11
|
+
|
|
12
|
+
def check_executable_overwrite(filename)
|
|
13
|
+
# Bundler needs to install gems regardless of binstub overwriting
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def install
|
|
17
|
+
pre_install_checks
|
|
18
|
+
|
|
19
|
+
run_pre_install_hooks
|
|
20
|
+
|
|
21
|
+
spec.loaded_from = spec_file
|
|
22
|
+
|
|
23
|
+
# Completely remove any previous gem files
|
|
24
|
+
strict_rm_rf gem_dir
|
|
25
|
+
strict_rm_rf spec.extension_dir
|
|
26
|
+
|
|
27
|
+
SharedHelpers.filesystem_access(gem_dir, :create) do
|
|
28
|
+
FileUtils.mkdir_p gem_dir
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
SharedHelpers.filesystem_access(gem_dir, :write) do
|
|
32
|
+
extract_files
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
build_extensions if spec.extensions.any?
|
|
36
|
+
write_build_info_file
|
|
37
|
+
run_post_build_hooks
|
|
38
|
+
|
|
39
|
+
SharedHelpers.filesystem_access(bin_dir, :write) do
|
|
40
|
+
generate_bin
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
generate_plugins
|
|
44
|
+
|
|
45
|
+
write_spec
|
|
46
|
+
|
|
47
|
+
SharedHelpers.filesystem_access("#{gem_home}/cache", :write) do
|
|
48
|
+
write_cache_file
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
say spec.post_install_message unless spec.post_install_message.nil?
|
|
52
|
+
|
|
53
|
+
run_post_install_hooks
|
|
54
|
+
|
|
55
|
+
spec
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
if Bundler.rubygems.provides?("< 3.5")
|
|
59
|
+
def pre_install_checks
|
|
60
|
+
super
|
|
61
|
+
rescue Gem::FilePermissionError
|
|
62
|
+
# Ignore permission checks in RubyGems. Instead, go on, and try to write
|
|
63
|
+
# for real. We properly handle permission errors when they happen.
|
|
64
|
+
nil
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def ensure_writable_dir(dir)
|
|
69
|
+
super
|
|
70
|
+
rescue Gem::FilePermissionError
|
|
71
|
+
# Ignore permission checks in RubyGems. Instead, go on, and try to write
|
|
72
|
+
# for real. We properly handle permission errors when they happen.
|
|
73
|
+
nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def generate_plugins
|
|
77
|
+
return unless Gem::Installer.method_defined?(:generate_plugins, false)
|
|
78
|
+
|
|
79
|
+
ensure_writable_dir @plugins_dir
|
|
80
|
+
|
|
81
|
+
if spec.plugins.empty?
|
|
82
|
+
remove_plugins_for(spec, @plugins_dir)
|
|
83
|
+
else
|
|
84
|
+
regenerate_plugins_for(spec, @plugins_dir)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
if Bundler.rubygems.provides?("< 3.5.19")
|
|
89
|
+
def generate_bin_script(filename, bindir)
|
|
90
|
+
bin_script_path = File.join bindir, formatted_program_filename(filename)
|
|
91
|
+
|
|
92
|
+
Gem.open_file_with_lock(bin_script_path) do
|
|
93
|
+
require "fileutils"
|
|
94
|
+
FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers
|
|
95
|
+
|
|
96
|
+
File.open(bin_script_path, "wb", 0o755) do |file|
|
|
97
|
+
file.write app_script_text(filename)
|
|
98
|
+
file.chmod(options[:prog_mode] || 0o755)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
verbose bin_script_path
|
|
103
|
+
|
|
104
|
+
generate_windows_script filename, bindir
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def build_jobs
|
|
109
|
+
@jobserver_read_io&.read_nonblock(MAX_JOBS_PER_GEM, @jobserver_tokens)
|
|
110
|
+
acquired_jobs = @jobserver_tokens.empty? ? nil : @jobserver_tokens.size
|
|
111
|
+
|
|
112
|
+
acquired_jobs || Bundler.settings[:jobs] || super
|
|
113
|
+
rescue IO::WaitReadable, EOFError
|
|
114
|
+
1
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def build_extensions
|
|
118
|
+
@jobserver_tokens = +""
|
|
119
|
+
@jobserver_read_io, @jobserver_write_io = connect_to_jobserver
|
|
120
|
+
|
|
121
|
+
extension_cache_path = options[:bundler_extension_cache_path]
|
|
122
|
+
extension_dir = spec.extension_dir
|
|
123
|
+
unless extension_cache_path && extension_dir
|
|
124
|
+
prepare_extension_build(extension_dir)
|
|
125
|
+
return super
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
|
|
129
|
+
if build_complete && !options[:force]
|
|
130
|
+
SharedHelpers.filesystem_access(File.dirname(extension_dir)) do |p|
|
|
131
|
+
FileUtils.mkpath p
|
|
132
|
+
end
|
|
133
|
+
SharedHelpers.filesystem_access(extension_cache_path) do
|
|
134
|
+
FileUtils.cp_r extension_cache_path, extension_dir
|
|
135
|
+
end
|
|
136
|
+
else
|
|
137
|
+
prepare_extension_build(extension_dir)
|
|
138
|
+
super
|
|
139
|
+
SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
|
|
140
|
+
SharedHelpers.filesystem_access(extension_cache_path) do
|
|
141
|
+
FileUtils.cp_r extension_dir, extension_cache_path
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
ensure
|
|
145
|
+
unless @jobserver_tokens.empty?
|
|
146
|
+
@jobserver_write_io.write(@jobserver_tokens)
|
|
147
|
+
@jobserver_write_io.flush
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def spec
|
|
152
|
+
if Bundler.rubygems.provides?("< 3.3.12") # RubyGems implementation rescues and re-raises errors before 3.3.12 and we don't want that
|
|
153
|
+
@package.spec
|
|
154
|
+
else
|
|
155
|
+
super
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def gem_checksum
|
|
160
|
+
Checksum.from_gem_package(@package)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
private
|
|
164
|
+
|
|
165
|
+
def connect_to_jobserver
|
|
166
|
+
return unless ENV["MAKEFLAGS"]
|
|
167
|
+
# We append our own --jobserver-auth, so read the last one. Otherwise a
|
|
168
|
+
# parent jobserver's descriptors (e.g. `bundle install` run under
|
|
169
|
+
# `make -j`) would be picked up instead of the pool ParallelInstaller created.
|
|
170
|
+
read_fd, write_fd = ENV["MAKEFLAGS"].scan(/--jobserver-auth=(\d+),(\d+)/).last
|
|
171
|
+
|
|
172
|
+
return unless read_fd && write_fd
|
|
173
|
+
|
|
174
|
+
# Pass explicit modes. On POSIX, IO.new detects the descriptor's access
|
|
175
|
+
# mode, but on Windows it can't, so the write end would default to read
|
|
176
|
+
# mode and raise "IOError: not opened for writing" when releasing slots.
|
|
177
|
+
[IO.new(read_fd.to_i, "r", autoclose: false), IO.new(write_fd.to_i, "w", autoclose: false)]
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def prepare_extension_build(extension_dir)
|
|
181
|
+
SharedHelpers.filesystem_access(extension_dir, :create) do
|
|
182
|
+
FileUtils.mkdir_p extension_dir
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def strict_rm_rf(dir)
|
|
187
|
+
return unless File.exist?(dir)
|
|
188
|
+
return if Dir.empty?(dir)
|
|
189
|
+
|
|
190
|
+
parent = File.dirname(dir)
|
|
191
|
+
parent_st = File.stat(parent)
|
|
192
|
+
|
|
193
|
+
if parent_st.world_writable? && !parent_st.sticky?
|
|
194
|
+
raise InsecureInstallPathError.new(spec.full_name, dir)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
begin
|
|
198
|
+
FileUtils.remove_entry_secure(dir)
|
|
199
|
+
rescue StandardError => e
|
|
200
|
+
raise unless File.exist?(dir)
|
|
201
|
+
|
|
202
|
+
raise DirectoryRemovalError.new(e, "Could not delete previous installation of `#{dir}`")
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rubygems" unless defined?(Gem)
|
|
4
|
+
|
|
5
|
+
module Bundler
|
|
6
|
+
class RubygemsIntegration
|
|
7
|
+
require "monitor"
|
|
8
|
+
|
|
9
|
+
EXT_LOCK = Monitor.new
|
|
10
|
+
|
|
11
|
+
def initialize
|
|
12
|
+
@replaced_methods = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def version
|
|
16
|
+
@version ||= Gem.rubygems_version
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def provides?(req_str)
|
|
20
|
+
Gem::Requirement.new(req_str).satisfied_by?(version)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def build_args
|
|
24
|
+
require "rubygems/command"
|
|
25
|
+
Gem::Command.build_args
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def build_args=(args)
|
|
29
|
+
require "rubygems/command"
|
|
30
|
+
Gem::Command.build_args = args
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def set_target_rbconfig(path)
|
|
34
|
+
Gem.set_target_rbconfig(path)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def loaded_specs(name)
|
|
38
|
+
Gem.loaded_specs[name]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def mark_loaded(spec)
|
|
42
|
+
if spec.respond_to?(:activated=)
|
|
43
|
+
current = Gem.loaded_specs[spec.name]
|
|
44
|
+
current.activated = false if current
|
|
45
|
+
spec.activated = true
|
|
46
|
+
end
|
|
47
|
+
Gem.loaded_specs[spec.name] = spec
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def validate(spec)
|
|
51
|
+
Bundler.ui.silence { spec.validate_for_resolution }
|
|
52
|
+
rescue Gem::InvalidSpecificationException => e
|
|
53
|
+
error_message = "The gemspec at #{spec.loaded_from} is not valid. Please fix this gemspec.\n" \
|
|
54
|
+
"The validation error was '#{e.message}'\n"
|
|
55
|
+
raise Gem::InvalidSpecificationException.new(error_message)
|
|
56
|
+
rescue Errno::ENOENT
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def stub_set_spec(stub, spec)
|
|
61
|
+
stub.instance_variable_set(:@spec, spec)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def path(obj)
|
|
65
|
+
obj.to_s
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def ruby_engine
|
|
69
|
+
Gem.ruby_engine
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def read_binary(path)
|
|
73
|
+
Gem.read_binary(path)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def inflate(obj)
|
|
77
|
+
Gem::Util.inflate(obj)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def gem_dir
|
|
81
|
+
Gem.dir
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def gem_bindir
|
|
85
|
+
Gem.bindir
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def user_home
|
|
89
|
+
Gem.user_home
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def gem_path
|
|
93
|
+
Gem.path
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def reset
|
|
97
|
+
Gem::Specification.reset
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def post_reset_hooks
|
|
101
|
+
Gem.post_reset_hooks
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def suffix_pattern
|
|
105
|
+
Gem.suffix_pattern
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def gem_cache
|
|
109
|
+
gem_path.map {|p| File.expand_path("cache", p) }
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def spec_cache_dirs
|
|
113
|
+
@spec_cache_dirs ||= begin
|
|
114
|
+
dirs = gem_path.map {|dir| File.join(dir, "specifications") }
|
|
115
|
+
dirs << Gem.spec_cache_dir
|
|
116
|
+
dirs.uniq.select {|dir| File.directory? dir }
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def marshal_spec_dir
|
|
121
|
+
Gem::MARSHAL_SPEC_DIR
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def clear_paths
|
|
125
|
+
Gem.clear_paths
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def bin_path(gem, bin, ver)
|
|
129
|
+
Gem.bin_path(gem, bin, ver)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def loaded_gem_paths
|
|
133
|
+
loaded_gem_paths = Gem.loaded_specs.map {|_, s| s.full_require_paths }
|
|
134
|
+
loaded_gem_paths.flatten
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def ui=(obj)
|
|
138
|
+
Gem::DefaultUserInteraction.ui = obj
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def ext_lock
|
|
142
|
+
EXT_LOCK
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def spec_from_gem(path)
|
|
146
|
+
require "rubygems/package"
|
|
147
|
+
Gem::Package.new(path).spec
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def build_gem(gem_dir, spec)
|
|
151
|
+
build(spec)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def security_policy_keys
|
|
155
|
+
%w[High Medium Low AlmostNo No].map {|level| "#{level}Security" }
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def security_policies
|
|
159
|
+
@security_policies ||= begin
|
|
160
|
+
require "rubygems/security"
|
|
161
|
+
Gem::Security::Policies
|
|
162
|
+
rescue LoadError, NameError
|
|
163
|
+
{}
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def reverse_rubygems_kernel_mixin
|
|
168
|
+
# Disable rubygems' gem activation system
|
|
169
|
+
if Gem.respond_to?(:discover_gems_on_require=)
|
|
170
|
+
Gem.discover_gems_on_require = false
|
|
171
|
+
else
|
|
172
|
+
[::Kernel.singleton_class, ::Kernel].each do |k|
|
|
173
|
+
if k.private_method_defined?(:gem_original_require)
|
|
174
|
+
redefine_method(k, :require, k.instance_method(:gem_original_require))
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def replace_gem(specs_by_name)
|
|
181
|
+
executables = nil
|
|
182
|
+
|
|
183
|
+
[::Kernel.singleton_class, ::Kernel].each do |kernel_class|
|
|
184
|
+
redefine_method(kernel_class, :gem) do |dep, *reqs|
|
|
185
|
+
if executables&.include?(File.basename(caller_locations(1, 1).first.path))
|
|
186
|
+
break
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
reqs.pop if reqs.last.is_a?(Hash)
|
|
190
|
+
|
|
191
|
+
unless dep.respond_to?(:name) && dep.respond_to?(:requirement)
|
|
192
|
+
dep = Gem::Dependency.new(dep, reqs)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
if spec = specs_by_name[dep.name]
|
|
196
|
+
return true if dep.matches_spec?(spec)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
message = if spec.nil?
|
|
200
|
+
target_file = begin
|
|
201
|
+
Bundler.default_gemfile.basename
|
|
202
|
+
rescue GemfileNotFound
|
|
203
|
+
"inline Gemfile"
|
|
204
|
+
end
|
|
205
|
+
"#{dep.name} is not part of the bundle." \
|
|
206
|
+
" Add it to your #{target_file}."
|
|
207
|
+
else
|
|
208
|
+
"can't activate #{dep}, already activated #{spec.full_name}. " \
|
|
209
|
+
"Make sure all dependencies are added to Gemfile."
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
e = Gem::LoadError.new(message)
|
|
213
|
+
e.name = dep.name
|
|
214
|
+
e.requirement = dep.requirement
|
|
215
|
+
raise e
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# Used to give better error messages when activating specs outside of the current bundle
|
|
221
|
+
def replace_bin_path(specs_by_name)
|
|
222
|
+
redefine_method(gem_class, :find_spec_for_exe) do |gem_name, *args|
|
|
223
|
+
exec_name = args.first
|
|
224
|
+
raise ArgumentError, "you must supply exec_name" unless exec_name
|
|
225
|
+
|
|
226
|
+
spec_with_name = specs_by_name[gem_name]
|
|
227
|
+
matching_specs_by_exec_name = specs_by_name.values.select {|s| s.executables.include?(exec_name) }
|
|
228
|
+
spec = matching_specs_by_exec_name.delete(spec_with_name)
|
|
229
|
+
|
|
230
|
+
unless spec || !matching_specs_by_exec_name.empty?
|
|
231
|
+
message = "can't find executable #{exec_name} for gem #{gem_name}"
|
|
232
|
+
if spec_with_name.nil?
|
|
233
|
+
message += ". #{gem_name} is not currently included in the bundle, " \
|
|
234
|
+
"perhaps you meant to add it to your #{Bundler.default_gemfile.basename}?"
|
|
235
|
+
end
|
|
236
|
+
raise Gem::Exception, message
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
unless spec
|
|
240
|
+
spec = matching_specs_by_exec_name.shift
|
|
241
|
+
warn \
|
|
242
|
+
"Bundler is using a binstub that was created for a different gem (#{spec.name}).\n" \
|
|
243
|
+
"You should run `bundle binstub #{gem_name}` " \
|
|
244
|
+
"to work around a system/bundle conflict."
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
unless matching_specs_by_exec_name.empty?
|
|
248
|
+
conflicting_names = matching_specs_by_exec_name.map(&:name).join(", ")
|
|
249
|
+
warn \
|
|
250
|
+
"The `#{exec_name}` executable in the `#{spec.name}` gem is being loaded, but it's also present in other gems (#{conflicting_names}).\n" \
|
|
251
|
+
"If you meant to run the executable for another gem, make sure you use a project specific binstub (`bundle binstub <gem_name>`).\n" \
|
|
252
|
+
"If you plan to use multiple conflicting executables, generate binstubs for them and disambiguate their names."
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
spec
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
# Replace or hook into RubyGems to provide a bundlerized view
|
|
260
|
+
# of the world.
|
|
261
|
+
def replace_entrypoints(specs)
|
|
262
|
+
specs_by_name = add_default_gems_to(specs)
|
|
263
|
+
|
|
264
|
+
reverse_rubygems_kernel_mixin
|
|
265
|
+
begin
|
|
266
|
+
# bundled_gems only provide with Ruby 3.3 or later
|
|
267
|
+
require "bundled_gems"
|
|
268
|
+
rescue LoadError
|
|
269
|
+
else
|
|
270
|
+
Gem::BUNDLED_GEMS.replace_require(specs) if Gem::BUNDLED_GEMS.respond_to?(:replace_require)
|
|
271
|
+
end
|
|
272
|
+
replace_gem(specs_by_name)
|
|
273
|
+
stub_rubygems(specs_by_name.values)
|
|
274
|
+
replace_bin_path(specs_by_name)
|
|
275
|
+
|
|
276
|
+
Gem.clear_paths
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
# Add default gems not already present in specs, and return them as a hash.
|
|
280
|
+
def add_default_gems_to(specs)
|
|
281
|
+
specs_by_name = specs.reduce({}) do |h, s|
|
|
282
|
+
h[s.name] = s
|
|
283
|
+
h
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
Bundler.rubygems.default_stubs.each do |stub|
|
|
287
|
+
default_spec = stub.to_spec
|
|
288
|
+
default_spec_name = default_spec.name
|
|
289
|
+
next if specs_by_name.key?(default_spec_name)
|
|
290
|
+
|
|
291
|
+
specs_by_name[default_spec_name] = default_spec
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
specs_by_name
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def undo_replacements
|
|
298
|
+
@replaced_methods.each do |(sym, klass), method|
|
|
299
|
+
redefine_method(klass, sym, method)
|
|
300
|
+
end
|
|
301
|
+
post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ }
|
|
302
|
+
@replaced_methods.clear
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def redefine_method(klass, method, unbound_method = nil, &block)
|
|
306
|
+
visibility = method_visibility(klass, method)
|
|
307
|
+
begin
|
|
308
|
+
if (instance_method = klass.instance_method(method)) && method != :initialize
|
|
309
|
+
# doing this to ensure we also get private methods
|
|
310
|
+
klass.send(:remove_method, method)
|
|
311
|
+
end
|
|
312
|
+
rescue NameError
|
|
313
|
+
# method isn't defined
|
|
314
|
+
nil
|
|
315
|
+
end
|
|
316
|
+
@replaced_methods[[method, klass]] = instance_method
|
|
317
|
+
if unbound_method
|
|
318
|
+
klass.send(:define_method, method, unbound_method)
|
|
319
|
+
klass.send(visibility, method)
|
|
320
|
+
elsif block
|
|
321
|
+
klass.send(:define_method, method, &block)
|
|
322
|
+
klass.send(visibility, method)
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def method_visibility(klass, method)
|
|
327
|
+
if klass.private_method_defined?(method)
|
|
328
|
+
:private
|
|
329
|
+
elsif klass.protected_method_defined?(method)
|
|
330
|
+
:protected
|
|
331
|
+
else
|
|
332
|
+
:public
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def stub_rubygems(specs)
|
|
337
|
+
Gem::Specification.all = specs
|
|
338
|
+
|
|
339
|
+
Gem.post_reset do
|
|
340
|
+
Gem::Specification.all = specs
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
redefine_method(gem_class, :finish_resolve) do |*|
|
|
344
|
+
[]
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
redefine_method(gem_class, :load_plugins) do |*|
|
|
348
|
+
load_plugin_files specs.flat_map(&:plugins)
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
def plain_specs
|
|
353
|
+
Gem::Specification._all
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def plain_specs=(specs)
|
|
357
|
+
Gem::Specification.all = specs
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
def fetch_specs(remote, name, fetcher)
|
|
361
|
+
require "rubygems/remote_fetcher"
|
|
362
|
+
path = remote.uri.to_s + "#{name}.#{Gem.marshal_version}.gz"
|
|
363
|
+
string = fetcher.fetch_path(path)
|
|
364
|
+
specs = Bundler.safe_load_marshal(string)
|
|
365
|
+
raise MarshalError, "Specs #{name} from #{remote} is expected to be an Array but was unexpected class #{specs.class}" unless specs.is_a?(Array)
|
|
366
|
+
specs
|
|
367
|
+
rescue Gem::RemoteFetcher::FetchError
|
|
368
|
+
# it's okay for prerelease to fail
|
|
369
|
+
raise unless name == "prerelease_specs"
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def fetch_all_remote_specs(remote, gem_remote_fetcher)
|
|
373
|
+
specs = fetch_specs(remote, "specs", gem_remote_fetcher)
|
|
374
|
+
pres = fetch_specs(remote, "prerelease_specs", gem_remote_fetcher) || []
|
|
375
|
+
|
|
376
|
+
specs.concat(pres)
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def download_gem(spec, uri, cache_dir, fetcher)
|
|
380
|
+
require "rubygems/remote_fetcher"
|
|
381
|
+
uri = Bundler.settings.mirror_for(uri)
|
|
382
|
+
redacted_uri = Gem::Uri.redact(uri)
|
|
383
|
+
|
|
384
|
+
Bundler::Retry.new("download gem from #{redacted_uri}").attempts do
|
|
385
|
+
gem_file_name = spec.file_name
|
|
386
|
+
local_gem_path = File.join cache_dir, gem_file_name
|
|
387
|
+
return if File.exist? local_gem_path
|
|
388
|
+
|
|
389
|
+
begin
|
|
390
|
+
remote_gem_path = uri + "gems/#{gem_file_name}"
|
|
391
|
+
|
|
392
|
+
SharedHelpers.filesystem_access(local_gem_path) do
|
|
393
|
+
fetcher.cache_update_path remote_gem_path, local_gem_path
|
|
394
|
+
end
|
|
395
|
+
rescue Gem::RemoteFetcher::FetchError
|
|
396
|
+
raise if spec.original_platform == spec.platform
|
|
397
|
+
|
|
398
|
+
original_gem_file_name = "#{spec.original_name}.gem"
|
|
399
|
+
raise if gem_file_name == original_gem_file_name
|
|
400
|
+
|
|
401
|
+
gem_file_name = original_gem_file_name
|
|
402
|
+
retry
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
rescue Gem::RemoteFetcher::FetchError => e
|
|
406
|
+
raise Bundler::HTTPError, "Could not download gem from #{redacted_uri} due to underlying error <#{e.message}>"
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
def build(spec, skip_validation = false)
|
|
410
|
+
require "rubygems/package"
|
|
411
|
+
Gem::Package.build(spec, skip_validation)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
def path_separator
|
|
415
|
+
Gem.path_separator
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
def all_specs
|
|
419
|
+
SharedHelpers.feature_removed! "Bundler.rubygems.all_specs has been removed in favor of Bundler.rubygems.installed_specs"
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
def installed_specs
|
|
423
|
+
Gem::Specification.stubs.reject(&:default_gem?).map do |stub|
|
|
424
|
+
StubSpecification.from_stub(stub)
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
def default_specs
|
|
429
|
+
Gem::Specification.default_stubs.map do |stub|
|
|
430
|
+
StubSpecification.from_stub(stub)
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
def find_bundler(version)
|
|
435
|
+
find_name("bundler").find {|s| s.version.to_s == version.to_s }
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
def find_name(name)
|
|
439
|
+
Gem::Specification.stubs_for(name).map(&:to_spec)
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
def default_stubs
|
|
443
|
+
Gem::Specification.default_stubs("*.gemspec")
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
private
|
|
447
|
+
|
|
448
|
+
def gem_class
|
|
449
|
+
class << Gem; self; end
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
def self.rubygems
|
|
454
|
+
@rubygems ||= RubygemsIntegration.new
|
|
455
|
+
end
|
|
456
|
+
end
|