Skip to content

Commit

Permalink
cmd/atlas: migrate lint stubs for cloud (#2052)
Browse files Browse the repository at this point in the history
  • Loading branch information
a8m committed Sep 6, 2023
1 parent 434deda commit dae9747
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 71 deletions.
78 changes: 78 additions & 0 deletions cmd/atlas/internal/cmdapi/cmdapi_oss.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@

package cmdapi

import (
"errors"
"fmt"
"text/template"

cmdmigrate "ariga.io/atlas/cmd/atlas/internal/migrate"
"ariga.io/atlas/cmd/atlas/internal/migratelint"
"ariga.io/atlas/sql/sqlcheck"
"ariga.io/atlas/sql/sqlclient"

"github.com/spf13/cobra"
)

func init() {
schemaCmd := schemaCmd()
schemaCmd.AddCommand(
Expand All @@ -30,3 +43,68 @@ func init() {
)
Root.AddCommand(migrateCmd)
}

// migrateLintSetFlags allows setting extra flags for the 'migrate lint' command.
func migrateLintSetFlags(*cobra.Command, *migrateLintFlags) {}

// migrateLintRun is the run command for 'migrate lint'.
func migrateLintRun(cmd *cobra.Command, _ []string, flags migrateLintFlags) error {
dev, err := sqlclient.Open(cmd.Context(), flags.devURL)
if err != nil {
return err
}
defer dev.Close()
dir, err := cmdmigrate.Dir(cmd.Context(), flags.dirURL, false)
if err != nil {
return err
}
var detect migratelint.ChangeDetector
switch {
case flags.latest == 0 && flags.gitBase == "":
return fmt.Errorf("--%s or --%s is required", flagLatest, flagGitBase)
case flags.latest > 0 && flags.gitBase != "":
return fmt.Errorf("--%s and --%s are mutually exclusive", flagLatest, flagGitBase)
case flags.latest > 0:
detect = migratelint.LatestChanges(dir, int(flags.latest))
case flags.gitBase != "":
detect, err = migratelint.NewGitChangeDetector(
dir,
migratelint.WithWorkDir(flags.gitDir),
migratelint.WithBase(flags.gitBase),
migratelint.WithMigrationsPath(dir.(interface{ Path() string }).Path()),
)
if err != nil {
return err
}
}
format := migratelint.DefaultTemplate
if f := flags.logFormat; f != "" {
format, err = template.New("format").Funcs(migratelint.TemplateFuncs).Parse(f)
if err != nil {
return fmt.Errorf("parse format: %w", err)
}
}
env, err := selectEnv(cmd)
if err != nil {
return err
}
az, err := sqlcheck.AnalyzerFor(dev.Name, env.Lint.Remain())
if err != nil {
return err
}
r := &migratelint.Runner{
Dev: dev,
Dir: dir,
ChangeDetector: detect,
ReportWriter: &migratelint.TemplateWriter{
T: format,
W: cmd.OutOrStdout(),
},
Analyzers: az,
}
err = r.Run(cmd.Context())
// Print the error in case it was not printed before.
cmd.SilenceErrors = errors.As(err, &migratelint.SilentError{})
cmd.SilenceUsage = cmd.SilenceErrors
return err
}
78 changes: 10 additions & 68 deletions cmd/atlas/internal/cmdapi/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@ import (
"ariga.io/atlas/cmd/atlas/internal/cmdlog"
cmdmigrate "ariga.io/atlas/cmd/atlas/internal/migrate"
"ariga.io/atlas/cmd/atlas/internal/migrate/ent/revision"
"ariga.io/atlas/cmd/atlas/internal/migratelint"
"ariga.io/atlas/sql/migrate"
"ariga.io/atlas/sql/schema"
"ariga.io/atlas/sql/sqlcheck"
"ariga.io/atlas/sql/sqlclient"
"ariga.io/atlas/sql/sqltool"

Expand Down Expand Up @@ -873,8 +871,12 @@ type migrateLintFlags struct {
dirURL, dirFormat string
devURL string
logFormat string
latest uint
gitBase, gitDir string
latest uint // --latest 1
gitBase, gitDir string // --git-base master --git-dir /path/to/git/repo
// Not enabled by default.
dirBase string // --base atlas://graph
web bool // Open the web browser
context string // Run context. See cloudapi.ContextInput.
}

// migrateLintCmd represents the 'atlas migrate lint' subcommand.
Expand All @@ -885,9 +887,9 @@ func migrateLintCmd() *cobra.Command {
Use: "lint [flags]",
Short: "Run analysis on the migration directory",
Example: ` atlas migrate lint --env dev
atlas migrate lint --dir file:///path/to/migration/directory --dev-url mysql://root:pass@localhost:3306 --latest 1
atlas migrate lint --dir file:///path/to/migration/directory --dev-url mysql://root:pass@localhost:3306 --git-base master
atlas migrate lint --dir file:///path/to/migration/directory --dev-url mysql://root:pass@localhost:3306 --format '{{ json .Files }}'`,
atlas migrate lint --dir file:///path/to/migrations --dev-url docker://mysql/8/dev --latest 1
atlas migrate lint --dir file:///path/to/migrations --dev-url mysql://root:pass@localhost:3306 --git-base master
atlas migrate lint --dir file:///path/to/migrations --dev-url mysql://root:pass@localhost:3306 --format '{{ json .Files }}'`,
PreRunE: func(cmd *cobra.Command, args []string) error {
if err := migrateFlagsFromConfig(cmd); err != nil {
return err
Expand All @@ -910,70 +912,10 @@ func migrateLintCmd() *cobra.Command {
cmd.Flags().StringVarP(&flags.gitDir, flagGitDir, "", ".", "path to the repository working directory")
cobra.CheckErr(cmd.MarkFlagRequired(flagDevURL))
cmd.MarkFlagsMutuallyExclusive(flagLog, flagFormat)
migrateLintSetFlags(cmd, &flags)
return cmd
}

func migrateLintRun(cmd *cobra.Command, _ []string, flags migrateLintFlags) error {
dev, err := sqlclient.Open(cmd.Context(), flags.devURL)
if err != nil {
return err
}
defer dev.Close()
dir, err := cmdmigrate.Dir(cmd.Context(), flags.dirURL, false)
if err != nil {
return err
}
var detect migratelint.ChangeDetector
switch {
case flags.latest == 0 && flags.gitBase == "":
return fmt.Errorf("--%s or --%s is required", flagLatest, flagGitBase)
case flags.latest > 0 && flags.gitBase != "":
return fmt.Errorf("--%s and --%s are mutually exclusive", flagLatest, flagGitBase)
case flags.latest > 0:
detect = migratelint.LatestChanges(dir, int(flags.latest))
case flags.gitBase != "":
detect, err = migratelint.NewGitChangeDetector(
dir,
migratelint.WithWorkDir(flags.gitDir),
migratelint.WithBase(flags.gitBase),
migratelint.WithMigrationsPath(dir.(interface{ Path() string }).Path()),
)
if err != nil {
return err
}
}
format := migratelint.DefaultTemplate
if f := flags.logFormat; f != "" {
format, err = template.New("format").Funcs(migratelint.TemplateFuncs).Parse(f)
if err != nil {
return fmt.Errorf("parse format: %w", err)
}
}
env, err := selectEnv(cmd)
if err != nil {
return err
}
az, err := sqlcheck.AnalyzerFor(dev.Name, env.Lint.Remain())
if err != nil {
return err
}
r := &migratelint.Runner{
Dev: dev,
Dir: dir,
ChangeDetector: detect,
ReportWriter: &migratelint.TemplateWriter{
T: format,
W: cmd.OutOrStdout(),
},
Analyzers: az,
}
err = r.Run(cmd.Context())
// Print the error in case it was not printed before.
cmd.SilenceErrors = errors.As(err, &migratelint.SilentError{})
cmd.SilenceUsage = cmd.SilenceErrors
return err
}

type migrateNewFlags struct {
edit bool
dirURL string
Expand Down
6 changes: 3 additions & 3 deletions doc/md/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,9 +199,9 @@ atlas migrate lint [flags]

```
atlas migrate lint --env dev
atlas migrate lint --dir file:///path/to/migration/directory --dev-url mysql://root:pass@localhost:3306 --latest 1
atlas migrate lint --dir file:///path/to/migration/directory --dev-url mysql://root:pass@localhost:3306 --git-base master
atlas migrate lint --dir file:///path/to/migration/directory --dev-url mysql://root:pass@localhost:3306 --format '{{ json .Files }}'
atlas migrate lint --dir file:///path/to/migrations --dev-url docker://mysql/8/dev --latest 1
atlas migrate lint --dir file:///path/to/migrations --dev-url mysql://root:pass@localhost:3306 --git-base master
atlas migrate lint --dir file:///path/to/migrations --dev-url mysql://root:pass@localhost:3306 --format '{{ json .Files }}'
```
#### Flags
```
Expand Down

0 comments on commit dae9747

Please sign in to comment.