diff --git a/dialect/sql/schema/migrate.go b/dialect/sql/schema/migrate.go index aa6d8c5809..97499323dd 100644 --- a/dialect/sql/schema/migrate.go +++ b/dialect/sql/schema/migrate.go @@ -187,7 +187,12 @@ func (m *Migrate) NamedDiff(ctx context.Context, name string, tables ...*Table) opts := []migrate.PlannerOption{ migrate.WithFormatter(m.atlas.fmt), } - if !m.atlas.genSum { + if m.atlas.genSum { + // Validate the migration directory before proceeding. + if err := migrate.Validate(m.atlas.dir); err != nil { + return err + } + } else { opts = append(opts, migrate.DisableChecksum()) } return migrate.NewPlanner(nil, m.atlas.dir, opts...).WritePlan(plan) diff --git a/dialect/sql/schema/migrate_test.go b/dialect/sql/schema/migrate_test.go index 59b2522f4e..2862069b7b 100644 --- a/dialect/sql/schema/migrate_test.go +++ b/dialect/sql/schema/migrate_test.go @@ -84,6 +84,19 @@ func TestMigrate_Diff(t *testing.T) { requireFileEqual(t, filepath.Join(p, v+"_changes.up.sql"), "-- create \"users\" table\nCREATE TABLE `users` (, PRIMARY KEY ());\n") requireFileEqual(t, filepath.Join(p, v+"_changes.down.sql"), "-- reverse: create \"users\" table\nDROP TABLE `users`;\n") require.NoFileExists(t, filepath.Join(p, "atlas.sum")) + + // Test integrity file. + p = t.TempDir() + d, err = migrate.NewLocalDir(p) + require.NoError(t, err) + m, err = NewMigrate(db, WithDir(d), WithSumFile()) + require.NoError(t, err) + require.NoError(t, m.Diff(context.Background(), &Table{Name: "users"})) + requireFileEqual(t, filepath.Join(p, v+"_changes.up.sql"), "-- create \"users\" table\nCREATE TABLE `users` (, PRIMARY KEY ());\n") + requireFileEqual(t, filepath.Join(p, v+"_changes.down.sql"), "-- reverse: create \"users\" table\nDROP TABLE `users`;\n") + require.FileExists(t, filepath.Join(p, "atlas.sum")) + require.NoError(t, d.WriteFile("tmp.sql", nil)) + require.ErrorIs(t, m.Diff(context.Background(), &Table{Name: "users"}), migrate.ErrChecksumMismatch) } func requireFileEqual(t *testing.T, name, contents string) {