rubygems-update 4.0.21 → 4.1.0.beta1
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/CHANGELOG.md +590 -53
- data/CONTRIBUTING.md +66 -5
- data/MIT.txt +4 -3
- data/Manifest.txt +332 -375
- data/README.md +26 -6
- data/bundler.gemspec +63 -0
- data/doc/POLICIES.md +147 -0
- data/doc/UPGRADING.md +4 -4
- data/{bundler/lib → lib}/bundler/build_metadata.rb +2 -2
- data/{bundler/lib → lib}/bundler/checksum.rb +40 -25
- data/{bundler/lib → lib}/bundler/ci_detector.rb +1 -1
- data/{bundler/lib → lib}/bundler/cli/add.rb +3 -4
- data/{bundler/lib → lib}/bundler/cli/cache.rb +4 -0
- data/{bundler/lib → lib}/bundler/cli/clean.rb +5 -0
- data/{bundler/lib → lib}/bundler/cli/common.rb +37 -1
- data/{bundler/lib → lib}/bundler/cli/config.rb +4 -2
- data/{bundler/lib → lib}/bundler/cli/gem.rb +0 -17
- data/{bundler/lib → lib}/bundler/cli/install.rb +4 -5
- data/{bundler/lib → lib}/bundler/cli/lock.rb +1 -2
- data/{bundler/lib → lib}/bundler/cli/outdated.rb +8 -3
- data/{bundler/lib → lib}/bundler/cli/pristine.rb +2 -1
- data/{bundler/lib → lib}/bundler/cli/update.rb +21 -12
- data/{bundler/lib → lib}/bundler/cli.rb +14 -11
- data/{bundler/lib → lib}/bundler/definition.rb +61 -24
- data/{bundler/lib → lib}/bundler/dependency.rb +4 -0
- data/{bundler/lib → lib}/bundler/dsl.rb +77 -11
- data/{bundler/lib → lib}/bundler/endpoint_specification.rb +51 -14
- data/{bundler/lib → lib}/bundler/env.rb +7 -24
- data/{bundler/lib → lib}/bundler/errors.rb +34 -5
- data/{bundler/lib → lib}/bundler/fetcher/compact_index.rb +14 -5
- data/lib/bundler/fetcher/connection_pools.rb +150 -0
- data/{bundler/lib → lib}/bundler/fetcher/downloader.rb +31 -16
- data/{bundler/lib → lib}/bundler/fetcher.rb +8 -47
- data/{bundler/lib → lib}/bundler/injector.rb +3 -3
- data/{bundler/lib → lib}/bundler/inline.rb +44 -4
- data/{bundler/lib → lib}/bundler/installer/parallel_installer.rb +25 -30
- data/{bundler/lib → lib}/bundler/installer.rb +20 -6
- data/{bundler/lib → lib}/bundler/lazy_specification.rb +44 -17
- data/{bundler/lib → lib}/bundler/lockfile_generator.rb +24 -2
- data/{bundler/lib → lib}/bundler/lockfile_parser.rb +43 -5
- data/{bundler/lib → lib}/bundler/man/bundle-add.1 +7 -4
- data/{bundler/lib → lib}/bundler/man/bundle-add.1.ronn +8 -4
- data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-cache.1 +2 -2
- data/{bundler/lib → lib}/bundler/man/bundle-cache.1.ronn +2 -2
- data/{bundler/lib → lib}/bundler/man/bundle-check.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-clean.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-config.1 +38 -6
- data/{bundler/lib → lib}/bundler/man/bundle-config.1.ronn +143 -10
- data/{bundler/lib → lib}/bundler/man/bundle-console.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-doctor.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-env.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-exec.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-fund.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-gem.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-help.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-info.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-init.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-install.1 +2 -2
- data/{bundler/lib → lib}/bundler/man/bundle-install.1.ronn +4 -4
- data/{bundler/lib → lib}/bundler/man/bundle-issue.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-licenses.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-list.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-lock.1 +3 -3
- data/{bundler/lib → lib}/bundler/man/bundle-lock.1.ronn +5 -5
- data/{bundler/lib → lib}/bundler/man/bundle-open.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-outdated.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-platform.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-plugin.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-pristine.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-remove.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-show.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle-update.1 +3 -3
- data/{bundler/lib → lib}/bundler/man/bundle-update.1.ronn +3 -5
- data/{bundler/lib → lib}/bundler/man/bundle-version.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/bundle.1 +1 -1
- data/{bundler/lib → lib}/bundler/man/gemfile.5 +45 -1
- data/{bundler/lib → lib}/bundler/man/gemfile.5.ronn +53 -0
- data/lib/bundler/match_metadata.rb +50 -0
- data/{bundler/lib → lib}/bundler/match_platform.rb +25 -2
- data/lib/bundler/match_remote_metadata.rb +44 -0
- data/{bundler/lib → lib}/bundler/materialization.rb +2 -1
- data/lib/bundler/override.rb +69 -0
- data/{bundler/lib → lib}/bundler/plugin/dsl.rb +3 -5
- data/{bundler/lib → lib}/bundler/plugin/events.rb +55 -13
- data/{bundler/lib → lib}/bundler/plugin/index.rb +87 -11
- data/{bundler/lib → lib}/bundler/plugin/installer/path.rb +1 -1
- data/{bundler/lib → lib}/bundler/plugin/installer.rb +13 -5
- data/{bundler/lib → lib}/bundler/plugin.rb +58 -30
- data/{bundler/lib → lib}/bundler/remote_specification.rb +6 -3
- data/{bundler/lib → lib}/bundler/resolver/base.rb +2 -1
- data/{bundler/lib → lib}/bundler/resolver/incompatibility.rb +1 -1
- data/{bundler/lib → lib}/bundler/resolver.rb +73 -23
- data/{bundler/lib → lib}/bundler/ruby_version.rb +0 -2
- data/{bundler/lib → lib}/bundler/rubygems_ext.rb +71 -1
- data/{bundler/lib → lib}/bundler/rubygems_gem_installer.rb +41 -2
- data/{bundler/lib → lib}/bundler/rubygems_integration.rb +7 -2
- data/{bundler/lib → lib}/bundler/runtime.rb +69 -2
- data/{bundler/lib → lib}/bundler/self_manager.rb +9 -15
- data/{bundler/lib → lib}/bundler/settings.rb +373 -30
- data/{bundler/lib → lib}/bundler/shared_helpers.rb +2 -1
- data/{bundler/lib → lib}/bundler/source/git/git_proxy.rb +2 -10
- data/{bundler/lib → lib}/bundler/source/git.rb +15 -6
- data/{bundler/lib → lib}/bundler/source/path/installer.rb +1 -1
- data/{bundler/lib → lib}/bundler/source/rubygems/remote.rb +10 -5
- data/{bundler/lib → lib}/bundler/source/rubygems.rb +48 -12
- data/{bundler/lib → lib}/bundler/spec_set.rb +16 -4
- data/{bundler/lib → lib}/bundler/stub_specification.rb +2 -1
- data/{bundler/lib → lib}/bundler/templates/newgem/Gemfile.tt +4 -4
- data/{bundler/lib → lib}/bundler/templates/newgem/newgem.gemspec.tt +3 -3
- data/{bundler/lib → lib}/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -1
- data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +1 -1
- data/{bundler/lib → lib}/bundler/ui/shell.rb +0 -4
- data/{bundler/lib → lib}/bundler/ui/silent.rb +0 -4
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +35 -2
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/base.rb +2 -1
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/basic.rb +14 -6
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/color.rb +2 -0
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor.rb +34 -1
- data/lib/bundler/vendored_pub_grub.rb +7 -0
- data/lib/bundler/vendored_securerandom.rb +15 -0
- data/lib/bundler/vendored_uri.rb +21 -0
- data/{bundler/lib → lib}/bundler/version.rb +1 -1
- data/{bundler/lib → lib}/bundler/worker.rb +3 -2
- data/{bundler/lib → lib}/bundler.rb +1 -1
- data/lib/rubygems/basic_specification.rb +15 -14
- data/lib/rubygems/bundler_settings.rb +137 -0
- data/lib/rubygems/bundler_version_finder.rb +13 -55
- data/lib/rubygems/ci_detector.rb +1 -1
- data/lib/rubygems/commands/build_command.rb +8 -1
- data/lib/rubygems/commands/cert_command.rb +9 -7
- data/lib/rubygems/commands/contents_command.rb +1 -1
- data/lib/rubygems/commands/dependency_command.rb +15 -3
- data/lib/rubygems/commands/environment_command.rb +1 -0
- data/lib/rubygems/commands/exec_command.rb +3 -0
- data/lib/rubygems/commands/fetch_command.rb +1 -1
- data/lib/rubygems/commands/help_command.rb +3 -1
- data/lib/rubygems/commands/install_command.rb +13 -3
- data/lib/rubygems/commands/lock_command.rb +2 -2
- data/lib/rubygems/commands/outdated_command.rb +77 -2
- data/lib/rubygems/commands/owner_command.rb +1 -1
- data/lib/rubygems/commands/push_command.rb +159 -21
- data/lib/rubygems/commands/setup_command.rb +20 -23
- data/lib/rubygems/commands/signin_command.rb +3 -1
- data/lib/rubygems/commands/signout_command.rb +26 -6
- data/lib/rubygems/commands/specification_command.rb +1 -1
- data/lib/rubygems/commands/uninstall_command.rb +1 -1
- data/lib/rubygems/commands/update_command.rb +84 -2
- data/lib/rubygems/commands/yank_command.rb +10 -7
- data/lib/rubygems/compact_index_client/cache.rb +122 -0
- data/lib/rubygems/compact_index_client/cache_file.rb +147 -0
- data/lib/rubygems/compact_index_client/http_fetcher.rb +88 -0
- data/lib/rubygems/compact_index_client/parser.rb +90 -0
- data/lib/rubygems/compact_index_client/updater.rb +113 -0
- data/lib/rubygems/compact_index_client.rb +111 -0
- data/lib/rubygems/config_file.rb +304 -22
- data/lib/rubygems/content_address.rb +194 -0
- data/lib/rubygems/cooldown.rb +173 -0
- data/lib/rubygems/cooldown_option.rb +27 -0
- data/lib/rubygems/cooldown_settings.rb +57 -0
- data/lib/rubygems/credential_store/native/linux.rb +97 -0
- data/lib/rubygems/credential_store/native/macos.rb +88 -0
- data/lib/rubygems/credential_store/native/windows.rb +130 -0
- data/lib/rubygems/credential_store.rb +332 -0
- data/lib/rubygems/defaults.rb +9 -0
- data/lib/rubygems/dependency_installer.rb +15 -0
- data/lib/rubygems/doctor.rb +23 -6
- data/lib/rubygems/exceptions.rb +11 -43
- data/lib/rubygems/ext/builder.rb +70 -5
- data/lib/rubygems/ext/cargo_builder.rb +0 -9
- data/lib/rubygems/ext/ext_conf_builder.rb +8 -15
- data/lib/rubygems/gemcutter_utilities.rb +44 -2
- data/lib/rubygems/install_update_options.rb +16 -0
- data/lib/rubygems/installer.rb +90 -11
- data/lib/rubygems/installer_uninstaller_utils.rb +24 -3
- data/lib/rubygems/name_tuple.rb +55 -18
- data/lib/rubygems/package/old.rb +1 -1
- data/lib/rubygems/package.rb +200 -47
- data/lib/rubygems/package_task.rb +2 -2
- data/lib/rubygems/platform.rb +2 -2
- data/lib/rubygems/query_utils.rb +84 -24
- data/lib/rubygems/remote_fetcher.rb +65 -17
- data/lib/rubygems/request/connection_pools.rb +3 -0
- data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
- data/lib/rubygems/request_set/lockfile.rb +0 -2
- data/lib/rubygems/request_set.rb +105 -17
- data/lib/rubygems/resolver/api_set.rb +14 -26
- data/lib/rubygems/resolver/api_specification.rb +56 -15
- data/lib/rubygems/resolver/incompatibility.rb +10 -0
- data/lib/rubygems/resolver/index_specification.rb +6 -4
- data/lib/rubygems/resolver/installer_set.rb +2 -2
- data/lib/rubygems/resolver/lock_specification.rb +5 -1
- data/lib/rubygems/resolver/spec_specification.rb +4 -0
- data/lib/rubygems/resolver/specification.rb +16 -1
- data/lib/rubygems/resolver/strategy.rb +44 -0
- data/lib/rubygems/resolver.rb +471 -145
- data/lib/rubygems/safe_marshal.rb +2 -1
- data/lib/rubygems/safe_yaml.rb +20 -3
- data/lib/rubygems/security/policy.rb +11 -3
- data/lib/rubygems/security/signer.rb +15 -7
- data/lib/rubygems/security.rb +111 -17
- data/lib/rubygems/source/local.rb +7 -2
- data/lib/rubygems/source.rb +270 -23
- data/lib/rubygems/spec_fetcher.rb +47 -12
- data/lib/rubygems/specification.rb +76 -32
- data/lib/rubygems/specification_policy.rb +33 -6
- data/lib/rubygems/specification_record.rb +41 -2
- data/lib/rubygems/stub_specification.rb +39 -16
- data/lib/rubygems/uninstaller.rb +2 -0
- data/lib/rubygems/util/atomic_file_writer.rb +109 -0
- data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +2 -1
- data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +5 -6
- data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +8 -4
- data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +15 -1
- data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +2 -1
- data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +68 -0
- data/lib/rubygems/vendor/net-http/lib/net/http.rb +60 -49
- data/lib/rubygems/vendor/optparse/lib/optparse.rb +23 -30
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/assignment.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +7 -7
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/failure_writer.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/incompatibility.rb +4 -4
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/package.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/partial_solution.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/rubygems.rb +3 -3
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/solve_failure.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/static_package_source.rb +3 -3
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/strategy.rb +2 -2
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/term.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_constraint.rb +3 -3
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_range.rb +1 -1
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_solver.rb +2 -2
- data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/lib/pub_grub/version_union.rb +1 -1
- data/lib/rubygems/vendor/pub_grub/lib/pub_grub.rb +57 -0
- data/lib/rubygems/vendor/resolv/lib/resolv.rb +3508 -0
- data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +4 -0
- data/lib/rubygems/vendor/timeout/lib/timeout.rb +190 -77
- data/lib/rubygems/vendor/uri/lib/uri.rb +4 -0
- data/{bundler/lib/bundler → lib/rubygems}/vendored_pub_grub.rb +0 -1
- data/lib/rubygems/version.rb +129 -111
- data/lib/rubygems/version_option.rb +14 -0
- data/lib/rubygems/yaml_serializer.rb +853 -71
- data/lib/rubygems.rb +45 -11
- data/rubygems-update.gemspec +3 -4
- data/setup.rb +1 -0
- metadata +365 -410
- data/bundler/CHANGELOG.md +0 -5784
- data/bundler/LICENSE.md +0 -22
- data/bundler/README.md +0 -58
- data/bundler/bundler.gemspec +0 -46
- data/bundler/lib/bundler/compact_index_client/cache.rb +0 -107
- data/bundler/lib/bundler/compact_index_client/cache_file.rb +0 -148
- data/bundler/lib/bundler/compact_index_client/parser.rb +0 -87
- data/bundler/lib/bundler/compact_index_client/updater.rb +0 -105
- data/bundler/lib/bundler/compact_index_client.rb +0 -92
- data/bundler/lib/bundler/match_metadata.rb +0 -30
- data/bundler/lib/bundler/match_remote_metadata.rb +0 -29
- data/bundler/lib/bundler/vendor/connection_pool/LICENSE +0 -20
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +0 -227
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +0 -3
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -56
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +0 -230
- data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +0 -82
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +0 -41
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +0 -65
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +0 -80
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +0 -1153
- data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +0 -31
- data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +0 -102
- data/bundler/lib/bundler/vendor/uri/COPYING +0 -56
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +0 -922
- data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +0 -100
- data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -267
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +0 -1592
- data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +0 -137
- data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +0 -23
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +0 -261
- data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +0 -22
- data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -293
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +0 -547
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +0 -206
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +0 -6
- data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +0 -83
- data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +0 -23
- data/bundler/lib/bundler/vendor/uri/lib/uri.rb +0 -104
- data/bundler/lib/bundler/vendored_persistent.rb +0 -11
- data/bundler/lib/bundler/vendored_securerandom.rb +0 -12
- data/bundler/lib/bundler/vendored_uri.rb +0 -21
- data/bundler/lib/bundler/yaml_serializer.rb +0 -98
- data/doc/rubygems/CONTRIBUTING.md +0 -231
- data/doc/rubygems/POLICIES.md +0 -60
- data/lib/rubygems/request_set/lockfile/parser.rb +0 -344
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +0 -122
- data/lib/rubygems/resolver/conflict.rb +0 -146
- data/lib/rubygems/resolver/stats.rb +0 -46
- data/lib/rubygems/util/list.rb +0 -40
- data/lib/rubygems/vendor/molinillo/LICENSE +0 -9
- data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/lib/rubygems/vendor/molinillo/lib/molinillo/errors.rb +0 -149
- data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/lib/rubygems/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/lib/rubygems/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/lib/rubygems/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/lib/rubygems/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/lib/rubygems/vendor/molinillo/lib/molinillo.rb +0 -11
- data/lib/rubygems/vendored_molinillo.rb +0 -3
- /data/{bundler/exe → exe}/bundle +0 -0
- /data/{bundler/exe → exe}/bundler +0 -0
- /data/{bundler/lib → lib}/bundler/.document +0 -0
- /data/{bundler/lib → lib}/bundler/capistrano.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/binstubs.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/check.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/console.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/doctor/diagnose.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/doctor/ssl.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/doctor.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/exec.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/fund.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/info.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/init.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/issue.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/list.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/open.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/platform.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/plugin.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/remove.rb +0 -0
- /data/{bundler/lib → lib}/bundler/cli/show.rb +0 -0
- /data/{bundler/lib → lib}/bundler/constants.rb +0 -0
- /data/{bundler/lib → lib}/bundler/current_ruby.rb +0 -0
- /data/{bundler/lib → lib}/bundler/deployment.rb +0 -0
- /data/{bundler/lib → lib}/bundler/deprecate.rb +0 -0
- /data/{bundler/lib → lib}/bundler/digest.rb +0 -0
- /data/{bundler/lib → lib}/bundler/environment_preserver.rb +0 -0
- /data/{bundler/lib → lib}/bundler/feature_flag.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/base.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/dependency.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/gem_remote_fetcher.rb +0 -0
- /data/{bundler/lib → lib}/bundler/fetcher/index.rb +0 -0
- /data/{bundler/lib → lib}/bundler/force_platform.rb +0 -0
- /data/{bundler/lib → lib}/bundler/friendly_errors.rb +0 -0
- /data/{bundler/lib → lib}/bundler/gem_helper.rb +0 -0
- /data/{bundler/lib → lib}/bundler/gem_tasks.rb +0 -0
- /data/{bundler/lib → lib}/bundler/gem_version_promoter.rb +0 -0
- /data/{bundler/lib → lib}/bundler/index.rb +0 -0
- /data/{bundler/lib → lib}/bundler/installer/gem_installer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/installer/standalone.rb +0 -0
- /data/{bundler/lib → lib}/bundler/man/.document +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-binstubs.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-check.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-clean.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-console.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-doctor.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-env.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-exec.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-fund.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-gem.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-help.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-info.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-init.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-issue.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-licenses.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-list.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-open.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-outdated.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-platform.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-plugin.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-pristine.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-remove.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-show.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle-version.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/bundle.1.ronn +0 -0
- /data/{bundler/lib → lib}/bundler/man/index.txt +0 -0
- /data/{bundler/lib → lib}/bundler/mirror.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/api/source.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/api.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/installer/git.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/installer/rubygems.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/source_list.rb +0 -0
- /data/{bundler/lib → lib}/bundler/plugin/unloaded_source.rb +0 -0
- /data/{bundler/lib → lib}/bundler/process_lock.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/candidate.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/package.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/root.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/spec_group.rb +0 -0
- /data/{bundler/lib → lib}/bundler/resolver/strategy.rb +0 -0
- /data/{bundler/lib → lib}/bundler/retry.rb +0 -0
- /data/{bundler/lib → lib}/bundler/ruby_dsl.rb +0 -0
- /data/{bundler/lib → lib}/bundler/safe_marshal.rb +0 -0
- /data/{bundler/lib → lib}/bundler/settings/validator.rb +0 -0
- /data/{bundler/lib → lib}/bundler/setup.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/gemspec.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/metadata.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/path.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source/rubygems_aggregate.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source_list.rb +0 -0
- /data/{bundler/lib → lib}/bundler/source_map.rb +0 -0
- /data/{bundler/lib → lib}/bundler/templates/.document +0 -0
- /data/{bundler/lib → lib}/bundler/templates/Executable +0 -0
- /data/{bundler/lib → lib}/bundler/templates/Executable.standalone +0 -0
- /data/{bundler/lib → lib}/bundler/templates/Gemfile +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/CHANGELOG.md.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/Cargo.toml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/LICENSE.txt.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/README.md.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/Rakefile.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/bin/console.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/bin/setup.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/circleci/config.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/exe/newgem.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/build.rs.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-go.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/go.mod.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem-go.c.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.c.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.go.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/newgem.h.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/build-gems.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/github/workflows/main.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/gitignore.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/gitlab-ci.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem/version.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/lib/newgem.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/rspec.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/rubocop.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/sig/newgem.rbs.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/spec/spec_helper.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/standard.yml.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/test/minitest/test_helper.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +0 -0
- /data/{bundler/lib → lib}/bundler/ui/rg_proxy.rb +0 -0
- /data/{bundler/lib → lib}/bundler/ui.rb +0 -0
- /data/{bundler/lib → lib}/bundler/uri_credentials_filter.rb +0 -0
- /data/{bundler/lib → lib}/bundler/uri_normalizer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/.document +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/fileutils/COPYING +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/fileutils/lib/fileutils.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/LICENSE.md +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_file.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/create_link.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/directory.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/actions.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/command.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/error.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/group.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/invocation.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/basic.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor/readline.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/line_editor.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/nested_context.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/argument.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/arguments.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/option.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser/options.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/parser.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/rake_compat.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/runner.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/column_printer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/html.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/table_printer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/terminal.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/shell.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendor/thor/lib/thor/util.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_fileutils.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_net_http.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_thor.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_timeout.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vendored_tsort.rb +0 -0
- /data/{bundler/lib → lib}/bundler/vlad.rb +0 -0
- /data/{bundler/lib/bundler → lib/rubygems}/vendor/pub_grub/LICENSE.txt +0 -0
- /data/{bundler/lib/bundler/vendor/securerandom → lib/rubygems/vendor/resolv}/COPYING +0 -0
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "../command"
|
|
4
4
|
require_relative "../local_remote_options"
|
|
5
|
+
require_relative "../version_option"
|
|
5
6
|
require_relative "../gemcutter_utilities"
|
|
6
7
|
require_relative "../package"
|
|
7
8
|
|
|
8
9
|
class Gem::Commands::PushCommand < Gem::Command
|
|
9
10
|
include Gem::LocalRemoteOptions
|
|
11
|
+
include Gem::VersionOption
|
|
10
12
|
include Gem::GemcutterUtilities
|
|
11
13
|
|
|
12
14
|
def description # :nodoc:
|
|
@@ -17,7 +19,9 @@ https://rubygems.org) and adds it to the index.
|
|
|
17
19
|
The gem can be removed from the index and deleted from the server using the yank
|
|
18
20
|
command. For further discussion see the help for the yank command.
|
|
19
21
|
|
|
20
|
-
The push command will use ~/.gem/credentials to authenticate to a server, but you can use the RubyGems environment variable GEM_HOST_API_KEY to set the api key to authenticate.
|
|
22
|
+
The push command will use ~/.gem/credentials to authenticate to a server, but you can use the RubyGems environment variable GEM_HOST_API_KEY to set the api key to authenticate. If the :credential_store: gemrc option (or RUBYGEMS_CREDENTIAL_STORE environment variable) is set, the API key is stored in and read from the credential store it selects instead of ~/.gem/credentials.
|
|
23
|
+
|
|
24
|
+
The API key to send is resolved in this order: the GEM_HOST_API_KEY environment variable, the --key option, the host's own key in the credential store (when :credential_store: is set), the host's own key in ~/.gem/credentials, then the default RubyGems.org key from either place. The first one found is used.
|
|
21
25
|
EOF
|
|
22
26
|
end
|
|
23
27
|
|
|
@@ -45,8 +49,17 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
|
45
49
|
@user_defined_host = true
|
|
46
50
|
end
|
|
47
51
|
|
|
52
|
+
add_option("--platform PLATFORM",
|
|
53
|
+
"Push a gem for a specific platform",
|
|
54
|
+
" (e.g. x86_64-darwin-20)") do |value, options|
|
|
55
|
+
options[:platform] = value
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
add_ruby_abi_option("push", " (e.g. 3.4)")
|
|
59
|
+
|
|
48
60
|
add_option("--attestation FILE",
|
|
49
|
-
"Push with sigstore attestations"
|
|
61
|
+
"Push with sigstore attestations",
|
|
62
|
+
" (FILE must be a JSON sigstore bundle)") do |value, options|
|
|
50
63
|
options[:attestations] << value
|
|
51
64
|
end
|
|
52
65
|
|
|
@@ -54,7 +67,12 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
|
54
67
|
end
|
|
55
68
|
|
|
56
69
|
def execute
|
|
57
|
-
gem_name =
|
|
70
|
+
gem_name = if options[:platform] || options[:ruby_abi]
|
|
71
|
+
resolve_gem_name(get_all_gem_names)
|
|
72
|
+
else
|
|
73
|
+
get_one_gem_name
|
|
74
|
+
end
|
|
75
|
+
|
|
58
76
|
default_gem_server, push_host = get_hosts_for(gem_name)
|
|
59
77
|
|
|
60
78
|
@host = if @user_defined_host
|
|
@@ -91,24 +109,150 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
|
91
109
|
|
|
92
110
|
private
|
|
93
111
|
|
|
112
|
+
def resolve_gem_name(names)
|
|
113
|
+
platform = options[:platform] && Gem::Platform.new(options[:platform])
|
|
114
|
+
ruby_abi = options[:ruby_abi]
|
|
115
|
+
|
|
116
|
+
candidates = names.filter_map do |name|
|
|
117
|
+
[name, Gem::Package.new(name).spec]
|
|
118
|
+
rescue Gem::Package::FormatError => e
|
|
119
|
+
alert_warning "Skipping #{name}: #{e.message}"
|
|
120
|
+
nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
matches = candidates.select do |_, spec|
|
|
124
|
+
(!platform || spec.platform == platform) &&
|
|
125
|
+
(!ruby_abi || (Gem::ContentAddress.eligible?(spec) && spec.ruby_abi == ruby_abi))
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
raise Gem::CommandLineError, "No gem matched #{gem_name_selector_description}" if matches.empty?
|
|
129
|
+
raise Gem::CommandLineError, multiple_matches_message(matches) if matches.length > 1
|
|
130
|
+
|
|
131
|
+
matches.first.first
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def gem_name_selector_description
|
|
135
|
+
selectors = []
|
|
136
|
+
selectors << "platform #{options[:platform]}" if options[:platform]
|
|
137
|
+
selectors << "Ruby ABI #{options[:ruby_abi]}" if options[:ruby_abi]
|
|
138
|
+
selectors.join(" and ")
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def multiple_matches_message(matches)
|
|
142
|
+
message = "Multiple gems matched #{gem_name_selector_description}: #{matches.map(&:first).join(", ")}"
|
|
143
|
+
|
|
144
|
+
if options[:platform] && !options[:ruby_abi]
|
|
145
|
+
ruby_abis = matches.filter_map {|_, spec| spec.ruby_abi }.uniq.sort
|
|
146
|
+
message += "\nSpecify --ruby-abi with one of: #{ruby_abis.join(", ")}" unless ruby_abis.empty?
|
|
147
|
+
message += "\nTo push a gem without a Ruby ABI, pass the exact filename." if matches.any? {|_, spec| spec.ruby_abi.nil? }
|
|
148
|
+
elsif options[:ruby_abi] && !options[:platform]
|
|
149
|
+
platforms = matches.map {|_, spec| spec.platform.to_s }.uniq.sort
|
|
150
|
+
message += "\nSpecify --platform with one of: #{platforms.join(", ")}" unless platforms.empty?
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
message
|
|
154
|
+
end
|
|
155
|
+
|
|
94
156
|
def send_push_request(name, args)
|
|
157
|
+
# Always honor explicit --attestation option
|
|
158
|
+
# Auto-attestation is only supported on rubygems.org with GitHub Actions (not JRuby)
|
|
159
|
+
if options[:attestations].any? || (RUBY_ENGINE != "jruby" && attestation_supported_host? && ENV["GITHUB_ACTIONS"] == "true")
|
|
160
|
+
send_push_request_with_attestation(name, args)
|
|
161
|
+
else
|
|
162
|
+
send_push_request_without_attestation(name, args)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def send_push_request_without_attestation(name, args)
|
|
95
167
|
scope = get_push_scope
|
|
96
168
|
rubygems_api_request(*args, scope: scope) do |request|
|
|
97
169
|
body = Gem.read_binary name
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
170
|
+
request.body = body
|
|
171
|
+
request.add_field "Content-Type", "application/octet-stream"
|
|
172
|
+
request.add_field "Content-Length", request.body.size
|
|
173
|
+
request.add_field "Authorization", api_key
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def send_push_request_with_attestation(name, args)
|
|
178
|
+
attestations = if options[:attestations].any?
|
|
179
|
+
options[:attestations].map do |attestation|
|
|
180
|
+
load_attestation(attestation)
|
|
181
|
+
end
|
|
182
|
+
else
|
|
183
|
+
# Only the opportunistic signing step falls back. The request below stays
|
|
184
|
+
# outside this rescue because once the server may have seen the attested
|
|
185
|
+
# push, a network error must not trigger an unattested retry.
|
|
186
|
+
begin
|
|
187
|
+
[attest!(name)]
|
|
188
|
+
rescue StandardError => e
|
|
189
|
+
message = "Failed to create an attestation, pushing without one.\n"
|
|
190
|
+
message += if Gem.configuration.really_verbose
|
|
191
|
+
e.full_message
|
|
192
|
+
else
|
|
193
|
+
e.message
|
|
194
|
+
end
|
|
195
|
+
alert_warning message
|
|
196
|
+
return send_push_request_without_attestation(name, args)
|
|
107
197
|
end
|
|
198
|
+
end
|
|
199
|
+
bundles = "[" + attestations.join(",") + "]"
|
|
200
|
+
|
|
201
|
+
rubygems_api_request(*args, scope: get_push_scope) do |request|
|
|
202
|
+
request.set_form([
|
|
203
|
+
["gem", Gem.read_binary(name), { filename: name, content_type: "application/octet-stream" }],
|
|
204
|
+
["attestations", bundles, { content_type: "application/json" }],
|
|
205
|
+
], "multipart/form-data")
|
|
108
206
|
request.add_field "Authorization", api_key
|
|
109
207
|
end
|
|
110
208
|
end
|
|
111
209
|
|
|
210
|
+
def load_attestation(file)
|
|
211
|
+
data = begin
|
|
212
|
+
Gem.read_binary(file)
|
|
213
|
+
rescue SystemCallError, IOError, ArgumentError => e
|
|
214
|
+
raise Gem::Exception, "Failed to read attestation #{file}: #{e.message}"
|
|
215
|
+
end
|
|
216
|
+
validate_attestation_json(data, file)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def validate_attestation_json(data, source)
|
|
220
|
+
require "json"
|
|
221
|
+
|
|
222
|
+
parsed = begin
|
|
223
|
+
JSON.parse(data)
|
|
224
|
+
rescue JSON::ParserError => e
|
|
225
|
+
raise Gem::Exception, "Attestation #{source} is not valid JSON: #{e.message}"
|
|
226
|
+
end
|
|
227
|
+
raise Gem::Exception, "Attestation #{source} is not a JSON object" unless parsed.is_a?(Hash)
|
|
228
|
+
data
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def attest!(name)
|
|
232
|
+
require "open3"
|
|
233
|
+
require "shellwords"
|
|
234
|
+
require "tempfile"
|
|
235
|
+
|
|
236
|
+
env = defined?(Bundler.unbundled_env) ? Bundler.unbundled_env : ENV.to_h
|
|
237
|
+
|
|
238
|
+
Tempfile.create([File.basename(name, ".*"), ".sigstore.json"]) do |tempfile|
|
|
239
|
+
tempfile.close
|
|
240
|
+
bundle = tempfile.path
|
|
241
|
+
|
|
242
|
+
# Gem.ruby is quoted if it contains whitespace, so split it into argv
|
|
243
|
+
# elements to keep the quotes out of the spawned command.
|
|
244
|
+
out, st = Open3.capture2e(
|
|
245
|
+
env,
|
|
246
|
+
*Shellwords.split(Gem.ruby), "-S", "gem", "exec", "--conservative",
|
|
247
|
+
"sigstore-cli", "sign", name, "--bundle", bundle,
|
|
248
|
+
unsetenv_others: true
|
|
249
|
+
)
|
|
250
|
+
raise Gem::Exception, "Failed to sign gem:\n\n#{out}" unless st.success?
|
|
251
|
+
|
|
252
|
+
validate_attestation_json(Gem.read_binary(bundle), "generated by sigstore-cli")
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
112
256
|
def get_hosts_for(name)
|
|
113
257
|
gem_metadata = Gem::Package.new(name).spec.metadata
|
|
114
258
|
|
|
@@ -122,14 +266,8 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
|
122
266
|
:push_rubygem
|
|
123
267
|
end
|
|
124
268
|
|
|
125
|
-
def
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
end.join(",") + "]"
|
|
129
|
-
[
|
|
130
|
-
"attestations",
|
|
131
|
-
bundles,
|
|
132
|
-
{ content_type: "application/json" },
|
|
133
|
-
]
|
|
269
|
+
def attestation_supported_host?
|
|
270
|
+
host = (@host || Gem.host).to_s.chomp("/")
|
|
271
|
+
host == Gem::DEFAULT_HOST
|
|
134
272
|
end
|
|
135
273
|
end
|
|
@@ -283,7 +283,6 @@ By default, this RubyGems will install gem as:
|
|
|
283
283
|
|
|
284
284
|
def install_lib(lib_dir)
|
|
285
285
|
libs = { "RubyGems" => "lib" }
|
|
286
|
-
libs["Bundler"] = "bundler/lib"
|
|
287
286
|
libs.each do |tool, path|
|
|
288
287
|
say "Installing #{tool}" if @verbose
|
|
289
288
|
|
|
@@ -371,7 +370,7 @@ By default, this RubyGems will install gem as:
|
|
|
371
370
|
# the default gem will look for them.
|
|
372
371
|
bundler_install_dir = File.dirname(File.dirname(specs_dir))
|
|
373
372
|
|
|
374
|
-
new_bundler_spec =
|
|
373
|
+
new_bundler_spec = Gem::Specification.load("bundler.gemspec")
|
|
375
374
|
full_name = new_bundler_spec.full_name
|
|
376
375
|
gemspec_path = "#{full_name}.gemspec"
|
|
377
376
|
|
|
@@ -396,26 +395,24 @@ By default, this RubyGems will install gem as:
|
|
|
396
395
|
|
|
397
396
|
require_relative "../installer"
|
|
398
397
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
FileUtils.rm_f built_gem
|
|
418
|
-
end
|
|
398
|
+
built_gem = Gem::Package.build(new_bundler_spec)
|
|
399
|
+
begin
|
|
400
|
+
installer = Gem::Installer.at(
|
|
401
|
+
built_gem,
|
|
402
|
+
env_shebang: options[:env_shebang],
|
|
403
|
+
format_executable: options[:format_executable],
|
|
404
|
+
force: options[:force],
|
|
405
|
+
bin_dir: bin_dir,
|
|
406
|
+
install_dir: bundler_install_dir,
|
|
407
|
+
wrappers: true
|
|
408
|
+
)
|
|
409
|
+
# We only need to install the executables here. The default spec was
|
|
410
|
+
# already written above, and lib/bundler.rb and lib/bundler/* are
|
|
411
|
+
# available under the site_ruby directory.
|
|
412
|
+
installer.extract_bin
|
|
413
|
+
installer.generate_bin
|
|
414
|
+
ensure
|
|
415
|
+
FileUtils.rm_f built_gem
|
|
419
416
|
end
|
|
420
417
|
|
|
421
418
|
new_bundler_spec.executables.each {|executable| bin_file_names << target_bin_path(bin_dir, executable) }
|
|
@@ -505,7 +502,7 @@ abort "#{deprecation_message}"
|
|
|
505
502
|
|
|
506
503
|
def remove_old_lib_files(lib_dir)
|
|
507
504
|
lib_dirs = { File.join(lib_dir, "rubygems") => "lib/rubygems" }
|
|
508
|
-
lib_dirs[File.join(lib_dir, "bundler")] = "
|
|
505
|
+
lib_dirs[File.join(lib_dir, "bundler")] = "lib/bundler"
|
|
509
506
|
lib_dirs.each do |old_lib_dir, new_lib_dir|
|
|
510
507
|
lib_files = files_in(new_lib_dir)
|
|
511
508
|
|
|
@@ -21,7 +21,9 @@ class Gem::Commands::SigninCommand < Gem::Command
|
|
|
21
21
|
"The signin command executes host sign in for a push server (the default is"\
|
|
22
22
|
" https://rubygems.org). The host can be provided with the host flag or can"\
|
|
23
23
|
" be inferred from the provided gem. Host resolution matches the resolution"\
|
|
24
|
-
" strategy for the push command."
|
|
24
|
+
" strategy for the push command. If the :credential_store: gemrc option (or"\
|
|
25
|
+
" RUBYGEMS_CREDENTIAL_STORE environment variable) is set, the resulting API key is"\
|
|
26
|
+
" stored in the credential store it selects instead of ~/.gem/credentials."
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
def usage # :nodoc:
|
|
@@ -9,7 +9,10 @@ class Gem::Commands::SignoutCommand < Gem::Command
|
|
|
9
9
|
|
|
10
10
|
def description # :nodoc:
|
|
11
11
|
"The `signout` command is used to sign out from all current sessions,"\
|
|
12
|
-
" allowing you to sign in using a different set of credentials."
|
|
12
|
+
" allowing you to sign in using a different set of credentials. It removes"\
|
|
13
|
+
" the ~/.gem/credentials file. If the :credential_store: gemrc option is"\
|
|
14
|
+
" set, it also removes every RubyGems key from the credential store,"\
|
|
15
|
+
" including keys saved for other hosts with `gem signin --host`."
|
|
13
16
|
end
|
|
14
17
|
|
|
15
18
|
def usage # :nodoc:
|
|
@@ -18,14 +21,31 @@ class Gem::Commands::SignoutCommand < Gem::Command
|
|
|
18
21
|
|
|
19
22
|
def execute
|
|
20
23
|
credentials_path = Gem.configuration.credentials_path
|
|
24
|
+
credentials_file_exists = File.exist?(credentials_path)
|
|
21
25
|
|
|
22
|
-
if !
|
|
26
|
+
if !credentials_file_exists && !Gem.configuration.credential_store
|
|
23
27
|
alert_error "You are not currently signed in."
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
return
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# An unwritable file must not leave the stored keys behind, so each half
|
|
32
|
+
# reports its own outcome.
|
|
33
|
+
store_cleared, file_removed = Gem.configuration.unset_api_key!
|
|
34
|
+
|
|
35
|
+
unremoved = []
|
|
36
|
+
unremoved << "the credential store" unless store_cleared
|
|
37
|
+
unremoved << "'#{credentials_path}'" if credentials_file_exists && !file_removed
|
|
38
|
+
|
|
39
|
+
unless unremoved.empty?
|
|
40
|
+
alert_error "Could not remove the credentials from #{unremoved.join(" and ")}." \
|
|
41
|
+
" They are still there. Check that the file and its directory are writable," \
|
|
42
|
+
" or remove them yourself to finish signing out."
|
|
43
|
+
terminate_interaction 1
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if Gem.configuration.credential_store
|
|
47
|
+
say "You have successfully signed out of every registry, including RubyGems.org."
|
|
27
48
|
else
|
|
28
|
-
Gem.configuration.unset_api_key!
|
|
29
49
|
say "You have successfully signed out from all sessions."
|
|
30
50
|
end
|
|
31
51
|
end
|
|
@@ -147,7 +147,7 @@ Specific fields in the specification can be extracted in YAML format:
|
|
|
147
147
|
say case options[:format]
|
|
148
148
|
when :ruby then s.to_ruby
|
|
149
149
|
when :marshal then Marshal.dump s
|
|
150
|
-
else s.to_yaml
|
|
150
|
+
else Gem.use_psych? ? s.to_yaml : Gem::YAMLSerializer.dump(s)
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
say "\n"
|
|
@@ -117,7 +117,7 @@ that is a dependency of an existing gem. You can use the
|
|
|
117
117
|
if options[:version] != Gem::Requirement.default &&
|
|
118
118
|
get_all_gem_names.size > 1
|
|
119
119
|
alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
|
|
120
|
-
" version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem
|
|
120
|
+
" version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem:>=2'`"
|
|
121
121
|
terminate_interaction 1
|
|
122
122
|
end
|
|
123
123
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "../command"
|
|
4
4
|
require_relative "../command_manager"
|
|
5
|
+
require_relative "../cooldown"
|
|
5
6
|
require_relative "../dependency_installer"
|
|
6
7
|
require_relative "../install_update_options"
|
|
7
8
|
require_relative "../local_remote_options"
|
|
@@ -95,8 +96,12 @@ command to remove old versions.
|
|
|
95
96
|
end
|
|
96
97
|
|
|
97
98
|
def execute
|
|
99
|
+
@cooldown = Gem::Cooldown.from_options options
|
|
100
|
+
@cooldown_skipped = []
|
|
101
|
+
|
|
98
102
|
if options[:system]
|
|
99
103
|
update_rubygems
|
|
104
|
+
output_cooldown_skipped_summary
|
|
100
105
|
return
|
|
101
106
|
end
|
|
102
107
|
|
|
@@ -132,6 +137,8 @@ command to remove old versions.
|
|
|
132
137
|
end
|
|
133
138
|
say "Gems already up-to-date: #{up_to_date_names.join(" ")}" unless up_to_date_names.empty?
|
|
134
139
|
say "Gems not currently installed: #{not_installed_names.join(" ")}" unless not_installed_names.empty?
|
|
140
|
+
|
|
141
|
+
output_cooldown_skipped_summary
|
|
135
142
|
end
|
|
136
143
|
|
|
137
144
|
def fetch_remote_gems(spec) # :nodoc:
|
|
@@ -140,7 +147,12 @@ command to remove old versions.
|
|
|
140
147
|
|
|
141
148
|
fetcher = Gem::SpecFetcher.fetcher
|
|
142
149
|
|
|
143
|
-
|
|
150
|
+
# The default indexes carry only the newest version of each gem, which
|
|
151
|
+
# leaves nothing to fall back to when the cooldown excludes it, so
|
|
152
|
+
# search the full index instead.
|
|
153
|
+
type = dependency.prerelease? ? :complete : :released if @cooldown&.active?
|
|
154
|
+
|
|
155
|
+
spec_tuples, errors = fetcher.search_for_dependency dependency, type: type
|
|
144
156
|
|
|
145
157
|
error = errors.find {|e| e.respond_to? :exception }
|
|
146
158
|
|
|
@@ -167,12 +179,78 @@ command to remove old versions.
|
|
|
167
179
|
def highest_remote_name_tuple(spec) # :nodoc:
|
|
168
180
|
spec_tuples = fetch_remote_gems spec
|
|
169
181
|
|
|
170
|
-
highest_remote_gem = spec_tuples.max
|
|
182
|
+
highest_remote_gem = filter_cooldown_tuples(spec_tuples).max
|
|
171
183
|
return unless highest_remote_gem
|
|
172
184
|
|
|
173
185
|
highest_remote_gem.first
|
|
174
186
|
end
|
|
175
187
|
|
|
188
|
+
##
|
|
189
|
+
# Rejects [NameTuple, Gem::Source] pairs published within the cooldown
|
|
190
|
+
# period. Tuples with an unknown publish time are kept, so the cooldown
|
|
191
|
+
# fails open.
|
|
192
|
+
|
|
193
|
+
def filter_cooldown_tuples(spec_tuples) # :nodoc:
|
|
194
|
+
return spec_tuples unless @cooldown&.active?
|
|
195
|
+
|
|
196
|
+
with_times = spec_tuples.map do |tup, source|
|
|
197
|
+
[tup, source, source.created_at_for_tuple(tup)]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
if !with_times.empty? && with_times.none? {|_, _, created_at| created_at }
|
|
201
|
+
Gem::Cooldown.warn_missing_created_at with_times.first[1]
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
with_times.reject do |tup, _, created_at|
|
|
205
|
+
next false unless @cooldown.skip?(created_at)
|
|
206
|
+
|
|
207
|
+
(@cooldown_skipped_tuples ||= {})[[tup.name, tup.version]] ||= created_at
|
|
208
|
+
true
|
|
209
|
+
end.map {|tup, source, _| [tup, source] }
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
##
|
|
213
|
+
# Summary entries for tuples the cooldown kept out of the update, kept
|
|
214
|
+
# only when newer than the version the update actually settled on (the
|
|
215
|
+
# updated version, or the one already installed when nothing moved).
|
|
216
|
+
|
|
217
|
+
def cooldown_skipped_tuple_entries # :nodoc:
|
|
218
|
+
skipped = @cooldown_skipped_tuples
|
|
219
|
+
return [] unless skipped
|
|
220
|
+
|
|
221
|
+
resolved = {}
|
|
222
|
+
@updated.each do |spec|
|
|
223
|
+
version = resolved[spec.name]
|
|
224
|
+
resolved[spec.name] = spec.version if version.nil? || spec.version > version
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
skipped.filter_map do |(name, version), created_at|
|
|
228
|
+
resolved_version = resolved[name] || resolved_fallback_version(name)
|
|
229
|
+
next unless resolved_version && version > resolved_version
|
|
230
|
+
|
|
231
|
+
{
|
|
232
|
+
name: name,
|
|
233
|
+
version: version,
|
|
234
|
+
resolved: resolved_version,
|
|
235
|
+
available_in_days: @cooldown.remaining_days(created_at),
|
|
236
|
+
}
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def resolved_fallback_version(name) # :nodoc:
|
|
241
|
+
if name == "rubygems-update"
|
|
242
|
+
Gem::Version.new Gem::VERSION
|
|
243
|
+
else
|
|
244
|
+
Gem::Specification.find_all_by_name(name).map(&:version).max
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def output_cooldown_skipped_summary # :nodoc:
|
|
249
|
+
entries = (@cooldown_skipped || []) + cooldown_skipped_tuple_entries
|
|
250
|
+
|
|
251
|
+
Gem::Cooldown.output_skipped_summary entries
|
|
252
|
+
end
|
|
253
|
+
|
|
176
254
|
def install_rubygems(spec) # :nodoc:
|
|
177
255
|
args = update_rubygems_arguments
|
|
178
256
|
version = spec.version
|
|
@@ -256,6 +334,10 @@ command to remove old versions.
|
|
|
256
334
|
@installer.installed_gems.each do |spec|
|
|
257
335
|
@updated << spec
|
|
258
336
|
end
|
|
337
|
+
|
|
338
|
+
(@cooldown_skipped ||= []).concat @installer.cooldown_skipped
|
|
339
|
+
|
|
340
|
+
@installer.installed_gems
|
|
259
341
|
end
|
|
260
342
|
|
|
261
343
|
def update_gems(gems_to_update)
|
|
@@ -25,7 +25,7 @@ data you will need to change them immediately and yank your gem.
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def usage # :nodoc:
|
|
28
|
-
"#{program_name} -v VERSION [-p PLATFORM] [--key KEY_NAME] [--host HOST] GEM"
|
|
28
|
+
"#{program_name} -v VERSION [-p PLATFORM] [--ruby-abi RUBY_ABI] [--key KEY_NAME] [--host HOST] GEM"
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def initialize
|
|
@@ -33,6 +33,7 @@ data you will need to change them immediately and yank your gem.
|
|
|
33
33
|
|
|
34
34
|
add_version_option("remove")
|
|
35
35
|
add_platform_option("remove")
|
|
36
|
+
add_ruby_abi_option("remove")
|
|
36
37
|
add_otp_option
|
|
37
38
|
|
|
38
39
|
add_option("--host HOST",
|
|
@@ -50,20 +51,21 @@ data you will need to change them immediately and yank your gem.
|
|
|
50
51
|
|
|
51
52
|
sign_in @host, scope: get_yank_scope
|
|
52
53
|
|
|
53
|
-
version
|
|
54
|
-
platform
|
|
54
|
+
version = get_version_from_requirements(options[:version])
|
|
55
|
+
platform = get_platform_from_requirements(options)
|
|
56
|
+
ruby_abi = options[:ruby_abi]
|
|
55
57
|
|
|
56
58
|
if version
|
|
57
|
-
yank_gem(version, platform)
|
|
59
|
+
yank_gem(version, platform, ruby_abi)
|
|
58
60
|
else
|
|
59
61
|
say "A version argument is required: #{usage}"
|
|
60
62
|
terminate_interaction
|
|
61
63
|
end
|
|
62
64
|
end
|
|
63
65
|
|
|
64
|
-
def yank_gem(version, platform)
|
|
66
|
+
def yank_gem(version, platform, ruby_abi)
|
|
65
67
|
say "Yanking gem from #{host}..."
|
|
66
|
-
args = [:delete, version, platform, "api/v1/gems/yank"]
|
|
68
|
+
args = [:delete, version, platform, ruby_abi, "api/v1/gems/yank"]
|
|
67
69
|
response = yank_api_request(*args)
|
|
68
70
|
|
|
69
71
|
say response.body
|
|
@@ -71,7 +73,7 @@ data you will need to change them immediately and yank your gem.
|
|
|
71
73
|
|
|
72
74
|
private
|
|
73
75
|
|
|
74
|
-
def yank_api_request(method, version, platform, api)
|
|
76
|
+
def yank_api_request(method, version, platform, ruby_abi, api)
|
|
75
77
|
name = get_one_gem_name
|
|
76
78
|
response = rubygems_api_request(method, api, host, scope: get_yank_scope) do |request|
|
|
77
79
|
request.add_field("Authorization", api_key)
|
|
@@ -81,6 +83,7 @@ data you will need to change them immediately and yank your gem.
|
|
|
81
83
|
"version" => version,
|
|
82
84
|
}
|
|
83
85
|
data["platform"] = platform if platform
|
|
86
|
+
data["ruby_abi"] = ruby_abi if ruby_abi
|
|
84
87
|
|
|
85
88
|
request.set_form_data data
|
|
86
89
|
end
|