diff options
Diffstat (limited to 'trunk/lib/rubygems/indexer/master_index_builder.rb')
-rw-r--r-- | trunk/lib/rubygems/indexer/master_index_builder.rb | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/trunk/lib/rubygems/indexer/master_index_builder.rb b/trunk/lib/rubygems/indexer/master_index_builder.rb new file mode 100644 index 0000000000..669ea5a1df --- /dev/null +++ b/trunk/lib/rubygems/indexer/master_index_builder.rb @@ -0,0 +1,54 @@ +require 'rubygems/indexer' + +## +# Construct the master Gem index file. + +class Gem::Indexer::MasterIndexBuilder < Gem::Indexer::AbstractIndexBuilder + + def start_index + super + @index = Gem::SourceIndex.new + end + + def end_index + super + + @file.puts "--- !ruby/object:#{@index.class}" + @file.puts "gems:" + + gems = @index.sort_by { |name, gemspec| gemspec.sort_obj } + gems.each do |name, gemspec| + yaml = gemspec.to_yaml.gsub(/^/, ' ') + yaml = yaml.sub(/\A ---/, '') # there's a needed extra ' ' here + @file.print " #{gemspec.original_name}:" + @file.puts yaml + end + end + + def cleanup + super + + index_file_name = File.join @directory, @filename + + compress index_file_name, "Z" + paranoid index_file_name, "#{index_file_name}.Z" + + @files << "#{@filename}.Z" + end + + def add(spec) + @index.add_spec(spec) + end + + private + + def paranoid(path, compressed_path) + data = Gem.read_binary path + compressed_data = Gem.read_binary compressed_path + + if data != unzip(compressed_data) then + raise "Compressed file #{compressed_path} does not match uncompressed file #{path}" + end + end + +end |