slimgems 1.3.8
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 +120 -0
- data/bin/gem +25 -0
- data/bin/update_slimgems +35 -0
- data/bootstrap/Rakefile +4 -0
- data/hide_lib_for_update/note.txt +5 -0
- data/lib/gauntlet_rubygems.rb +50 -0
- data/lib/rbconfig/datadir.rb +20 -0
- data/lib/rubygems.rb +1220 -0
- data/lib/rubygems/builder.rb +102 -0
- data/lib/rubygems/command.rb +534 -0
- data/lib/rubygems/command_manager.rb +182 -0
- data/lib/rubygems/commands/build_command.rb +53 -0
- data/lib/rubygems/commands/cert_command.rb +86 -0
- data/lib/rubygems/commands/check_command.rb +80 -0
- data/lib/rubygems/commands/cleanup_command.rb +106 -0
- data/lib/rubygems/commands/contents_command.rb +98 -0
- data/lib/rubygems/commands/dependency_command.rb +195 -0
- data/lib/rubygems/commands/environment_command.rb +132 -0
- data/lib/rubygems/commands/fetch_command.rb +67 -0
- data/lib/rubygems/commands/generate_index_command.rb +133 -0
- data/lib/rubygems/commands/help_command.rb +172 -0
- data/lib/rubygems/commands/install_command.rb +178 -0
- data/lib/rubygems/commands/list_command.rb +35 -0
- data/lib/rubygems/commands/lock_command.rb +110 -0
- data/lib/rubygems/commands/mirror_command.rb +111 -0
- data/lib/rubygems/commands/outdated_command.rb +33 -0
- data/lib/rubygems/commands/owner_command.rb +75 -0
- data/lib/rubygems/commands/pristine_command.rb +93 -0
- data/lib/rubygems/commands/push_command.rb +56 -0
- data/lib/rubygems/commands/query_command.rb +280 -0
- data/lib/rubygems/commands/rdoc_command.rb +91 -0
- data/lib/rubygems/commands/search_command.rb +31 -0
- data/lib/rubygems/commands/server_command.rb +86 -0
- data/lib/rubygems/commands/setup_command.rb +387 -0
- data/lib/rubygems/commands/sources_command.rb +157 -0
- data/lib/rubygems/commands/specification_command.rb +125 -0
- data/lib/rubygems/commands/stale_command.rb +27 -0
- data/lib/rubygems/commands/uninstall_command.rb +83 -0
- data/lib/rubygems/commands/unpack_command.rb +121 -0
- data/lib/rubygems/commands/update_command.rb +212 -0
- data/lib/rubygems/commands/which_command.rb +86 -0
- data/lib/rubygems/config_file.rb +345 -0
- data/lib/rubygems/custom_require.rb +44 -0
- data/lib/rubygems/defaults.rb +101 -0
- data/lib/rubygems/dependency.rb +227 -0
- data/lib/rubygems/dependency_installer.rb +286 -0
- data/lib/rubygems/dependency_list.rb +208 -0
- data/lib/rubygems/doc_manager.rb +242 -0
- data/lib/rubygems/errors.rb +35 -0
- data/lib/rubygems/exceptions.rb +91 -0
- data/lib/rubygems/ext.rb +18 -0
- data/lib/rubygems/ext/builder.rb +56 -0
- data/lib/rubygems/ext/configure_builder.rb +25 -0
- data/lib/rubygems/ext/ext_conf_builder.rb +24 -0
- data/lib/rubygems/ext/rake_builder.rb +39 -0
- data/lib/rubygems/format.rb +81 -0
- data/lib/rubygems/gem_openssl.rb +92 -0
- data/lib/rubygems/gem_path_searcher.rb +100 -0
- data/lib/rubygems/gem_runner.rb +79 -0
- data/lib/rubygems/gemcutter_utilities.rb +49 -0
- data/lib/rubygems/indexer.rb +720 -0
- data/lib/rubygems/install_update_options.rb +125 -0
- data/lib/rubygems/installer.rb +604 -0
- data/lib/rubygems/local_remote_options.rb +135 -0
- data/lib/rubygems/old_format.rb +153 -0
- data/lib/rubygems/package.rb +97 -0
- data/lib/rubygems/package/f_sync_dir.rb +23 -0
- data/lib/rubygems/package/tar_header.rb +266 -0
- data/lib/rubygems/package/tar_input.rb +222 -0
- data/lib/rubygems/package/tar_output.rb +144 -0
- data/lib/rubygems/package/tar_reader.rb +106 -0
- data/lib/rubygems/package/tar_reader/entry.rb +141 -0
- data/lib/rubygems/package/tar_writer.rb +241 -0
- data/lib/rubygems/package_task.rb +126 -0
- data/lib/rubygems/platform.rb +183 -0
- data/lib/rubygems/remote_fetcher.rb +414 -0
- data/lib/rubygems/require_paths_builder.rb +18 -0
- data/lib/rubygems/requirement.rb +153 -0
- data/lib/rubygems/security.rb +814 -0
- data/lib/rubygems/server.rb +872 -0
- data/lib/rubygems/source_index.rb +597 -0
- data/lib/rubygems/source_info_cache.rb +395 -0
- data/lib/rubygems/source_info_cache_entry.rb +56 -0
- data/lib/rubygems/spec_fetcher.rb +337 -0
- data/lib/rubygems/specification.rb +1486 -0
- data/lib/rubygems/test_utilities.rb +147 -0
- data/lib/rubygems/text.rb +65 -0
- data/lib/rubygems/uninstaller.rb +278 -0
- data/lib/rubygems/user_interaction.rb +527 -0
- data/lib/rubygems/validator.rb +240 -0
- data/lib/rubygems/version.rb +316 -0
- data/lib/rubygems/version_option.rb +65 -0
- data/lib/ubygems.rb +10 -0
- data/setup.rb +42 -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/functional.rb +92 -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/rubygems_plugin.rb +2 -0
- data/test/plugin/load/rubygems_plugin.rb +1 -0
- data/test/plugin/standarderror/rubygems_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 +766 -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 +353 -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 +1291 -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 +413 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
require 'rubygems/command'
|
|
2
|
+
require 'rubygems/command_manager'
|
|
3
|
+
require 'rubygems/install_update_options'
|
|
4
|
+
require 'rubygems/local_remote_options'
|
|
5
|
+
require 'rubygems/spec_fetcher'
|
|
6
|
+
require 'rubygems/version_option'
|
|
7
|
+
require 'rubygems/commands/install_command'
|
|
8
|
+
|
|
9
|
+
class Gem::Commands::UpdateCommand < Gem::Command
|
|
10
|
+
|
|
11
|
+
include Gem::InstallUpdateOptions
|
|
12
|
+
include Gem::LocalRemoteOptions
|
|
13
|
+
include Gem::VersionOption
|
|
14
|
+
|
|
15
|
+
def initialize
|
|
16
|
+
super 'update',
|
|
17
|
+
'Update the named gems (or all installed gems) in the local repository',
|
|
18
|
+
:generate_rdoc => true,
|
|
19
|
+
:generate_ri => true,
|
|
20
|
+
:force => false,
|
|
21
|
+
:test => false
|
|
22
|
+
|
|
23
|
+
add_install_update_options
|
|
24
|
+
|
|
25
|
+
OptionParser.accept Gem::Version do |value|
|
|
26
|
+
Gem::Version.new value
|
|
27
|
+
|
|
28
|
+
value
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
add_option('--system [VERSION]', Gem::Version,
|
|
32
|
+
"Update the #{Gem::NAME} system software") do |value, options|
|
|
33
|
+
value = true unless value
|
|
34
|
+
|
|
35
|
+
options[:system] = value
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
add_local_remote_options
|
|
39
|
+
add_platform_option
|
|
40
|
+
add_prerelease_option "as update targets"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def arguments # :nodoc:
|
|
44
|
+
"GEMNAME name of gem to update"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def defaults_str # :nodoc:
|
|
48
|
+
"--rdoc --ri --no-force --no-test --install-dir #{Gem.dir}"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def usage # :nodoc:
|
|
52
|
+
"#{program_name} GEMNAME [GEMNAME ...]"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def execute
|
|
56
|
+
@installer = Gem::DependencyInstaller.new options
|
|
57
|
+
@updated = []
|
|
58
|
+
|
|
59
|
+
hig = {}
|
|
60
|
+
|
|
61
|
+
if options[:system] then
|
|
62
|
+
update_rubygems
|
|
63
|
+
return
|
|
64
|
+
else
|
|
65
|
+
say "Updating installed gems"
|
|
66
|
+
|
|
67
|
+
hig = {} # highest installed gems
|
|
68
|
+
|
|
69
|
+
Gem.source_index.each do |name, spec|
|
|
70
|
+
if hig[spec.name].nil? or hig[spec.name].version < spec.version then
|
|
71
|
+
hig[spec.name] = spec
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
gems_to_update = which_to_update hig, options[:args]
|
|
77
|
+
|
|
78
|
+
updated = update_gems gems_to_update
|
|
79
|
+
|
|
80
|
+
if updated.empty? then
|
|
81
|
+
say "Nothing to update"
|
|
82
|
+
else
|
|
83
|
+
say "Gems updated: #{updated.map { |spec| spec.name }.join ', '}"
|
|
84
|
+
|
|
85
|
+
if options[:generate_ri] then
|
|
86
|
+
updated.each do |gem|
|
|
87
|
+
Gem::DocManager.new(gem, options[:rdoc_args]).generate_ri
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
Gem::DocManager.update_ri_cache
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
if options[:generate_rdoc] then
|
|
94
|
+
updated.each do |gem|
|
|
95
|
+
Gem::DocManager.new(gem, options[:rdoc_args]).generate_rdoc
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def update_gem name, version = Gem::Requirement.default
|
|
102
|
+
return if @updated.any? { |spec| spec.name == name }
|
|
103
|
+
success = false
|
|
104
|
+
|
|
105
|
+
say "Updating #{name}"
|
|
106
|
+
begin
|
|
107
|
+
@installer.install name, version
|
|
108
|
+
success = true
|
|
109
|
+
rescue Gem::InstallError => e
|
|
110
|
+
alert_error "Error installing #{name}:\n\t#{e.message}"
|
|
111
|
+
success = false
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
@installer.installed_gems.each do |spec|
|
|
115
|
+
@updated << spec
|
|
116
|
+
say "Successfully installed #{spec.full_name}" if success
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def update_gems gems_to_update
|
|
121
|
+
gems_to_update.uniq.sort.each do |name|
|
|
122
|
+
update_gem name
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
@updated
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
# Update SlimGems software to the latest version.
|
|
130
|
+
|
|
131
|
+
def update_rubygems
|
|
132
|
+
unless options[:args].empty? then
|
|
133
|
+
alert_error "Gem names are not allowed with the --system option"
|
|
134
|
+
terminate_interaction 1
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
options[:user_install] = false
|
|
138
|
+
|
|
139
|
+
version = options[:system]
|
|
140
|
+
if version == true then
|
|
141
|
+
version = Gem::Version.new Gem::VERSION
|
|
142
|
+
requirement = Gem::Requirement.new ">= #{Gem::VERSION}"
|
|
143
|
+
else
|
|
144
|
+
version = Gem::Version.new version
|
|
145
|
+
requirement = Gem::Requirement.new version
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
rubygems_update = Gem::Specification.new
|
|
149
|
+
rubygems_update.name = Gem::GEM_NAME
|
|
150
|
+
rubygems_update.version = version
|
|
151
|
+
|
|
152
|
+
hig = {
|
|
153
|
+
Gem::GEM_NAME => rubygems_update
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
gems_to_update = which_to_update hig, options[:args]
|
|
157
|
+
|
|
158
|
+
if gems_to_update.empty? then
|
|
159
|
+
say "#{Gem::NAME} is already up-to-date (#{Gem::VERSION})"
|
|
160
|
+
terminate_interaction
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
update_gem(gems_to_update.first, requirement)
|
|
164
|
+
spec = @updated.last
|
|
165
|
+
say "#{Gem::NAME} system software updated (#{spec.version})" if spec
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def which_to_update(highest_installed_gems, gem_names)
|
|
169
|
+
result = []
|
|
170
|
+
|
|
171
|
+
highest_installed_gems.each do |l_name, l_spec|
|
|
172
|
+
next if not gem_names.empty? and
|
|
173
|
+
gem_names.all? { |name| /#{name}/ !~ l_spec.name }
|
|
174
|
+
|
|
175
|
+
dependency = Gem::Dependency.new l_spec.name, "> #{l_spec.version}"
|
|
176
|
+
|
|
177
|
+
begin
|
|
178
|
+
fetcher = Gem::SpecFetcher.fetcher
|
|
179
|
+
spec_tuples = fetcher.find_matching dependency
|
|
180
|
+
rescue Gem::RemoteFetcher::FetchError => e
|
|
181
|
+
raise unless fetcher.warn_legacy e do
|
|
182
|
+
require 'rubygems/source_info_cache'
|
|
183
|
+
|
|
184
|
+
dependency.name = '' if dependency.name == //
|
|
185
|
+
|
|
186
|
+
specs = Gem::SourceInfoCache.search_with_source dependency
|
|
187
|
+
|
|
188
|
+
spec_tuples = specs.map do |spec, source_uri|
|
|
189
|
+
[[spec.name, spec.version, spec.original_platform], source_uri]
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
matching_gems = spec_tuples.select do |(name, _, platform),|
|
|
195
|
+
name == l_name and Gem::Platform.match platform
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
highest_remote_gem = matching_gems.sort_by do |(_, version),|
|
|
199
|
+
version
|
|
200
|
+
end.last
|
|
201
|
+
|
|
202
|
+
if highest_remote_gem and
|
|
203
|
+
l_spec.version < highest_remote_gem.first[1] then
|
|
204
|
+
result << l_name
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
result
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
end
|
|
212
|
+
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'rubygems/command'
|
|
2
|
+
require 'rubygems/gem_path_searcher'
|
|
3
|
+
|
|
4
|
+
class Gem::Commands::WhichCommand < Gem::Command
|
|
5
|
+
|
|
6
|
+
EXT = %w[.rb .rbw .so .dll .bundle] # HACK
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
super 'which', 'Find the location of a library file you can require',
|
|
10
|
+
:search_gems_first => false, :show_all => false
|
|
11
|
+
|
|
12
|
+
add_option '-a', '--[no-]all', 'show all matching files' do |show_all, options|
|
|
13
|
+
options[:show_all] = show_all
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
add_option '-g', '--[no-]gems-first',
|
|
17
|
+
'search gems before non-gems' do |gems_first, options|
|
|
18
|
+
options[:search_gems_first] = gems_first
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def arguments # :nodoc:
|
|
23
|
+
"FILE name of file to find"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def defaults_str # :nodoc:
|
|
27
|
+
"--no-gems-first --no-all"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def execute
|
|
31
|
+
searcher = Gem::GemPathSearcher.new
|
|
32
|
+
|
|
33
|
+
found = false
|
|
34
|
+
|
|
35
|
+
options[:args].each do |arg|
|
|
36
|
+
arg = arg.sub(/#{Regexp.union(*EXT)}$/, '')
|
|
37
|
+
dirs = $LOAD_PATH
|
|
38
|
+
spec = searcher.find arg
|
|
39
|
+
|
|
40
|
+
if spec then
|
|
41
|
+
if options[:search_gems_first] then
|
|
42
|
+
dirs = gem_paths(spec) + $LOAD_PATH
|
|
43
|
+
else
|
|
44
|
+
dirs = $LOAD_PATH + gem_paths(spec)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
paths = find_paths arg, dirs
|
|
49
|
+
|
|
50
|
+
if paths.empty? then
|
|
51
|
+
alert_error "Can't find ruby library file or shared library #{arg}"
|
|
52
|
+
else
|
|
53
|
+
say paths
|
|
54
|
+
found = true
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
terminate_interaction 1 unless found
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def find_paths(package_name, dirs)
|
|
62
|
+
result = []
|
|
63
|
+
|
|
64
|
+
dirs.each do |dir|
|
|
65
|
+
EXT.each do |ext|
|
|
66
|
+
full_path = File.join dir, "#{package_name}#{ext}"
|
|
67
|
+
if File.exist? full_path then
|
|
68
|
+
result << full_path
|
|
69
|
+
return result unless options[:show_all]
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
result
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def gem_paths(spec)
|
|
78
|
+
spec.require_paths.collect { |d| File.join spec.full_gem_path, d }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def usage # :nodoc:
|
|
82
|
+
"#{program_name} FILE [FILE ...]"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
|
|
@@ -0,0 +1,345 @@
|
|
|
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
|
+
# Gem::ConfigFile SlimGems options and gem command options from ~/.gemrc.
|
|
9
|
+
#
|
|
10
|
+
# ~/.gemrc is a YAML file that uses strings to match gem command arguments and
|
|
11
|
+
# symbols to match SlimGems options.
|
|
12
|
+
#
|
|
13
|
+
# Gem command arguments use a String key that matches the command name and
|
|
14
|
+
# allow you to specify default arguments:
|
|
15
|
+
#
|
|
16
|
+
# install: --no-rdoc --no-ri
|
|
17
|
+
# update: --no-rdoc --no-ri
|
|
18
|
+
#
|
|
19
|
+
# You can use <tt>gem:</tt> to set default arguments for all commands.
|
|
20
|
+
#
|
|
21
|
+
# SlimGems options use symbol keys. Valid options are:
|
|
22
|
+
#
|
|
23
|
+
# +:backtrace+:: See #backtrace
|
|
24
|
+
# +:benchmark+:: See #benchmark
|
|
25
|
+
# +:sources+:: Sets Gem::sources
|
|
26
|
+
# +:verbose+:: See #verbose
|
|
27
|
+
|
|
28
|
+
class Gem::ConfigFile
|
|
29
|
+
|
|
30
|
+
DEFAULT_BACKTRACE = false
|
|
31
|
+
DEFAULT_BENCHMARK = false
|
|
32
|
+
DEFAULT_BULK_THRESHOLD = 1000
|
|
33
|
+
DEFAULT_VERBOSITY = true
|
|
34
|
+
DEFAULT_UPDATE_SOURCES = true
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# For Ruby packagers to set configuration defaults. Set in
|
|
38
|
+
# rubygems/defaults/operating_system.rb
|
|
39
|
+
|
|
40
|
+
OPERATING_SYSTEM_DEFAULTS = {}
|
|
41
|
+
|
|
42
|
+
##
|
|
43
|
+
# For Ruby implementers to set configuration defaults. Set in
|
|
44
|
+
# rubygems/defaults/#{RUBY_ENGINE}.rb
|
|
45
|
+
|
|
46
|
+
PLATFORM_DEFAULTS = {}
|
|
47
|
+
|
|
48
|
+
system_config_path =
|
|
49
|
+
begin
|
|
50
|
+
require 'Win32API'
|
|
51
|
+
|
|
52
|
+
CSIDL_COMMON_APPDATA = 0x0023
|
|
53
|
+
path = 0.chr * 260
|
|
54
|
+
if RUBY_VERSION > '1.9' then
|
|
55
|
+
SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'PLPLP',
|
|
56
|
+
'L', :stdcall
|
|
57
|
+
SHGetFolderPath.call nil, CSIDL_COMMON_APPDATA, nil, 1, path
|
|
58
|
+
else
|
|
59
|
+
SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'LLLLP',
|
|
60
|
+
'L'
|
|
61
|
+
SHGetFolderPath.call 0, CSIDL_COMMON_APPDATA, 0, 1, path
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
path.strip
|
|
65
|
+
rescue LoadError
|
|
66
|
+
'/etc'
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc'
|
|
70
|
+
|
|
71
|
+
##
|
|
72
|
+
# List of arguments supplied to the config file object.
|
|
73
|
+
|
|
74
|
+
attr_reader :args
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# Where to look for gems (deprecated)
|
|
78
|
+
|
|
79
|
+
attr_accessor :path
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
# Where to install gems (deprecated)
|
|
83
|
+
|
|
84
|
+
attr_accessor :home
|
|
85
|
+
|
|
86
|
+
##
|
|
87
|
+
# True if we print backtraces on errors.
|
|
88
|
+
|
|
89
|
+
attr_writer :backtrace
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
# True if we are benchmarking this run.
|
|
93
|
+
|
|
94
|
+
attr_accessor :benchmark
|
|
95
|
+
|
|
96
|
+
##
|
|
97
|
+
# Bulk threshold value. If the number of missing gems are above this
|
|
98
|
+
# threshold value, then a bulk download technique is used. (deprecated)
|
|
99
|
+
|
|
100
|
+
attr_accessor :bulk_threshold
|
|
101
|
+
|
|
102
|
+
##
|
|
103
|
+
# Verbose level of output:
|
|
104
|
+
# * false -- No output
|
|
105
|
+
# * true -- Normal output
|
|
106
|
+
# * :loud -- Extra output
|
|
107
|
+
|
|
108
|
+
attr_accessor :verbose
|
|
109
|
+
|
|
110
|
+
##
|
|
111
|
+
# True if we want to update the SourceInfoCache every time, false otherwise
|
|
112
|
+
|
|
113
|
+
attr_accessor :update_sources
|
|
114
|
+
|
|
115
|
+
##
|
|
116
|
+
# API key for SlimGems.org
|
|
117
|
+
|
|
118
|
+
attr_reader :rubygems_api_key
|
|
119
|
+
|
|
120
|
+
##
|
|
121
|
+
# Create the config file object. +args+ is the list of arguments
|
|
122
|
+
# from the command line.
|
|
123
|
+
#
|
|
124
|
+
# The following command line options are handled early here rather
|
|
125
|
+
# than later at the time most command options are processed.
|
|
126
|
+
#
|
|
127
|
+
# <tt>--config-file</tt>, <tt>--config-file==NAME</tt>::
|
|
128
|
+
# Obviously these need to be handled by the ConfigFile object to ensure we
|
|
129
|
+
# get the right config file.
|
|
130
|
+
#
|
|
131
|
+
# <tt>--backtrace</tt>::
|
|
132
|
+
# Backtrace needs to be turned on early so that errors before normal
|
|
133
|
+
# option parsing can be properly handled.
|
|
134
|
+
#
|
|
135
|
+
# <tt>--debug</tt>::
|
|
136
|
+
# Enable Ruby level debug messages. Handled early for the same reason as
|
|
137
|
+
# --backtrace.
|
|
138
|
+
|
|
139
|
+
def initialize(arg_list)
|
|
140
|
+
@config_file_name = nil
|
|
141
|
+
need_config_file_name = false
|
|
142
|
+
|
|
143
|
+
arg_list = arg_list.map do |arg|
|
|
144
|
+
if need_config_file_name then
|
|
145
|
+
@config_file_name = arg
|
|
146
|
+
need_config_file_name = false
|
|
147
|
+
nil
|
|
148
|
+
elsif arg =~ /^--config-file=(.*)/ then
|
|
149
|
+
@config_file_name = $1
|
|
150
|
+
nil
|
|
151
|
+
elsif arg =~ /^--config-file$/ then
|
|
152
|
+
need_config_file_name = true
|
|
153
|
+
nil
|
|
154
|
+
else
|
|
155
|
+
arg
|
|
156
|
+
end
|
|
157
|
+
end.compact
|
|
158
|
+
|
|
159
|
+
@backtrace = DEFAULT_BACKTRACE
|
|
160
|
+
@benchmark = DEFAULT_BENCHMARK
|
|
161
|
+
@bulk_threshold = DEFAULT_BULK_THRESHOLD
|
|
162
|
+
@verbose = DEFAULT_VERBOSITY
|
|
163
|
+
@update_sources = DEFAULT_UPDATE_SOURCES
|
|
164
|
+
|
|
165
|
+
operating_system_config = Marshal.load Marshal.dump(OPERATING_SYSTEM_DEFAULTS)
|
|
166
|
+
platform_config = Marshal.load Marshal.dump(PLATFORM_DEFAULTS)
|
|
167
|
+
system_config = load_file SYSTEM_WIDE_CONFIG_FILE
|
|
168
|
+
user_config = load_file config_file_name.dup.untaint
|
|
169
|
+
|
|
170
|
+
@hash = operating_system_config.merge platform_config
|
|
171
|
+
@hash = @hash.merge system_config
|
|
172
|
+
@hash = @hash.merge user_config
|
|
173
|
+
|
|
174
|
+
# HACK these override command-line args, which is bad
|
|
175
|
+
@backtrace = @hash[:backtrace] if @hash.key? :backtrace
|
|
176
|
+
@benchmark = @hash[:benchmark] if @hash.key? :benchmark
|
|
177
|
+
@bulk_threshold = @hash[:bulk_threshold] if @hash.key? :bulk_threshold
|
|
178
|
+
@home = @hash[:gemhome] if @hash.key? :gemhome
|
|
179
|
+
@path = @hash[:gempath] if @hash.key? :gempath
|
|
180
|
+
@update_sources = @hash[:update_sources] if @hash.key? :update_sources
|
|
181
|
+
@verbose = @hash[:verbose] if @hash.key? :verbose
|
|
182
|
+
|
|
183
|
+
load_rubygems_api_key
|
|
184
|
+
|
|
185
|
+
Gem.sources = @hash[:sources] if @hash.key? :sources
|
|
186
|
+
handle_arguments arg_list
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
##
|
|
190
|
+
# Location of SlimGems.org credentials
|
|
191
|
+
|
|
192
|
+
def credentials_path
|
|
193
|
+
File.join(Gem.user_home, '.gem', 'credentials')
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def load_rubygems_api_key
|
|
197
|
+
api_key_hash = File.exists?(credentials_path) ? load_file(credentials_path) : @hash
|
|
198
|
+
|
|
199
|
+
@rubygems_api_key = api_key_hash[:rubygems_api_key] if api_key_hash.key? :rubygems_api_key
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def rubygems_api_key=(api_key)
|
|
203
|
+
config = load_file(credentials_path).merge(:rubygems_api_key => api_key)
|
|
204
|
+
|
|
205
|
+
dirname = File.dirname(credentials_path)
|
|
206
|
+
Dir.mkdir(dirname) unless File.exists?(dirname)
|
|
207
|
+
|
|
208
|
+
Gem.load_yaml
|
|
209
|
+
|
|
210
|
+
File.open(credentials_path, 'w') do |f|
|
|
211
|
+
f.write config.to_yaml
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
@rubygems_api_key = api_key
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def load_file(filename)
|
|
218
|
+
require "yaml"
|
|
219
|
+
return {} unless filename and File.exists?(filename)
|
|
220
|
+
begin
|
|
221
|
+
YAML.load(File.read(filename))
|
|
222
|
+
rescue ArgumentError
|
|
223
|
+
warn "Failed to load #{config_file_name}"
|
|
224
|
+
rescue Errno::EACCES
|
|
225
|
+
warn "Failed to load #{config_file_name} due to permissions problem."
|
|
226
|
+
end or {}
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# True if the backtrace option has been specified, or debug is on.
|
|
230
|
+
def backtrace
|
|
231
|
+
@backtrace or $DEBUG
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# The name of the configuration file.
|
|
235
|
+
def config_file_name
|
|
236
|
+
@config_file_name || Gem.config_file
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Delegates to @hash
|
|
240
|
+
def each(&block)
|
|
241
|
+
hash = @hash.dup
|
|
242
|
+
hash.delete :update_sources
|
|
243
|
+
hash.delete :verbose
|
|
244
|
+
hash.delete :benchmark
|
|
245
|
+
hash.delete :backtrace
|
|
246
|
+
hash.delete :bulk_threshold
|
|
247
|
+
|
|
248
|
+
yield :update_sources, @update_sources
|
|
249
|
+
yield :verbose, @verbose
|
|
250
|
+
yield :benchmark, @benchmark
|
|
251
|
+
yield :backtrace, @backtrace
|
|
252
|
+
yield :bulk_threshold, @bulk_threshold
|
|
253
|
+
|
|
254
|
+
yield 'config_file_name', @config_file_name if @config_file_name
|
|
255
|
+
|
|
256
|
+
hash.each(&block)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
# Handle the command arguments.
|
|
260
|
+
def handle_arguments(arg_list)
|
|
261
|
+
@args = []
|
|
262
|
+
|
|
263
|
+
arg_list.each do |arg|
|
|
264
|
+
case arg
|
|
265
|
+
when /^--(backtrace|traceback)$/ then
|
|
266
|
+
@backtrace = true
|
|
267
|
+
when /^--bench(mark)?$/ then
|
|
268
|
+
@benchmark = true
|
|
269
|
+
when /^--debug$/ then
|
|
270
|
+
$DEBUG = true
|
|
271
|
+
else
|
|
272
|
+
@args << arg
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# Really verbose mode gives you extra output.
|
|
278
|
+
def really_verbose
|
|
279
|
+
case verbose
|
|
280
|
+
when true, false, nil then false
|
|
281
|
+
else true
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
# to_yaml only overwrites things you can't override on the command line.
|
|
286
|
+
def to_yaml # :nodoc:
|
|
287
|
+
yaml_hash = {}
|
|
288
|
+
yaml_hash[:backtrace] = @hash.key?(:backtrace) ? @hash[:backtrace] :
|
|
289
|
+
DEFAULT_BACKTRACE
|
|
290
|
+
yaml_hash[:benchmark] = @hash.key?(:benchmark) ? @hash[:benchmark] :
|
|
291
|
+
DEFAULT_BENCHMARK
|
|
292
|
+
yaml_hash[:bulk_threshold] = @hash.key?(:bulk_threshold) ?
|
|
293
|
+
@hash[:bulk_threshold] : DEFAULT_BULK_THRESHOLD
|
|
294
|
+
yaml_hash[:sources] = Gem.sources
|
|
295
|
+
yaml_hash[:update_sources] = @hash.key?(:update_sources) ?
|
|
296
|
+
@hash[:update_sources] : DEFAULT_UPDATE_SOURCES
|
|
297
|
+
yaml_hash[:verbose] = @hash.key?(:verbose) ? @hash[:verbose] :
|
|
298
|
+
DEFAULT_VERBOSITY
|
|
299
|
+
|
|
300
|
+
keys = yaml_hash.keys.map { |key| key.to_s }
|
|
301
|
+
keys << 'debug'
|
|
302
|
+
re = Regexp.union(*keys)
|
|
303
|
+
|
|
304
|
+
@hash.each do |key, value|
|
|
305
|
+
key = key.to_s
|
|
306
|
+
next if key =~ re
|
|
307
|
+
yaml_hash[key.to_s] = value
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
yaml_hash.to_yaml
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
# Writes out this config file, replacing its source.
|
|
314
|
+
def write
|
|
315
|
+
open config_file_name, 'w' do |io|
|
|
316
|
+
io.write to_yaml
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# Return the configuration information for +key+.
|
|
321
|
+
def [](key)
|
|
322
|
+
@hash[key.to_s]
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
# Set configuration option +key+ to +value+.
|
|
326
|
+
def []=(key, value)
|
|
327
|
+
@hash[key.to_s] = value
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def ==(other) # :nodoc:
|
|
331
|
+
self.class === other and
|
|
332
|
+
@backtrace == other.backtrace and
|
|
333
|
+
@benchmark == other.benchmark and
|
|
334
|
+
@bulk_threshold == other.bulk_threshold and
|
|
335
|
+
@verbose == other.verbose and
|
|
336
|
+
@update_sources == other.update_sources and
|
|
337
|
+
@hash == other.hash
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
protected
|
|
341
|
+
|
|
342
|
+
attr_reader :hash
|
|
343
|
+
|
|
344
|
+
end
|
|
345
|
+
|