rubygems-update 1.3.5 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/.autotest +8 -1
- data/ChangeLog +164 -0
- data/History.txt +52 -1
- data/Manifest.txt +8 -8
- data/README +3 -2
- data/Rakefile +49 -5
- data/bin/gem +2 -2
- data/bin/update_rubygems +9 -11
- data/cruise_config.rb +4 -3
- data/hide_lib_for_update/note.txt +5 -0
- data/lib/rbconfig/datadir.rb +10 -14
- data/lib/rubygems.rb +117 -140
- data/lib/rubygems/builder.rb +4 -2
- data/lib/rubygems/command.rb +51 -48
- data/lib/rubygems/command_manager.rb +2 -0
- data/lib/rubygems/commands/dependency_command.rb +10 -5
- data/lib/rubygems/commands/environment_command.rb +1 -1
- data/lib/rubygems/commands/fetch_command.rb +6 -5
- data/lib/rubygems/commands/install_command.rb +1 -0
- data/lib/rubygems/commands/mirror_command.rb +8 -8
- data/lib/rubygems/commands/owner_command.rb +75 -0
- data/lib/rubygems/commands/pristine_command.rb +1 -1
- data/lib/rubygems/commands/push_command.rb +45 -0
- data/lib/rubygems/commands/query_command.rb +4 -1
- data/lib/rubygems/commands/rdoc_command.rb +24 -9
- data/lib/rubygems/commands/server_command.rb +6 -0
- data/lib/rubygems/commands/setup_command.rb +14 -4
- data/lib/rubygems/commands/unpack_command.rb +2 -2
- data/lib/rubygems/commands/update_command.rb +2 -2
- data/lib/rubygems/commands/which_command.rb +7 -9
- data/lib/rubygems/config_file.rb +100 -26
- data/lib/rubygems/defaults.rb +1 -1
- data/lib/rubygems/dependency.rb +133 -75
- data/lib/rubygems/dependency_installer.rb +28 -10
- data/lib/rubygems/dependency_list.rb +41 -12
- data/lib/rubygems/doc_manager.rb +7 -0
- data/lib/rubygems/format.rb +16 -20
- data/lib/rubygems/gem_openssl.rb +1 -1
- data/lib/rubygems/gem_path_searcher.rb +10 -12
- data/lib/rubygems/gemcutter_utilities.rb +49 -0
- data/lib/rubygems/indexer.rb +2 -2
- data/lib/rubygems/install_update_options.rb +1 -9
- data/lib/rubygems/installer.rb +35 -76
- data/lib/rubygems/local_remote_options.rb +1 -2
- data/lib/rubygems/package.rb +0 -1
- data/lib/rubygems/package/tar_input.rb +3 -1
- data/lib/rubygems/package_task.rb +16 -11
- data/lib/rubygems/remote_fetcher.rb +22 -8
- data/lib/rubygems/requirement.rb +78 -100
- data/lib/rubygems/server.rb +41 -10
- data/lib/rubygems/source_index.rb +5 -5
- data/lib/rubygems/spec_fetcher.rb +2 -2
- data/lib/rubygems/specification.rb +66 -16
- data/lib/rubygems/test_utilities.rb +33 -4
- data/lib/rubygems/uninstaller.rb +3 -3
- data/lib/rubygems/user_interaction.rb +45 -0
- data/lib/rubygems/validator.rb +6 -7
- data/lib/rubygems/version.rb +206 -149
- data/lib/rubygems/version_option.rb +16 -0
- data/test/fake_certlib/openssl.rb +1 -1
- data/test/functional.rb +0 -7
- data/test/gem_installer_test_case.rb +4 -4
- data/test/gem_package_tar_test_case.rb +1 -1
- data/test/gemutilities.rb +35 -31
- data/test/insure_session.rb +0 -8
- data/test/mockgemui.rb +0 -8
- data/test/simple_gem.rb +2 -8
- data/test/test_config.rb +3 -10
- data/test/test_gem.rb +9 -14
- data/test/test_gem_builder.rb +1 -7
- data/test/test_gem_command.rb +1 -8
- data/test/test_gem_command_manager.rb +1 -7
- data/test/test_gem_commands_build_command.rb +4 -4
- data/test/test_gem_commands_cert_command.rb +1 -2
- data/test/test_gem_commands_check_command.rb +1 -7
- data/test/test_gem_commands_contents_command.rb +1 -1
- data/test/test_gem_commands_dependency_command.rb +17 -31
- data/test/test_gem_commands_environment_command.rb +1 -1
- data/test/test_gem_commands_fetch_command.rb +14 -12
- data/test/test_gem_commands_generate_index_command.rb +1 -1
- data/test/test_gem_commands_install_command.rb +22 -20
- data/test/test_gem_commands_list_command.rb +1 -1
- data/test/test_gem_commands_lock_command.rb +1 -1
- data/test/test_gem_commands_mirror_command.rb +5 -5
- data/test/test_gem_commands_outdated_command.rb +3 -5
- data/test/test_gem_commands_owner_command.rb +105 -0
- data/test/test_gem_commands_pristine_command.rb +2 -2
- data/test/test_gem_commands_push_command.rb +61 -0
- data/test/test_gem_commands_query_command.rb +23 -56
- data/test/test_gem_commands_server_command.rb +1 -1
- data/test/test_gem_commands_sources_command.rb +1 -70
- data/test/test_gem_commands_specification_command.rb +3 -4
- data/test/test_gem_commands_stale_command.rb +1 -1
- data/test/test_gem_commands_uninstall_command.rb +3 -4
- data/test/test_gem_commands_unpack_command.rb +1 -1
- data/test/test_gem_commands_update_command.rb +13 -13
- data/test/test_gem_commands_which_command.rb +66 -0
- data/test/test_gem_config_file.rb +13 -7
- data/test/test_gem_dependency.rb +82 -134
- data/test/test_gem_dependency_installer.rb +55 -30
- data/test/test_gem_dependency_list.rb +28 -7
- data/test/test_gem_doc_manager.rb +1 -7
- data/test/test_gem_ext_configure_builder.rb +2 -2
- data/test/test_gem_ext_ext_conf_builder.rb +1 -1
- data/test/test_gem_ext_rake_builder.rb +1 -1
- data/test/test_gem_format.rb +14 -11
- data/test/test_gem_gem_path_searcher.rb +12 -1
- data/test/test_gem_gem_runner.rb +1 -1
- data/test/test_gem_gemcutter_utilities.rb +103 -0
- data/test/test_gem_indexer.rb +44 -51
- data/test/test_gem_install_update_options.rb +1 -7
- data/test/test_gem_installer.rb +22 -82
- data/test/test_gem_local_remote_options.rb +1 -1
- data/test/test_gem_package_tar_header.rb +1 -8
- data/test/test_gem_package_tar_input.rb +1 -8
- data/test/test_gem_package_tar_output.rb +1 -8
- data/test/test_gem_package_tar_reader.rb +1 -8
- data/test/test_gem_package_tar_reader_entry.rb +1 -8
- data/test/test_gem_package_tar_writer.rb +1 -8
- data/test/test_gem_package_task.rb +1 -25
- data/test/test_gem_platform.rb +4 -4
- data/test/test_gem_remote_fetcher.rb +31 -21
- data/test/test_gem_requirement.rb +210 -140
- data/test/test_gem_server.rb +36 -1
- data/test/test_gem_source_index.rb +7 -13
- data/test/test_gem_spec_fetcher.rb +17 -47
- data/test/test_gem_specification.rb +7 -20
- data/test/test_gem_stream_ui.rb +21 -1
- data/test/test_gem_uninstaller.rb +1 -2
- data/test/test_gem_validator.rb +2 -8
- data/test/test_gem_version.rb +110 -254
- data/test/test_gem_version_option.rb +1 -1
- data/test/test_kernel.rb +1 -7
- data/util/CL2notes +1 -1
- data/util/gem_prelude.rb.template +64 -41
- metadata +33 -71
- metadata.gz.sig +0 -0
- data/lib/rubygems/digest/digest_adapter.rb +0 -49
- data/lib/rubygems/digest/md5.rb +0 -23
- data/lib/rubygems/digest/sha1.rb +0 -22
- data/lib/rubygems/digest/sha2.rb +0 -22
- data/lib/rubygems/timer.rb +0 -28
- data/test/test_gem_digest.rb +0 -46
- data/test/test_gem_source_info_cache.rb +0 -447
- data/test/test_gem_source_info_cache_entry.rb +0 -78
@@ -253,18 +253,18 @@ class Gem::SourceIndex
|
|
253
253
|
# change in the index.
|
254
254
|
|
255
255
|
def index_signature
|
256
|
-
require '
|
256
|
+
require 'digest'
|
257
257
|
|
258
|
-
|
258
|
+
Digest::SHA256.new.hexdigest(@gems.keys.sort.join(',')).to_s
|
259
259
|
end
|
260
260
|
|
261
261
|
##
|
262
262
|
# The signature for the given gem specification.
|
263
263
|
|
264
264
|
def gem_signature(gem_full_name)
|
265
|
-
require '
|
265
|
+
require 'digest'
|
266
266
|
|
267
|
-
|
267
|
+
Digest::SHA256.new.hexdigest(@gems[gem_full_name].to_yaml).to_s
|
268
268
|
end
|
269
269
|
|
270
270
|
def size
|
@@ -303,7 +303,7 @@ class Gem::SourceIndex
|
|
303
303
|
version_requirement = platform_only || Gem::Requirement.default
|
304
304
|
when Gem::Dependency then
|
305
305
|
only_platform = platform_only
|
306
|
-
version_requirement = gem_pattern.
|
306
|
+
version_requirement = gem_pattern.requirement
|
307
307
|
gem_pattern = if Regexp === gem_pattern.name then
|
308
308
|
gem_pattern.name
|
309
309
|
elsif gem_pattern.name.empty? then
|
@@ -197,7 +197,7 @@ class Gem::SpecFetcher
|
|
197
197
|
|
198
198
|
if type == :all
|
199
199
|
list.values.map do |gems|
|
200
|
-
gems.reject! { |g| g[1].prerelease? }
|
200
|
+
gems.reject! { |g| !g[1] || g[1].prerelease? }
|
201
201
|
end
|
202
202
|
end
|
203
203
|
|
@@ -242,7 +242,7 @@ class Gem::SpecFetcher
|
|
242
242
|
FileUtils.mkdir_p cache_dir
|
243
243
|
|
244
244
|
open local_file, 'wb' do |io|
|
245
|
-
|
245
|
+
io << spec_dump
|
246
246
|
end
|
247
247
|
rescue
|
248
248
|
end
|
@@ -17,7 +17,7 @@ class Date; end # for ruby_code if date.rb wasn't required
|
|
17
17
|
# defined in a .gemspec file or a Rakefile, and looks like this:
|
18
18
|
#
|
19
19
|
# spec = Gem::Specification.new do |s|
|
20
|
-
# s.name = '
|
20
|
+
# s.name = 'example'
|
21
21
|
# s.version = '1.0'
|
22
22
|
# s.summary = 'Example gem specification'
|
23
23
|
# ...
|
@@ -409,15 +409,19 @@ class Gem::Specification
|
|
409
409
|
# :startdoc:
|
410
410
|
|
411
411
|
##
|
412
|
-
# Specification constructor. Assigns the default values to the
|
413
|
-
# and yields itself for further
|
412
|
+
# Specification constructor. Assigns the default values to the
|
413
|
+
# attributes and yields itself for further
|
414
|
+
# initialization. Optionally takes +name+ and +version+.
|
414
415
|
|
415
|
-
def initialize
|
416
|
+
def initialize name = nil, version = nil
|
416
417
|
@new_platform = nil
|
417
418
|
assign_defaults
|
418
419
|
@loaded = false
|
419
420
|
@loaded_from = nil
|
420
421
|
|
422
|
+
self.name = name if name
|
423
|
+
self.version = version if version
|
424
|
+
|
421
425
|
yield self if block_given?
|
422
426
|
|
423
427
|
@@gather.call(self) if @@gather
|
@@ -498,7 +502,7 @@ class Gem::Specification
|
|
498
502
|
|
499
503
|
def self.load(filename)
|
500
504
|
gemspec = nil
|
501
|
-
|
505
|
+
raise "NESTED Specification.load calls not allowed!" if @@gather
|
502
506
|
@@gather = proc { |gs| gemspec = gs }
|
503
507
|
data = File.read(filename)
|
504
508
|
eval(data)
|
@@ -598,10 +602,12 @@ class Gem::Specification
|
|
598
602
|
end
|
599
603
|
|
600
604
|
##
|
601
|
-
# The default (generated) file name of the gem.
|
605
|
+
# The default (generated) file name of the gem. See also #spec_name.
|
606
|
+
#
|
607
|
+
# spec.file_name # => "example-1.0.gem"
|
602
608
|
|
603
609
|
def file_name
|
604
|
-
full_name +
|
610
|
+
full_name + '.gem'
|
605
611
|
end
|
606
612
|
|
607
613
|
##
|
@@ -620,7 +626,7 @@ class Gem::Specification
|
|
620
626
|
|
621
627
|
def satisfies_requirement?(dependency)
|
622
628
|
return @name == dependency.name &&
|
623
|
-
dependency.
|
629
|
+
dependency.requirement.satisfied_by?(@version)
|
624
630
|
end
|
625
631
|
|
626
632
|
##
|
@@ -630,6 +636,15 @@ class Gem::Specification
|
|
630
636
|
[@name, @version, @new_platform == Gem::Platform::RUBY ? -1 : 1]
|
631
637
|
end
|
632
638
|
|
639
|
+
##
|
640
|
+
# The default name of the gemspec. See also #file_name
|
641
|
+
#
|
642
|
+
# spec.spec_name # => "example-1.0.gemspec"
|
643
|
+
|
644
|
+
def spec_name
|
645
|
+
full_name + '.gemspec'
|
646
|
+
end
|
647
|
+
|
633
648
|
def <=>(other) # :nodoc:
|
634
649
|
sort_obj <=> other.sort_obj
|
635
650
|
end
|
@@ -1033,14 +1048,18 @@ class Gem::Specification
|
|
1033
1048
|
##
|
1034
1049
|
# :attr_accessor: rubygems_version
|
1035
1050
|
#
|
1036
|
-
# The version of RubyGems used to create this gem
|
1051
|
+
# The version of RubyGems used to create this gem.
|
1052
|
+
#
|
1053
|
+
# Do not set this, it is set automatically when the gem is packaged.
|
1037
1054
|
|
1038
1055
|
required_attribute :rubygems_version, Gem::RubyGemsVersion
|
1039
1056
|
|
1040
1057
|
##
|
1041
1058
|
# :attr_accessor: specification_version
|
1042
1059
|
#
|
1043
|
-
# The Gem::Specification version of this gemspec
|
1060
|
+
# The Gem::Specification version of this gemspec.
|
1061
|
+
#
|
1062
|
+
# Do not set this, it is set automatically when the gem is packaged.
|
1044
1063
|
|
1045
1064
|
required_attribute :specification_version, CURRENT_SPECIFICATION_VERSION
|
1046
1065
|
|
@@ -1062,6 +1081,8 @@ class Gem::Specification
|
|
1062
1081
|
# :attr_accessor: date
|
1063
1082
|
#
|
1064
1083
|
# The date this gem was created
|
1084
|
+
#
|
1085
|
+
# Do not set this, it is set automatically when the gem is packaged.
|
1065
1086
|
|
1066
1087
|
required_attribute :date, TODAY
|
1067
1088
|
|
@@ -1069,13 +1090,20 @@ class Gem::Specification
|
|
1069
1090
|
# :attr_accessor: summary
|
1070
1091
|
#
|
1071
1092
|
# A short summary of this gem's description. Displayed in `gem list -d`.
|
1093
|
+
#
|
1094
|
+
# The description should be more detailed than the summary. For example,
|
1095
|
+
# you might wish to copy the entire README into the description.
|
1096
|
+
#
|
1097
|
+
# As of RubyGems 1.3.2 newlines are no longer stripped.
|
1072
1098
|
|
1073
1099
|
required_attribute :summary
|
1074
1100
|
|
1075
1101
|
##
|
1076
1102
|
# :attr_accessor: require_paths
|
1077
1103
|
#
|
1078
|
-
# Paths in the gem to add to $LOAD_PATH when this gem is activated
|
1104
|
+
# Paths in the gem to add to $LOAD_PATH when this gem is activated.
|
1105
|
+
#
|
1106
|
+
# The default 'lib' is typically sufficient.
|
1079
1107
|
|
1080
1108
|
required_attribute :require_paths, ['lib']
|
1081
1109
|
|
@@ -1085,6 +1113,13 @@ class Gem::Specification
|
|
1085
1113
|
# :attr_accessor: email
|
1086
1114
|
#
|
1087
1115
|
# A contact email for this gem
|
1116
|
+
#
|
1117
|
+
# If you are providing multiple authors and multiple emails they should be
|
1118
|
+
# in the same order such that:
|
1119
|
+
#
|
1120
|
+
# Hash[*spec.authors.zip(spec.emails).flatten]
|
1121
|
+
#
|
1122
|
+
# Gives a hash of author name to email address.
|
1088
1123
|
|
1089
1124
|
attribute :email
|
1090
1125
|
|
@@ -1122,6 +1157,8 @@ class Gem::Specification
|
|
1122
1157
|
# :attr_accessor: default_executable
|
1123
1158
|
#
|
1124
1159
|
# The default executable for this gem.
|
1160
|
+
#
|
1161
|
+
# This is not used.
|
1125
1162
|
|
1126
1163
|
attribute :default_executable
|
1127
1164
|
|
@@ -1149,7 +1186,7 @@ class Gem::Specification
|
|
1149
1186
|
##
|
1150
1187
|
# :attr_accessor: required_ruby_version
|
1151
1188
|
#
|
1152
|
-
# The
|
1189
|
+
# The version of ruby required by this gem
|
1153
1190
|
|
1154
1191
|
attribute :required_ruby_version, Gem::Requirement.default
|
1155
1192
|
|
@@ -1164,6 +1201,9 @@ class Gem::Specification
|
|
1164
1201
|
# :attr_accessor: platform
|
1165
1202
|
#
|
1166
1203
|
# The platform this gem runs on. See Gem::Platform for details.
|
1204
|
+
#
|
1205
|
+
# Setting this to any value other than Gem::Platform::RUBY or
|
1206
|
+
# Gem::Platform::CURRENT is probably wrong.
|
1167
1207
|
|
1168
1208
|
attribute :platform, Gem::Platform::RUBY
|
1169
1209
|
|
@@ -1192,7 +1232,14 @@ class Gem::Specification
|
|
1192
1232
|
##
|
1193
1233
|
# :attr_accessor: authors
|
1194
1234
|
#
|
1195
|
-
# The list of
|
1235
|
+
# The list of author names who wrote this gem.
|
1236
|
+
#
|
1237
|
+
# If you are providing multiple authors and multiple emails they should be
|
1238
|
+
# in the same order such that:
|
1239
|
+
#
|
1240
|
+
# Hash[*spec.authors.zip(spec.emails).flatten]
|
1241
|
+
#
|
1242
|
+
# Gives a hash of author name to email address.
|
1196
1243
|
|
1197
1244
|
array_attribute :authors
|
1198
1245
|
|
@@ -1228,21 +1275,21 @@ class Gem::Specification
|
|
1228
1275
|
##
|
1229
1276
|
# :attr_accessor: rdoc_options
|
1230
1277
|
#
|
1231
|
-
# An ARGV
|
1278
|
+
# An ARGV style array of options to RDoc
|
1232
1279
|
|
1233
1280
|
array_attribute :rdoc_options
|
1234
1281
|
|
1235
1282
|
##
|
1236
1283
|
# :attr_accessor: extra_rdoc_files
|
1237
1284
|
#
|
1238
|
-
# Extra files to add to RDoc
|
1285
|
+
# Extra files to add to RDoc such as README or doc/examples.txt
|
1239
1286
|
|
1240
1287
|
array_attribute :extra_rdoc_files
|
1241
1288
|
|
1242
1289
|
##
|
1243
1290
|
# :attr_accessor: executables
|
1244
1291
|
#
|
1245
|
-
# Executables included in the gem
|
1292
|
+
# Executables included in the gem.
|
1246
1293
|
|
1247
1294
|
array_attribute :executables
|
1248
1295
|
|
@@ -1266,6 +1313,9 @@ class Gem::Specification
|
|
1266
1313
|
# :attr_reader: dependencies
|
1267
1314
|
#
|
1268
1315
|
# A list of Gem::Dependency objects this gem depends on.
|
1316
|
+
#
|
1317
|
+
# Use #add_dependency or #add_development_dependency to add dependencies to
|
1318
|
+
# a gem.
|
1269
1319
|
|
1270
1320
|
array_attribute :dependencies
|
1271
1321
|
|
@@ -23,6 +23,7 @@ require 'rubygems/remote_fetcher'
|
|
23
23
|
class Gem::FakeFetcher
|
24
24
|
|
25
25
|
attr_reader :data
|
26
|
+
attr_reader :last_request
|
26
27
|
attr_accessor :paths
|
27
28
|
|
28
29
|
def initialize
|
@@ -30,16 +31,20 @@ class Gem::FakeFetcher
|
|
30
31
|
@paths = []
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
+
def find_data(path)
|
34
35
|
path = path.to_s
|
35
36
|
@paths << path
|
36
|
-
raise ArgumentError, 'need full URI' unless path =~ %r'^
|
37
|
+
raise ArgumentError, 'need full URI' unless path =~ %r'^https?://'
|
37
38
|
|
38
39
|
unless @data.key? path then
|
39
40
|
raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
|
40
41
|
end
|
41
42
|
|
42
|
-
|
43
|
+
@data[path]
|
44
|
+
end
|
45
|
+
|
46
|
+
def fetch_path path, mtime = nil
|
47
|
+
data = find_data(path)
|
43
48
|
|
44
49
|
if data.respond_to?(:call) then
|
45
50
|
data.call
|
@@ -52,6 +57,30 @@ class Gem::FakeFetcher
|
|
52
57
|
end
|
53
58
|
end
|
54
59
|
|
60
|
+
# Thanks, FakeWeb!
|
61
|
+
def open_uri_or_path(path)
|
62
|
+
data = find_data(path)
|
63
|
+
body, code, msg = data
|
64
|
+
|
65
|
+
response = Net::HTTPResponse.send(:response_class, code.to_s).new("1.0", code.to_s, msg)
|
66
|
+
response.instance_variable_set(:@body, body)
|
67
|
+
response.instance_variable_set(:@read, true)
|
68
|
+
response
|
69
|
+
end
|
70
|
+
|
71
|
+
def request(uri, request_class, last_modified = nil)
|
72
|
+
data = find_data(uri)
|
73
|
+
body, code, msg = data
|
74
|
+
|
75
|
+
@last_request = request_class.new uri.request_uri
|
76
|
+
yield @last_request if block_given?
|
77
|
+
|
78
|
+
response = Net::HTTPResponse.send(:response_class, code.to_s).new("1.0", code.to_s, msg)
|
79
|
+
response.instance_variable_set(:@body, body)
|
80
|
+
response.instance_variable_set(:@read, true)
|
81
|
+
response
|
82
|
+
end
|
83
|
+
|
55
84
|
def fetch_size(path)
|
56
85
|
path = path.to_s
|
57
86
|
@paths << path
|
@@ -68,7 +97,7 @@ class Gem::FakeFetcher
|
|
68
97
|
end
|
69
98
|
|
70
99
|
def download spec, source_uri, install_dir = Gem.dir
|
71
|
-
name =
|
100
|
+
name = spec.file_name
|
72
101
|
path = File.join(install_dir, 'cache', name)
|
73
102
|
|
74
103
|
Gem.ensure_gem_subdirectories install_dir
|
data/lib/rubygems/uninstaller.rb
CHANGED
@@ -202,7 +202,7 @@ class Gem::Uninstaller
|
|
202
202
|
spec.name, spec.version, spec.original_platform].join '-'
|
203
203
|
|
204
204
|
spec_dir = File.join spec.installation_path, 'specifications'
|
205
|
-
gemspec = File.join spec_dir,
|
205
|
+
gemspec = File.join spec_dir, spec.spec_name
|
206
206
|
|
207
207
|
unless File.exist? gemspec then
|
208
208
|
gemspec = File.join spec_dir, "#{original_platform_name}.gemspec"
|
@@ -211,7 +211,7 @@ class Gem::Uninstaller
|
|
211
211
|
FileUtils.rm_rf gemspec
|
212
212
|
|
213
213
|
cache_dir = File.join spec.installation_path, 'cache'
|
214
|
-
gem = File.join cache_dir,
|
214
|
+
gem = File.join cache_dir, spec.file_name
|
215
215
|
|
216
216
|
unless File.exist? gem then
|
217
217
|
gem = File.join cache_dir, "#{original_platform_name}.gem"
|
@@ -251,7 +251,7 @@ class Gem::Uninstaller
|
|
251
251
|
spec.dependent_gems.each do |gem,dep,satlist|
|
252
252
|
msg <<
|
253
253
|
("#{gem.name}-#{gem.version} depends on " +
|
254
|
-
"[#{dep.name} (#{dep.
|
254
|
+
"[#{dep.name} (#{dep.requirement})]")
|
255
255
|
end
|
256
256
|
msg << 'If you remove this gems, one or more dependencies will not be met.'
|
257
257
|
msg << 'Continue with Uninstall?'
|
@@ -112,6 +112,7 @@ module Gem::UserInteraction
|
|
112
112
|
:alert_error,
|
113
113
|
:alert_warning,
|
114
114
|
:ask,
|
115
|
+
:ask_for_password,
|
115
116
|
:ask_yes_no,
|
116
117
|
:choose_from_list,
|
117
118
|
:say,
|
@@ -217,6 +218,50 @@ class Gem::StreamUI
|
|
217
218
|
result
|
218
219
|
end
|
219
220
|
|
221
|
+
##
|
222
|
+
# Ask for a password. Does not echo response to terminal.
|
223
|
+
|
224
|
+
def ask_for_password(question)
|
225
|
+
return nil if not @ins.tty?
|
226
|
+
|
227
|
+
@outs.print(question + " ")
|
228
|
+
@outs.flush
|
229
|
+
|
230
|
+
Gem.win_platform? ? ask_for_password_on_windows : ask_for_password_on_unix
|
231
|
+
end
|
232
|
+
|
233
|
+
##
|
234
|
+
# Asks for a password that works on windows. Ripped from the Heroku gem.
|
235
|
+
|
236
|
+
def ask_for_password_on_windows
|
237
|
+
require "Win32API"
|
238
|
+
char = nil
|
239
|
+
password = ''
|
240
|
+
|
241
|
+
while char = Win32API.new("crtdll", "_getch", [ ], "L").Call do
|
242
|
+
break if char == 10 || char == 13 # received carriage return or newline
|
243
|
+
if char == 127 || char == 8 # backspace and delete
|
244
|
+
password.slice!(-1, 1)
|
245
|
+
else
|
246
|
+
password << char.chr
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
puts
|
251
|
+
password
|
252
|
+
end
|
253
|
+
|
254
|
+
##
|
255
|
+
# Asks for a password that works on unix
|
256
|
+
|
257
|
+
def ask_for_password_on_unix
|
258
|
+
system "stty -echo"
|
259
|
+
password = @ins.gets
|
260
|
+
password.chomp! if password
|
261
|
+
system "stty echo"
|
262
|
+
password
|
263
|
+
end
|
264
|
+
|
220
265
|
##
|
221
266
|
# Display a statement.
|
222
267
|
|
data/lib/rubygems/validator.rb
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
require 'find'
|
8
8
|
|
9
|
-
require '
|
9
|
+
require 'digest'
|
10
10
|
require 'rubygems/format'
|
11
11
|
require 'rubygems/installer'
|
12
12
|
|
@@ -40,7 +40,7 @@ class Gem::Validator
|
|
40
40
|
sum_data = gem_data.gsub(/MD5SUM = "([a-z0-9]+)"/,
|
41
41
|
"MD5SUM = \"#{"F" * 32}\"")
|
42
42
|
|
43
|
-
unless
|
43
|
+
unless Digest::MD5.hexdigest(sum_data) == $1.to_s then
|
44
44
|
raise Gem::VerificationError, 'invalid checksum for gem file'
|
45
45
|
end
|
46
46
|
end
|
@@ -93,9 +93,8 @@ class Gem::Validator
|
|
93
93
|
next unless gems.include? gem_spec.name unless gems.empty?
|
94
94
|
|
95
95
|
install_dir = gem_spec.installation_path
|
96
|
-
gem_path = File.join
|
97
|
-
spec_path = File.join
|
98
|
-
gem_spec.full_name) + ".gemspec"
|
96
|
+
gem_path = File.join install_dir, "cache", gem_spec.file_name
|
97
|
+
spec_path = File.join install_dir, "specifications", gem_spec.spec_name
|
99
98
|
gem_directory = gem_spec.full_gem_path
|
100
99
|
|
101
100
|
unless File.directory? gem_directory then
|
@@ -139,8 +138,8 @@ class Gem::Validator
|
|
139
138
|
next unless data # HACK `gem check -a mkrf`
|
140
139
|
|
141
140
|
open File.join(gem_directory, entry['path']), Gem.binary_mode do |f|
|
142
|
-
unless
|
143
|
-
|
141
|
+
unless Digest::MD5.hexdigest(f.read).to_s ==
|
142
|
+
Digest::MD5.hexdigest(data).to_s then
|
144
143
|
errors[gem_name][entry['path']] = "Modified from original"
|
145
144
|
end
|
146
145
|
end
|