debian-mirror-gitlab/db/post_migrate/20230317080000_ensure_unique_debian_packages.rb
2023-06-20 00:43:36 +05:30

48 lines
1.4 KiB
Ruby

# frozen_string_literal: true
class EnsureUniqueDebianPackages < Gitlab::Database::Migration[2.1]
BATCH_SIZE = 1_000
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main
class Package < MigrationRecord
include EachBatch
self.table_name = 'packages_packages'
enum package_type: { debian: 9 }
enum status: { pending_destruction: 4 }
end
def up
Package.distinct_each_batch(column: :project_id) do |package_projects|
project_ids = package_projects.pluck(:project_id)
duplicates = Package.debian
.not_pending_destruction
.where(project_id: project_ids)
.select('project_id, name, version, MAX(id) as last_id')
.group(:project_id, :name, :version)
.having('count(id) > 1')
loop do
duplicates.limit(BATCH_SIZE).each do |duplicate|
Package.debian
.not_pending_destruction
.where(
project_id: duplicate.project_id,
name: duplicate.name,
version: duplicate.version,
id: ..duplicate.last_id - 1
).update_all status: :pending_destruction
end
break unless duplicates.exists?
end
end
end
def down
# nothing to do
end
end