rubygems-update 1.3.6 → 1.3.7

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 (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