From b5697bcce88499d0bd9443aeb91cdafb86596e0b Mon Sep 17 00:00:00 2001 From: Ronen Lubin Date: Mon, 4 Mar 2024 14:57:49 +0200 Subject: [PATCH] atlasexec: add migrate hash command --- atlasexec/atlas.go | 28 ++++++++++++++++++++++++++++ atlasexec/atlas_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/atlasexec/atlas.go b/atlasexec/atlas.go index 28c9df5..9055a41 100644 --- a/atlasexec/atlas.go +++ b/atlasexec/atlas.go @@ -121,6 +121,14 @@ type ( URL string Vars Vars } + // MigrateHashParams are the parameters for the `migrate hash` command. + MigrateHashParams struct { + Env string + ConfigURL string + DirURL string + DirFormat string + Vars Vars + } Vars map[string]string ) @@ -230,6 +238,26 @@ func (c *Client) MigratePush(ctx context.Context, params *MigratePushParams) (st return strings.TrimSpace(resp), err } +// MigrateHash runs the 'migrate hash' command. +func (c *Client) MigrateHash(ctx context.Context, params *MigrateHashParams) error { + args := []string{"migrate", "hash"} + if params.Env != "" { + args = append(args, "--env", params.Env) + } + if params.ConfigURL != "" { + args = append(args, "--config", params.ConfigURL) + } + if params.DirURL != "" { + args = append(args, "--dir", params.DirURL) + } + if params.DirFormat != "" { + args = append(args, "--dir-format", params.DirFormat) + } + args = append(args, params.Vars.AsArgs()...) + _, err := c.runCommand(ctx, args) + return err +} + // MigrateApply runs the 'migrate apply' command. func (c *Client) MigrateApply(ctx context.Context, params *MigrateApplyParams) (*MigrateApply, error) { return firstResult(c.MigrateApplySlice(ctx, params)) diff --git a/atlasexec/atlas_test.go b/atlasexec/atlas_test.go index 11d518a..623fcfd 100644 --- a/atlasexec/atlas_test.go +++ b/atlasexec/atlas_test.go @@ -585,6 +585,35 @@ func TestMigratePush(t *testing.T) { }) } +func TestMigrateHash(t *testing.T) { + ce, err := atlasexec.NewWorkingDir( + atlasexec.WithMigrations(os.DirFS(filepath.Join("testdata", "migrations"))), + ) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, ce.Close()) + }) + c, err := atlasexec.NewClient(ce.Path(), "atlas") + require.NoError(t, err) + _, err = ce.WriteFile("migrations/new.sql", []byte(` + -- create table "users" + CREATE TABLE users(id int NOT NULL); +`)) + require.NoError(t, err) + err = c.MigrateHash(context.Background(), &atlasexec.MigrateHashParams{ + DirURL: "file://migrations", + }) + require.NoError(t, err) + sum, err := os.ReadFile(ce.Path("migrations/atlas.sum")) + require.NoError(t, err) + require.Equal(t, `h1:kox3n1k+sm1yUsqcdJLcmU5rL8es0m+70rQJAjzsPZ4= +20230727105553_init.sql h1:jxgvnWO6tZD3lSPpH1ao5E/6VjapP7iwvBCUJ6aez58= +20230727105615_t2.sql h1:UvzeoFxe90Y/7b21ziwg6pPzWJQSV7LeYwJl8J63lMU= +20230926085734_destructive-change.sql h1:Gf/bSvUkfqHr/MEXKCxdGu2YvG8zwe4ER5TW8T/laA0= +new.sql h1:D0A4nIljowwFpTvvTJ2kdJcuozZHJo+mKsHZ7vZd0e8= +`, string(sum)) +} + func generateHCL(t *testing.T, token string, srv *httptest.Server) string { st := fmt.Sprintf( `atlas {