aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rubygems/commands
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rubygems/commands')
-rw-r--r--lib/rubygems/commands/install_command.rb2
-rw-r--r--lib/rubygems/commands/mirror_command.rb10
-rw-r--r--lib/rubygems/commands/query_command.rb4
-rw-r--r--lib/rubygems/commands/server_command.rb6
-rw-r--r--lib/rubygems/commands/unpack_command.rb15
-rw-r--r--lib/rubygems/commands/update_command.rb222
6 files changed, 141 insertions, 118 deletions
diff --git a/lib/rubygems/commands/install_command.rb b/lib/rubygems/commands/install_command.rb
index 4c67c0487b..aa9f480c2a 100644
--- a/lib/rubygems/commands/install_command.rb
+++ b/lib/rubygems/commands/install_command.rb
@@ -17,6 +17,7 @@ class Gem::Commands::InstallCommand < Gem::Command
:generate_rdoc => true,
:generate_ri => true,
:install_dir => Gem.dir,
+ :format_executable => false,
:test => false,
:version => Gem::Requirement.default,
})
@@ -56,6 +57,7 @@ class Gem::Commands::InstallCommand < Gem::Command
:env_shebang => options[:env_shebang],
:domain => options[:domain],
:force => options[:force],
+ :format_executable => options[:format_executable],
:ignore_dependencies => options[:ignore_dependencies],
:install_dir => options[:install_dir],
:security_policy => options[:security_policy],
diff --git a/lib/rubygems/commands/mirror_command.rb b/lib/rubygems/commands/mirror_command.rb
index 74f6970e9e..fc4f086ad3 100644
--- a/lib/rubygems/commands/mirror_command.rb
+++ b/lib/rubygems/commands/mirror_command.rb
@@ -60,10 +60,16 @@ Multiple sources and destinations may be specified.
if get_from.scheme.nil? then
get_from = get_from.to_s
elsif get_from.scheme == 'file' then
- get_from = get_from.to_s[5..-1]
+ # check if specified URI contains a drive letter (file:/D:/Temp)
+ get_from = get_from.to_s
+ get_from = if get_from =~ /^file:.*[a-z]:/i then
+ get_from[6..-1]
+ else
+ get_from[5..-1]
+ end
end
- open File.join(get_from, "Marshal.#{Gem.marshal_version}.Z"), "rb" do |y|
+ open File.join(get_from.to_s, "Marshal.#{Gem.marshal_version}.Z"), "rb" do |y|
sourceindex_data = Zlib::Inflate.inflate y.read
open File.join(save_to, "Marshal.#{Gem.marshal_version}"), "wb" do |out|
out.write sourceindex_data
diff --git a/lib/rubygems/commands/query_command.rb b/lib/rubygems/commands/query_command.rb
index 581d4bb734..4f957625ee 100644
--- a/lib/rubygems/commands/query_command.rb
+++ b/lib/rubygems/commands/query_command.rb
@@ -82,8 +82,10 @@ class Gem::Commands::QueryCommand < Gem::Command
end
entry = gem_name.dup
+
if options[:versions] then
- entry << " (#{list_of_matching.map{|gem| gem.version.to_s}.join(", ")})"
+ versions = list_of_matching.map { |s| s.version }.uniq
+ entry << " (#{versions.join ', '})"
end
entry << "\n" << format_text(list_of_matching[0].summary, 68, 4) if
diff --git a/lib/rubygems/commands/server_command.rb b/lib/rubygems/commands/server_command.rb
index 34e5e46fec..992ae1c8f8 100644
--- a/lib/rubygems/commands/server_command.rb
+++ b/lib/rubygems/commands/server_command.rb
@@ -7,17 +7,17 @@ class Gem::Commands::ServerCommand < Gem::Command
super 'server', 'Documentation and gem repository HTTP server',
:port => 8808, :gemdir => Gem.dir, :daemon => false
- add_option '-p', '--port=PORT',
+ add_option '-p', '--port=PORT', Integer,
'port to listen on' do |port, options|
options[:port] = port
end
add_option '-d', '--dir=GEMDIR',
'directory from which to serve gems' do |gemdir, options|
- options[:gemdir] = gemdir
+ options[:gemdir] = File.expand_path gemdir
end
- add_option '--[no]-daemon', 'run as a daemon' do |daemon, options|
+ add_option '--[no-]daemon', 'run as a daemon' do |daemon, options|
options[:daemon] = daemon
end
end
diff --git a/lib/rubygems/commands/unpack_command.rb b/lib/rubygems/commands/unpack_command.rb
index ece24745a2..23ebabc21a 100644
--- a/lib/rubygems/commands/unpack_command.rb
+++ b/lib/rubygems/commands/unpack_command.rb
@@ -9,7 +9,13 @@ class Gem::Commands::UnpackCommand < Gem::Command
def initialize
super 'unpack', 'Unpack an installed gem to the current directory',
- :version => Gem::Requirement.default
+ :version => Gem::Requirement.default,
+ :target => Dir.pwd
+
+ add_option('--target', 'target directory for unpacking') do |value, options|
+ options[:target] = value
+ end
+
add_version_option
end
@@ -32,10 +38,11 @@ class Gem::Commands::UnpackCommand < Gem::Command
def execute
gemname = get_one_gem_name
path = get_path(gemname, options[:version])
- if path
- target_dir = File.basename(path).sub(/\.gem$/, '')
+ if path then
+ basename = File.basename(path).sub(/\.gem$/, '')
+ target_dir = File.expand_path File.join(options[:target], basename)
FileUtils.mkdir_p target_dir
- Gem::Installer.new(path).unpack(File.expand_path(target_dir))
+ Gem::Installer.new(path).unpack target_dir
say "Unpacked gem: '#{target_dir}'"
else
alert_error "Gem '#{gemname}' not installed."
diff --git a/lib/rubygems/commands/update_command.rb b/lib/rubygems/commands/update_command.rb
index e17ba2516a..7a11ec9554 100644
--- a/lib/rubygems/commands/update_command.rb
+++ b/lib/rubygems/commands/update_command.rb
@@ -4,146 +4,152 @@ require 'rubygems/local_remote_options'
require 'rubygems/source_info_cache'
require 'rubygems/version_option'
-module Gem
- module Commands
- class UpdateCommand < Command
+class Gem::Commands::UpdateCommand < Gem::Command
- include Gem::InstallUpdateOptions
- include Gem::LocalRemoteOptions
- include Gem::VersionOption
+ include Gem::InstallUpdateOptions
+ include Gem::LocalRemoteOptions
+ include Gem::VersionOption
- def initialize
- super(
- 'update',
+ def initialize
+ super 'update',
'Update the named gems (or all installed gems) in the local repository',
- {
- :generate_rdoc => true,
- :generate_ri => true,
- :force => false,
- :test => false,
- :install_dir => Gem.dir
- })
-
- add_install_update_options
-
- add_option('--system',
- 'Update the RubyGems system software') do |value, options|
- options[:system] = value
- end
+ :generate_rdoc => true,
+ :generate_ri => true,
+ :force => false,
+ :test => false,
+ :install_dir => Gem.dir
- add_local_remote_options
+ add_install_update_options
- add_platform_option
- end
+ add_option('--system',
+ 'Update the RubyGems system software') do |value, options|
+ options[:system] = value
+ end
- def arguments # :nodoc:
- "GEMNAME name of gem to update"
- end
+ add_local_remote_options
- def defaults_str # :nodoc:
- "--rdoc --ri --no-force --no-test\n" +
- "--install-dir #{Gem.dir}"
- end
+ add_platform_option
+ end
+
+ def arguments # :nodoc:
+ "GEMNAME name of gem to update"
+ end
- def usage # :nodoc:
- "#{program_name} GEMNAME [GEMNAME ...]"
+ def defaults_str # :nodoc:
+ "--rdoc --ri --no-force --no-test --install-dir #{Gem.dir}"
+ end
+
+ def usage # :nodoc:
+ "#{program_name} GEMNAME [GEMNAME ...]"
+ end
+
+ def execute
+ if options[:system] then
+ say "Updating RubyGems..."
+
+ unless options[:args].empty? then
+ fail "No gem names are allowed with the --system option"
end
- def execute
- if options[:system] then
- say "Updating RubyGems..."
+ options[:args] = ["rubygems-update"]
+ else
+ say "Updating installed gems..."
+ end
- unless options[:args].empty? then
- fail "No gem names are allowed with the --system option"
- end
+ hig = highest_installed_gems = {}
- options[:args] = ["rubygems-update"]
- else
- say "Updating installed gems..."
- end
+ Gem::SourceIndex.from_installed_gems.each do |name, spec|
+ if hig[spec.name].nil? or hig[spec.name].version < spec.version then
+ hig[spec.name] = spec
+ end
+ end
- hig = highest_installed_gems = {}
+ remote_gemspecs = Gem::SourceInfoCache.search(//)
- Gem::SourceIndex.from_installed_gems.each do |name, spec|
- if hig[spec.name].nil? or hig[spec.name].version < spec.version
- hig[spec.name] = spec
- end
- end
+ gems_to_update = if options[:args].empty? then
+ which_to_update(highest_installed_gems, remote_gemspecs)
+ else
+ options[:args]
+ end
- remote_gemspecs = Gem::SourceInfoCache.search(//)
+ options[:domain] = :remote # install from remote source
- gems_to_update = if options[:args].empty? then
- which_to_update(highest_installed_gems, remote_gemspecs)
- else
- options[:args]
- end
+ # HACK use the real API
+ install_command = Gem::CommandManager.instance['install']
- options[:domain] = :remote # install from remote source
+ gems_to_update.uniq.sort.each do |name|
+ say "Attempting remote update of #{name}"
+ options[:args] = [name]
+ options[:ignore_dependencies] = true # HACK skip seen gems instead
+ install_command.merge_options(options)
+ install_command.execute
+ end
- # HACK use the real API
- install_command = Gem::CommandManager.instance['install']
+ if gems_to_update.include? "rubygems-update" then
+ latest_ruby_gem = remote_gemspecs.select do |s|
+ s.name == 'rubygems-update'
+ end
- gems_to_update.uniq.sort.each do |name|
- say "Attempting remote update of #{name}"
- options[:args] = [name]
- options[:ignore_dependencies] = true # HACK skip seen gems instead
- install_command.merge_options(options)
- install_command.execute
- end
+ latest_ruby_gem = latest_ruby_gem.sort_by { |s| s.version }.last
- if gems_to_update.include?("rubygems-update") then
- latest_ruby_gem = remote_gemspecs.select { |s|
- s.name == 'rubygems-update'
- }.sort_by { |s|
- s.version
- }.last
+ say "Updating version of RubyGems to #{latest_ruby_gem.version}"
+ installed = do_rubygems_update latest_ruby_gem.version
- say "Updating version of RubyGems to #{latest_ruby_gem.version}"
- installed = do_rubygems_update(latest_ruby_gem.version.to_s)
+ say "RubyGems system software updated" if installed
+ else
+ updated = gems_to_update.uniq.sort.collect { |g| g.to_s }
- say "RubyGems system software updated" if installed
- else
- say "Gems: [#{gems_to_update.uniq.sort.collect{|g| g.to_s}.join(', ')}] updated"
- end
+ if updated.empty? then
+ say "Nothing to update"
+ else
+ say "Gems updated: #{updated.join ', '}"
end
+ end
+ end
- def do_rubygems_update(version_string)
- args = []
- args.push '--prefix', Gem.prefix unless Gem.prefix.nil?
- args << '--no-rdoc' unless options[:generate_rdoc]
- args << '--no-ri' unless options[:generate_ri]
+ def do_rubygems_update(version)
+ args = []
+ args.push '--prefix', Gem.prefix unless Gem.prefix.nil?
+ args << '--no-rdoc' unless options[:generate_rdoc]
+ args << '--no-ri' unless options[:generate_ri]
- update_dir = File.join(Gem.dir, 'gems',
- "rubygems-update-#{version_string}")
+ update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
- success = false
+ success = false
- Dir.chdir update_dir do
- say "Installing RubyGems #{version_string}"
- setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}"
+ Dir.chdir update_dir do
+ say "Installing RubyGems #{version}"
+ setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}"
- # Make sure old rubygems isn't loaded
- if Gem.win_platform? then
- system "set RUBYOPT= & #{setup_cmd}"
- else
- system "RUBYOPT=\"\" #{setup_cmd}"
- end
- end
+ # Make sure old rubygems isn't loaded
+ if Gem.win_platform? then
+ system "set RUBYOPT= & #{setup_cmd}"
+ else
+ system "RUBYOPT=\"\" #{setup_cmd}"
end
+ end
+ end
+
+ def which_to_update(highest_installed_gems, remote_gemspecs)
+ result = []
- def which_to_update(highest_installed_gems, remote_gemspecs)
- result = []
- highest_installed_gems.each do |l_name, l_spec|
- highest_remote_gem =
- remote_gemspecs.select { |spec| spec.name == l_name }.
- sort_by { |spec| spec.version }.
- last
- if highest_remote_gem and l_spec.version < highest_remote_gem.version
- result << l_name
- end
+ highest_installed_gems.each do |l_name, l_spec|
+ matching_gems = remote_gemspecs.select do |spec|
+ spec.name == l_name and Gem.platforms.any? do |platform|
+ platform == spec.platform
end
- result
+ end
+
+ highest_remote_gem = matching_gems.sort_by { |spec| spec.version }.last
+
+ if highest_remote_gem and
+ l_spec.version < highest_remote_gem.version then
+ result << l_name
end
end
+
+ result
end
+
end
+