rubygems-update 1.3.6 → 1.3.7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (80) hide show
  1. data.tar.gz.sig +0 -0
  2. data/ChangeLog +86 -0
  3. data/History.txt +34 -1
  4. data/Manifest.txt +6 -1
  5. data/Rakefile +79 -34
  6. data/lib/rubygems.rb +52 -30
  7. data/lib/rubygems/builder.rb +2 -0
  8. data/lib/rubygems/command.rb +12 -0
  9. data/lib/rubygems/command_manager.rb +17 -12
  10. data/lib/rubygems/commands/contents_command.rb +1 -1
  11. data/lib/rubygems/commands/dependency_command.rb +3 -1
  12. data/lib/rubygems/commands/environment_command.rb +3 -2
  13. data/lib/rubygems/commands/fetch_command.rb +7 -3
  14. data/lib/rubygems/commands/install_command.rb +2 -1
  15. data/lib/rubygems/commands/query_command.rb +16 -3
  16. data/lib/rubygems/commands/server_command.rb +5 -3
  17. data/lib/rubygems/commands/setup_command.rb +1 -1
  18. data/lib/rubygems/commands/unpack_command.rb +35 -23
  19. data/lib/rubygems/commands/update_command.rb +1 -1
  20. data/lib/rubygems/defaults.rb +4 -6
  21. data/lib/rubygems/dependency.rb +32 -6
  22. data/lib/rubygems/dependency_installer.rb +10 -3
  23. data/lib/rubygems/doc_manager.rb +5 -2
  24. data/lib/rubygems/errors.rb +35 -0
  25. data/lib/rubygems/exceptions.rb +10 -1
  26. data/lib/rubygems/indexer.rb +1 -1
  27. data/lib/rubygems/installer.rb +6 -5
  28. data/lib/rubygems/package.rb +6 -3
  29. data/lib/rubygems/package/f_sync_dir.rb +4 -3
  30. data/lib/rubygems/package/tar_header.rb +4 -3
  31. data/lib/rubygems/package/tar_output.rb +4 -3
  32. data/lib/rubygems/package/tar_reader.rb +4 -3
  33. data/lib/rubygems/package/tar_writer.rb +4 -3
  34. data/lib/rubygems/package_task.rb +4 -3
  35. data/lib/rubygems/platform.rb +4 -1
  36. data/lib/rubygems/remote_fetcher.rb +9 -3
  37. data/lib/rubygems/requirement.rb +5 -0
  38. data/lib/rubygems/security.rb +3 -3
  39. data/lib/rubygems/server.rb +33 -18
  40. data/lib/rubygems/source_index.rb +4 -4
  41. data/lib/rubygems/source_info_cache.rb +4 -2
  42. data/lib/rubygems/spec_fetcher.rb +33 -11
  43. data/lib/rubygems/specification.rb +40 -32
  44. data/lib/rubygems/test_utilities.rb +2 -2
  45. data/lib/rubygems/validator.rb +3 -4
  46. data/lib/rubygems/version.rb +1 -1
  47. data/test/gem_package_tar_test_case.rb +2 -2
  48. data/test/gemutilities.rb +15 -9
  49. data/test/insure_session.rb +1 -1
  50. data/test/plugin/exception/rubygems_plugin.rb +2 -0
  51. data/test/plugin/load/rubygems_plugin.rb +1 -0
  52. data/test/plugin/standarderror/rubygems_plugin.rb +2 -0
  53. data/test/rubygems/commands/crash_command.rb +5 -0
  54. data/test/rubygems_plugin.rb +5 -0
  55. data/test/simple_gem.rb +15 -15
  56. data/test/test_gem.rb +45 -2
  57. data/test/test_gem_command_manager.rb +14 -0
  58. data/test/test_gem_commands_contents_command.rb +7 -5
  59. data/test/test_gem_commands_environment_command.rb +3 -1
  60. data/test/test_gem_commands_fetch_command.rb +21 -1
  61. data/test/test_gem_commands_install_command.rb +2 -4
  62. data/test/test_gem_commands_query_command.rb +33 -6
  63. data/test/test_gem_commands_server_command.rb +9 -2
  64. data/test/test_gem_commands_uninstall_command.rb +4 -2
  65. data/test/test_gem_commands_unpack_command.rb +46 -2
  66. data/test/test_gem_config_file.rb +2 -0
  67. data/test/test_gem_dependency.rb +11 -0
  68. data/test/test_gem_doc_manager.rb +1 -1
  69. data/test/test_gem_indexer.rb +2 -2
  70. data/test/test_gem_installer.rb +1 -1
  71. data/test/test_gem_package_tar_input.rb +1 -1
  72. data/test/test_gem_package_tar_writer.rb +3 -3
  73. data/test/test_gem_platform.rb +19 -0
  74. data/test/test_gem_server.rb +11 -0
  75. data/test/test_gem_source_index.rb +2 -2
  76. data/test/test_gem_spec_fetcher.rb +42 -0
  77. data/test/test_gem_specification.rb +46 -7
  78. data/util/{gem_prelude.rb.template → gem_prelude.rb} +53 -23
  79. metadata +16 -6
  80. metadata.gz.sig +0 -0
@@ -4,6 +4,8 @@
4
4
  # See LICENSE.txt for permissions.
5
5
  #++
6
6
 
7
+ require 'rubygems/user_interaction'
8
+
7
9
  ##
8
10
  # The Builder class processes RubyGem specification files
9
11
  # to produce a .gem file.
@@ -145,6 +145,18 @@ class Gem::Command
145
145
  raise Gem::Exception, "generic command has no actions"
146
146
  end
147
147
 
148
+ ##
149
+ #
150
+ # Display to the user that a gem couldn't be found and reasons why
151
+ def show_lookup_failure(gem_name, version, errors=nil)
152
+ if errors and !errors.empty?
153
+ alert_error "Could not find a valid gem '#{gem_name}' (#{version}), here is why:"
154
+ errors.each { |x| say " #{x.wordy}" }
155
+ else
156
+ alert_error "Could not find a valid gem '#{gem_name}' (#{version}) in any repository"
157
+ end
158
+ end
159
+
148
160
  ##
149
161
  # Get all gem names from the command line.
150
162
 
@@ -75,10 +75,10 @@ class Gem::CommandManager
75
75
  end
76
76
 
77
77
  ##
78
- # Register the command object.
78
+ # Register the Symbol +command+ as a gem command.
79
79
 
80
- def register_command(command_obj)
81
- @commands[command_obj] = false
80
+ def register_command(command)
81
+ @commands[command] = false
82
82
  end
83
83
 
84
84
  ##
@@ -123,7 +123,7 @@ class Gem::CommandManager
123
123
  say Gem::Command::HELP
124
124
  terminate_interaction(0)
125
125
  when '-v', '--version'
126
- say Gem::RubyGemsVersion
126
+ say Gem::VERSION
127
127
  terminate_interaction(0)
128
128
  when /^-/
129
129
  alert_error "Invalid option: #{args[0]}. See 'gem --help'."
@@ -156,20 +156,25 @@ class Gem::CommandManager
156
156
 
157
157
  def load_and_instantiate(command_name)
158
158
  command_name = command_name.to_s
159
+ const_name = command_name.capitalize.gsub(/_(.)/) { $1.upcase } << "Command"
160
+ commands = Gem::Commands
159
161
  retried = false
160
162
 
161
163
  begin
162
- const_name = command_name.capitalize.gsub(/_(.)/) { $1.upcase }
163
- Gem::Commands.const_get("#{const_name}Command").new
164
+ commands.const_get const_name
164
165
  rescue NameError
165
- if retried then
166
- raise
167
- else
168
- retried = true
166
+ raise if retried
167
+
168
+ retried = true
169
+ begin
169
170
  require "rubygems/commands/#{command_name}_command"
170
- retry
171
+ rescue Exception => e
172
+ alert_error "Loading command: #{command_name} (#{e.class})\n #{e}"
173
+ ui.errs.puts "\t#{e.backtrace.join "\n\t"}" if
174
+ Gem.configuration.backtrace
171
175
  end
172
- end
176
+ retry
177
+ end.new
173
178
  end
174
179
 
175
180
  end
@@ -7,7 +7,7 @@ class Gem::Commands::ContentsCommand < Gem::Command
7
7
 
8
8
  def initialize
9
9
  super 'contents', 'Display the contents of the installed gems',
10
- :specdirs => [], :lib_only => false
10
+ :specdirs => [], :lib_only => false, :prefix => true
11
11
 
12
12
  add_version_option
13
13
 
@@ -159,7 +159,9 @@ class Gem::Commands::DependencyCommand < Gem::Command
159
159
  response
160
160
  end
161
161
 
162
- # Retuns list of [specification, dep] that are satisfied by spec.
162
+ ##
163
+ # Returns an Array of [specification, dep] that are satisfied by +spec+.
164
+
163
165
  def find_reverse_dependencies(spec)
164
166
  result = []
165
167
 
@@ -69,7 +69,7 @@ lib/rubygems/defaults/operating_system.rb
69
69
  when /^packageversion/ then
70
70
  out << Gem::RubyGemsPackageVersion
71
71
  when /^version/ then
72
- out << Gem::RubyGemsVersion
72
+ out << Gem::VERSION
73
73
  when /^gemdir/, /^gemhome/, /^home/, /^GEM_HOME/ then
74
74
  out << Gem.dir
75
75
  when /^gempath/, /^path/, /^GEM_PATH/ then
@@ -79,7 +79,7 @@ lib/rubygems/defaults/operating_system.rb
79
79
  when nil then
80
80
  out = "RubyGems Environment:\n"
81
81
 
82
- out << " - RUBYGEMS VERSION: #{Gem::RubyGemsVersion}\n"
82
+ out << " - RUBYGEMS VERSION: #{Gem::VERSION}\n"
83
83
 
84
84
  out << " - RUBY VERSION: #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}"
85
85
  out << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
@@ -109,6 +109,7 @@ lib/rubygems/defaults/operating_system.rb
109
109
 
110
110
  out << " - GEM CONFIGURATION:\n"
111
111
  Gem.configuration.each do |name, value|
112
+ value = value.gsub(/./, '*') if name == 'gemcutter_key'
112
113
  out << " - #{name.inspect} => #{value.inspect}\n"
113
114
  end
114
115
 
@@ -34,7 +34,7 @@ class Gem::Commands::FetchCommand < Gem::Command
34
34
 
35
35
  def execute
36
36
  version = options[:version] || Gem::Requirement.default
37
- all = Gem::Requirement.default
37
+ all = Gem::Requirement.default != version
38
38
 
39
39
  gem_names = get_all_gem_names
40
40
 
@@ -42,13 +42,17 @@ class Gem::Commands::FetchCommand < Gem::Command
42
42
  dep = Gem::Dependency.new gem_name, version
43
43
  dep.prerelease = options[:prerelease]
44
44
 
45
- specs_and_sources = Gem::SpecFetcher.fetcher.fetch(dep, false, true,
45
+ specs_and_sources = Gem::SpecFetcher.fetcher.fetch(dep, all, true,
46
46
  dep.prerelease?)
47
47
 
48
+ specs_and_sources, errors =
49
+ Gem::SpecFetcher.fetcher.fetch_with_errors(dep, all, true,
50
+ dep.prerelease?)
51
+
48
52
  spec, source_uri = specs_and_sources.sort_by { |s,| s.version }.last
49
53
 
50
54
  if spec.nil? then
51
- alert_error "Could not find #{gem_name} in any repository"
55
+ show_lookup_failure gem_name, version, errors
52
56
  next
53
57
  end
54
58
 
@@ -127,7 +127,8 @@ to write the specification by hand. For example:
127
127
  alert_error "Error installing #{gem_name}:\n\t#{e.message}"
128
128
  exit_code |= 1
129
129
  rescue Gem::GemNotFoundException => e
130
- alert_error e.message
130
+ show_lookup_failure e.name, e.version, e.errors
131
+
131
132
  exit_code |= 2
132
133
  end
133
134
  end
@@ -21,7 +21,7 @@ class Gem::Commands::QueryCommand < Gem::Command
21
21
  options[:installed] = value
22
22
  end
23
23
 
24
- add_version_option
24
+ add_version_option command, "for use with --installed"
25
25
 
26
26
  add_option('-n', '--name-matches REGEXP',
27
27
  'Name of gem(s) to query on matches the',
@@ -185,8 +185,21 @@ class Gem::Commands::QueryCommand < Gem::Command
185
185
  entry = gem_name.dup
186
186
 
187
187
  if options[:versions] then
188
- versions = matching_tuples.map { |(name, version,_),_| version }.uniq
189
- entry << " (#{versions.join ', '})"
188
+ list = if platforms.empty? or options[:details] then
189
+ matching_tuples.map { |(name, version,_),_| version }.uniq
190
+ else
191
+ platforms.sort.reverse.map do |version, pls|
192
+ if pls == [Gem::Platform::RUBY] then
193
+ version
194
+ else
195
+ ruby = pls.delete Gem::Platform::RUBY
196
+ platform_list = [ruby, *pls.sort].compact
197
+ "#{version} #{platform_list.join ' '}"
198
+ end
199
+ end
200
+ end.join ', '
201
+
202
+ entry << " (#{list})"
190
203
  end
191
204
 
192
205
  if options[:details] then
@@ -5,7 +5,7 @@ class Gem::Commands::ServerCommand < Gem::Command
5
5
 
6
6
  def initialize
7
7
  super 'server', 'Documentation and gem repository HTTP server',
8
- :port => 8808, :gemdir => Gem.dir, :daemon => false
8
+ :port => 8808, :gemdir => [], :daemon => false
9
9
 
10
10
  OptionParser.accept :Port do |port|
11
11
  if port =~ /\A\d+\z/ then
@@ -29,8 +29,9 @@ class Gem::Commands::ServerCommand < Gem::Command
29
29
  end
30
30
 
31
31
  add_option '-d', '--dir=GEMDIR',
32
- 'directory from which to serve gems' do |gemdir, options|
33
- options[:gemdir] = File.expand_path gemdir
32
+ 'directories from which to serve gems',
33
+ 'multiple directories may be provided' do |gemdir, options|
34
+ options[:gemdir] << File.expand_path(gemdir)
34
35
  end
35
36
 
36
37
  add_option '--[no-]daemon', 'run as a daemon' do |daemon, options|
@@ -69,6 +70,7 @@ You can set up a shortcut to gem server documentation using the URL:
69
70
  end
70
71
 
71
72
  def execute
73
+ options[:gemdir] << Gem.dir if options[:gemdir].empty?
72
74
  Gem::Server.run options
73
75
  end
74
76
 
@@ -231,7 +231,7 @@ TEXT
231
231
 
232
232
  def install_rdoc
233
233
  gem_doc_dir = File.join Gem.dir, 'doc'
234
- rubygems_name = "rubygems-#{Gem::RubyGemsVersion}"
234
+ rubygems_name = "rubygems-#{Gem::VERSION}"
235
235
  rubygems_doc_dir = File.join gem_doc_dir, rubygems_name
236
236
 
237
237
  if File.writable? gem_doc_dir and
@@ -12,7 +12,8 @@ class Gem::Commands::UnpackCommand < Gem::Command
12
12
  :version => Gem::Requirement.default,
13
13
  :target => Dir.pwd
14
14
 
15
- add_option('--target=DIR', 'target directory for unpacking') do |value, options|
15
+ add_option('--target=DIR',
16
+ 'target directory for unpacking') do |value, options|
16
17
  options[:target] = value
17
18
  end
18
19
 
@@ -31,6 +32,16 @@ class Gem::Commands::UnpackCommand < Gem::Command
31
32
  "#{program_name} GEMNAME"
32
33
  end
33
34
 
35
+ def download dependency
36
+ found = Gem::SpecFetcher.fetcher.fetch dependency
37
+
38
+ return if found.empty?
39
+
40
+ spec, source_uri = found.first
41
+
42
+ Gem::RemoteFetcher.fetcher.download spec, source_uri
43
+ end
44
+
34
45
  #--
35
46
  # TODO: allow, e.g., 'gem unpack rake-0.3.1'. Find a general solution for
36
47
  # this, so that it works for uninstall as well. (And check other commands
@@ -38,11 +49,12 @@ class Gem::Commands::UnpackCommand < Gem::Command
38
49
 
39
50
  def execute
40
51
  get_all_gem_names.each do |name|
41
- path = get_path name, options[:version]
52
+ dependency = Gem::Dependency.new name, options[:version]
53
+ path = get_path dependency
42
54
 
43
55
  if path then
44
- basename = File.basename(path, '.gem')
45
- target_dir = File.expand_path File.join(options[:target], basename)
56
+ basename = File.basename path, '.gem'
57
+ target_dir = File.expand_path basename, options[:target]
46
58
  FileUtils.mkdir_p target_dir
47
59
  Gem::Installer.new(path, :unpack => true).unpack target_dir
48
60
  say "Unpacked gem: '#{target_dir}'"
@@ -52,14 +64,15 @@ class Gem::Commands::UnpackCommand < Gem::Command
52
64
  end
53
65
  end
54
66
 
67
+ ##
55
68
  # Return the full path to the cached gem file matching the given
56
69
  # name and version requirement. Returns 'nil' if no match.
57
70
  #
58
71
  # Example:
59
72
  #
60
- # get_path('rake', '> 0.4') # -> '/usr/lib/ruby/gems/1.8/cache/rake-0.4.2.gem'
61
- # get_path('rake', '< 0.1') # -> nil
62
- # get_path('rak') # -> nil (exact name required)
73
+ # get_path 'rake', '> 0.4' # "/usr/lib/ruby/gems/1.8/cache/rake-0.4.2.gem"
74
+ # get_path 'rake', '< 0.1' # nil
75
+ # get_path 'rak' # nil (exact name required)
63
76
  #--
64
77
  # TODO: This should be refactored so that it's a general service. I don't
65
78
  # think any of our existing classes are the right place though. Just maybe
@@ -67,30 +80,29 @@ class Gem::Commands::UnpackCommand < Gem::Command
67
80
  #
68
81
  # TODO: It just uses Gem.dir for now. What's an easy way to get the list of
69
82
  # source directories?
70
- def get_path(gemname, version_req)
71
- return gemname if gemname =~ /\.gem$/i
72
83
 
73
- specs = Gem::source_index.find_name gemname, version_req
84
+ def get_path dependency
85
+ return dependency.name if dependency.name =~ /\.gem$/i
86
+
87
+ specs = Gem.source_index.search dependency
74
88
 
75
89
  selected = specs.sort_by { |s| s.version }.last
76
90
 
77
- return nil if selected.nil?
91
+ return download(dependency) if selected.nil?
78
92
 
79
- # We expect to find (basename).gem in the 'cache' directory.
80
- # Furthermore, the name match must be exact (ignoring case).
81
- if gemname =~ /^#{selected.name}$/i
82
- filename = selected.file_name
83
- path = nil
93
+ return unless dependency.name =~ /^#{selected.name}$/i
84
94
 
85
- Gem.path.find do |gem_dir|
86
- path = File.join gem_dir, 'cache', filename
87
- File.exist? path
88
- end
95
+ # We expect to find (basename).gem in the 'cache' directory. Furthermore,
96
+ # the name match must be exact (ignoring case).
97
+ filename = selected.file_name
98
+ path = nil
89
99
 
90
- path
91
- else
92
- nil
100
+ Gem.path.find do |gem_dir|
101
+ path = File.join gem_dir, 'cache', filename
102
+ File.exist? path
93
103
  end
104
+
105
+ path
94
106
  end
95
107
 
96
108
  end
@@ -56,7 +56,7 @@ class Gem::Commands::UpdateCommand < Gem::Command
56
56
 
57
57
  rubygems_update = Gem::Specification.new
58
58
  rubygems_update.name = 'rubygems-update'
59
- rubygems_update.version = Gem::Version.new Gem::RubyGemsVersion
59
+ rubygems_update.version = Gem::Version.new Gem::VERSION
60
60
  hig['rubygems-update'] = rubygems_update
61
61
 
62
62
  options[:user_install] = false
@@ -20,9 +20,8 @@ module Gem
20
20
  if defined? RUBY_FRAMEWORK_VERSION then
21
21
  File.join File.dirname(ConfigMap[:sitedir]), 'Gems',
22
22
  ConfigMap[:ruby_version]
23
- # 1.9.2dev reverted to 1.8 style path
24
- elsif RUBY_VERSION > '1.9' and RUBY_VERSION < '1.9.2' then
25
- File.join(ConfigMap[:libdir], ConfigMap[:ruby_install_name], 'gems',
23
+ elsif ConfigMap[:rubylibprefix] then
24
+ File.join(ConfigMap[:rubylibprefix], 'gems',
26
25
  ConfigMap[:ruby_version])
27
26
  else
28
27
  File.join(ConfigMap[:libdir], ruby_engine, 'gems',
@@ -34,15 +33,14 @@ module Gem
34
33
  # Path for gems in the user's home directory
35
34
 
36
35
  def self.user_dir
37
- File.join(Gem.user_home, '.gem', ruby_engine,
38
- ConfigMap[:ruby_version])
36
+ File.join Gem.user_home, '.gem', ruby_engine, ConfigMap[:ruby_version]
39
37
  end
40
38
 
41
39
  ##
42
40
  # Default gem load path
43
41
 
44
42
  def self.default_path
45
- if File.exist?(Gem.user_home)
43
+ if File.exist? Gem.user_home then
46
44
  [user_dir, default_dir]
47
45
  else
48
46
  [default_dir]
@@ -68,9 +68,6 @@ class Gem::Dependency
68
68
  @version_requirements = @requirement
69
69
  end
70
70
 
71
- ##
72
- # What does this dependency require?
73
-
74
71
  ##
75
72
  # A dependency's hash is the XOR of the hashes of +name+, +type+,
76
73
  # and +requirement+.
@@ -106,6 +103,9 @@ class Gem::Dependency
106
103
  end
107
104
  end
108
105
 
106
+ ##
107
+ # What does this dependency require?
108
+
109
109
  def requirement
110
110
  return @requirement if defined?(@requirement) and @requirement
111
111
 
@@ -160,7 +160,16 @@ class Gem::Dependency
160
160
  __requirement
161
161
  end
162
162
 
163
- alias_method :version_requirement, :version_requirements
163
+ alias version_requirement version_requirements # :nodoc:
164
+
165
+ def version_requirements= requirements # :nodoc:
166
+ warn "#{Gem.location_of_caller.join ':'}:Warning: " \
167
+ "Gem::Dependency#version_requirements= is deprecated " \
168
+ "and will be removed on or after August 2010. " \
169
+ "Use Gem::Dependency.new."
170
+
171
+ @requirement = Gem::Requirement.create requirements
172
+ end
164
173
 
165
174
  def == other # :nodoc:
166
175
  Gem::Dependency === other &&
@@ -188,9 +197,12 @@ class Gem::Dependency
188
197
  end
189
198
 
190
199
  pattern = name
191
- pattern = /\A#{Regexp.escape pattern}\Z/ unless Regexp === pattern
192
200
 
193
- return false unless pattern =~ other.name
201
+ if Regexp === pattern then
202
+ return false unless pattern =~ other.name
203
+ else
204
+ return false unless pattern == other.name
205
+ end
194
206
 
195
207
  reqs = other.requirement.requirements
196
208
 
@@ -202,5 +214,19 @@ class Gem::Dependency
202
214
  requirement.satisfied_by? version
203
215
  end
204
216
 
217
+ def match?(spec_name, spec_version)
218
+ pattern = name
219
+
220
+ if Regexp === pattern
221
+ return false unless pattern =~ spec_name
222
+ else
223
+ return false unless pattern == spec_name
224
+ end
225
+
226
+ return true if requirement.none?
227
+
228
+ requirement.satisfied_by? Gem::Version.new(spec_version)
229
+ end
230
+
205
231
  end
206
232