slimgems 1.3.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. data/ChangeLog +5811 -0
  2. data/History.txt +887 -0
  3. data/LICENSE.txt +51 -0
  4. data/README.md +87 -0
  5. data/Rakefile +120 -0
  6. data/bin/gem +25 -0
  7. data/bin/update_slimgems +35 -0
  8. data/bootstrap/Rakefile +4 -0
  9. data/hide_lib_for_update/note.txt +5 -0
  10. data/lib/gauntlet_rubygems.rb +50 -0
  11. data/lib/rbconfig/datadir.rb +20 -0
  12. data/lib/rubygems.rb +1220 -0
  13. data/lib/rubygems/builder.rb +102 -0
  14. data/lib/rubygems/command.rb +534 -0
  15. data/lib/rubygems/command_manager.rb +182 -0
  16. data/lib/rubygems/commands/build_command.rb +53 -0
  17. data/lib/rubygems/commands/cert_command.rb +86 -0
  18. data/lib/rubygems/commands/check_command.rb +80 -0
  19. data/lib/rubygems/commands/cleanup_command.rb +106 -0
  20. data/lib/rubygems/commands/contents_command.rb +98 -0
  21. data/lib/rubygems/commands/dependency_command.rb +195 -0
  22. data/lib/rubygems/commands/environment_command.rb +132 -0
  23. data/lib/rubygems/commands/fetch_command.rb +67 -0
  24. data/lib/rubygems/commands/generate_index_command.rb +133 -0
  25. data/lib/rubygems/commands/help_command.rb +172 -0
  26. data/lib/rubygems/commands/install_command.rb +178 -0
  27. data/lib/rubygems/commands/list_command.rb +35 -0
  28. data/lib/rubygems/commands/lock_command.rb +110 -0
  29. data/lib/rubygems/commands/mirror_command.rb +111 -0
  30. data/lib/rubygems/commands/outdated_command.rb +33 -0
  31. data/lib/rubygems/commands/owner_command.rb +75 -0
  32. data/lib/rubygems/commands/pristine_command.rb +93 -0
  33. data/lib/rubygems/commands/push_command.rb +56 -0
  34. data/lib/rubygems/commands/query_command.rb +280 -0
  35. data/lib/rubygems/commands/rdoc_command.rb +91 -0
  36. data/lib/rubygems/commands/search_command.rb +31 -0
  37. data/lib/rubygems/commands/server_command.rb +86 -0
  38. data/lib/rubygems/commands/setup_command.rb +387 -0
  39. data/lib/rubygems/commands/sources_command.rb +157 -0
  40. data/lib/rubygems/commands/specification_command.rb +125 -0
  41. data/lib/rubygems/commands/stale_command.rb +27 -0
  42. data/lib/rubygems/commands/uninstall_command.rb +83 -0
  43. data/lib/rubygems/commands/unpack_command.rb +121 -0
  44. data/lib/rubygems/commands/update_command.rb +212 -0
  45. data/lib/rubygems/commands/which_command.rb +86 -0
  46. data/lib/rubygems/config_file.rb +345 -0
  47. data/lib/rubygems/custom_require.rb +44 -0
  48. data/lib/rubygems/defaults.rb +101 -0
  49. data/lib/rubygems/dependency.rb +227 -0
  50. data/lib/rubygems/dependency_installer.rb +286 -0
  51. data/lib/rubygems/dependency_list.rb +208 -0
  52. data/lib/rubygems/doc_manager.rb +242 -0
  53. data/lib/rubygems/errors.rb +35 -0
  54. data/lib/rubygems/exceptions.rb +91 -0
  55. data/lib/rubygems/ext.rb +18 -0
  56. data/lib/rubygems/ext/builder.rb +56 -0
  57. data/lib/rubygems/ext/configure_builder.rb +25 -0
  58. data/lib/rubygems/ext/ext_conf_builder.rb +24 -0
  59. data/lib/rubygems/ext/rake_builder.rb +39 -0
  60. data/lib/rubygems/format.rb +81 -0
  61. data/lib/rubygems/gem_openssl.rb +92 -0
  62. data/lib/rubygems/gem_path_searcher.rb +100 -0
  63. data/lib/rubygems/gem_runner.rb +79 -0
  64. data/lib/rubygems/gemcutter_utilities.rb +49 -0
  65. data/lib/rubygems/indexer.rb +720 -0
  66. data/lib/rubygems/install_update_options.rb +125 -0
  67. data/lib/rubygems/installer.rb +604 -0
  68. data/lib/rubygems/local_remote_options.rb +135 -0
  69. data/lib/rubygems/old_format.rb +153 -0
  70. data/lib/rubygems/package.rb +97 -0
  71. data/lib/rubygems/package/f_sync_dir.rb +23 -0
  72. data/lib/rubygems/package/tar_header.rb +266 -0
  73. data/lib/rubygems/package/tar_input.rb +222 -0
  74. data/lib/rubygems/package/tar_output.rb +144 -0
  75. data/lib/rubygems/package/tar_reader.rb +106 -0
  76. data/lib/rubygems/package/tar_reader/entry.rb +141 -0
  77. data/lib/rubygems/package/tar_writer.rb +241 -0
  78. data/lib/rubygems/package_task.rb +126 -0
  79. data/lib/rubygems/platform.rb +183 -0
  80. data/lib/rubygems/remote_fetcher.rb +414 -0
  81. data/lib/rubygems/require_paths_builder.rb +18 -0
  82. data/lib/rubygems/requirement.rb +153 -0
  83. data/lib/rubygems/security.rb +814 -0
  84. data/lib/rubygems/server.rb +872 -0
  85. data/lib/rubygems/source_index.rb +597 -0
  86. data/lib/rubygems/source_info_cache.rb +395 -0
  87. data/lib/rubygems/source_info_cache_entry.rb +56 -0
  88. data/lib/rubygems/spec_fetcher.rb +337 -0
  89. data/lib/rubygems/specification.rb +1486 -0
  90. data/lib/rubygems/test_utilities.rb +147 -0
  91. data/lib/rubygems/text.rb +65 -0
  92. data/lib/rubygems/uninstaller.rb +278 -0
  93. data/lib/rubygems/user_interaction.rb +527 -0
  94. data/lib/rubygems/validator.rb +240 -0
  95. data/lib/rubygems/version.rb +316 -0
  96. data/lib/rubygems/version_option.rb +65 -0
  97. data/lib/ubygems.rb +10 -0
  98. data/setup.rb +42 -0
  99. data/test/bogussources.rb +8 -0
  100. data/test/data/gem-private_key.pem +27 -0
  101. data/test/data/gem-public_cert.pem +20 -0
  102. data/test/fake_certlib/openssl.rb +7 -0
  103. data/test/foo/discover.rb +0 -0
  104. data/test/functional.rb +92 -0
  105. data/test/gem_installer_test_case.rb +97 -0
  106. data/test/gem_package_tar_test_case.rb +132 -0
  107. data/test/gemutilities.rb +605 -0
  108. data/test/insure_session.rb +43 -0
  109. data/test/mockgemui.rb +56 -0
  110. data/test/plugin/exception/rubygems_plugin.rb +2 -0
  111. data/test/plugin/load/rubygems_plugin.rb +1 -0
  112. data/test/plugin/standarderror/rubygems_plugin.rb +2 -0
  113. data/test/private_key.pem +27 -0
  114. data/test/public_cert.pem +20 -0
  115. data/test/rubygems_plugin.rb +21 -0
  116. data/test/simple_gem.rb +66 -0
  117. data/test/test_config.rb +12 -0
  118. data/test/test_gem.rb +766 -0
  119. data/test/test_gem_builder.rb +27 -0
  120. data/test/test_gem_command.rb +178 -0
  121. data/test/test_gem_command_manager.rb +207 -0
  122. data/test/test_gem_commands_build_command.rb +74 -0
  123. data/test/test_gem_commands_cert_command.rb +124 -0
  124. data/test/test_gem_commands_check_command.rb +18 -0
  125. data/test/test_gem_commands_contents_command.rb +156 -0
  126. data/test/test_gem_commands_dependency_command.rb +216 -0
  127. data/test/test_gem_commands_environment_command.rb +144 -0
  128. data/test/test_gem_commands_fetch_command.rb +76 -0
  129. data/test/test_gem_commands_generate_index_command.rb +135 -0
  130. data/test/test_gem_commands_install_command.rb +315 -0
  131. data/test/test_gem_commands_list_command.rb +36 -0
  132. data/test/test_gem_commands_lock_command.rb +68 -0
  133. data/test/test_gem_commands_mirror_command.rb +60 -0
  134. data/test/test_gem_commands_outdated_command.rb +40 -0
  135. data/test/test_gem_commands_owner_command.rb +105 -0
  136. data/test/test_gem_commands_pristine_command.rb +108 -0
  137. data/test/test_gem_commands_push_command.rb +81 -0
  138. data/test/test_gem_commands_query_command.rb +426 -0
  139. data/test/test_gem_commands_server_command.rb +59 -0
  140. data/test/test_gem_commands_sources_command.rb +209 -0
  141. data/test/test_gem_commands_specification_command.rb +139 -0
  142. data/test/test_gem_commands_stale_command.rb +38 -0
  143. data/test/test_gem_commands_uninstall_command.rb +83 -0
  144. data/test/test_gem_commands_unpack_command.rb +199 -0
  145. data/test/test_gem_commands_update_command.rb +353 -0
  146. data/test/test_gem_commands_which_command.rb +66 -0
  147. data/test/test_gem_config_file.rb +287 -0
  148. data/test/test_gem_dependency.rb +149 -0
  149. data/test/test_gem_dependency_installer.rb +661 -0
  150. data/test/test_gem_dependency_list.rb +230 -0
  151. data/test/test_gem_doc_manager.rb +31 -0
  152. data/test/test_gem_ext_configure_builder.rb +84 -0
  153. data/test/test_gem_ext_ext_conf_builder.rb +173 -0
  154. data/test/test_gem_ext_rake_builder.rb +81 -0
  155. data/test/test_gem_format.rb +70 -0
  156. data/test/test_gem_gem_path_searcher.rb +78 -0
  157. data/test/test_gem_gem_runner.rb +45 -0
  158. data/test/test_gem_gemcutter_utilities.rb +103 -0
  159. data/test/test_gem_indexer.rb +673 -0
  160. data/test/test_gem_install_update_options.rb +68 -0
  161. data/test/test_gem_installer.rb +857 -0
  162. data/test/test_gem_local_remote_options.rb +97 -0
  163. data/test/test_gem_package_tar_header.rb +130 -0
  164. data/test/test_gem_package_tar_input.rb +112 -0
  165. data/test/test_gem_package_tar_output.rb +97 -0
  166. data/test/test_gem_package_tar_reader.rb +46 -0
  167. data/test/test_gem_package_tar_reader_entry.rb +109 -0
  168. data/test/test_gem_package_tar_writer.rb +144 -0
  169. data/test/test_gem_package_task.rb +59 -0
  170. data/test/test_gem_platform.rb +264 -0
  171. data/test/test_gem_remote_fetcher.rb +740 -0
  172. data/test/test_gem_requirement.rb +292 -0
  173. data/test/test_gem_server.rb +356 -0
  174. data/test/test_gem_silent_ui.rb +113 -0
  175. data/test/test_gem_source_index.rb +461 -0
  176. data/test/test_gem_spec_fetcher.rb +410 -0
  177. data/test/test_gem_specification.rb +1291 -0
  178. data/test/test_gem_stream_ui.rb +218 -0
  179. data/test/test_gem_text.rb +43 -0
  180. data/test/test_gem_uninstaller.rb +146 -0
  181. data/test/test_gem_validator.rb +63 -0
  182. data/test/test_gem_version.rb +181 -0
  183. data/test/test_gem_version_option.rb +89 -0
  184. data/test/test_kernel.rb +59 -0
  185. metadata +413 -0
@@ -0,0 +1,147 @@
1
+ require 'tempfile'
2
+ require 'rubygems'
3
+ require 'rubygems/remote_fetcher'
4
+
5
+ ##
6
+ # A fake Gem::RemoteFetcher for use in tests or to avoid real live HTTP
7
+ # requests when testing code that uses SlimGems.
8
+ #
9
+ # Example:
10
+ #
11
+ # @fetcher = Gem::FakeFetcher.new
12
+ # @fetcher.data['http://gems.example.com/yaml'] = source_index.to_yaml
13
+ # Gem::RemoteFetcher.fetcher = @fetcher
14
+ #
15
+ # # invoke SlimGems code
16
+ #
17
+ # paths = @fetcher.paths
18
+ # assert_equal 'http://gems.example.com/yaml', paths.shift
19
+ # assert paths.empty?, paths.join(', ')
20
+ #
21
+ # See SlimGems' tests for more examples of FakeFetcher.
22
+
23
+ class Gem::FakeFetcher
24
+
25
+ attr_reader :data
26
+ attr_reader :last_request
27
+ attr_accessor :paths
28
+
29
+ def initialize
30
+ @data = {}
31
+ @paths = []
32
+ end
33
+
34
+ def find_data(path)
35
+ path = path.to_s
36
+ @paths << path
37
+ raise ArgumentError, 'need full URI' unless path =~ %r'^https?://'
38
+
39
+ unless @data.key? path then
40
+ raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
41
+ end
42
+
43
+ @data[path]
44
+ end
45
+
46
+ def fetch_path path, mtime = nil
47
+ data = find_data(path)
48
+
49
+ if data.respond_to?(:call) then
50
+ data.call
51
+ else
52
+ if path.to_s =~ /gz$/ and not data.nil? and not data.empty? then
53
+ data = Gem.gunzip data
54
+ end
55
+
56
+ data
57
+ end
58
+ end
59
+
60
+ # Thanks, FakeWeb!
61
+ def open_uri_or_path(path)
62
+ data = find_data(path)
63
+ body, code, msg = data
64
+
65
+ response = Net::HTTPResponse.send(:response_class, code.to_s).new("1.0", code.to_s, msg)
66
+ response.instance_variable_set(:@body, body)
67
+ response.instance_variable_set(:@read, true)
68
+ response
69
+ end
70
+
71
+ def request(uri, request_class, last_modified = nil)
72
+ data = find_data(uri)
73
+ body, code, msg = data
74
+
75
+ @last_request = request_class.new uri.request_uri
76
+ yield @last_request if block_given?
77
+
78
+ response = Net::HTTPResponse.send(:response_class, code.to_s).new("1.0", code.to_s, msg)
79
+ response.instance_variable_set(:@body, body)
80
+ response.instance_variable_set(:@read, true)
81
+ response
82
+ end
83
+
84
+ def fetch_size(path)
85
+ path = path.to_s
86
+ @paths << path
87
+
88
+ raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
89
+
90
+ unless @data.key? path then
91
+ raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
92
+ end
93
+
94
+ data = @data[path]
95
+
96
+ data.respond_to?(:call) ? data.call : data.length
97
+ end
98
+
99
+ def download spec, source_uri, install_dir = Gem.dir
100
+ name = spec.file_name
101
+ path = File.join(install_dir, 'cache', name)
102
+
103
+ Gem.ensure_gem_subdirectories install_dir
104
+
105
+ if source_uri =~ /^http/ then
106
+ File.open(path, "wb") do |f|
107
+ f.write fetch_path(File.join(source_uri, "gems", name))
108
+ end
109
+ else
110
+ FileUtils.cp source_uri, path
111
+ end
112
+
113
+ path
114
+ end
115
+
116
+ end
117
+
118
+ # :stopdoc:
119
+ class Gem::RemoteFetcher
120
+
121
+ def self.fetcher=(fetcher)
122
+ @fetcher = fetcher
123
+ end
124
+
125
+ end
126
+ # :startdoc:
127
+
128
+ ##
129
+ # A StringIO duck-typed class that uses Tempfile instead of String as the
130
+ # backing store.
131
+ #--
132
+ # This class was added to flush out problems in Rubinius' IO implementation.
133
+
134
+ class TempIO < Tempfile
135
+ def initialize(string = '')
136
+ super "TempIO"
137
+ binmode
138
+ write string
139
+ rewind
140
+ end
141
+
142
+ def string
143
+ flush
144
+ Gem.read_binary path
145
+ end
146
+ end
147
+
@@ -0,0 +1,65 @@
1
+ require 'rubygems'
2
+
3
+ ##
4
+ # A collection of text-wrangling methods
5
+
6
+ module Gem::Text
7
+
8
+ ##
9
+ # Wraps +text+ to +wrap+ characters and optionally indents by +indent+
10
+ # characters
11
+
12
+ def format_text(text, wrap, indent=0)
13
+ result = []
14
+ work = text.dup
15
+
16
+ while work.length > wrap do
17
+ if work =~ /^(.{0,#{wrap}})[ \n]/ then
18
+ result << $1
19
+ work.slice!(0, $&.length)
20
+ else
21
+ result << work.slice!(0, wrap)
22
+ end
23
+ end
24
+
25
+ result << work if work.length.nonzero?
26
+ result.join("\n").gsub(/^/, " " * indent)
27
+ end
28
+
29
+ # This code is based directly on the Text gem implementation
30
+ # Returns a value representing the "cost" of transforming str1 into str2
31
+ def levenshtein_distance str1, str2
32
+ s = str1
33
+ t = str2
34
+ n = s.length
35
+ m = t.length
36
+ max = n/2
37
+
38
+ return m if (0 == n)
39
+ return n if (0 == m)
40
+ return n if (n - m).abs > max
41
+
42
+ d = (0..m).to_a
43
+ x = nil
44
+
45
+ n.times do |i|
46
+ e = i+1
47
+
48
+ m.times do |j|
49
+ cost = (s[i] == t[j]) ? 0 : 1
50
+ x = [
51
+ d[j+1] + 1, # insertion
52
+ e + 1, # deletion
53
+ d[j] + cost # substitution
54
+ ].min
55
+ d[j] = e
56
+ e = x
57
+ end
58
+
59
+ d[m] = x
60
+ end
61
+
62
+ return x
63
+ end
64
+ end
65
+
@@ -0,0 +1,278 @@
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 'rubygems'
9
+ require 'rubygems/dependency_list'
10
+ require 'rubygems/doc_manager'
11
+ require 'rubygems/user_interaction'
12
+
13
+ # Restores RubyGems
14
+ Gem.post_uninstall do |uninstaller|
15
+ site_lib = File.expand_path(File.join(File.dirname(__FILE__), '..'))
16
+ old_lib = File.join(site_lib, 'rubygems-backup')
17
+ if File.directory?(old_lib)
18
+ uninstaller.say "Restoring RubyGems"
19
+ Dir.glob(File.join(old_lib, '*')).each do |file|
20
+ fname = File.basename(file)
21
+ old_file = File.join(site_lib, fname)
22
+ FileUtils.rm_rf(old_file) if File.exist?(old_file)
23
+ FileUtils.mv(file, File.join(site_lib, fname))
24
+ end
25
+ FileUtils.rm_rf(old_lib)
26
+ end
27
+ end
28
+
29
+ ##
30
+ # An Uninstaller.
31
+ #
32
+ # The uninstaller fires pre and post uninstall hooks. Hooks can be added
33
+ # either through a rubygems_plugin.rb file in an installed gem or via a
34
+ # rubygems/defaults/#{RUBY_ENGINE}.rb or rubygems/defaults/operating_system.rb
35
+ # file. See Gem.pre_uninstall and Gem.post_uninstall for details.
36
+
37
+ class Gem::Uninstaller
38
+
39
+ include Gem::UserInteraction
40
+
41
+ ##
42
+ # The directory a gem's executables will be installed into
43
+
44
+ attr_reader :bin_dir
45
+
46
+ ##
47
+ # The gem repository the gem will be installed into
48
+
49
+ attr_reader :gem_home
50
+
51
+ ##
52
+ # The Gem::Specification for the gem being uninstalled, only set during
53
+ # #uninstall_gem
54
+
55
+ attr_reader :spec
56
+
57
+ ##
58
+ # Constructs an uninstaller that will uninstall +gem+
59
+
60
+ def initialize(gem, options = {})
61
+ @gem = gem
62
+ @version = options[:version] || Gem::Requirement.default
63
+ gem_home = options[:install_dir] || Gem.dir
64
+ @gem_home = File.expand_path gem_home
65
+ @force_executables = options[:executables]
66
+ @force_all = options[:all]
67
+ @force_ignore = options[:ignore]
68
+ @bin_dir = options[:bin_dir]
69
+
70
+ # only add user directory if install_dir is not set
71
+ @user_install = false
72
+ @user_install = options[:user_install] unless options[:install_dir]
73
+
74
+ spec_dir = File.join @gem_home, 'specifications'
75
+ @source_index = Gem::SourceIndex.from_gems_in spec_dir
76
+
77
+ if @user_install then
78
+ user_dir = File.join Gem.user_dir, 'specifications'
79
+ @user_index = Gem::SourceIndex.from_gems_in user_dir
80
+ end
81
+ end
82
+
83
+ ##
84
+ # Performs the uninstall of the gem. This removes the spec, the Gem
85
+ # directory, and the cached .gem file.
86
+
87
+ def uninstall
88
+ list = @source_index.find_name @gem, @version
89
+ list += @user_index.find_name @gem, @version if @user_install
90
+
91
+ if list.empty? then
92
+ raise Gem::InstallError, "cannot uninstall, check `gem list -d #{@gem}`"
93
+
94
+ elsif list.size > 1 and @force_all then
95
+ remove_all list.dup
96
+
97
+ elsif list.size > 1 then
98
+ gem_names = list.collect {|gem| gem.full_name} + ["All versions"]
99
+
100
+ say
101
+ _, index = choose_from_list "Select gem to uninstall:", gem_names
102
+
103
+ if index == list.size then
104
+ remove_all list.dup
105
+ elsif index >= 0 && index < list.size then
106
+ uninstall_gem list[index], list.dup
107
+ else
108
+ say "Error: must enter a number [1-#{list.size+1}]"
109
+ end
110
+ else
111
+ uninstall_gem list.first, list.dup
112
+ end
113
+ end
114
+
115
+ ##
116
+ # Uninstalls gem +spec+
117
+
118
+ def uninstall_gem(spec, specs)
119
+ @spec = spec
120
+
121
+ Gem.pre_uninstall_hooks.each do |hook|
122
+ hook.call self
123
+ end
124
+
125
+ remove_executables @spec
126
+ remove @spec, specs
127
+
128
+ Gem.post_uninstall_hooks.each do |hook|
129
+ hook.call self
130
+ end
131
+
132
+ @spec = nil
133
+ end
134
+
135
+ ##
136
+ # Removes installed executables and batch files (windows only) for
137
+ # +gemspec+.
138
+
139
+ def remove_executables(spec)
140
+ return if spec.nil?
141
+
142
+ unless spec.executables.empty? then
143
+ bindir = @bin_dir ? @bin_dir : Gem.bindir(spec.installation_path)
144
+
145
+ list = @source_index.find_name(spec.name).delete_if { |s|
146
+ s.version == spec.version
147
+ }
148
+
149
+ executables = spec.executables.clone
150
+
151
+ list.each do |s|
152
+ s.executables.each do |exe_name|
153
+ executables.delete exe_name
154
+ end
155
+ end
156
+
157
+ return if executables.empty?
158
+
159
+ answer = if @force_executables.nil? then
160
+ ask_yes_no("Remove executables:\n" \
161
+ "\t#{spec.executables.join(", ")}\n\nin addition to the gem?",
162
+ true) # " # appease ruby-mode - don't ask
163
+ else
164
+ @force_executables
165
+ end
166
+
167
+ unless answer then
168
+ say "Executables and scripts will remain installed."
169
+ else
170
+ raise Gem::FilePermissionError, bindir unless File.writable? bindir
171
+
172
+ spec.executables.each do |exe_name|
173
+ say "Removing #{exe_name}"
174
+ FileUtils.rm_f File.join(bindir, exe_name)
175
+ FileUtils.rm_f File.join(bindir, "#{exe_name}.bat")
176
+ end
177
+ end
178
+ end
179
+ end
180
+
181
+ ##
182
+ # Removes all gems in +list+.
183
+ #
184
+ # NOTE: removes uninstalled gems from +list+.
185
+
186
+ def remove_all(list)
187
+ list.dup.each { |spec| uninstall_gem spec, list }
188
+ end
189
+
190
+ ##
191
+ # spec:: the spec of the gem to be uninstalled
192
+ # list:: the list of all such gems
193
+ #
194
+ # Warning: this method modifies the +list+ parameter. Once it has
195
+ # uninstalled a gem, it is removed from that list.
196
+
197
+ def remove(spec, list)
198
+ unless dependencies_ok? spec then
199
+ raise Gem::DependencyRemovalException,
200
+ "Uninstallation aborted due to dependent gem(s)"
201
+ end
202
+
203
+ unless path_ok?(@gem_home, spec) or
204
+ (@user_install and path_ok?(Gem.user_dir, spec)) then
205
+ e = Gem::GemNotInHomeException.new \
206
+ "Gem is not installed in directory #{@gem_home}"
207
+ e.spec = spec
208
+
209
+ raise e
210
+ end
211
+
212
+ raise Gem::FilePermissionError, spec.installation_path unless
213
+ File.writable?(spec.installation_path)
214
+
215
+ FileUtils.rm_rf spec.full_gem_path
216
+
217
+ original_platform_name = [
218
+ spec.name, spec.version, spec.original_platform].join '-'
219
+
220
+ spec_dir = File.join spec.installation_path, 'specifications'
221
+ gemspec = File.join spec_dir, spec.spec_name
222
+
223
+ unless File.exist? gemspec then
224
+ gemspec = File.join spec_dir, "#{original_platform_name}.gemspec"
225
+ end
226
+
227
+ FileUtils.rm_rf gemspec
228
+
229
+ cache_dir = File.join spec.installation_path, 'cache'
230
+ gem = File.join cache_dir, spec.file_name
231
+
232
+ unless File.exist? gem then
233
+ gem = File.join cache_dir, "#{original_platform_name}.gem"
234
+ end
235
+
236
+ FileUtils.rm_rf gem
237
+
238
+ Gem::DocManager.new(spec).uninstall_doc
239
+
240
+ say "Successfully uninstalled #{spec.full_name}"
241
+
242
+ list.delete spec
243
+ end
244
+
245
+ ##
246
+ # Is +spec+ in +gem_dir+?
247
+
248
+ def path_ok?(gem_dir, spec)
249
+ full_path = File.join gem_dir, 'gems', spec.full_name
250
+ original_path = File.join gem_dir, 'gems', spec.original_name
251
+
252
+ full_path == spec.full_gem_path || original_path == spec.full_gem_path
253
+ end
254
+
255
+ def dependencies_ok?(spec)
256
+ return true if @force_ignore
257
+
258
+ deplist = Gem::DependencyList.from_source_index @source_index
259
+ deplist.add(*@user_index.gems.values) if @user_install
260
+ deplist.ok_to_remove?(spec.full_name) || ask_if_ok(spec)
261
+ end
262
+
263
+ def ask_if_ok(spec)
264
+ msg = ['']
265
+ msg << 'You have requested to uninstall the gem:'
266
+ msg << "\t#{spec.full_name}"
267
+ spec.dependent_gems.each do |gem,dep,satlist|
268
+ msg <<
269
+ ("#{gem.name}-#{gem.version} depends on " +
270
+ "[#{dep.name} (#{dep.requirement})]")
271
+ end
272
+ msg << 'If you remove this gems, one or more dependencies will not be met.'
273
+ msg << 'Continue with Uninstall?'
274
+ return ask_yes_no(msg.join("\n"), true)
275
+ end
276
+
277
+ end
278
+