rubygems-update 3.4.19 → 3.4.21
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +58 -0
- data/Manifest.txt +1 -0
- data/bundler/CHANGELOG.md +62 -2
- data/bundler/lib/bundler/build_metadata.rb +3 -3
- data/bundler/lib/bundler/cli/check.rb +1 -1
- data/bundler/lib/bundler/cli/gem.rb +1 -3
- data/bundler/lib/bundler/cli/info.rb +1 -1
- data/bundler/lib/bundler/cli/install.rb +2 -2
- data/bundler/lib/bundler/cli/lock.rb +26 -23
- data/bundler/lib/bundler/cli/open.rb +5 -7
- data/bundler/lib/bundler/cli/update.rb +1 -0
- data/bundler/lib/bundler/definition.rb +42 -25
- data/bundler/lib/bundler/env.rb +2 -2
- data/bundler/lib/bundler/fetcher/base.rb +2 -2
- data/bundler/lib/bundler/fetcher/compact_index.rb +1 -5
- data/bundler/lib/bundler/fetcher/dependency.rb +1 -1
- data/bundler/lib/bundler/fetcher.rb +31 -30
- data/bundler/lib/bundler/gem_version_promoter.rb +2 -2
- data/bundler/lib/bundler/index.rb +62 -31
- data/bundler/lib/bundler/injector.rb +1 -1
- data/bundler/lib/bundler/installer/parallel_installer.rb +0 -26
- data/bundler/lib/bundler/installer/standalone.rb +15 -1
- data/bundler/lib/bundler/lockfile_parser.rb +32 -39
- data/bundler/lib/bundler/man/bundle-add.1 +1 -1
- data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
- data/bundler/lib/bundler/man/bundle-check.1 +1 -1
- data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
- data/bundler/lib/bundler/man/bundle-config.1 +1 -1
- data/bundler/lib/bundler/man/bundle-console.1 +1 -1
- data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
- data/bundler/lib/bundler/man/bundle-exec.1 +2 -2
- data/bundler/lib/bundler/man/bundle-exec.1.ronn +2 -3
- data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
- data/bundler/lib/bundler/man/bundle-help.1 +1 -1
- data/bundler/lib/bundler/man/bundle-info.1 +1 -1
- data/bundler/lib/bundler/man/bundle-init.1 +1 -1
- data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
- data/bundler/lib/bundler/man/bundle-install.1 +1 -1
- data/bundler/lib/bundler/man/bundle-list.1 +1 -1
- data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
- data/bundler/lib/bundler/man/bundle-open.1 +1 -1
- data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
- data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
- data/bundler/lib/bundler/man/bundle-plugin.1 +17 -17
- data/bundler/lib/bundler/man/bundle-plugin.1.ronn +5 -5
- data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
- data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
- data/bundler/lib/bundler/man/bundle-show.1 +1 -1
- data/bundler/lib/bundler/man/bundle-update.1 +1 -1
- data/bundler/lib/bundler/man/bundle-version.1 +1 -1
- data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
- data/bundler/lib/bundler/man/bundle.1 +1 -1
- data/bundler/lib/bundler/man/gemfile.5 +12 -1
- data/bundler/lib/bundler/man/gemfile.5.ronn +5 -0
- data/bundler/lib/bundler/plugin.rb +1 -1
- data/bundler/lib/bundler/resolver/package.rb +5 -0
- data/bundler/lib/bundler/resolver.rb +45 -10
- data/bundler/lib/bundler/retry.rb +1 -1
- data/bundler/lib/bundler/ruby_dsl.rb +23 -2
- data/bundler/lib/bundler/ruby_version.rb +8 -1
- data/bundler/lib/bundler/self_manager.rb +2 -0
- data/bundler/lib/bundler/settings.rb +86 -25
- data/bundler/lib/bundler/shared_helpers.rb +16 -1
- data/bundler/lib/bundler/source/git/git_proxy.rb +27 -6
- data/bundler/lib/bundler/source/rubygems.rb +22 -25
- data/bundler/lib/bundler/spec_set.rb +2 -2
- data/bundler/lib/bundler/stub_specification.rb +4 -2
- data/bundler/lib/bundler/templates/newgem/Rakefile.tt +6 -2
- data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +1 -1
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler/yaml_serializer.rb +6 -7
- data/lib/rubygems/available_set.rb +1 -1
- data/lib/rubygems/basic_specification.rb +3 -3
- data/lib/rubygems/command.rb +17 -20
- data/lib/rubygems/command_manager.rb +1 -1
- data/lib/rubygems/commands/cert_command.rb +3 -3
- data/lib/rubygems/commands/check_command.rb +5 -1
- data/lib/rubygems/commands/cleanup_command.rb +1 -1
- data/lib/rubygems/commands/contents_command.rb +1 -1
- data/lib/rubygems/commands/dependency_command.rb +3 -4
- data/lib/rubygems/commands/help_command.rb +2 -2
- data/lib/rubygems/commands/open_command.rb +1 -3
- data/lib/rubygems/commands/owner_command.rb +9 -11
- data/lib/rubygems/commands/setup_command.rb +8 -8
- data/lib/rubygems/commands/specification_command.rb +5 -1
- data/lib/rubygems/commands/stale_command.rb +1 -1
- data/lib/rubygems/commands/uninstall_command.rb +6 -7
- data/lib/rubygems/commands/unpack_command.rb +4 -6
- data/lib/rubygems/commands/update_command.rb +3 -3
- data/lib/rubygems/commands/yank_command.rb +1 -1
- data/lib/rubygems/config_file.rb +60 -13
- data/lib/rubygems/core_ext/kernel_gem.rb +2 -2
- data/lib/rubygems/core_ext/kernel_require.rb +1 -1
- data/lib/rubygems/core_ext/kernel_warn.rb +4 -5
- data/lib/rubygems/defaults.rb +6 -2
- data/lib/rubygems/dependency_installer.rb +8 -12
- data/lib/rubygems/deprecate.rb +4 -3
- data/lib/rubygems/doctor.rb +1 -1
- data/lib/rubygems/errors.rb +1 -1
- data/lib/rubygems/exceptions.rb +1 -1
- data/lib/rubygems/ext/builder.rb +5 -4
- data/lib/rubygems/ext/cargo_builder.rb +2 -2
- data/lib/rubygems/gem_runner.rb +5 -1
- data/lib/rubygems/gemcutter_utilities.rb +4 -4
- data/lib/rubygems/indexer.rb +1 -1
- data/lib/rubygems/install_update_options.rb +1 -1
- data/lib/rubygems/installer.rb +17 -19
- data/lib/rubygems/name_tuple.rb +1 -1
- data/lib/rubygems/package/old.rb +1 -1
- data/lib/rubygems/package/tar_reader/entry.rb +18 -20
- data/lib/rubygems/package/tar_reader.rb +0 -5
- data/lib/rubygems/package/tar_writer.rb +1 -1
- data/lib/rubygems/package.rb +18 -12
- data/lib/rubygems/platform.rb +6 -2
- data/lib/rubygems/query_utils.rb +5 -5
- data/lib/rubygems/remote_fetcher.rb +10 -2
- data/lib/rubygems/request_set/gem_dependency_api.rb +1 -1
- data/lib/rubygems/request_set.rb +2 -1
- data/lib/rubygems/requirement.rb +1 -1
- data/lib/rubygems/resolver/activation_request.rb +2 -4
- data/lib/rubygems/resolver/api_set.rb +2 -1
- data/lib/rubygems/resolver/api_specification.rb +1 -1
- data/lib/rubygems/resolver/installed_specification.rb +1 -1
- data/lib/rubygems/resolver/local_specification.rb +1 -1
- data/lib/rubygems/s3_uri_signer.rb +1 -1
- data/lib/rubygems/security/signer.rb +10 -2
- data/lib/rubygems/security/trust_dir.rb +8 -10
- data/lib/rubygems/security.rb +2 -2
- data/lib/rubygems/security_option.rb +1 -1
- data/lib/rubygems/source/local.rb +34 -37
- data/lib/rubygems/source.rb +7 -3
- data/lib/rubygems/source_list.rb +2 -2
- data/lib/rubygems/spec_fetcher.rb +29 -33
- data/lib/rubygems/specification.rb +43 -36
- data/lib/rubygems/specification_policy.rb +36 -35
- data/lib/rubygems/stub_specification.rb +13 -10
- data/lib/rubygems/uninstaller.rb +2 -2
- data/lib/rubygems/update_suggestion.rb +1 -1
- data/lib/rubygems/user_interaction.rb +2 -2
- data/lib/rubygems/util/licenses.rb +115 -0
- data/lib/rubygems/util.rb +5 -1
- data/lib/rubygems/validator.rb +5 -7
- data/lib/rubygems/version.rb +3 -2
- data/lib/rubygems/yaml_serializer.rb +88 -0
- data/lib/rubygems.rb +8 -10
- data/rubygems-update.gemspec +1 -1
- data/setup.rb +2 -0
- data/test/rubygems/bundler_test_gem.rb +6 -3
- data/test/rubygems/helper.rb +38 -32
- data/test/rubygems/package/tar_test_case.rb +2 -2
- data/test/rubygems/test_gem.rb +55 -30
- data/test/rubygems/test_gem_command.rb +3 -1
- data/test/rubygems/test_gem_commands_build_command.rb +2 -1
- data/test/rubygems/test_gem_commands_cert_command.rb +22 -22
- data/test/rubygems/test_gem_commands_cleanup_command.rb +2 -2
- data/test/rubygems/test_gem_commands_environment_command.rb +2 -1
- data/test/rubygems/test_gem_commands_exec_command.rb +5 -1
- data/test/rubygems/test_gem_commands_install_command.rb +3 -3
- data/test/rubygems/test_gem_commands_open_command.rb +5 -2
- data/test/rubygems/test_gem_commands_pristine_command.rb +2 -2
- data/test/rubygems/test_gem_commands_push_command.rb +7 -6
- data/test/rubygems/test_gem_commands_signin_command.rb +8 -8
- data/test/rubygems/test_gem_commands_stale_command.rb +1 -1
- data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -1
- data/test/rubygems/test_gem_commands_unpack_command.rb +2 -2
- data/test/rubygems/test_gem_config_file.rb +46 -12
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +28 -12
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +16 -14
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +1 -1
- data/test/rubygems/test_gem_ext_cargo_builder.rb +2 -2
- data/test/rubygems/test_gem_gemcutter_utilities.rb +8 -5
- data/test/rubygems/test_gem_indexer.rb +1 -1
- data/test/rubygems/test_gem_install_update_options.rb +3 -3
- data/test/rubygems/test_gem_installer.rb +15 -15
- data/test/rubygems/test_gem_package.rb +152 -36
- data/test/rubygems/test_gem_package_old.rb +1 -1
- data/test/rubygems/test_gem_package_tar_header.rb +10 -10
- data/test/rubygems/test_gem_package_tar_reader.rb +4 -4
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +53 -1
- data/test/rubygems/test_gem_package_tar_writer.rb +41 -41
- data/test/rubygems/test_gem_rdoc.rb +2 -2
- data/test/rubygems/test_gem_remote_fetcher.rb +34 -34
- data/test/rubygems/test_gem_request.rb +5 -5
- data/test/rubygems/test_gem_request_connection_pools.rb +2 -1
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +14 -7
- data/test/rubygems/test_gem_requirement.rb +1 -1
- data/test/rubygems/test_gem_security.rb +2 -2
- data/test/rubygems/test_gem_security_signer.rb +2 -2
- data/test/rubygems/test_gem_security_trust_dir.rb +6 -6
- data/test/rubygems/test_gem_spec_fetcher.rb +2 -2
- data/test/rubygems/test_gem_specification.rb +71 -35
- data/test/rubygems/test_gem_update_suggestion.rb +23 -23
- data/test/rubygems/test_gem_util.rb +2 -2
- data/test/rubygems/test_gem_version.rb +4 -2
- data/test/rubygems/test_require.rb +4 -6
- data/test/rubygems/utilities.rb +4 -3
- metadata +4 -3
@@ -28,12 +28,12 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_add_file
|
31
|
-
Time.stub :now, Time.at(
|
32
|
-
@tar_writer.add_file "x",
|
31
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
32
|
+
@tar_writer.add_file "x", 0o644 do |f|
|
33
33
|
f.write "a" * 10
|
34
34
|
end
|
35
35
|
|
36
|
-
assert_headers_equal(tar_file_header("x", "",
|
36
|
+
assert_headers_equal(tar_file_header("x", "", 0o644, 10, Time.now),
|
37
37
|
@io.string[0, 512])
|
38
38
|
end
|
39
39
|
assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
|
@@ -42,19 +42,19 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
42
42
|
|
43
43
|
def test_add_file_source_date_epoch
|
44
44
|
ENV["SOURCE_DATE_EPOCH"] = "123456789"
|
45
|
-
Time.stub :now, Time.at(
|
46
|
-
@tar_writer.mkdir "foo",
|
45
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
46
|
+
@tar_writer.mkdir "foo", 0o644
|
47
47
|
|
48
|
-
assert_headers_equal tar_dir_header("foo", "",
|
48
|
+
assert_headers_equal tar_dir_header("foo", "", 0o644, Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc),
|
49
49
|
@io.string[0, 512]
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_add_symlink
|
54
|
-
Time.stub :now, Time.at(
|
55
|
-
@tar_writer.add_symlink "x", "y",
|
54
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
55
|
+
@tar_writer.add_symlink "x", "y", 0o644
|
56
56
|
|
57
|
-
assert_headers_equal(tar_symlink_header("x", "",
|
57
|
+
assert_headers_equal(tar_symlink_header("x", "", 0o644, Time.now, "y"),
|
58
58
|
@io.string[0, 512])
|
59
59
|
end
|
60
60
|
assert_equal 512, @io.pos
|
@@ -62,10 +62,10 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
62
62
|
|
63
63
|
def test_add_symlink_source_date_epoch
|
64
64
|
ENV["SOURCE_DATE_EPOCH"] = "123456789"
|
65
|
-
Time.stub :now, Time.at(
|
66
|
-
@tar_writer.add_symlink "x", "y",
|
65
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
66
|
+
@tar_writer.add_symlink "x", "y", 0o644
|
67
67
|
|
68
|
-
assert_headers_equal(tar_symlink_header("x", "",
|
68
|
+
assert_headers_equal(tar_symlink_header("x", "", 0o644, Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc, "y"),
|
69
69
|
@io.string[0, 512])
|
70
70
|
end
|
71
71
|
end
|
@@ -73,8 +73,8 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
73
73
|
def test_add_file_digest
|
74
74
|
digest_algorithms = Digest::SHA1.new, Digest::SHA512.new
|
75
75
|
|
76
|
-
Time.stub :now, Time.at(
|
77
|
-
digests = @tar_writer.add_file_digest "x",
|
76
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
77
|
+
digests = @tar_writer.add_file_digest "x", 0o644, digest_algorithms do |io|
|
78
78
|
io.write "a" * 10
|
79
79
|
end
|
80
80
|
|
@@ -86,7 +86,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
86
86
|
"e1cf14b0",
|
87
87
|
digests["SHA512"].hexdigest
|
88
88
|
|
89
|
-
assert_headers_equal(tar_file_header("x", "",
|
89
|
+
assert_headers_equal(tar_file_header("x", "", 0o644, 10, Time.now),
|
90
90
|
@io.string[0, 512])
|
91
91
|
end
|
92
92
|
assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
|
@@ -96,8 +96,8 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
96
96
|
def test_add_file_digest_multiple
|
97
97
|
digest_algorithms = [Digest::SHA1.new, Digest::SHA512.new]
|
98
98
|
|
99
|
-
Time.stub :now, Time.at(
|
100
|
-
digests = @tar_writer.add_file_digest "x",
|
99
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
100
|
+
digests = @tar_writer.add_file_digest "x", 0o644, digest_algorithms do |io|
|
101
101
|
io.write "a" * 10
|
102
102
|
end
|
103
103
|
|
@@ -109,7 +109,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
109
109
|
"e1cf14b0",
|
110
110
|
digests["SHA512"].hexdigest
|
111
111
|
|
112
|
-
assert_headers_equal(tar_file_header("x", "",
|
112
|
+
assert_headers_equal(tar_file_header("x", "", 0o644, 10, Time.now),
|
113
113
|
@io.string[0, 512])
|
114
114
|
end
|
115
115
|
assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
|
@@ -121,12 +121,12 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
121
121
|
|
122
122
|
signer = Gem::Security::Signer.new PRIVATE_KEY, [PUBLIC_CERT]
|
123
123
|
|
124
|
-
Time.stub :now, Time.at(
|
125
|
-
@tar_writer.add_file_signed "x",
|
124
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
125
|
+
@tar_writer.add_file_signed "x", 0o644, signer do |io|
|
126
126
|
io.write "a" * 10
|
127
127
|
end
|
128
128
|
|
129
|
-
assert_headers_equal(tar_file_header("x", "",
|
129
|
+
assert_headers_equal(tar_file_header("x", "", 0o644, 10, Time.now),
|
130
130
|
@io.string[0, 512])
|
131
131
|
|
132
132
|
assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
|
@@ -136,7 +136,7 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
136
136
|
|
137
137
|
signature = signer.sign digest.digest
|
138
138
|
|
139
|
-
assert_headers_equal(tar_file_header("x.sig", "",
|
139
|
+
assert_headers_equal(tar_file_header("x.sig", "", 0o444, signature.length,
|
140
140
|
Time.now),
|
141
141
|
@io.string[1024, 512])
|
142
142
|
assert_equal "#{signature}#{"\0" * (512 - signature.length)}",
|
@@ -149,12 +149,12 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
149
149
|
def test_add_file_signer_empty
|
150
150
|
signer = Gem::Security::Signer.new nil, nil
|
151
151
|
|
152
|
-
Time.stub :now, Time.at(
|
153
|
-
@tar_writer.add_file_signed "x",
|
152
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
153
|
+
@tar_writer.add_file_signed "x", 0o644, signer do |io|
|
154
154
|
io.write "a" * 10
|
155
155
|
end
|
156
156
|
|
157
|
-
assert_headers_equal(tar_file_header("x", "",
|
157
|
+
assert_headers_equal(tar_file_header("x", "", 0o644, 10, Time.now),
|
158
158
|
@io.string[0, 512])
|
159
159
|
end
|
160
160
|
assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
|
@@ -163,12 +163,12 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
163
163
|
end
|
164
164
|
|
165
165
|
def test_add_file_simple
|
166
|
-
Time.stub :now, Time.at(
|
167
|
-
@tar_writer.add_file_simple "x",
|
166
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
167
|
+
@tar_writer.add_file_simple "x", 0o644, 10 do |io|
|
168
168
|
io.write "a" * 10
|
169
169
|
end
|
170
170
|
|
171
|
-
assert_headers_equal(tar_file_header("x", "",
|
171
|
+
assert_headers_equal(tar_file_header("x", "", 0o644, 10, Time.now),
|
172
172
|
@io.string[0, 512])
|
173
173
|
|
174
174
|
assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
|
@@ -178,18 +178,18 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
178
178
|
|
179
179
|
def test_add_file_simple_source_date_epoch
|
180
180
|
ENV["SOURCE_DATE_EPOCH"] = "123456789"
|
181
|
-
Time.stub :now, Time.at(
|
182
|
-
@tar_writer.add_file_simple "x",
|
181
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
182
|
+
@tar_writer.add_file_simple "x", 0o644, 10 do |io|
|
183
183
|
io.write "a" * 10
|
184
184
|
end
|
185
185
|
|
186
|
-
assert_headers_equal(tar_file_header("x", "",
|
186
|
+
assert_headers_equal(tar_file_header("x", "", 0o644, 10, Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc),
|
187
187
|
@io.string[0, 512])
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
191
|
def test_add_file_simple_padding
|
192
|
-
Time.stub :now, Time.at(
|
192
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
193
193
|
@tar_writer.add_file_simple "x", 0, 100
|
194
194
|
|
195
195
|
assert_headers_equal tar_file_header("x", "", 0, 100, Time.now),
|
@@ -247,10 +247,10 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
247
247
|
end
|
248
248
|
|
249
249
|
def test_mkdir
|
250
|
-
Time.stub :now, Time.at(
|
251
|
-
@tar_writer.mkdir "foo",
|
250
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
251
|
+
@tar_writer.mkdir "foo", 0o644
|
252
252
|
|
253
|
-
assert_headers_equal tar_dir_header("foo", "",
|
253
|
+
assert_headers_equal tar_dir_header("foo", "", 0o644, Time.now),
|
254
254
|
@io.string[0, 512]
|
255
255
|
|
256
256
|
assert_equal 512, @io.pos
|
@@ -259,20 +259,20 @@ class TestGemPackageTarWriter < Gem::Package::TarTestCase
|
|
259
259
|
|
260
260
|
def test_mkdir_source_date_epoch
|
261
261
|
ENV["SOURCE_DATE_EPOCH"] = "123456789"
|
262
|
-
Time.stub :now, Time.at(
|
263
|
-
@tar_writer.mkdir "foo",
|
262
|
+
Time.stub :now, Time.at(1_458_518_157) do
|
263
|
+
@tar_writer.mkdir "foo", 0o644
|
264
264
|
|
265
|
-
assert_headers_equal tar_dir_header("foo", "",
|
265
|
+
assert_headers_equal tar_dir_header("foo", "", 0o644, Time.at(ENV["SOURCE_DATE_EPOCH"].to_i).utc),
|
266
266
|
@io.string[0, 512]
|
267
267
|
end
|
268
268
|
end
|
269
269
|
|
270
270
|
def test_split_name
|
271
271
|
assert_equal ["b" * 100, "a" * 155],
|
272
|
-
@tar_writer.split_name("#{
|
272
|
+
@tar_writer.split_name("#{"a" * 155}/#{"b" * 100}")
|
273
273
|
|
274
|
-
assert_equal ["#{
|
275
|
-
@tar_writer.split_name("#{
|
274
|
+
assert_equal ["#{"qwer/" * 19}bla", "a" * 151],
|
275
|
+
@tar_writer.split_name("#{"a" * 151}/#{"qwer/" * 19}bla")
|
276
276
|
names = [
|
277
277
|
([""] + ["123456789"] * 9 + ["1234567890"]).join("/"), # 101 bytes (several pieces)
|
278
278
|
(["123456789"] * 9 + ["1234567890"] + [""]).join("/"), # 101 bytes (several pieces)
|
@@ -100,7 +100,7 @@ class TestGemRDoc < Gem::TestCase
|
|
100
100
|
|
101
101
|
assert_equal @a.base_dir, e.directory
|
102
102
|
ensure
|
103
|
-
FileUtils.chmod(
|
103
|
+
FileUtils.chmod(0o755, @a.base_dir) if File.directory?(@a.base_dir)
|
104
104
|
end
|
105
105
|
|
106
106
|
def test_ri_installed?
|
@@ -130,7 +130,7 @@ class TestGemRDoc < Gem::TestCase
|
|
130
130
|
assert_equal @a.doc_dir, e.directory
|
131
131
|
ensure
|
132
132
|
if File.exist? @a.doc_dir
|
133
|
-
FileUtils.chmod
|
133
|
+
FileUtils.chmod 0o755, @a.doc_dir
|
134
134
|
FileUtils.rm_r @a.doc_dir
|
135
135
|
end
|
136
136
|
end
|
@@ -361,9 +361,13 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
361
361
|
FileUtils.mv @a1_gem, @tempdir
|
362
362
|
local_path = File.join @tempdir, @a1.file_name
|
363
363
|
inst = nil
|
364
|
-
FileUtils.chmod
|
365
|
-
|
366
|
-
|
364
|
+
FileUtils.chmod 0o555, @a1.cache_dir
|
365
|
+
begin
|
366
|
+
FileUtils.mkdir_p File.join(Gem.user_dir, "cache")
|
367
|
+
rescue StandardError
|
368
|
+
nil
|
369
|
+
end
|
370
|
+
FileUtils.chmod 0o555, File.join(Gem.user_dir, "cache")
|
367
371
|
|
368
372
|
Dir.chdir @tempdir do
|
369
373
|
inst = Gem::RemoteFetcher.fetcher
|
@@ -372,21 +376,21 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
372
376
|
assert_equal(File.join(@tempdir, @a1.file_name),
|
373
377
|
inst.download(@a1, local_path))
|
374
378
|
ensure
|
375
|
-
FileUtils.chmod
|
376
|
-
FileUtils.chmod
|
379
|
+
FileUtils.chmod 0o755, File.join(Gem.user_dir, "cache")
|
380
|
+
FileUtils.chmod 0o755, @a1.cache_dir
|
377
381
|
end
|
378
382
|
|
379
383
|
def test_download_read_only
|
380
|
-
FileUtils.chmod
|
381
|
-
FileUtils.chmod
|
384
|
+
FileUtils.chmod 0o555, @a1.cache_dir
|
385
|
+
FileUtils.chmod 0o555, @gemhome
|
382
386
|
|
383
387
|
fetcher = util_fuck_with_fetcher File.read(@a1_gem)
|
384
388
|
fetcher.download(@a1, "http://gems.example.com")
|
385
389
|
a1_cache_gem = File.join Gem.user_dir, "cache", @a1.file_name
|
386
390
|
assert File.exist? a1_cache_gem
|
387
391
|
ensure
|
388
|
-
FileUtils.chmod
|
389
|
-
FileUtils.chmod
|
392
|
+
FileUtils.chmod 0o755, @gemhome
|
393
|
+
FileUtils.chmod 0o755, @a1.cache_dir
|
390
394
|
end
|
391
395
|
end
|
392
396
|
|
@@ -749,7 +753,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
749
753
|
"my-bucket" => { :id => "testuser", :secret => "testpass" },
|
750
754
|
}
|
751
755
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
752
|
-
Time.stub :now, Time.at(
|
756
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
753
757
|
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b"
|
754
758
|
end
|
755
759
|
ensure
|
@@ -761,7 +765,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
761
765
|
"my-bucket" => { :id => "testuser", :secret => "testpass", :region => "us-west-2" },
|
762
766
|
}
|
763
767
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
764
|
-
Time.stub :now, Time.at(
|
768
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
765
769
|
assert_fetch_s3 url, "4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9", nil, "us-west-2"
|
766
770
|
end
|
767
771
|
ensure
|
@@ -773,7 +777,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
773
777
|
"my-bucket" => { :id => "testuser", :secret => "testpass", :security_token => "testtoken" },
|
774
778
|
}
|
775
779
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
776
|
-
Time.stub :now, Time.at(
|
780
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
777
781
|
assert_fetch_s3 url, "935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c", "testtoken"
|
778
782
|
end
|
779
783
|
ensure
|
@@ -788,7 +792,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
788
792
|
"my-bucket" => { :provider => "env" },
|
789
793
|
}
|
790
794
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
791
|
-
Time.stub :now, Time.at(
|
795
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
792
796
|
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b"
|
793
797
|
end
|
794
798
|
ensure
|
@@ -804,7 +808,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
804
808
|
"my-bucket" => { :provider => "env", :region => "us-west-2" },
|
805
809
|
}
|
806
810
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
807
|
-
Time.stub :now, Time.at(
|
811
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
808
812
|
assert_fetch_s3 url, "4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9", nil, "us-west-2"
|
809
813
|
end
|
810
814
|
ensure
|
@@ -820,7 +824,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
820
824
|
"my-bucket" => { :provider => "env" },
|
821
825
|
}
|
822
826
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
823
|
-
Time.stub :now, Time.at(
|
827
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
824
828
|
assert_fetch_s3 url, "935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c", "testtoken"
|
825
829
|
end
|
826
830
|
ensure
|
@@ -830,7 +834,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
830
834
|
|
831
835
|
def test_fetch_s3_url_creds
|
832
836
|
url = "s3://testuser:testpass@my-bucket/gems/specs.4.8.gz"
|
833
|
-
Time.stub :now, Time.at(
|
837
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
834
838
|
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b"
|
835
839
|
end
|
836
840
|
end
|
@@ -841,7 +845,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
841
845
|
}
|
842
846
|
|
843
847
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
844
|
-
Time.stub :now, Time.at(
|
848
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
845
849
|
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b", nil, "us-east-1",
|
846
850
|
'{"AccessKeyId": "testuser", "SecretAccessKey": "testpass"}'
|
847
851
|
end
|
@@ -855,7 +859,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
855
859
|
}
|
856
860
|
|
857
861
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
858
|
-
Time.stub :now, Time.at(
|
862
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
859
863
|
assert_fetch_s3 url, "4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9", nil, "us-west-2",
|
860
864
|
'{"AccessKeyId": "testuser", "SecretAccessKey": "testpass"}'
|
861
865
|
end
|
@@ -869,7 +873,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
869
873
|
}
|
870
874
|
|
871
875
|
url = "s3://my-bucket/gems/specs.4.8.gz"
|
872
|
-
Time.stub :now, Time.at(
|
876
|
+
Time.stub :now, Time.at(1_561_353_581) do
|
873
877
|
assert_fetch_s3 url, "935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c", "testtoken", "us-east-1",
|
874
878
|
'{"AccessKeyId": "testuser", "SecretAccessKey": "testpass", "Token": "testtoken"}'
|
875
879
|
end
|
@@ -1151,14 +1155,12 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
1151
1155
|
end
|
1152
1156
|
server.ssl_context.tmp_dh_callback = proc { TEST_KEY_DH2048 }
|
1153
1157
|
t = Thread.new do
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1160
|
-
server.shutdown
|
1161
|
-
end
|
1158
|
+
server.start
|
1159
|
+
rescue Exception => ex
|
1160
|
+
puts "ERROR during server thread: #{ex.message}"
|
1161
|
+
raise
|
1162
|
+
ensure
|
1163
|
+
server.shutdown
|
1162
1164
|
end
|
1163
1165
|
while server.status != :Running
|
1164
1166
|
sleep 0.1
|
@@ -1205,13 +1207,11 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
1205
1207
|
end
|
1206
1208
|
end
|
1207
1209
|
th = Thread.new do
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
s.shutdown
|
1214
|
-
end
|
1210
|
+
s.start
|
1211
|
+
rescue Exception => ex
|
1212
|
+
abort "ERROR during server thread: #{ex.message}"
|
1213
|
+
ensure
|
1214
|
+
s.shutdown
|
1215
1215
|
end
|
1216
1216
|
th[:server] = s
|
1217
1217
|
th
|
@@ -112,8 +112,8 @@ class TestGemRequest < Gem::TestCase
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def test_configure_connection_for_https_ssl_ca_cert
|
115
|
-
ssl_ca_cert
|
116
|
-
|
115
|
+
ssl_ca_cert = Gem.configuration.ssl_ca_cert
|
116
|
+
Gem.configuration.ssl_ca_cert = CA_CERT_FILE
|
117
117
|
|
118
118
|
connection = Net::HTTP.new "localhost", 443
|
119
119
|
|
@@ -214,7 +214,7 @@ class TestGemRequest < Gem::TestCase
|
|
214
214
|
end
|
215
215
|
|
216
216
|
auth_header = conn.payload["Authorization"]
|
217
|
-
assert_equal "Basic #{base64_encode64(
|
217
|
+
assert_equal "Basic #{base64_encode64("user:pass")}".strip, auth_header
|
218
218
|
assert_includes @ui.output, "GET https://user:REDACTED@example.rubygems/specs.#{Gem.marshal_version}"
|
219
219
|
end
|
220
220
|
|
@@ -231,7 +231,7 @@ class TestGemRequest < Gem::TestCase
|
|
231
231
|
end
|
232
232
|
|
233
233
|
auth_header = conn.payload["Authorization"]
|
234
|
-
assert_equal "Basic #{base64_encode64(
|
234
|
+
assert_equal "Basic #{base64_encode64("user:{DEScede}pass")}".strip, auth_header
|
235
235
|
assert_includes @ui.output, "GET https://user:REDACTED@example.rubygems/specs.#{Gem.marshal_version}"
|
236
236
|
end
|
237
237
|
|
@@ -248,7 +248,7 @@ class TestGemRequest < Gem::TestCase
|
|
248
248
|
end
|
249
249
|
|
250
250
|
auth_header = conn.payload["Authorization"]
|
251
|
-
assert_equal "Basic #{base64_encode64(
|
251
|
+
assert_equal "Basic #{base64_encode64("{DEScede}pass:x-oauth-basic")}".strip, auth_header
|
252
252
|
assert_includes @ui.output, "GET https://REDACTED:x-oauth-basic@example.rubygems/specs.#{Gem.marshal_version}"
|
253
253
|
end
|
254
254
|
|
@@ -121,7 +121,8 @@ class TestGemRequestConnectionPool < Gem::TestCase
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def test_net_http_args_no_proxy
|
124
|
-
orig_no_proxy
|
124
|
+
orig_no_proxy = ENV["no_proxy"]
|
125
|
+
ENV["no_proxy"] = "example"
|
125
126
|
|
126
127
|
pools = Gem::Request::ConnectionPools.new nil, []
|
127
128
|
|
@@ -246,7 +246,8 @@ class TestGemRequestSetGemDependencyAPI < Gem::TestCase
|
|
246
246
|
end
|
247
247
|
|
248
248
|
def test_gem_platforms
|
249
|
-
win_platform
|
249
|
+
win_platform = Gem.win_platform?
|
250
|
+
Gem.win_platform = false
|
250
251
|
|
251
252
|
with_engine_version "ruby", "2.0.0" do
|
252
253
|
@gda.gem "a", :platforms => :ruby
|
@@ -258,7 +259,8 @@ class TestGemRequestSetGemDependencyAPI < Gem::TestCase
|
|
258
259
|
end
|
259
260
|
|
260
261
|
def test_gem_platforms_bundler_ruby
|
261
|
-
win_platform
|
262
|
+
win_platform = Gem.win_platform?
|
263
|
+
Gem.win_platform = false
|
262
264
|
|
263
265
|
with_engine_version "ruby", "2.0.0" do
|
264
266
|
set = Gem::RequestSet.new
|
@@ -320,7 +322,8 @@ class TestGemRequestSetGemDependencyAPI < Gem::TestCase
|
|
320
322
|
end
|
321
323
|
|
322
324
|
def test_gem_platforms_maglev
|
323
|
-
win_platform
|
325
|
+
win_platform = Gem.win_platform?
|
326
|
+
Gem.win_platform = false
|
324
327
|
|
325
328
|
with_engine_version "maglev", "1.0.0" do
|
326
329
|
set = Gem::RequestSet.new
|
@@ -356,7 +359,8 @@ class TestGemRequestSetGemDependencyAPI < Gem::TestCase
|
|
356
359
|
end
|
357
360
|
|
358
361
|
def test_gem_platforms_multiple
|
359
|
-
win_platform
|
362
|
+
win_platform = Gem.win_platform?
|
363
|
+
Gem.win_platform = false
|
360
364
|
|
361
365
|
with_engine_version "ruby", "2.0.0" do
|
362
366
|
@gda.gem "a", :platforms => [:mswin, :jruby]
|
@@ -369,7 +373,8 @@ class TestGemRequestSetGemDependencyAPI < Gem::TestCase
|
|
369
373
|
end
|
370
374
|
|
371
375
|
def test_gem_platforms_platform
|
372
|
-
win_platform
|
376
|
+
win_platform = Gem.win_platform?
|
377
|
+
Gem.win_platform = false
|
373
378
|
|
374
379
|
with_engine_version "ruby", "2.0.0" do
|
375
380
|
@gda.gem "a", :platforms => :jruby, :platform => :ruby
|
@@ -696,7 +701,8 @@ end
|
|
696
701
|
end
|
697
702
|
|
698
703
|
def test_platform_multiple
|
699
|
-
win_platform
|
704
|
+
win_platform = Gem.win_platform?
|
705
|
+
Gem.win_platform = false
|
700
706
|
|
701
707
|
gda = @GDA.new @set, nil
|
702
708
|
|
@@ -722,7 +728,8 @@ end
|
|
722
728
|
end
|
723
729
|
|
724
730
|
def test_platform_ruby
|
725
|
-
win_platform
|
731
|
+
win_platform = Gem.win_platform?
|
732
|
+
Gem.win_platform = false
|
726
733
|
|
727
734
|
@gda.platform :ruby do
|
728
735
|
@gda.gem "a"
|
@@ -84,7 +84,7 @@ class TestGemRequirement < Gem::TestCase
|
|
84
84
|
Gem::Requirement.parse(Gem::Version.new("2"))
|
85
85
|
end
|
86
86
|
|
87
|
-
|
87
|
+
unless (Gem.java_platform? && ENV["JRUBY_OPTS"].to_s.include?("--debug"))
|
88
88
|
def test_parse_deduplication
|
89
89
|
assert_same "~>", Gem::Requirement.parse("~> 1").first
|
90
90
|
end
|
@@ -308,7 +308,7 @@ class TestGemSecurity < Gem::TestCase
|
|
308
308
|
|
309
309
|
passphrase = "It should be long."
|
310
310
|
|
311
|
-
@SEC.write key, path,
|
311
|
+
@SEC.write key, path, 0o600, passphrase
|
312
312
|
|
313
313
|
assert_path_exist path
|
314
314
|
|
@@ -326,7 +326,7 @@ class TestGemSecurity < Gem::TestCase
|
|
326
326
|
|
327
327
|
cipher = OpenSSL::Cipher.new "AES-192-CBC"
|
328
328
|
|
329
|
-
@SEC.write key, path,
|
329
|
+
@SEC.write key, path, 0o600, passphrase, cipher
|
330
330
|
|
331
331
|
assert_path_exist path
|
332
332
|
|
@@ -144,7 +144,7 @@ B8khkB8hDKC6moCzebmUxCBmTmXD0Wjzon+bf4MOriVE3a0ySGRvpr1mKR2+
|
|
144
144
|
|
145
145
|
def test_sign_expired_auto_update
|
146
146
|
pend if Gem.java_platform?
|
147
|
-
FileUtils.mkdir_p File.join(Gem.user_home, ".gem"), :mode =>
|
147
|
+
FileUtils.mkdir_p File.join(Gem.user_home, ".gem"), :mode => 0o700
|
148
148
|
|
149
149
|
private_key_path = File.join(Gem.user_home, ".gem", "gem-private_key.pem")
|
150
150
|
Gem::Security.write PRIVATE_KEY, private_key_path
|
@@ -171,7 +171,7 @@ B8khkB8hDKC6moCzebmUxCBmTmXD0Wjzon+bf4MOriVE3a0ySGRvpr1mKR2+
|
|
171
171
|
end
|
172
172
|
|
173
173
|
def test_sign_expired_auto_update_exists
|
174
|
-
FileUtils.mkdir_p File.join(Gem.user_home, ".gem"), :mode =>
|
174
|
+
FileUtils.mkdir_p File.join(Gem.user_home, ".gem"), :mode => 0o700
|
175
175
|
|
176
176
|
expiry = EXPIRED_CERT.not_after.strftime "%Y%m%d%H%M%S"
|
177
177
|
expired_path =
|
@@ -56,7 +56,7 @@ class TestGemSecurityTrustDir < Gem::TestCase
|
|
56
56
|
|
57
57
|
assert_path_exist trusted
|
58
58
|
|
59
|
-
mask =
|
59
|
+
mask = 0o100600 & (~File.umask)
|
60
60
|
|
61
61
|
assert_equal mask, File.stat(trusted).mode unless win_platform?
|
62
62
|
|
@@ -70,8 +70,8 @@ class TestGemSecurityTrustDir < Gem::TestCase
|
|
70
70
|
|
71
71
|
assert_path_exist @dest_dir
|
72
72
|
|
73
|
-
mask =
|
74
|
-
mask |=
|
73
|
+
mask = 0o40700 & (~File.umask)
|
74
|
+
mask |= 0o200000 if RUBY_PLATFORM.include?("aix")
|
75
75
|
|
76
76
|
assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
|
77
77
|
end
|
@@ -87,12 +87,12 @@ class TestGemSecurityTrustDir < Gem::TestCase
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def test_verify_wrong_permissions
|
90
|
-
FileUtils.mkdir_p @dest_dir, :mode =>
|
90
|
+
FileUtils.mkdir_p @dest_dir, :mode => 0o777
|
91
91
|
|
92
92
|
@trust_dir.verify
|
93
93
|
|
94
|
-
mask =
|
95
|
-
mask |=
|
94
|
+
mask = 0o40700 & (~File.umask)
|
95
|
+
mask |= 0o200000 if RUBY_PLATFORM.include?("aix")
|
96
96
|
|
97
97
|
assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
|
98
98
|
end
|
@@ -41,12 +41,12 @@ class TestGemSpecFetcher < Gem::TestCase
|
|
41
41
|
def test_initialize_unwritable_home_dir
|
42
42
|
pend "chmod not supported" if Gem.win_platform?
|
43
43
|
|
44
|
-
FileUtils.chmod
|
44
|
+
FileUtils.chmod 0o000, Gem.user_home
|
45
45
|
|
46
46
|
begin
|
47
47
|
assert Gem::SpecFetcher.new
|
48
48
|
ensure
|
49
|
-
FileUtils.chmod
|
49
|
+
FileUtils.chmod 0o755, Gem.user_home
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|