45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package diff
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
_ "embed"
|
|
"strings"
|
|
|
|
"github.com/docker/docker/api/types/container"
|
|
"github.com/docker/docker/api/types/network"
|
|
"github.com/go-errors/errors"
|
|
"github.com/supabase/cli/internal/utils"
|
|
"github.com/supabase/cli/pkg/config"
|
|
)
|
|
|
|
//go:embed templates/migra.sh
|
|
var diffSchemaScript string
|
|
|
|
// Diffs local database schema against shadow, dumps output to stdout.
|
|
func DiffSchemaMigra(ctx context.Context, source, target string, schema []string) (string, error) {
|
|
env := []string{"SOURCE=" + source, "TARGET=" + target}
|
|
// Passing in script string means command line args must be set manually, ie. "$@"
|
|
args := "set -- " + strings.Join(schema, " ") + ";"
|
|
cmd := []string{"/bin/sh", "-c", args + diffSchemaScript}
|
|
var out, stderr bytes.Buffer
|
|
if err := utils.DockerRunOnceWithConfig(
|
|
ctx,
|
|
container.Config{
|
|
Image: config.Images.Migra,
|
|
Env: env,
|
|
Cmd: cmd,
|
|
},
|
|
container.HostConfig{
|
|
NetworkMode: network.NetworkHost,
|
|
},
|
|
network.NetworkingConfig{},
|
|
"",
|
|
&out,
|
|
&stderr,
|
|
); err != nil {
|
|
return "", errors.Errorf("error diffing schema: %w:\n%s", err, stderr.String())
|
|
}
|
|
return out.String(), nil
|
|
}
|