github.com/supabase/cli@v1.168.1/internal/db/diff/migra.go (about)

     1  package diff
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	_ "embed"
     7  	"strings"
     8  
     9  	"github.com/docker/docker/api/types/container"
    10  	"github.com/docker/docker/api/types/network"
    11  	"github.com/go-errors/errors"
    12  	"github.com/supabase/cli/internal/utils"
    13  )
    14  
    15  //go:embed templates/migra.sh
    16  var diffSchemaScript string
    17  
    18  // Diffs local database schema against shadow, dumps output to stdout.
    19  func DiffSchemaMigra(ctx context.Context, source, target string, schema []string) (string, error) {
    20  	env := []string{"SOURCE=" + source, "TARGET=" + target}
    21  	// Passing in script string means command line args must be set manually, ie. "$@"
    22  	args := "set -- " + strings.Join(schema, " ") + ";"
    23  	cmd := []string{"/bin/sh", "-c", args + diffSchemaScript}
    24  	var out, stderr bytes.Buffer
    25  	if err := utils.DockerRunOnceWithConfig(
    26  		ctx,
    27  		container.Config{
    28  			Image: utils.MigraImage,
    29  			Env:   env,
    30  			Cmd:   cmd,
    31  		},
    32  		container.HostConfig{
    33  			NetworkMode: container.NetworkMode("host"),
    34  		},
    35  		network.NetworkingConfig{},
    36  		"",
    37  		&out,
    38  		&stderr,
    39  	); err != nil {
    40  		return "", errors.Errorf("error diffing schema: %w:\n%s", err, stderr.String())
    41  	}
    42  	return out.String(), nil
    43  }