rubygems-update 2.7.11 → 3.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +67 -0
- data/.travis.yml +24 -18
- data/CODE_OF_CONDUCT.md +10 -8
- data/CONTRIBUTING.md +148 -0
- data/History.txt +458 -8
- data/MAINTAINERS.txt +1 -0
- data/Manifest.txt +16 -9
- data/POLICIES.md +92 -0
- data/README.md +53 -26
- data/Rakefile +77 -211
- data/{UPGRADING.rdoc → UPGRADING.md} +31 -32
- data/appveyor.yml +20 -45
- data/bin/gem +1 -2
- data/bin/update_rubygems +2 -3
- data/bundler/CHANGELOG.md +65 -0
- data/bundler/bundler.gemspec +7 -1
- data/bundler/lib/bundler/build_metadata.rb +1 -1
- data/bundler/lib/bundler/cli/add.rb +15 -5
- data/bundler/lib/bundler/cli/binstubs.rb +8 -2
- data/bundler/lib/bundler/cli/doctor.rb +47 -1
- data/bundler/lib/bundler/cli/install.rb +8 -5
- data/bundler/lib/bundler/cli/list.rb +41 -5
- data/bundler/lib/bundler/cli/outdated.rb +7 -1
- data/bundler/lib/bundler/cli/pristine.rb +4 -0
- data/bundler/lib/bundler/cli/remove.rb +18 -0
- data/bundler/lib/bundler/cli.rb +63 -21
- data/bundler/lib/bundler/definition.rb +15 -16
- data/bundler/lib/bundler/dependency.rb +2 -2
- data/bundler/lib/bundler/dsl.rb +19 -3
- data/bundler/lib/bundler/feature_flag.rb +7 -0
- data/bundler/lib/bundler/gem_version_promoter.rb +4 -2
- data/bundler/lib/bundler/injector.rb +168 -9
- data/bundler/lib/bundler/installer/parallel_installer.rb +5 -0
- data/bundler/lib/bundler/installer.rb +29 -6
- data/bundler/lib/bundler/plugin/events.rb +61 -0
- data/bundler/lib/bundler/plugin.rb +10 -3
- data/bundler/lib/bundler/resolver.rb +2 -2
- data/bundler/lib/bundler/rubygems_gem_installer.rb +7 -0
- data/bundler/lib/bundler/runtime.rb +8 -2
- data/bundler/lib/bundler/settings/validator.rb +23 -0
- data/bundler/lib/bundler/settings.rb +24 -3
- data/bundler/lib/bundler/shared_helpers.rb +19 -3
- data/bundler/lib/bundler/source/metadata.rb +2 -3
- data/bundler/lib/bundler/source.rb +9 -9
- data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler.rb +26 -8
- data/bundler/man/bundle-add.ronn +13 -2
- data/bundler/man/bundle-config.ronn +21 -0
- data/bundler/man/bundle-install.ronn +1 -1
- data/bundler/man/bundle-list.ronn +19 -1
- data/bundler/man/bundle-outdated.ronn +4 -0
- data/bundler/man/bundle-remove.ronn +23 -0
- data/bundler/man/bundle-update.ronn +1 -1
- data/bundler/man/bundle.ronn +3 -0
- data/lib/rubygems/available_set.rb +1 -1
- data/lib/rubygems/basic_specification.rb +12 -12
- data/lib/rubygems/bundler_version_finder.rb +3 -3
- data/lib/rubygems/command.rb +22 -15
- data/lib/rubygems/command_manager.rb +22 -5
- data/lib/rubygems/commands/build_command.rb +41 -7
- data/lib/rubygems/commands/cert_command.rb +45 -24
- data/lib/rubygems/commands/check_command.rb +1 -1
- data/lib/rubygems/commands/cleanup_command.rb +14 -7
- data/lib/rubygems/commands/contents_command.rb +14 -15
- data/lib/rubygems/commands/dependency_command.rb +17 -17
- data/lib/rubygems/commands/environment_command.rb +20 -1
- data/lib/rubygems/commands/fetch_command.rb +2 -3
- data/lib/rubygems/commands/generate_index_command.rb +2 -3
- data/lib/rubygems/commands/help_command.rb +12 -13
- data/lib/rubygems/commands/info_command.rb +33 -0
- data/lib/rubygems/commands/install_command.rb +21 -17
- data/lib/rubygems/commands/list_command.rb +0 -1
- data/lib/rubygems/commands/lock_command.rb +3 -4
- data/lib/rubygems/commands/open_command.rb +16 -10
- data/lib/rubygems/commands/owner_command.rb +21 -7
- data/lib/rubygems/commands/pristine_command.rb +23 -16
- data/lib/rubygems/commands/push_command.rb +19 -8
- data/lib/rubygems/commands/query_command.rb +24 -24
- data/lib/rubygems/commands/rdoc_command.rb +3 -4
- data/lib/rubygems/commands/search_command.rb +0 -1
- data/lib/rubygems/commands/server_command.rb +1 -2
- data/lib/rubygems/commands/setup_command.rb +86 -48
- data/lib/rubygems/commands/signin_command.rb +2 -1
- data/lib/rubygems/commands/signout_command.rb +2 -2
- data/lib/rubygems/commands/sources_command.rb +11 -12
- data/lib/rubygems/commands/specification_command.rb +7 -7
- data/lib/rubygems/commands/uninstall_command.rb +50 -18
- data/lib/rubygems/commands/unpack_command.rb +16 -7
- data/lib/rubygems/commands/update_command.rb +28 -23
- data/lib/rubygems/commands/which_command.rb +5 -8
- data/lib/rubygems/commands/yank_command.rb +1 -2
- data/lib/rubygems/compatibility.rb +1 -21
- data/lib/rubygems/config_file.rb +36 -36
- data/lib/rubygems/core_ext/kernel_require.rb +6 -6
- data/lib/rubygems/core_ext/kernel_warn.rb +45 -0
- data/lib/rubygems/defaults.rb +31 -19
- data/lib/rubygems/dependency.rb +15 -15
- data/lib/rubygems/dependency_installer.rb +30 -33
- data/lib/rubygems/dependency_list.rb +9 -10
- data/lib/rubygems/deprecate.rb +2 -3
- data/lib/rubygems/doctor.rb +5 -6
- data/lib/rubygems/errors.rb +3 -3
- data/lib/rubygems/exceptions.rb +11 -8
- data/lib/rubygems/ext/build_error.rb +0 -1
- data/lib/rubygems/ext/builder.rb +50 -23
- data/lib/rubygems/ext/cmake_builder.rb +2 -2
- data/lib/rubygems/ext/configure_builder.rb +2 -3
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -7
- data/lib/rubygems/ext/rake_builder.rb +16 -18
- data/lib/rubygems/ext.rb +0 -1
- data/lib/rubygems/gem_runner.rb +2 -2
- data/lib/rubygems/gemcutter_utilities.rb +46 -12
- data/lib/rubygems/indexer.rb +19 -12
- data/lib/rubygems/install_default_message.rb +0 -1
- data/lib/rubygems/install_message.rb +0 -1
- data/lib/rubygems/install_update_options.rb +3 -29
- data/lib/rubygems/installer.rb +97 -55
- data/lib/rubygems/installer_test_case.rb +2 -16
- data/lib/rubygems/local_remote_options.rb +5 -4
- data/lib/rubygems/mock_gem_ui.rb +3 -4
- data/lib/rubygems/name_tuple.rb +4 -4
- data/lib/rubygems/package/digest_io.rb +3 -4
- data/lib/rubygems/package/file_source.rb +3 -4
- data/lib/rubygems/package/io_source.rb +1 -2
- data/lib/rubygems/package/old.rb +8 -16
- data/lib/rubygems/package/source.rb +0 -1
- data/lib/rubygems/package/tar_header.rb +13 -4
- data/lib/rubygems/package/tar_reader/entry.rb +20 -4
- data/lib/rubygems/package/tar_reader.rb +2 -4
- data/lib/rubygems/package/tar_test_case.rb +2 -8
- data/lib/rubygems/package/tar_writer.rb +13 -15
- data/lib/rubygems/package.rb +90 -63
- data/lib/rubygems/package_task.rb +0 -1
- data/lib/rubygems/path_support.rb +16 -6
- data/lib/rubygems/platform.rb +4 -5
- data/lib/rubygems/psych_tree.rb +1 -1
- data/lib/rubygems/rdoc.rb +2 -313
- data/lib/rubygems/remote_fetcher.rb +29 -82
- data/lib/rubygems/request/connection_pools.rb +24 -13
- data/lib/rubygems/request/http_pool.rb +3 -4
- data/lib/rubygems/request/https_pool.rb +1 -3
- data/lib/rubygems/request.rb +17 -16
- data/lib/rubygems/request_set/gem_dependency_api.rb +46 -49
- data/lib/rubygems/request_set/lockfile/parser.rb +18 -29
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +9 -9
- data/lib/rubygems/request_set/lockfile.rb +12 -12
- data/lib/rubygems/request_set.rb +52 -25
- data/lib/rubygems/requirement.rb +32 -21
- data/lib/rubygems/resolver/activation_request.rb +6 -6
- data/lib/rubygems/resolver/api_set.rb +5 -6
- data/lib/rubygems/resolver/api_specification.rb +2 -3
- data/lib/rubygems/resolver/best_set.rb +5 -6
- data/lib/rubygems/resolver/composed_set.rb +5 -6
- data/lib/rubygems/resolver/conflict.rb +5 -5
- data/lib/rubygems/resolver/current_set.rb +1 -2
- data/lib/rubygems/resolver/dependency_request.rb +4 -4
- data/lib/rubygems/resolver/git_set.rb +5 -6
- data/lib/rubygems/resolver/git_specification.rb +4 -5
- data/lib/rubygems/resolver/index_set.rb +5 -6
- data/lib/rubygems/resolver/index_specification.rb +3 -4
- data/lib/rubygems/resolver/installed_specification.rb +3 -4
- data/lib/rubygems/resolver/installer_set.rb +12 -12
- data/lib/rubygems/resolver/local_specification.rb +1 -2
- data/lib/rubygems/resolver/lock_set.rb +5 -6
- data/lib/rubygems/resolver/lock_specification.rb +7 -8
- data/lib/rubygems/resolver/requirement_list.rb +1 -1
- data/lib/rubygems/resolver/set.rb +2 -2
- data/lib/rubygems/resolver/source_set.rb +4 -5
- data/lib/rubygems/resolver/spec_specification.rb +1 -2
- data/lib/rubygems/resolver/specification.rb +10 -7
- data/lib/rubygems/resolver/stats.rb +1 -1
- data/lib/rubygems/resolver/vendor_set.rb +4 -5
- data/lib/rubygems/resolver/vendor_specification.rb +2 -3
- data/lib/rubygems/resolver.rb +14 -16
- data/lib/rubygems/s3_uri_signer.rb +183 -0
- data/lib/rubygems/safe_yaml.rb +18 -10
- data/lib/rubygems/security/policies.rb +1 -2
- data/lib/rubygems/security/policy.rb +25 -25
- data/lib/rubygems/security/signer.rb +72 -24
- data/lib/rubygems/security/trust_dir.rb +10 -10
- data/lib/rubygems/security.rb +21 -22
- data/lib/rubygems/security_option.rb +0 -1
- data/lib/rubygems/server.rb +21 -21
- data/lib/rubygems/source/git.rb +9 -10
- data/lib/rubygems/source/installed.rb +3 -4
- data/lib/rubygems/source/local.rb +7 -7
- data/lib/rubygems/source/lock.rb +4 -4
- data/lib/rubygems/source/specific_file.rb +5 -5
- data/lib/rubygems/source/vendor.rb +2 -3
- data/lib/rubygems/source.rb +16 -25
- data/lib/rubygems/source_list.rb +2 -2
- data/lib/rubygems/source_local.rb +0 -1
- data/lib/rubygems/spec_fetcher.rb +5 -6
- data/lib/rubygems/specification.rb +219 -558
- data/lib/rubygems/specification_policy.rb +407 -0
- data/lib/rubygems/stub_specification.rb +12 -17
- data/lib/rubygems/test_case.rb +161 -75
- data/lib/rubygems/test_utilities.rb +20 -35
- data/lib/rubygems/text.rb +6 -6
- data/lib/rubygems/uninstaller.rb +38 -27
- data/lib/rubygems/uri_formatter.rb +1 -2
- data/lib/rubygems/user_interaction.rb +37 -89
- data/lib/rubygems/util/licenses.rb +27 -1
- data/lib/rubygems/util/list.rb +1 -1
- data/lib/rubygems/util.rb +32 -14
- data/lib/rubygems/validator.rb +4 -5
- data/lib/rubygems/version.rb +15 -15
- data/lib/rubygems/version_option.rb +2 -3
- data/lib/rubygems.rb +71 -102
- data/rubygems-update.gemspec +43 -0
- data/setup.rb +2 -8
- data/test/rubygems/ca_cert.pem +74 -65
- data/test/rubygems/client.pem +103 -45
- data/test/rubygems/rubygems_plugin.rb +0 -1
- data/test/rubygems/simple_gem.rb +1 -1
- data/test/rubygems/ssl_cert.pem +78 -17
- data/test/rubygems/ssl_key.pem +25 -13
- data/test/rubygems/test_bundled_ca.rb +1 -1
- data/test/rubygems/test_config.rb +7 -2
- data/test/rubygems/test_gem.rb +205 -132
- data/test/rubygems/test_gem_bundler_version_finder.rb +4 -0
- data/test/rubygems/test_gem_command.rb +0 -1
- data/test/rubygems/test_gem_command_manager.rb +18 -3
- data/test/rubygems/test_gem_commands_build_command.rb +220 -15
- data/test/rubygems/test_gem_commands_cert_command.rb +69 -8
- data/test/rubygems/test_gem_commands_check_command.rb +1 -1
- data/test/rubygems/test_gem_commands_cleanup_command.rb +27 -1
- data/test/rubygems/test_gem_commands_contents_command.rb +1 -2
- data/test/rubygems/test_gem_commands_dependency_command.rb +33 -34
- data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
- data/test/rubygems/test_gem_commands_fetch_command.rb +0 -1
- data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -1
- data/test/rubygems/test_gem_commands_help_command.rb +7 -4
- data/test/rubygems/test_gem_commands_info_command.rb +44 -0
- data/test/rubygems/test_gem_commands_install_command.rb +79 -12
- data/test/rubygems/test_gem_commands_lock_command.rb +0 -1
- data/test/rubygems/test_gem_commands_open_command.rb +29 -0
- data/test/rubygems/test_gem_commands_outdated_command.rb +0 -1
- data/test/rubygems/test_gem_commands_owner_command.rb +93 -57
- data/test/rubygems/test_gem_commands_pristine_command.rb +65 -30
- data/test/rubygems/test_gem_commands_push_command.rb +54 -0
- data/test/rubygems/test_gem_commands_query_command.rb +102 -100
- data/test/rubygems/test_gem_commands_search_command.rb +0 -1
- data/test/rubygems/test_gem_commands_server_command.rb +0 -1
- data/test/rubygems/test_gem_commands_setup_command.rb +50 -15
- data/test/rubygems/test_gem_commands_signin_command.rb +1 -1
- data/test/rubygems/test_gem_commands_sources_command.rb +0 -1
- data/test/rubygems/test_gem_commands_specification_command.rb +2 -3
- data/test/rubygems/test_gem_commands_stale_command.rb +3 -2
- data/test/rubygems/test_gem_commands_uninstall_command.rb +161 -8
- data/test/rubygems/test_gem_commands_unpack_command.rb +17 -1
- data/test/rubygems/test_gem_commands_update_command.rb +19 -2
- data/test/rubygems/test_gem_commands_which_command.rb +0 -1
- data/test/rubygems/test_gem_commands_yank_command.rb +0 -1
- data/test/rubygems/test_gem_config_file.rb +4 -2
- data/test/rubygems/test_gem_dependency.rb +0 -1
- data/test/rubygems/test_gem_dependency_installer.rb +8 -5
- data/test/rubygems/test_gem_dependency_list.rb +6 -7
- data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -1
- data/test/rubygems/test_gem_doctor.rb +1 -2
- data/test/rubygems/test_gem_ext_builder.rb +10 -23
- data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -4
- data/test/rubygems/test_gem_ext_configure_builder.rb +3 -3
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +8 -9
- data/test/rubygems/test_gem_ext_rake_builder.rb +20 -5
- data/test/rubygems/test_gem_gem_runner.rb +0 -1
- data/test/rubygems/test_gem_gemcutter_utilities.rb +32 -6
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -1
- data/test/rubygems/test_gem_indexer.rb +16 -10
- data/test/rubygems/test_gem_install_update_options.rb +1 -20
- data/test/rubygems/test_gem_installer.rb +154 -119
- data/test/rubygems/test_gem_local_remote_options.rb +3 -3
- data/test/rubygems/test_gem_name_tuple.rb +0 -1
- data/test/rubygems/test_gem_package.rb +77 -31
- data/test/rubygems/test_gem_package_old.rb +0 -1
- data/test/rubygems/test_gem_package_tar_header.rb +42 -2
- data/test/rubygems/test_gem_package_tar_reader.rb +0 -1
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +11 -0
- data/test/rubygems/test_gem_package_tar_writer.rb +43 -7
- data/test/rubygems/test_gem_package_task.rb +2 -2
- data/test/rubygems/test_gem_path_support.rb +28 -11
- data/test/rubygems/test_gem_platform.rb +4 -5
- data/test/rubygems/test_gem_rdoc.rb +1 -136
- data/test/rubygems/test_gem_remote_fetcher.rb +241 -141
- data/test/rubygems/test_gem_request.rb +9 -9
- data/test/rubygems/test_gem_request_connection_pools.rb +24 -3
- data/test/rubygems/test_gem_request_set.rb +5 -5
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +82 -64
- data/test/rubygems/test_gem_request_set_lockfile.rb +1 -2
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +4 -9
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -1
- data/test/rubygems/test_gem_requirement.rb +24 -4
- data/test/rubygems/test_gem_resolver.rb +13 -17
- data/test/rubygems/test_gem_resolver_activation_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_api_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_best_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_composed_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_conflict.rb +0 -1
- data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_git_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_index_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_installer_set.rb +2 -3
- data/test/rubygems/test_gem_resolver_local_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -1
- data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -1
- data/test/rubygems/test_gem_resolver_specification.rb +1 -2
- data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -1
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -1
- data/test/rubygems/test_gem_security.rb +1 -3
- data/test/rubygems/test_gem_security_policy.rb +5 -6
- data/test/rubygems/test_gem_security_signer.rb +4 -3
- data/test/rubygems/test_gem_security_trust_dir.rb +1 -2
- data/test/rubygems/test_gem_server.rb +4 -4
- data/test/rubygems/test_gem_source.rb +0 -13
- data/test/rubygems/test_gem_source_fetch_problem.rb +0 -1
- data/test/rubygems/test_gem_source_git.rb +0 -1
- data/test/rubygems/test_gem_source_installed.rb +0 -1
- data/test/rubygems/test_gem_source_lock.rb +0 -1
- data/test/rubygems/test_gem_source_vendor.rb +0 -1
- data/test/rubygems/test_gem_spec_fetcher.rb +0 -1
- data/test/rubygems/test_gem_specification.rb +366 -198
- data/test/rubygems/test_gem_stream_ui.rb +15 -32
- data/test/rubygems/test_gem_stub_specification.rb +0 -2
- data/test/rubygems/test_gem_text.rb +4 -0
- data/test/rubygems/test_gem_uninstaller.rb +42 -3
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -1
- data/test/rubygems/test_gem_uri_formatter.rb +0 -1
- data/test/rubygems/test_gem_util.rb +31 -11
- data/test/rubygems/test_gem_validator.rb +0 -1
- data/test/rubygems/test_gem_version.rb +11 -11
- data/test/rubygems/test_gem_version_option.rb +0 -1
- data/test/rubygems/test_remote_fetch_error.rb +0 -1
- data/test/rubygems/test_require.rb +67 -52
- data/util/CL2notes +1 -2
- data/util/ci +20 -12
- data/util/cops/deprecations.rb +52 -0
- data/util/create_certs.rb +6 -7
- data/util/create_certs.sh +27 -0
- data/util/create_encrypted_key.rb +4 -5
- data/util/patch_with_prs.rb +1 -1
- data/util/rubocop +8 -0
- data/util/update_bundled_ca_certificates.rb +12 -13
- data/util/update_changelog.rb +1 -1
- metadata +61 -51
- data/.autotest +0 -71
- data/.document +0 -5
- data/CONTRIBUTING.rdoc +0 -130
- data/CVE-2013-4287.txt +0 -35
- data/CVE-2013-4363.txt +0 -45
- data/CVE-2015-3900.txt +0 -40
- data/POLICIES.rdoc +0 -74
- data/test/rubygems/fix_openssl_warnings.rb +0 -13
data/bundler/lib/bundler/cli.rb
CHANGED
@@ -166,6 +166,17 @@ module Bundler
|
|
166
166
|
Check.new(options).run
|
167
167
|
end
|
168
168
|
|
169
|
+
desc "remove [GEM [GEM ...]]", "Removes gems from the Gemfile"
|
170
|
+
long_desc <<-D
|
171
|
+
Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid. If the gem is not found, Bundler prints a error message and if gem could not be removed due to any reason Bundler will display a warning.
|
172
|
+
D
|
173
|
+
method_option "install", :type => :boolean, :banner =>
|
174
|
+
"Runs 'bundle install' after removing the gems from the Gemfile"
|
175
|
+
def remove(*gems)
|
176
|
+
require "bundler/cli/remove"
|
177
|
+
Remove.new(gems, options).run
|
178
|
+
end
|
179
|
+
|
169
180
|
desc "install [OPTIONS]", "Install the current environment to the system"
|
170
181
|
long_desc <<-D
|
171
182
|
Install will install all of the gems in the current bundle, making them available
|
@@ -195,8 +206,7 @@ module Bundler
|
|
195
206
|
"Do not attempt to fetch gems remotely and use the gem cache instead"
|
196
207
|
deprecated_option "no-cache", :type => :boolean, :banner =>
|
197
208
|
"Don't update the existing gem cache."
|
198
|
-
method_option "redownload", :type => :boolean, :aliases =>
|
199
|
-
[Bundler.feature_flag.forget_cli_options? ? nil : "--force"].compact, :banner =>
|
209
|
+
method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
|
200
210
|
"Force downloading every gem."
|
201
211
|
deprecated_option "no-prune", :type => :boolean, :banner =>
|
202
212
|
"Don't remove stale gems from the cache."
|
@@ -219,6 +229,7 @@ module Bundler
|
|
219
229
|
"Include gems that are part of the specified named group."
|
220
230
|
map "i" => "install"
|
221
231
|
def install
|
232
|
+
SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
|
222
233
|
require "bundler/cli/install"
|
223
234
|
Bundler.settings.temporary(:no_install => false) do
|
224
235
|
Install.new(options.dup).run
|
@@ -233,6 +244,8 @@ module Bundler
|
|
233
244
|
D
|
234
245
|
method_option "full-index", :type => :boolean, :banner =>
|
235
246
|
"Fall back to using the single-file index of all gems"
|
247
|
+
method_option "gemfile", :type => :string, :banner =>
|
248
|
+
"Use the specified gemfile instead of Gemfile"
|
236
249
|
method_option "group", :aliases => "-g", :type => :array, :banner =>
|
237
250
|
"Update a specific group"
|
238
251
|
method_option "jobs", :aliases => "-j", :type => :numeric, :banner =>
|
@@ -243,7 +256,7 @@ module Bundler
|
|
243
256
|
"Only output warnings and errors."
|
244
257
|
method_option "source", :type => :array, :banner =>
|
245
258
|
"Update a specific source (and all gems associated with it)"
|
246
|
-
method_option "
|
259
|
+
method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
|
247
260
|
"Force downloading every gem."
|
248
261
|
method_option "ruby", :type => :boolean, :banner =>
|
249
262
|
"Update ruby specified in Gemfile.lock"
|
@@ -262,6 +275,7 @@ module Bundler
|
|
262
275
|
method_option "all", :type => :boolean, :banner =>
|
263
276
|
"Update everything."
|
264
277
|
def update(*gems)
|
278
|
+
SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
|
265
279
|
require "bundler/cli/update"
|
266
280
|
Update.new(options, gems).run
|
267
281
|
end
|
@@ -276,7 +290,21 @@ module Bundler
|
|
276
290
|
method_option "outdated", :type => :boolean,
|
277
291
|
:banner => "Show verbose output including whether gems are outdated."
|
278
292
|
def show(gem_name = nil)
|
279
|
-
|
293
|
+
if ARGV[0] == "show"
|
294
|
+
rest = ARGV[1..-1]
|
295
|
+
|
296
|
+
new_command = rest.find {|arg| !arg.start_with?("--") } ? "info" : "list"
|
297
|
+
|
298
|
+
new_arguments = rest.map do |arg|
|
299
|
+
next arg if arg != "--paths"
|
300
|
+
next "--path" if new_command == "info"
|
301
|
+
end
|
302
|
+
|
303
|
+
old_argv = ARGV.join(" ")
|
304
|
+
new_argv = [new_command, *new_arguments.compact].join(" ")
|
305
|
+
|
306
|
+
Bundler::SharedHelpers.major_deprecation(2, "use `bundle #{new_argv}` instead of `bundle #{old_argv}`")
|
307
|
+
end
|
280
308
|
require "bundler/cli/show"
|
281
309
|
Show.new(options, gem_name).run
|
282
310
|
end
|
@@ -285,6 +313,9 @@ module Bundler
|
|
285
313
|
if Bundler.feature_flag.list_command?
|
286
314
|
desc "list", "List all gems in the bundle"
|
287
315
|
method_option "name-only", :type => :boolean, :banner => "print only the gem names"
|
316
|
+
method_option "only-group", :type => :string, :banner => "print gems from a particular group"
|
317
|
+
method_option "without-group", :type => :string, :banner => "print all gems expect from a group"
|
318
|
+
method_option "paths", :type => :boolean, :banner => "print the path to each gem in the bundle"
|
288
319
|
def list
|
289
320
|
require "bundler/cli/list"
|
290
321
|
List.new(options).run
|
@@ -316,6 +347,8 @@ module Bundler
|
|
316
347
|
"Specify a different shebang executable name than the default (usually 'ruby')"
|
317
348
|
method_option "standalone", :type => :boolean, :banner =>
|
318
349
|
"Make binstubs that can work without the Bundler runtime"
|
350
|
+
method_option "all", :type => :boolean, :banner =>
|
351
|
+
"Install binstubs for all gems"
|
319
352
|
def binstubs(*gems)
|
320
353
|
require "bundler/cli/binstubs"
|
321
354
|
Binstubs.new(options, gems).run
|
@@ -328,10 +361,13 @@ module Bundler
|
|
328
361
|
method_option "version", :aliases => "-v", :type => :string
|
329
362
|
method_option "group", :aliases => "-g", :type => :string
|
330
363
|
method_option "source", :aliases => "-s", :type => :string
|
331
|
-
|
332
|
-
|
364
|
+
method_option "skip-install", :type => :boolean, :banner =>
|
365
|
+
"Adds gem to the Gemfile but does not install it"
|
366
|
+
method_option "optimistic", :type => :boolean, :banner => "Adds optimistic declaration of version to gem"
|
367
|
+
method_option "strict", :type => :boolean, :banner => "Adds strict declaration of version to gem"
|
368
|
+
def add(*gems)
|
333
369
|
require "bundler/cli/add"
|
334
|
-
Add.new(options.dup,
|
370
|
+
Add.new(options.dup, gems).run
|
335
371
|
end
|
336
372
|
|
337
373
|
desc "outdated GEM [OPTIONS]", "List installed gems with newer versions available"
|
@@ -362,6 +398,8 @@ module Bundler
|
|
362
398
|
method_option "filter-patch", :type => :boolean, :banner => "Only list patch newer versions"
|
363
399
|
method_option "parseable", :aliases => "--porcelain", :type => :boolean, :banner =>
|
364
400
|
"Use minimal formatting for more parseable output"
|
401
|
+
method_option "only-explicit", :type => :boolean, :banner =>
|
402
|
+
"Only list gems specified in your Gemfile, not their dependencies"
|
365
403
|
def outdated(*gems)
|
366
404
|
require "bundler/cli/outdated"
|
367
405
|
Outdated.new(options, gems).run
|
@@ -413,6 +451,7 @@ module Bundler
|
|
413
451
|
|
414
452
|
desc "exec [OPTIONS]", "Run the command in context of the bundle"
|
415
453
|
method_option :keep_file_descriptors, :type => :boolean, :default => false
|
454
|
+
method_option :gemfile, :type => :string, :required => false
|
416
455
|
long_desc <<-D
|
417
456
|
Exec runs a command, providing it access to the gems in the bundle. While using
|
418
457
|
bundle exec you can require and call the bundled gems as if they were installed
|
@@ -485,20 +524,23 @@ module Bundler
|
|
485
524
|
end
|
486
525
|
end
|
487
526
|
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
527
|
+
if Bundler.feature_flag.viz_command?
|
528
|
+
desc "viz [OPTIONS]", "Generates a visual dependency graph", :hide => true
|
529
|
+
long_desc <<-D
|
530
|
+
Viz generates a PNG file of the current Gemfile as a dependency graph.
|
531
|
+
Viz requires the ruby-graphviz gem (and its dependencies).
|
532
|
+
The associated gems must also be installed via 'bundle install'.
|
533
|
+
D
|
534
|
+
method_option :file, :type => :string, :default => "gem_graph", :aliases => "-f", :desc => "The name to use for the generated file. see format option"
|
535
|
+
method_option :format, :type => :string, :default => "png", :aliases => "-F", :desc => "This is output format option. Supported format is png, jpg, svg, dot ..."
|
536
|
+
method_option :requirements, :type => :boolean, :default => false, :aliases => "-R", :desc => "Set to show the version of each required dependency."
|
537
|
+
method_option :version, :type => :boolean, :default => false, :aliases => "-v", :desc => "Set to show each gem version."
|
538
|
+
method_option :without, :type => :array, :default => [], :aliases => "-W", :banner => "GROUP[ GROUP...]", :desc => "Exclude gems that are part of the specified named group."
|
539
|
+
def viz
|
540
|
+
SharedHelpers.major_deprecation 2, "The `viz` command has been moved to the `bundle-viz` gem, see https://github.com/bundler/bundler-viz"
|
541
|
+
require "bundler/cli/viz"
|
542
|
+
Viz.new(options.dup).run
|
543
|
+
end
|
502
544
|
end
|
503
545
|
|
504
546
|
old_gem = instance_method(:gem)
|
@@ -9,7 +9,6 @@ module Bundler
|
|
9
9
|
|
10
10
|
attr_reader(
|
11
11
|
:dependencies,
|
12
|
-
:gem_version_promoter,
|
13
12
|
:locked_deps,
|
14
13
|
:locked_gems,
|
15
14
|
:platforms,
|
@@ -125,25 +124,25 @@ module Bundler
|
|
125
124
|
@unlock[:gems] = @locked_specs.for(eager_unlock, [], false, false, false).map(&:name)
|
126
125
|
end
|
127
126
|
|
128
|
-
@gem_version_promoter = create_gem_version_promoter
|
129
|
-
|
130
127
|
@dependency_changes = converge_dependencies
|
131
128
|
@local_changes = converge_locals
|
132
129
|
|
133
130
|
@requires = compute_requires
|
134
131
|
end
|
135
132
|
|
136
|
-
def
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
133
|
+
def gem_version_promoter
|
134
|
+
@gem_version_promoter ||= begin
|
135
|
+
locked_specs =
|
136
|
+
if unlocking? && @locked_specs.empty? && !@lockfile_contents.empty?
|
137
|
+
# Definition uses an empty set of locked_specs to indicate all gems
|
138
|
+
# are unlocked, but GemVersionPromoter needs the locked_specs
|
139
|
+
# for conservative comparison.
|
140
|
+
Bundler::SpecSet.new(@locked_gems.specs)
|
141
|
+
else
|
142
|
+
@locked_specs
|
143
|
+
end
|
144
|
+
GemVersionPromoter.new(locked_specs, @unlock[:gems])
|
145
|
+
end
|
147
146
|
end
|
148
147
|
|
149
148
|
def resolve_with_cache!
|
@@ -214,7 +213,7 @@ module Bundler
|
|
214
213
|
@index = nil
|
215
214
|
@resolve = nil
|
216
215
|
@specs = nil
|
217
|
-
@gem_version_promoter =
|
216
|
+
@gem_version_promoter = nil
|
218
217
|
|
219
218
|
Bundler.ui.debug "The definition is missing dependencies, failed to resolve & materialize locally (#{e})"
|
220
219
|
true
|
@@ -885,7 +884,7 @@ module Bundler
|
|
885
884
|
dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
|
886
885
|
next if !remote && !dep.current_platform?
|
887
886
|
platforms = dep.gem_platforms(sorted_platforms)
|
888
|
-
if platforms.empty?
|
887
|
+
if platforms.empty? && !Bundler.settings[:disable_platform_warnings]
|
889
888
|
mapped_platforms = dep.platforms.map {|p| Dependency::PLATFORM_MAP[p] }
|
890
889
|
Bundler.ui.warn \
|
891
890
|
"The dependency #{dep} will be unused by any of the platforms Bundler is installing for. " \
|
@@ -7,8 +7,7 @@ require "bundler/rubygems_ext"
|
|
7
7
|
module Bundler
|
8
8
|
class Dependency < Gem::Dependency
|
9
9
|
attr_reader :autorequire
|
10
|
-
attr_reader :groups
|
11
|
-
attr_reader :platforms
|
10
|
+
attr_reader :groups, :platforms, :gemfile
|
12
11
|
|
13
12
|
PLATFORM_MAP = {
|
14
13
|
:ruby => Gem::Platform::RUBY,
|
@@ -88,6 +87,7 @@ module Bundler
|
|
88
87
|
@platforms = Array(options["platforms"])
|
89
88
|
@env = options["env"]
|
90
89
|
@should_include = options.fetch("should_include", true)
|
90
|
+
@gemfile = options["gemfile"]
|
91
91
|
|
92
92
|
@autorequire = Array(options["require"] || []) if options.key?("require")
|
93
93
|
end
|
data/bundler/lib/bundler/dsl.rb
CHANGED
@@ -16,7 +16,7 @@ module Bundler
|
|
16
16
|
VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
|
17
17
|
|
18
18
|
VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
|
19
|
-
platform platforms type source install_if].freeze
|
19
|
+
platform platforms type source install_if gemfile].freeze
|
20
20
|
|
21
21
|
attr_reader :gemspecs
|
22
22
|
attr_accessor :dependencies
|
@@ -93,6 +93,7 @@ module Bundler
|
|
93
93
|
|
94
94
|
def gem(name, *args)
|
95
95
|
options = args.last.is_a?(Hash) ? args.pop.dup : {}
|
96
|
+
options["gemfile"] = @gemfile
|
96
97
|
version = args || [">= 0"]
|
97
98
|
|
98
99
|
normalize_options(name, version, options)
|
@@ -106,13 +107,28 @@ module Bundler
|
|
106
107
|
if current.requirement != dep.requirement
|
107
108
|
unless deleted_dep
|
108
109
|
return if dep.type == :development
|
110
|
+
|
111
|
+
update_prompt = ""
|
112
|
+
|
113
|
+
if File.basename(@gemfile) == Injector::INJECTED_GEMS
|
114
|
+
if dep.requirements_list.include?(">= 0") && !current.requirements_list.include?(">= 0")
|
115
|
+
update_prompt = ". Gem already added"
|
116
|
+
else
|
117
|
+
update_prompt = ". If you want to update the gem version, run `bundle update #{current.name}`"
|
118
|
+
|
119
|
+
update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current.requirements_list.include?(">= 0")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
109
123
|
raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
|
110
|
-
"You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})"
|
124
|
+
"You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
|
125
|
+
"#{update_prompt}"
|
111
126
|
end
|
112
127
|
|
113
128
|
else
|
114
129
|
Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
|
115
130
|
"You should probably keep only one of them.\n" \
|
131
|
+
"Remove any duplicate entries and specify the gem only once (per group).\n" \
|
116
132
|
"While it's not a problem now, it could cause errors if you change the version of one of them later."
|
117
133
|
end
|
118
134
|
|
@@ -289,7 +305,7 @@ module Bundler
|
|
289
305
|
# end
|
290
306
|
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
|
291
307
|
# TODO: 2.0 upgrade this setting to the default
|
292
|
-
if Bundler.
|
308
|
+
if Bundler.feature_flag.github_https?
|
293
309
|
Bundler::SharedHelpers.major_deprecation 2, "The `github.https` setting will be removed"
|
294
310
|
"https://github.com/#{repo_name}.git"
|
295
311
|
else
|
@@ -30,6 +30,7 @@ module Bundler
|
|
30
30
|
settings_flag(:allow_bundler_dependency_conflicts) { bundler_2_mode? }
|
31
31
|
settings_flag(:allow_offline_install) { bundler_2_mode? }
|
32
32
|
settings_flag(:auto_clean_without_path) { bundler_2_mode? }
|
33
|
+
settings_flag(:auto_config_jobs) { bundler_2_mode? }
|
33
34
|
settings_flag(:cache_all) { bundler_2_mode? }
|
34
35
|
settings_flag(:cache_command_is_package) { bundler_2_mode? }
|
35
36
|
settings_flag(:console_command) { !bundler_2_mode? }
|
@@ -38,11 +39,13 @@ module Bundler
|
|
38
39
|
settings_flag(:disable_multisource) { bundler_2_mode? }
|
39
40
|
settings_flag(:error_on_stderr) { bundler_2_mode? }
|
40
41
|
settings_flag(:forget_cli_options) { bundler_2_mode? }
|
42
|
+
settings_flag(:global_path_appends_ruby_scope) { bundler_2_mode? }
|
41
43
|
settings_flag(:global_gem_cache) { bundler_2_mode? }
|
42
44
|
settings_flag(:init_gems_rb) { bundler_2_mode? }
|
43
45
|
settings_flag(:list_command) { bundler_2_mode? }
|
44
46
|
settings_flag(:lockfile_uses_separate_rubygems_sources) { bundler_2_mode? }
|
45
47
|
settings_flag(:only_update_to_newer_versions) { bundler_2_mode? }
|
48
|
+
settings_flag(:path_relative_to_cwd) { bundler_2_mode? }
|
46
49
|
settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
|
47
50
|
settings_flag(:prefer_gems_rb) { bundler_2_mode? }
|
48
51
|
settings_flag(:print_only_version_number) { bundler_2_mode? }
|
@@ -52,9 +55,13 @@ module Bundler
|
|
52
55
|
settings_flag(:suppress_install_using_messages) { bundler_2_mode? }
|
53
56
|
settings_flag(:unlock_source_unlocks_spec) { !bundler_2_mode? }
|
54
57
|
settings_flag(:update_requires_all_flag) { bundler_2_mode? }
|
58
|
+
settings_flag(:use_gem_version_promoter_for_major_updates) { bundler_2_mode? }
|
59
|
+
settings_flag(:viz_command) { !bundler_2_mode? }
|
55
60
|
|
56
61
|
settings_option(:default_cli_command) { bundler_2_mode? ? :cli_help : :install }
|
57
62
|
|
63
|
+
settings_method(:github_https?, "github.https") { bundler_2_mode? }
|
64
|
+
|
58
65
|
def initialize(bundler_version)
|
59
66
|
@bundler_version = Gem::Version.create(bundler_version)
|
60
67
|
end
|
@@ -7,6 +7,8 @@ module Bundler
|
|
7
7
|
# available dependency versions as found in its index, before returning it to
|
8
8
|
# to the resolution engine to select the best version.
|
9
9
|
class GemVersionPromoter
|
10
|
+
DEBUG = ENV["DEBUG_RESOLVER"]
|
11
|
+
|
10
12
|
attr_reader :level, :locked_specs, :unlock_gems
|
11
13
|
|
12
14
|
# By default, strict is false, meaning every available version of a gem
|
@@ -64,7 +66,7 @@ module Bundler
|
|
64
66
|
# @return [SpecGroup] A new instance of the SpecGroup Array sorted and
|
65
67
|
# possibly filtered.
|
66
68
|
def sort_versions(dep, spec_groups)
|
67
|
-
before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if
|
69
|
+
before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG
|
68
70
|
|
69
71
|
@sort_versions[dep] ||= begin
|
70
72
|
gem_name = dep.name
|
@@ -78,7 +80,7 @@ module Bundler
|
|
78
80
|
else
|
79
81
|
sort_dep_specs(spec_groups, locked_spec)
|
80
82
|
end.tap do |specs|
|
81
|
-
if
|
83
|
+
if DEBUG
|
82
84
|
STDERR.puts before_result
|
83
85
|
STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
|
84
86
|
end
|
@@ -2,13 +2,20 @@
|
|
2
2
|
|
3
3
|
module Bundler
|
4
4
|
class Injector
|
5
|
+
INJECTED_GEMS = "injected gems".freeze
|
6
|
+
|
5
7
|
def self.inject(new_deps, options = {})
|
6
8
|
injector = new(new_deps, options)
|
7
9
|
injector.inject(Bundler.default_gemfile, Bundler.default_lockfile)
|
8
10
|
end
|
9
11
|
|
10
|
-
def
|
11
|
-
|
12
|
+
def self.remove(gems, options = {})
|
13
|
+
injector = new(gems, options)
|
14
|
+
injector.remove(Bundler.default_gemfile, Bundler.default_lockfile)
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(deps, options = {})
|
18
|
+
@deps = deps
|
12
19
|
@options = options
|
13
20
|
end
|
14
21
|
|
@@ -28,18 +35,19 @@ module Bundler
|
|
28
35
|
builder.eval_gemfile(gemfile_path)
|
29
36
|
|
30
37
|
# don't inject any gems that are already in the Gemfile
|
31
|
-
@
|
38
|
+
@deps -= builder.dependencies
|
32
39
|
|
33
40
|
# add new deps to the end of the in-memory Gemfile
|
34
|
-
# Set conservative versioning to false because
|
35
|
-
|
41
|
+
# Set conservative versioning to false because
|
42
|
+
# we want to let the resolver resolve the version first
|
43
|
+
builder.eval_gemfile(INJECTED_GEMS, build_gem_lines(false)) if @deps.any?
|
36
44
|
|
37
45
|
# resolve to see if the new deps broke anything
|
38
46
|
@definition = builder.to_definition(lockfile_path, {})
|
39
47
|
@definition.resolve_remotely!
|
40
48
|
|
41
49
|
# since nothing broke, we can add those gems to the gemfile
|
42
|
-
append_to(gemfile_path, build_gem_lines(@options[:conservative_versioning])) if @
|
50
|
+
append_to(gemfile_path, build_gem_lines(@options[:conservative_versioning])) if @deps.any?
|
43
51
|
|
44
52
|
# since we resolved successfully, write out the lockfile
|
45
53
|
@definition.lock(Bundler.default_lockfile)
|
@@ -48,7 +56,21 @@ module Bundler
|
|
48
56
|
Bundler.reset_paths!
|
49
57
|
|
50
58
|
# return an array of the deps that we added
|
51
|
-
@
|
59
|
+
@deps
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
|
64
|
+
# @param [Pathname] lockfile_path The lockfile from which to remove dependencies.
|
65
|
+
# @return [Array]
|
66
|
+
def remove(gemfile_path, lockfile_path)
|
67
|
+
# remove gems from each gemfiles we have
|
68
|
+
Bundler.definition.gemfiles.each do |path|
|
69
|
+
deps = remove_deps(path)
|
70
|
+
|
71
|
+
show_warning("No gems were removed from the gemfile.") if deps.empty?
|
72
|
+
|
73
|
+
deps.each {|dep| Bundler.ui.confirm "#{SharedHelpers.pretty_dependency(dep, false)} was removed." }
|
52
74
|
end
|
53
75
|
end
|
54
76
|
|
@@ -61,11 +83,21 @@ module Bundler
|
|
61
83
|
seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2
|
62
84
|
|
63
85
|
prerelease_suffix = version.to_s.gsub(version.release.to_s, "") if version.prerelease?
|
64
|
-
"
|
86
|
+
"#{version_prefix}#{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def version_prefix
|
90
|
+
if @options[:strict]
|
91
|
+
"= "
|
92
|
+
elsif @options[:optimistic]
|
93
|
+
">= "
|
94
|
+
else
|
95
|
+
"~> "
|
96
|
+
end
|
65
97
|
end
|
66
98
|
|
67
99
|
def build_gem_lines(conservative_versioning)
|
68
|
-
@
|
100
|
+
@deps.map do |d|
|
69
101
|
name = d.name.dump
|
70
102
|
|
71
103
|
requirement = if conservative_versioning
|
@@ -90,5 +122,132 @@ module Bundler
|
|
90
122
|
f.puts new_gem_lines
|
91
123
|
end
|
92
124
|
end
|
125
|
+
|
126
|
+
# evalutes a gemfile to remove the specified gem
|
127
|
+
# from it.
|
128
|
+
def remove_deps(gemfile_path)
|
129
|
+
initial_gemfile = IO.readlines(gemfile_path)
|
130
|
+
|
131
|
+
Bundler.ui.info "Removing gems from #{gemfile_path}"
|
132
|
+
|
133
|
+
# evaluate the Gemfile we have
|
134
|
+
builder = Dsl.new
|
135
|
+
builder.eval_gemfile(gemfile_path)
|
136
|
+
|
137
|
+
removed_deps = remove_gems_from_dependencies(builder, @deps, gemfile_path)
|
138
|
+
|
139
|
+
# abort the opertion if no gems were removed
|
140
|
+
# no need to operate on gemfile furthur
|
141
|
+
return [] if removed_deps.empty?
|
142
|
+
|
143
|
+
cleaned_gemfile = remove_gems_from_gemfile(@deps, gemfile_path)
|
144
|
+
|
145
|
+
SharedHelpers.write_to_gemfile(gemfile_path, cleaned_gemfile)
|
146
|
+
|
147
|
+
# check for errors
|
148
|
+
# including extra gems being removed
|
149
|
+
# or some gems not being removed
|
150
|
+
# and return the actual removed deps
|
151
|
+
cross_check_for_errors(gemfile_path, builder.dependencies, removed_deps, initial_gemfile)
|
152
|
+
end
|
153
|
+
|
154
|
+
# @param [Dsl] builder Dsl object of current Gemfile.
|
155
|
+
# @param [Array] gems Array of names of gems to be removed.
|
156
|
+
# @param [Pathname] path of the Gemfile
|
157
|
+
# @return [Array] removed_deps Array of removed dependencies.
|
158
|
+
def remove_gems_from_dependencies(builder, gems, gemfile_path)
|
159
|
+
removed_deps = []
|
160
|
+
|
161
|
+
gems.each do |gem_name|
|
162
|
+
deleted_dep = builder.dependencies.find {|d| d.name == gem_name }
|
163
|
+
|
164
|
+
if deleted_dep.nil?
|
165
|
+
raise GemfileError, "`#{gem_name}` is not specified in #{gemfile_path} so it could not be removed."
|
166
|
+
end
|
167
|
+
|
168
|
+
builder.dependencies.delete(deleted_dep)
|
169
|
+
|
170
|
+
removed_deps << deleted_dep
|
171
|
+
end
|
172
|
+
|
173
|
+
removed_deps
|
174
|
+
end
|
175
|
+
|
176
|
+
# @param [Array] gems Array of names of gems to be removed.
|
177
|
+
# @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
|
178
|
+
def remove_gems_from_gemfile(gems, gemfile_path)
|
179
|
+
patterns = /gem\s+(['"])#{Regexp.union(gems)}\1|gem\s*\((['"])#{Regexp.union(gems)}\2\)/
|
180
|
+
|
181
|
+
# remove lines which match the regex
|
182
|
+
new_gemfile = IO.readlines(gemfile_path).reject {|line| line.match(patterns) }
|
183
|
+
|
184
|
+
# remove lone \n and append them with other strings
|
185
|
+
new_gemfile.each_with_index do |_line, index|
|
186
|
+
if new_gemfile[index + 1] == "\n"
|
187
|
+
new_gemfile[index] += new_gemfile[index + 1]
|
188
|
+
new_gemfile.delete_at(index + 1)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
%w[group source env install_if].each {|block| remove_nested_blocks(new_gemfile, block) }
|
193
|
+
|
194
|
+
new_gemfile.join.chomp
|
195
|
+
end
|
196
|
+
|
197
|
+
# @param [Array] gemfile Array of gemfile contents.
|
198
|
+
# @param [String] block_name Name of block name to look for.
|
199
|
+
def remove_nested_blocks(gemfile, block_name)
|
200
|
+
nested_blocks = 0
|
201
|
+
|
202
|
+
# count number of nested blocks
|
203
|
+
gemfile.each_with_index {|line, index| nested_blocks += 1 if !gemfile[index + 1].nil? && gemfile[index + 1].include?(block_name) && line.include?(block_name) }
|
204
|
+
|
205
|
+
while nested_blocks >= 0
|
206
|
+
nested_blocks -= 1
|
207
|
+
|
208
|
+
gemfile.each_with_index do |line, index|
|
209
|
+
next unless !line.nil? && line.include?(block_name)
|
210
|
+
if gemfile[index + 1] =~ /^\s*end\s*$/
|
211
|
+
gemfile[index] = nil
|
212
|
+
gemfile[index + 1] = nil
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
gemfile.compact!
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
|
221
|
+
# @param [Array] original_deps Array of original dependencies.
|
222
|
+
# @param [Array] removed_deps Array of removed dependencies.
|
223
|
+
# @param [Array] initial_gemfile Contents of original Gemfile before any operation.
|
224
|
+
def cross_check_for_errors(gemfile_path, original_deps, removed_deps, initial_gemfile)
|
225
|
+
# evalute the new gemfile to look for any failure cases
|
226
|
+
builder = Dsl.new
|
227
|
+
builder.eval_gemfile(gemfile_path)
|
228
|
+
|
229
|
+
# record gems which were removed but not requested
|
230
|
+
extra_removed_gems = original_deps - builder.dependencies
|
231
|
+
|
232
|
+
# if some extra gems were removed then raise error
|
233
|
+
# and revert Gemfile to original
|
234
|
+
unless extra_removed_gems.empty?
|
235
|
+
SharedHelpers.write_to_gemfile(gemfile_path, initial_gemfile.join)
|
236
|
+
|
237
|
+
raise InvalidOption, "Gems could not be removed. #{extra_removed_gems.join(", ")} would also have been removed. Bundler cannot continue."
|
238
|
+
end
|
239
|
+
|
240
|
+
# record gems which could not be removed due to some reasons
|
241
|
+
errored_deps = builder.dependencies.select {|d| d.gemfile == gemfile_path } & removed_deps.select {|d| d.gemfile == gemfile_path }
|
242
|
+
|
243
|
+
show_warning "#{errored_deps.map(&:name).join(", ")} could not be removed." unless errored_deps.empty?
|
244
|
+
|
245
|
+
# return actual removed dependencies
|
246
|
+
removed_deps - errored_deps
|
247
|
+
end
|
248
|
+
|
249
|
+
def show_warning(message)
|
250
|
+
Bundler.ui.info Bundler.ui.add_color(message, :yellow)
|
251
|
+
end
|
93
252
|
end
|
94
253
|
end
|
@@ -87,6 +87,7 @@ module Bundler
|
|
87
87
|
@force = force
|
88
88
|
@specs = all_specs.map {|s| SpecInstallation.new(s) }
|
89
89
|
@spec_set = all_specs
|
90
|
+
@rake = @specs.find {|s| s.name == "rake" }
|
90
91
|
end
|
91
92
|
|
92
93
|
def call
|
@@ -155,6 +156,7 @@ module Bundler
|
|
155
156
|
end
|
156
157
|
|
157
158
|
def do_install(spec_install, worker_num)
|
159
|
+
Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install)
|
158
160
|
gem_installer = Bundler::GemInstaller.new(
|
159
161
|
spec_install.spec, @installer, @standalone, worker_num, @force
|
160
162
|
)
|
@@ -170,6 +172,7 @@ module Bundler
|
|
170
172
|
spec_install.state = :failed
|
171
173
|
spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
|
172
174
|
end
|
175
|
+
Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
|
173
176
|
spec_install
|
174
177
|
end
|
175
178
|
|
@@ -218,6 +221,8 @@ module Bundler
|
|
218
221
|
# are installed.
|
219
222
|
def enqueue_specs
|
220
223
|
@specs.select(&:ready_to_enqueue?).each do |spec|
|
224
|
+
next if @rake && !@rake.installed? && spec.name != @rake.name
|
225
|
+
|
221
226
|
if spec.dependencies_installed? @specs
|
222
227
|
spec.state = :enqueued
|
223
228
|
worker_pool.enq spec
|