Files
gitlab-foss/lib/gitlab/utils/batched_background_migrations_dictionary.rb
2024-09-17 15:07:18 +00:00

75 lines
2.2 KiB
Ruby

# frozen_string_literal: true
module Gitlab
module Utils
class BatchedBackgroundMigrationsDictionary
DICTIONARY_BASE_DIR = 'db/docs/batched_background_migrations'
attr_reader :queued_migration_version
class << self
def entries
return @entries if @entries.present? && defined?(Rails) && !Rails.env.test?
@entries = Dir.glob("*.yml", base: DICTIONARY_BASE_DIR).each_with_object({}) do |file_name, data|
dictionary = YAML.load_file(File.join(DICTIONARY_BASE_DIR, file_name))
next unless dictionary['queued_migration_version'].present?
data[dictionary['queued_migration_version'].to_s] = {
migration_job_name: dictionary['migration_job_name'],
introduced_by_url: dictionary['introduced_by_url'],
finalized_by: dictionary['finalized_by'].to_s,
milestone: dictionary['milestone']
}
data[dictionary['migration_job_name']] = data[dictionary['queued_migration_version'].to_s].merge(
queued_migration_version: dictionary['queued_migration_version']
)
end
end
def entry(migration_job_name)
return unless entries&.dig(migration_job_name)
new(entries[migration_job_name][:queued_migration_version])
end
# Used by BackgroundMigration/DictionaryFile cop to invalidate its cache
# if the contents of `db/docs/batched_background_migrations` changes.
def checksum(skip_memoization: false)
return @checksum if @checksum.present? && !skip_memoization
@checksum = Digest::SHA256.hexdigest(entries.to_s)
end
end
def initialize(queued_migration_version)
@queued_migration_version = queued_migration_version
end
def finalized_by
entry&.dig(:finalized_by)
end
def introduced_by_url
entry&.dig(:introduced_by_url)
end
def milestone
entry&.dig(:milestone)
end
def migration_job_name
entry&.dig(:migration_job_name)
end
private
def entry
@entry ||= self.class.entries[queued_migration_version.to_s]
end
end
end
end