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,395 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
require 'libgems'
|
|
4
|
+
require 'libgems/source_info_cache_entry'
|
|
5
|
+
require 'libgems/user_interaction'
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# SourceInfoCache stores a copy of the gem index for each gem source.
|
|
9
|
+
#
|
|
10
|
+
# There are two possible cache locations, the system cache and the user cache:
|
|
11
|
+
# * The system cache is preferred if it is writable or can be created.
|
|
12
|
+
# * The user cache is used otherwise
|
|
13
|
+
#
|
|
14
|
+
# Once a cache is selected, it will be used for all operations.
|
|
15
|
+
# SourceInfoCache will not switch between cache files dynamically.
|
|
16
|
+
#
|
|
17
|
+
# Cache data is a Hash mapping a source URI to a SourceInfoCacheEntry.
|
|
18
|
+
#
|
|
19
|
+
#--
|
|
20
|
+
# To keep things straight, this is how the cache objects all fit together:
|
|
21
|
+
#
|
|
22
|
+
# LibGems::SourceInfoCache
|
|
23
|
+
# @cache_data = {
|
|
24
|
+
# source_uri => LibGems::SourceInfoCacheEntry
|
|
25
|
+
# @size = source index size
|
|
26
|
+
# @source_index = LibGems::SourceIndex
|
|
27
|
+
# ...
|
|
28
|
+
# }
|
|
29
|
+
|
|
30
|
+
class LibGems::SourceInfoCache
|
|
31
|
+
|
|
32
|
+
include LibGems::UserInteraction
|
|
33
|
+
|
|
34
|
+
##
|
|
35
|
+
# The singleton LibGems::SourceInfoCache. If +all+ is true, a full refresh will
|
|
36
|
+
# be performed if the singleton instance is being initialized.
|
|
37
|
+
|
|
38
|
+
def self.cache(all = false)
|
|
39
|
+
return @cache if @cache
|
|
40
|
+
@cache = new
|
|
41
|
+
@cache.refresh all if LibGems.configuration.update_sources
|
|
42
|
+
@cache
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.cache_data
|
|
46
|
+
cache.cache_data
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
##
|
|
50
|
+
# The name of the system cache file.
|
|
51
|
+
|
|
52
|
+
def self.latest_system_cache_file
|
|
53
|
+
File.join File.dirname(system_cache_file),
|
|
54
|
+
"latest_#{File.basename system_cache_file}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# The name of the latest user cache file.
|
|
59
|
+
|
|
60
|
+
def self.latest_user_cache_file
|
|
61
|
+
File.join File.dirname(user_cache_file),
|
|
62
|
+
"latest_#{File.basename user_cache_file}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
##
|
|
66
|
+
# Reset all singletons, discarding any changes.
|
|
67
|
+
|
|
68
|
+
def self.reset
|
|
69
|
+
@cache = nil
|
|
70
|
+
@system_cache_file = nil
|
|
71
|
+
@user_cache_file = nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
##
|
|
75
|
+
# Search all source indexes. See LibGems::SourceInfoCache#search.
|
|
76
|
+
|
|
77
|
+
def self.search(*args)
|
|
78
|
+
cache.search(*args)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
# Search all source indexes returning the source_uri. See
|
|
83
|
+
# LibGems::SourceInfoCache#search_with_source.
|
|
84
|
+
|
|
85
|
+
def self.search_with_source(*args)
|
|
86
|
+
cache.search_with_source(*args)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
##
|
|
90
|
+
# The name of the system cache file. (class method)
|
|
91
|
+
|
|
92
|
+
def self.system_cache_file
|
|
93
|
+
@system_cache_file ||= LibGems.default_system_source_cache_dir
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
##
|
|
97
|
+
# The name of the user cache file.
|
|
98
|
+
|
|
99
|
+
def self.user_cache_file
|
|
100
|
+
@user_cache_file ||=
|
|
101
|
+
ENV['LIBGEMSCACHE'] || ENV['GEMCACHE'] || LibGems.default_user_source_cache_dir
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def initialize # :nodoc:
|
|
105
|
+
@cache_data = nil
|
|
106
|
+
@cache_file = nil
|
|
107
|
+
@dirty = false
|
|
108
|
+
@only_latest = true
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
##
|
|
112
|
+
# The most recent cache data.
|
|
113
|
+
|
|
114
|
+
def cache_data
|
|
115
|
+
return @cache_data if @cache_data
|
|
116
|
+
cache_file # HACK writable check
|
|
117
|
+
|
|
118
|
+
@only_latest = true
|
|
119
|
+
|
|
120
|
+
@cache_data = read_cache_data latest_cache_file
|
|
121
|
+
|
|
122
|
+
@cache_data
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
##
|
|
126
|
+
# The name of the cache file.
|
|
127
|
+
|
|
128
|
+
def cache_file
|
|
129
|
+
return @cache_file if @cache_file
|
|
130
|
+
@cache_file = (try_file(system_cache_file) or
|
|
131
|
+
try_file(user_cache_file) or
|
|
132
|
+
raise "unable to locate a writable cache file")
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
##
|
|
136
|
+
# Write the cache to a local file (if it is dirty).
|
|
137
|
+
|
|
138
|
+
def flush
|
|
139
|
+
write_cache if @dirty
|
|
140
|
+
@dirty = false
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def latest_cache_data
|
|
144
|
+
latest_cache_data = {}
|
|
145
|
+
|
|
146
|
+
cache_data.each do |repo, sice|
|
|
147
|
+
latest = sice.source_index.latest_specs
|
|
148
|
+
|
|
149
|
+
new_si = LibGems::SourceIndex.new
|
|
150
|
+
new_si.add_specs(*latest)
|
|
151
|
+
|
|
152
|
+
latest_sice = LibGems::SourceInfoCacheEntry.new new_si, sice.size
|
|
153
|
+
latest_cache_data[repo] = latest_sice
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
latest_cache_data
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# The name of the latest cache file.
|
|
161
|
+
|
|
162
|
+
def latest_cache_file
|
|
163
|
+
File.join File.dirname(cache_file), "latest_#{File.basename cache_file}"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
##
|
|
167
|
+
# The name of the latest system cache file.
|
|
168
|
+
|
|
169
|
+
def latest_system_cache_file
|
|
170
|
+
self.class.latest_system_cache_file
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
##
|
|
174
|
+
# The name of the latest user cache file.
|
|
175
|
+
|
|
176
|
+
def latest_user_cache_file
|
|
177
|
+
self.class.latest_user_cache_file
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
##
|
|
181
|
+
# Merges the complete cache file into this LibGems::SourceInfoCache.
|
|
182
|
+
|
|
183
|
+
def read_all_cache_data
|
|
184
|
+
if @only_latest then
|
|
185
|
+
@only_latest = false
|
|
186
|
+
all_data = read_cache_data cache_file
|
|
187
|
+
|
|
188
|
+
cache_data.update all_data do |source_uri, latest_sice, all_sice|
|
|
189
|
+
all_sice.source_index.gems.update latest_sice.source_index.gems
|
|
190
|
+
|
|
191
|
+
LibGems::SourceInfoCacheEntry.new all_sice.source_index, latest_sice.size
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
begin
|
|
195
|
+
refresh true
|
|
196
|
+
rescue LibGems::RemoteFetcher::FetchError
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
##
|
|
202
|
+
# Reads cached data from +file+.
|
|
203
|
+
|
|
204
|
+
def read_cache_data(file)
|
|
205
|
+
# Marshal loads 30-40% faster from a String, and 2MB on 20061116 is small
|
|
206
|
+
data = open file, 'rb' do |fp| fp.read end
|
|
207
|
+
cache_data = Marshal.load data
|
|
208
|
+
|
|
209
|
+
cache_data.each do |url, sice|
|
|
210
|
+
next unless sice.is_a?(Hash)
|
|
211
|
+
update
|
|
212
|
+
|
|
213
|
+
cache = sice['cache']
|
|
214
|
+
size = sice['size']
|
|
215
|
+
|
|
216
|
+
if cache.is_a?(LibGems::SourceIndex) and size.is_a?(Numeric) then
|
|
217
|
+
new_sice = LibGems::SourceInfoCacheEntry.new cache, size
|
|
218
|
+
cache_data[url] = new_sice
|
|
219
|
+
else # irreperable, force refetch.
|
|
220
|
+
reset_cache_for url, cache_data
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
cache_data
|
|
225
|
+
rescue Errno::ENOENT
|
|
226
|
+
{}
|
|
227
|
+
rescue => e
|
|
228
|
+
if LibGems.configuration.really_verbose then
|
|
229
|
+
say "Exception during cache_data handling: #{e.class} - #{e}"
|
|
230
|
+
say "Cache file was: #{file}"
|
|
231
|
+
say "\t#{e.backtrace.join "\n\t"}"
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
{}
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
##
|
|
238
|
+
# Refreshes each source in the cache from its repository. If +all+ is
|
|
239
|
+
# false, only latest gems are updated.
|
|
240
|
+
|
|
241
|
+
def refresh(all)
|
|
242
|
+
LibGems.sources.each do |source_uri|
|
|
243
|
+
cache_entry = cache_data[source_uri]
|
|
244
|
+
if cache_entry.nil? then
|
|
245
|
+
cache_entry = LibGems::SourceInfoCacheEntry.new nil, 0
|
|
246
|
+
cache_data[source_uri] = cache_entry
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
update if cache_entry.refresh source_uri, all
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
flush
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def reset_cache_for(url, cache_data)
|
|
256
|
+
say "Reseting cache for #{url}" if LibGems.configuration.really_verbose
|
|
257
|
+
|
|
258
|
+
sice = LibGems::SourceInfoCacheEntry.new LibGems::SourceIndex.new, 0
|
|
259
|
+
sice.refresh url, false # HACK may be unnecessary, see ::cache and #refresh
|
|
260
|
+
|
|
261
|
+
cache_data[url] = sice
|
|
262
|
+
cache_data
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def reset_cache_data
|
|
266
|
+
@cache_data = nil
|
|
267
|
+
@only_latest = true
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
##
|
|
271
|
+
# Force cache file to be reset, useful for integration testing of rubygems
|
|
272
|
+
|
|
273
|
+
def reset_cache_file
|
|
274
|
+
@cache_file = nil
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
##
|
|
278
|
+
# Searches all source indexes. See LibGems::SourceIndex#search for details on
|
|
279
|
+
# +pattern+ and +platform_only+. If +all+ is set to true, the full index
|
|
280
|
+
# will be loaded before searching.
|
|
281
|
+
|
|
282
|
+
def search(pattern, platform_only = false, all = false)
|
|
283
|
+
read_all_cache_data if all
|
|
284
|
+
|
|
285
|
+
cache_data.map do |source_uri, sic_entry|
|
|
286
|
+
next unless LibGems.sources.include? source_uri
|
|
287
|
+
# TODO - Remove this gunk after 2008/11
|
|
288
|
+
unless pattern.kind_of? LibGems::Dependency then
|
|
289
|
+
pattern = LibGems::Dependency.new pattern, LibGems::Requirement.default
|
|
290
|
+
end
|
|
291
|
+
sic_entry.source_index.search pattern, platform_only
|
|
292
|
+
end.flatten.compact
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
##
|
|
296
|
+
# Searches all source indexes for +pattern+. If +only_platform+ is true,
|
|
297
|
+
# only gems matching LibGems.platforms will be selected. Returns an Array of
|
|
298
|
+
# pairs containing the LibGems::Specification found and the source_uri it was
|
|
299
|
+
# found at.
|
|
300
|
+
|
|
301
|
+
def search_with_source(pattern, only_platform = false, all = false)
|
|
302
|
+
read_all_cache_data if all
|
|
303
|
+
|
|
304
|
+
results = []
|
|
305
|
+
|
|
306
|
+
cache_data.map do |source_uri, sic_entry|
|
|
307
|
+
next unless LibGems.sources.include? source_uri
|
|
308
|
+
|
|
309
|
+
# TODO - Remove this gunk after 2008/11
|
|
310
|
+
unless pattern.kind_of?(LibGems::Dependency)
|
|
311
|
+
pattern = LibGems::Dependency.new(pattern, LibGems::Requirement.default)
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
sic_entry.source_index.search(pattern, only_platform).each do |spec|
|
|
315
|
+
results << [spec, source_uri]
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
results
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
##
|
|
323
|
+
# Set the source info cache data directly. This is mainly used for unit
|
|
324
|
+
# testing when we don't want to read a file system to grab the cached source
|
|
325
|
+
# index information. The +hash+ should map a source URL into a
|
|
326
|
+
# SourceInfoCacheEntry.
|
|
327
|
+
|
|
328
|
+
def set_cache_data(hash)
|
|
329
|
+
@cache_data = hash
|
|
330
|
+
update
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
##
|
|
334
|
+
# The name of the system cache file.
|
|
335
|
+
|
|
336
|
+
def system_cache_file
|
|
337
|
+
self.class.system_cache_file
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
##
|
|
341
|
+
# Determine if +path+ is a candidate for a cache file. Returns +path+ if
|
|
342
|
+
# it is, nil if not.
|
|
343
|
+
|
|
344
|
+
def try_file(path)
|
|
345
|
+
return path if File.writable? path
|
|
346
|
+
return nil if File.exist? path
|
|
347
|
+
|
|
348
|
+
dir = File.dirname path
|
|
349
|
+
|
|
350
|
+
unless File.exist? dir then
|
|
351
|
+
begin
|
|
352
|
+
FileUtils.mkdir_p dir
|
|
353
|
+
rescue RuntimeError, SystemCallError
|
|
354
|
+
return nil
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
return path if File.writable? dir
|
|
359
|
+
|
|
360
|
+
nil
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
##
|
|
364
|
+
# Mark the cache as updated (i.e. dirty).
|
|
365
|
+
|
|
366
|
+
def update
|
|
367
|
+
@dirty = true
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
##
|
|
371
|
+
# The name of the user cache file.
|
|
372
|
+
|
|
373
|
+
def user_cache_file
|
|
374
|
+
self.class.user_cache_file
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
##
|
|
378
|
+
# Write data to the proper cache files.
|
|
379
|
+
|
|
380
|
+
def write_cache
|
|
381
|
+
if not File.exist?(cache_file) or not @only_latest then
|
|
382
|
+
open cache_file, 'wb' do |io|
|
|
383
|
+
io.write Marshal.dump(cache_data)
|
|
384
|
+
end
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
open latest_cache_file, 'wb' do |io|
|
|
388
|
+
io.write Marshal.dump(latest_cache_data)
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
reset
|
|
393
|
+
|
|
394
|
+
end
|
|
395
|
+
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'libgems'
|
|
2
|
+
require 'libgems/source_index'
|
|
3
|
+
require 'libgems/remote_fetcher'
|
|
4
|
+
|
|
5
|
+
##
|
|
6
|
+
# Entries held by a SourceInfoCache.
|
|
7
|
+
|
|
8
|
+
class LibGems::SourceInfoCacheEntry
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
# The source index for this cache entry.
|
|
12
|
+
|
|
13
|
+
attr_reader :source_index
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# The size of the source entry. Used to determine if the source index has
|
|
17
|
+
# changed.
|
|
18
|
+
|
|
19
|
+
attr_reader :size
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
# Create a cache entry.
|
|
23
|
+
|
|
24
|
+
def initialize(si, size)
|
|
25
|
+
@source_index = si || LibGems::SourceIndex.new({})
|
|
26
|
+
@size = size
|
|
27
|
+
@all = false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def refresh(source_uri, all)
|
|
31
|
+
begin
|
|
32
|
+
marshal_uri = URI.join source_uri.to_s, "Marshal.#{LibGems.marshal_version}"
|
|
33
|
+
remote_size = LibGems::RemoteFetcher.fetcher.fetch_size marshal_uri
|
|
34
|
+
rescue LibGems::RemoteSourceException
|
|
35
|
+
yaml_uri = URI.join source_uri.to_s, 'yaml'
|
|
36
|
+
remote_size = LibGems::RemoteFetcher.fetcher.fetch_size yaml_uri
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# TODO Use index_signature instead of size?
|
|
40
|
+
return false if @size == remote_size and @all
|
|
41
|
+
|
|
42
|
+
updated = @source_index.update source_uri, all
|
|
43
|
+
@size = remote_size
|
|
44
|
+
@all = all
|
|
45
|
+
|
|
46
|
+
updated
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def ==(other) # :nodoc:
|
|
50
|
+
self.class === other and
|
|
51
|
+
@size == other.size and
|
|
52
|
+
@source_index == other.source_index
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|