diff options
Diffstat (limited to 'lib/rubygems/commands/unpack_command.rb')
-rw-r--r-- | lib/rubygems/commands/unpack_command.rb | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/lib/rubygems/commands/unpack_command.rb b/lib/rubygems/commands/unpack_command.rb index 84a53b107a..8ed99babbe 100644 --- a/lib/rubygems/commands/unpack_command.rb +++ b/lib/rubygems/commands/unpack_command.rb @@ -12,7 +12,8 @@ class Gem::Commands::UnpackCommand < Gem::Command :version => Gem::Requirement.default, :target => Dir.pwd - add_option('--target=DIR', 'target directory for unpacking') do |value, options| + add_option('--target=DIR', + 'target directory for unpacking') do |value, options| options[:target] = value end @@ -31,6 +32,16 @@ class Gem::Commands::UnpackCommand < Gem::Command "#{program_name} GEMNAME" end + def download dependency + found = Gem::SpecFetcher.fetcher.fetch dependency + + return if found.empty? + + spec, source_uri = found.first + + Gem::RemoteFetcher.fetcher.download spec, source_uri + 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 @@ -38,11 +49,12 @@ class Gem::Commands::UnpackCommand < Gem::Command def execute get_all_gem_names.each do |name| - path = get_path name, options[:version] + dependency = Gem::Dependency.new name, options[:version] + path = get_path dependency if path then - basename = File.basename(path, '.gem') - target_dir = File.expand_path File.join(options[:target], basename) + basename = File.basename path, '.gem' + target_dir = File.expand_path basename, options[:target] FileUtils.mkdir_p target_dir Gem::Installer.new(path, :unpack => true).unpack target_dir say "Unpacked gem: '#{target_dir}'" @@ -52,14 +64,15 @@ class Gem::Commands::UnpackCommand < Gem::Command 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) + # 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 @@ -67,30 +80,29 @@ class Gem::Commands::UnpackCommand < Gem::Command # # 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.find_name gemname, version_req + def get_path dependency + return dependency.name if dependency.name =~ /\.gem$/i + + specs = Gem.source_index.search dependency selected = specs.sort_by { |s| s.version }.last - return nil if selected.nil? + return download(dependency) 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.file_name - path = nil + return unless dependency.name =~ /^#{selected.name}$/i - Gem.path.find do |gem_dir| - path = File.join gem_dir, 'cache', filename - File.exist? path - end + # We expect to find (basename).gem in the 'cache' directory. Furthermore, + # the name match must be exact (ignoring case). + filename = selected.file_name + path = nil - path - else - nil + Gem.path.find do |gem_dir| + path = File.join gem_dir, 'cache', filename + File.exist? path end + + path end end |