forked from mystiq/dex
113 lines
1.9 KiB
Go
113 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/olekukonko/tablewriter"
|
|
"github.com/rubenv/sql-migrate"
|
|
)
|
|
|
|
type StatusCommand struct {
|
|
}
|
|
|
|
func (c *StatusCommand) Help() string {
|
|
helpText := `
|
|
Usage: sql-migrate status [options] ...
|
|
|
|
Show migration status.
|
|
|
|
Options:
|
|
|
|
-config=dbconfig.yml Configuration file to use.
|
|
-env="development" Environment.
|
|
|
|
`
|
|
return strings.TrimSpace(helpText)
|
|
}
|
|
|
|
func (c *StatusCommand) Synopsis() string {
|
|
return "Show migration status"
|
|
}
|
|
|
|
func (c *StatusCommand) Run(args []string) int {
|
|
cmdFlags := flag.NewFlagSet("status", flag.ContinueOnError)
|
|
cmdFlags.Usage = func() { ui.Output(c.Help()) }
|
|
ConfigFlags(cmdFlags)
|
|
|
|
if err := cmdFlags.Parse(args); err != nil {
|
|
return 1
|
|
}
|
|
|
|
env, err := GetEnvironment()
|
|
if err != nil {
|
|
ui.Error(fmt.Sprintf("Could not parse config: %s", err))
|
|
return 1
|
|
}
|
|
|
|
db, dialect, err := GetConnection(env)
|
|
if err != nil {
|
|
ui.Error(err.Error())
|
|
return 1
|
|
}
|
|
|
|
source := migrate.FileMigrationSource{
|
|
Dir: env.Dir,
|
|
}
|
|
migrations, err := source.FindMigrations()
|
|
if err != nil {
|
|
ui.Error(err.Error())
|
|
return 1
|
|
}
|
|
|
|
records, err := migrate.GetMigrationRecords(db, dialect)
|
|
if err != nil {
|
|
ui.Error(err.Error())
|
|
return 1
|
|
}
|
|
|
|
table := tablewriter.NewWriter(os.Stdout)
|
|
table.SetHeader([]string{"Migration", "Applied"})
|
|
table.SetColWidth(60)
|
|
|
|
rows := make(map[string]*statusRow)
|
|
|
|
for _, m := range migrations {
|
|
rows[m.Id] = &statusRow{
|
|
Id: m.Id,
|
|
Migrated: false,
|
|
}
|
|
}
|
|
|
|
for _, r := range records {
|
|
rows[r.Id].Migrated = true
|
|
rows[r.Id].AppliedAt = r.AppliedAt
|
|
}
|
|
|
|
for _, m := range migrations {
|
|
if rows[m.Id].Migrated {
|
|
table.Append([]string{
|
|
m.Id,
|
|
rows[m.Id].AppliedAt.String(),
|
|
})
|
|
} else {
|
|
table.Append([]string{
|
|
m.Id,
|
|
"no",
|
|
})
|
|
}
|
|
}
|
|
|
|
table.Render()
|
|
|
|
return 0
|
|
}
|
|
|
|
type statusRow struct {
|
|
Id string
|
|
Migrated bool
|
|
AppliedAt time.Time
|
|
}
|