diff options
Diffstat (limited to 'trunk/lib/rubygems/commands/unpack_command.rb')
-rw-r--r-- | trunk/lib/rubygems/commands/unpack_command.rb | 95 |
1 files changed, 0 insertions, 95 deletions
diff --git a/trunk/lib/rubygems/commands/unpack_command.rb b/trunk/lib/rubygems/commands/unpack_command.rb deleted file mode 100644 index d187f8a9ea..0000000000 --- a/trunk/lib/rubygems/commands/unpack_command.rb +++ /dev/null @@ -1,95 +0,0 @@ -require 'fileutils' -require 'rubygems/command' -require 'rubygems/installer' -require 'rubygems/version_option' - -class Gem::Commands::UnpackCommand < Gem::Command - - include Gem::VersionOption - - def initialize - super 'unpack', 'Unpack an installed gem to the current directory', - :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 - - def arguments # :nodoc: - "GEMNAME name of gem to unpack" - end - - def defaults_str # :nodoc: - "--version '#{Gem::Requirement.default}'" - end - - def usage # :nodoc: - "#{program_name} GEMNAME" - end - - #-- - # TODO: allow, e.g., 'gem unpack rake-0.3.1'. Find a general solution for - # this, so that it works for uninstall as well. (And check other commands - # at the same time.) - def execute - gemname = get_one_gem_name - path = get_path(gemname, options[:version]) - - 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 target_dir - say "Unpacked gem: '#{target_dir}'" - else - alert_error "Gem '#{gemname}' not installed." - end - end - - # Return the full path to the cached gem file matching the given - # name and version requirement. Returns 'nil' if no match. - # - # Example: - # - # get_path('rake', '> 0.4') # -> '/usr/lib/ruby/gems/1.8/cache/rake-0.4.2.gem' - # get_path('rake', '< 0.1') # -> nil - # get_path('rak') # -> nil (exact name required) - #-- - # TODO: This should be refactored so that it's a general service. I don't - # think any of our existing classes are the right place though. Just maybe - # 'Cache'? - # - # TODO: It just uses Gem.dir for now. What's an easy way to get the list of - # source directories? - def get_path(gemname, version_req) - return gemname if gemname =~ /\.gem$/i - - specs = Gem::source_index.search(/\A#{gemname}\z/, version_req) - - selected = specs.sort_by { |s| s.version }.last - - return nil if selected.nil? - - # We expect to find (basename).gem in the 'cache' directory. - # Furthermore, the name match must be exact (ignoring case). - if gemname =~ /^#{selected.name}$/i - filename = selected.full_name + '.gem' - path = nil - - Gem.path.find do |gem_dir| - path = File.join gem_dir, 'cache', filename - File.exist? path - end - - path - else - nil - end - end - -end - |