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:
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