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,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
# This is the interfacing class represents the API that we intend to provide
|
|
5
|
+
# the plugins to use.
|
|
6
|
+
#
|
|
7
|
+
# For plugins to be independent of the Bundler internals they shall limit their
|
|
8
|
+
# interactions to methods of this class only. This will save them from breaking
|
|
9
|
+
# when some internal change.
|
|
10
|
+
#
|
|
11
|
+
# Currently we are delegating the methods defined in Bundler class to
|
|
12
|
+
# itself. So, this class acts as a buffer.
|
|
13
|
+
#
|
|
14
|
+
# If there is some change in the Bundler class that is incompatible to its
|
|
15
|
+
# previous behavior or if otherwise desired, we can reimplement(or implement)
|
|
16
|
+
# the method to preserve compatibility.
|
|
17
|
+
#
|
|
18
|
+
# To use this, either the class can inherit this class or use it directly.
|
|
19
|
+
# For example of both types of use, refer the file `spec/plugins/command.rb`
|
|
20
|
+
#
|
|
21
|
+
# To use it without inheriting, you will have to create an object of this
|
|
22
|
+
# to use the functions (except for declaration functions like command, source,
|
|
23
|
+
# and hooks).
|
|
24
|
+
module Plugin
|
|
25
|
+
class API
|
|
26
|
+
autoload :Source, File.expand_path("api/source", __dir__)
|
|
27
|
+
|
|
28
|
+
# The plugins should declare that they handle a command through this helper.
|
|
29
|
+
#
|
|
30
|
+
# @param [String] command being handled by them
|
|
31
|
+
# @param [Class] (optional) class that handles the command. If not
|
|
32
|
+
# provided, the `self` class will be used.
|
|
33
|
+
def self.command(command, cls = self)
|
|
34
|
+
Plugin.add_command command, cls
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# The plugins should declare that they provide a installation source
|
|
38
|
+
# through this helper.
|
|
39
|
+
#
|
|
40
|
+
# @param [String] the source type they provide
|
|
41
|
+
# @param [Class] (optional) class that handles the source. If not
|
|
42
|
+
# provided, the `self` class will be used.
|
|
43
|
+
def self.source(source, cls = self)
|
|
44
|
+
cls.send :include, Bundler::Plugin::API::Source
|
|
45
|
+
Plugin.add_source source, cls
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.hook(event, &block)
|
|
49
|
+
Plugin.add_hook(event, &block)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# The cache dir to be used by the plugins for storage
|
|
53
|
+
#
|
|
54
|
+
# @return [Pathname] path of the cache dir
|
|
55
|
+
def cache_dir
|
|
56
|
+
Plugin.cache.join("plugins")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# A tmp dir to be used by plugins
|
|
60
|
+
# Accepts names that get concatenated as suffix
|
|
61
|
+
#
|
|
62
|
+
# @return [Pathname] object for the new directory created
|
|
63
|
+
def tmp(*names)
|
|
64
|
+
Bundler.tmp(["plugin", *names].join("-"))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def method_missing(name, *args, &blk)
|
|
68
|
+
return Bundler.send(name, *args, &blk) if Bundler.respond_to?(name)
|
|
69
|
+
|
|
70
|
+
return SharedHelpers.send(name, *args, &blk) if SharedHelpers.respond_to?(name)
|
|
71
|
+
|
|
72
|
+
super
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def respond_to_missing?(name, include_private = false)
|
|
76
|
+
SharedHelpers.respond_to?(name, include_private) ||
|
|
77
|
+
Bundler.respond_to?(name, include_private) || super
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module Plugin
|
|
5
|
+
# Dsl to parse the Gemfile looking for plugins to install
|
|
6
|
+
class DSL < Bundler::Dsl
|
|
7
|
+
class PluginGemfileError < PluginError; end
|
|
8
|
+
alias_method :_gem, :gem # To use for plugin installation as gem
|
|
9
|
+
|
|
10
|
+
# So that we don't have to override all there methods to dummy ones
|
|
11
|
+
# explicitly.
|
|
12
|
+
# They will be handled by method_missing
|
|
13
|
+
[:gemspec, :gem, :install_if, :platforms, :env].each {|m| undef_method m }
|
|
14
|
+
|
|
15
|
+
# This lists the plugins that was added automatically and not specified by
|
|
16
|
+
# the user.
|
|
17
|
+
#
|
|
18
|
+
# When we encounter :type attribute with a source block, we add a plugin
|
|
19
|
+
# by name bundler-source-<type> to list of plugins to be installed.
|
|
20
|
+
#
|
|
21
|
+
# These plugins are optional and are not installed when there is conflict
|
|
22
|
+
# with any other plugin.
|
|
23
|
+
attr_reader :inferred_plugins
|
|
24
|
+
|
|
25
|
+
def initialize
|
|
26
|
+
super
|
|
27
|
+
@sources = Plugin::SourceList.new
|
|
28
|
+
@inferred_plugins = [] # The source plugins inferred from :type
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def plugin(name, *args)
|
|
32
|
+
_gem(name, *args)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def method_missing(name, *args)
|
|
36
|
+
raise PluginGemfileError, "Undefined local variable or method `#{name}' for Gemfile" unless Bundler::Dsl.method_defined? name
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def source(source, *args, &blk)
|
|
40
|
+
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
|
41
|
+
options = normalize_hash(options)
|
|
42
|
+
return super unless options.key?("type")
|
|
43
|
+
|
|
44
|
+
plugin_name = "bundler-source-#{options["type"]}"
|
|
45
|
+
|
|
46
|
+
return if @dependencies.any? {|d| d.name == plugin_name }
|
|
47
|
+
|
|
48
|
+
plugin(plugin_name)
|
|
49
|
+
@inferred_plugins << plugin_name
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module Plugin
|
|
5
|
+
module Events
|
|
6
|
+
def self.define(const, event)
|
|
7
|
+
const = const.to_sym.freeze
|
|
8
|
+
if const_defined?(const) && const_get(const) != event
|
|
9
|
+
raise ArgumentError, "Attempting to reassign #{const} to a different value"
|
|
10
|
+
end
|
|
11
|
+
const_set(const, event) unless const_defined?(const)
|
|
12
|
+
@events ||= {}
|
|
13
|
+
@events[event] = const
|
|
14
|
+
end
|
|
15
|
+
private_class_method :define
|
|
16
|
+
|
|
17
|
+
def self.reset
|
|
18
|
+
@events.each_value do |const|
|
|
19
|
+
remove_const(const)
|
|
20
|
+
end
|
|
21
|
+
@events = nil
|
|
22
|
+
end
|
|
23
|
+
private_class_method :reset
|
|
24
|
+
|
|
25
|
+
# Check if an event has been defined
|
|
26
|
+
# @param event [String] An event to check
|
|
27
|
+
# @return [Boolean] A boolean indicating if the event has been defined
|
|
28
|
+
def self.defined_event?(event)
|
|
29
|
+
@events ||= {}
|
|
30
|
+
@events.key?(event)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @!parse
|
|
34
|
+
# A hook called before each individual gem is installed
|
|
35
|
+
# Includes a Bundler::ParallelInstaller::SpecInstallation.
|
|
36
|
+
# No state, error, post_install_message will be present as nothing has installed yet
|
|
37
|
+
# GEM_BEFORE_INSTALL = "before-install"
|
|
38
|
+
define :GEM_BEFORE_INSTALL, "before-install"
|
|
39
|
+
|
|
40
|
+
# @!parse
|
|
41
|
+
# A hook called after each individual gem is installed
|
|
42
|
+
# Includes a Bundler::ParallelInstaller::SpecInstallation.
|
|
43
|
+
# - If state is failed, an error will be present.
|
|
44
|
+
# - If state is success, a post_install_message may be present.
|
|
45
|
+
# GEM_AFTER_INSTALL = "after-install"
|
|
46
|
+
define :GEM_AFTER_INSTALL, "after-install"
|
|
47
|
+
|
|
48
|
+
# @!parse
|
|
49
|
+
# A hook called before any gems install
|
|
50
|
+
# Includes an Array of Bundler::Dependency objects
|
|
51
|
+
# GEM_BEFORE_INSTALL_ALL = "before-install-all"
|
|
52
|
+
define :GEM_BEFORE_INSTALL_ALL, "before-install-all"
|
|
53
|
+
|
|
54
|
+
# @!parse
|
|
55
|
+
# A hook called after any gems install
|
|
56
|
+
# Includes an Array of Bundler::Dependency objects
|
|
57
|
+
# GEM_AFTER_INSTALL_ALL = "after-install-all"
|
|
58
|
+
define :GEM_AFTER_INSTALL_ALL, "after-install-all"
|
|
59
|
+
|
|
60
|
+
# @!parse
|
|
61
|
+
# A hook called before each individual gem is required
|
|
62
|
+
# Includes a Bundler::Dependency.
|
|
63
|
+
# GEM_BEFORE_REQUIRE = "before-require"
|
|
64
|
+
define :GEM_BEFORE_REQUIRE, "before-require"
|
|
65
|
+
|
|
66
|
+
# @!parse
|
|
67
|
+
# A hook called after each individual gem is required
|
|
68
|
+
# Includes a Bundler::Dependency.
|
|
69
|
+
# GEM_AFTER_REQUIRE = "after-require"
|
|
70
|
+
define :GEM_AFTER_REQUIRE, "after-require"
|
|
71
|
+
|
|
72
|
+
# @!parse
|
|
73
|
+
# A hook called before any gems require
|
|
74
|
+
# Includes an Array of Bundler::Dependency objects.
|
|
75
|
+
# GEM_BEFORE_REQUIRE_ALL = "before-require-all"
|
|
76
|
+
define :GEM_BEFORE_REQUIRE_ALL, "before-require-all"
|
|
77
|
+
|
|
78
|
+
# @!parse
|
|
79
|
+
# A hook called after all gems required
|
|
80
|
+
# Includes an Array of Bundler::Dependency objects.
|
|
81
|
+
# GEM_AFTER_REQUIRE_ALL = "after-require-all"
|
|
82
|
+
define :GEM_AFTER_REQUIRE_ALL, "after-require-all"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
# Manages which plugins are installed and their sources. This also is supposed to map
|
|
5
|
+
# which plugin does what (currently the features are not implemented so this class is
|
|
6
|
+
# now a stub class).
|
|
7
|
+
module Plugin
|
|
8
|
+
class Index
|
|
9
|
+
class CommandConflict < PluginError
|
|
10
|
+
def initialize(plugin, commands)
|
|
11
|
+
msg = "Command(s) `#{commands.join("`, `")}` declared by #{plugin} are already registered."
|
|
12
|
+
super msg
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class SourceConflict < PluginError
|
|
17
|
+
def initialize(plugin, sources)
|
|
18
|
+
msg = "Source(s) `#{sources.join("`, `")}` declared by #{plugin} are already registered."
|
|
19
|
+
super msg
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_reader :commands
|
|
24
|
+
|
|
25
|
+
def initialize
|
|
26
|
+
@plugin_paths = {}
|
|
27
|
+
@commands = {}
|
|
28
|
+
@sources = {}
|
|
29
|
+
@hooks = {}
|
|
30
|
+
@load_paths = {}
|
|
31
|
+
|
|
32
|
+
begin
|
|
33
|
+
load_index(global_index_file, true)
|
|
34
|
+
rescue PermissionError
|
|
35
|
+
# no need to fail when on a read-only FS, for example
|
|
36
|
+
nil
|
|
37
|
+
rescue ArgumentError => e
|
|
38
|
+
# ruby 3.4 checks writability in Dir.tmpdir
|
|
39
|
+
raise unless e.message&.include?("could not find a temporary directory")
|
|
40
|
+
nil
|
|
41
|
+
end
|
|
42
|
+
load_index(local_index_file) if SharedHelpers.in_bundle?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# This function is to be called when a new plugin is installed. This
|
|
46
|
+
# function shall add the functions of the plugin to existing maps and also
|
|
47
|
+
# the name to source location.
|
|
48
|
+
#
|
|
49
|
+
# @param [String] name of the plugin to be registered
|
|
50
|
+
# @param [String] path where the plugin is installed
|
|
51
|
+
# @param [Array<String>] load_paths for the plugin
|
|
52
|
+
# @param [Array<String>] commands that are handled by the plugin
|
|
53
|
+
# @param [Array<String>] sources that are handled by the plugin
|
|
54
|
+
def register_plugin(name, path, load_paths, commands, sources, hooks)
|
|
55
|
+
old_commands = @commands.dup
|
|
56
|
+
|
|
57
|
+
common = commands & @commands.keys
|
|
58
|
+
raise CommandConflict.new(name, common) unless common.empty?
|
|
59
|
+
commands.each {|c| @commands[c] = name }
|
|
60
|
+
|
|
61
|
+
common = sources & @sources.keys
|
|
62
|
+
raise SourceConflict.new(name, common) unless common.empty?
|
|
63
|
+
sources.each {|k| @sources[k] = name }
|
|
64
|
+
|
|
65
|
+
hooks.each do |event|
|
|
66
|
+
event_hooks = (@hooks[event] ||= []) << name
|
|
67
|
+
event_hooks.uniq!
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
@plugin_paths[name] = path
|
|
71
|
+
@load_paths[name] = load_paths
|
|
72
|
+
save_index
|
|
73
|
+
rescue StandardError
|
|
74
|
+
@commands = old_commands
|
|
75
|
+
raise
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def unregister_plugin(name)
|
|
79
|
+
@commands.delete_if {|_, v| v == name }
|
|
80
|
+
@sources.delete_if {|_, v| v == name }
|
|
81
|
+
@hooks.each do |hook, names|
|
|
82
|
+
names.delete(name)
|
|
83
|
+
@hooks.delete(hook) if names.empty?
|
|
84
|
+
end
|
|
85
|
+
@plugin_paths.delete(name)
|
|
86
|
+
@load_paths.delete(name)
|
|
87
|
+
save_index
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Path of default index file
|
|
91
|
+
def index_file
|
|
92
|
+
Plugin.root.join("index")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Path where the global index file is stored
|
|
96
|
+
def global_index_file
|
|
97
|
+
Plugin.global_root.join("index")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Path where the local index file is stored
|
|
101
|
+
def local_index_file
|
|
102
|
+
Plugin.local_root.join("index")
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def plugin_path(name)
|
|
106
|
+
Pathname.new @plugin_paths[name]
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def load_paths(name)
|
|
110
|
+
@load_paths[name]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Fetch the name of plugin handling the command
|
|
114
|
+
def command_plugin(command)
|
|
115
|
+
@commands[command]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def installed?(name)
|
|
119
|
+
@plugin_paths[name]
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def up_to_date?(spec)
|
|
123
|
+
path = installed?(spec.name)
|
|
124
|
+
|
|
125
|
+
path == spec.full_gem_path
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def installed_plugins
|
|
129
|
+
@plugin_paths.keys
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def plugin_commands(plugin)
|
|
133
|
+
@commands.find_all {|_, n| n == plugin }.map(&:first)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def source?(source)
|
|
137
|
+
@sources.key? source
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def source_plugin(name)
|
|
141
|
+
@sources[name]
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Returns the list of plugin names handling the passed event
|
|
145
|
+
def hook_plugins(event)
|
|
146
|
+
@hooks[event] || []
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# This plugin is installed inside the .bundle/plugin directory,
|
|
150
|
+
# and thus is managed solely by Bundler
|
|
151
|
+
def installed_in_plugin_root?(name)
|
|
152
|
+
return false unless (path = installed?(name))
|
|
153
|
+
|
|
154
|
+
path.start_with?("#{Plugin.root}/")
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
private
|
|
158
|
+
|
|
159
|
+
# Reads the index file from the directory and initializes the instance
|
|
160
|
+
# variables.
|
|
161
|
+
#
|
|
162
|
+
# It skips the sources if the second param is true
|
|
163
|
+
# @param [Pathname] index file path
|
|
164
|
+
# @param [Boolean] is the index file global index
|
|
165
|
+
def load_index(index_file, global = false)
|
|
166
|
+
SharedHelpers.filesystem_access(index_file, :read) do |index_f|
|
|
167
|
+
valid_file = index_f&.exist? && !index_f.size.zero?
|
|
168
|
+
break unless valid_file
|
|
169
|
+
|
|
170
|
+
data = index_f.read
|
|
171
|
+
|
|
172
|
+
require_relative "../yaml_serializer"
|
|
173
|
+
index = YAMLSerializer.load(data)
|
|
174
|
+
|
|
175
|
+
@commands.merge!(index["commands"])
|
|
176
|
+
@hooks.merge!(index["hooks"])
|
|
177
|
+
@load_paths.merge!(index["load_paths"])
|
|
178
|
+
@plugin_paths.merge!(index["plugin_paths"])
|
|
179
|
+
@sources.merge!(index["sources"]) unless global
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Should be called when any of the instance variables change. Stores the
|
|
184
|
+
# instance variables in YAML format. (The instance variables are supposed
|
|
185
|
+
# to be only String key value pairs)
|
|
186
|
+
def save_index
|
|
187
|
+
index = {
|
|
188
|
+
"commands" => @commands,
|
|
189
|
+
"hooks" => @hooks,
|
|
190
|
+
"load_paths" => @load_paths,
|
|
191
|
+
"plugin_paths" => @plugin_paths,
|
|
192
|
+
"sources" => @sources,
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
require_relative "../yaml_serializer"
|
|
196
|
+
SharedHelpers.filesystem_access(index_file) do |index_f|
|
|
197
|
+
FileUtils.mkdir_p(index_f.dirname)
|
|
198
|
+
File.open(index_f, "w") {|f| f.puts YAMLSerializer.dump(index) }
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module Plugin
|
|
5
|
+
class Installer
|
|
6
|
+
class Git < Bundler::Source::Git
|
|
7
|
+
def cache_path
|
|
8
|
+
@cache_path ||= begin
|
|
9
|
+
git_scope = "#{base_name}-#{uri_hash}"
|
|
10
|
+
|
|
11
|
+
Plugin.cache.join("bundler", "git", git_scope)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def install_path
|
|
16
|
+
@install_path ||= begin
|
|
17
|
+
git_scope = "#{base_name}-#{shortref_for_path(revision)}"
|
|
18
|
+
|
|
19
|
+
Plugin.root.join("bundler", "gems", git_scope)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def root
|
|
24
|
+
Plugin.root
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def generate_bin(spec, disable_extensions = false)
|
|
28
|
+
# Need to find a way without code duplication
|
|
29
|
+
# For now, we can ignore this
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module Plugin
|
|
5
|
+
class Installer
|
|
6
|
+
class Path < Bundler::Source::Path
|
|
7
|
+
def root
|
|
8
|
+
SharedHelpers.in_bundle? ? Bundler.root : Plugin.root
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def eql?(other)
|
|
12
|
+
return unless other.class == self.class
|
|
13
|
+
expanded_original_path == other.expanded_original_path &&
|
|
14
|
+
version == other.version
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
alias_method :==, :eql?
|
|
18
|
+
|
|
19
|
+
def generate_bin(spec, disable_extensions = false)
|
|
20
|
+
# Need to find a way without code duplication
|
|
21
|
+
# For now, we can ignore this
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module Plugin
|
|
5
|
+
class Installer
|
|
6
|
+
class Rubygems < Bundler::Source::Rubygems
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
def rubygems_dir
|
|
10
|
+
Plugin.root
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def cache_path
|
|
14
|
+
Plugin.cache
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
# Handles the installation of plugin in appropriate directories.
|
|
5
|
+
#
|
|
6
|
+
# This class is supposed to be wrapper over the existing gem installation infra
|
|
7
|
+
# but currently it itself handles everything as the Source's subclasses (e.g. Source::RubyGems)
|
|
8
|
+
# are heavily dependent on the Gemfile.
|
|
9
|
+
module Plugin
|
|
10
|
+
class Installer
|
|
11
|
+
autoload :Rubygems, File.expand_path("installer/rubygems", __dir__)
|
|
12
|
+
autoload :Git, File.expand_path("installer/git", __dir__)
|
|
13
|
+
autoload :Path, File.expand_path("installer/path", __dir__)
|
|
14
|
+
|
|
15
|
+
def install(names, options)
|
|
16
|
+
check_sources_consistency!(options)
|
|
17
|
+
|
|
18
|
+
version = options[:version] || [">= 0"]
|
|
19
|
+
|
|
20
|
+
if options[:git]
|
|
21
|
+
install_git(names, version, options)
|
|
22
|
+
elsif options[:path]
|
|
23
|
+
install_path(names, version, options[:path])
|
|
24
|
+
else
|
|
25
|
+
sources = options[:source] || Gem.sources
|
|
26
|
+
install_rubygems(names, version, sources)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Installs the plugin from Definition object created by limited parsing of
|
|
31
|
+
# Gemfile searching for plugins to be installed
|
|
32
|
+
#
|
|
33
|
+
# @param [Definition] definition object
|
|
34
|
+
# @return [Hash] map of names to their specs they are installed with
|
|
35
|
+
def install_definition(definition)
|
|
36
|
+
def definition.lock(*); end
|
|
37
|
+
definition.remotely!
|
|
38
|
+
specs = definition.specs
|
|
39
|
+
|
|
40
|
+
install_from_specs specs
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def check_sources_consistency!(options)
|
|
46
|
+
if (options.keys & [:source, :git, :path]).length > 1
|
|
47
|
+
raise InvalidOption, "Only one of --source, --git, or --path may be specified"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
if (options.key?(:branch) || options.key?(:ref)) && !options.key?(:git)
|
|
51
|
+
raise InvalidOption, "--#{options.key?(:branch) ? "branch" : "ref"} can only be used with git sources"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
if options.key?(:branch) && options.key?(:ref)
|
|
55
|
+
raise InvalidOption, "--branch and --ref can't be both specified"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def install_git(names, version, options)
|
|
60
|
+
source_list = SourceList.new
|
|
61
|
+
source = source_list.add_git_source({ "uri" => options[:git],
|
|
62
|
+
"branch" => options[:branch],
|
|
63
|
+
"ref" => options[:ref] })
|
|
64
|
+
|
|
65
|
+
install_all_sources(names, version, source_list, source)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def install_path(names, version, path)
|
|
69
|
+
source_list = SourceList.new
|
|
70
|
+
source = source_list.add_path_source({ "path" => path, "root_path" => SharedHelpers.pwd })
|
|
71
|
+
|
|
72
|
+
install_all_sources(names, version, source_list, source)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Installs the plugin from rubygems source and returns the path where the
|
|
76
|
+
# plugin was installed
|
|
77
|
+
#
|
|
78
|
+
# @param [String] name of the plugin gem to search in the source
|
|
79
|
+
# @param [Array] version of the gem to install
|
|
80
|
+
# @param [String, Array<String>] source(s) to resolve the gem
|
|
81
|
+
#
|
|
82
|
+
# @return [Hash] map of names to the specs of plugins installed
|
|
83
|
+
def install_rubygems(names, version, sources)
|
|
84
|
+
source_list = SourceList.new
|
|
85
|
+
|
|
86
|
+
Array(sources).each {|remote| source_list.add_global_rubygems_remote(remote) }
|
|
87
|
+
|
|
88
|
+
install_all_sources(names, version, source_list)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def install_all_sources(names, version, source_list, source = nil)
|
|
92
|
+
deps = names.map {|name| Dependency.new(name, version, { "source" => source }) }
|
|
93
|
+
|
|
94
|
+
Bundler.configure_gem_home_and_path(Plugin.root)
|
|
95
|
+
|
|
96
|
+
Bundler.settings.temporary(deployment: false, frozen: false) do
|
|
97
|
+
definition = Definition.new(nil, deps, source_list, true)
|
|
98
|
+
|
|
99
|
+
install_definition(definition)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Installs the plugins and deps from the provided specs and returns map of
|
|
104
|
+
# gems to their paths
|
|
105
|
+
#
|
|
106
|
+
# @param specs to install
|
|
107
|
+
#
|
|
108
|
+
# @return [Hash] map of names to the specs
|
|
109
|
+
def install_from_specs(specs)
|
|
110
|
+
paths = {}
|
|
111
|
+
|
|
112
|
+
specs.each do |spec|
|
|
113
|
+
spec.source.download(spec)
|
|
114
|
+
spec.source.install(spec)
|
|
115
|
+
|
|
116
|
+
paths[spec.name] = spec
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
paths
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
# SourceList object to be used while parsing the Gemfile, setting the
|
|
5
|
+
# approptiate options to be used with Source classes for plugin installation
|
|
6
|
+
module Plugin
|
|
7
|
+
class SourceList < Bundler::SourceList
|
|
8
|
+
def add_git_source(options = {})
|
|
9
|
+
add_source_to_list Plugin::Installer::Git.new(options), git_sources
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def add_path_source(options = {})
|
|
13
|
+
add_source_to_list Plugin::Installer::Path.new(options), path_sources
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def add_rubygems_source(options = {})
|
|
17
|
+
add_source_to_list Plugin::Installer::Rubygems.new(options), @rubygems_sources
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def all_sources
|
|
21
|
+
path_sources + git_sources + rubygems_sources + [metadata_source]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def source_class
|
|
27
|
+
Plugin::Installer::Rubygems
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bundler
|
|
4
|
+
module Plugin
|
|
5
|
+
# Stands in for a source handled by a plugin that is not loaded yet, so
|
|
6
|
+
# that the lockfile can still be parsed during the plugin install pass,
|
|
7
|
+
# and by external tools reading a lockfile without the plugin installed.
|
|
8
|
+
class UnloadedSource
|
|
9
|
+
include API::Source
|
|
10
|
+
|
|
11
|
+
# Unlike real plugin sources, where the handling class encodes the
|
|
12
|
+
# source type, all unloaded sources share this class, so the type must
|
|
13
|
+
# be compared explicitly.
|
|
14
|
+
def ==(other)
|
|
15
|
+
super && options["type"] == other.options["type"]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
alias_method :eql?, :==
|
|
19
|
+
|
|
20
|
+
def hash
|
|
21
|
+
[super, options["type"]].hash
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|