diff --git a/goose.go b/goose.go new file mode 100644 index 0000000000..aa4037d0c2 --- /dev/null +++ b/goose.go @@ -0,0 +1,15 @@ +package dinosql + +import "strings" + +// Remove all lines after a `-- +goose Down` comment +func RemoveGooseRollback(contents string) string { + lines := strings.Split(contents, "\n") + for i, line := range lines { + if strings.HasPrefix(strings.TrimSpace(line), "-- +goose Down") { + lines = lines[:i] + break + } + } + return strings.Join(lines, "\n") +} diff --git a/goose_test.go b/goose_test.go new file mode 100644 index 0000000000..2aadaec17e --- /dev/null +++ b/goose_test.go @@ -0,0 +1,26 @@ +package dinosql + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +const inputMigration = ` +-- +goose Up +ALTER TABLE archived_jobs ADD COLUMN expires_at TIMESTAMP WITH TIME ZONE; + +-- +goose Down +ALTER TABLE archived_jobs DROP COLUMN expires_at; +` + +const outputMigration = ` +-- +goose Up +ALTER TABLE archived_jobs ADD COLUMN expires_at TIMESTAMP WITH TIME ZONE; +` + +func TestRemoveGooseRollback(t *testing.T) { + if diff := cmp.Diff(outputMigration, RemoveGooseRollback(inputMigration)); diff != "" { + t.Errorf("migration mismatch:\n%s", diff) + } +} diff --git a/parser.go b/parser.go index 2c98849d33..83ccb1ccd6 100644 --- a/parser.go +++ b/parser.go @@ -57,7 +57,8 @@ func ParseSchmea(dir string) (*postgres.Schema, error) { if err != nil { return nil, err } - tree, err := pg.Parse(string(blob)) + contents := RemoveGooseRollback(string(blob)) + tree, err := pg.Parse(contents) if err != nil { return nil, err }