github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/db/remote/changes/changes.go (about) 1 package changes 2 3 import ( 4 "context" 5 "fmt" 6 "net/url" 7 8 "github.com/spf13/afero" 9 "github.com/Redstoneguy129/cli/internal/db/diff" 10 "github.com/Redstoneguy129/cli/internal/utils" 11 ) 12 13 var output string 14 15 func Run(ctx context.Context, schema []string, username, password, database string, fsys afero.Fs) error { 16 // Sanity checks. 17 { 18 if err := utils.AssertDockerIsRunning(ctx); err != nil { 19 return err 20 } 21 if err := utils.LoadConfigFS(fsys); err != nil { 22 return err 23 } 24 } 25 26 if err := utils.RunProgram(ctx, func(p utils.Program, ctx context.Context) error { 27 return run(p, ctx, schema, username, password, database, fsys) 28 }); err != nil { 29 return err 30 } 31 32 return diff.SaveDiff(output, "", fsys) 33 } 34 35 func run(p utils.Program, ctx context.Context, schema []string, username, password, database string, fsys afero.Fs) error { 36 projectRef, err := utils.LoadProjectRef(fsys) 37 if err != nil { 38 return err 39 } 40 host := utils.GetSupabaseDbHost(projectRef) 41 42 // 1. Assert `supabase/migrations` and `schema_migrations` are in sync. 43 { 44 p.Send(utils.StatusMsg("Connecting to remote database...")) 45 conn, err := utils.ConnectRemotePostgres(ctx, username, password, database, host) 46 if err != nil { 47 return err 48 } 49 defer conn.Close(context.Background()) 50 if len(schema) == 0 { 51 schema, err = diff.LoadUserSchemas(ctx, conn) 52 if err != nil { 53 return err 54 } 55 } 56 } 57 58 w := utils.StatusWriter{Program: p} 59 // 2. Diff remote db (source) & shadow db (target) and print it. 60 target := fmt.Sprintf("postgresql://%s@%s:6543/postgres", url.UserPassword(database, password), host) 61 output, err = diff.DiffDatabase(ctx, schema, target, w, fsys) 62 return err 63 }