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  }