github.com/supabase/cli@v1.168.1/internal/migration/fetch/fetch.go (about) 1 package fetch 2 3 import ( 4 "context" 5 "fmt" 6 "path/filepath" 7 "strings" 8 9 "github.com/go-errors/errors" 10 "github.com/jackc/pgconn" 11 "github.com/jackc/pgx/v4" 12 "github.com/spf13/afero" 13 "github.com/supabase/cli/internal/migration/history" 14 "github.com/supabase/cli/internal/utils" 15 ) 16 17 func Run(ctx context.Context, config pgconn.Config, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error { 18 if err := utils.MkdirIfNotExistFS(fsys, utils.MigrationsDir); err != nil { 19 return err 20 } 21 if empty, err := afero.IsEmpty(fsys, utils.MigrationsDir); err != nil { 22 return errors.Errorf("failed to read migrations: %w", err) 23 } else if !empty { 24 console := utils.NewConsole() 25 title := fmt.Sprintf("Do you want to overwrite existing files in %s directory?", utils.Bold(utils.MigrationsDir)) 26 if !console.PromptYesNo(title, true) { 27 return context.Canceled 28 } 29 } 30 result, err := fetchMigrationHistory(ctx, config, options...) 31 if err != nil { 32 return err 33 } 34 for _, r := range result { 35 name := fmt.Sprintf("%s_%s.sql", r.Version, r.Name) 36 path := filepath.Join(utils.MigrationsDir, name) 37 contents := strings.Join(r.Statements, ";\n") + ";\n" 38 if err := afero.WriteFile(fsys, path, []byte(contents), 0644); err != nil { 39 return errors.Errorf("failed to write migration: %w", err) 40 } 41 } 42 return nil 43 } 44 45 func fetchMigrationHistory(ctx context.Context, config pgconn.Config, options ...func(*pgx.ConnConfig)) ([]history.SchemaMigration, error) { 46 conn, err := utils.ConnectByConfig(ctx, config, options...) 47 if err != nil { 48 return nil, err 49 } 50 defer conn.Close(context.Background()) 51 return history.ReadMigrationTable(ctx, conn) 52 }