FIX: Cleanup migrations with timestamps in the future

A future-dated migration was accidently introduced by me in 45c399f0. This was removed in b9762afc, but other migrations had already been generated based on its incorrect date. This commit removes the offending data in the schema_migrations table, and corrects the version in the published_pages migration.

This commit also adds a check to db:migrate which raises an error when invalid migration timestamps are used.
This commit is contained in:
David Taylor 2020-06-17 15:57:32 +01:00
parent 159fc41f40
commit e29afa200a
No known key found for this signature in database
GPG Key ID: 46904C18B1D3F434
3 changed files with 31 additions and 7 deletions

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
class AddPublicFieldToPublishedPages < ActiveRecord::Migration[6.0]
def up
# Delete the record of https://github.com/discourse/discourse/commit/b9762afc106ee9b18d1ac33ca3cac281083e428e
execute <<~SQL
DELETE FROM schema_migrations WHERE version='20201006172700'
SQL
# Delete the reference to the incorrectly versioned version of this migration
execute <<~SQL
DELETE FROM schema_migrations WHERE version='20201006172701'
SQL
# Using IF NOT EXISTS because the version number of this migration was changed
# Therefore some sites may have already added the column
execute <<~SQL
ALTER TABLE "published_pages" ADD COLUMN IF NOT EXISTS "public" boolean DEFAULT FALSE NOT NULL
SQL
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View File

@ -1,7 +0,0 @@
# frozen_string_literal: true
class AddPublicFieldToPublishedPages < ActiveRecord::Migration[6.0]
def change
add_column :published_pages, :public, :boolean, null: false, default: false
end
end

View File

@ -187,6 +187,12 @@ end
# we need to run seed_fu every time we run rake db:migrate
task 'db:migrate' => ['load_config', 'environment', 'set_locale'] do |_, args|
migrations = ActiveRecord::Base.connection.migration_context.migrations
now_timestamp = Time.now.utc.strftime('%Y%m%d%H%M%S').to_i
epoch_timestamp = Time.at(0).utc.strftime('%Y%m%d%H%M%S').to_i
raise "Migration #{migrations.last.version} is timestamped in the future" if migrations.last.version > now_timestamp
raise "Migration #{migrations.first.version} is timestamped before the epoch" if migrations.first.version < epoch_timestamp
ActiveRecord::Tasks::DatabaseTasks.migrate