mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-08-01 15:53:04 +00:00
71 lines
1.9 KiB
Ruby
71 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Database
|
|
module Migrations
|
|
class Squasher
|
|
RSPEC_FILENAME_REGEXP = /\A([0-9]+_)?([_a-z0-9]*)\.rb\z/
|
|
|
|
def initialize(git_output)
|
|
@migration_data = migration_files_from_git(git_output).filter_map do |mf|
|
|
basename = Pathname(mf).basename.to_s
|
|
file_name_match = ActiveRecord::Migration::MigrationFilenameRegexp.match(basename)
|
|
slug = file_name_match[2]
|
|
unless slug == 'init_schema'
|
|
{
|
|
path: mf,
|
|
basename: basename,
|
|
timestamp: file_name_match[1],
|
|
slug: slug
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
def files_to_delete
|
|
@migration_data.pluck(:path) + schema_migrations + find_migration_specs
|
|
end
|
|
|
|
private
|
|
|
|
def schema_migrations
|
|
@migration_data.map { |m| "db/schema_migrations/#{m[:timestamp]}" }
|
|
end
|
|
|
|
def find_migration_specs
|
|
@file_slugs = Set.new @migration_data.pluck(:slug)
|
|
(migration_specs + ee_migration_specs).select { |f| file_has_slug?(f) }
|
|
end
|
|
|
|
def migration_files_from_git(body)
|
|
body.chomp
|
|
.split("\n")
|
|
.select { |fn| fn.end_with?('.rb') }
|
|
end
|
|
|
|
def match_file_slug(filename)
|
|
m = RSPEC_FILENAME_REGEXP.match(filename)
|
|
return if m.nil?
|
|
|
|
m[2].sub(/_spec$/, '')
|
|
end
|
|
|
|
def file_has_slug?(filename)
|
|
spec_slug = match_file_slug(Pathname(filename).basename.to_s)
|
|
return false if spec_slug.nil?
|
|
|
|
@file_slugs.include?(spec_slug)
|
|
end
|
|
|
|
def migration_specs
|
|
Dir.glob(Rails.root.join('spec/migrations/*.rb'))
|
|
end
|
|
|
|
def ee_migration_specs
|
|
Dir.glob(Rails.root.join('ee/spec/migrations/*.rb'))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|