rubygems-update 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- data.tar.gz.sig +0 -0
- data/ChangeLog +31 -0
- data/doc/release_notes/rel_1_3_1.rdoc +75 -0
- data/lib/rubygems.rb +23 -13
- data/lib/rubygems/commands/check_command.rb +2 -1
- data/lib/rubygems/commands/unpack_command.rb +1 -1
- data/lib/rubygems/commands/update_command.rb +4 -5
- data/lib/rubygems/config_file.rb +4 -1
- data/lib/rubygems/custom_require.rb +15 -7
- data/lib/rubygems/defaults.rb +5 -0
- data/lib/rubygems/installer.rb +1 -1
- data/lib/rubygems/rubygems_version.rb +1 -1
- data/lib/rubygems/source_index.rb +1 -2
- data/lib/rubygems/validator.rb +147 -125
- data/test/functional.rb +6 -2
- data/test/gem_installer_test_case.rb +1 -1
- data/test/gemutilities.rb +19 -5
- data/test/test_config.rb +0 -2
- data/test/test_gem.rb +4 -4
- data/test/test_gem_builder.rb +0 -1
- data/test/test_gem_command.rb +2 -3
- data/test/test_gem_command_manager.rb +0 -1
- data/test/test_gem_commands_build_command.rb +0 -1
- data/test/test_gem_commands_cert_command.rb +0 -1
- data/test/test_gem_commands_check_command.rb +0 -1
- data/test/test_gem_commands_contents_command.rb +2 -3
- data/test/test_gem_commands_dependency_command.rb +2 -3
- data/test/test_gem_commands_environment_command.rb +1 -2
- data/test/test_gem_commands_fetch_command.rb +0 -1
- data/test/test_gem_commands_generate_index_command.rb +1 -1
- data/test/test_gem_commands_install_command.rb +2 -3
- data/test/test_gem_commands_list_command.rb +1 -2
- data/test/test_gem_commands_lock_command.rb +1 -2
- data/test/test_gem_commands_mirror_command.rb +0 -1
- data/test/test_gem_commands_outdated_command.rb +0 -1
- data/test/test_gem_commands_pristine_command.rb +1 -2
- data/test/test_gem_commands_query_command.rb +5 -6
- data/test/test_gem_commands_server_command.rb +0 -1
- data/test/test_gem_commands_sources_command.rb +0 -1
- data/test/test_gem_commands_specification_command.rb +1 -2
- data/test/test_gem_commands_stale_command.rb +0 -1
- data/test/test_gem_commands_uninstall_command.rb +5 -4
- data/test/test_gem_commands_unpack_command.rb +0 -1
- data/test/test_gem_commands_update_command.rb +0 -1
- data/test/test_gem_config_file.rb +0 -2
- data/test/test_gem_dependency.rb +13 -14
- data/test/test_gem_dependency_installer.rb +4 -5
- data/test/test_gem_dependency_list.rb +0 -3
- data/test/test_gem_digest.rb +12 -10
- data/test/test_gem_doc_manager.rb +1 -2
- data/test/test_gem_ext_configure_builder.rb +1 -2
- data/test/test_gem_ext_ext_conf_builder.rb +2 -3
- data/test/test_gem_ext_rake_builder.rb +2 -3
- data/test/test_gem_format.rb +4 -6
- data/test/test_gem_gem_path_searcher.rb +0 -1
- data/test/test_gem_gem_runner.rb +0 -1
- data/test/test_gem_indexer.rb +2 -3
- data/test/test_gem_install_update_options.rb +1 -2
- data/test/test_gem_installer.rb +16 -15
- data/test/test_gem_local_remote_options.rb +1 -2
- data/test/test_gem_package_tar_reader_entry.rb +5 -5
- data/test/test_gem_package_tar_writer.rb +10 -10
- data/test/test_gem_platform.rb +6 -19
- data/test/test_gem_remote_fetcher.rb +18 -12
- data/test/test_gem_requirement.rb +14 -15
- data/test/test_gem_server.rb +0 -1
- data/test/test_gem_source_index.rb +5 -6
- data/test/test_gem_source_info_cache.rb +5 -7
- data/test/test_gem_source_info_cache_entry.rb +1 -2
- data/test/test_gem_spec_fetcher.rb +0 -1
- data/test/test_gem_specification.rb +11 -12
- data/test/test_gem_stream_ui.rb +0 -1
- data/test/test_gem_validator.rb +4 -5
- data/test/test_gem_version.rb +9 -10
- data/test/test_gem_version_option.rb +0 -1
- data/test/test_kernel.rb +1 -3
- metadata +4 -3
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/ChangeLog
CHANGED
@@ -1,5 +1,36 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
+
2008-10-25 Eric Hodel <drbrain@segment7.net>
|
4
|
+
|
5
|
+
* lib/rubygems.rb, lib/rubygems/custom_require.rb: Make kernel
|
6
|
+
methods private. Patch #20801 by Stefan Rusterholz. Expose
|
7
|
+
our kernel extensions to RDoc. Make Gem::location_of_caller behave on
|
8
|
+
Windows. Patch by Daniel Berger.
|
9
|
+
* doc/release_notes/rel_1_3_1.rdoc: Final release notes for 1.3.1.
|
10
|
+
* lib/rubygems/rubygems_version.rb: 1.3.1.
|
11
|
+
|
12
|
+
2008-10-10 Eric Hodel <drbrain@segment7.net>
|
13
|
+
|
14
|
+
* lib/rubygems/commands/unpack_command.rb: Silence PATH warning.
|
15
|
+
|
16
|
+
2008-10-09 Eric Hodel <drbrain@segment7.net>
|
17
|
+
|
18
|
+
* lib/rubygems.rb: Fix requires for inflate, deflate, etc.
|
19
|
+
* test/*: Convert to minitest/unit.
|
20
|
+
* lib/rubygems/validator.rb: Fix for MiniTest instead of test/unit
|
21
|
+
classic in 1.9.
|
22
|
+
|
23
|
+
2008-10-03 Phil Hagelberg <technomancy@gmail.com>
|
24
|
+
|
25
|
+
* lib/rubygems.rb: Make Gem.dir respect :gemhome value from config.
|
26
|
+
* lib/rubygems/config_file.rb: Expose :gemhome value.
|
27
|
+
|
28
|
+
2008-09-26 Luis Lavena <luislavena@gmail.com>
|
29
|
+
|
30
|
+
* lib/rubygems.rb: Disregard ownership of ~ under Windows while
|
31
|
+
creating ~/.gem. Fixes issues related to no uid support under
|
32
|
+
Windows.
|
33
|
+
|
3
34
|
2008-09-24 Eric Hodel <drbrain@segment7.net>
|
4
35
|
|
5
36
|
* doc/release_notes/rel_1_3_0.rdoc: Final release notes for 1.3.0.
|
@@ -0,0 +1,75 @@
|
|
1
|
+
= Announce: RubyGems Release 1.3.0
|
2
|
+
|
3
|
+
NOTE: RubyGems 1.1 and 1.2 have problems upgrading when there is no
|
4
|
+
rubygems-update installed. You will need to follow the second set of update
|
5
|
+
instructions if you see "Nothing to update".
|
6
|
+
|
7
|
+
Release 1.3.0 fixes some bugs.
|
8
|
+
|
9
|
+
Bugs fixed:
|
10
|
+
|
11
|
+
* Disregard ownership of ~ under Windows while creating ~/.gem. Fixes
|
12
|
+
issues related to no uid support under Windows.
|
13
|
+
* Fix requires for Gem::inflate, Gem::deflate, etc.
|
14
|
+
* Make Gem.dir respect :gemhome value from config. (Note: this feature may be
|
15
|
+
removed since it is hard to implement on 1.9.)
|
16
|
+
* Kernel methods are now private. Patch #20801 by Stefan Rusterholz.
|
17
|
+
* Gem::location_of_caller now behaves on Windows. Patch by Daniel Berger.
|
18
|
+
* Silence PATH warning.
|
19
|
+
|
20
|
+
Deprecation Notices:
|
21
|
+
|
22
|
+
* Gem::manage_gems will be removed on or after March 2009.
|
23
|
+
|
24
|
+
For a full list of changes to RubyGems and the contributor for each change, see
|
25
|
+
the ChangeLog file.
|
26
|
+
|
27
|
+
Special thanks to Chad Wooley for backwards compatibility testing and Luis
|
28
|
+
Lavena for continuing windows support.
|
29
|
+
|
30
|
+
== How can I get RubyGems?
|
31
|
+
|
32
|
+
NOTE: If you have installed RubyGems using a package system you may want to
|
33
|
+
install a new RubyGems through the same packaging system.
|
34
|
+
|
35
|
+
If you have a recent version of RubyGems (0.8.5 or later), then all
|
36
|
+
you need to do is:
|
37
|
+
|
38
|
+
$ gem update --system (you might need to be admin/root)
|
39
|
+
|
40
|
+
NOTE: RubyGems 1.1 and 1.2 have problems upgrading when there is no
|
41
|
+
rubygems-update installed. You will need to follow the second set of update
|
42
|
+
instructions if you see "Nothing to update".
|
43
|
+
|
44
|
+
NOTE: You may have to run the command twice if you have any previosly
|
45
|
+
installed rubygems-update gems.
|
46
|
+
|
47
|
+
If you have an older version of RubyGems installed, then you can still
|
48
|
+
do it in two steps:
|
49
|
+
|
50
|
+
$ gem install rubygems-update (again, might need to be admin/root)
|
51
|
+
$ update_rubygems (... here too)
|
52
|
+
|
53
|
+
If you don't have any gems install, there is still the pre-gem
|
54
|
+
approach to getting software ... doing it manually:
|
55
|
+
|
56
|
+
1. DOWNLOAD FROM: http://rubyforge.org/frs/?group_id=126
|
57
|
+
2. UNPACK INTO A DIRECTORY AND CD THERE
|
58
|
+
3. INSTALL WITH: ruby setup.rb (you may need admin/root privilege)
|
59
|
+
|
60
|
+
== To File Bugs
|
61
|
+
|
62
|
+
The RubyGems bug tracker can be found on RubyForge at:
|
63
|
+
http://rubyforge.org/tracker/?func=add&group_id=126&atid=575
|
64
|
+
|
65
|
+
When filing a bug, `gem env` output will be helpful in diagnosing the issue.
|
66
|
+
|
67
|
+
If you find a bug where RubyGems crashes, please provide debug output. You can
|
68
|
+
do that with `gem --debug the_command`.
|
69
|
+
|
70
|
+
== Thanks
|
71
|
+
|
72
|
+
Keep those gems coming!
|
73
|
+
|
74
|
+
-- Jim & Chad & Eric (for the RubyGems team)
|
75
|
+
|
data/lib/rubygems.rb
CHANGED
@@ -43,12 +43,14 @@ module Kernel
|
|
43
43
|
#
|
44
44
|
# GEM_SKIP=libA:libB ruby -I../libA -I../libB ./mycode.rb
|
45
45
|
|
46
|
-
def gem(gem_name, *version_requirements)
|
46
|
+
def gem(gem_name, *version_requirements) # :doc:
|
47
47
|
skip_list = (ENV['GEM_SKIP'] || "").split(/:/)
|
48
48
|
raise Gem::LoadError, "skipping #{gem_name}" if skip_list.include? gem_name
|
49
49
|
Gem.activate(gem_name, *version_requirements)
|
50
50
|
end
|
51
51
|
|
52
|
+
private :gem
|
53
|
+
|
52
54
|
end
|
53
55
|
|
54
56
|
##
|
@@ -104,10 +106,10 @@ module Gem
|
|
104
106
|
@ruby = nil
|
105
107
|
@sources = []
|
106
108
|
|
107
|
-
@post_install_hooks
|
108
|
-
@post_uninstall_hooks
|
109
|
-
@pre_uninstall_hooks
|
110
|
-
@pre_install_hooks
|
109
|
+
@post_install_hooks ||= []
|
110
|
+
@post_uninstall_hooks ||= []
|
111
|
+
@pre_uninstall_hooks ||= []
|
112
|
+
@pre_install_hooks ||= []
|
111
113
|
|
112
114
|
##
|
113
115
|
# Activates an installed gem matching +gem+. The gem must satisfy
|
@@ -294,6 +296,7 @@ module Gem
|
|
294
296
|
# A Zlib::Deflate.deflate wrapper
|
295
297
|
|
296
298
|
def self.deflate(data)
|
299
|
+
require 'zlib'
|
297
300
|
Zlib::Deflate.deflate data
|
298
301
|
end
|
299
302
|
|
@@ -302,7 +305,7 @@ module Gem
|
|
302
305
|
|
303
306
|
def self.dir
|
304
307
|
@gem_home ||= nil
|
305
|
-
set_home(ENV['GEM_HOME'] || default_dir) unless @gem_home
|
308
|
+
set_home(ENV['GEM_HOME'] || Gem.configuration.home || default_dir) unless @gem_home
|
306
309
|
@gem_home
|
307
310
|
end
|
308
311
|
|
@@ -395,6 +398,8 @@ module Gem
|
|
395
398
|
# Zlib::GzipReader wrapper that unzips +data+.
|
396
399
|
|
397
400
|
def self.gunzip(data)
|
401
|
+
require 'stringio'
|
402
|
+
require 'zlib'
|
398
403
|
data = StringIO.new data
|
399
404
|
|
400
405
|
Zlib::GzipReader.new(data).read
|
@@ -404,6 +409,8 @@ module Gem
|
|
404
409
|
# Zlib::GzipWriter wrapper that zips +data+.
|
405
410
|
|
406
411
|
def self.gzip(data)
|
412
|
+
require 'stringio'
|
413
|
+
require 'zlib'
|
407
414
|
zipped = StringIO.new
|
408
415
|
|
409
416
|
Zlib::GzipWriter.wrap zipped do |io| io.write data end
|
@@ -415,6 +422,7 @@ module Gem
|
|
415
422
|
# A Zlib::Inflate#inflate wrapper
|
416
423
|
|
417
424
|
def self.inflate(data)
|
425
|
+
require 'zlib'
|
418
426
|
Zlib::Inflate.inflate data
|
419
427
|
end
|
420
428
|
|
@@ -479,13 +487,13 @@ module Gem
|
|
479
487
|
# The file name and line number of the caller of the caller of this method.
|
480
488
|
|
481
489
|
def self.location_of_caller
|
482
|
-
|
483
|
-
|
490
|
+
caller[1] =~ /(.*?):(\d+)$/i
|
491
|
+
file = $1
|
492
|
+
lineno = $2.to_i
|
493
|
+
|
484
494
|
[file, lineno]
|
485
495
|
end
|
486
496
|
|
487
|
-
private_class_method :location_of_caller
|
488
|
-
|
489
497
|
##
|
490
498
|
# manage_gems is useless and deprecated. Don't call it anymore.
|
491
499
|
|
@@ -709,9 +717,11 @@ module Gem
|
|
709
717
|
|
710
718
|
@gem_path.uniq!
|
711
719
|
@gem_path.each do |path|
|
712
|
-
if 0 == File.expand_path(path).index(Gem.user_home)
|
713
|
-
|
714
|
-
|
720
|
+
if 0 == File.expand_path(path).index(Gem.user_home)
|
721
|
+
unless win_platform? then
|
722
|
+
# only create by matching user
|
723
|
+
next if Etc.getpwuid.uid != File::Stat.new(Gem.user_home).uid
|
724
|
+
end
|
715
725
|
end
|
716
726
|
ensure_gem_subdirectories path
|
717
727
|
end
|
@@ -31,7 +31,8 @@ class Gem::Commands::CheckCommand < Gem::Command
|
|
31
31
|
def execute
|
32
32
|
if options[:test]
|
33
33
|
version = options[:version] || Gem::Requirement.default
|
34
|
-
|
34
|
+
dep = Gem::Dependency.new get_one_gem_name, version
|
35
|
+
gem_spec = Gem::SourceIndex.from_installed_gems.search(dep).first
|
35
36
|
Gem::Validator.new.unit_test(gem_spec)
|
36
37
|
end
|
37
38
|
|
@@ -43,7 +43,7 @@ class Gem::Commands::UnpackCommand < Gem::Command
|
|
43
43
|
basename = File.basename(path).sub(/\.gem$/, '')
|
44
44
|
target_dir = File.expand_path File.join(options[:target], basename)
|
45
45
|
FileUtils.mkdir_p target_dir
|
46
|
-
Gem::Installer.new(path).unpack target_dir
|
46
|
+
Gem::Installer.new(path, :unpack => true).unpack target_dir
|
47
47
|
say "Unpacked gem: '#{target_dir}'"
|
48
48
|
else
|
49
49
|
alert_error "Gem '#{gemname}' not installed."
|
@@ -54,11 +54,10 @@ class Gem::Commands::UpdateCommand < Gem::Command
|
|
54
54
|
fail "No gem names are allowed with the --system option"
|
55
55
|
end
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
hig['rubygems-update'] = spec
|
57
|
+
rubygems_update = Gem::Specification.new
|
58
|
+
rubygems_update.name = 'rubygems-update'
|
59
|
+
rubygems_update.version = Gem::Version.new Gem::RubyGemsVersion
|
60
|
+
hig['rubygems-update'] = rubygems_update
|
62
61
|
|
63
62
|
options[:user_install] = false
|
64
63
|
else
|
data/lib/rubygems/config_file.rb
CHANGED
@@ -52,6 +52,8 @@ class Gem::ConfigFile
|
|
52
52
|
# Where to look for gems
|
53
53
|
attr_accessor :path
|
54
54
|
|
55
|
+
attr_accessor :home
|
56
|
+
|
55
57
|
# True if we print backtraces on errors.
|
56
58
|
attr_writer :backtrace
|
57
59
|
|
@@ -129,7 +131,8 @@ class Gem::ConfigFile
|
|
129
131
|
Gem.sources = @hash[:sources] if @hash.key? :sources
|
130
132
|
@verbose = @hash[:verbose] if @hash.key? :verbose
|
131
133
|
@update_sources = @hash[:update_sources] if @hash.key? :update_sources
|
132
|
-
@path = @hash[:gempath]
|
134
|
+
@path = @hash[:gempath] if @hash.key? :gempath
|
135
|
+
@home = @hash[:gemhome] if @hash.key? :gemhome
|
133
136
|
|
134
137
|
handle_arguments arg_list
|
135
138
|
end
|
@@ -7,11 +7,15 @@
|
|
7
7
|
require 'rubygems'
|
8
8
|
|
9
9
|
module Kernel
|
10
|
-
alias gem_original_require require # :nodoc:
|
11
10
|
|
12
|
-
|
13
|
-
#
|
14
|
-
|
11
|
+
##
|
12
|
+
# The Kernel#require from before RubyGems was loaded.
|
13
|
+
|
14
|
+
alias gem_original_require require
|
15
|
+
|
16
|
+
##
|
17
|
+
# When RubyGems is required, Kernel#require is replaced with our own which
|
18
|
+
# is capable of loading gems on demand.
|
15
19
|
#
|
16
20
|
# When you call <tt>require 'x'</tt>, this is what happens:
|
17
21
|
# * If the file can be loaded from the existing Ruby loadpath, it
|
@@ -22,8 +26,8 @@ module Kernel
|
|
22
26
|
#
|
23
27
|
# The normal <tt>require</tt> functionality of returning false if
|
24
28
|
# that file has already been loaded is preserved.
|
25
|
-
|
26
|
-
def require(path) # :
|
29
|
+
|
30
|
+
def require(path) # :doc:
|
27
31
|
gem_original_require path
|
28
32
|
rescue LoadError => load_error
|
29
33
|
if load_error.message =~ /#{Regexp.escape path}\z/ and
|
@@ -34,5 +38,9 @@ module Kernel
|
|
34
38
|
raise load_error
|
35
39
|
end
|
36
40
|
end
|
37
|
-
|
41
|
+
|
42
|
+
private :require
|
43
|
+
private :gem_original_require
|
44
|
+
|
45
|
+
end
|
38
46
|
|
data/lib/rubygems/defaults.rb
CHANGED
data/lib/rubygems/installer.rb
CHANGED
@@ -257,8 +257,7 @@ class Gem::SourceIndex
|
|
257
257
|
|
258
258
|
# TODO - Remove support and warning for legacy arguments after 2008/11
|
259
259
|
unless Gem::Dependency === gem_pattern
|
260
|
-
warn "Gem::SourceIndex#search support for #{gem_pattern.class} patterns is deprecated"
|
261
|
-
warn "#{caller[0]} is outdated"
|
260
|
+
warn "#{Gem.location_of_caller.join ':'}:Warning: Gem::SourceIndex#search support for #{gem_pattern.class} patterns is deprecated"
|
262
261
|
end
|
263
262
|
|
264
263
|
case gem_pattern
|
data/lib/rubygems/validator.rb
CHANGED
@@ -10,118 +10,130 @@ require 'rubygems/digest/md5'
|
|
10
10
|
require 'rubygems/format'
|
11
11
|
require 'rubygems/installer'
|
12
12
|
|
13
|
-
|
13
|
+
##
|
14
|
+
# Validator performs various gem file and gem database validation
|
15
|
+
|
16
|
+
class Gem::Validator
|
17
|
+
|
18
|
+
include Gem::UserInteraction
|
14
19
|
|
15
20
|
##
|
16
|
-
#
|
17
|
-
|
18
|
-
include UserInteraction
|
19
|
-
|
20
|
-
##
|
21
|
-
# Given a gem file's contents, validates against its own MD5 checksum
|
22
|
-
# gem_data:: [String] Contents of the gem file
|
23
|
-
def verify_gem(gem_data)
|
24
|
-
raise VerificationError, 'empty gem file' if gem_data.size == 0
|
25
|
-
|
26
|
-
unless gem_data =~ /MD5SUM/ then
|
27
|
-
return # Don't worry about it...this sucks. Need to fix MD5 stuff for
|
28
|
-
# new format
|
29
|
-
# FIXME
|
30
|
-
end
|
21
|
+
# Given a gem file's contents, validates against its own MD5 checksum
|
22
|
+
# gem_data:: [String] Contents of the gem file
|
31
23
|
|
32
|
-
|
33
|
-
|
24
|
+
def verify_gem(gem_data)
|
25
|
+
raise Gem::VerificationError, 'empty gem file' if gem_data.size == 0
|
34
26
|
|
35
|
-
|
36
|
-
|
37
|
-
|
27
|
+
unless gem_data =~ /MD5SUM/ then
|
28
|
+
return # Don't worry about it...this sucks. Need to fix MD5 stuff for
|
29
|
+
# new format
|
30
|
+
# FIXME
|
38
31
|
end
|
39
32
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
open gem_path, Gem.binary_mode do |file|
|
46
|
-
gem_data = file.read
|
47
|
-
verify_gem gem_data
|
48
|
-
end
|
49
|
-
rescue Errno::ENOENT
|
50
|
-
raise Gem::VerificationError.new("missing gem file #{gem_path}")
|
33
|
+
sum_data = gem_data.gsub(/MD5SUM = "([a-z0-9]+)"/,
|
34
|
+
"MD5SUM = \"#{"F" * 32}\"")
|
35
|
+
|
36
|
+
unless Gem::MD5.hexdigest(sum_data) == $1.to_s then
|
37
|
+
raise Gem::VerificationError, 'invalid checksum for gem file'
|
51
38
|
end
|
39
|
+
end
|
52
40
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
}
|
63
|
-
installed_files
|
41
|
+
##
|
42
|
+
# Given the path to a gem file, validates against its own MD5 checksum
|
43
|
+
#
|
44
|
+
# gem_path:: [String] Path to gem file
|
45
|
+
|
46
|
+
def verify_gem_file(gem_path)
|
47
|
+
open gem_path, Gem.binary_mode do |file|
|
48
|
+
gem_data = file.read
|
49
|
+
verify_gem gem_data
|
64
50
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
51
|
+
rescue Errno::ENOENT
|
52
|
+
raise Gem::VerificationError, "missing gem file #{gem_path}"
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def find_files_for_gem(gem_directory)
|
58
|
+
installed_files = []
|
59
|
+
Find.find(gem_directory) {|file_name|
|
60
|
+
fn = file_name.slice((gem_directory.size)..(file_name.size-1)).sub(/^\//, "")
|
61
|
+
if(!(fn =~ /CVS/ || File.directory?(fn) || fn == "")) then
|
62
|
+
installed_files << fn
|
63
|
+
end
|
64
|
+
|
65
|
+
}
|
66
|
+
installed_files
|
67
|
+
end
|
68
|
+
|
69
|
+
public
|
70
|
+
|
71
|
+
ErrorData = Struct.new :path, :problem
|
72
|
+
|
73
|
+
##
|
74
|
+
# Checks the gem directory for the following potential
|
75
|
+
# inconsistencies/problems:
|
76
|
+
#
|
77
|
+
# * Checksum gem itself
|
78
|
+
# * For each file in each gem, check consistency of installed versions
|
79
|
+
# * Check for files that aren't part of the gem but are in the gems directory
|
80
|
+
# * 1 cache - 1 spec - 1 directory.
|
81
|
+
#
|
82
|
+
# returns a hash of ErrorData objects, keyed on the problem gem's name.
|
83
|
+
|
84
|
+
def alien
|
85
|
+
errors = {}
|
86
|
+
|
87
|
+
Gem::SourceIndex.from_installed_gems.each do |gem_name, gem_spec|
|
88
|
+
errors[gem_name] ||= []
|
89
|
+
|
90
|
+
gem_path = File.join(Gem.dir, "cache", gem_spec.full_name) + ".gem"
|
91
|
+
spec_path = File.join(Gem.dir, "specifications", gem_spec.full_name) + ".gemspec"
|
92
|
+
gem_directory = File.join(Gem.dir, "gems", gem_spec.full_name)
|
93
|
+
|
94
|
+
installed_files = find_files_for_gem(gem_directory)
|
95
|
+
|
96
|
+
unless File.exist? spec_path then
|
97
|
+
errors[gem_name] << ErrorData.new(spec_path, "Spec file doesn't exist for installed gem")
|
98
|
+
end
|
99
|
+
|
100
|
+
begin
|
101
|
+
verify_gem_file(gem_path)
|
102
|
+
|
103
|
+
open gem_path, Gem.binary_mode do |file|
|
104
|
+
format = Gem::Format.from_file_by_path(gem_path)
|
105
|
+
format.file_entries.each do |entry, data|
|
106
|
+
# Found this file. Delete it from list
|
107
|
+
installed_files.delete remove_leading_dot_dir(entry['path'])
|
108
|
+
|
109
|
+
next unless data # HACK `gem check -a mkrf`
|
110
|
+
|
111
|
+
open File.join(gem_directory, entry['path']), Gem.binary_mode do |f|
|
112
|
+
unless Gem::MD5.hexdigest(f.read).to_s ==
|
113
|
+
Gem::MD5.hexdigest(data).to_s then
|
114
|
+
errors[gem_name] << ErrorData.new(entry['path'], "installed file doesn't match original from gem")
|
107
115
|
end
|
108
116
|
end
|
109
117
|
end
|
110
|
-
rescue VerificationError => e
|
111
|
-
errors[gem_name] << ErrorData.new(gem_path, e.message)
|
112
|
-
end
|
113
|
-
# Clean out directories that weren't explicitly included in the gemspec
|
114
|
-
# FIXME: This still allows arbitrary incorrect directories.
|
115
|
-
installed_files.delete_if {|potential_directory|
|
116
|
-
File.directory?(File.join(gem_directory, potential_directory))
|
117
|
-
}
|
118
|
-
if(installed_files.size > 0) then
|
119
|
-
errors[gem_name] << ErrorData.new(gem_path, "Unmanaged files in gem: #{installed_files.inspect}")
|
120
118
|
end
|
119
|
+
rescue Gem::VerificationError => e
|
120
|
+
errors[gem_name] << ErrorData.new(gem_path, e.message)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Clean out directories that weren't explicitly included in the gemspec
|
124
|
+
# FIXME: This still allows arbitrary incorrect directories.
|
125
|
+
installed_files.delete_if {|potential_directory|
|
126
|
+
File.directory?(File.join(gem_directory, potential_directory))
|
127
|
+
}
|
128
|
+
if(installed_files.size > 0) then
|
129
|
+
errors[gem_name] << ErrorData.new(gem_path, "Unmanaged files in gem: #{installed_files.inspect}")
|
121
130
|
end
|
122
|
-
errors
|
123
131
|
end
|
124
132
|
|
133
|
+
errors
|
134
|
+
end
|
135
|
+
|
136
|
+
if RUBY_VERSION < '1.9' then
|
125
137
|
class TestRunner
|
126
138
|
def initialize(suite, ui)
|
127
139
|
@suite = suite
|
@@ -147,40 +159,50 @@ module Gem
|
|
147
159
|
end
|
148
160
|
|
149
161
|
autoload :TestRunner, 'test/unit/ui/testrunnerutilities'
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
162
|
+
end
|
163
|
+
|
164
|
+
##
|
165
|
+
# Runs unit tests for a given gem specification
|
166
|
+
|
167
|
+
def unit_test(gem_spec)
|
168
|
+
start_dir = Dir.pwd
|
169
|
+
Dir.chdir(gem_spec.full_gem_path)
|
170
|
+
$: << File.join(Gem.dir, "gems", gem_spec.full_name)
|
171
|
+
# XXX: why do we need this gem_spec when we've already got 'spec'?
|
172
|
+
test_files = gem_spec.test_files
|
173
|
+
|
174
|
+
if test_files.empty? then
|
175
|
+
say "There are no unit tests to run for #{gem_spec.full_name}"
|
176
|
+
return nil
|
177
|
+
end
|
178
|
+
|
179
|
+
gem gem_spec.name, "= #{gem_spec.version.version}"
|
180
|
+
|
181
|
+
test_files.each do |f| require f end
|
182
|
+
|
183
|
+
if RUBY_VERSION < '1.9' then
|
166
184
|
suite = Test::Unit::TestSuite.new("#{gem_spec.name}-#{gem_spec.version}")
|
185
|
+
|
167
186
|
ObjectSpace.each_object(Class) do |klass|
|
168
187
|
suite << klass.suite if (klass < Test::Unit::TestCase)
|
169
188
|
end
|
170
|
-
result = TestRunner.run(suite, ui())
|
171
|
-
unless result.passed?
|
172
|
-
alert_error(result.to_s)
|
173
|
-
#unless ask_yes_no(result.to_s + "...keep Gem?", true) then
|
174
|
-
#Gem::Uninstaller.new(gem_spec.name, gem_spec.version.version).uninstall
|
175
|
-
#end
|
176
|
-
end
|
177
|
-
result
|
178
|
-
ensure
|
179
|
-
Dir.chdir(start_dir)
|
180
|
-
end
|
181
189
|
|
182
|
-
|
183
|
-
|
190
|
+
result = TestRunner.run suite, ui
|
191
|
+
|
192
|
+
alert_error result.to_s unless result.passed?
|
193
|
+
else
|
194
|
+
result = MiniTest::Unit.new
|
195
|
+
result.run
|
184
196
|
end
|
197
|
+
|
198
|
+
result
|
199
|
+
ensure
|
200
|
+
Dir.chdir(start_dir)
|
201
|
+
end
|
202
|
+
|
203
|
+
def remove_leading_dot_dir(path)
|
204
|
+
path.sub(/^\.\//, "")
|
185
205
|
end
|
206
|
+
|
186
207
|
end
|
208
|
+
|