libgems 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +5811 -0
- data/History.txt +887 -0
- data/LICENSE.txt +51 -0
- data/README.md +87 -0
- data/Rakefile +113 -0
- data/lib/gauntlet_libgems.rb +50 -0
- data/lib/libgems.rb +1246 -0
- data/lib/libgems/builder.rb +102 -0
- data/lib/libgems/command.rb +534 -0
- data/lib/libgems/command_manager.rb +182 -0
- data/lib/libgems/commands/build_command.rb +53 -0
- data/lib/libgems/commands/cert_command.rb +86 -0
- data/lib/libgems/commands/check_command.rb +80 -0
- data/lib/libgems/commands/cleanup_command.rb +106 -0
- data/lib/libgems/commands/contents_command.rb +98 -0
- data/lib/libgems/commands/dependency_command.rb +195 -0
- data/lib/libgems/commands/environment_command.rb +133 -0
- data/lib/libgems/commands/fetch_command.rb +67 -0
- data/lib/libgems/commands/generate_index_command.rb +133 -0
- data/lib/libgems/commands/help_command.rb +172 -0
- data/lib/libgems/commands/install_command.rb +178 -0
- data/lib/libgems/commands/list_command.rb +35 -0
- data/lib/libgems/commands/lock_command.rb +110 -0
- data/lib/libgems/commands/mirror_command.rb +111 -0
- data/lib/libgems/commands/outdated_command.rb +33 -0
- data/lib/libgems/commands/owner_command.rb +75 -0
- data/lib/libgems/commands/pristine_command.rb +93 -0
- data/lib/libgems/commands/push_command.rb +56 -0
- data/lib/libgems/commands/query_command.rb +280 -0
- data/lib/libgems/commands/rdoc_command.rb +91 -0
- data/lib/libgems/commands/search_command.rb +31 -0
- data/lib/libgems/commands/server_command.rb +86 -0
- data/lib/libgems/commands/sources_command.rb +157 -0
- data/lib/libgems/commands/specification_command.rb +125 -0
- data/lib/libgems/commands/stale_command.rb +27 -0
- data/lib/libgems/commands/uninstall_command.rb +83 -0
- data/lib/libgems/commands/unpack_command.rb +121 -0
- data/lib/libgems/commands/update_command.rb +160 -0
- data/lib/libgems/commands/which_command.rb +86 -0
- data/lib/libgems/config_file.rb +345 -0
- data/lib/libgems/custom_require.rb +44 -0
- data/lib/libgems/defaults.rb +101 -0
- data/lib/libgems/dependency.rb +227 -0
- data/lib/libgems/dependency_installer.rb +286 -0
- data/lib/libgems/dependency_list.rb +208 -0
- data/lib/libgems/doc_manager.rb +242 -0
- data/lib/libgems/errors.rb +35 -0
- data/lib/libgems/exceptions.rb +91 -0
- data/lib/libgems/ext.rb +18 -0
- data/lib/libgems/ext/builder.rb +56 -0
- data/lib/libgems/ext/configure_builder.rb +25 -0
- data/lib/libgems/ext/ext_conf_builder.rb +24 -0
- data/lib/libgems/ext/rake_builder.rb +39 -0
- data/lib/libgems/format.rb +81 -0
- data/lib/libgems/gem_openssl.rb +92 -0
- data/lib/libgems/gem_path_searcher.rb +100 -0
- data/lib/libgems/gem_runner.rb +79 -0
- data/lib/libgems/gemcutter_utilities.rb +49 -0
- data/lib/libgems/indexer.rb +720 -0
- data/lib/libgems/install_update_options.rb +125 -0
- data/lib/libgems/installer.rb +604 -0
- data/lib/libgems/local_remote_options.rb +135 -0
- data/lib/libgems/old_format.rb +153 -0
- data/lib/libgems/package.rb +97 -0
- data/lib/libgems/package/f_sync_dir.rb +23 -0
- data/lib/libgems/package/tar_header.rb +266 -0
- data/lib/libgems/package/tar_input.rb +222 -0
- data/lib/libgems/package/tar_output.rb +144 -0
- data/lib/libgems/package/tar_reader.rb +106 -0
- data/lib/libgems/package/tar_reader/entry.rb +141 -0
- data/lib/libgems/package/tar_writer.rb +241 -0
- data/lib/libgems/package_task.rb +126 -0
- data/lib/libgems/platform.rb +183 -0
- data/lib/libgems/remote_fetcher.rb +414 -0
- data/lib/libgems/require_paths_builder.rb +18 -0
- data/lib/libgems/requirement.rb +153 -0
- data/lib/libgems/security.rb +814 -0
- data/lib/libgems/server.rb +872 -0
- data/lib/libgems/source_index.rb +597 -0
- data/lib/libgems/source_info_cache.rb +395 -0
- data/lib/libgems/source_info_cache_entry.rb +56 -0
- data/lib/libgems/spec_fetcher.rb +337 -0
- data/lib/libgems/specification.rb +1487 -0
- data/lib/libgems/test_utilities.rb +147 -0
- data/lib/libgems/text.rb +65 -0
- data/lib/libgems/uninstaller.rb +278 -0
- data/lib/libgems/user_interaction.rb +527 -0
- data/lib/libgems/validator.rb +240 -0
- data/lib/libgems/version.rb +316 -0
- data/lib/libgems/version_option.rb +65 -0
- data/lib/rbconfig/datadir.rb +20 -0
- data/test/bogussources.rb +8 -0
- data/test/data/gem-private_key.pem +27 -0
- data/test/data/gem-public_cert.pem +20 -0
- data/test/fake_certlib/openssl.rb +7 -0
- data/test/foo/discover.rb +0 -0
- data/test/gem_installer_test_case.rb +97 -0
- data/test/gem_package_tar_test_case.rb +132 -0
- data/test/gemutilities.rb +605 -0
- data/test/insure_session.rb +43 -0
- data/test/mockgemui.rb +56 -0
- data/test/plugin/exception/libgems_plugin.rb +2 -0
- data/test/plugin/load/libgems_plugin.rb +1 -0
- data/test/plugin/standarderror/libgems_plugin.rb +2 -0
- data/test/private_key.pem +27 -0
- data/test/public_cert.pem +20 -0
- data/test/rubygems_plugin.rb +21 -0
- data/test/simple_gem.rb +66 -0
- data/test/test_config.rb +12 -0
- data/test/test_gem.rb +780 -0
- data/test/test_gem_builder.rb +27 -0
- data/test/test_gem_command.rb +178 -0
- data/test/test_gem_command_manager.rb +207 -0
- data/test/test_gem_commands_build_command.rb +74 -0
- data/test/test_gem_commands_cert_command.rb +124 -0
- data/test/test_gem_commands_check_command.rb +18 -0
- data/test/test_gem_commands_contents_command.rb +156 -0
- data/test/test_gem_commands_dependency_command.rb +216 -0
- data/test/test_gem_commands_environment_command.rb +144 -0
- data/test/test_gem_commands_fetch_command.rb +76 -0
- data/test/test_gem_commands_generate_index_command.rb +135 -0
- data/test/test_gem_commands_install_command.rb +315 -0
- data/test/test_gem_commands_list_command.rb +36 -0
- data/test/test_gem_commands_lock_command.rb +68 -0
- data/test/test_gem_commands_mirror_command.rb +60 -0
- data/test/test_gem_commands_outdated_command.rb +40 -0
- data/test/test_gem_commands_owner_command.rb +105 -0
- data/test/test_gem_commands_pristine_command.rb +108 -0
- data/test/test_gem_commands_push_command.rb +81 -0
- data/test/test_gem_commands_query_command.rb +426 -0
- data/test/test_gem_commands_server_command.rb +59 -0
- data/test/test_gem_commands_sources_command.rb +209 -0
- data/test/test_gem_commands_specification_command.rb +139 -0
- data/test/test_gem_commands_stale_command.rb +38 -0
- data/test/test_gem_commands_uninstall_command.rb +83 -0
- data/test/test_gem_commands_unpack_command.rb +199 -0
- data/test/test_gem_commands_update_command.rb +207 -0
- data/test/test_gem_commands_which_command.rb +66 -0
- data/test/test_gem_config_file.rb +287 -0
- data/test/test_gem_dependency.rb +149 -0
- data/test/test_gem_dependency_installer.rb +661 -0
- data/test/test_gem_dependency_list.rb +230 -0
- data/test/test_gem_doc_manager.rb +31 -0
- data/test/test_gem_ext_configure_builder.rb +84 -0
- data/test/test_gem_ext_ext_conf_builder.rb +173 -0
- data/test/test_gem_ext_rake_builder.rb +81 -0
- data/test/test_gem_format.rb +70 -0
- data/test/test_gem_gem_path_searcher.rb +78 -0
- data/test/test_gem_gem_runner.rb +45 -0
- data/test/test_gem_gemcutter_utilities.rb +103 -0
- data/test/test_gem_indexer.rb +673 -0
- data/test/test_gem_install_update_options.rb +68 -0
- data/test/test_gem_installer.rb +857 -0
- data/test/test_gem_local_remote_options.rb +97 -0
- data/test/test_gem_package_tar_header.rb +130 -0
- data/test/test_gem_package_tar_input.rb +112 -0
- data/test/test_gem_package_tar_output.rb +97 -0
- data/test/test_gem_package_tar_reader.rb +46 -0
- data/test/test_gem_package_tar_reader_entry.rb +109 -0
- data/test/test_gem_package_tar_writer.rb +144 -0
- data/test/test_gem_package_task.rb +59 -0
- data/test/test_gem_platform.rb +264 -0
- data/test/test_gem_remote_fetcher.rb +740 -0
- data/test/test_gem_requirement.rb +292 -0
- data/test/test_gem_server.rb +356 -0
- data/test/test_gem_silent_ui.rb +113 -0
- data/test/test_gem_source_index.rb +461 -0
- data/test/test_gem_spec_fetcher.rb +410 -0
- data/test/test_gem_specification.rb +1334 -0
- data/test/test_gem_stream_ui.rb +218 -0
- data/test/test_gem_text.rb +43 -0
- data/test/test_gem_uninstaller.rb +146 -0
- data/test/test_gem_validator.rb +63 -0
- data/test/test_gem_version.rb +181 -0
- data/test/test_gem_version_option.rb +89 -0
- data/test/test_kernel.rb +59 -0
- metadata +402 -0
@@ -0,0 +1,91 @@
|
|
1
|
+
##
|
2
|
+
# Base exception class for #{LibGems::NAME}. All exception raised by SlimGems are a
|
3
|
+
# subclass of this one.
|
4
|
+
class LibGems::Exception < RuntimeError; end
|
5
|
+
|
6
|
+
class LibGems::CommandLineError < LibGems::Exception; end
|
7
|
+
|
8
|
+
class LibGems::DependencyError < LibGems::Exception; end
|
9
|
+
|
10
|
+
class LibGems::DependencyRemovalException < LibGems::Exception; end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Raised when attempting to uninstall a gem that isn't in GEM_HOME.
|
14
|
+
|
15
|
+
class LibGems::GemNotInHomeException < LibGems::Exception
|
16
|
+
attr_accessor :spec
|
17
|
+
end
|
18
|
+
|
19
|
+
class LibGems::DocumentError < LibGems::Exception; end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Potentially raised when a specification is validated.
|
23
|
+
class LibGems::EndOfYAMLException < LibGems::Exception; end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Signals that a file permission error is preventing the user from
|
27
|
+
# installing in the requested directories.
|
28
|
+
class LibGems::FilePermissionError < LibGems::Exception
|
29
|
+
def initialize(path)
|
30
|
+
super("You don't have write permissions into the #{path} directory.")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Used to raise parsing and loading errors
|
36
|
+
class LibGems::FormatException < LibGems::Exception
|
37
|
+
attr_accessor :file_path
|
38
|
+
end
|
39
|
+
|
40
|
+
class LibGems::GemNotFoundException < LibGems::Exception
|
41
|
+
def initialize(msg, name=nil, version=nil, errors=nil)
|
42
|
+
super msg
|
43
|
+
@name = name
|
44
|
+
@version = version
|
45
|
+
@errors = errors
|
46
|
+
end
|
47
|
+
|
48
|
+
attr_reader :name, :version, :errors
|
49
|
+
end
|
50
|
+
|
51
|
+
class LibGems::InstallError < LibGems::Exception; end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Potentially raised when a specification is validated.
|
55
|
+
class LibGems::InvalidSpecificationException < LibGems::Exception; end
|
56
|
+
|
57
|
+
class LibGems::OperationNotSupportedError < LibGems::Exception; end
|
58
|
+
|
59
|
+
##
|
60
|
+
# Signals that a remote operation cannot be conducted, probably due to not
|
61
|
+
# being connected (or just not finding host).
|
62
|
+
#--
|
63
|
+
# TODO: create a method that tests connection to the preferred gems server.
|
64
|
+
# All code dealing with remote operations will want this. Failure in that
|
65
|
+
# method should raise this error.
|
66
|
+
class LibGems::RemoteError < LibGems::Exception; end
|
67
|
+
|
68
|
+
class LibGems::RemoteInstallationCancelled < LibGems::Exception; end
|
69
|
+
|
70
|
+
class LibGems::RemoteInstallationSkipped < LibGems::Exception; end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Represents an error communicating via HTTP.
|
74
|
+
class LibGems::RemoteSourceException < LibGems::Exception; end
|
75
|
+
|
76
|
+
class LibGems::VerificationError < LibGems::Exception; end
|
77
|
+
|
78
|
+
##
|
79
|
+
# Raised to indicate that a system exit should occur with the specified
|
80
|
+
# exit_code
|
81
|
+
|
82
|
+
class LibGems::SystemExitException < SystemExit
|
83
|
+
attr_accessor :exit_code
|
84
|
+
|
85
|
+
def initialize(exit_code)
|
86
|
+
@exit_code = exit_code
|
87
|
+
|
88
|
+
super "Exiting #{LibGems::NAME} with exit_code #{exit_code}"
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
data/lib/libgems/ext.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'libgems'
|
8
|
+
|
9
|
+
##
|
10
|
+
# Classes for building C extensions live here.
|
11
|
+
|
12
|
+
module LibGems::Ext; end
|
13
|
+
|
14
|
+
require 'libgems/ext/builder'
|
15
|
+
require 'libgems/ext/configure_builder'
|
16
|
+
require 'libgems/ext/ext_conf_builder'
|
17
|
+
require 'libgems/ext/rake_builder'
|
18
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
class LibGems::Ext::Builder
|
8
|
+
|
9
|
+
def self.class_name
|
10
|
+
name =~ /Ext::(.*)Builder/
|
11
|
+
$1.downcase
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.make(dest_path, results)
|
15
|
+
unless File.exist? 'Makefile' then
|
16
|
+
raise LibGems::InstallError, "Makefile not found:\n\n#{results.join "\n"}"
|
17
|
+
end
|
18
|
+
|
19
|
+
mf = File.read('Makefile')
|
20
|
+
mf = mf.gsub(/^RUBYARCHDIR\s*=\s*\$[^$]*/, "RUBYARCHDIR = #{dest_path}")
|
21
|
+
mf = mf.gsub(/^RUBYLIBDIR\s*=\s*\$[^$]*/, "RUBYLIBDIR = #{dest_path}")
|
22
|
+
|
23
|
+
File.open('Makefile', 'wb') {|f| f.print mf}
|
24
|
+
|
25
|
+
# try to find make program from Ruby configue arguments first
|
26
|
+
RbConfig::CONFIG['configure_args'] =~ /with-make-prog\=(\w+)/
|
27
|
+
make_program = $1 || ENV['make']
|
28
|
+
unless make_program then
|
29
|
+
make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
|
30
|
+
end
|
31
|
+
|
32
|
+
['', ' install'].each do |target|
|
33
|
+
cmd = "#{make_program}#{target}"
|
34
|
+
results << cmd
|
35
|
+
results << `#{cmd} #{redirector}`
|
36
|
+
|
37
|
+
raise LibGems::InstallError, "make#{target} failed:\n\n#{results}" unless
|
38
|
+
$?.success?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.redirector
|
43
|
+
'2>&1'
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.run(command, results)
|
47
|
+
results << command
|
48
|
+
results << `#{command} #{redirector}`
|
49
|
+
|
50
|
+
unless $?.success? then
|
51
|
+
raise LibGems::InstallError, "#{class_name} failed:\n\n#{results.join "\n"}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'libgems/ext/builder'
|
8
|
+
|
9
|
+
class LibGems::Ext::ConfigureBuilder < LibGems::Ext::Builder
|
10
|
+
|
11
|
+
def self.build(extension, directory, dest_path, results)
|
12
|
+
unless File.exist?('Makefile') then
|
13
|
+
cmd = "sh ./configure --prefix=#{dest_path}"
|
14
|
+
cmd << " #{LibGems::Command.build_args.join ' '}" unless LibGems::Command.build_args.empty?
|
15
|
+
|
16
|
+
run cmd, results
|
17
|
+
end
|
18
|
+
|
19
|
+
make dest_path, results
|
20
|
+
|
21
|
+
results
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'libgems/ext/builder'
|
8
|
+
require 'libgems/command'
|
9
|
+
|
10
|
+
class LibGems::Ext::ExtConfBuilder < LibGems::Ext::Builder
|
11
|
+
|
12
|
+
def self.build(extension, directory, dest_path, results)
|
13
|
+
cmd = "#{LibGems.ruby} #{File.basename extension}"
|
14
|
+
cmd << " #{LibGems::Command.build_args.join ' '}" unless LibGems::Command.build_args.empty?
|
15
|
+
|
16
|
+
run cmd, results
|
17
|
+
|
18
|
+
make dest_path, results
|
19
|
+
|
20
|
+
results
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'libgems/ext/builder'
|
8
|
+
require 'libgems/command'
|
9
|
+
|
10
|
+
class LibGems::Ext::RakeBuilder < LibGems::Ext::Builder
|
11
|
+
|
12
|
+
def self.build(extension, directory, dest_path, results)
|
13
|
+
if File.basename(extension) =~ /mkrf_conf/i then
|
14
|
+
cmd = "#{LibGems.ruby} #{File.basename extension}"
|
15
|
+
cmd << " #{LibGems::Command.build_args.join " "}" unless LibGems::Command.build_args.empty?
|
16
|
+
run cmd, results
|
17
|
+
end
|
18
|
+
|
19
|
+
# Deal with possible spaces in the path, e.g. C:/Program Files
|
20
|
+
dest_path = '"' + dest_path + '"' if dest_path.include?(' ')
|
21
|
+
|
22
|
+
rake = ENV['rake']
|
23
|
+
|
24
|
+
rake ||= begin
|
25
|
+
"\"#{LibGems.ruby}\" -rubygems #{LibGems.bin_path('rake')}"
|
26
|
+
rescue LibGems::Exception
|
27
|
+
end
|
28
|
+
|
29
|
+
rake ||= LibGems.default_exec_format % 'rake'
|
30
|
+
|
31
|
+
cmd = "#{rake} RUBYARCHDIR=#{dest_path} RUBYLIBDIR=#{dest_path}" # ENV is frozen
|
32
|
+
|
33
|
+
run cmd, results
|
34
|
+
|
35
|
+
results
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'fileutils'
|
8
|
+
|
9
|
+
require 'libgems/package'
|
10
|
+
|
11
|
+
##
|
12
|
+
# LibGems::Format knows the guts of the RubyGem .gem file format and provides the
|
13
|
+
# capability to read gem files
|
14
|
+
|
15
|
+
class LibGems::Format
|
16
|
+
|
17
|
+
attr_accessor :spec
|
18
|
+
attr_accessor :file_entries
|
19
|
+
attr_accessor :gem_path
|
20
|
+
|
21
|
+
extend LibGems::UserInteraction
|
22
|
+
|
23
|
+
##
|
24
|
+
# Constructs a Format representing the gem's data which came from +gem_path+
|
25
|
+
|
26
|
+
def initialize(gem_path)
|
27
|
+
@gem_path = gem_path
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Reads the gem +file_path+ using +security_policy+ and returns a Format
|
32
|
+
# representing the data in the gem
|
33
|
+
|
34
|
+
def self.from_file_by_path(file_path, security_policy = nil)
|
35
|
+
unless File.exist?(file_path)
|
36
|
+
raise LibGems::Exception, "Cannot load gem at [#{file_path}] in #{Dir.pwd}"
|
37
|
+
end
|
38
|
+
|
39
|
+
start = File.read file_path, 20
|
40
|
+
|
41
|
+
if start.nil? or start.length < 20 then
|
42
|
+
nil
|
43
|
+
elsif start.include?("MD5SUM =") # old version gems
|
44
|
+
require 'libgems/old_format'
|
45
|
+
|
46
|
+
LibGems::OldFormat.from_file_by_path file_path
|
47
|
+
else
|
48
|
+
open file_path, LibGems.binary_mode do |io|
|
49
|
+
from_io io, file_path, security_policy
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# Reads a gem from +io+ at +gem_path+ using +security_policy+ and returns a
|
56
|
+
# Format representing the data from the gem
|
57
|
+
|
58
|
+
def self.from_io(io, gem_path="(io)", security_policy = nil)
|
59
|
+
format = new gem_path
|
60
|
+
|
61
|
+
LibGems::Package.open io, 'r', security_policy do |pkg|
|
62
|
+
format.spec = pkg.metadata
|
63
|
+
format.file_entries = []
|
64
|
+
|
65
|
+
pkg.each do |entry|
|
66
|
+
size = entry.header.size
|
67
|
+
mode = entry.header.mode
|
68
|
+
|
69
|
+
format.file_entries << [{
|
70
|
+
"size" => size, "mode" => mode, "path" => entry.full_name,
|
71
|
+
},
|
72
|
+
entry.read
|
73
|
+
]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
format
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
#--
|
8
|
+
# Some system might not have OpenSSL installed, therefore the core
|
9
|
+
# library file openssl might not be available. We localize testing
|
10
|
+
# for the presence of OpenSSL in this file.
|
11
|
+
#++
|
12
|
+
|
13
|
+
module LibGems
|
14
|
+
class << self
|
15
|
+
##
|
16
|
+
# Is SSL (used by the signing commands) available on this
|
17
|
+
# platform?
|
18
|
+
|
19
|
+
def ssl_available?
|
20
|
+
@ssl_available
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Is SSL available?
|
25
|
+
|
26
|
+
attr_writer :ssl_available
|
27
|
+
|
28
|
+
##
|
29
|
+
# Ensure that SSL is available. Throw an exception if it is not.
|
30
|
+
|
31
|
+
def ensure_ssl_available
|
32
|
+
unless ssl_available?
|
33
|
+
raise LibGems::Exception, "SSL is not installed on this system"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
begin
|
40
|
+
require 'openssl'
|
41
|
+
|
42
|
+
# Reference a constant defined in the .rb portion of ssl (just to
|
43
|
+
# make sure that part is loaded too).
|
44
|
+
|
45
|
+
LibGems.ssl_available = !!OpenSSL::Digest::SHA1
|
46
|
+
|
47
|
+
class OpenSSL::X509::Certificate # :nodoc:
|
48
|
+
# Check the validity of this certificate.
|
49
|
+
def check_validity(issuer_cert = nil, time = Time.now)
|
50
|
+
ret = if @not_before && @not_before > time
|
51
|
+
[false, :expired, "not valid before '#@not_before'"]
|
52
|
+
elsif @not_after && @not_after < time
|
53
|
+
[false, :expired, "not valid after '#@not_after'"]
|
54
|
+
elsif issuer_cert && !verify(issuer_cert.public_key)
|
55
|
+
[false, :issuer, "#{issuer_cert.subject} is not issuer"]
|
56
|
+
else
|
57
|
+
[true, :ok, 'Valid certificate']
|
58
|
+
end
|
59
|
+
|
60
|
+
# return hash
|
61
|
+
{ :is_valid => ret[0], :error => ret[1], :desc => ret[2] }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
rescue LoadError, StandardError
|
66
|
+
LibGems.ssl_available = false
|
67
|
+
end
|
68
|
+
|
69
|
+
# :stopdoc:
|
70
|
+
|
71
|
+
module LibGems::SSL
|
72
|
+
|
73
|
+
# We make our own versions of the constants here. This allows us
|
74
|
+
# to reference the constants, even though some systems might not
|
75
|
+
# have SSL installed in the Ruby core package.
|
76
|
+
#
|
77
|
+
# These constants are only used during load time. At runtime, any
|
78
|
+
# method that makes a direct reference to SSL software must be
|
79
|
+
# protected with a LibGems.ensure_ssl_available call.
|
80
|
+
|
81
|
+
if LibGems.ssl_available? then
|
82
|
+
PKEY_RSA = OpenSSL::PKey::RSA
|
83
|
+
DIGEST_SHA1 = OpenSSL::Digest::SHA1
|
84
|
+
else
|
85
|
+
PKEY_RSA = :rsa
|
86
|
+
DIGEST_SHA1 = :sha1
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
# :startdoc:
|
92
|
+
|
@@ -0,0 +1,100 @@
|
|
1
|
+
##
|
2
|
+
# LibGemsPathSearcher has the capability to find loadable files inside
|
3
|
+
# gems. It generates data up front to speed up searches later.
|
4
|
+
|
5
|
+
class LibGems::GemPathSearcher
|
6
|
+
|
7
|
+
##
|
8
|
+
# Initialise the data we need to make searches later.
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
# We want a record of all the installed gemspecs, in the order we wish to
|
12
|
+
# examine them.
|
13
|
+
@gemspecs = init_gemspecs
|
14
|
+
|
15
|
+
# Map gem spec to glob of full require_path directories. Preparing this
|
16
|
+
# information may speed up searches later.
|
17
|
+
@lib_dirs = {}
|
18
|
+
|
19
|
+
@gemspecs.each do |spec|
|
20
|
+
@lib_dirs[spec.object_id] = lib_dirs_for spec
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
##
|
25
|
+
# Look in all the installed gems until a matching _path_ is found.
|
26
|
+
# Return the _gemspec_ of the gem where it was found. If no match
|
27
|
+
# is found, return nil.
|
28
|
+
#
|
29
|
+
# The gems are searched in alphabetical order, and in reverse
|
30
|
+
# version order.
|
31
|
+
#
|
32
|
+
# For example:
|
33
|
+
#
|
34
|
+
# find('log4r') # -> (log4r-1.1 spec)
|
35
|
+
# find('log4r.rb') # -> (log4r-1.1 spec)
|
36
|
+
# find('rake/rdoctask') # -> (rake-0.4.12 spec)
|
37
|
+
# find('foobarbaz') # -> nil
|
38
|
+
#
|
39
|
+
# Matching paths can have various suffixes ('.rb', '.so', and
|
40
|
+
# others), which may or may not already be attached to _file_.
|
41
|
+
# This method doesn't care about the full filename that matches;
|
42
|
+
# only that there is a match.
|
43
|
+
|
44
|
+
def find(path)
|
45
|
+
@gemspecs.find do |spec| matching_file? spec, path end
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# Works like #find, but finds all gemspecs matching +path+.
|
50
|
+
|
51
|
+
def find_all(path)
|
52
|
+
@gemspecs.select do |spec|
|
53
|
+
matching_file? spec, path
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Attempts to find a matching path using the require_paths of the given
|
59
|
+
# +spec+.
|
60
|
+
|
61
|
+
def matching_file?(spec, path)
|
62
|
+
!matching_files(spec, path).empty?
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# Returns files matching +path+ in +spec+.
|
67
|
+
#--
|
68
|
+
# Some of the intermediate results are cached in @lib_dirs for speed.
|
69
|
+
|
70
|
+
def matching_files(spec, path)
|
71
|
+
return [] unless @lib_dirs[spec.object_id] # case no paths
|
72
|
+
glob = File.join @lib_dirs[spec.object_id], "#{path}#{LibGems.suffix_pattern}"
|
73
|
+
Dir[glob].select { |f| File.file? f.untaint }
|
74
|
+
end
|
75
|
+
|
76
|
+
##
|
77
|
+
# Return a list of all installed gemspecs, sorted by alphabetical order and
|
78
|
+
# in reverse version order. (bar-2, bar-1, foo-2)
|
79
|
+
|
80
|
+
def init_gemspecs
|
81
|
+
specs = LibGems.source_index.map { |_, spec| spec }
|
82
|
+
|
83
|
+
specs.sort { |a, b|
|
84
|
+
names = a.name <=> b.name
|
85
|
+
next names if names.nonzero?
|
86
|
+
b.version <=> a.version
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
##
|
91
|
+
# Returns library directories glob for a gemspec. For example,
|
92
|
+
# '/usr/local/lib/ruby/gems/1.8/gems/foobar-1.0/{lib,ext}'
|
93
|
+
|
94
|
+
def lib_dirs_for(spec)
|
95
|
+
"#{spec.full_gem_path}/{#{spec.require_paths.join(',')}}" if
|
96
|
+
spec.require_paths
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|