github.com/supabase/cli@v1.168.1/internal/db/remote/changes/changes.go (about) 1 package changes 2 3 import ( 4 "context" 5 "io" 6 7 "github.com/jackc/pgconn" 8 "github.com/spf13/afero" 9 "github.com/supabase/cli/internal/db/diff" 10 "github.com/supabase/cli/internal/db/reset" 11 "github.com/supabase/cli/internal/utils" 12 ) 13 14 var output string 15 16 func Run(ctx context.Context, schema []string, config pgconn.Config, fsys afero.Fs) error { 17 // Sanity checks. 18 if err := utils.LoadConfigFS(fsys); err != nil { 19 return err 20 } 21 22 if err := utils.RunProgram(ctx, func(p utils.Program, ctx context.Context) error { 23 return run(p, ctx, schema, config, fsys) 24 }); err != nil { 25 return err 26 } 27 28 return diff.SaveDiff(output, "", fsys) 29 } 30 31 func run(p utils.Program, ctx context.Context, schema []string, config pgconn.Config, fsys afero.Fs) (err error) { 32 // 1. Assert `supabase/migrations` and `schema_migrations` are in sync. 33 w := utils.StatusWriter{Program: p} 34 if len(schema) == 0 { 35 schema, err = loadSchema(ctx, config, w) 36 if err != nil { 37 return err 38 } 39 } 40 41 // 2. Diff remote db (source) & shadow db (target) and print it. 42 output, err = diff.DiffDatabase(ctx, schema, config, w, fsys, diff.DiffSchemaMigra) 43 return err 44 } 45 46 func loadSchema(ctx context.Context, config pgconn.Config, w io.Writer) ([]string, error) { 47 conn, err := utils.ConnectByConfigStream(ctx, config, w) 48 if err != nil { 49 return nil, err 50 } 51 defer conn.Close(context.Background()) 52 return reset.LoadUserSchemas(ctx, conn) 53 }