diff --git a/cli/commands/migrate_status.go b/cli/commands/migrate_status.go index 145def6905683..33d4107d20a6e 100644 --- a/cli/commands/migrate_status.go +++ b/cli/commands/migrate_status.go @@ -55,7 +55,7 @@ type migrateStatusOptions struct { func (o *migrateStatusOptions) run() (*migrate.Status, error) { migrateDrv, err := newMigrate(o.EC.MigrationDir, o.EC.Config.ParsedEndpoint, o.EC.Config.AccessKey, o.EC.Logger) if err != nil { - return nil, errors.Wrap(err, "cannot create migrate instance") + return nil, err } status, err := executeStatus(migrateDrv) if err != nil { diff --git a/cli/migrate/source/file/file.go b/cli/migrate/source/file/file.go index acb6b387944e6..a22bb3c9d4e37 100644 --- a/cli/migrate/source/file/file.go +++ b/cli/migrate/source/file/file.go @@ -78,7 +78,13 @@ func (f *File) Open(url string, logger *log.Logger) (source.Driver, error) { if err != nil { continue // ignore files that we can't parse } - + ok, err := source.IsEmptyFile(m, p) + if err != nil { + return nil, err + } + if !ok { + continue + } err = nf.migrations.Append(m) if err != nil { return nil, err diff --git a/cli/migrate/source/parse.go b/cli/migrate/source/parse.go index df31556c6f9b7..06d8e1ff636f9 100644 --- a/cli/migrate/source/parse.go +++ b/cli/migrate/source/parse.go @@ -1,7 +1,6 @@ package source import ( - "errors" "fmt" "io/ioutil" "path/filepath" @@ -9,6 +8,7 @@ import ( "strconv" yaml "github.com/ghodss/yaml" + "github.com/pkg/errors" ) var ( @@ -44,18 +44,6 @@ func Parse(raw string, directory string) (*Migration, error) { } else { return nil, errors.New("Invalid Direction type") } - data, err := ioutil.ReadFile(filepath.Join(directory, raw)) - if err != nil { - return nil, err - } - var t []interface{} - err = yaml.Unmarshal(data, &t) - if err != nil { - return nil, err - } - if len(t) == 0 { - return nil, errors.New("Empty metadata file") - } } else if m[4] == "sql" { if m[3] == "up" { direction = Up @@ -64,13 +52,6 @@ func Parse(raw string, directory string) (*Migration, error) { } else { return nil, errors.New("Invalid Direction type") } - data, err := ioutil.ReadFile(filepath.Join(directory, raw)) - if err != nil { - return nil, err - } - if string(data[:]) == "" { - return nil, errors.New("Empty SQL file") - } } return &Migration{ @@ -82,3 +63,27 @@ func Parse(raw string, directory string) (*Migration, error) { } return nil, ErrParse } + +// Validate file to check for empty sql or yaml content. +func IsEmptyFile(m *Migration, directory string) (bool, error) { + data, err := ioutil.ReadFile(filepath.Join(directory, m.Raw)) + if err != nil { + return false, errors.Wrapf(err, "cannot read file %s", m.Raw) + } + switch direction := m.Direction; direction { + case MetaUp, MetaDown: + var t []interface{} + err = yaml.Unmarshal(data, &t) + if err != nil { + return false, errors.Wrapf(err, "invalid yaml file: %s", m.Raw) + } + if len(t) == 0 { + return false, nil + } + case Up, Down: + if string(data[:]) == "" { + return false, nil + } + } + return true, nil +}