mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Import RubyGems trunk revision 1493.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13862 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7a4aad7535
commit
fbf59bdbea
144 changed files with 21330 additions and 0 deletions
105
lib/rubygems/commands/mirror_command.rb
Normal file
105
lib/rubygems/commands/mirror_command.rb
Normal file
|
@ -0,0 +1,105 @@
|
|||
require 'yaml'
|
||||
require 'zlib'
|
||||
|
||||
require 'rubygems/command'
|
||||
require 'rubygems/gem_open_uri'
|
||||
|
||||
class Gem::Commands::MirrorCommand < Gem::Command
|
||||
|
||||
def initialize
|
||||
super 'mirror', 'Mirror a gem repository'
|
||||
end
|
||||
|
||||
def description # :nodoc:
|
||||
<<-EOF
|
||||
The mirror command uses the ~/.gemmirrorrc config file to mirror remote gem
|
||||
repositories to a local path. The config file is a YAML document that looks
|
||||
like this:
|
||||
|
||||
---
|
||||
- from: http://gems.example.com # source repository URI
|
||||
to: /path/to/mirror # destination directory
|
||||
|
||||
Multiple sources and destinations may be specified.
|
||||
EOF
|
||||
end
|
||||
|
||||
def execute
|
||||
config_file = File.join Gem.user_home, '.gemmirrorrc'
|
||||
|
||||
raise "Config file #{config_file} not found" unless File.exist? config_file
|
||||
|
||||
mirrors = YAML.load_file config_file
|
||||
|
||||
raise "Invalid config file #{config_file}" unless mirrors.respond_to? :each
|
||||
|
||||
mirrors.each do |mir|
|
||||
raise "mirror missing 'from' field" unless mir.has_key? 'from'
|
||||
raise "mirror missing 'to' field" unless mir.has_key? 'to'
|
||||
|
||||
get_from = mir['from']
|
||||
save_to = File.expand_path mir['to']
|
||||
|
||||
raise "Directory not found: #{save_to}" unless File.exist? save_to
|
||||
raise "Not a directory: #{save_to}" unless File.directory? save_to
|
||||
|
||||
gems_dir = File.join save_to, "gems"
|
||||
|
||||
if File.exist? gems_dir then
|
||||
raise "Not a directory: #{gems_dir}" unless File.directory? gems_dir
|
||||
else
|
||||
Dir.mkdir gems_dir
|
||||
end
|
||||
|
||||
sourceindex_data = ''
|
||||
|
||||
say "fetching: #{get_from}/Marshal.#{Gem.marshal_version}.Z"
|
||||
|
||||
get_from = URI.parse get_from
|
||||
|
||||
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]
|
||||
end
|
||||
|
||||
open File.join(get_from, "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
|
||||
end
|
||||
end
|
||||
|
||||
sourceindex = Marshal.load(sourceindex_data)
|
||||
|
||||
progress = ui.progress_reporter sourceindex.size,
|
||||
"Fetching #{sourceindex.size} gems"
|
||||
sourceindex.each do |fullname, gem|
|
||||
gem_file = "#{fullname}.gem"
|
||||
gem_dest = File.join gems_dir, gem_file
|
||||
|
||||
unless File.exist? gem_dest then
|
||||
begin
|
||||
open "#{get_from}/gems/#{gem_file}", "rb" do |g|
|
||||
contents = g.read
|
||||
open gem_dest, "wb" do |out|
|
||||
out.write contents
|
||||
end
|
||||
end
|
||||
rescue
|
||||
old_gf = gem_file
|
||||
gem_file = gem_file.downcase
|
||||
retry if old_gf != gem_file
|
||||
alert_error $!
|
||||
end
|
||||
end
|
||||
|
||||
progress.updated gem_file
|
||||
end
|
||||
|
||||
progress.done
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue