rubygems-update 1.3.5 → 1.3.6

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.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (146) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.autotest +8 -1
  3. data/ChangeLog +164 -0
  4. data/History.txt +52 -1
  5. data/Manifest.txt +8 -8
  6. data/README +3 -2
  7. data/Rakefile +49 -5
  8. data/bin/gem +2 -2
  9. data/bin/update_rubygems +9 -11
  10. data/cruise_config.rb +4 -3
  11. data/hide_lib_for_update/note.txt +5 -0
  12. data/lib/rbconfig/datadir.rb +10 -14
  13. data/lib/rubygems.rb +117 -140
  14. data/lib/rubygems/builder.rb +4 -2
  15. data/lib/rubygems/command.rb +51 -48
  16. data/lib/rubygems/command_manager.rb +2 -0
  17. data/lib/rubygems/commands/dependency_command.rb +10 -5
  18. data/lib/rubygems/commands/environment_command.rb +1 -1
  19. data/lib/rubygems/commands/fetch_command.rb +6 -5
  20. data/lib/rubygems/commands/install_command.rb +1 -0
  21. data/lib/rubygems/commands/mirror_command.rb +8 -8
  22. data/lib/rubygems/commands/owner_command.rb +75 -0
  23. data/lib/rubygems/commands/pristine_command.rb +1 -1
  24. data/lib/rubygems/commands/push_command.rb +45 -0
  25. data/lib/rubygems/commands/query_command.rb +4 -1
  26. data/lib/rubygems/commands/rdoc_command.rb +24 -9
  27. data/lib/rubygems/commands/server_command.rb +6 -0
  28. data/lib/rubygems/commands/setup_command.rb +14 -4
  29. data/lib/rubygems/commands/unpack_command.rb +2 -2
  30. data/lib/rubygems/commands/update_command.rb +2 -2
  31. data/lib/rubygems/commands/which_command.rb +7 -9
  32. data/lib/rubygems/config_file.rb +100 -26
  33. data/lib/rubygems/defaults.rb +1 -1
  34. data/lib/rubygems/dependency.rb +133 -75
  35. data/lib/rubygems/dependency_installer.rb +28 -10
  36. data/lib/rubygems/dependency_list.rb +41 -12
  37. data/lib/rubygems/doc_manager.rb +7 -0
  38. data/lib/rubygems/format.rb +16 -20
  39. data/lib/rubygems/gem_openssl.rb +1 -1
  40. data/lib/rubygems/gem_path_searcher.rb +10 -12
  41. data/lib/rubygems/gemcutter_utilities.rb +49 -0
  42. data/lib/rubygems/indexer.rb +2 -2
  43. data/lib/rubygems/install_update_options.rb +1 -9
  44. data/lib/rubygems/installer.rb +35 -76
  45. data/lib/rubygems/local_remote_options.rb +1 -2
  46. data/lib/rubygems/package.rb +0 -1
  47. data/lib/rubygems/package/tar_input.rb +3 -1
  48. data/lib/rubygems/package_task.rb +16 -11
  49. data/lib/rubygems/remote_fetcher.rb +22 -8
  50. data/lib/rubygems/requirement.rb +78 -100
  51. data/lib/rubygems/server.rb +41 -10
  52. data/lib/rubygems/source_index.rb +5 -5
  53. data/lib/rubygems/spec_fetcher.rb +2 -2
  54. data/lib/rubygems/specification.rb +66 -16
  55. data/lib/rubygems/test_utilities.rb +33 -4
  56. data/lib/rubygems/uninstaller.rb +3 -3
  57. data/lib/rubygems/user_interaction.rb +45 -0
  58. data/lib/rubygems/validator.rb +6 -7
  59. data/lib/rubygems/version.rb +206 -149
  60. data/lib/rubygems/version_option.rb +16 -0
  61. data/test/fake_certlib/openssl.rb +1 -1
  62. data/test/functional.rb +0 -7
  63. data/test/gem_installer_test_case.rb +4 -4
  64. data/test/gem_package_tar_test_case.rb +1 -1
  65. data/test/gemutilities.rb +35 -31
  66. data/test/insure_session.rb +0 -8
  67. data/test/mockgemui.rb +0 -8
  68. data/test/simple_gem.rb +2 -8
  69. data/test/test_config.rb +3 -10
  70. data/test/test_gem.rb +9 -14
  71. data/test/test_gem_builder.rb +1 -7
  72. data/test/test_gem_command.rb +1 -8
  73. data/test/test_gem_command_manager.rb +1 -7
  74. data/test/test_gem_commands_build_command.rb +4 -4
  75. data/test/test_gem_commands_cert_command.rb +1 -2
  76. data/test/test_gem_commands_check_command.rb +1 -7
  77. data/test/test_gem_commands_contents_command.rb +1 -1
  78. data/test/test_gem_commands_dependency_command.rb +17 -31
  79. data/test/test_gem_commands_environment_command.rb +1 -1
  80. data/test/test_gem_commands_fetch_command.rb +14 -12
  81. data/test/test_gem_commands_generate_index_command.rb +1 -1
  82. data/test/test_gem_commands_install_command.rb +22 -20
  83. data/test/test_gem_commands_list_command.rb +1 -1
  84. data/test/test_gem_commands_lock_command.rb +1 -1
  85. data/test/test_gem_commands_mirror_command.rb +5 -5
  86. data/test/test_gem_commands_outdated_command.rb +3 -5
  87. data/test/test_gem_commands_owner_command.rb +105 -0
  88. data/test/test_gem_commands_pristine_command.rb +2 -2
  89. data/test/test_gem_commands_push_command.rb +61 -0
  90. data/test/test_gem_commands_query_command.rb +23 -56
  91. data/test/test_gem_commands_server_command.rb +1 -1
  92. data/test/test_gem_commands_sources_command.rb +1 -70
  93. data/test/test_gem_commands_specification_command.rb +3 -4
  94. data/test/test_gem_commands_stale_command.rb +1 -1
  95. data/test/test_gem_commands_uninstall_command.rb +3 -4
  96. data/test/test_gem_commands_unpack_command.rb +1 -1
  97. data/test/test_gem_commands_update_command.rb +13 -13
  98. data/test/test_gem_commands_which_command.rb +66 -0
  99. data/test/test_gem_config_file.rb +13 -7
  100. data/test/test_gem_dependency.rb +82 -134
  101. data/test/test_gem_dependency_installer.rb +55 -30
  102. data/test/test_gem_dependency_list.rb +28 -7
  103. data/test/test_gem_doc_manager.rb +1 -7
  104. data/test/test_gem_ext_configure_builder.rb +2 -2
  105. data/test/test_gem_ext_ext_conf_builder.rb +1 -1
  106. data/test/test_gem_ext_rake_builder.rb +1 -1
  107. data/test/test_gem_format.rb +14 -11
  108. data/test/test_gem_gem_path_searcher.rb +12 -1
  109. data/test/test_gem_gem_runner.rb +1 -1
  110. data/test/test_gem_gemcutter_utilities.rb +103 -0
  111. data/test/test_gem_indexer.rb +44 -51
  112. data/test/test_gem_install_update_options.rb +1 -7
  113. data/test/test_gem_installer.rb +22 -82
  114. data/test/test_gem_local_remote_options.rb +1 -1
  115. data/test/test_gem_package_tar_header.rb +1 -8
  116. data/test/test_gem_package_tar_input.rb +1 -8
  117. data/test/test_gem_package_tar_output.rb +1 -8
  118. data/test/test_gem_package_tar_reader.rb +1 -8
  119. data/test/test_gem_package_tar_reader_entry.rb +1 -8
  120. data/test/test_gem_package_tar_writer.rb +1 -8
  121. data/test/test_gem_package_task.rb +1 -25
  122. data/test/test_gem_platform.rb +4 -4
  123. data/test/test_gem_remote_fetcher.rb +31 -21
  124. data/test/test_gem_requirement.rb +210 -140
  125. data/test/test_gem_server.rb +36 -1
  126. data/test/test_gem_source_index.rb +7 -13
  127. data/test/test_gem_spec_fetcher.rb +17 -47
  128. data/test/test_gem_specification.rb +7 -20
  129. data/test/test_gem_stream_ui.rb +21 -1
  130. data/test/test_gem_uninstaller.rb +1 -2
  131. data/test/test_gem_validator.rb +2 -8
  132. data/test/test_gem_version.rb +110 -254
  133. data/test/test_gem_version_option.rb +1 -1
  134. data/test/test_kernel.rb +1 -7
  135. data/util/CL2notes +1 -1
  136. data/util/gem_prelude.rb.template +64 -41
  137. metadata +33 -71
  138. metadata.gz.sig +0 -0
  139. data/lib/rubygems/digest/digest_adapter.rb +0 -49
  140. data/lib/rubygems/digest/md5.rb +0 -23
  141. data/lib/rubygems/digest/sha1.rb +0 -22
  142. data/lib/rubygems/digest/sha2.rb +0 -22
  143. data/lib/rubygems/timer.rb +0 -28
  144. data/test/test_gem_digest.rb +0 -46
  145. data/test/test_gem_source_info_cache.rb +0 -447
  146. data/test/test_gem_source_info_cache_entry.rb +0 -78
@@ -38,7 +38,7 @@ class Gem::DependencyInstaller
38
38
  # :format_executable:: See Gem::Installer#initialize.
39
39
  # :ignore_dependencies:: Don't install any dependencies.
40
40
  # :install_dir:: See Gem::Installer#install.
41
- # :prerelease:: Allow prerelease versions
41
+ # :prerelease:: Allow prerelease versions. See #install.
42
42
  # :security_policy:: See Gem::Installer::new and Gem::Security.
43
43
  # :user_install:: See Gem::Installer.new
44
44
  # :wrappers:: See Gem::Installer::new
@@ -89,14 +89,18 @@ class Gem::DependencyInstaller
89
89
 
90
90
  if @domain == :both or @domain == :remote then
91
91
  begin
92
- requirements = dep.version_requirements.requirements.map do |req, ver|
92
+ requirements = dep.requirement.requirements.map do |req, ver|
93
93
  req
94
94
  end
95
95
 
96
- all = !@prerelease && (requirements.length > 1 ||
96
+ all = !dep.prerelease? &&
97
+ # we only need latest if there's one requirement and it is
98
+ # guaranteed to match the newest specs
99
+ (requirements.length > 1 or
97
100
  (requirements.first != ">=" and requirements.first != ">"))
98
101
 
99
- found = Gem::SpecFetcher.fetcher.fetch dep, all, true, @prerelease
102
+ found = Gem::SpecFetcher.fetcher.fetch dep, all, true, dep.prerelease?
103
+
100
104
  gems_and_sources.push(*found)
101
105
 
102
106
  rescue Gem::RemoteFetcher::FetchError => e
@@ -120,7 +124,7 @@ class Gem::DependencyInstaller
120
124
  def gather_dependencies
121
125
  specs = @specs_and_sources.map { |spec,_| spec }
122
126
 
123
- dependency_list = Gem::DependencyList.new
127
+ dependency_list = Gem::DependencyList.new @development
124
128
  dependency_list.add(*specs)
125
129
 
126
130
  unless @ignore_dependencies then
@@ -143,7 +147,7 @@ class Gem::DependencyInstaller
143
147
 
144
148
  @source_index.any? do |_, installed_spec|
145
149
  dep.name == installed_spec.name and
146
- dep.version_requirements.satisfied_by? installed_spec.version
150
+ dep.requirement.satisfied_by? installed_spec.version
147
151
  end
148
152
  end
149
153
 
@@ -164,7 +168,9 @@ class Gem::DependencyInstaller
164
168
  # +version+. Returns an Array of specs and sources required for
165
169
  # installation of the gem.
166
170
 
167
- def find_spec_by_name_and_version gem_name, version = Gem::Requirement.default
171
+ def find_spec_by_name_and_version(gem_name,
172
+ version = Gem::Requirement.default,
173
+ prerelease = false)
168
174
  spec_and_source = nil
169
175
 
170
176
  glob = if File::ALT_SEPARATOR then
@@ -189,6 +195,7 @@ class Gem::DependencyInstaller
189
195
 
190
196
  if spec_and_source.nil? then
191
197
  dep = Gem::Dependency.new gem_name, version
198
+ dep.prerelease = true if prerelease
192
199
  spec_and_sources = find_gems_with_sources(dep).reverse
193
200
 
194
201
  spec_and_source = spec_and_sources.find { |spec, source|
@@ -205,13 +212,24 @@ class Gem::DependencyInstaller
205
212
  end
206
213
 
207
214
  ##
208
- # Installs the gem and all its dependencies. Returns an Array of installed
209
- # gems specifications.
215
+ # Installs the gem +dep_or_name+ and all its dependencies. Returns an Array
216
+ # of installed gem specifications.
217
+ #
218
+ # If the +:prerelease+ option is set and there is a prerelease for
219
+ # +dep_or_name+ the prerelease version will be installed.
220
+ #
221
+ # Unless explicitly specified as a prerelease dependency, prerelease gems
222
+ # that +dep_or_name+ depend on will not be installed.
223
+ #
224
+ # If c-1.a depends on b-1 and a-1.a and there is a gem b-1.a available then
225
+ # c-1.a, b-1 and a-1.a will be installed. b-1.a will need to be installed
226
+ # separately.
210
227
 
211
228
  def install dep_or_name, version = Gem::Requirement.default
212
229
  if String === dep_or_name then
213
- find_spec_by_name_and_version dep_or_name, version
230
+ find_spec_by_name_and_version dep_or_name, version, @prerelease
214
231
  else
232
+ dep_or_name.prerelease = @prerelease
215
233
  @specs_and_sources = [find_gems_with_sources(dep_or_name).last]
216
234
  end
217
235
 
@@ -6,23 +6,41 @@
6
6
 
7
7
  require 'tsort'
8
8
 
9
+ ##
10
+ # Gem::DependencyList is used for installing and uninstalling gems in the
11
+ # correct order to avoid conflicts.
12
+
9
13
  class Gem::DependencyList
10
14
 
11
15
  include Enumerable
12
16
  include TSort
13
17
 
14
- def self.from_source_index(src_index)
15
- deps = new
18
+ ##
19
+ # Allows enabling/disabling use of development dependencies
20
+
21
+ attr_accessor :development
16
22
 
17
- src_index.each do |full_name, spec|
18
- deps.add spec
23
+ ##
24
+ # Creates a DependencyList from a Gem::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
19
31
  end
20
32
 
21
- deps
33
+ list
22
34
  end
23
35
 
24
- def initialize
36
+ ##
37
+ # Creates a new DependencyList. If +development+ is true, development
38
+ # dependencies will be included.
39
+
40
+ def initialize development = false
25
41
  @specs = []
42
+
43
+ @development = development
26
44
  end
27
45
 
28
46
  ##
@@ -33,8 +51,9 @@ class Gem::DependencyList
33
51
  end
34
52
 
35
53
  ##
36
- # Return a list of the specifications in the dependency list, sorted in
37
- # order so that no spec in the list depends on a gem earlier in the list.
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.
38
57
  #
39
58
  # This is useful when removing gems from a set of installed gems. By
40
59
  # removing them in the returned order, you don't get into as many dependency
@@ -77,6 +96,10 @@ class Gem::DependencyList
77
96
  @specs.find { |spec| spec.full_name == full_name }
78
97
  end
79
98
 
99
+ def inspect # :nodoc:
100
+ "#<%s:0x%x %p>" % [self.class, object_id, map { |s| s.full_name }]
101
+ end
102
+
80
103
  ##
81
104
  # Are all the dependencies in the list satisfied?
82
105
 
@@ -89,10 +112,10 @@ class Gem::DependencyList
89
112
  end
90
113
 
91
114
  ##
92
- # Is is ok to remove a gem from the dependency list?
115
+ # Is is ok to remove a gemspec from the dependency list?
93
116
  #
94
117
  # If removing the gemspec creates breaks a currently ok dependency, then it
95
- # is NOT ok to remove the gem.
118
+ # is NOT ok to remove the gemspec.
96
119
 
97
120
  def ok_to_remove?(full_name)
98
121
  gem_to_remove = find_name full_name
@@ -117,13 +140,16 @@ class Gem::DependencyList
117
140
  }
118
141
  end
119
142
 
143
+ ##
144
+ # Removes the gemspec matching +full_name+ from the dependency list
145
+
120
146
  def remove_by_name(full_name)
121
147
  @specs.delete_if { |spec| spec.full_name == full_name }
122
148
  end
123
149
 
124
150
  ##
125
151
  # Return a hash of predecessors. <tt>result[spec]</tt> is an Array of
126
- # gemspecs that have a dependency satisfied by the named spec.
152
+ # gemspecs that have a dependency satisfied by the named gemspec.
127
153
 
128
154
  def spec_predecessors
129
155
  result = Hash.new { |h,k| h[k] = [] }
@@ -152,7 +178,10 @@ class Gem::DependencyList
152
178
  def tsort_each_child(node, &block)
153
179
  specs = @specs.sort.reverse
154
180
 
155
- node.dependencies.each do |dep|
181
+ dependencies = node.runtime_dependencies
182
+ dependencies.push(*node.development_dependencies) if @development
183
+
184
+ dependencies.each do |dep|
156
185
  specs.each do |spec|
157
186
  if spec.satisfies_requirement? dep then
158
187
  begin
@@ -97,6 +97,13 @@ class Gem::DocManager
97
97
  File.exist?(File.join(@doc_dir, "rdoc"))
98
98
  end
99
99
 
100
+ ##
101
+ # Is the RI documentation installed?
102
+
103
+ def ri_installed?
104
+ File.exist?(File.join(@doc_dir, "ri"))
105
+ end
106
+
100
107
  ##
101
108
  # Generate the RI documents for this gem spec.
102
109
  #
@@ -14,25 +14,22 @@ require 'rubygems/package'
14
14
 
15
15
  class Gem::Format
16
16
 
17
- attr_accessor :spec, :file_entries, :gem_path
17
+ attr_accessor :spec
18
+ attr_accessor :file_entries
19
+ attr_accessor :gem_path
18
20
 
19
21
  extend Gem::UserInteraction
20
22
 
21
23
  ##
22
- # Constructs an instance of a Format object, representing the gem's
23
- # data structure.
24
- #
25
- # gem:: [String] The file name of the gem
26
- #
24
+ # Constructs a Format representing the gem's data which came from +gem_path+
25
+
27
26
  def initialize(gem_path)
28
27
  @gem_path = gem_path
29
28
  end
30
29
 
31
30
  ##
32
- # Reads the named gem file and returns a Format object, representing
33
- # the data from the gem file
34
- #
35
- # file_path:: [String] Path to the gem file
31
+ # Reads the gem +file_path+ using +security_policy+ and returns a Format
32
+ # representing the data in the gem
36
33
 
37
34
  def self.from_file_by_path(file_path, security_policy = nil)
38
35
  format = nil
@@ -41,25 +38,24 @@ class Gem::Format
41
38
  raise Gem::Exception, "Cannot load gem at [#{file_path}] in #{Dir.pwd}"
42
39
  end
43
40
 
44
- # check for old version gem
45
- if File.read(file_path, 20).include?("MD5SUM =")
41
+ start = File.read file_path, 20
42
+
43
+ if start.nil? or start.length < 20 then
44
+ nil
45
+ elsif start.include?("MD5SUM =") # old version gems
46
46
  require 'rubygems/old_format'
47
47
 
48
- format = Gem::OldFormat.from_file_by_path(file_path)
48
+ Gem::OldFormat.from_file_by_path file_path
49
49
  else
50
50
  open file_path, Gem.binary_mode do |io|
51
- format = from_io io, file_path, security_policy
51
+ from_io io, file_path, security_policy
52
52
  end
53
53
  end
54
-
55
- return format
56
54
  end
57
55
 
58
56
  ##
59
- # Reads a gem from an io stream and returns a Format object, representing
60
- # the data from the gem file
61
- #
62
- # io:: [IO] Stream from which to read the gem
57
+ # Reads a gem from +io+ at +gem_path+ using +security_policy+ and returns a
58
+ # Format representing the data from the gem
63
59
 
64
60
  def self.from_io(io, gem_path="(io)", security_policy = nil)
65
61
  format = new gem_path
@@ -30,7 +30,7 @@ module Gem
30
30
 
31
31
  def ensure_ssl_available
32
32
  unless ssl_available?
33
- fail Gem::Exception, "SSL is not installed on this system"
33
+ raise Gem::Exception, "SSL is not installed on this system"
34
34
  end
35
35
  end
36
36
  end
@@ -1,9 +1,3 @@
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
1
  ##
8
2
  # GemPathSearcher has the capability to find loadable files inside
9
3
  # gems. It generates data up front to speed up searches later.
@@ -14,14 +8,16 @@ class Gem::GemPathSearcher
14
8
  # Initialise the data we need to make searches later.
15
9
 
16
10
  def initialize
17
- # We want a record of all the installed gemspecs, in the order
18
- # we wish to examine them.
11
+ # We want a record of all the installed gemspecs, in the order we wish to
12
+ # examine them.
19
13
  @gemspecs = init_gemspecs
20
- # Map gem spec to glob of full require_path directories.
21
- # Preparing this information may speed up searches later.
14
+
15
+ # Map gem spec to glob of full require_path directories. Preparing this
16
+ # information may speed up searches later.
22
17
  @lib_dirs = {}
18
+
23
19
  @gemspecs.each do |spec|
24
- @lib_dirs[spec.object_id] = lib_dirs_for(spec)
20
+ @lib_dirs[spec.object_id] = lib_dirs_for spec
25
21
  end
26
22
  end
27
23
 
@@ -72,6 +68,7 @@ class Gem::GemPathSearcher
72
68
  # Some of the intermediate results are cached in @lib_dirs for speed.
73
69
 
74
70
  def matching_files(spec, path)
71
+ return [] unless @lib_dirs[spec.object_id] # case no paths
75
72
  glob = File.join @lib_dirs[spec.object_id], "#{path}#{Gem.suffix_pattern}"
76
73
  Dir[glob].select { |f| File.file? f.untaint }
77
74
  end
@@ -95,7 +92,8 @@ class Gem::GemPathSearcher
95
92
  # '/usr/local/lib/ruby/gems/1.8/gems/foobar-1.0/{lib,ext}'
96
93
 
97
94
  def lib_dirs_for(spec)
98
- "#{spec.full_gem_path}/{#{spec.require_paths.join(',')}}"
95
+ "#{spec.full_gem_path}/{#{spec.require_paths.join(',')}}" if
96
+ spec.require_paths
99
97
  end
100
98
 
101
99
  end
@@ -0,0 +1,49 @@
1
+ require 'net/http'
2
+ require 'rubygems/remote_fetcher'
3
+
4
+ module Gem::GemcutterUtilities
5
+
6
+ def sign_in
7
+ return if Gem.configuration.rubygems_api_key
8
+
9
+ say "Enter your RubyGems.org credentials."
10
+ say "Don't have an account yet? Create one at http://rubygems.org/sign_up"
11
+
12
+ email = ask " Email: "
13
+ password = ask_for_password "Password: "
14
+ say "\n"
15
+
16
+ response = rubygems_api_request :get, "api/v1/api_key" do |request|
17
+ request.basic_auth email, password
18
+ end
19
+
20
+ with_response response do |resp|
21
+ say "Signed in."
22
+ Gem.configuration.rubygems_api_key = resp.body
23
+ end
24
+ end
25
+
26
+ def rubygems_api_request(method, path, &block)
27
+ host = ENV['RUBYGEMS_HOST'] || 'https://rubygems.org'
28
+ uri = URI.parse "#{host}/#{path}"
29
+
30
+ request_method = Net::HTTP.const_get method.to_s.capitalize
31
+
32
+ Gem::RemoteFetcher.fetcher.request(uri, request_method, &block)
33
+ end
34
+
35
+ def with_response(resp)
36
+ case resp
37
+ when Net::HTTPSuccess then
38
+ if block_given? then
39
+ yield resp
40
+ else
41
+ say resp.body
42
+ end
43
+ else
44
+ say resp.body
45
+ terminate_interaction 1
46
+ end
47
+ end
48
+
49
+ end
@@ -58,7 +58,7 @@ class Gem::Indexer
58
58
 
59
59
  def initialize(directory, options = {})
60
60
  unless ''.respond_to? :to_xs then
61
- fail "Gem::Indexer requires that the XML Builder library be installed:" \
61
+ raise "Gem::Indexer requires that the XML Builder library be installed:" \
62
62
  "\n\tgem install builder"
63
63
  end
64
64
 
@@ -350,7 +350,7 @@ class Gem::Indexer
350
350
  end
351
351
 
352
352
  index.sort_by { |_, spec| [-spec.date.to_i, spec] }.each do |_, spec|
353
- gem_path = CGI.escapeHTML "http://#{@rss_gems_host}/gems/#{spec.full_name}.gem"
353
+ gem_path = CGI.escapeHTML "http://#{@rss_gems_host}/gems/#{spec.file_name}"
354
354
  size = File.stat(spec.loaded_from).size rescue next
355
355
 
356
356
  description = spec.description || spec.summary || ''
@@ -95,8 +95,7 @@ module Gem::InstallUpdateOptions
95
95
 
96
96
  add_option(:"Install/Update", '--[no-]user-install',
97
97
  'Install in user\'s home directory instead',
98
- 'of GEM_HOME. Defaults to using home',
99
- 'only if GEM_HOME is not writable.') do |value, options|
98
+ 'of GEM_HOME.') do |value, options|
100
99
  options[:user_install] = value
101
100
  end
102
101
 
@@ -105,13 +104,6 @@ module Gem::InstallUpdateOptions
105
104
  "dependencies") do |value, options|
106
105
  options[:development] = true
107
106
  end
108
-
109
- add_option(:"Install/Update", "--prerelease",
110
- "Install prerelease versions of a gem if",
111
- "available. Defaults to skipping",
112
- "prereleases.") do |value, options|
113
- options[:prerelease] = true
114
- end
115
107
  end
116
108
 
117
109
  ##
@@ -5,7 +5,6 @@
5
5
  #++
6
6
 
7
7
  require 'fileutils'
8
- require 'pathname'
9
8
  require 'rbconfig'
10
9
 
11
10
  require 'rubygems/format'
@@ -28,6 +27,12 @@ require 'rubygems/require_paths_builder'
28
27
 
29
28
  class Gem::Installer
30
29
 
30
+ ##
31
+ # Paths where env(1) might live. Some systems are broken and have it in
32
+ # /bin
33
+
34
+ ENV_PATHS = %w[/usr/bin/env /bin/env]
35
+
31
36
  ##
32
37
  # Raised when there is an error while building extensions.
33
38
  #
@@ -52,16 +57,10 @@ class Gem::Installer
52
57
 
53
58
  attr_reader :spec
54
59
 
55
- @home_install_warning = false
56
60
  @path_warning = false
57
61
 
58
62
  class << self
59
63
 
60
- ##
61
- # True if we've warned about ~/.gems install
62
-
63
- attr_accessor :home_install_warning
64
-
65
64
  ##
66
65
  # True if we've warned about PATH not including Gem.bindir
67
66
 
@@ -106,7 +105,7 @@ class Gem::Installer
106
105
  @env_shebang = options[:env_shebang]
107
106
  @force = options[:force]
108
107
  gem_home = options[:install_dir]
109
- @gem_home = Pathname.new(gem_home).expand_path
108
+ @gem_home = File.expand_path(gem_home)
110
109
  @ignore_dependencies = options[:ignore_dependencies]
111
110
  @format_executable = options[:format_executable]
112
111
  @security_policy = options[:security_policy]
@@ -121,27 +120,6 @@ class Gem::Installer
121
120
  raise Gem::InstallError, "invalid gem format for #{@gem}"
122
121
  end
123
122
 
124
- begin
125
- FileUtils.mkdir_p @gem_home
126
- rescue Errno::EACCES, Errno::ENOTDIR
127
- # We'll divert to ~/.gems below
128
- end
129
-
130
- if not File.writable? @gem_home or
131
- # TODO: Shouldn't have to test for existence of bindir; tests need it.
132
- (@gem_home.to_s == Gem.dir and File.exist? Gem.bindir and
133
- not File.writable? Gem.bindir) then
134
- if options[:user_install] == false then # You don't want to use ~
135
- raise Gem::FilePermissionError, @gem_home
136
- elsif options[:user_install].nil? then
137
- unless self.class.home_install_warning or options[:unpack] then
138
- alert_warning "Installing to ~/.gem since #{@gem_home} and\n\t #{Gem.bindir} aren't both writable."
139
- self.class.home_install_warning = true
140
- end
141
- end
142
- options[:user_install] = true
143
- end
144
-
145
123
  if options[:user_install] and not options[:unpack] then
146
124
  @gem_home = Gem.user_dir
147
125
 
@@ -152,12 +130,11 @@ class Gem::Installer
152
130
  self.class.path_warning = true
153
131
  end
154
132
  end
155
-
156
- FileUtils.mkdir_p @gem_home unless File.directory? @gem_home
157
- # If it's still not writable, you've got issues.
158
- raise Gem::FilePermissionError, @gem_home unless File.writable? @gem_home
159
133
  end
160
134
 
135
+ FileUtils.mkdir_p @gem_home
136
+ raise Gem::FilePermissionError, @gem_home unless File.writable? @gem_home
137
+
161
138
  @spec = @format.spec
162
139
 
163
140
  @gem_dir = File.join(@gem_home, "gems", @spec.full_name).untaint
@@ -183,14 +160,15 @@ class Gem::Installer
183
160
  unless @force then
184
161
  if rrv = @spec.required_ruby_version then
185
162
  unless rrv.satisfied_by? Gem.ruby_version then
186
- raise Gem::InstallError, "#{@spec.name} requires Ruby version #{rrv}"
163
+ raise Gem::InstallError, "#{@spec.name} requires Ruby version #{rrv}."
187
164
  end
188
165
  end
189
166
 
190
167
  if rrgv = @spec.required_rubygems_version then
191
168
  unless rrgv.satisfied_by? Gem::Version.new(Gem::RubyGemsVersion) then
192
169
  raise Gem::InstallError,
193
- "#{@spec.name} requires RubyGems version #{rrgv}"
170
+ "#{@spec.name} requires RubyGems version #{rrgv}. " +
171
+ "Try 'gem update --system' to update RubyGems itself."
194
172
  end
195
173
  end
196
174
 
@@ -229,8 +207,7 @@ class Gem::Installer
229
207
 
230
208
  say @spec.post_install_message unless @spec.post_install_message.nil?
231
209
 
232
- @spec.loaded_from = File.join(@gem_home, 'specifications',
233
- "#{@spec.full_name}.gemspec")
210
+ @spec.loaded_from = File.join(@gem_home, 'specifications', @spec.spec_name)
234
211
 
235
212
  @source_index.add_spec @spec
236
213
 
@@ -262,7 +239,7 @@ class Gem::Installer
262
239
  # True if the gems in the source_index satisfy +dependency+.
263
240
 
264
241
  def installation_satisfies_dependency?(dependency)
265
- @source_index.find_name(dependency.name, dependency.version_requirements).size > 0
242
+ @source_index.find_name(dependency.name, dependency.requirement).size > 0
266
243
  end
267
244
 
268
245
  ##
@@ -281,8 +258,7 @@ class Gem::Installer
281
258
  def write_spec
282
259
  rubycode = @spec.to_ruby
283
260
 
284
- file_name = File.join @gem_home, 'specifications',
285
- "#{@spec.full_name}.gemspec"
261
+ file_name = File.join @gem_home, 'specifications', @spec.spec_name
286
262
 
287
263
  file_name.untaint
288
264
 
@@ -392,23 +368,25 @@ class Gem::Installer
392
368
  # necessary.
393
369
 
394
370
  def shebang(bin_file_name)
395
- if @env_shebang then
396
- "#!/usr/bin/env " + Gem::ConfigMap[:ruby_install_name]
397
- else
398
- path = File.join @gem_dir, @spec.bindir, bin_file_name
399
-
400
- File.open(path, "rb") do |file|
401
- first_line = file.gets
402
- if first_line =~ /^#!/ then
403
- # Preserve extra words on shebang line, like "-w". Thanks RPA.
404
- shebang = first_line.sub(/\A\#!.*?ruby\S*/, "#!#{Gem.ruby}")
405
- else
406
- # Create a plain shebang line.
407
- shebang = "#!#{Gem.ruby}"
408
- end
371
+ ruby_name = Gem::ConfigMap[:ruby_install_name] if @env_shebang
372
+ path = File.join @gem_dir, @spec.bindir, bin_file_name
373
+ first_line = File.open(path, "rb") {|file| file.gets}
374
+
375
+ if /\A#!/ =~ first_line then
376
+ # Preserve extra words on shebang line, like "-w". Thanks RPA.
377
+ shebang = first_line.sub(/\A\#!.*?ruby\S*(?=(\s+\S+))/, "#!#{Gem.ruby}")
378
+ opts = $1
379
+ shebang.strip! # Avoid nasty ^M issues.
380
+ end
409
381
 
410
- shebang.strip # Avoid nasty ^M issues.
411
- end
382
+ if not ruby_name then
383
+ "#!#{Gem.ruby}#{opts}"
384
+ elsif opts then
385
+ "#!/bin/sh\n'exec' #{ruby_name.dump} '-x' \"$0\" \"$@\"\n#{shebang}"
386
+ else
387
+ # Create a plain shebang line.
388
+ @env_path ||= ENV_PATHS.find {|env_path| File.executable? env_path }
389
+ "#!#{@env_path} #{ruby_name}"
412
390
  end
413
391
  end
414
392
 
@@ -514,7 +492,7 @@ Results logged to #{File.join(Dir.pwd, 'gem_make.out')}
514
492
  # Ensures that files can't be installed outside the gem directory.
515
493
 
516
494
  def extract_files
517
- expand_and_validate_gem_dir
495
+ @gem_dir = File.expand_path @gem_dir
518
496
 
519
497
  raise ArgumentError, "format required to extract from" if @format.nil?
520
498
 
@@ -558,24 +536,5 @@ Results logged to #{File.join(Dir.pwd, 'gem_make.out')}
558
536
  end
559
537
  end
560
538
 
561
- private
562
-
563
- ##
564
- # HACK Pathname is broken on windows.
565
-
566
- def absolute_path? pathname
567
- pathname.absolute? or (Gem.win_platform? and pathname.to_s =~ /\A[a-z]:/i)
568
- end
569
-
570
- def expand_and_validate_gem_dir
571
- @gem_dir = Pathname.new(@gem_dir).expand_path
572
-
573
- unless absolute_path?(@gem_dir) then # HACK is this possible after #expand_path?
574
- raise ArgumentError, "install directory %p not absolute" % @gem_dir
575
- end
576
-
577
- @gem_dir = @gem_dir.to_s
578
- end
579
-
580
539
  end
581
540