Skip to content

Commit

Permalink
Add support for yanked gems on compact index
Browse files Browse the repository at this point in the history
  • Loading branch information
fotanus authored and sonalkr132 committed Jun 9, 2016
1 parent 98bc969 commit 4c0da13
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 5 deletions.
2 changes: 1 addition & 1 deletion app/models/deletion.rb
Expand Up @@ -33,7 +33,7 @@ def expire_api_memcached
end

def remove_from_index
@version.update!(indexed: false)
@version.update!(indexed: false, yanked_at: Time.now.utc)
Delayed::Job.enqueue Indexer.new, priority: PRIORITIES[:push]
end

Expand Down
18 changes: 14 additions & 4 deletions app/models/rubygem.rb
Expand Up @@ -262,10 +262,20 @@ def first_built_date
end

def self.compact_index_versions(date)
gems = Rubygem.joins(:versions)
.select("name, versions.created_at, number, platform, info_checksum")
.where("indexed = true and versions.created_at > ?", date)
.order("created_at, versions.number, platform")
created_gems = Rubygem.joins(:versions)
.select("name, versions.created_at as date, number, platform, info_checksum")
.where("versions.created_at > ?", date)
.order("versions.created_at, versions.number, platform")

yanked_gems = Rubygem.joins(:versions)
.select("name, versions.yanked_at as date, '-'||number, platform, info_checksum")
.where("indexed is false and versions.created_at > ?", date)
.order("versions.created_at, versions.number, platform")

# Arel don't support yet order on unions :(
# https://github.com/rails/arel/issues/98
sql = "(#{created_gems.to_sql}) UNION (#{yanked_gems.to_sql}) ORDER BY date"
gems = Rubygem.find_by_sql(sql)

gems.map do |gem|
CompactIndex::Gem.new(gem.name, [
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20151123153040_add_yanked_at_to_versions.rb
@@ -0,0 +1,5 @@
class AddYankedAtToVersions < ActiveRecord::Migration
def change
add_column :versions, :yanked_at, :datetime
end
end
1 change: 1 addition & 0 deletions db/schema.rb
Expand Up @@ -214,6 +214,7 @@
t.hstore "metadata", default: {}, null: false
t.string "required_rubygems_version"
t.string "info_checksum"
t.datetime "yanked_at"
end

add_index "versions", ["built_at"], name: "index_versions_on_built_at", using: :btree
Expand Down
4 changes: 4 additions & 0 deletions test/unit/deletion_test.rb
Expand Up @@ -34,6 +34,10 @@ class DeletionTest < ActiveSupport::TestCase
refute @version.reload.latest?
end

should "keep the yanked time" do
assert @version.reload.yanked_at
end

should "delete the .gem file" do
assert_nil RubygemFs.instance.get("gems/#{@version.full_name}.gem"), "Rubygem still exists!"
end
Expand Down

0 comments on commit 4c0da13

Please sign in to comment.