rubygems-update 3.2.0.rc.2 → 3.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{History.txt → CHANGELOG.md} +520 -501
- data/Manifest.txt +62 -55
- data/POLICIES.md +4 -3
- data/Rakefile +23 -7
- data/bundler/CHANGELOG.md +84 -19
- data/bundler/UPGRADING.md +1 -1
- data/bundler/bundler.gemspec +1 -1
- data/bundler/lib/bundler.rb +11 -0
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli.rb +5 -5
- data/bundler/lib/bundler/cli/binstubs.rb +6 -2
- data/bundler/lib/bundler/cli/exec.rb +3 -3
- data/bundler/lib/bundler/cli/install.rb +14 -5
- data/bundler/lib/bundler/cli/outdated.rb +0 -2
- data/bundler/lib/bundler/cli/update.rb +1 -1
- data/bundler/lib/bundler/compact_index_client/cache.rb +5 -13
- data/bundler/lib/bundler/compact_index_client/gem_parser.rb +28 -0
- data/bundler/lib/bundler/compact_index_client/updater.rb +5 -5
- data/bundler/lib/bundler/definition.rb +23 -25
- data/bundler/lib/bundler/dependency.rb +3 -1
- data/bundler/lib/bundler/env.rb +1 -1
- data/bundler/lib/bundler/feature_flag.rb +0 -1
- data/bundler/lib/bundler/fetcher/index.rb +2 -3
- data/bundler/lib/bundler/friendly_errors.rb +15 -0
- data/bundler/lib/bundler/gem_helpers.rb +30 -24
- data/bundler/lib/bundler/index.rb +5 -1
- data/bundler/lib/bundler/injector.rb +9 -2
- data/bundler/lib/bundler/installer.rb +7 -5
- data/bundler/lib/bundler/lazy_specification.rb +20 -9
- data/bundler/lib/bundler/man/.document +1 -0
- data/bundler/{man → lib/bundler/man}/bundle-add.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-add.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-binstubs.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-binstubs.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-cache.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-cache.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-check.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-check.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-clean.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-clean.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-config.1 +2 -5
- data/bundler/{man → lib/bundler/man}/bundle-config.1.ronn +1 -9
- data/bundler/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-doctor.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-exec.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-exec.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-gem.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-gem.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-info.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-info.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-init.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-init.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-inject.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-inject.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-install.1 +2 -2
- data/bundler/{man → lib/bundler/man}/bundle-install.1.ronn +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-list.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-list.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-lock.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-lock.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-open.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-open.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-outdated.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-platform.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-platform.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-pristine.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-remove.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-remove.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-show.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-show.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-update.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-update.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle-viz.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle-viz.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/bundle.1 +1 -1
- data/bundler/{man → lib/bundler/man}/bundle.1.ronn +0 -0
- data/bundler/{man → lib/bundler/man}/gemfile.5 +1 -1
- data/bundler/{man → lib/bundler/man}/gemfile.5.ronn +0 -0
- data/bundler/lib/bundler/man/index.txt +25 -0
- data/bundler/lib/bundler/plugin/api/source.rb +1 -1
- data/bundler/lib/bundler/plugin/dsl.rb +1 -1
- data/bundler/lib/bundler/resolver.rb +25 -29
- data/bundler/lib/bundler/resolver/spec_group.rb +19 -25
- data/bundler/lib/bundler/rubygems_integration.rb +4 -6
- data/bundler/lib/bundler/settings.rb +0 -1
- data/bundler/lib/bundler/source/git/git_proxy.rb +28 -41
- data/bundler/lib/bundler/spec_set.rb +6 -8
- data/bundler/lib/bundler/stub_specification.rb +0 -2
- data/bundler/lib/bundler/templates/newgem/README.md.tt +0 -1
- data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -2
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -0
- data/bundler/lib/bundler/uri_credentials_filter.rb +2 -0
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +12 -8
- data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
- data/bundler/lib/bundler/vendored_tmpdir.rb +4 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/lib/rubygems.rb +6 -2
- data/lib/rubygems/available_set.rb +1 -1
- data/lib/rubygems/command_manager.rb +2 -2
- data/lib/rubygems/commands/build_command.rb +37 -20
- data/lib/rubygems/commands/cert_command.rb +1 -1
- data/lib/rubygems/commands/help_command.rb +2 -0
- data/lib/rubygems/commands/owner_command.rb +10 -3
- data/lib/rubygems/commands/pristine_command.rb +1 -1
- data/lib/rubygems/commands/push_command.rb +7 -4
- data/lib/rubygems/commands/query_command.rb +17 -0
- data/lib/rubygems/commands/server_command.rb +4 -0
- data/lib/rubygems/commands/setup_command.rb +26 -90
- data/lib/rubygems/commands/sources_command.rb +6 -2
- data/lib/rubygems/commands/specification_command.rb +6 -0
- data/lib/rubygems/commands/yank_command.rb +4 -5
- data/lib/rubygems/core_ext/kernel_require.rb +3 -0
- data/lib/rubygems/core_ext/kernel_warn.rb +6 -7
- data/lib/rubygems/defaults.rb +2 -2
- data/lib/rubygems/dependency.rb +1 -1
- data/lib/rubygems/dependency_installer.rb +5 -3
- data/lib/rubygems/ext/builder.rb +16 -35
- data/lib/rubygems/ext/cmake_builder.rb +5 -6
- data/lib/rubygems/ext/configure_builder.rb +5 -6
- data/lib/rubygems/ext/ext_conf_builder.rb +19 -14
- data/lib/rubygems/ext/rake_builder.rb +4 -4
- data/lib/rubygems/gemcutter_utilities.rb +101 -20
- data/lib/rubygems/indexer.rb +0 -1
- data/lib/rubygems/install_update_options.rb +2 -2
- data/lib/rubygems/installer.rb +12 -32
- data/lib/rubygems/installer_test_case.rb +7 -6
- data/lib/rubygems/name_tuple.rb +1 -1
- data/lib/rubygems/openssl.rb +4 -4
- data/lib/rubygems/package.rb +3 -2
- data/lib/rubygems/package/tar_header.rb +1 -1
- data/lib/rubygems/package/tar_test_case.rb +1 -1
- data/lib/rubygems/platform.rb +18 -7
- data/lib/rubygems/query_utils.rb +0 -9
- data/lib/rubygems/remote_fetcher.rb +5 -4
- data/lib/rubygems/request.rb +4 -3
- data/lib/rubygems/request_set.rb +2 -13
- data/lib/rubygems/request_set/gem_dependency_api.rb +4 -4
- data/lib/rubygems/requirement.rb +1 -1
- data/lib/rubygems/resolver.rb +7 -2
- data/lib/rubygems/resolver/activation_request.rb +9 -1
- data/lib/rubygems/resolver/api_set.rb +29 -20
- data/lib/rubygems/resolver/api_set/gem_parser.rb +20 -0
- data/lib/rubygems/resolver/api_specification.rb +8 -3
- data/lib/rubygems/resolver/best_set.rb +2 -2
- data/lib/rubygems/resolver/conflict.rb +1 -1
- data/lib/rubygems/resolver/dependency_request.rb +1 -1
- data/lib/rubygems/resolver/index_specification.rb +29 -0
- data/lib/rubygems/resolver/installer_set.rb +58 -9
- data/lib/rubygems/resolver/lock_set.rb +1 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
- data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +39 -5
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +2 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +2 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +2 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +2 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +7 -6
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +2 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +4 -3
- data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +43 -10
- data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +75 -7
- data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
- data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
- data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +506 -165
- data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
- data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +8 -4
- data/lib/rubygems/resolver/spec_specification.rb +14 -0
- data/lib/rubygems/resolver/specification.rb +13 -1
- data/lib/rubygems/s3_uri_signer.rb +1 -1
- data/lib/rubygems/security.rb +1 -2
- data/lib/rubygems/security/policy.rb +1 -1
- data/lib/rubygems/security/signer.rb +1 -1
- data/lib/rubygems/server.rb +7 -2
- data/lib/rubygems/source.rb +20 -9
- data/lib/rubygems/spec_fetcher.rb +1 -1
- data/lib/rubygems/specification.rb +8 -8
- data/lib/rubygems/ssl_certs/{index.rubygems.org → rubygems.org}/GlobalSignRootCA.pem +0 -0
- data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
- data/lib/rubygems/stub_specification.rb +1 -1
- data/lib/rubygems/test_case.rb +14 -27
- data/lib/rubygems/test_utilities.rb +6 -5
- data/lib/rubygems/uri_formatter.rb +2 -1
- data/lib/rubygems/version_option.rb +6 -0
- data/rubygems-update.gemspec +2 -2
- data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
- data/test/rubygems/test_bundled_ca.rb +9 -5
- data/test/rubygems/test_gem.rb +3 -3
- data/test/rubygems/test_gem_commands_build_command.rb +197 -5
- data/test/rubygems/test_gem_commands_cert_command.rb +2 -2
- data/test/rubygems/test_gem_commands_cleanup_command.rb +1 -1
- data/test/rubygems/test_gem_commands_contents_command.rb +2 -2
- data/test/rubygems/test_gem_commands_help_command.rb +15 -2
- data/test/rubygems/test_gem_commands_install_command.rb +132 -1
- data/test/rubygems/test_gem_commands_owner_command.rb +49 -1
- data/test/rubygems/test_gem_commands_pristine_command.rb +2 -2
- data/test/rubygems/test_gem_commands_push_command.rb +70 -5
- data/test/rubygems/test_gem_commands_query_command.rb +3 -3
- data/test/rubygems/test_gem_commands_setup_command.rb +20 -48
- data/test/rubygems/test_gem_commands_signin_command.rb +27 -3
- data/test/rubygems/test_gem_commands_sources_command.rb +60 -0
- data/test/rubygems/test_gem_commands_specification_command.rb +28 -0
- data/test/rubygems/test_gem_commands_update_command.rb +2 -2
- data/test/rubygems/test_gem_commands_yank_command.rb +31 -1
- data/test/rubygems/test_gem_dependency_installer.rb +63 -49
- data/test/rubygems/test_gem_dependency_list.rb +2 -2
- data/test/rubygems/test_gem_ext_builder.rb +16 -20
- data/test/rubygems/test_gem_ext_cmake_builder.rb +5 -13
- data/test/rubygems/test_gem_ext_configure_builder.rb +5 -11
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +9 -26
- data/test/rubygems/test_gem_ext_rake_builder.rb +30 -13
- data/test/rubygems/test_gem_gem_runner.rb +5 -4
- data/test/rubygems/test_gem_gemcutter_utilities.rb +3 -3
- data/test/rubygems/test_gem_install_update_options.rb +15 -3
- data/test/rubygems/test_gem_installer.rb +80 -71
- data/test/rubygems/test_gem_package.rb +8 -8
- data/test/rubygems/test_gem_package_old.rb +4 -4
- data/test/rubygems/test_gem_package_tar_writer.rb +1 -1
- data/test/rubygems/test_gem_platform.rb +63 -4
- data/test/rubygems/test_gem_remote_fetcher.rb +15 -19
- data/test/rubygems/test_gem_request.rb +2 -2
- data/test/rubygems/test_gem_request_set_lockfile.rb +4 -4
- data/test/rubygems/test_gem_resolver_api_set.rb +58 -55
- data/test/rubygems/test_gem_resolver_api_specification.rb +3 -3
- data/test/rubygems/test_gem_resolver_best_set.rb +26 -3
- data/test/rubygems/test_gem_resolver_conflict.rb +1 -1
- data/test/rubygems/test_gem_resolver_vendor_set.rb +1 -1
- data/test/rubygems/test_gem_security.rb +2 -2
- data/test/rubygems/test_gem_security_policy.rb +2 -2
- data/test/rubygems/test_gem_security_signer.rb +2 -2
- data/test/rubygems/test_gem_security_trust_dir.rb +2 -2
- data/test/rubygems/test_gem_source.rb +7 -2
- data/test/rubygems/test_gem_source_subpath_problem.rb +49 -0
- data/test/rubygems/test_gem_specification.rb +6 -7
- data/test/rubygems/test_gem_uninstaller.rb +7 -7
- data/test/rubygems/test_gem_validator.rb +1 -1
- data/test/rubygems/test_gem_version_option.rb +1 -1
- data/test/rubygems/test_require.rb +50 -9
- data/test/test_changelog_generator.rb +17 -0
- metadata +69 -86
- data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
- data/lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
- data/lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
@@ -0,0 +1,154 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# tmpdir - retrieve temporary directory path
|
4
|
+
#
|
5
|
+
# $Id$
|
6
|
+
#
|
7
|
+
|
8
|
+
require_relative '../../fileutils/lib/fileutils'
|
9
|
+
begin
|
10
|
+
require 'etc.so'
|
11
|
+
rescue LoadError # rescue LoadError for miniruby
|
12
|
+
end
|
13
|
+
|
14
|
+
class Bundler::Dir < Dir
|
15
|
+
|
16
|
+
@systmpdir ||= defined?(Etc.systmpdir) ? Etc.systmpdir : '/tmp'
|
17
|
+
|
18
|
+
##
|
19
|
+
# Returns the operating system's temporary file path.
|
20
|
+
|
21
|
+
def self.tmpdir
|
22
|
+
tmp = nil
|
23
|
+
['TMPDIR', 'TMP', 'TEMP', ['system temporary path', @systmpdir], ['/tmp']*2, ['.']*2].each do |name, dir = ENV[name]|
|
24
|
+
next if !dir
|
25
|
+
dir = File.expand_path(dir)
|
26
|
+
stat = File.stat(dir) rescue next
|
27
|
+
case
|
28
|
+
when !stat.directory?
|
29
|
+
warn "#{name} is not a directory: #{dir}"
|
30
|
+
when !stat.writable?
|
31
|
+
warn "#{name} is not writable: #{dir}"
|
32
|
+
when stat.world_writable? && !stat.sticky?
|
33
|
+
warn "#{name} is world-writable: #{dir}"
|
34
|
+
else
|
35
|
+
tmp = dir
|
36
|
+
break
|
37
|
+
end
|
38
|
+
end
|
39
|
+
raise ArgumentError, "could not find a temporary directory" unless tmp
|
40
|
+
tmp
|
41
|
+
end
|
42
|
+
|
43
|
+
# Bundler::Dir.mktmpdir creates a temporary directory.
|
44
|
+
#
|
45
|
+
# The directory is created with 0700 permission.
|
46
|
+
# Application should not change the permission to make the temporary directory accessible from other users.
|
47
|
+
#
|
48
|
+
# The prefix and suffix of the name of the directory is specified by
|
49
|
+
# the optional first argument, <i>prefix_suffix</i>.
|
50
|
+
# - If it is not specified or nil, "d" is used as the prefix and no suffix is used.
|
51
|
+
# - If it is a string, it is used as the prefix and no suffix is used.
|
52
|
+
# - If it is an array, first element is used as the prefix and second element is used as a suffix.
|
53
|
+
#
|
54
|
+
# Bundler::Dir.mktmpdir {|dir| dir is ".../d..." }
|
55
|
+
# Bundler::Dir.mktmpdir("foo") {|dir| dir is ".../foo..." }
|
56
|
+
# Bundler::Dir.mktmpdir(["foo", "bar"]) {|dir| dir is ".../foo...bar" }
|
57
|
+
#
|
58
|
+
# The directory is created under Bundler::Dir.tmpdir or
|
59
|
+
# the optional second argument <i>tmpdir</i> if non-nil value is given.
|
60
|
+
#
|
61
|
+
# Bundler::Dir.mktmpdir {|dir| dir is "#{Bundler::Dir.tmpdir}/d..." }
|
62
|
+
# Bundler::Dir.mktmpdir(nil, "/var/tmp") {|dir| dir is "/var/tmp/d..." }
|
63
|
+
#
|
64
|
+
# If a block is given,
|
65
|
+
# it is yielded with the path of the directory.
|
66
|
+
# The directory and its contents are removed
|
67
|
+
# using Bundler::FileUtils.remove_entry before Bundler::Dir.mktmpdir returns.
|
68
|
+
# The value of the block is returned.
|
69
|
+
#
|
70
|
+
# Bundler::Dir.mktmpdir {|dir|
|
71
|
+
# # use the directory...
|
72
|
+
# open("#{dir}/foo", "w") { ... }
|
73
|
+
# }
|
74
|
+
#
|
75
|
+
# If a block is not given,
|
76
|
+
# The path of the directory is returned.
|
77
|
+
# In this case, Bundler::Dir.mktmpdir doesn't remove the directory.
|
78
|
+
#
|
79
|
+
# dir = Bundler::Dir.mktmpdir
|
80
|
+
# begin
|
81
|
+
# # use the directory...
|
82
|
+
# open("#{dir}/foo", "w") { ... }
|
83
|
+
# ensure
|
84
|
+
# # remove the directory.
|
85
|
+
# Bundler::FileUtils.remove_entry dir
|
86
|
+
# end
|
87
|
+
#
|
88
|
+
def self.mktmpdir(prefix_suffix=nil, *rest, **options)
|
89
|
+
base = nil
|
90
|
+
path = Tmpname.create(prefix_suffix || "d", *rest, **options) {|p, _, _, d|
|
91
|
+
base = d
|
92
|
+
mkdir(p, 0700)
|
93
|
+
}
|
94
|
+
if block_given?
|
95
|
+
begin
|
96
|
+
yield path.dup
|
97
|
+
ensure
|
98
|
+
unless base
|
99
|
+
stat = File.stat(File.dirname(path))
|
100
|
+
if stat.world_writable? and !stat.sticky?
|
101
|
+
raise ArgumentError, "parent directory is world writable but not sticky"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
Bundler::FileUtils.remove_entry path
|
105
|
+
end
|
106
|
+
else
|
107
|
+
path
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
module Tmpname # :nodoc:
|
112
|
+
module_function
|
113
|
+
|
114
|
+
def tmpdir
|
115
|
+
Bundler::Dir.tmpdir
|
116
|
+
end
|
117
|
+
|
118
|
+
UNUSABLE_CHARS = [File::SEPARATOR, File::ALT_SEPARATOR, File::PATH_SEPARATOR, ":"].uniq.join("").freeze
|
119
|
+
|
120
|
+
class << (RANDOM = Random.new)
|
121
|
+
MAX = 36**6 # < 0x100000000
|
122
|
+
def next
|
123
|
+
rand(MAX).to_s(36)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
private_constant :RANDOM
|
127
|
+
|
128
|
+
def create(basename, tmpdir=nil, max_try: nil, **opts)
|
129
|
+
origdir = tmpdir
|
130
|
+
tmpdir ||= tmpdir()
|
131
|
+
n = nil
|
132
|
+
prefix, suffix = basename
|
133
|
+
prefix = (String.try_convert(prefix) or
|
134
|
+
raise ArgumentError, "unexpected prefix: #{prefix.inspect}")
|
135
|
+
prefix = prefix.delete(UNUSABLE_CHARS)
|
136
|
+
suffix &&= (String.try_convert(suffix) or
|
137
|
+
raise ArgumentError, "unexpected suffix: #{suffix.inspect}")
|
138
|
+
suffix &&= suffix.delete(UNUSABLE_CHARS)
|
139
|
+
begin
|
140
|
+
t = Time.now.strftime("%Y%m%d")
|
141
|
+
path = "#{prefix}#{t}-#{$$}-#{RANDOM.next}"\
|
142
|
+
"#{n ? %[-#{n}] : ''}#{suffix||''}"
|
143
|
+
path = File.join(tmpdir, path)
|
144
|
+
yield(path, n, opts, origdir)
|
145
|
+
rescue Errno::EEXIST
|
146
|
+
n ||= 0
|
147
|
+
n += 1
|
148
|
+
retry if !max_try or n < max_try
|
149
|
+
raise "cannot generate temporary name using `#{basename}' under `#{tmpdir}'"
|
150
|
+
end
|
151
|
+
path
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
data/lib/rubygems.rb
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
require 'rbconfig'
|
9
9
|
|
10
10
|
module Gem
|
11
|
-
VERSION = "3.2.
|
11
|
+
VERSION = "3.2.4".freeze
|
12
12
|
end
|
13
13
|
|
14
14
|
# Must be first since it unloads the prelude from 1.9.2
|
@@ -119,6 +119,10 @@ module Gem
|
|
119
119
|
# to avoid deprecation warnings in Ruby 2.7.
|
120
120
|
UNTAINT = RUBY_VERSION < '2.7' ? :untaint.to_sym : proc{}
|
121
121
|
|
122
|
+
# When https://bugs.ruby-lang.org/issues/17259 is available, there is no need to override Kernel#warn
|
123
|
+
KERNEL_WARN_IGNORES_INTERNAL_ENTRIES = RUBY_ENGINE == "truffleruby" ||
|
124
|
+
(RUBY_ENGINE == "ruby" && RUBY_VERSION >= '3.0')
|
125
|
+
|
122
126
|
##
|
123
127
|
# An Array of Regexps that match windows Ruby platforms.
|
124
128
|
|
@@ -975,7 +979,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
|
|
975
979
|
val = RbConfig::CONFIG[key]
|
976
980
|
next unless val and not val.empty?
|
977
981
|
".#{val}"
|
978
|
-
end
|
982
|
+
end,
|
979
983
|
].compact.uniq
|
980
984
|
end
|
981
985
|
|
@@ -73,7 +73,7 @@ class Gem::CommandManager
|
|
73
73
|
].freeze
|
74
74
|
|
75
75
|
ALIAS_COMMANDS = {
|
76
|
-
'i' => 'install'
|
76
|
+
'i' => 'install',
|
77
77
|
}.freeze
|
78
78
|
|
79
79
|
##
|
@@ -174,8 +174,8 @@ class Gem::CommandManager
|
|
174
174
|
else
|
175
175
|
cmd_name = args.shift.downcase
|
176
176
|
cmd = find_command cmd_name
|
177
|
-
cmd.invoke_with_build_args args, build_args
|
178
177
|
cmd.deprecation_warning if cmd.deprecated?
|
178
|
+
cmd.invoke_with_build_args args, build_args
|
179
179
|
end
|
180
180
|
end
|
181
181
|
|
@@ -61,14 +61,18 @@ Gems can be saved to a specified filename with the output option:
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def execute
|
64
|
-
|
65
|
-
|
64
|
+
if build_path = options[:build_path]
|
65
|
+
Dir.chdir(build_path) { build_gem }
|
66
|
+
return
|
67
|
+
end
|
68
|
+
|
69
|
+
build_gem
|
66
70
|
end
|
67
71
|
|
68
72
|
private
|
69
73
|
|
70
|
-
def find_gemspec
|
71
|
-
gemspecs = Dir.glob(
|
74
|
+
def find_gemspec(glob = "*.gemspec")
|
75
|
+
gemspecs = Dir.glob(glob).sort
|
72
76
|
|
73
77
|
if gemspecs.size > 1
|
74
78
|
alert_error "Multiple gemspecs found: #{gemspecs}, please specify one"
|
@@ -78,28 +82,19 @@ Gems can be saved to a specified filename with the output option:
|
|
78
82
|
gemspecs.first
|
79
83
|
end
|
80
84
|
|
81
|
-
def build_gem
|
82
|
-
gemspec =
|
83
|
-
|
84
|
-
if File.exist?(gemspec)
|
85
|
-
spec = Gem::Specification.load(gemspec)
|
86
|
-
|
87
|
-
if options[:build_path]
|
88
|
-
Dir.chdir(File.dirname(gemspec)) do
|
89
|
-
spec = Gem::Specification.load(File.basename(gemspec))
|
90
|
-
build_package(spec)
|
91
|
-
end
|
92
|
-
else
|
93
|
-
build_package(spec)
|
94
|
-
end
|
85
|
+
def build_gem
|
86
|
+
gemspec = resolve_gem_name
|
95
87
|
|
88
|
+
if gemspec
|
89
|
+
build_package(gemspec)
|
96
90
|
else
|
97
|
-
alert_error
|
91
|
+
alert_error error_message
|
98
92
|
terminate_interaction(1)
|
99
93
|
end
|
100
94
|
end
|
101
95
|
|
102
|
-
def build_package(
|
96
|
+
def build_package(gemspec)
|
97
|
+
spec = Gem::Specification.load(gemspec)
|
103
98
|
if spec
|
104
99
|
Gem::Package.build(
|
105
100
|
spec,
|
@@ -112,4 +107,26 @@ Gems can be saved to a specified filename with the output option:
|
|
112
107
|
terminate_interaction 1
|
113
108
|
end
|
114
109
|
end
|
110
|
+
|
111
|
+
def resolve_gem_name
|
112
|
+
return find_gemspec unless gem_name
|
113
|
+
|
114
|
+
if File.exist?(gem_name)
|
115
|
+
gem_name
|
116
|
+
else
|
117
|
+
find_gemspec("#{gem_name}.gemspec") || find_gemspec(gem_name)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def error_message
|
122
|
+
if gem_name
|
123
|
+
"Couldn't find a gemspec file matching '#{gem_name}' in #{Dir.pwd}"
|
124
|
+
else
|
125
|
+
"Couldn't find a gemspec file in #{Dir.pwd}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def gem_name
|
130
|
+
get_one_optional_argument
|
131
|
+
end
|
115
132
|
end
|
@@ -53,7 +53,7 @@ permission to.
|
|
53
53
|
def execute
|
54
54
|
@host = options[:host]
|
55
55
|
|
56
|
-
sign_in
|
56
|
+
sign_in(scope: get_owner_scope)
|
57
57
|
name = get_one_gem_name
|
58
58
|
|
59
59
|
add_owners name, options[:add]
|
@@ -102,10 +102,17 @@ permission to.
|
|
102
102
|
private
|
103
103
|
|
104
104
|
def send_owner_request(method, name, owner)
|
105
|
-
rubygems_api_request method, "api/v1/gems/#{name}/owners" do |request|
|
105
|
+
rubygems_api_request method, "api/v1/gems/#{name}/owners", scope: get_owner_scope(method: method) do |request|
|
106
106
|
request.set_form_data 'email' => owner
|
107
107
|
request.add_field "Authorization", api_key
|
108
|
-
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def get_owner_scope(method: nil)
|
112
|
+
if method == :post || options.any? && options[:add].any?
|
113
|
+
:add_owner
|
114
|
+
elsif method == :delete || options.any? && options[:remove].any?
|
115
|
+
:remove_owner
|
109
116
|
end
|
110
117
|
end
|
111
118
|
end
|
@@ -61,7 +61,7 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
61
61
|
options[:host]
|
62
62
|
end
|
63
63
|
|
64
|
-
sign_in @host
|
64
|
+
sign_in @host, scope: get_push_scope
|
65
65
|
|
66
66
|
send_gem(gem_name)
|
67
67
|
end
|
@@ -86,12 +86,11 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
86
86
|
private
|
87
87
|
|
88
88
|
def send_push_request(name, args)
|
89
|
-
rubygems_api_request(*args) do |request|
|
89
|
+
rubygems_api_request(*args, scope: get_push_scope) do |request|
|
90
90
|
request.body = Gem.read_binary name
|
91
91
|
request.add_field "Content-Length", request.body.size
|
92
92
|
request.add_field "Content-Type", "application/octet-stream"
|
93
93
|
request.add_field "Authorization", api_key
|
94
|
-
request.add_field "OTP", options[:otp] if options[:otp]
|
95
94
|
end
|
96
95
|
end
|
97
96
|
|
@@ -100,7 +99,11 @@ The push command will use ~/.gem/credentials to authenticate to a server, but yo
|
|
100
99
|
|
101
100
|
[
|
102
101
|
gem_metadata["default_gem_server"],
|
103
|
-
gem_metadata["allowed_push_host"]
|
102
|
+
gem_metadata["allowed_push_host"],
|
104
103
|
]
|
105
104
|
end
|
105
|
+
|
106
|
+
def get_push_scope
|
107
|
+
:push_rubygem
|
108
|
+
end
|
106
109
|
end
|
@@ -9,6 +9,14 @@ class Gem::Commands::QueryCommand < Gem::Command
|
|
9
9
|
|
10
10
|
include Gem::QueryUtils
|
11
11
|
|
12
|
+
alias warning_without_suggested_alternatives deprecation_warning
|
13
|
+
def deprecation_warning
|
14
|
+
warning_without_suggested_alternatives
|
15
|
+
|
16
|
+
message = "It is recommended that you use `gem search` or `gem list` instead.\n"
|
17
|
+
alert_warning message unless Gem::Deprecate.skip
|
18
|
+
end
|
19
|
+
|
12
20
|
def initialize(name = 'query',
|
13
21
|
summary = 'Query gem information in local or remote repositories')
|
14
22
|
super name, summary,
|
@@ -23,4 +31,13 @@ class Gem::Commands::QueryCommand < Gem::Command
|
|
23
31
|
|
24
32
|
add_query_options
|
25
33
|
end
|
34
|
+
|
35
|
+
def description # :nodoc:
|
36
|
+
<<-EOF
|
37
|
+
The query command is the basis for the list and search commands.
|
38
|
+
|
39
|
+
You should really use the list and search commands instead. This command
|
40
|
+
is too hard to use.
|
41
|
+
EOF
|
42
|
+
end
|
26
43
|
end
|
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'rubygems/command'
|
3
3
|
require 'rubygems/server'
|
4
|
+
require 'rubygems/deprecate'
|
4
5
|
|
5
6
|
class Gem::Commands::ServerCommand < Gem::Command
|
7
|
+
extend Gem::Deprecate
|
8
|
+
rubygems_deprecate_command
|
9
|
+
|
6
10
|
def initialize
|
7
11
|
super 'server', 'Documentation and gem repository HTTP server',
|
8
12
|
:port => 8808, :gemdir => [], :daemon => false
|
@@ -6,8 +6,8 @@ require 'rubygems/command'
|
|
6
6
|
# RubyGems checkout or tarball.
|
7
7
|
|
8
8
|
class Gem::Commands::SetupCommand < Gem::Command
|
9
|
-
HISTORY_HEADER =
|
10
|
-
VERSION_MATCHER =
|
9
|
+
HISTORY_HEADER = /^#\s*[\d.a-zA-Z]+\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
|
10
|
+
VERSION_MATCHER = /^#\s*([\d.a-zA-Z]+)\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
|
11
11
|
|
12
12
|
ENV_PATHS = %w[/usr/bin/env /bin/env].freeze
|
13
13
|
|
@@ -167,19 +167,18 @@ By default, this RubyGems will install gem as:
|
|
167
167
|
extend MakeDirs
|
168
168
|
|
169
169
|
lib_dir, bin_dir = make_destination_dirs install_destdir
|
170
|
-
man_dir =
|
170
|
+
man_dir = generate_default_man_dir install_destdir
|
171
171
|
|
172
172
|
install_lib lib_dir
|
173
173
|
|
174
|
-
install_man man_dir
|
175
|
-
|
176
174
|
install_executables bin_dir
|
177
175
|
|
178
176
|
remove_old_bin_files bin_dir
|
179
177
|
|
180
178
|
remove_old_lib_files lib_dir
|
181
179
|
|
182
|
-
|
180
|
+
# Can be removed one we drop support for bundler 2.2.3 (the last version installing man files to man_dir)
|
181
|
+
remove_old_man_files man_dir if man_dir && File.exist?(man_dir)
|
183
182
|
|
184
183
|
install_default_bundler_gem bin_dir
|
185
184
|
|
@@ -322,28 +321,10 @@ By default, this RubyGems will install gem as:
|
|
322
321
|
libs.each do |tool, path|
|
323
322
|
say "Installing #{tool}" if @verbose
|
324
323
|
|
325
|
-
lib_files =
|
326
|
-
lib_files.concat(bundler_template_files) if tool == 'Bundler'
|
327
|
-
|
328
|
-
pem_files = pem_files_in path
|
329
|
-
|
330
|
-
Dir.chdir path do
|
331
|
-
install_file_list(lib_files + pem_files, lib_dir)
|
332
|
-
end
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
|
-
def install_man(man_dir)
|
337
|
-
mans = { 'Bundler' => 'bundler/man' }
|
338
|
-
mans.each do |tool, path|
|
339
|
-
say "Installing #{tool} manpages" if @verbose
|
340
|
-
|
341
|
-
bundler_man1_files = bundler_man1_files_in(path)
|
342
|
-
bundler_man5_files = bundler_man5_files_in(path)
|
324
|
+
lib_files = files_in path
|
343
325
|
|
344
326
|
Dir.chdir path do
|
345
|
-
install_file_list(
|
346
|
-
install_file_list(bundler_man5_files, "#{man_dir}/man5")
|
327
|
+
install_file_list(lib_files, lib_dir)
|
347
328
|
end
|
348
329
|
end
|
349
330
|
end
|
@@ -394,12 +375,8 @@ By default, this RubyGems will install gem as:
|
|
394
375
|
specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform?
|
395
376
|
mkdir_p specs_dir, :mode => 0755
|
396
377
|
|
397
|
-
# Workaround for non-git environment.
|
398
|
-
gemspec = File.open('bundler/bundler.gemspec', 'rb'){|f| f.read.gsub(/`git ls-files -z`/, "''") }
|
399
|
-
File.open('bundler/bundler.gemspec', 'w'){|f| f.write gemspec }
|
400
|
-
|
401
378
|
bundler_spec = Gem::Specification.load("bundler/bundler.gemspec")
|
402
|
-
bundler_spec.files = Dir.chdir("bundler") { Dir["{*.md,{lib,exe
|
379
|
+
bundler_spec.files = Dir.chdir("bundler") { Dir["{*.md,{lib,exe}/**/*}"] }
|
403
380
|
bundler_spec.executables -= %w[bundler bundle_ruby]
|
404
381
|
|
405
382
|
# Remove bundler-*.gemspec in default specification directory.
|
@@ -462,19 +439,12 @@ By default, this RubyGems will install gem as:
|
|
462
439
|
return lib_dir, bin_dir
|
463
440
|
end
|
464
441
|
|
465
|
-
def make_man_dir(install_destdir)
|
466
|
-
man_dir = generate_default_man_dir(install_destdir)
|
467
|
-
|
468
|
-
mkdir_p man_dir, :mode => 0755
|
469
|
-
|
470
|
-
return man_dir
|
471
|
-
end
|
472
|
-
|
473
442
|
def generate_default_man_dir(install_destdir)
|
474
443
|
prefix = options[:prefix]
|
475
444
|
|
476
445
|
if prefix.empty?
|
477
446
|
man_dir = RbConfig::CONFIG['mandir']
|
447
|
+
return unless man_dir
|
478
448
|
else
|
479
449
|
man_dir = File.join prefix, 'man'
|
480
450
|
end
|
@@ -518,43 +488,9 @@ By default, this RubyGems will install gem as:
|
|
518
488
|
[lib_dir, bin_dir]
|
519
489
|
end
|
520
490
|
|
521
|
-
def
|
522
|
-
Dir.chdir dir do
|
523
|
-
Dir[File.join('**', '*pem')]
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
|
-
def rb_files_in(dir)
|
528
|
-
Dir.chdir dir do
|
529
|
-
Dir[File.join('**', '*rb')]
|
530
|
-
end
|
531
|
-
end
|
532
|
-
|
533
|
-
# for installation of bundler as default gems
|
534
|
-
def bundler_man1_files_in(dir)
|
535
|
-
Dir.chdir dir do
|
536
|
-
Dir['bundle*.1{,.txt,.ronn}']
|
537
|
-
end
|
538
|
-
end
|
539
|
-
|
540
|
-
# for installation of bundler as default gems
|
541
|
-
def bundler_man5_files_in(dir)
|
491
|
+
def files_in(dir)
|
542
492
|
Dir.chdir dir do
|
543
|
-
Dir
|
544
|
-
end
|
545
|
-
end
|
546
|
-
|
547
|
-
def bundler_template_files
|
548
|
-
Dir.chdir "bundler/lib" do
|
549
|
-
Dir.glob(File.join('bundler', 'templates', '**', '*'), File::FNM_DOTMATCH).
|
550
|
-
select{|f| !File.directory?(f) }
|
551
|
-
end
|
552
|
-
end
|
553
|
-
|
554
|
-
# for cleanup old bundler files
|
555
|
-
def template_files_in(dir)
|
556
|
-
Dir.chdir dir do
|
557
|
-
Dir.glob(File.join('templates', '**', '*'), File::FNM_DOTMATCH).
|
493
|
+
Dir.glob(File.join('**', '*'), File::FNM_DOTMATCH).
|
558
494
|
select{|f| !File.directory?(f) }
|
559
495
|
end
|
560
496
|
end
|
@@ -595,11 +531,9 @@ abort "#{deprecation_message}"
|
|
595
531
|
lib_dirs = { File.join(lib_dir, 'rubygems') => 'lib/rubygems' }
|
596
532
|
lib_dirs[File.join(lib_dir, 'bundler')] = 'bundler/lib/bundler'
|
597
533
|
lib_dirs.each do |old_lib_dir, new_lib_dir|
|
598
|
-
lib_files =
|
599
|
-
lib_files.concat(template_files_in(new_lib_dir)) if new_lib_dir =~ /bundler/
|
534
|
+
lib_files = files_in(new_lib_dir)
|
600
535
|
|
601
|
-
old_lib_files =
|
602
|
-
old_lib_files.concat(template_files_in(old_lib_dir)) if old_lib_dir =~ /bundler/
|
536
|
+
old_lib_files = files_in(old_lib_dir)
|
603
537
|
|
604
538
|
to_remove = old_lib_files - lib_files
|
605
539
|
|
@@ -614,24 +548,26 @@ abort "#{deprecation_message}"
|
|
614
548
|
end
|
615
549
|
end
|
616
550
|
|
617
|
-
def remove_old_man_files(
|
618
|
-
|
619
|
-
man_dirs.each do |old_man_dir, new_man_dir|
|
620
|
-
["1", "5"].each do |section|
|
621
|
-
man_files = send(:"bundler_man#{section}_files_in", new_man_dir)
|
551
|
+
def remove_old_man_files(old_man_dir)
|
552
|
+
old_man1_dir = "#{old_man_dir}/man1"
|
622
553
|
|
623
|
-
|
624
|
-
|
554
|
+
if File.exist?(old_man1_dir)
|
555
|
+
man1_to_remove = Dir.chdir(old_man1_dir) { Dir["bundle*.1{,.txt,.ronn}"] }
|
625
556
|
|
626
|
-
|
557
|
+
remove_file_list(man1_to_remove, old_man1_dir)
|
558
|
+
end
|
627
559
|
|
628
|
-
|
629
|
-
|
560
|
+
old_man5_dir = "#{old_man_dir}/man5"
|
561
|
+
|
562
|
+
if File.exist?(old_man5_dir)
|
563
|
+
man5_to_remove = Dir.chdir(old_man5_dir) { Dir["gemfile.5{,.txt,.ronn}"] }
|
564
|
+
|
565
|
+
remove_file_list(man5_to_remove, old_man5_dir)
|
630
566
|
end
|
631
567
|
end
|
632
568
|
|
633
569
|
def show_release_notes
|
634
|
-
release_notes = File.join Dir.pwd, '
|
570
|
+
release_notes = File.join Dir.pwd, 'CHANGELOG.md'
|
635
571
|
|
636
572
|
release_notes =
|
637
573
|
if File.exist? release_notes
|