Files
gitlab-foss/lib/tasks/gitlab/db/migration_squash.rake
2024-12-20 21:28:42 +00:00

47 lines
1.6 KiB
Ruby

# frozen_string_literal: true
# This a development rake task.
return if Rails.env.production?
namespace :gitlab do
namespace :db do
desc "GitLab | DB | squash | squash as of a version"
task :squash, [:version] => :environment do |_t, args|
require 'git'
git = ::Git.open(Dir.pwd)
squasher = Gitlab::Database::Migrations::Squasher.new(
`git ls-tree --name-only -r #{args[:version]} -- db/migrate db/post_migrate`
)
# Delete relevant migrations and specs
files_to_delete = squasher.files_to_delete.filter { |f| File.exist?(f) }
puts "\tDeleting #{files_to_delete.length} files."
git.remove files_to_delete unless files_to_delete.empty?
# Update db/init_structure.sql
new_init_structure_sql = git.show(args[:version], 'db/structure.sql')
new_init_structure_sql.gsub!(/^[^\n]+schema_migrations[^;]+;\n\n/m, '')
new_init_structure_sql.gsub!(/^[^\n]+ar_internal_metadata[^;]+;\n\n/m, '')
puts "\tOverwriting init_structure.sql..."
File.write('db/init_structure.sql', new_init_structure_sql)
git.add('db/init_structure.sql')
# Update .rubocop_todo/
deleted_files = `git diff --diff-filter=D --staged --name-only`.split("\n")
puts "\tUpdating .rubocop_todo/..."
git.add(Dir['.rubocop_todo/**/*.yml'].each do |todo_file|
new_content = File.read(todo_file).split("\n").reject do |line|
deleted_files.any? do |path|
line.include?("'#{path}'")
end
end.join("\n")
File.write(todo_file, "#{new_content}\n")
end)
puts "\tDone!".white
end
end
end