DEV: Allow DROP NOT NULL in pre-deploy migrations ()

Our SafeMigrate system is designed to prevent tables/columns being dropped in pre-deploy migrations. Its regex-based detection was triggering incorrectly on `ALTER COLUMN DROP NOT NULL`.
This commit is contained in:
David Taylor 2023-03-22 14:43:32 +00:00 committed by GitHub
parent a0140f6f75
commit 7070f81596
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 1 deletions
lib/migration
spec
fixtures/db/migrate/drop_not_null
lib/migration

@ -129,7 +129,7 @@ class Migration::SafeMigrate
in use by live applications.
TEXT
raise Discourse::InvalidMigration, "Attempt was made to drop a table"
elsif sql =~ /\A\s*alter\s+table.*(?:rename|drop)\s+/i
elsif sql =~ /\A\s*alter\s+table.*(?:rename|drop(?!\s+not\s+null))\s+/i
$stdout.puts("", <<~TEXT)
WARNING
-------------------------------------------------------------------------------------

@ -0,0 +1,11 @@
# frozen_string_literal: true
class DropNotNull < ActiveRecord::Migration[5.1]
def up
change_column_null :users, :username, true
end
def down
raise "not tested"
end
end

@ -70,6 +70,16 @@ RSpec.describe Migration::SafeMigrate do
expect { User.first.username }.not_to raise_error
end
it "allows dropping NOT NULL" do
Migration::SafeMigrate.enable!
path = File.expand_path "#{Rails.root}/spec/fixtures/db/migrate/drop_not_null"
output = capture_stdout { migrate_up(path) }
expect(output).to include("change_column_null(:users, :username, true)")
end
it "supports being disabled" do
Migration::SafeMigrate.enable!
Migration::SafeMigrate.disable!