Class Gem::Commands::MirrorCommand
In: lib/rubygems/commands/mirror_command.rb
Parent: Gem::Command

Methods

execute   new  

Public Class methods

[Source]

    # File lib/rubygems/commands/mirror_command.rb, line 9
 9:   def initialize
10:     super 'mirror', 'Mirror a gem repository'
11:   end

Public Instance methods

[Source]

     # File lib/rubygems/commands/mirror_command.rb, line 28
 28:   def execute
 29:     config_file = File.join Gem.user_home, '.gemmirrorrc'
 30: 
 31:     raise "Config file #{config_file} not found" unless File.exist? config_file
 32: 
 33:     mirrors = YAML.load_file config_file
 34: 
 35:     raise "Invalid config file #{config_file}" unless mirrors.respond_to? :each
 36: 
 37:     mirrors.each do |mir|
 38:       raise "mirror missing 'from' field" unless mir.has_key? 'from'
 39:       raise "mirror missing 'to' field" unless mir.has_key? 'to'
 40: 
 41:       get_from = mir['from']
 42:       save_to = File.expand_path mir['to']
 43: 
 44:       raise "Directory not found: #{save_to}" unless File.exist? save_to
 45:       raise "Not a directory: #{save_to}" unless File.directory? save_to
 46: 
 47:       gems_dir = File.join save_to, "gems"
 48: 
 49:       if File.exist? gems_dir then
 50:         raise "Not a directory: #{gems_dir}" unless File.directory? gems_dir
 51:       else
 52:         Dir.mkdir gems_dir
 53:       end
 54: 
 55:       source_index_data = ''
 56: 
 57:       say "fetching: #{get_from}/Marshal.#{Gem.marshal_version}.Z"
 58: 
 59:       get_from = URI.parse get_from
 60: 
 61:       if get_from.scheme.nil? then
 62:         get_from = get_from.to_s
 63:       elsif get_from.scheme == 'file' then
 64:         # check if specified URI contains a drive letter (file:/D:/Temp)
 65:         get_from = get_from.to_s
 66:         get_from = if get_from =~ /^file:.*[a-z]:/i then
 67:                      get_from[6..-1]
 68:                    else
 69:                      get_from[5..-1]
 70:                    end
 71:       end
 72: 
 73:       open File.join(get_from.to_s, "Marshal.#{Gem.marshal_version}.Z"), "rb" do |y|
 74:         source_index_data = Zlib::Inflate.inflate y.read
 75:         open File.join(save_to, "Marshal.#{Gem.marshal_version}"), "wb" do |out|
 76:           out.write source_index_data
 77:         end
 78:       end
 79: 
 80:       source_index = Marshal.load source_index_data
 81: 
 82:       progress = ui.progress_reporter source_index.size,
 83:                                       "Fetching #{source_index.size} gems"
 84:       source_index.each do |fullname, gem|
 85:         gem_file = gem.file_name
 86:         gem_dest = File.join gems_dir, gem_file
 87: 
 88:         unless File.exist? gem_dest then
 89:           begin
 90:             open "#{get_from}/gems/#{gem_file}", "rb" do |g|
 91:               contents = g.read
 92:               open gem_dest, "wb" do |out|
 93:                 out.write contents
 94:               end
 95:             end
 96:           rescue
 97:             old_gf = gem_file
 98:             gem_file = gem_file.downcase
 99:             retry if old_gf != gem_file
100:             alert_error $!
101:           end
102:         end
103: 
104:         progress.updated gem_file
105:       end
106: 
107:       progress.done
108:     end
109:   end

[Validate]