libgems 0.0.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.
- 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,208 @@
|
|
|
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 'tsort'
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# LibGems::DependencyList is used for installing and uninstalling gems in the
|
|
11
|
+
# correct order to avoid conflicts.
|
|
12
|
+
|
|
13
|
+
class LibGems::DependencyList
|
|
14
|
+
|
|
15
|
+
include Enumerable
|
|
16
|
+
include TSort
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Allows enabling/disabling use of development dependencies
|
|
20
|
+
|
|
21
|
+
attr_accessor :development
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Creates a DependencyList from a LibGems::SourceIndex +source_index+
|
|
25
|
+
|
|
26
|
+
def self.from_source_index(source_index)
|
|
27
|
+
list = new
|
|
28
|
+
|
|
29
|
+
source_index.each do |full_name, spec|
|
|
30
|
+
list.add spec
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
list
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# Creates a new DependencyList. If +development+ is true, development
|
|
38
|
+
# dependencies will be included.
|
|
39
|
+
|
|
40
|
+
def initialize development = false
|
|
41
|
+
@specs = []
|
|
42
|
+
|
|
43
|
+
@development = development
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Adds +gemspecs+ to the dependency list.
|
|
48
|
+
|
|
49
|
+
def add(*gemspecs)
|
|
50
|
+
@specs.push(*gemspecs)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
##
|
|
54
|
+
# Return a list of the gem specifications in the dependency list, sorted in
|
|
55
|
+
# order so that no gemspec in the list depends on a gemspec earlier in the
|
|
56
|
+
# list.
|
|
57
|
+
#
|
|
58
|
+
# This is useful when removing gems from a set of installed gems. By
|
|
59
|
+
# removing them in the returned order, you don't get into as many dependency
|
|
60
|
+
# issues.
|
|
61
|
+
#
|
|
62
|
+
# If there are circular dependencies (yuck!), then gems will be returned in
|
|
63
|
+
# order until only the circular dependents and anything they reference are
|
|
64
|
+
# left. Then arbitrary gemspecs will be returned until the circular
|
|
65
|
+
# dependency is broken, after which gems will be returned in dependency
|
|
66
|
+
# order again.
|
|
67
|
+
|
|
68
|
+
def dependency_order
|
|
69
|
+
sorted = strongly_connected_components.flatten
|
|
70
|
+
|
|
71
|
+
result = []
|
|
72
|
+
seen = {}
|
|
73
|
+
|
|
74
|
+
sorted.each do |spec|
|
|
75
|
+
if index = seen[spec.name] then
|
|
76
|
+
if result[index].version < spec.version then
|
|
77
|
+
result[index] = spec
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
seen[spec.name] = result.length
|
|
81
|
+
result << spec
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
result.reverse
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
##
|
|
89
|
+
# Iterator over dependency_order
|
|
90
|
+
|
|
91
|
+
def each(&block)
|
|
92
|
+
dependency_order.each(&block)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def find_name(full_name)
|
|
96
|
+
@specs.find { |spec| spec.full_name == full_name }
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def inspect # :nodoc:
|
|
100
|
+
"#<%s:0x%x %p>" % [self.class, object_id, map { |s| s.full_name }]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
##
|
|
104
|
+
# Are all the dependencies in the list satisfied?
|
|
105
|
+
|
|
106
|
+
def ok?
|
|
107
|
+
@specs.all? do |spec|
|
|
108
|
+
spec.runtime_dependencies.all? do |dep|
|
|
109
|
+
@specs.find { |s| s.satisfies_requirement? dep }
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
##
|
|
115
|
+
# Is is ok to remove a gemspec from the dependency list?
|
|
116
|
+
#
|
|
117
|
+
# If removing the gemspec creates breaks a currently ok dependency, then it
|
|
118
|
+
# is NOT ok to remove the gemspec.
|
|
119
|
+
|
|
120
|
+
def ok_to_remove?(full_name)
|
|
121
|
+
gem_to_remove = find_name full_name
|
|
122
|
+
|
|
123
|
+
siblings = @specs.find_all { |s|
|
|
124
|
+
s.name == gem_to_remove.name &&
|
|
125
|
+
s.full_name != gem_to_remove.full_name
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
deps = []
|
|
129
|
+
|
|
130
|
+
@specs.each do |spec|
|
|
131
|
+
spec.dependencies.each do |dep|
|
|
132
|
+
deps << dep if gem_to_remove.satisfies_requirement?(dep)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
deps.all? { |dep|
|
|
137
|
+
siblings.any? { |s|
|
|
138
|
+
s.satisfies_requirement? dep
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
##
|
|
144
|
+
# Removes the gemspec matching +full_name+ from the dependency list
|
|
145
|
+
|
|
146
|
+
def remove_by_name(full_name)
|
|
147
|
+
@specs.delete_if { |spec| spec.full_name == full_name }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
##
|
|
151
|
+
# Return a hash of predecessors. <tt>result[spec]</tt> is an Array of
|
|
152
|
+
# gemspecs that have a dependency satisfied by the named gemspec.
|
|
153
|
+
|
|
154
|
+
def spec_predecessors
|
|
155
|
+
result = Hash.new { |h,k| h[k] = [] }
|
|
156
|
+
|
|
157
|
+
specs = @specs.sort.reverse
|
|
158
|
+
|
|
159
|
+
specs.each do |spec|
|
|
160
|
+
specs.each do |other|
|
|
161
|
+
next if spec == other
|
|
162
|
+
|
|
163
|
+
other.dependencies.each do |dep|
|
|
164
|
+
if spec.satisfies_requirement? dep then
|
|
165
|
+
result[spec] << other
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
result
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def tsort_each_node(&block)
|
|
175
|
+
@specs.each(&block)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def tsort_each_child(node, &block)
|
|
179
|
+
specs = @specs.sort.reverse
|
|
180
|
+
|
|
181
|
+
dependencies = node.runtime_dependencies
|
|
182
|
+
dependencies.push(*node.development_dependencies) if @development
|
|
183
|
+
|
|
184
|
+
dependencies.each do |dep|
|
|
185
|
+
specs.each do |spec|
|
|
186
|
+
if spec.satisfies_requirement? dep then
|
|
187
|
+
begin
|
|
188
|
+
yield spec
|
|
189
|
+
rescue TSort::Cyclic
|
|
190
|
+
end
|
|
191
|
+
break
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
private
|
|
198
|
+
|
|
199
|
+
##
|
|
200
|
+
# Count the number of gemspecs in the list +specs+ that are not in
|
|
201
|
+
# +ignored+.
|
|
202
|
+
|
|
203
|
+
def active_count(specs, ignored)
|
|
204
|
+
specs.count { |spec| ignored[spec.full_name].nil? }
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
end
|
|
208
|
+
|
|
@@ -0,0 +1,242 @@
|
|
|
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
|
+
require 'libgems'
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
# The documentation manager generates RDoc and RI for SlimGems.
|
|
12
|
+
|
|
13
|
+
class LibGems::DocManager
|
|
14
|
+
|
|
15
|
+
include LibGems::UserInteraction
|
|
16
|
+
|
|
17
|
+
@configured_args = []
|
|
18
|
+
|
|
19
|
+
def self.configured_args
|
|
20
|
+
@configured_args ||= []
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.configured_args=(args)
|
|
24
|
+
case args
|
|
25
|
+
when Array
|
|
26
|
+
@configured_args = args
|
|
27
|
+
when String
|
|
28
|
+
@configured_args = args.split
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# Load RDoc from a gem if it is available, otherwise from Ruby's stdlib
|
|
34
|
+
|
|
35
|
+
def self.load_rdoc
|
|
36
|
+
begin
|
|
37
|
+
gem 'rdoc'
|
|
38
|
+
rescue LibGems::LoadError
|
|
39
|
+
# use built-in RDoc
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
begin
|
|
43
|
+
require 'rdoc/rdoc'
|
|
44
|
+
|
|
45
|
+
@rdoc_version = if defined? RDoc::VERSION then
|
|
46
|
+
LibGems::Version.new RDoc::VERSION
|
|
47
|
+
else
|
|
48
|
+
LibGems::Version.new '1.0.1' # HACK parsing is hard
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
rescue LoadError => e
|
|
52
|
+
raise LibGems::DocumentError,
|
|
53
|
+
"ERROR: RDoc documentation generator not installed: #{e}"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.rdoc_version
|
|
58
|
+
@rdoc_version
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
##
|
|
62
|
+
# Updates the RI cache for RDoc 2 if it is installed
|
|
63
|
+
|
|
64
|
+
def self.update_ri_cache
|
|
65
|
+
load_rdoc rescue return
|
|
66
|
+
|
|
67
|
+
return unless defined? RDoc::VERSION # RDoc 1 does not have VERSION
|
|
68
|
+
|
|
69
|
+
require 'rdoc/ri/driver'
|
|
70
|
+
|
|
71
|
+
options = {
|
|
72
|
+
:use_cache => true,
|
|
73
|
+
:use_system => true,
|
|
74
|
+
:use_site => true,
|
|
75
|
+
:use_home => true,
|
|
76
|
+
:use_gems => true,
|
|
77
|
+
:formatter => RDoc::RI::Formatter,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
RDoc::RI::Driver.new(options).class_cache
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
##
|
|
84
|
+
# Create a document manager for +spec+. +rdoc_args+ contains arguments for
|
|
85
|
+
# RDoc (template etc.) as a String.
|
|
86
|
+
|
|
87
|
+
def initialize(spec, rdoc_args="")
|
|
88
|
+
@spec = spec
|
|
89
|
+
@doc_dir = File.join(spec.installation_path, "doc", spec.full_name)
|
|
90
|
+
@rdoc_args = rdoc_args.nil? ? [] : rdoc_args.split
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
##
|
|
94
|
+
# Is the RDoc documentation installed?
|
|
95
|
+
|
|
96
|
+
def rdoc_installed?
|
|
97
|
+
File.exist?(File.join(@doc_dir, "rdoc"))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
##
|
|
101
|
+
# Is the RI documentation installed?
|
|
102
|
+
|
|
103
|
+
def ri_installed?
|
|
104
|
+
File.exist?(File.join(@doc_dir, "ri"))
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
##
|
|
108
|
+
# Generate the RI documents for this gem spec.
|
|
109
|
+
#
|
|
110
|
+
# Note that if both RI and RDoc documents are generated from the same
|
|
111
|
+
# process, the RI docs should be done first (a likely bug in RDoc will cause
|
|
112
|
+
# RI docs generation to fail if run after RDoc).
|
|
113
|
+
|
|
114
|
+
def generate_ri
|
|
115
|
+
setup_rdoc
|
|
116
|
+
install_ri # RDoc bug, ri goes first
|
|
117
|
+
|
|
118
|
+
FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
##
|
|
122
|
+
# Generate the RDoc documents for this gem spec.
|
|
123
|
+
#
|
|
124
|
+
# Note that if both RI and RDoc documents are generated from the same
|
|
125
|
+
# process, the RI docs should be done first (a likely bug in RDoc will cause
|
|
126
|
+
# RI docs generation to fail if run after RDoc).
|
|
127
|
+
|
|
128
|
+
def generate_rdoc
|
|
129
|
+
setup_rdoc
|
|
130
|
+
install_rdoc
|
|
131
|
+
|
|
132
|
+
FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
##
|
|
136
|
+
# Generate and install RDoc into the documentation directory
|
|
137
|
+
|
|
138
|
+
def install_rdoc
|
|
139
|
+
rdoc_dir = File.join @doc_dir, 'rdoc'
|
|
140
|
+
|
|
141
|
+
FileUtils.rm_rf rdoc_dir
|
|
142
|
+
|
|
143
|
+
say "Installing RDoc documentation for #{@spec.full_name}..."
|
|
144
|
+
run_rdoc '--op', rdoc_dir
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
##
|
|
148
|
+
# Generate and install RI into the documentation directory
|
|
149
|
+
|
|
150
|
+
def install_ri
|
|
151
|
+
ri_dir = File.join @doc_dir, 'ri'
|
|
152
|
+
|
|
153
|
+
FileUtils.rm_rf ri_dir
|
|
154
|
+
|
|
155
|
+
say "Installing ri documentation for #{@spec.full_name}..."
|
|
156
|
+
run_rdoc '--ri', '--op', ri_dir
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# Run RDoc with +args+, which is an ARGV style argument list
|
|
161
|
+
|
|
162
|
+
def run_rdoc(*args)
|
|
163
|
+
args << @spec.rdoc_options
|
|
164
|
+
args << self.class.configured_args
|
|
165
|
+
args << '--quiet'
|
|
166
|
+
args << @spec.require_paths.clone
|
|
167
|
+
args << @spec.extra_rdoc_files
|
|
168
|
+
args << '--title' << "#{@spec.full_name} Documentation"
|
|
169
|
+
args = args.flatten.map do |arg| arg.to_s end
|
|
170
|
+
|
|
171
|
+
if self.class.rdoc_version >= LibGems::Version.new('2.4.0') then
|
|
172
|
+
args.delete '--inline-source'
|
|
173
|
+
args.delete '--promiscuous'
|
|
174
|
+
args.delete '-p'
|
|
175
|
+
args.delete '--one-file'
|
|
176
|
+
# HACK more
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
r = RDoc::RDoc.new
|
|
180
|
+
|
|
181
|
+
old_pwd = Dir.pwd
|
|
182
|
+
Dir.chdir @spec.full_gem_path
|
|
183
|
+
|
|
184
|
+
say "rdoc #{args.join ' '}" if LibGems.configuration.really_verbose
|
|
185
|
+
|
|
186
|
+
begin
|
|
187
|
+
r.document args
|
|
188
|
+
rescue Errno::EACCES => e
|
|
189
|
+
dirname = File.dirname e.message.split("-")[1].strip
|
|
190
|
+
raise LibGems::FilePermissionError.new(dirname)
|
|
191
|
+
rescue Interrupt => e
|
|
192
|
+
raise e
|
|
193
|
+
rescue Exception => ex
|
|
194
|
+
alert_error "While generating documentation for #{@spec.full_name}"
|
|
195
|
+
ui.errs.puts "... MESSAGE: #{ex}"
|
|
196
|
+
ui.errs.puts "... RDOC args: #{args.join(' ')}"
|
|
197
|
+
ui.errs.puts "\t#{ex.backtrace.join "\n\t"}" if
|
|
198
|
+
LibGems.configuration.backtrace
|
|
199
|
+
ui.errs.puts "(continuing with the rest of the installation)"
|
|
200
|
+
ensure
|
|
201
|
+
Dir.chdir old_pwd
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def setup_rdoc
|
|
206
|
+
if File.exist?(@doc_dir) && !File.writable?(@doc_dir) then
|
|
207
|
+
raise LibGems::FilePermissionError.new(@doc_dir)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
|
|
211
|
+
|
|
212
|
+
self.class.load_rdoc
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
##
|
|
216
|
+
# Remove RDoc and RI documentation
|
|
217
|
+
|
|
218
|
+
def uninstall_doc
|
|
219
|
+
raise LibGems::FilePermissionError.new(@spec.installation_path) unless
|
|
220
|
+
File.writable? @spec.installation_path
|
|
221
|
+
|
|
222
|
+
original_name = [
|
|
223
|
+
@spec.name, @spec.version, @spec.original_platform].join '-'
|
|
224
|
+
|
|
225
|
+
doc_dir = File.join @spec.installation_path, 'doc', @spec.full_name
|
|
226
|
+
unless File.directory? doc_dir then
|
|
227
|
+
doc_dir = File.join @spec.installation_path, 'doc', original_name
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
FileUtils.rm_rf doc_dir
|
|
231
|
+
|
|
232
|
+
ri_dir = File.join @spec.installation_path, 'ri', @spec.full_name
|
|
233
|
+
|
|
234
|
+
unless File.directory? ri_dir then
|
|
235
|
+
ri_dir = File.join @spec.installation_path, 'ri', original_name
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
FileUtils.rm_rf ri_dir
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
end
|
|
242
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
class LibGems::ErrorReason; end
|
|
2
|
+
|
|
3
|
+
# Generated when trying to lookup a gem to indicate that the gem
|
|
4
|
+
# was found, but that it isn't usable on the current platform.
|
|
5
|
+
#
|
|
6
|
+
# fetch and install read these and report them to the user to aid
|
|
7
|
+
# in figuring out why a gem couldn't be installed.
|
|
8
|
+
#
|
|
9
|
+
class LibGems::PlatformMismatch < LibGems::ErrorReason
|
|
10
|
+
|
|
11
|
+
attr_reader :name
|
|
12
|
+
attr_reader :version
|
|
13
|
+
attr_reader :platforms
|
|
14
|
+
|
|
15
|
+
def initialize(name, version)
|
|
16
|
+
@name = name
|
|
17
|
+
@version = version
|
|
18
|
+
@platforms = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def add_platform(platform)
|
|
22
|
+
@platforms << platform
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def wordy
|
|
26
|
+
prefix = "Found #{@name} (#{@version})"
|
|
27
|
+
|
|
28
|
+
if @platforms.size == 1
|
|
29
|
+
"#{prefix}, but was for platform #{@platforms[0]}"
|
|
30
|
+
else
|
|
31
|
+
"#{prefix}, but was for platforms #{@platforms.join(' ,')}"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|