module RubyGemsAppender::Appender

Public Instance Methods

appender() { |container| ... } click to toggle source
# File lib/rubygems-appender/appender.rb, line 15
def appender(&block)
  container = Container.new self
  yield container
  container.pull_gemspecs!

  make_temp_directories

  files = Gem.time 'Build Marshal gemspecs' do
    build_marshal_gemspecs(container.specs)
  end

  if files.empty?
    say 'Gems not found'
    return
  end

  prerelease, released = container.specs.partition { |s| s.version.prerelease? }
  released_indexes = Gem.time 'Update released indexes' do
    released_indexes = current_spec_indexes.tap do |specs|
      specs.push(*released.map do |spec|
        build_spec_index spec
      end)
    end.uniq.sort
    write_spec_indexes released_indexes, @specs_index
    released_indexes
  end
  Gem.time 'Update pre-release indexes' do
    prerelease_indexes = current_prerelease_spec_indexes.tap do |specs|
      specs.push(*prerelease.map do |spec|
        build_spec_index spec
      end)
    end.uniq.sort - released_indexes
    write_spec_indexes prerelease_indexes, @prerelease_specs_index
  end
  Gem.time 'Update latest indexes' do
    latest_indexes = Hash.new { |hsh, k| hsh[k] = [] } .tap do |map|
      current_latest_spec_indexes.each do |index|
        name, _ = index
        map[name] << index
      end

      released.map do |spec|
        index = build_spec_index spec
        name, _ = index
        map[name] << index
      end
    end.values.map do |indexes|
      indexes.sort! { |(_, l, _), (_, r, _)| l <=> r }.last
    end
    write_spec_indexes latest_indexes, @latest_specs_index
  end

  compress_indices

  files += [
    @specs_index,
    "#{@specs_index}.gz",
    @latest_specs_index,
    "#{@latest_specs_index}.gz",
    @prerelease_specs_index,
    "#{@prerelease_specs_index}.gz",
  ]

  install_appended_indices(files)
ensure
  FileUtils.rm_rf @directory
end
current_latest_spec_indexes() click to toggle source
# File lib/rubygems-appender/appender.rb, line 11
def current_latest_spec_indexes
  Marshal.load(Gem.read_binary(@dest_latest_specs_index))
end
current_prerelease_spec_indexes() click to toggle source
# File lib/rubygems-appender/appender.rb, line 8
def current_prerelease_spec_indexes
  Marshal.load(Gem.read_binary(@dest_prerelease_specs_index))
end
current_spec_indexes() click to toggle source
# File lib/rubygems-appender/appender.rb, line 5
def current_spec_indexes
  Marshal.load(Gem.read_binary(@dest_specs_index))
end

Protected Instance Methods

build_spec_index(spec) click to toggle source
# File lib/rubygems-appender/appender.rb, line 85
def build_spec_index(spec)
  platform = spec.original_platform
  platform = Gem::Platform::RUBY if platform.nil? or platform.empty?

  [spec.name, spec.version, platform]
end
install_appended_indices(files) click to toggle source
# File lib/rubygems-appender/appender.rb, line 98
def install_appended_indices(files)
  verbose = Gem.configuration.really_verbose

  FileUtils.mkdir_p(File.join(@dest_directory, @quick_marshal_dir_base))

  files.each do |tmpfile|
    file = tmpfile.sub(/^#{Regexp.escape @directory}\/?/, '') # HACK?

    src_name = File.join @directory, file
    dst_name = File.join @dest_directory, file

    FileUtils.rm_rf(dst_name, verbose: verbose)
    FileUtils.mv(src_name, dst_name,
                 verbose: verbose,
                 force: true)
  end
end
write_spec_indexes(indexes, filename) click to toggle source
# File lib/rubygems-appender/appender.rb, line 92
def write_spec_indexes(indexes, filename)
  File.open filename, 'wb' do |io|
    Marshal.dump(compact_specs(indexes), io)
  end
end